@letta-ai/letta-agent-sdk 0.2.5 → 0.2.7

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 (66) hide show
  1. package/README.md +135 -11
  2. package/dist/app-server-session.d.ts +2 -1
  3. package/dist/app-server-session.d.ts.map +1 -1
  4. package/dist/cloud-session.d.ts +13 -0
  5. package/dist/cloud-session.d.ts.map +1 -1
  6. package/dist/dream/agent.d.ts +55 -0
  7. package/dist/dream/agent.d.ts.map +1 -0
  8. package/dist/dream/aggregate.d.ts +38 -0
  9. package/dist/dream/aggregate.d.ts.map +1 -0
  10. package/dist/dream/batching.d.ts +12 -0
  11. package/dist/dream/batching.d.ts.map +1 -0
  12. package/dist/dream/clone.d.ts +14 -0
  13. package/dist/dream/clone.d.ts.map +1 -0
  14. package/dist/dream/cursors.d.ts +7 -0
  15. package/dist/dream/cursors.d.ts.map +1 -0
  16. package/dist/dream/index.d.ts +67 -0
  17. package/dist/dream/index.d.ts.map +1 -0
  18. package/dist/dream/memfs.d.ts +75 -0
  19. package/dist/dream/memfs.d.ts.map +1 -0
  20. package/dist/dream/normalize-core.d.ts +67 -0
  21. package/dist/dream/normalize-core.d.ts.map +1 -0
  22. package/dist/dream/prompts.d.ts +26 -0
  23. package/dist/dream/prompts.d.ts.map +1 -0
  24. package/dist/dream/redact.d.ts +3 -0
  25. package/dist/dream/redact.d.ts.map +1 -0
  26. package/dist/dream/reflect.d.ts +49 -0
  27. package/dist/dream/reflect.d.ts.map +1 -0
  28. package/dist/dream/registry.d.ts +4 -0
  29. package/dist/dream/registry.d.ts.map +1 -0
  30. package/dist/dream/runner.d.ts +30 -0
  31. package/dist/dream/runner.d.ts.map +1 -0
  32. package/dist/dream/sdk-messages.d.ts +4 -0
  33. package/dist/dream/sdk-messages.d.ts.map +1 -0
  34. package/dist/dream/select.d.ts +6 -0
  35. package/dist/dream/select.d.ts.map +1 -0
  36. package/dist/dream/sources/claude-code.d.ts +18 -0
  37. package/dist/dream/sources/claude-code.d.ts.map +1 -0
  38. package/dist/dream/sources/codex.d.ts +20 -0
  39. package/dist/dream/sources/codex.d.ts.map +1 -0
  40. package/dist/dream/sources/letta.d.ts +3 -0
  41. package/dist/dream/sources/letta.d.ts.map +1 -0
  42. package/dist/dream/sources/openhands.d.ts +43 -0
  43. package/dist/dream/sources/openhands.d.ts.map +1 -0
  44. package/dist/dream/sources/transcript-file.d.ts +8 -0
  45. package/dist/dream/sources/transcript-file.d.ts.map +1 -0
  46. package/dist/dream/store-utils.d.ts +21 -0
  47. package/dist/dream/store-utils.d.ts.map +1 -0
  48. package/dist/dream/transcripts.d.ts +27 -0
  49. package/dist/dream/transcripts.d.ts.map +1 -0
  50. package/dist/dream/types.d.ts +48 -0
  51. package/dist/dream/types.d.ts.map +1 -0
  52. package/dist/dream/workers.d.ts +12 -0
  53. package/dist/dream/workers.d.ts.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +7574 -4165
  57. package/dist/index.js.map +35 -11
  58. package/dist/remote-client-session-core.d.ts +7 -2
  59. package/dist/remote-client-session-core.d.ts.map +1 -1
  60. package/dist/session.d.ts.map +1 -1
  61. package/dist/tests/advanced-session.d.ts +6 -0
  62. package/dist/tests/advanced-session.d.ts.map +1 -1
  63. package/dist/transport.d.ts.map +1 -1
  64. package/dist/types.d.ts +40 -2
  65. package/dist/types.d.ts.map +1 -1
  66. package/package.json +7 -3
package/dist/index.js.map CHANGED
@@ -1,25 +1,49 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/transport.ts", "../src/interactiveToolPolicy.ts", "../src/session.ts", "../src/repositories.ts", "../node_modules/@letta-ai/letta-code/dist/app-server-client.js", "../src/local-app-server.ts", "../src/cli-resolver.ts", "../src/remote-client-session-core.ts", "../src/app-server-session.ts", "../src/remote.ts", "../src/cloud-session.ts", "../src/validation.ts", "../src/client.ts", "../src/stream-events.ts", "../src/tool-helpers.ts", "../src/index.ts"],
3
+ "sources": ["../src/transport.ts", "../src/remote-client-session-core.ts", "../src/interactiveToolPolicy.ts", "../src/session.ts", "../src/repositories.ts", "../node_modules/@letta-ai/letta-code/dist/app-server-client.js", "../src/local-app-server.ts", "../src/cli-resolver.ts", "../src/app-server-session.ts", "../src/remote.ts", "../src/cloud-session.ts", "../src/validation.ts", "../src/client.ts", "../src/stream-events.ts", "../src/tool-helpers.ts", "../src/index.ts", "../src/dream/index.ts", "../src/dream/batching.ts", "../src/dream/aggregate.ts", "../src/dream/clone.ts", "../src/dream/memfs.ts", "../src/dream/prompts.ts", "../src/dream/runner.ts", "../src/dream/normalize-core.ts", "../src/dream/redact.ts", "../src/dream/sdk-messages.ts", "../src/dream/reflect.ts", "../src/dream/select.ts", "../src/dream/agent.ts", "../src/dream/cursors.ts", "../src/dream/types.ts", "../src/dream/workers.ts", "../src/dream/sources/claude-code.ts", "../src/dream/store-utils.ts", "../src/dream/sources/codex.ts", "../src/dream/sources/letta.ts", "../src/dream/sources/openhands.ts", "../src/dream/sources/transcript-file.ts", "../src/dream/registry.ts", "../src/dream/transcripts.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * SubprocessTransport\n *\n * Spawns the Letta Code CLI and communicates via stdin/stdout JSON streams.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { InternalSessionOptions, WireMessage } from \"./types.js\";\n\n// All logging gated behind DEBUG_SDK env var\nfunction sdkLog(tag: string, ...args: unknown[]) {\n if (process.env.DEBUG_SDK) console.error(`[SDK-Transport] [${tag}]`, ...args);\n}\n\nconst SDK_AGENT_ORIGIN_TAG = \"origin:letta-code\";\n\nfunction shouldApplyNewAgentDefaults(options: InternalSessionOptions): boolean {\n return options.createOnly === true;\n}\n\nfunction includeSdkAgentOriginTag(tags: string[] | undefined): string[] {\n const normalizedTags: string[] = [];\n let hasOriginTag = false;\n\n for (const tag of tags ?? []) {\n if (tag === SDK_AGENT_ORIGIN_TAG) {\n if (hasOriginTag) continue;\n hasOriginTag = true;\n }\n normalizedTags.push(tag);\n }\n\n if (!hasOriginTag) {\n normalizedTags.push(SDK_AGENT_ORIGIN_TAG);\n }\n\n return normalizedTags;\n}\n\n/**\n * Build the CLI argument array for a given set of session options.\n *\n * Exported as a pure function for testing — this IS the real production code\n * path. SubprocessTransport.buildArgs() delegates here.\n */\nexport function buildCliArgs(options: InternalSessionOptions): string[] {\n const args: string[] = [\n \"--output-format\",\n \"stream-json\",\n \"--input-format\",\n \"stream-json\",\n ];\n const applyNewAgentDefaults = shouldApplyNewAgentDefaults(options);\n\n // Conversation and agent handling\n if (options.conversationId) {\n args.push(\"--conversation\", options.conversationId);\n } else if (options.agentId) {\n args.push(\"--agent\", options.agentId);\n if (options.newConversation) {\n args.push(\"--new\");\n } else if (options.defaultConversation) {\n args.push(\"--conversation\", \"default\");\n }\n } else if (options.createOnly) {\n args.push(\"--new-agent\");\n } else if (options.newConversation) {\n args.push(\"--new\");\n }\n\n // Model\n if (options.model) {\n args.push(\"-m\", options.model);\n }\n\n // Partial message streaming\n if (options.includePartialMessages) {\n args.push(\"--include-partial-messages\");\n }\n\n // Embedding model\n if (options.embedding) {\n args.push(\"--embedding\", options.embedding);\n }\n\n // System prompt configuration\n if (options.systemPrompt !== undefined) {\n if (typeof options.systemPrompt === \"string\") {\n const validPresets = [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ];\n if (validPresets.includes(options.systemPrompt)) {\n args.push(\"--system\", options.systemPrompt);\n } else {\n args.push(\"--system-custom\", options.systemPrompt);\n }\n } else {\n args.push(\"--system\", options.systemPrompt.preset);\n if (options.systemPrompt.append) {\n args.push(\"--system-append\", options.systemPrompt.append);\n }\n }\n }\n\n // Memory blocks (only for new agents)\n if (options.memory !== undefined && !options.agentId) {\n if (options.memory.length === 0) {\n args.push(\"--init-blocks\", \"\");\n } else {\n const presetNames: string[] = [];\n const memoryBlocksJson: Array<\n | { label: string; value: string }\n | { blockId: string }\n > = [];\n\n for (const item of options.memory) {\n if (typeof item === \"string\") {\n presetNames.push(item);\n } else if (\"blockId\" in item) {\n memoryBlocksJson.push(item as { blockId: string });\n } else {\n memoryBlocksJson.push(item as { label: string; value: string });\n }\n }\n\n if (memoryBlocksJson.length > 0) {\n args.push(\"--memory-blocks\", JSON.stringify(memoryBlocksJson));\n if (presetNames.length > 0) {\n console.warn(\n \"[letta-agent-sdk] Using custom memory blocks. \" +\n `Preset blocks are ignored when custom blocks are provided: ${presetNames.join(\", \")}`\n );\n }\n } else if (presetNames.length > 0) {\n args.push(\"--init-blocks\", presetNames.join(\",\"));\n }\n }\n }\n\n // Convenience props for block values (only for new agents)\n if (!options.agentId) {\n if (options.persona !== undefined) {\n args.push(\"--block-value\", `persona=${options.persona}`);\n }\n if (options.human !== undefined) {\n args.push(\"--block-value\", `human=${options.human}`);\n }\n }\n\n // Permission mode\n if (options.permissionMode === \"bypassPermissions\") {\n args.push(\"--yolo\");\n } else if (options.permissionMode && options.permissionMode !== \"default\") {\n args.push(\"--permission-mode\", options.permissionMode);\n }\n\n // Allowed / disallowed tools\n if (options.allowedTools) {\n args.push(\"--allowedTools\", options.allowedTools.join(\",\"));\n }\n if (options.disallowedTools) {\n args.push(\"--disallowedTools\", options.disallowedTools.join(\",\"));\n }\n\n // Tags\n const tags = applyNewAgentDefaults\n ? includeSdkAgentOriginTag(options.tags)\n : options.tags;\n if (tags && tags.length > 0) {\n args.push(\"--tags\", tags.join(\",\"));\n }\n\n // SDK-created agents always use the git-backed memory filesystem.\n if (applyNewAgentDefaults) {\n args.push(\"--memfs\");\n }\n\n // Skills sources\n if (options.skillSources !== undefined) {\n const sources = [...new Set(options.skillSources)];\n if (sources.length === 0) {\n args.push(\"--no-skills\");\n } else {\n args.push(\"--skill-sources\", sources.join(\",\"));\n }\n }\n\n // Session context reminder toggle\n if (options.systemInfoReminder === false) {\n args.push(\"--no-system-info-reminder\");\n }\n\n // Dreaming settings (forwarded to the CLI's underlying reflection flags)\n if (options.dreaming?.trigger !== undefined) {\n args.push(\"--reflection-trigger\", options.dreaming.trigger);\n }\n if (options.dreaming?.behavior !== undefined) {\n args.push(\"--reflection-behavior\", options.dreaming.behavior);\n }\n if (options.dreaming?.stepCount !== undefined) {\n args.push(\"--reflection-step-count\", String(options.dreaming.stepCount));\n }\n\n return args;\n}\n\nexport class SubprocessTransport {\n private process: ChildProcess | null = null;\n private stdout: Interface | null = null;\n private messageQueue: WireMessage[] = [];\n private messageResolvers: Array<(msg: WireMessage | null) => void> = [];\n private closed = false;\n private agentId?: string;\n private wireMessageCount = 0;\n private lastMessageAt = 0;\n private stderrLines: string[] = [];\n\n constructor(\n private options: InternalSessionOptions = {}\n ) {}\n\n /**\n * Start the CLI subprocess\n */\n async connect(): Promise<void> {\n const args = this.buildArgs();\n\n // Find the CLI - use the installed letta-code package\n const cliPath = await this.findCli();\n sdkLog(\"connect\", `CLI: ${cliPath}`);\n sdkLog(\"connect\", `args: ${args.join(\" \")}`);\n sdkLog(\"connect\", `cwd: ${this.options.cwd || process.cwd()}`);\n sdkLog(\"connect\", `permissionMode: ${this.options.permissionMode || \"default\"}`);\n\n this.process = spawn(\"node\", [cliPath, ...args], {\n cwd: this.options.cwd || process.cwd(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n const pid = this.process.pid;\n sdkLog(\"connect\", `CLI process spawned, pid=${pid}`);\n\n if (!this.process.stdout || !this.process.stdin) {\n throw new Error(\"Failed to create subprocess pipes\");\n }\n\n // Set up stdout reading\n this.stdout = createInterface({\n input: this.process.stdout,\n crlfDelay: Infinity,\n });\n\n this.stdout.on(\"line\", (line) => {\n if (!line.trim()) return;\n try {\n const msg = JSON.parse(line) as WireMessage;\n this.handleMessage(msg);\n } catch {\n // Non-JSON line from CLI stdout - could be important debug info\n sdkLog(\"stdout\", `[non-JSON] ${line.slice(0, 500)}`);\n }\n });\n\n // Log stderr for debugging (CLI errors, auth failures, etc.)\n // Also buffer lines so session.initialize() can include them in errors.\n if (this.process.stderr) {\n this.process.stderr.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg) {\n console.error(\"[letta-agent-sdk] CLI stderr:\", msg);\n this.stderrLines.push(msg);\n }\n });\n }\n\n // Handle process exit\n //\n // BUG FIX: When the CLI subprocess exits while read() has a pending\n // resolver waiting for the next message, that resolver would never fire.\n // The messages() async generator would be stuck in `await this.read()`\n // forever, causing session.stream() to hang, which deadlocks the\n // caller's processing mutex. Resolving pending readers with null on\n // process exit lets messages() break out of its loop cleanly.\n this.process.on(\"close\", (code, signal) => {\n if (code !== 0 && code !== null) {\n console.error(`[letta-agent-sdk] CLI process exited with code ${code}`);\n }\n sdkLog(\"close\", `CLI process exited: pid=${pid} code=${code} signal=${signal} wireMessages=${this.wireMessageCount} msSinceLastMsg=${this.lastMessageAt ? Date.now() - this.lastMessageAt : 0} pendingResolvers=${this.messageResolvers.length} queueLen=${this.messageQueue.length}`);\n this.closed = true;\n // Flush pending readers so they don't hang forever (see comment above)\n for (const resolve of this.messageResolvers) {\n resolve(null);\n }\n this.messageResolvers = [];\n });\n\n this.process.on(\"error\", (err) => {\n console.error(\"[letta-agent-sdk] CLI process error:\", err);\n this.closed = true;\n });\n }\n\n /**\n * Send a message to the CLI via stdin\n */\n async write(data: object): Promise<void> {\n if (!this.process?.stdin || this.closed) {\n const err = new Error(`Transport not connected (closed=${this.closed}, pid=${this.process?.pid}, stdin=${!!this.process?.stdin})`);\n sdkLog(\"write\", err.message);\n throw err;\n }\n const payload = data as Record<string, unknown>;\n sdkLog(\"write\", `type=${payload.type} subtype=${(payload.request as Record<string, unknown>)?.subtype || (payload.response as Record<string, unknown>)?.subtype || \"N/A\"}`);\n this.process.stdin.write(JSON.stringify(data) + \"\\n\");\n }\n\n /**\n * Read the next message from the CLI\n */\n async read(): Promise<WireMessage | null> {\n // Return queued message if available\n if (this.messageQueue.length > 0) {\n return this.messageQueue.shift()!;\n }\n\n // If closed, no more messages\n if (this.closed) {\n sdkLog(\"read\", `returning null (closed), total wireMessages=${this.wireMessageCount}`);\n return null;\n }\n\n // Wait for next message\n sdkLog(\"read\", `waiting for next message (resolvers=${this.messageResolvers.length + 1}, queue=${this.messageQueue.length})`);\n return new Promise((resolve) => {\n this.messageResolvers.push(resolve);\n });\n }\n\n /**\n * Async iterator for messages\n */\n async *messages(): AsyncGenerator<WireMessage> {\n while (true) {\n const msg = await this.read();\n if (msg === null) {\n sdkLog(\"messages\", `iterator ending (closed=${this.closed}, wireMessages=${this.wireMessageCount})`);\n break;\n }\n yield msg;\n }\n }\n\n /**\n * Close the transport\n */\n close(): void {\n sdkLog(\"close\", `explicit close called (wireMessages=${this.wireMessageCount}, pendingResolvers=${this.messageResolvers.length}, pid=${this.process?.pid})`);\n if (this.process) {\n this.process.stdin?.end();\n this.process.kill();\n this.process = null;\n }\n this.closed = true;\n\n // Resolve any pending readers with null\n for (const resolve of this.messageResolvers) {\n resolve(null);\n }\n this.messageResolvers = [];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n /** Return buffered stderr output from the CLI subprocess. */\n getStderr(): string {\n return this.stderrLines.join(\"\\n\");\n }\n\n private handleMessage(msg: WireMessage): void {\n this.wireMessageCount++;\n this.lastMessageAt = Date.now();\n\n // Compact log of every wire message for traceability\n const wirePayload = msg as unknown as Record<string, unknown>;\n const msgType = wirePayload.message_type || wirePayload.subtype || \"\";\n sdkLog(\"wire\", `#${this.wireMessageCount} type=${msg.type} ${msgType ? `msg_type=${msgType}` : \"\"} resolvers=${this.messageResolvers.length} queue=${this.messageQueue.length}`);\n\n // Always log critical message types (result, errors, approval)\n if (msg.type === \"result\") {\n const result = wirePayload as unknown as { subtype?: string; result?: string; duration_ms?: number; stop_reason?: string };\n sdkLog(\"wire\", `RESULT: subtype=${result.subtype} stop_reason=${result.stop_reason || \"N/A\"} duration=${result.duration_ms}ms resultLen=${result.result?.length || 0}`);\n }\n\n // Track agent_id from init message\n if (msg.type === \"system\" && \"subtype\" in msg && msg.subtype === \"init\") {\n this.agentId = (msg as unknown as { agent_id: string }).agent_id;\n sdkLog(\"wire\", `INIT: agent_id=${this.agentId}`);\n }\n\n // Log control requests (approval flow)\n if (msg.type === \"control_request\") {\n const req = wirePayload as unknown as { request_id?: string; request?: { subtype?: string; tool_name?: string } };\n sdkLog(\"wire\", `CONTROL_REQUEST: id=${req.request_id} subtype=${req.request?.subtype} tool=${req.request?.tool_name || \"N/A\"}`);\n }\n\n // If someone is waiting for a message, give it to them\n if (this.messageResolvers.length > 0) {\n const resolve = this.messageResolvers.shift()!;\n resolve(msg);\n } else {\n // Otherwise queue it\n this.messageQueue.push(msg);\n }\n }\n\n private buildArgs(): string[] {\n return buildCliArgs(this.options);\n }\n\n\n\n private async findCli(): Promise<string> {\n // Try multiple resolution strategies\n const { existsSync } = await import(\"node:fs\");\n const { dirname, join } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n\n // Strategy 1: Check LETTA_CLI_PATH env var\n if (process.env.LETTA_CLI_PATH && existsSync(process.env.LETTA_CLI_PATH)) {\n return process.env.LETTA_CLI_PATH;\n }\n\n // Strategy 2: Try to resolve from node_modules\n // Note: resolve the package main export (not /letta.js subpath) because\n // the package.json \"exports\" field doesn't expose the subpath directly.\n try {\n const { createRequire } = await import(\"node:module\");\n const require = createRequire(import.meta.url);\n const resolved = require.resolve(\"@letta-ai/letta-code\");\n if (existsSync(resolved)) {\n return resolved;\n }\n } catch {\n // Continue to next strategy\n }\n\n // Strategy 3: Check relative to this file (for local file: deps)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const localPaths = [\n join(__dirname, \"../../@letta-ai/letta-code/letta.js\"),\n join(__dirname, \"../../../letta-code-prod/letta.js\"),\n join(__dirname, \"../../../letta-code/letta.js\"),\n ];\n\n for (const p of localPaths) {\n if (existsSync(p)) {\n return p;\n }\n }\n\n throw new Error(\n \"Letta Code CLI not found. Set LETTA_CLI_PATH or install @letta-ai/letta-code.\"\n );\n }\n}\n",
5
+ "/**\n * SubprocessTransport\n *\n * Spawns the Letta Code CLI and communicates via stdin/stdout JSON streams.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport { normalizePermissionMode } from \"./remote-client-session-core.js\";\nimport type { InternalSessionOptions, WireMessage } from \"./types.js\";\n\n// All logging gated behind DEBUG_SDK env var\nfunction sdkLog(tag: string, ...args: unknown[]) {\n if (process.env.DEBUG_SDK) console.error(`[SDK-Transport] [${tag}]`, ...args);\n}\n\nconst SDK_AGENT_ORIGIN_TAG = \"origin:letta-code\";\n\nfunction shouldApplyNewAgentDefaults(options: InternalSessionOptions): boolean {\n return options.createOnly === true;\n}\n\nfunction includeSdkAgentOriginTag(tags: string[] | undefined): string[] {\n const normalizedTags: string[] = [];\n let hasOriginTag = false;\n\n for (const tag of tags ?? []) {\n if (tag === SDK_AGENT_ORIGIN_TAG) {\n if (hasOriginTag) continue;\n hasOriginTag = true;\n }\n normalizedTags.push(tag);\n }\n\n if (!hasOriginTag) {\n normalizedTags.push(SDK_AGENT_ORIGIN_TAG);\n }\n\n return normalizedTags;\n}\n\n/**\n * Build the CLI argument array for a given set of session options.\n *\n * Exported as a pure function for testing — this IS the real production code\n * path. SubprocessTransport.buildArgs() delegates here.\n */\nexport function buildCliArgs(options: InternalSessionOptions): string[] {\n const args: string[] = [\n \"--output-format\",\n \"stream-json\",\n \"--input-format\",\n \"stream-json\",\n ];\n const applyNewAgentDefaults = shouldApplyNewAgentDefaults(options);\n\n // Conversation and agent handling\n if (options.conversationId) {\n args.push(\"--conversation\", options.conversationId);\n } else if (options.agentId) {\n args.push(\"--agent\", options.agentId);\n if (options.newConversation) {\n args.push(\"--new\");\n } else if (options.defaultConversation) {\n args.push(\"--conversation\", \"default\");\n }\n } else if (options.createOnly) {\n args.push(\"--new-agent\");\n } else if (options.newConversation) {\n args.push(\"--new\");\n }\n\n // Model\n if (options.model) {\n args.push(\"-m\", options.model);\n }\n\n // Partial message streaming\n if (options.includePartialMessages) {\n args.push(\"--include-partial-messages\");\n }\n\n // Embedding model\n if (options.embedding) {\n args.push(\"--embedding\", options.embedding);\n }\n\n // System prompt configuration\n if (options.systemPrompt !== undefined) {\n if (typeof options.systemPrompt === \"string\") {\n const validPresets = [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ];\n if (validPresets.includes(options.systemPrompt)) {\n args.push(\"--system\", options.systemPrompt);\n } else {\n args.push(\"--system-custom\", options.systemPrompt);\n }\n } else {\n args.push(\"--system\", options.systemPrompt.preset);\n if (options.systemPrompt.append) {\n args.push(\"--system-append\", options.systemPrompt.append);\n }\n }\n }\n\n // Memory blocks (only for new agents)\n if (options.memory !== undefined && !options.agentId) {\n if (options.memory.length === 0) {\n args.push(\"--init-blocks\", \"\");\n } else {\n const presetNames: string[] = [];\n const memoryBlocksJson: Array<\n | { label: string; value: string }\n | { blockId: string }\n > = [];\n\n for (const item of options.memory) {\n if (typeof item === \"string\") {\n presetNames.push(item);\n } else if (\"blockId\" in item) {\n memoryBlocksJson.push(item as { blockId: string });\n } else {\n memoryBlocksJson.push(item as { label: string; value: string });\n }\n }\n\n if (memoryBlocksJson.length > 0) {\n args.push(\"--memory-blocks\", JSON.stringify(memoryBlocksJson));\n if (presetNames.length > 0) {\n console.warn(\n \"[letta-agent-sdk] Using custom memory blocks. \" +\n `Preset blocks are ignored when custom blocks are provided: ${presetNames.join(\", \")}`\n );\n }\n } else if (presetNames.length > 0) {\n args.push(\"--init-blocks\", presetNames.join(\",\"));\n }\n }\n }\n\n // Convenience props for block values (only for new agents)\n if (!options.agentId) {\n if (options.persona !== undefined) {\n args.push(\"--block-value\", `persona=${options.persona}`);\n }\n if (options.human !== undefined) {\n args.push(\"--block-value\", `human=${options.human}`);\n }\n }\n\n const mode = normalizePermissionMode(options.permissionMode);\n if (mode !== undefined) {\n args.push(\"--permission-mode\", mode);\n }\n\n // Allowed / disallowed tools\n if (options.allowedTools) {\n args.push(\"--allowedTools\", options.allowedTools.join(\",\"));\n }\n if (options.disallowedTools) {\n args.push(\"--disallowedTools\", options.disallowedTools.join(\",\"));\n }\n\n // Tags\n const tags = applyNewAgentDefaults\n ? includeSdkAgentOriginTag(options.tags)\n : options.tags;\n if (tags && tags.length > 0) {\n args.push(\"--tags\", tags.join(\",\"));\n }\n\n // SDK-created agents always use the git-backed memory filesystem.\n if (applyNewAgentDefaults) {\n args.push(\"--memfs\");\n }\n\n // Skills sources\n if (options.skillSources !== undefined) {\n const sources = [...new Set(options.skillSources)];\n if (sources.length === 0) {\n args.push(\"--no-skills\");\n } else {\n args.push(\"--skill-sources\", sources.join(\",\"));\n }\n }\n\n // Session context reminder toggle\n if (options.systemInfoReminder === false) {\n args.push(\"--no-system-info-reminder\");\n }\n\n // Dreaming settings (forwarded to the CLI's underlying reflection flags)\n if (options.dreaming?.trigger !== undefined) {\n args.push(\"--reflection-trigger\", options.dreaming.trigger);\n }\n if (options.dreaming?.behavior !== undefined) {\n args.push(\"--reflection-behavior\", options.dreaming.behavior);\n }\n if (options.dreaming?.stepCount !== undefined) {\n args.push(\"--reflection-step-count\", String(options.dreaming.stepCount));\n }\n\n return args;\n}\n\nexport class SubprocessTransport {\n private process: ChildProcess | null = null;\n private stdout: Interface | null = null;\n private messageQueue: WireMessage[] = [];\n private messageResolvers: Array<(msg: WireMessage | null) => void> = [];\n private closed = false;\n private agentId?: string;\n private wireMessageCount = 0;\n private lastMessageAt = 0;\n private stderrLines: string[] = [];\n\n constructor(\n private options: InternalSessionOptions = {}\n ) {}\n\n /**\n * Start the CLI subprocess\n */\n async connect(): Promise<void> {\n const args = this.buildArgs();\n\n // Find the CLI - use the installed letta-code package\n const cliPath = await this.findCli();\n sdkLog(\"connect\", `CLI: ${cliPath}`);\n sdkLog(\"connect\", `args: ${args.join(\" \")}`);\n sdkLog(\"connect\", `cwd: ${this.options.cwd || process.cwd()}`);\n sdkLog(\"connect\", `permissionMode: ${this.options.permissionMode || \"default\"}`);\n\n this.process = spawn(\"node\", [cliPath, ...args], {\n cwd: this.options.cwd || process.cwd(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n const pid = this.process.pid;\n sdkLog(\"connect\", `CLI process spawned, pid=${pid}`);\n\n if (!this.process.stdout || !this.process.stdin) {\n throw new Error(\"Failed to create subprocess pipes\");\n }\n\n // Set up stdout reading\n this.stdout = createInterface({\n input: this.process.stdout,\n crlfDelay: Infinity,\n });\n\n this.stdout.on(\"line\", (line) => {\n if (!line.trim()) return;\n try {\n const msg = JSON.parse(line) as WireMessage;\n this.handleMessage(msg);\n } catch {\n // Non-JSON line from CLI stdout - could be important debug info\n sdkLog(\"stdout\", `[non-JSON] ${line.slice(0, 500)}`);\n }\n });\n\n // Log stderr for debugging (CLI errors, auth failures, etc.)\n // Also buffer lines so session.initialize() can include them in errors.\n if (this.process.stderr) {\n this.process.stderr.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg) {\n console.error(\"[letta-agent-sdk] CLI stderr:\", msg);\n this.stderrLines.push(msg);\n }\n });\n }\n\n // Handle process exit\n //\n // BUG FIX: When the CLI subprocess exits while read() has a pending\n // resolver waiting for the next message, that resolver would never fire.\n // The messages() async generator would be stuck in `await this.read()`\n // forever, causing session.stream() to hang, which deadlocks the\n // caller's processing mutex. Resolving pending readers with null on\n // process exit lets messages() break out of its loop cleanly.\n this.process.on(\"close\", (code, signal) => {\n if (code !== 0 && code !== null) {\n console.error(`[letta-agent-sdk] CLI process exited with code ${code}`);\n }\n sdkLog(\"close\", `CLI process exited: pid=${pid} code=${code} signal=${signal} wireMessages=${this.wireMessageCount} msSinceLastMsg=${this.lastMessageAt ? Date.now() - this.lastMessageAt : 0} pendingResolvers=${this.messageResolvers.length} queueLen=${this.messageQueue.length}`);\n this.closed = true;\n // Flush pending readers so they don't hang forever (see comment above)\n for (const resolve of this.messageResolvers) {\n resolve(null);\n }\n this.messageResolvers = [];\n });\n\n this.process.on(\"error\", (err) => {\n console.error(\"[letta-agent-sdk] CLI process error:\", err);\n this.closed = true;\n });\n }\n\n /**\n * Send a message to the CLI via stdin\n */\n async write(data: object): Promise<void> {\n if (!this.process?.stdin || this.closed) {\n const err = new Error(`Transport not connected (closed=${this.closed}, pid=${this.process?.pid}, stdin=${!!this.process?.stdin})`);\n sdkLog(\"write\", err.message);\n throw err;\n }\n const payload = data as Record<string, unknown>;\n sdkLog(\"write\", `type=${payload.type} subtype=${(payload.request as Record<string, unknown>)?.subtype || (payload.response as Record<string, unknown>)?.subtype || \"N/A\"}`);\n this.process.stdin.write(JSON.stringify(data) + \"\\n\");\n }\n\n /**\n * Read the next message from the CLI\n */\n async read(): Promise<WireMessage | null> {\n // Return queued message if available\n if (this.messageQueue.length > 0) {\n return this.messageQueue.shift()!;\n }\n\n // If closed, no more messages\n if (this.closed) {\n sdkLog(\"read\", `returning null (closed), total wireMessages=${this.wireMessageCount}`);\n return null;\n }\n\n // Wait for next message\n sdkLog(\"read\", `waiting for next message (resolvers=${this.messageResolvers.length + 1}, queue=${this.messageQueue.length})`);\n return new Promise((resolve) => {\n this.messageResolvers.push(resolve);\n });\n }\n\n /**\n * Async iterator for messages\n */\n async *messages(): AsyncGenerator<WireMessage> {\n while (true) {\n const msg = await this.read();\n if (msg === null) {\n sdkLog(\"messages\", `iterator ending (closed=${this.closed}, wireMessages=${this.wireMessageCount})`);\n break;\n }\n yield msg;\n }\n }\n\n /**\n * Close the transport\n */\n close(): void {\n sdkLog(\"close\", `explicit close called (wireMessages=${this.wireMessageCount}, pendingResolvers=${this.messageResolvers.length}, pid=${this.process?.pid})`);\n if (this.process) {\n this.process.stdin?.end();\n this.process.kill();\n this.process = null;\n }\n this.closed = true;\n\n // Resolve any pending readers with null\n for (const resolve of this.messageResolvers) {\n resolve(null);\n }\n this.messageResolvers = [];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n /** Return buffered stderr output from the CLI subprocess. */\n getStderr(): string {\n return this.stderrLines.join(\"\\n\");\n }\n\n private handleMessage(msg: WireMessage): void {\n this.wireMessageCount++;\n this.lastMessageAt = Date.now();\n\n // Compact log of every wire message for traceability\n const wirePayload = msg as unknown as Record<string, unknown>;\n const msgType = wirePayload.message_type || wirePayload.subtype || \"\";\n sdkLog(\"wire\", `#${this.wireMessageCount} type=${msg.type} ${msgType ? `msg_type=${msgType}` : \"\"} resolvers=${this.messageResolvers.length} queue=${this.messageQueue.length}`);\n\n // Always log critical message types (result, errors, approval)\n if (msg.type === \"result\") {\n const result = wirePayload as unknown as { subtype?: string; result?: string; duration_ms?: number; stop_reason?: string };\n sdkLog(\"wire\", `RESULT: subtype=${result.subtype} stop_reason=${result.stop_reason || \"N/A\"} duration=${result.duration_ms}ms resultLen=${result.result?.length || 0}`);\n }\n\n // Track agent_id from init message\n if (msg.type === \"system\" && \"subtype\" in msg && msg.subtype === \"init\") {\n this.agentId = (msg as unknown as { agent_id: string }).agent_id;\n sdkLog(\"wire\", `INIT: agent_id=${this.agentId}`);\n }\n\n // Log control requests (approval flow)\n if (msg.type === \"control_request\") {\n const req = wirePayload as unknown as { request_id?: string; request?: { subtype?: string; tool_name?: string } };\n sdkLog(\"wire\", `CONTROL_REQUEST: id=${req.request_id} subtype=${req.request?.subtype} tool=${req.request?.tool_name || \"N/A\"}`);\n }\n\n // If someone is waiting for a message, give it to them\n if (this.messageResolvers.length > 0) {\n const resolve = this.messageResolvers.shift()!;\n resolve(msg);\n } else {\n // Otherwise queue it\n this.messageQueue.push(msg);\n }\n }\n\n private buildArgs(): string[] {\n return buildCliArgs(this.options);\n }\n\n\n\n private async findCli(): Promise<string> {\n // Try multiple resolution strategies\n const { existsSync } = await import(\"node:fs\");\n const { dirname, join } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n\n // Strategy 1: Check LETTA_CLI_PATH env var\n if (process.env.LETTA_CLI_PATH && existsSync(process.env.LETTA_CLI_PATH)) {\n return process.env.LETTA_CLI_PATH;\n }\n\n // Strategy 2: Try to resolve from node_modules\n // Note: resolve the package main export (not /letta.js subpath) because\n // the package.json \"exports\" field doesn't expose the subpath directly.\n try {\n const { createRequire } = await import(\"node:module\");\n const require = createRequire(import.meta.url);\n const resolved = require.resolve(\"@letta-ai/letta-code\");\n if (existsSync(resolved)) {\n return resolved;\n }\n } catch {\n // Continue to next strategy\n }\n\n // Strategy 3: Check relative to this file (for local file: deps)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const localPaths = [\n join(__dirname, \"../../@letta-ai/letta-code/letta.js\"),\n join(__dirname, \"../../../letta-code-prod/letta.js\"),\n join(__dirname, \"../../../letta-code/letta.js\"),\n ];\n\n for (const p of localPaths) {\n if (existsSync(p)) {\n return p;\n }\n }\n\n throw new Error(\n \"Letta Code CLI not found. Set LETTA_CLI_PATH or install @letta-ai/letta-code.\"\n );\n }\n}\n",
6
+ "import type {\n BootstrapStateOptions,\n BootstrapStateResult,\n CreateAgentOptions,\n LettaCodeClientSessionOptions,\n LettaCodeSession,\n LettaCodeModelEntry,\n ListModelsResult,\n ListMessagesOptions,\n ListMessagesResult,\n MessageContentItem,\n RecoverPendingApprovalsOptions,\n RecoverPendingApprovalsResult,\n ReasoningEffort,\n RunTurnOptions,\n SDKErrorCode,\n SDKInitMessage,\n SDKLoopStatusMessage,\n SDKMessage,\n SDKProtocolCommand,\n SDKProtocolMessage,\n SDKQueueItem,\n SDKQueueUpdateMessage,\n SDKResultMessage,\n SDKStreamEventPayload,\n SendCommandOptions,\n SendMessage,\n SkillSource,\n UpdateModelOptions,\n UpdateModelResult,\n} from \"./types.js\";\n\nexport type RuntimeScope = {\n agent_id: string;\n conversation_id: string;\n};\n\nexport type ProtocolMessage = Record<string, unknown> & {\n type: string;\n request_id?: string;\n runtime?: RuntimeScope;\n};\n\nexport type RuntimeSessionMode =\n | { kind: \"create-agent\"; options: CreateAgentOptions }\n | {\n kind: \"session\";\n agentId?: string;\n conversationId?: string;\n newConversation?: boolean;\n defaultConversation?: boolean;\n options: LettaCodeClientSessionOptions;\n };\n\nexport type RuntimeTurnResult = {\n runtime: RuntimeScope;\n stopReason: string | null;\n runIds: string[];\n success?: boolean;\n detail?: string;\n errorCode?: SDKErrorCode;\n};\n\nexport type RuntimeSendTurnOptions = {\n clientMessageId: string;\n};\n\nexport type RuntimeRequestOptions = {\n timeoutMs?: number;\n predicate?: (message: ProtocolMessage) => boolean;\n};\n\nexport interface RemoteClientRuntimeController {\n onMessage(handler: (message: ProtocolMessage, channel?: string) => void): () => void;\n send(command: Record<string, unknown>): void;\n sendTurnMessage(\n runtime: RuntimeScope,\n message: SendMessage,\n options: RuntimeSendTurnOptions,\n ): void;\n abort(runtime: RuntimeScope): Promise<void>;\n request(\n type: string,\n body: Record<string, unknown>,\n options?: RuntimeRequestOptions,\n ): Promise<ProtocolMessage>;\n recoverPendingApprovals(\n runtime: RuntimeScope,\n options?: RecoverPendingApprovalsOptions,\n ): Promise<RecoverPendingApprovalsResult>;\n listMessages(\n conversationId: string,\n options?: ListMessagesOptions,\n ): Promise<ListMessagesResult>;\n listModels(): Promise<ListModelsResult>;\n updateModel(\n runtime: RuntimeScope,\n payload: { model_id?: string; model_handle?: string },\n ): Promise<UpdateModelResult>;\n close(): void;\n}\n\nexport type RuntimeSessionInit = {\n controller: RemoteClientRuntimeController;\n runtime: RuntimeScope;\n model?: string | null;\n modelSettings?: Record<string, unknown> | null;\n tools?: string[];\n /** Effective runtime skill source override, when explicitly requested. */\n skillSources?: SkillSource[];\n};\n\ntype RemoteClientSessionCoreConfig = {\n label: string;\n requestTimeoutMs?: number;\n};\n\ntype ReflectionSettings = {\n trigger: \"off\" | \"step-count\" | \"compaction-event\";\n step_count: number;\n};\n\ntype UpdateModelPayload = {\n model_id?: string;\n model_handle?: string;\n};\n\ntype NormalizedUpdateModelInput = {\n model?: string;\n modelId?: string;\n modelHandle?: string;\n reasoningEffort?: ReasoningEffort;\n};\n\ntype TurnTracker = {\n id: number;\n runtime: RuntimeScope;\n clientMessageId: string;\n queuedAt: number;\n startedAt: number;\n assistantText: string;\n runIds: Set<string>;\n observedTurnEvidence: boolean;\n observedRequiresApprovalStop: boolean;\n abortRequested: boolean;\n timeout: ReturnType<typeof setTimeout> | null;\n};\n\nconst FAILURE_STOP_REASONS = new Set([\n \"error\",\n \"llm_api_error\",\n \"max_steps\",\n \"interrupted\",\n \"cancelled\",\n \"canceled\",\n]);\nconst REASONING_EFFORTS = new Set<ReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n]);\nconst KNOWN_SDK_ERROR_CODES = new Set<SDKErrorCode>([\n \"approval_conflict\",\n \"approval_conflict_terminal\",\n \"protocol_error\",\n \"error\",\n \"llm_api_error\",\n \"max_steps\",\n \"interrupted\",\n \"stream_closed\",\n]);\n\ntype LegacyPermissionMode = \"default\" | \"bypassPermissions\" | \"fullAccess\";\n\nexport function normalizePermissionMode(\n mode:\n | LettaCodeClientSessionOptions[\"permissionMode\"]\n | LegacyPermissionMode\n | undefined,\n): LettaCodeClientSessionOptions[\"permissionMode\"] | undefined {\n if (mode === undefined || mode === \"default\") {\n return \"standard\";\n }\n if (mode === \"bypassPermissions\" || mode === \"fullAccess\") {\n return \"unrestricted\";\n }\n if (\n mode === \"standard\" ||\n mode === \"acceptEdits\" ||\n mode === \"unrestricted\"\n ) {\n return mode;\n }\n return undefined;\n}\n\nexport function mapPermissionMode(\n mode:\n | LettaCodeClientSessionOptions[\"permissionMode\"]\n | LegacyPermissionMode\n | undefined,\n): string | undefined {\n return normalizePermissionMode(mode);\n}\n\nexport function isUnrestrictedPermissionMode(\n mode:\n | LettaCodeClientSessionOptions[\"permissionMode\"]\n | LegacyPermissionMode\n | undefined,\n): boolean {\n return normalizePermissionMode(mode) === \"unrestricted\";\n}\n\nexport function ensureSuccess(message: Record<string, unknown>, fallback: string): void {\n if (message.success === false) {\n throw new Error(typeof message.error === \"string\" ? message.error : fallback);\n }\n}\n\nfunction toSdkErrorCode(value: string | null | undefined): SDKErrorCode | undefined {\n if (!value || value.length === 0) return undefined;\n return KNOWN_SDK_ERROR_CODES.has(value as SDKErrorCode)\n ? (value as SDKErrorCode)\n : undefined;\n}\n\nfunction isReasoningEffort(value: unknown): value is ReasoningEffort {\n return typeof value === \"string\" && REASONING_EFFORTS.has(value as ReasoningEffort);\n}\n\nfunction nonEmptyString(value: unknown, name: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Invalid ${name}. Expected a non-empty string.`);\n }\n return value;\n}\n\nfunction normalizeUpdateModelInput(update: string | UpdateModelOptions): NormalizedUpdateModelInput {\n if (typeof update === \"string\") {\n if (update.length === 0) {\n throw new Error(\"Invalid model. Expected a non-empty string.\");\n }\n return { model: update };\n }\n if (!update || typeof update !== \"object\" || Array.isArray(update)) {\n throw new Error(\"Invalid updateModel options. Expected a model string or options object.\");\n }\n\n const model = nonEmptyString(update.model, \"model\");\n const modelId = nonEmptyString(update.modelId, \"modelId\");\n const modelHandle = nonEmptyString(update.modelHandle, \"modelHandle\");\n const reasoningEffort = update.reasoningEffort;\n if (reasoningEffort !== undefined && !isReasoningEffort(reasoningEffort)) {\n throw new Error(\n `Invalid reasoningEffort '${String(reasoningEffort)}'. Valid values: ${[...REASONING_EFFORTS].join(\", \")}`,\n );\n }\n if (model !== undefined && (modelId !== undefined || modelHandle !== undefined)) {\n throw new Error(\"Invalid updateModel options. Use either model or explicit modelId/modelHandle, not both.\");\n }\n if (\n model === undefined &&\n modelId === undefined &&\n modelHandle === undefined &&\n reasoningEffort === undefined\n ) {\n throw new Error(\"Invalid updateModel options. Provide model, modelId, modelHandle, or reasoningEffort.\");\n }\n return {\n ...(model !== undefined ? { model } : {}),\n ...(modelId !== undefined ? { modelId } : {}),\n ...(modelHandle !== undefined ? { modelHandle } : {}),\n ...(reasoningEffort !== undefined ? { reasoningEffort } : {}),\n };\n}\n\nfunction modelPayloadWithoutReasoning(input: NormalizedUpdateModelInput): UpdateModelPayload {\n const payload: UpdateModelPayload = {};\n if (input.modelId !== undefined) payload.model_id = input.modelId;\n if (input.modelHandle !== undefined) payload.model_handle = input.modelHandle;\n if (input.model !== undefined) {\n if (input.model.includes(\"/\")) payload.model_handle = input.model;\n else payload.model_id = input.model;\n }\n return payload;\n}\n\nfunction toBaseModelHandle(\n handle: string | undefined,\n byokProviderAliases: Record<string, string> | undefined,\n): string | undefined {\n if (!handle) return undefined;\n const slashIndex = handle.indexOf(\"/\");\n if (slashIndex === -1) return handle;\n const provider = handle.slice(0, slashIndex);\n const model = handle.slice(slashIndex + 1);\n const baseProvider = byokProviderAliases?.[provider];\n return baseProvider ? `${baseProvider}/${model}` : handle;\n}\n\nfunction getContextWindow(value: Record<string, unknown> | null | undefined): number | undefined {\n const contextWindow = value?.context_window;\n return typeof contextWindow === \"number\" ? contextWindow : undefined;\n}\n\nfunction getReasoningEffort(entry: LettaCodeModelEntry): string | undefined {\n const effort = entry.updateArgs?.reasoning_effort;\n return typeof effort === \"string\" ? effort : undefined;\n}\n\nfunction sameContextCandidates(\n candidates: LettaCodeModelEntry[],\n contextWindow: number | undefined,\n): LettaCodeModelEntry[] {\n if (contextWindow === undefined) return candidates;\n const matches = candidates.filter(\n (entry) => getContextWindow(entry.updateArgs) === contextWindow,\n );\n return matches.length > 0 ? matches : candidates;\n}\n\nfunction isApprovalConflictSignal(params: {\n detail?: string;\n message?: string;\n stopReason?: string | null;\n}): boolean {\n if (params.stopReason === \"requires_approval\") return true;\n const haystack = [params.detail, params.message]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\")\n .toLowerCase();\n return (\n haystack.includes(\"waiting for approval on a tool call\") ||\n haystack.includes(\"cannot send a new message\") ||\n haystack.includes(\"requires_approval\")\n );\n}\n\nfunction resolveDreamingSettings(\n dreaming: LettaCodeClientSessionOptions[\"dreaming\"],\n): ReflectionSettings | null {\n if (!dreaming) return null;\n return {\n trigger: dreaming.trigger ?? \"step-count\",\n step_count: dreaming.stepCount ?? 5,\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const pieces: string[] = [];\n for (const part of content) {\n if (typeof part === \"string\") {\n pieces.push(part);\n continue;\n }\n if (part && typeof part === \"object\") {\n const record = part as Record<string, unknown>;\n if (typeof record.text === \"string\") {\n pieces.push(record.text);\n }\n }\n }\n const joined = pieces.join(\"\");\n return joined.length > 0 ? joined : null;\n }\n if (content && typeof content === \"object\") {\n const record = content as Record<string, unknown>;\n if (typeof record.text === \"string\") return record.text;\n }\n return null;\n}\n\nfunction toolInputFromArguments(args: unknown): { input: Record<string, unknown>; raw?: string } {\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n return { input: args as Record<string, unknown> };\n }\n const raw = typeof args === \"string\" ? args : \"\";\n if (!raw) return { input: {} };\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return { input: parsed as Record<string, unknown>, raw };\n }\n } catch {\n // Fall through to raw wrapper.\n }\n return { input: { raw }, raw };\n}\n\nfunction firstToolCall(delta: Record<string, unknown>): Record<string, unknown> | undefined {\n const toolCalls = delta.tool_calls;\n if (Array.isArray(toolCalls)) {\n const first = toolCalls[0];\n return first && typeof first === \"object\" ? (first as Record<string, unknown>) : undefined;\n }\n if (toolCalls && typeof toolCalls === \"object\") {\n return toolCalls as Record<string, unknown>;\n }\n const toolCall = delta.tool_call;\n return toolCall && typeof toolCall === \"object\" ? (toolCall as Record<string, unknown>) : undefined;\n}\n\nfunction firstToolReturn(delta: Record<string, unknown>): Record<string, unknown> | undefined {\n const toolReturns = delta.tool_returns;\n if (Array.isArray(toolReturns)) {\n const first = toolReturns[0];\n return first && typeof first === \"object\" ? (first as Record<string, unknown>) : undefined;\n }\n return undefined;\n}\n\nfunction sameRuntime(message: ProtocolMessage, runtime: RuntimeScope): boolean {\n const msgRuntime = message.runtime;\n if (msgRuntime) {\n return (\n msgRuntime.agent_id === runtime.agent_id &&\n msgRuntime.conversation_id === runtime.conversation_id\n );\n }\n const messageAgentId =\n typeof message.agent_id === \"string\"\n ? message.agent_id\n : typeof message.agentId === \"string\"\n ? message.agentId\n : undefined;\n const messageConversationId =\n typeof message.conversation_id === \"string\"\n ? message.conversation_id\n : typeof message.conversationId === \"string\"\n ? message.conversationId\n : undefined;\n\n if (messageAgentId && messageAgentId !== runtime.agent_id) return false;\n if (messageConversationId && messageConversationId !== runtime.conversation_id) return false;\n return true;\n}\n\nfunction streamDeltaRecord(message: ProtocolMessage): Record<string, unknown> | null {\n if (message.type !== \"stream_delta\") return null;\n const delta = message.delta;\n return delta && typeof delta === \"object\" && !Array.isArray(delta)\n ? (delta as Record<string, unknown>)\n : null;\n}\n\nfunction streamDeltaMessageType(delta: Record<string, unknown>): string | undefined {\n return typeof delta.message_type === \"string\" ? delta.message_type : undefined;\n}\n\nfunction streamDeltaRunId(delta: Record<string, unknown>): string | undefined {\n return typeof delta.run_id === \"string\" ? delta.run_id : undefined;\n}\n\nfunction streamDeltaStopReason(delta: Record<string, unknown>): string | null | undefined {\n return typeof delta.stop_reason === \"string\" ? delta.stop_reason : undefined;\n}\n\nfunction loopStatusRecord(message: ProtocolMessage): Record<string, unknown> | null {\n if (message.type !== \"update_loop_status\") return null;\n const loopStatus = message.loop_status;\n return loopStatus && typeof loopStatus === \"object\" && !Array.isArray(loopStatus)\n ? (loopStatus as Record<string, unknown>)\n : null;\n}\n\nfunction loopStatusValue(message: ProtocolMessage): string | undefined {\n const loopStatus = loopStatusRecord(message);\n return typeof loopStatus?.status === \"string\" ? loopStatus.status : undefined;\n}\n\nfunction loopStatusRunIds(message: ProtocolMessage): string[] {\n const activeRunIds = loopStatusRecord(message)?.active_run_ids;\n return Array.isArray(activeRunIds)\n ? activeRunIds.filter((runId): runId is string => typeof runId === \"string\")\n : [];\n}\n\nfunction queueItems(message: ProtocolMessage): SDKQueueItem[] {\n const queue = message.queue;\n if (!Array.isArray(queue)) return [];\n return queue.flatMap((item) => {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return [];\n const record = item as Record<string, unknown>;\n if (typeof record.id !== \"string\") return [];\n return [\n {\n id: record.id,\n clientMessageId:\n typeof record.client_message_id === \"string\" ? record.client_message_id : \"\",\n kind: typeof record.kind === \"string\" ? record.kind : \"message\",\n source: typeof record.source === \"string\" ? record.source : \"user\",\n content: record.content,\n enqueuedAt: typeof record.enqueued_at === \"string\" ? record.enqueued_at : \"\",\n },\n ];\n });\n}\n\nexport function normalizeSendMessage(message: SendMessage): string | MessageContentItem[] {\n return message;\n}\n\nexport abstract class RemoteClientSessionCore implements LettaCodeSession {\n protected controller: RemoteClientRuntimeController | null = null;\n protected runtime: RuntimeScope | null = null;\n protected initialized = false;\n protected closed = false;\n protected activeTurnStartedAt = 0;\n protected _agentId: string | null = null;\n protected _sessionId: string | null = null;\n protected _conversationId: string | null = null;\n protected _model = \"\";\n protected _modelSettings: Record<string, unknown> | null = null;\n\n private readonly label: string;\n private readonly requestTimeoutMs: number | undefined;\n private streamQueue: SDKMessage[] = [];\n private streamResolvers: Array<(msg: SDKMessage | null) => void> = [];\n private removeMessageHandler: (() => void) | null = null;\n private activeTurn: TurnTracker | null = null;\n private pendingTurns: TurnTracker[] = [];\n private nextTurnId = 0;\n private messageCounter = 0;\n private clientMessageCounter = 0;\n private toolNames: string[] | undefined;\n\n protected constructor(\n protected readonly mode: RuntimeSessionMode,\n config: RemoteClientSessionCoreConfig,\n ) {\n this.label = config.label;\n this.requestTimeoutMs = config.requestTimeoutMs;\n }\n\n async initialize(): Promise<SDKInitMessage> {\n if (this.initialized) {\n throw new Error(\"Session already initialized\");\n }\n if (this.closed) {\n throw new Error(\"Session is closed\");\n }\n\n try {\n const init = await this.initializeRuntimeController();\n this.controller = init.controller;\n this.runtime = init.runtime;\n this._agentId = init.runtime.agent_id;\n this._conversationId = init.runtime.conversation_id;\n this._sessionId = `${init.runtime.agent_id}:${init.runtime.conversation_id}`;\n this._modelSettings = init.modelSettings ?? null;\n this._model =\n typeof init.model === \"string\"\n ? init.model\n : typeof this._modelSettings?.model === \"string\"\n ? this._modelSettings.model\n : \"\";\n this.toolNames = init.tools;\n this.removeMessageHandler = this.controller.onMessage(this.handleProtocolMessage);\n this.initialized = true;\n\n await this.afterRuntimeInitialized();\n await this.applyPostInitializeOptions();\n\n const initMessage: SDKInitMessage = {\n type: \"init\",\n agentId: init.runtime.agent_id,\n sessionId: this._sessionId,\n conversationId: init.runtime.conversation_id,\n model: this._model,\n };\n if (this.toolNames !== undefined) initMessage.tools = this.toolNames;\n if (init.skillSources !== undefined) {\n initMessage.skillSources = init.skillSources;\n }\n return initMessage;\n } catch (error) {\n this.close();\n throw error;\n }\n }\n\n async send(message: SendMessage): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n\n await this.beforeTurn();\n\n const turn = this.trackSentTurn(this.runtime);\n try {\n this.controller.sendTurnMessage(this.runtime, message, {\n clientMessageId: turn.clientMessageId,\n });\n } catch (error) {\n this.removeTrackedTurn(turn);\n throw error;\n }\n }\n\n async runTurn(\n message: SendMessage,\n _options: RunTurnOptions = {},\n ): Promise<SDKResultMessage> {\n if (this.activeTurn || this.pendingTurns.length > 0) {\n throw new Error(\n `A turn is already in flight for this ${this.label} session. Use send() and stream() to let the listener queue messages.`,\n );\n }\n await this.send(message);\n for await (const msg of this.stream()) {\n if (msg.type === \"result\") {\n return msg;\n }\n }\n return {\n type: \"result\",\n success: false,\n error: \"stream_closed\",\n errorCode: \"stream_closed\",\n recoverable: false,\n errorDetail: \"Stream ended before terminal result\",\n durationMs: Date.now() - this.activeTurnStartedAt,\n conversationId: this._conversationId,\n };\n }\n\n async *stream(): AsyncGenerator<SDKMessage> {\n while (true) {\n const msg = await this.nextMessage();\n if (!msg) break;\n yield msg;\n if (msg.type === \"result\") break;\n }\n }\n\n async abort(): Promise<void> {\n if (!this.initialized) return;\n if (!this.controller || !this.runtime) return;\n if (this.activeTurn) this.activeTurn.abortRequested = true;\n await this.controller.abort(this.runtime);\n }\n\n async sendCommand(command: SDKProtocolCommand): Promise<void>;\n async sendCommand<TResponse extends SDKProtocolMessage = SDKProtocolMessage>(\n command: SDKProtocolCommand,\n options: SendCommandOptions,\n ): Promise<TResponse>;\n async sendCommand<TResponse extends SDKProtocolMessage = SDKProtocolMessage>(\n command: SDKProtocolCommand,\n options?: SendCommandOptions,\n ): Promise<void | TResponse> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller) {\n throw new Error(\"Session is not initialized\");\n }\n if (!command || typeof command !== \"object\" || Array.isArray(command)) {\n throw new Error(\"Invalid command. Expected a protocol command object.\");\n }\n if (typeof command.type !== \"string\" || command.type.length === 0) {\n throw new Error(\"Invalid command. Expected a non-empty type.\");\n }\n\n if (!options || (!options.responseType && !options.predicate && options.timeoutMs === undefined)) {\n this.controller.send(command);\n return;\n }\n\n const { type, ...body } = command;\n const response = await this.controller.request(type, body, {\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n predicate: options.predicate\n ? (message) => options.predicate?.(message as SDKProtocolMessage) === true\n : options.responseType\n ? (message) => message.type === options.responseType\n : undefined,\n });\n return response as TResponse;\n }\n\n async listModels(): Promise<ListModelsResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller) {\n throw new Error(\"Session is not initialized\");\n }\n return this.controller.listModels();\n }\n\n async updateModel(update: string | UpdateModelOptions): Promise<UpdateModelResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n\n const normalized = normalizeUpdateModelInput(update);\n const payload = await this.resolveUpdateModelPayload(normalized);\n const result = await this.controller.updateModel(this.runtime, payload);\n\n if (result.modelHandle !== undefined) {\n this._model = result.modelHandle;\n } else if (payload.model_handle !== undefined) {\n this._model = payload.model_handle;\n } else if (typeof result.modelSettings?.model === \"string\") {\n this._model = result.modelSettings.model;\n }\n if (\"modelSettings\" in result) {\n this._modelSettings = result.modelSettings ?? null;\n }\n return result;\n }\n\n async recoverPendingApprovals(\n options: RecoverPendingApprovalsOptions = {},\n ): Promise<RecoverPendingApprovalsResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n return this.controller.recoverPendingApprovals(this.runtime, options);\n }\n\n async listMessages(options: ListMessagesOptions = {}): Promise<ListMessagesResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller) {\n throw new Error(\"Session is not initialized\");\n }\n const conversationId = options.conversationId ?? this._conversationId;\n if (!conversationId) {\n throw new Error(\"No conversation id available for listMessages()\");\n }\n return this.controller.listMessages(conversationId, options);\n }\n\n async bootstrapState(\n options: BootstrapStateOptions = {},\n ): Promise<BootstrapStateResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n const page = await this.listMessages({\n limit: options.limit,\n order: options.order,\n });\n\n const state: BootstrapStateResult = {\n agentId: this._agentId ?? \"\",\n conversationId: this._conversationId ?? \"\",\n model: this._model,\n messages: page.messages,\n };\n if (this.toolNames !== undefined) {\n state.tools = this.toolNames;\n }\n if (page.nextBefore !== undefined) {\n state.nextBefore = page.nextBefore;\n }\n if (page.hasMore !== undefined) {\n state.hasMore = page.hasMore;\n }\n return state;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.removeMessageHandler?.();\n this.removeMessageHandler = null;\n if (this.activeTurn?.timeout) clearTimeout(this.activeTurn.timeout);\n for (const turn of this.pendingTurns) {\n if (turn.timeout) clearTimeout(turn.timeout);\n }\n this.activeTurn = null;\n this.pendingTurns.length = 0;\n this.controller?.close();\n this.controller = null;\n this.onCoreClose();\n this.resolveAll(null);\n }\n\n get agentId(): string | null {\n return this._agentId;\n }\n\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n get conversationId(): string | null {\n return this._conversationId;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n }\n\n async changeDeviceState(\n updates: {\n cwd?: string;\n permissionMode?: LettaCodeClientSessionOptions[\"permissionMode\"];\n agentId?: string;\n conversationId?: string;\n },\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n const payload: Record<string, unknown> = {};\n if (updates.cwd !== undefined) payload.cwd = updates.cwd;\n if (updates.permissionMode !== undefined) {\n const mode = mapPermissionMode(updates.permissionMode);\n if (mode !== undefined) payload.mode = mode;\n }\n if (updates.agentId !== undefined) payload.agent_id = updates.agentId;\n if (updates.conversationId !== undefined) payload.conversation_id = updates.conversationId;\n\n this.controller.send({\n type: \"change_device_state\",\n runtime: this.runtime,\n payload,\n });\n }\n\n async updateToolset(toolsetPreference: string): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n const response = await this.controller.request(\n \"update_toolset\",\n {\n runtime: this.runtime,\n toolset_preference: toolsetPreference,\n },\n { predicate: (message) => message.type === \"update_toolset_response\" },\n );\n ensureSuccess(response, \"Failed to update toolset\");\n }\n\n protected abstract initializeRuntimeController(): Promise<RuntimeSessionInit>;\n\n protected async afterRuntimeInitialized(): Promise<void> {\n // Optional hook for subclasses to send transport-specific startup frames.\n }\n\n protected async beforeTurn(): Promise<void> {\n // Optional hook for subclasses to refresh transport-specific lifecycle state.\n }\n\n protected onCoreClose(): void {\n // Optional hook for subclass-owned resources outside the controller.\n }\n\n protected currentOptions(): LettaCodeClientSessionOptions | CreateAgentOptions {\n return this.mode.options;\n }\n\n protected shouldEnableMemfs(options: LettaCodeClientSessionOptions | CreateAgentOptions): boolean {\n void options;\n return false;\n }\n\n protected enableMemfsBody(): Record<string, unknown> {\n if (!this.runtime) return {};\n return { agent_id: this.runtime.agent_id };\n }\n\n protected setModel(model: string): void {\n this._model = model;\n }\n\n private trackSentTurn(runtime: RuntimeScope): TurnTracker {\n const turn: TurnTracker = {\n id: ++this.nextTurnId,\n runtime,\n clientMessageId: `sdk-message-${Date.now()}-${++this.clientMessageCounter}`,\n queuedAt: Date.now(),\n startedAt: 0,\n assistantText: \"\",\n runIds: new Set<string>(),\n observedTurnEvidence: false,\n observedRequiresApprovalStop: false,\n abortRequested: false,\n timeout: null,\n };\n\n if (this.activeTurn) {\n this.pendingTurns.push(turn);\n } else {\n this.activateTurn(turn);\n }\n return turn;\n }\n\n private activateTurn(turn: TurnTracker): void {\n this.activeTurn = turn;\n turn.startedAt = Date.now();\n this.activeTurnStartedAt = turn.startedAt;\n if (this.requestTimeoutMs !== undefined) {\n turn.timeout = setTimeout(() => {\n this.failTurn(turn, `Timed out waiting for ${this.label} turn`);\n }, this.requestTimeoutMs);\n (turn.timeout as { unref?: () => void }).unref?.();\n }\n }\n\n private activateNextTurnFromProtocol(): TurnTracker | null {\n if (this.activeTurn) return this.activeTurn;\n const next = this.pendingTurns.shift();\n if (!next) return null;\n this.activateTurn(next);\n return next;\n }\n\n private removeTrackedTurn(turn: TurnTracker): void {\n if (turn.timeout) clearTimeout(turn.timeout);\n if (this.activeTurn === turn) {\n this.activeTurn = null;\n return;\n }\n const index = this.pendingTurns.indexOf(turn);\n if (index !== -1) this.pendingTurns.splice(index, 1);\n }\n\n private failTurn(turn: TurnTracker, detail: string): void {\n if (this.activeTurn !== turn) return;\n this.enqueue({\n type: \"error\",\n message: detail,\n errorCode: \"error\",\n stopReason: \"error\",\n errorDetail: detail,\n recoverable: false,\n });\n this.completeActiveTurn({\n runtime: turn.runtime,\n stopReason: \"error\",\n runIds: [...turn.runIds],\n success: false,\n detail,\n errorCode: \"error\",\n });\n }\n\n private completeActiveTurn(turn: RuntimeTurnResult): void {\n const active = this.activeTurn;\n if (!active) return;\n if (active.timeout) {\n clearTimeout(active.timeout);\n active.timeout = null;\n }\n this.enqueue(this.resultFromTurn(turn, active));\n this.activeTurn = null;\n }\n\n private async resolveUpdateModelPayload(\n input: NormalizedUpdateModelInput,\n ): Promise<UpdateModelPayload> {\n if (input.reasoningEffort === undefined) {\n return modelPayloadWithoutReasoning(input);\n }\n if (!this.controller) {\n throw new Error(\"Session is not initialized\");\n }\n\n const catalog = await this.controller.listModels();\n const byId = new Map(catalog.entries.map((entry) => [entry.id, entry]));\n const aliases = catalog.byokProviderAliases;\n\n let baseEntry: LettaCodeModelEntry | undefined;\n let explicitHandle: string | undefined;\n let targetHandle: string | undefined;\n\n if (input.modelId !== undefined) {\n baseEntry = byId.get(input.modelId);\n explicitHandle = input.modelHandle;\n targetHandle = baseEntry?.handle ?? toBaseModelHandle(input.modelHandle, aliases);\n } else if (input.modelHandle !== undefined) {\n explicitHandle = input.modelHandle;\n targetHandle = toBaseModelHandle(input.modelHandle, aliases);\n } else if (input.model !== undefined) {\n baseEntry = byId.get(input.model);\n if (baseEntry) {\n targetHandle = baseEntry.handle;\n } else {\n explicitHandle = input.model;\n targetHandle = toBaseModelHandle(input.model, aliases);\n }\n } else {\n explicitHandle = this._model || undefined;\n targetHandle = toBaseModelHandle(this._model || undefined, aliases);\n }\n\n if (!targetHandle) {\n throw new Error(\"reasoningEffort requires a current model or explicit model/modelId/modelHandle.\");\n }\n\n const candidates = catalog.entries.filter(\n (entry) => entry.handle === targetHandle || entry.handle === explicitHandle,\n );\n if (candidates.length === 0) {\n throw new Error(\n `reasoningEffort requires a model from listModels(); no catalog entry found for ${targetHandle}.`,\n );\n }\n\n const contextWindow =\n getContextWindow(baseEntry?.updateArgs) ?? getContextWindow(this._modelSettings);\n const scopedCandidates = sameContextCandidates(candidates, contextWindow);\n const matchingEntry =\n scopedCandidates.find((entry) => getReasoningEffort(entry) === input.reasoningEffort) ??\n candidates.find((entry) => getReasoningEffort(entry) === input.reasoningEffort);\n\n if (!matchingEntry) {\n throw new Error(\n `No ${input.reasoningEffort} reasoning tier found for model ${targetHandle}.`,\n );\n }\n\n const payload: UpdateModelPayload = { model_id: matchingEntry.id };\n if (explicitHandle !== undefined) {\n payload.model_handle = explicitHandle;\n }\n return payload;\n }\n\n protected async applyPostInitializeOptions(): Promise<void> {\n if (!this.controller || !this.runtime) return;\n\n const options = this.currentOptions();\n\n if (this.shouldEnableMemfs(options)) {\n const response = await this.controller.request(\n \"enable_memfs\",\n this.enableMemfsBody(),\n {\n predicate: (message) => message.type === \"enable_memfs_response\",\n // Enabling the memory filesystem on a cloud agent is a slow\n // multi-round-trip operation; the default request timeout is far\n // too tight for it.\n timeoutMs: 180_000,\n },\n );\n ensureSuccess(response, \"Failed to enable memfs\");\n }\n\n const dreamingSettings = resolveDreamingSettings(options.dreaming);\n if (dreamingSettings) {\n const response = await this.controller.request(\n \"set_reflection_settings\",\n {\n runtime: this.runtime,\n settings: dreamingSettings,\n scope: \"both\",\n },\n { predicate: (message) => message.type === \"set_reflection_settings_response\" },\n );\n ensureSuccess(response, \"Failed to update dreaming settings\");\n }\n\n if (this.mode.kind !== \"session\") return;\n\n if (\n this.mode.options.model !== undefined ||\n this.mode.options.reasoningEffort !== undefined\n ) {\n await this.updateModel({\n ...(this.mode.options.model !== undefined ? { model: this.mode.options.model } : {}),\n ...(this.mode.options.reasoningEffort !== undefined\n ? { reasoningEffort: this.mode.options.reasoningEffort }\n : {}),\n });\n }\n\n // Initial cwd and permission mode are part of runtime_start for\n // websocket protocol sessions. Reserve change_device_state for explicit\n // post-init mutations via changeDeviceState().\n }\n\n private handleProtocolMessage = (message: ProtocolMessage): void => {\n if (!this.runtime || !sameRuntime(message, this.runtime)) return;\n\n if (message.type === \"update_queue\") {\n const sdkMessage: SDKQueueUpdateMessage = {\n type: \"queue_update\",\n queue: queueItems(message),\n };\n this.enqueue(sdkMessage);\n return;\n }\n\n if (message.type === \"update_loop_status\") {\n this.handleLoopStatusMessage(message);\n return;\n }\n\n const delta = streamDeltaRecord(message);\n if (!delta) return;\n const active = this.activateNextTurnFromProtocol();\n if (active) {\n active.observedTurnEvidence = true;\n const runId = streamDeltaRunId(delta);\n if (runId) active.runIds.add(runId);\n }\n\n const sdkMessage = this.transformStreamDelta(delta);\n if (sdkMessage) {\n this.enqueue(sdkMessage);\n }\n\n this.handleTurnTerminalDelta(delta, sdkMessage);\n };\n\n private handleLoopStatusMessage(message: ProtocolMessage): void {\n const status = loopStatusValue(message);\n if (!status) return;\n const activeRunIds = loopStatusRunIds(message);\n const sdkMessage: SDKLoopStatusMessage = {\n type: \"loop_status\",\n status,\n activeRunIds,\n };\n this.enqueue(sdkMessage);\n\n const active = this.activeTurn;\n if (!active) return;\n for (const runId of activeRunIds) active.runIds.add(runId);\n\n const hadTurnEvidence = active.observedTurnEvidence || active.observedRequiresApprovalStop;\n if (!hadTurnEvidence) return;\n if (status === \"WAITING_ON_APPROVAL\") {\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason: \"requires_approval\",\n runIds: [...active.runIds],\n });\n return;\n }\n if (status === \"WAITING_ON_INPUT\" && active.abortRequested) {\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason: \"interrupted\",\n runIds: [...active.runIds],\n success: false,\n detail: \"Interrupted\",\n errorCode: \"interrupted\",\n });\n return;\n }\n if (status === \"WAITING_ON_INPUT\" && active.observedTurnEvidence) {\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason: null,\n runIds: [...active.runIds],\n });\n }\n }\n\n private handleTurnTerminalDelta(\n delta: Record<string, unknown>,\n sdkMessage: SDKMessage | null,\n ): void {\n const active = this.activeTurn;\n if (!active) return;\n const messageType = streamDeltaMessageType(delta);\n if (messageType === \"stop_reason\") {\n const stopReason = streamDeltaStopReason(delta) ?? null;\n if (stopReason === \"requires_approval\") {\n active.observedRequiresApprovalStop = true;\n return;\n }\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason,\n runIds: [...active.runIds],\n });\n return;\n }\n\n if (sdkMessage?.type === \"error\") {\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason: sdkMessage.stopReason,\n runIds: [...active.runIds],\n success: false,\n detail: sdkMessage.errorDetail ?? sdkMessage.message,\n errorCode: sdkMessage.errorCode,\n });\n }\n }\n\n private transformStreamDelta(delta: Record<string, unknown>): SDKMessage | null {\n const messageType = typeof delta.message_type === \"string\" ? delta.message_type : undefined;\n const runId = typeof delta.run_id === \"string\" ? delta.run_id : undefined;\n const uuid = typeof delta.id === \"string\" ? delta.id : `${this.label}-${++this.messageCounter}`;\n\n if (messageType === \"assistant_message\") {\n const content = extractTextFromContent(delta.content);\n if (!content) return null;\n if (this.activeTurn) this.activeTurn.assistantText += content;\n return { type: \"assistant\", content, uuid, runId };\n }\n\n if (messageType === \"reasoning_message\") {\n const content = typeof delta.reasoning === \"string\"\n ? delta.reasoning\n : extractTextFromContent(delta.content);\n if (!content) return null;\n return { type: \"reasoning\", content, uuid, runId };\n }\n\n if (messageType === \"tool_call_message\" || messageType === \"approval_request_message\") {\n const toolCall = firstToolCall(delta);\n if (!toolCall) return null;\n const fn = toolCall.function && typeof toolCall.function === \"object\"\n ? (toolCall.function as Record<string, unknown>)\n : undefined;\n const toolCallId =\n (typeof toolCall.tool_call_id === \"string\" ? toolCall.tool_call_id : undefined) ??\n (typeof toolCall.id === \"string\" ? toolCall.id : undefined);\n if (!toolCallId) {\n const detail = `Missing tool_call_id in ${messageType} (uuid=${uuid})`;\n return {\n type: \"error\",\n message: detail,\n errorCode: \"protocol_error\",\n stopReason: \"protocol_error\",\n runId,\n recoverable: false,\n errorDetail: detail,\n };\n }\n const toolName =\n (typeof toolCall.name === \"string\" ? toolCall.name : undefined) ??\n (typeof fn?.name === \"string\" ? fn.name : undefined) ??\n \"?\";\n const { input, raw } = toolInputFromArguments(toolCall.arguments ?? fn?.arguments);\n return {\n type: \"tool_call\",\n toolCallId,\n toolName,\n toolInput: input,\n rawArguments: raw,\n uuid,\n runId,\n };\n }\n\n if (messageType === \"tool_return_message\") {\n const toolReturn = firstToolReturn(delta) ?? delta;\n const toolCallId =\n (typeof delta.tool_call_id === \"string\" ? delta.tool_call_id : undefined) ??\n (typeof toolReturn.tool_call_id === \"string\" ? toolReturn.tool_call_id : undefined);\n if (!toolCallId) return null;\n const content =\n extractTextFromContent(delta.tool_return ?? toolReturn.tool_return ?? toolReturn.content) ?? \"\";\n const status = typeof delta.status === \"string\" ? delta.status : toolReturn.status;\n return {\n type: \"tool_result\",\n toolCallId,\n content,\n isError: status === \"error\",\n uuid,\n runId,\n };\n }\n\n if (messageType === \"error_message\" || messageType === \"loop_error\") {\n const detail =\n (typeof delta.detail === \"string\" ? delta.detail : undefined) ??\n (typeof delta.message === \"string\" ? delta.message : undefined) ??\n `${this.label} turn failed`;\n const stopReason =\n (typeof delta.stop_reason === \"string\" ? delta.stop_reason : undefined) ??\n (typeof delta.error_type === \"string\" ? delta.error_type : undefined) ??\n \"error\";\n const approvalConflict = isApprovalConflictSignal({\n detail,\n message: typeof delta.message === \"string\" ? delta.message : undefined,\n stopReason,\n });\n return {\n type: \"error\",\n message: detail,\n errorCode: approvalConflict ? \"approval_conflict\" : toSdkErrorCode(stopReason),\n approvalConflict: approvalConflict || undefined,\n recoverable: approvalConflict ? true : false,\n errorDetail: detail,\n stopReason,\n runId,\n };\n }\n\n if (messageType === \"retry\") {\n return {\n type: \"retry\",\n reason: typeof delta.reason === \"string\" ? delta.reason : \"error\",\n attempt: typeof delta.attempt === \"number\" ? delta.attempt : 0,\n maxAttempts: typeof delta.max_attempts === \"number\" ? delta.max_attempts : 0,\n delayMs: typeof delta.delay_ms === \"number\" ? delta.delay_ms : 0,\n runId,\n };\n }\n\n if (messageType === \"stop_reason\" || messageType === \"ping\") {\n return null;\n }\n\n return {\n type: \"stream_event\",\n event: delta as SDKStreamEventPayload,\n uuid,\n };\n }\n\n private resultFromTurn(turn: RuntimeTurnResult, tracker?: TurnTracker): SDKResultMessage {\n const stopReason = turn.stopReason ?? (turn.success === false ? \"error\" : undefined);\n const approvalConflict = isApprovalConflictSignal({\n detail: turn.detail,\n stopReason,\n });\n const success = turn.success !== undefined\n ? turn.success && !approvalConflict && !FAILURE_STOP_REASONS.has(stopReason ?? \"\")\n : !approvalConflict && !FAILURE_STOP_REASONS.has(stopReason ?? \"\");\n const errorCode = approvalConflict\n ? \"approval_conflict\"\n : (turn.errorCode ?? toSdkErrorCode(stopReason));\n\n return {\n type: \"result\",\n success,\n result: success ? (tracker?.assistantText || undefined) : undefined,\n error: success ? undefined : (errorCode ?? stopReason ?? \"error\"),\n errorCode: success ? undefined : (errorCode ?? \"error\"),\n approvalConflict: approvalConflict || undefined,\n recoverable: approvalConflict ? true : success ? undefined : false,\n errorDetail: success ? undefined : turn.detail,\n stopReason,\n durationMs: Date.now() - (tracker?.startedAt || this.activeTurnStartedAt),\n conversationId: turn.runtime.conversation_id,\n runIds: turn.runIds.length > 0 ? turn.runIds : undefined,\n };\n }\n\n private enqueue(message: SDKMessage): void {\n const resolver = this.streamResolvers.shift();\n if (resolver) {\n resolver(message);\n return;\n }\n this.streamQueue.push(message);\n }\n\n private nextMessage(): Promise<SDKMessage | null> {\n const next = this.streamQueue.shift();\n if (next) return Promise.resolve(next);\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.streamResolvers.push(resolve);\n });\n }\n\n private resolveAll(value: SDKMessage | null): void {\n for (const resolve of this.streamResolvers.splice(0)) {\n resolve(value);\n }\n }\n}\n",
6
7
  "// Interactive tool policy for SDK permission callbacks.\n// Centralizes behavior so transport/session logic doesn't hardcode names inline.\n\nconst INTERACTIVE_APPROVAL_TOOLS = new Set([\n \"AskUserQuestion\",\n \"EnterPlanMode\",\n \"ExitPlanMode\",\n]);\n\nconst RUNTIME_USER_INPUT_TOOLS = new Set([\"AskUserQuestion\", \"ExitPlanMode\"]);\n\nconst HEADLESS_AUTO_ALLOW_TOOLS = new Set([\"EnterPlanMode\"]);\n\nexport function isInteractiveApprovalTool(toolName: string): boolean {\n return INTERACTIVE_APPROVAL_TOOLS.has(toolName);\n}\n\nexport function requiresRuntimeUserInput(toolName: string): boolean {\n return RUNTIME_USER_INPUT_TOOLS.has(toolName);\n}\n\nexport function isHeadlessAutoAllowTool(toolName: string): boolean {\n return HEADLESS_AUTO_ALLOW_TOOLS.has(toolName);\n}\n",
7
- "/**\n * Session\n *\n * Represents a conversation session with a Letta agent.\n * Implements the V2 API pattern: send() / receive()\n */\n\nimport { SubprocessTransport } from \"./transport.js\";\nimport type {\n InternalSessionOptions,\n SDKMessage,\n SDKInitMessage,\n SDKResultMessage,\n SDKErrorCode,\n MessageWire,\n WireMessage,\n ControlRequest,\n CanUseToolControlRequest,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n SendMessage,\n AnyAgentTool,\n ExecuteExternalToolRequest,\n ListMessagesOptions,\n ListMessagesResult,\n ListModelsResult,\n BootstrapStateOptions,\n BootstrapStateResult,\n SDKStreamEventPayload,\n RunTurnOptions,\n RecoverPendingApprovalsOptions,\n RecoverPendingApprovalsResult,\n SDKProtocolCommand,\n SDKProtocolMessage,\n SendCommandOptions,\n UpdateModelOptions,\n UpdateModelResult,\n} from \"./types.js\";\nimport {\n isHeadlessAutoAllowTool,\n requiresRuntimeUserInput,\n} from \"./interactiveToolPolicy.js\";\n\n\n// All logging gated behind DEBUG_SDK env var\nfunction sessionLog(tag: string, ...args: unknown[]) {\n if (process.env.DEBUG_SDK) console.error(`[SDK-Session] [${tag}]`, ...args);\n}\n\nconst MAX_BUFFERED_STREAM_MESSAGES = 100;\nconst DEFAULT_MAX_APPROVAL_RECOVERY_ATTEMPTS = 1;\nconst DEFAULT_APPROVAL_RECOVERY_TIMEOUT_MS = 5_000;\n\nconst KNOWN_SDK_ERROR_CODES = new Set<SDKErrorCode>([\n \"approval_conflict\",\n \"approval_conflict_terminal\",\n \"protocol_error\",\n \"error\",\n \"llm_api_error\",\n \"max_steps\",\n \"interrupted\",\n \"stream_closed\",\n]);\n\nfunction isKnownSdkErrorCode(value: string): value is SDKErrorCode {\n return KNOWN_SDK_ERROR_CODES.has(value as SDKErrorCode);\n}\n\nfunction toSdkErrorCode(value: string | undefined): SDKErrorCode | undefined {\n if (!value || value.length === 0) return undefined;\n return isKnownSdkErrorCode(value) ? value : undefined;\n}\n\nfunction isUnknownControlSubtypeError(\n errorMessage: string | undefined,\n subtype: string,\n): boolean {\n if (!errorMessage) return false;\n return errorMessage\n .toLowerCase()\n .includes(`unknown control request subtype: ${subtype}`.toLowerCase());\n}\n\nfunction extractApiErrorDetail(apiError: Record<string, unknown> | undefined): string | undefined {\n const detail = apiError?.detail;\n if (typeof detail !== \"string\") return undefined;\n const trimmed = detail.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction isApprovalConflictSignal(params: {\n detail?: string;\n message?: string;\n stopReason?: string;\n}): boolean {\n if (params.stopReason === \"requires_approval\") return true;\n // Stopgap heuristic until the server emits a first-class structured\n // approval-conflict code in wire payloads.\n const haystack = [params.detail, params.message]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\")\n .toLowerCase();\n if (!haystack) return false;\n return (\n haystack.includes(\"waiting for approval on a tool call\") ||\n haystack.includes(\"cannot send a new message\") ||\n haystack.includes(\"requires_approval\")\n );\n}\n\ntype BufferedStreamMessage = {\n message: SDKMessage;\n generation: number;\n runId?: string;\n};\n\nexport class Session implements AsyncDisposable {\n private transport: SubprocessTransport;\n private _agentId: string | null = null;\n private _sessionId: string | null = null;\n private _conversationId: string | null = null;\n private initialized = false;\n private externalTools: Map<string, AnyAgentTool> = new Map();\n private streamQueue: BufferedStreamMessage[] = [];\n private streamResolvers: Array<(msg: BufferedStreamMessage | null) => void> = [];\n private pumpPromise: Promise<void> | null = null;\n private pumpClosed = false;\n private droppedStreamMessages = 0;\n // Monotonic counter incremented after each send(). Messages enqueued by the\n // pump are tagged with the current generation; stream() filters out messages\n // from earlier generations to prevent N-1 desync (stale events from a\n // previous run leaking into the current run's stream).\n private sendGeneration = 0;\n // Run IDs that completed in the previous streamed turn. Used to drop\n // late-arriving stale events from the old run if they arrive after send().\n private lastCompletedRunIds = new Set<string>();\n // Waiters for SDK-initiated control requests (e.g., listMessages).\n // Keyed by request_id; pump resolves the matching waiter when it sees\n // a control_response with that request_id instead of queuing it as a stream msg.\n private controlResponseWaiters = new Map<\n string,\n (response: { subtype: string; response?: unknown; error?: string }) => void\n >();\n\n constructor(\n private options: InternalSessionOptions = {}\n ) {\n // Note: Validation happens in public API functions (createSession, createAgent, etc.)\n if (options.reasoningEffort !== undefined) {\n throw new Error(\n \"reasoningEffort is not supported by this session. Create a Cloud, Remote, or local agent session before setting reasoning effort.\",\n );\n }\n this.transport = new SubprocessTransport(options);\n\n // Store external tools in a map for quick lookup\n if (options.tools) {\n for (const tool of options.tools) {\n this.externalTools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Initialize the session (called automatically on first send)\n */\n async initialize(): Promise<SDKInitMessage> {\n if (this.initialized) {\n throw new Error(\"Session already initialized\");\n }\n\n sessionLog(\"init\", \"connecting transport...\");\n await this.transport.connect();\n sessionLog(\"init\", \"transport connected, sending initialize request\");\n\n // Send initialize control request\n await this.transport.write({\n type: \"control_request\",\n request_id: \"init_1\",\n request: { subtype: \"initialize\" },\n });\n\n // Wait for init message\n sessionLog(\"init\", \"waiting for init message from CLI...\");\n for await (const msg of this.transport.messages()) {\n sessionLog(\"init\", `received wire message: type=${msg.type}`);\n\n if (msg.type === \"control_request\") {\n const handled = await this.handleControlRequest(msg as ControlRequest);\n if (!handled) {\n const wireMsgAny = msg as unknown as Record<string, unknown>;\n sessionLog(\"init\", `DROPPED unsupported control_request: subtype=${(wireMsgAny.request as Record<string, unknown>)?.subtype || \"N/A\"}`);\n }\n continue;\n }\n\n if (msg.type === \"system\" && \"subtype\" in msg && msg.subtype === \"init\") {\n const initMsg = msg as WireMessage & {\n agent_id: string;\n session_id: string;\n conversation_id: string;\n model: string;\n tools: string[];\n memfs_enabled?: boolean;\n skill_sources?: Array<\"bundled\" | \"global\" | \"agent\" | \"project\">;\n system_info_reminder_enabled?: boolean;\n reflection_trigger?: \"off\" | \"step-count\" | \"compaction-event\";\n reflection_behavior?: \"reminder\" | \"auto-launch\";\n reflection_step_count?: number;\n };\n this._agentId = initMsg.agent_id;\n this._sessionId = initMsg.session_id;\n this._conversationId = initMsg.conversation_id;\n this.initialized = true;\n this.startBackgroundPump();\n\n // Register external tools with CLI\n if (this.externalTools.size > 0) {\n await this.registerExternalTools();\n }\n\n // Include external tool names in the tools list\n const allTools = [\n ...initMsg.tools,\n ...Array.from(this.externalTools.keys()),\n ];\n\n sessionLog(\"init\", `initialized: agent=${initMsg.agent_id} conversation=${initMsg.conversation_id} model=${initMsg.model} tools=${allTools.length} (${this.externalTools.size} external)`);\n\n return {\n type: \"init\",\n agentId: initMsg.agent_id,\n sessionId: initMsg.session_id,\n conversationId: initMsg.conversation_id,\n model: initMsg.model,\n tools: allTools,\n memfsEnabled: initMsg.memfs_enabled,\n skillSources: initMsg.skill_sources,\n systemInfoReminderEnabled: initMsg.system_info_reminder_enabled,\n dreaming:\n initMsg.reflection_trigger &&\n initMsg.reflection_behavior &&\n typeof initMsg.reflection_step_count === \"number\"\n ? {\n trigger: initMsg.reflection_trigger,\n behavior: initMsg.reflection_behavior,\n stepCount: initMsg.reflection_step_count,\n }\n : undefined,\n };\n }\n }\n\n const stderr = this.transport.getStderr();\n const detail = stderr ? `\\nCLI stderr:\\n${stderr}` : '';\n sessionLog(\"init\", `ERROR: transport closed before init message received${detail}`);\n throw new Error(`Failed to initialize session - no init message received${detail}`);\n }\n\n /**\n * Send a message to the agent\n * \n * @param message - Text string or multimodal content array\n * \n * @example\n * // Simple text\n * await session.send(\"Hello!\");\n * \n * @example\n * // With image\n * await session.send([\n * { type: \"text\", text: \"What's in this image?\" },\n * { type: \"image\", source: { type: \"base64\", mediaType: \"image/png\", data: \"...\" } }\n * ]);\n */\n async send(message: SendMessage): Promise<void> {\n if (!this.initialized) {\n sessionLog(\"send\", \"auto-initializing (not yet initialized)\");\n await this.initialize();\n }\n\n const preview = typeof message === \"string\"\n ? message.slice(0, 100)\n : Array.isArray(message) ? `[multimodal: ${message.length} parts]` : String(message).slice(0, 100);\n sessionLog(\"send\", `sending message: ${preview}${typeof message === \"string\" && message.length > 100 ? \"...\" : \"\"}`);\n\n // Clear stale messages from previous turn to prevent desync\n if (this.streamQueue.length > 0) {\n sessionLog(\"send\", `clearing ${this.streamQueue.length} stale messages from previous turn`);\n this.streamQueue.length = 0;\n }\n\n await this.transport.write({\n type: \"user\",\n message: { role: \"user\", content: message },\n });\n\n // Advance generation AFTER the write so any messages the pump enqueues\n // during the await (from the previous run's lingering events) are tagged\n // with the old generation and will be filtered by stream().\n this.sendGeneration++;\n sessionLog(\"send\", `message written to transport (generation=${this.sendGeneration})`);\n }\n\n /**\n * Run a full turn (send + stream terminal result), with optional bounded\n * SDK-owned approval-conflict recovery.\n */\n async runTurn(\n message: SendMessage,\n options: RunTurnOptions = {},\n ): Promise<SDKResultMessage> {\n const maxApprovalRecoveryAttempts =\n this.resolveMaxApprovalRecoveryAttempts(options);\n const recoveryTimeoutMs = this.resolveApprovalRecoveryTimeoutMs(options);\n\n let recoveryAttempts = 0;\n let result = await this.runSingleTurn(message);\n\n while (\n !result.success &&\n result.approvalConflict === true &&\n recoveryAttempts < maxApprovalRecoveryAttempts\n ) {\n recoveryAttempts += 1;\n const recovery = await this.recoverPendingApprovals({\n timeoutMs: recoveryTimeoutMs,\n });\n\n if (!recovery.recovered) {\n return this.toTerminalApprovalConflictResult(result, {\n recoveryAttempts,\n detail: recovery.detail,\n });\n }\n\n result = await this.runSingleTurn(message);\n }\n\n if (!result.success && result.approvalConflict === true) {\n return this.toTerminalApprovalConflictResult(result, { recoveryAttempts });\n }\n\n if (recoveryAttempts > 0) {\n result.recoveryAttempts = recoveryAttempts;\n }\n\n return result;\n }\n\n /**\n * Ask the CLI to recover pending approvals for the current\n * agent/conversation context.\n */\n async recoverPendingApprovals(\n options: RecoverPendingApprovalsOptions = {},\n ): Promise<RecoverPendingApprovalsResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const timeoutMs =\n options.timeoutMs ??\n this.options.approvalRecoveryTimeoutMs ??\n DEFAULT_APPROVAL_RECOVERY_TIMEOUT_MS;\n\n if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {\n throw new Error(\n \"Invalid approval recovery timeout. Expected a positive integer.\",\n );\n }\n\n const requestId = `recover-approvals-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n\n let resp: { subtype: string; response?: unknown; error?: string };\n try {\n resp = await this.requestControlResponse(\n requestId,\n {\n subtype: \"recover_pending_approvals\",\n ...(this._agentId ? { agent_id: this._agentId } : {}),\n ...(this._conversationId ? { conversation_id: this._conversationId } : {}),\n },\n { timeoutMs },\n );\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n return {\n recovered: false,\n unsupported: false,\n detail,\n };\n }\n\n if (resp.subtype === \"error\") {\n const detail = resp.error ?? \"recover_pending_approvals failed\";\n return {\n recovered: false,\n pendingApproval: true,\n unsupported: isUnknownControlSubtypeError(\n detail,\n \"recover_pending_approvals\",\n ),\n detail,\n };\n }\n\n return {\n recovered: true,\n pendingApproval: false,\n unsupported: false,\n };\n }\n\n private resolveMaxApprovalRecoveryAttempts(options: RunTurnOptions): number {\n const value =\n options.maxApprovalRecoveryAttempts ??\n this.options.maxApprovalRecoveryAttempts ??\n DEFAULT_MAX_APPROVAL_RECOVERY_ATTEMPTS;\n\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(\n \"Invalid maxApprovalRecoveryAttempts. Expected a non-negative integer.\",\n );\n }\n\n return value;\n }\n\n private resolveApprovalRecoveryTimeoutMs(options: RunTurnOptions): number {\n const value =\n options.recoveryTimeoutMs ??\n this.options.approvalRecoveryTimeoutMs ??\n DEFAULT_APPROVAL_RECOVERY_TIMEOUT_MS;\n\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(\n \"Invalid approval recovery timeout. Expected a positive integer.\",\n );\n }\n\n return value;\n }\n\n private toTerminalApprovalConflictResult(\n result: SDKResultMessage,\n options: { recoveryAttempts: number; detail?: string },\n ): SDKResultMessage {\n return {\n ...result,\n success: false,\n error: \"approval_conflict_terminal\",\n errorCode: \"approval_conflict_terminal\",\n approvalConflict: true,\n recoverable: false,\n recoveryAttempts: options.recoveryAttempts,\n errorDetail:\n options.detail ||\n result.errorDetail ||\n \"Approval conflict remained unresolved after bounded SDK recovery.\",\n };\n }\n\n private async runSingleTurn(message: SendMessage): Promise<SDKResultMessage> {\n await this.send(message);\n\n let latestApprovalConflictDetail: string | undefined;\n let latestNonConflictErrorDetail: string | undefined;\n\n for await (const msg of this.stream()) {\n if (msg.type === \"error\") {\n const detail = msg.errorDetail || msg.message;\n if (msg.approvalConflict) {\n latestApprovalConflictDetail = detail;\n } else {\n latestNonConflictErrorDetail = detail;\n }\n continue;\n }\n\n if (msg.type === \"result\") {\n if (!msg.success && !msg.errorDetail) {\n if (msg.approvalConflict && latestApprovalConflictDetail) {\n return {\n ...msg,\n errorDetail: latestApprovalConflictDetail,\n };\n }\n\n if (!msg.approvalConflict && latestNonConflictErrorDetail) {\n return {\n ...msg,\n errorDetail: latestNonConflictErrorDetail,\n };\n }\n }\n\n return msg;\n }\n }\n\n return {\n type: \"result\",\n success: false,\n error: \"stream_closed\",\n errorCode: \"stream_closed\",\n recoverable: false,\n errorDetail: \"Stream ended before terminal result\",\n durationMs: 0,\n conversationId: this._conversationId,\n };\n }\n\n /**\n * Stream messages from the agent\n */\n async *stream(): AsyncGenerator<SDKMessage> {\n const streamStart = Date.now();\n const minGeneration = this.sendGeneration;\n let yieldCount = 0;\n let staleCount = 0;\n let staleRunIdCount = 0;\n let gotResult = false;\n const currentStreamRunIds = new Set<string>();\n const staleRunIds = new Set(this.lastCompletedRunIds);\n const approvalConflictDetailsByRunId = new Map<string, string>();\n let latestApprovalConflictDetail: string | undefined;\n\n this.startBackgroundPump();\n sessionLog(\"stream\", `starting stream (agent=${this._agentId}, conversation=${this._conversationId}, generation=${minGeneration})`);\n\n while (true) {\n const bufferedMsg = await this.nextBufferedMessage();\n if (!bufferedMsg) {\n break;\n }\n\n // Filter stale messages from previous runs. Messages enqueued before\n // the current send() carry an older generation tag.\n if (bufferedMsg.generation < minGeneration) {\n staleCount++;\n sessionLog(\"stream\", `discarding stale message: type=${bufferedMsg.message.type} generation=${bufferedMsg.generation} (current=${minGeneration})`);\n continue;\n }\n\n // Filter late old-run messages that arrive after send() has already\n // advanced generation and stream queue was cleared.\n if (bufferedMsg.runId && staleRunIds.has(bufferedMsg.runId)) {\n staleRunIdCount++;\n sessionLog(\"stream\", `discarding stale message: type=${bufferedMsg.message.type} runId=${bufferedMsg.runId}`);\n continue;\n }\n\n if (bufferedMsg.runId) {\n currentStreamRunIds.add(bufferedMsg.runId);\n }\n\n const sdkMsg = bufferedMsg.message;\n\n if (sdkMsg.type === \"error\" && sdkMsg.approvalConflict) {\n const detail = sdkMsg.errorDetail || sdkMsg.message;\n if (detail) {\n latestApprovalConflictDetail = detail;\n if (sdkMsg.runId) {\n approvalConflictDetailsByRunId.set(sdkMsg.runId, detail);\n }\n }\n }\n\n let normalizedMsg: SDKMessage = sdkMsg;\n\n if (sdkMsg.type === \"result\" && !sdkMsg.success) {\n let detail = sdkMsg.errorDetail;\n if (!detail && Array.isArray(sdkMsg.runIds)) {\n for (const runId of sdkMsg.runIds) {\n const fromRun = approvalConflictDetailsByRunId.get(runId);\n if (fromRun) {\n detail = fromRun;\n break;\n }\n }\n }\n if (!detail) {\n detail = latestApprovalConflictDetail;\n }\n\n const approvalConflict =\n sdkMsg.approvalConflict === true\n || isApprovalConflictSignal({\n detail,\n message: sdkMsg.errorCode || sdkMsg.error,\n stopReason: sdkMsg.stopReason,\n });\n\n if (approvalConflict) {\n const normalizedErrorCode =\n !sdkMsg.errorCode || sdkMsg.errorCode === \"error\"\n ? \"approval_conflict\"\n : sdkMsg.errorCode;\n const normalizedError =\n !sdkMsg.error || sdkMsg.error === \"error\"\n ? normalizedErrorCode\n : sdkMsg.error;\n\n normalizedMsg = {\n ...sdkMsg,\n approvalConflict: true,\n recoverable: sdkMsg.recoverable ?? true,\n ...(detail ? { errorDetail: detail } : {}),\n errorCode: normalizedErrorCode,\n error: normalizedError,\n };\n } else if (!sdkMsg.errorCode && sdkMsg.error) {\n const errorCode = toSdkErrorCode(sdkMsg.error);\n if (errorCode) {\n normalizedMsg = {\n ...sdkMsg,\n errorCode,\n };\n }\n }\n }\n\n yieldCount++;\n sessionLog(\"stream\", `yield #${yieldCount}: type=${normalizedMsg.type}${normalizedMsg.type === \"result\" ? ` success=${(normalizedMsg as SDKResultMessage).success} error=${(normalizedMsg as SDKResultMessage).error || \"none\"}` : \"\"}`);\n yield normalizedMsg;\n\n // Stop on result message\n if (normalizedMsg.type === \"result\") {\n gotResult = true;\n this.updateCompletedRunIds((normalizedMsg as SDKResultMessage).runIds, currentStreamRunIds);\n break;\n }\n }\n\n const elapsed = Date.now() - streamStart;\n sessionLog(\"stream\", `stream ended: duration=${elapsed}ms yielded=${yieldCount} staleFiltered=${staleCount} staleRunIdFiltered=${staleRunIdCount} dropped=${this.droppedStreamMessages} gotResult=${gotResult}`);\n if (!gotResult) {\n sessionLog(\"stream\", \"WARNING: stream ended WITHOUT a result message -- transport may have closed unexpectedly\");\n }\n }\n\n private startBackgroundPump(): void {\n if (this.pumpPromise) {\n return;\n }\n\n this.pumpClosed = false;\n this.pumpPromise = this.runBackgroundPump()\n .catch((err) => {\n sessionLog(\"pump\", `ERROR: ${err instanceof Error ? err.message : String(err)}`);\n })\n .finally(() => {\n this.pumpClosed = true;\n this.resolveAllStreamWaiters(null);\n });\n }\n\n private async runBackgroundPump(): Promise<void> {\n sessionLog(\"pump\", \"background pump started\");\n\n // Tool call chunks are emitted immediately (no buffering).\n // Consumers that need complete arguments should accumulate rawArguments\n // across chunks sharing the same toolCallId on their side.\n //\n // Index-to-ID mapping: The Letta API follows the OpenAI streaming format\n // for parallel tool calls -- only the first chunk per tool call includes\n // tool_call_id, subsequent chunks identify themselves via index only.\n // We maintain a lightweight index->id map so transformMessage() can\n // resolve the ID for every chunk without buffering.\n const indexToToolCallId = new Map<number, string>();\n\n for await (const wireMsg of this.transport.messages()) {\n const wireMsgAny = wireMsg as unknown as Record<string, unknown>;\n\n if (wireMsg.type === \"control_request\") {\n const handled = await this.handleControlRequest(wireMsg as ControlRequest);\n if (!handled) {\n sessionLog(\"pump\", `DROPPED unsupported control_request: subtype=${(wireMsgAny.request as Record<string, unknown>)?.subtype || \"N/A\"}`);\n }\n continue;\n }\n\n // Route control_response to a registered waiter (e.g., from listMessages).\n // Unmatched control_responses are logged and dropped — they never reach the stream.\n if (wireMsg.type === \"control_response\") {\n const respMsg = wireMsg as unknown as {\n response: { subtype: string; request_id?: string; response?: unknown; error?: string };\n };\n const requestId = respMsg.response?.request_id;\n if (requestId && this.controlResponseWaiters.has(requestId)) {\n const resolve = this.controlResponseWaiters.get(requestId)!;\n this.controlResponseWaiters.delete(requestId);\n resolve(respMsg.response);\n } else {\n sessionLog(\"pump\", `DROPPED unmatched control_response: request_id=${requestId ?? \"N/A\"}`);\n }\n continue;\n }\n\n // For tool_call_message chunks, resolve index-based IDs before transform.\n // The first chunk has both tool_call_id and index; subsequent chunks have\n // only index. Patch the wire message so transformMessage() always sees an ID.\n const messageType = wireMsgAny.message_type as string | undefined;\n if (wireMsg.type === \"message\" && (messageType === \"tool_call_message\" || messageType === \"approval_request_message\")) {\n const toolCalls = wireMsgAny.tool_calls as Array<Record<string, unknown>> | undefined;\n const toolCall = wireMsgAny.tool_call as Record<string, unknown> | undefined;\n const tc = toolCalls?.[0] || toolCall;\n if (tc) {\n const fnObj = tc.function as Record<string, unknown> | undefined;\n const tcId = (tc.tool_call_id as string | undefined) ?? (tc.id as string | undefined);\n const tcIndex = tc.index as number | undefined;\n\n if (tcId && tcIndex !== undefined) {\n indexToToolCallId.set(tcIndex, tcId);\n } else if (!tcId && tcIndex !== undefined) {\n const resolvedId = indexToToolCallId.get(tcIndex);\n if (resolvedId) {\n // Patch the resolved ID into the wire message for transformMessage\n if (fnObj) {\n tc.id = resolvedId;\n } else {\n tc.tool_call_id = resolvedId;\n }\n }\n }\n }\n }\n\n const sdkMsg = this.transformMessage(wireMsg);\n if (sdkMsg) {\n this.enqueueStreamMessage(sdkMsg);\n } else {\n sessionLog(\"pump\", `DROPPED wire message: type=${wireMsg.type} message_type=${wireMsgAny.message_type || \"N/A\"} subtype=${wireMsgAny.subtype || \"N/A\"}`);\n }\n }\n\n sessionLog(\"pump\", \"background pump ended\");\n }\n\n private async handleControlRequest(controlReq: ControlRequest): Promise<boolean> {\n // Widen to string to allow SDK-extension subtypes not in the protocol union\n const subtype: string = controlReq.request.subtype;\n sessionLog(\"pump\", `control_request: subtype=${subtype} tool=${(controlReq.request as CanUseToolControlRequest).tool_name || \"N/A\"}`);\n\n if (subtype === \"can_use_tool\") {\n await this.handleCanUseTool(\n controlReq.request_id,\n controlReq.request as CanUseToolControlRequest\n );\n return true;\n }\n\n if (subtype === \"execute_external_tool\") {\n // SDK extension: not in protocol ControlRequestBody union, extract fields via Record\n const rawReq = controlReq.request as Record<string, unknown>;\n await this.handleExecuteExternalTool(\n controlReq.request_id,\n {\n subtype: \"execute_external_tool\",\n tool_call_id: rawReq.tool_call_id as string,\n tool_name: rawReq.tool_name as string,\n input: rawReq.input as Record<string, unknown>,\n }\n );\n return true;\n }\n\n return false;\n }\n\n private enqueueStreamMessage(msg: SDKMessage): void {\n const bufferedMsg: BufferedStreamMessage = {\n message: msg,\n generation: this.sendGeneration,\n runId: this.getMessageRunId(msg),\n };\n\n if (this.streamResolvers.length > 0) {\n const resolve = this.streamResolvers.shift()!;\n resolve(bufferedMsg);\n return;\n }\n\n if (this.streamQueue.length >= MAX_BUFFERED_STREAM_MESSAGES) {\n this.streamQueue.shift();\n this.droppedStreamMessages++;\n sessionLog(\"pump\", `stream queue overflow: dropped oldest message (total_dropped=${this.droppedStreamMessages}, max=${MAX_BUFFERED_STREAM_MESSAGES})`);\n }\n\n this.streamQueue.push(bufferedMsg);\n }\n\n private async nextBufferedMessage(): Promise<BufferedStreamMessage | null> {\n if (this.streamQueue.length > 0) {\n return this.streamQueue.shift()!;\n }\n\n if (this.pumpClosed) {\n return null;\n }\n\n return new Promise((resolve) => {\n this.streamResolvers.push(resolve);\n });\n }\n\n private resolveAllStreamWaiters(msg: BufferedStreamMessage | null): void {\n for (const resolve of this.streamResolvers) {\n resolve(msg);\n }\n this.streamResolvers = [];\n // Also cancel any in-flight control request waiters (e.g., listMessages)\n for (const resolve of this.controlResponseWaiters.values()) {\n resolve({ subtype: \"error\", error: \"session closed\" });\n }\n this.controlResponseWaiters.clear();\n }\n\n private getMessageRunId(msg: SDKMessage): string | undefined {\n switch (msg.type) {\n case \"assistant\":\n case \"tool_call\":\n case \"tool_result\":\n case \"reasoning\":\n case \"error\":\n case \"retry\":\n return msg.runId;\n default:\n return undefined;\n }\n }\n\n private updateCompletedRunIds(\n resultRunIds: string[] | undefined,\n streamedRunIds: Set<string>,\n ): void {\n const nextRunIds = new Set<string>();\n\n if (Array.isArray(resultRunIds)) {\n for (const runId of resultRunIds) {\n if (runId) {\n nextRunIds.add(runId);\n }\n }\n }\n\n for (const runId of streamedRunIds) {\n if (runId) {\n nextRunIds.add(runId);\n }\n }\n\n this.lastCompletedRunIds = nextRunIds;\n }\n\n /**\n * Register external tools with the CLI\n */\n private async registerExternalTools(): Promise<void> {\n const toolDefs = Array.from(this.externalTools.values()).map((tool) => ({\n name: tool.name,\n label: tool.label,\n description: tool.description,\n // Convert TypeBox schema to plain JSON Schema\n parameters: this.schemaToJsonSchema(tool.parameters),\n }));\n\n sessionLog(\"registerTools\", `registering ${toolDefs.length} external tools: ${toolDefs.map(t => t.name).join(\", \")}`);\n\n await this.transport.write({\n type: \"control_request\",\n request_id: `register_tools_${Date.now()}`,\n request: {\n subtype: \"register_external_tools\",\n tools: toolDefs,\n },\n });\n }\n\n /**\n * Convert TypeBox schema to JSON Schema\n */\n private schemaToJsonSchema(schema: unknown): Record<string, unknown> {\n // TypeBox schemas are already JSON Schema compatible\n // Just need to extract the schema object\n if (schema && typeof schema === \"object\") {\n // TypeBox schemas have these JSON Schema properties\n const s = schema as Record<string, unknown>;\n return {\n type: s.type,\n properties: s.properties,\n required: s.required,\n additionalProperties: s.additionalProperties,\n description: s.description,\n };\n }\n return { type: \"object\" };\n }\n\n /**\n * Handle execute_external_tool control request from CLI\n */\n private async handleExecuteExternalTool(\n requestId: string,\n req: ExecuteExternalToolRequest\n ): Promise<void> {\n const tool = this.externalTools.get(req.tool_name);\n \n if (!tool) {\n // Tool not found - send error result\n sessionLog(\"executeExternalTool\", `ERROR: unknown tool ${req.tool_name}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: [{ type: \"text\", text: `Unknown external tool: ${req.tool_name}` }],\n is_error: true,\n },\n });\n return;\n }\n\n try {\n sessionLog(\"executeExternalTool\", `executing ${req.tool_name} (call_id=${req.tool_call_id})`);\n // Execute the tool\n const result = await tool.execute(req.tool_call_id, req.input);\n \n // Send success result\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: result.content,\n is_error: false,\n },\n });\n sessionLog(\"executeExternalTool\", `${req.tool_name} completed successfully`);\n } catch (err) {\n // Send error result\n const errorMessage = err instanceof Error ? err.message : String(err);\n sessionLog(\"executeExternalTool\", `${req.tool_name} failed: ${errorMessage}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: [{ type: \"text\", text: `Tool execution error: ${errorMessage}` }],\n is_error: true,\n },\n });\n }\n }\n\n /**\n * Handle can_use_tool control request from CLI (Claude SDK compatible format)\n */\n private async handleCanUseTool(\n requestId: string,\n req: CanUseToolControlRequest\n ): Promise<void> {\n let response: CanUseToolResponse;\n const toolName = req.tool_name;\n const hasCallback = typeof this.options.canUseTool === \"function\";\n const toolNeedsRuntimeUserInput = requiresRuntimeUserInput(toolName);\n const autoAllowWithoutCallback =\n isHeadlessAutoAllowTool(toolName);\n\n sessionLog(\"canUseTool\", `tool=${toolName} mode=${this.options.permissionMode || \"default\"} requestId=${requestId}`);\n\n // Tools that require runtime user input cannot be auto-allowed without a callback.\n if (toolNeedsRuntimeUserInput && !hasCallback) {\n response = {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n } else if (\n this.options.permissionMode === \"bypassPermissions\" &&\n !toolNeedsRuntimeUserInput\n ) {\n // bypassPermissions auto-allows non-interactive tools.\n sessionLog(\"canUseTool\", `AUTO-ALLOW ${toolName} (bypassPermissions)`);\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\n } else if (hasCallback) {\n try {\n const result = await this.options.canUseTool!(toolName, req.input);\n if (result.behavior === \"allow\") {\n response = {\n behavior: \"allow\",\n updatedInput: result.updatedInput ?? null,\n updatedPermissions: [], // TODO: not implemented\n } satisfies CanUseToolResponseAllow;\n } else {\n response = {\n behavior: \"deny\",\n message: result.message ?? \"Denied by canUseTool callback\",\n interrupt: false, // TODO: not wired up yet\n } satisfies CanUseToolResponseDeny;\n }\n } catch (err) {\n response = {\n behavior: \"deny\",\n message: err instanceof Error ? err.message : \"Callback error\",\n interrupt: false,\n };\n }\n } else if (autoAllowWithoutCallback) {\n // Default headless behavior matches Claude: EnterPlanMode can proceed\n // without requiring a callback in bidirectional mode.\n sessionLog(\"canUseTool\", `AUTO-ALLOW ${toolName} (default behavior)`);\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\n } else {\n // No callback registered - deny by default\n response = {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n }\n\n // Send control_response (Claude SDK compatible format)\n const responseBehavior = \"behavior\" in response ? response.behavior : \"unknown\";\n sessionLog(\"canUseTool\", `responding: requestId=${requestId} behavior=${responseBehavior}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response,\n },\n });\n sessionLog(\"canUseTool\", `response sent for ${toolName}`);\n }\n\n /**\n * Abort the current operation (interrupt without closing the session)\n */\n async abort(): Promise<void> {\n if (!this.initialized || this.pumpClosed) return;\n sessionLog(\"abort\", `aborting session (agent=${this._agentId})`);\n await this.transport.write({\n type: \"control_request\",\n request_id: `interrupt-${Date.now()}`,\n request: { subtype: \"interrupt\" },\n });\n }\n\n private async requestControlResponse(\n requestId: string,\n request: Record<string, unknown>,\n options: { timeoutMs?: number } = {},\n ): Promise<{ subtype: string; response?: unknown; error?: string }> {\n const responsePromise = new Promise<{\n subtype: string;\n response?: unknown;\n error?: string;\n }>((resolve) => {\n this.controlResponseWaiters.set(requestId, resolve);\n });\n\n try {\n await this.transport.write({\n type: \"control_request\",\n request_id: requestId,\n request: request as unknown as ControlRequest[\"request\"],\n });\n } catch (error) {\n this.controlResponseWaiters.delete(requestId);\n throw error;\n }\n\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n try {\n if (typeof options.timeoutMs === \"number\") {\n return await Promise.race([\n responsePromise,\n new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n this.controlResponseWaiters.delete(requestId);\n reject(\n new Error(\n `Timed out waiting for control_response (${requestId})`,\n ),\n );\n }, options.timeoutMs);\n }),\n ]);\n }\n\n return await responsePromise;\n } finally {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n }\n }\n\n /**\n * Fetch a page of conversation messages via the CLI control protocol.\n *\n * The session must be initialized before calling this method.\n * Safe to call concurrently with an active stream() — the pump routes\n * matching control_response messages to this waiter without touching the\n * stream queue.\n */\n async listMessages(options: ListMessagesOptions = {}): Promise<ListMessagesResult> {\n if (!this.initialized) {\n throw new Error(\"Session must be initialized before calling listMessages()\");\n }\n\n const requestId = `list-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n\n const resp = await this.requestControlResponse(requestId, {\n subtype: \"list_messages\",\n ...(options.conversationId ? { conversation_id: options.conversationId } : {}),\n ...(options.before ? { before: options.before } : {}),\n ...(options.after ? { after: options.after } : {}),\n ...(options.order ? { order: options.order } : {}),\n ...(options.limit !== undefined ? { limit: options.limit } : {}),\n });\n\n if (!resp) {\n throw new Error(\"Session closed before listMessages response arrived\");\n }\n if (resp.subtype === \"error\") {\n throw new Error(resp.error ?? \"listMessages failed\");\n }\n\n const payload = resp.response as {\n messages?: unknown[];\n next_before?: string | null;\n has_more?: boolean;\n } | undefined;\n\n return {\n messages: payload?.messages ?? [],\n nextBefore: payload?.next_before ?? null,\n hasMore: payload?.has_more ?? false,\n };\n }\n\n async listModels(): Promise<ListModelsResult> {\n throw new Error(\n \"listModels() is not supported by this session. Use a Cloud, Remote, or local agent session.\",\n );\n }\n\n async sendCommand(command: SDKProtocolCommand): Promise<void>;\n async sendCommand<TResponse extends SDKProtocolMessage = SDKProtocolMessage>(\n command: SDKProtocolCommand,\n options: SendCommandOptions,\n ): Promise<TResponse>;\n async sendCommand(\n _command?: SDKProtocolCommand,\n _options?: SendCommandOptions,\n ): Promise<void> {\n throw new Error(\n \"sendCommand() is not supported by this session. Use a Cloud, Remote, or local agent session.\",\n );\n }\n\n async updateModel(_update: string | UpdateModelOptions): Promise<UpdateModelResult> {\n throw new Error(\n \"updateModel() is not supported by this session. Use a Cloud, Remote, or local agent session.\",\n );\n }\n\n /**\n * Fetch all data needed to render the initial conversation view in one round-trip.\n *\n * Returns resolved session metadata + initial history page + pending approval flag\n * + optional timing breakdown. This is faster than separate initialize() + listMessages()\n * calls because the CLI collects and returns everything in a single control response.\n *\n * The session must be initialized before calling this method.\n */\n async bootstrapState(\n options: BootstrapStateOptions = {},\n ): Promise<BootstrapStateResult> {\n if (!this.initialized) {\n throw new Error(\n \"Session must be initialized before calling bootstrapState()\",\n );\n }\n\n const requestId = `bootstrap-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n\n const resp = await this.requestControlResponse(requestId, {\n subtype: \"bootstrap_session_state\",\n ...(options.limit !== undefined ? { limit: options.limit } : {}),\n ...(options.order ? { order: options.order } : {}),\n });\n\n if (!resp) {\n throw new Error(\"Session closed before bootstrapState response arrived\");\n }\n if (resp.subtype === \"error\") {\n throw new Error(\n (resp as { error?: string }).error ?? \"bootstrapState failed\",\n );\n }\n\n const payload = resp.response as {\n agent_id?: string;\n conversation_id?: string;\n model?: string;\n tools?: string[];\n memfs_enabled?: boolean;\n messages?: unknown[];\n next_before?: string | null;\n has_more?: boolean;\n has_pending_approval?: boolean;\n timings?: {\n resolve_ms: number;\n list_messages_ms: number;\n total_ms: number;\n };\n } | undefined;\n\n const state: BootstrapStateResult = {\n agentId: payload?.agent_id ?? this._agentId ?? \"\",\n conversationId: payload?.conversation_id ?? this._conversationId ?? \"\",\n model: payload?.model,\n memfsEnabled: payload?.memfs_enabled ?? false,\n messages: payload?.messages ?? [],\n nextBefore: payload?.next_before ?? null,\n hasMore: payload?.has_more ?? false,\n hasPendingApproval: payload?.has_pending_approval ?? false,\n };\n if (payload?.tools !== undefined) state.tools = payload.tools;\n if (payload?.timings !== undefined) state.timings = payload.timings;\n return state;\n }\n\n async updateToolset(_toolsetPreference: string): Promise<void> {\n throw new Error(\"updateToolset() is not supported by this session. Use a Cloud, Remote, or local agent session.\");\n }\n\n /**\n * Close the session\n */\n close(): void {\n sessionLog(\"close\", `closing session (agent=${this._agentId}, conversation=${this._conversationId})`);\n this.transport.close();\n this.pumpClosed = true;\n this.resolveAllStreamWaiters(null);\n }\n\n /**\n * Get the agent ID (available after initialization)\n */\n get agentId(): string | null {\n return this._agentId;\n }\n\n /**\n * Get the session ID (available after initialization)\n */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Get the conversation ID (available after initialization)\n */\n get conversationId(): string | null {\n return this._conversationId;\n }\n\n /**\n * AsyncDisposable implementation for `await using`\n */\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n }\n\n /**\n * Transform wire message to SDK message\n */\n private transformMessage(wireMsg: WireMessage | MessageWire): SDKMessage | null {\n // Init message\n if (wireMsg.type === \"system\" && \"subtype\" in wireMsg && wireMsg.subtype === \"init\") {\n const msg = wireMsg as WireMessage & {\n agent_id: string;\n session_id: string;\n conversation_id: string;\n model: string;\n tools: string[];\n memfs_enabled?: boolean;\n skill_sources?: Array<\"bundled\" | \"global\" | \"agent\" | \"project\">;\n system_info_reminder_enabled?: boolean;\n reflection_trigger?: \"off\" | \"step-count\" | \"compaction-event\";\n reflection_behavior?: \"reminder\" | \"auto-launch\";\n reflection_step_count?: number;\n };\n return {\n type: \"init\",\n agentId: msg.agent_id,\n sessionId: msg.session_id,\n conversationId: msg.conversation_id,\n model: msg.model,\n tools: msg.tools,\n memfsEnabled: msg.memfs_enabled,\n skillSources: msg.skill_sources,\n systemInfoReminderEnabled: msg.system_info_reminder_enabled,\n dreaming:\n msg.reflection_trigger &&\n msg.reflection_behavior &&\n typeof msg.reflection_step_count === \"number\"\n ? {\n trigger: msg.reflection_trigger,\n behavior: msg.reflection_behavior,\n stepCount: msg.reflection_step_count,\n }\n : undefined,\n };\n }\n\n // Handle message types (all have type: \"message\" with message_type field)\n if (wireMsg.type === \"message\" && \"message_type\" in wireMsg) {\n const msg = wireMsg as WireMessage & {\n message_type: string;\n uuid: string;\n run_id?: string;\n // assistant_message fields\n content?: string;\n // tool_call_message fields\n tool_call?: { name: string; arguments: string; tool_call_id: string };\n tool_calls?: Array<{ name: string; arguments: string; tool_call_id: string }>;\n // tool_return_message fields\n tool_call_id?: string;\n tool_return?: string;\n status?: \"success\" | \"error\";\n // reasoning_message fields\n reasoning?: string;\n };\n\n const runId = msg.run_id || undefined;\n\n // Assistant message\n if (msg.message_type === \"assistant_message\" && msg.content) {\n return {\n type: \"assistant\",\n content: msg.content,\n uuid: msg.uuid,\n runId,\n };\n }\n\n // Tool call message (tool_call_message = auto-executed, approval_request_message = needs approval)\n if (msg.message_type === \"tool_call_message\" || msg.message_type === \"approval_request_message\") {\n const toolCallRaw = (msg.tool_calls?.[0] || msg.tool_call) as Record<string, unknown> | undefined;\n if (toolCallRaw) {\n const fnObj = toolCallRaw.function as Record<string, unknown> | undefined;\n const toolCallId =\n (toolCallRaw.tool_call_id as string | undefined) ??\n (toolCallRaw.id as string | undefined);\n if (!toolCallId) {\n const detail = `Missing tool_call_id in ${msg.message_type} (uuid=${msg.uuid || \"unknown\"})`;\n sessionLog(\"transform\", detail);\n return {\n type: \"error\",\n message: detail,\n errorCode: \"protocol_error\",\n stopReason: \"protocol_error\",\n runId,\n apiError: {\n error_type: \"protocol_error\",\n detail,\n message_type: msg.message_type,\n },\n recoverable: false,\n errorDetail: detail,\n };\n }\n\n const toolName =\n (toolCallRaw.name as string | undefined) ??\n (fnObj?.name as string | undefined) ??\n \"?\";\n const toolArgs =\n (toolCallRaw.arguments as string | undefined) ??\n (fnObj?.arguments as string | undefined) ??\n \"\";\n\n let toolInput: Record<string, unknown> = {};\n try {\n toolInput = JSON.parse(toolArgs);\n } catch {\n toolInput = { raw: toolArgs };\n }\n return {\n type: \"tool_call\",\n toolCallId,\n toolName,\n toolInput,\n rawArguments: toolArgs || undefined,\n uuid: msg.uuid,\n runId,\n };\n }\n }\n\n // Tool return message\n if (msg.message_type === \"tool_return_message\" && msg.tool_call_id) {\n return {\n type: \"tool_result\",\n toolCallId: msg.tool_call_id,\n content: msg.tool_return || \"\",\n isError: msg.status === \"error\",\n uuid: msg.uuid,\n runId,\n };\n }\n\n // Reasoning message\n if (msg.message_type === \"reasoning_message\" && msg.reasoning) {\n return {\n type: \"reasoning\",\n content: msg.reasoning,\n uuid: msg.uuid,\n runId,\n };\n }\n }\n\n // Stream event (partial message updates)\n if (wireMsg.type === \"stream_event\") {\n const msg = wireMsg as WireMessage & {\n event: unknown;\n uuid: string;\n };\n const eventPayload = (msg.event ?? {}) as SDKStreamEventPayload;\n return {\n type: \"stream_event\",\n event: eventPayload,\n uuid: msg.uuid,\n };\n }\n\n // Result message\n if (wireMsg.type === \"result\") {\n const msg = wireMsg as WireMessage & {\n subtype: string;\n result?: string;\n duration_ms: number;\n total_cost_usd?: number;\n conversation_id: string;\n stop_reason?: string;\n run_ids?: unknown[];\n };\n const runIds = Array.isArray(msg.run_ids)\n ? msg.run_ids.filter((id): id is string => typeof id === \"string\")\n : undefined;\n const approvalConflict = isApprovalConflictSignal({\n stopReason: msg.stop_reason,\n });\n const legacyError = msg.subtype !== \"success\"\n ? (approvalConflict && msg.subtype === \"error\" ? \"approval_conflict\" : msg.subtype)\n : undefined;\n const errorCode = toSdkErrorCode(legacyError);\n return {\n type: \"result\",\n success: msg.subtype === \"success\",\n result: msg.result,\n error: legacyError,\n errorCode,\n ...(approvalConflict\n ? {\n approvalConflict: true as const,\n recoverable: true as const,\n }\n : {}),\n stopReason: msg.stop_reason,\n durationMs: msg.duration_ms,\n totalCostUsd: msg.total_cost_usd,\n conversationId: msg.conversation_id,\n runIds,\n };\n }\n\n // Error message — carries the actual error detail from the CLI.\n // The subsequent type=result only has the opaque string \"error\";\n // this message has the human-readable description and API error.\n if (wireMsg.type === \"error\") {\n const msg = wireMsg as WireMessage & {\n message: string;\n stop_reason: string;\n run_id?: string;\n api_error?: Record<string, unknown>;\n };\n const errorDetail = extractApiErrorDetail(msg.api_error);\n const approvalConflict = isApprovalConflictSignal({\n detail: errorDetail,\n message: msg.message,\n stopReason: msg.stop_reason,\n });\n const errorCode = approvalConflict\n ? \"approval_conflict\"\n : toSdkErrorCode(msg.stop_reason);\n return {\n type: \"error\" as const,\n message: msg.message,\n ...(errorCode ? { errorCode } : {}),\n ...(approvalConflict\n ? {\n approvalConflict: true as const,\n recoverable: true as const,\n }\n : {}),\n ...(errorDetail ? { errorDetail } : {}),\n stopReason: msg.stop_reason,\n runId: msg.run_id,\n apiError: msg.api_error,\n };\n }\n\n // Retry message — the CLI is retrying after a transient failure.\n if (wireMsg.type === \"retry\") {\n const msg = wireMsg as WireMessage & {\n reason: string;\n attempt: number;\n max_attempts: number;\n delay_ms: number;\n run_id?: string;\n };\n return {\n type: \"retry\" as const,\n reason: msg.reason,\n attempt: msg.attempt,\n maxAttempts: msg.max_attempts,\n delayMs: msg.delay_ms,\n runId: msg.run_id,\n };\n }\n\n // Skip other message types (system_message, user_message, etc.)\n return null;\n }\n}\n",
8
+ "/**\n * Session\n *\n * Represents a conversation session with a Letta agent.\n * Implements the V2 API pattern: send() / receive()\n */\n\nimport { SubprocessTransport } from \"./transport.js\";\nimport type {\n InternalSessionOptions,\n SDKMessage,\n SDKInitMessage,\n SDKResultMessage,\n SDKErrorCode,\n MessageWire,\n WireMessage,\n ControlRequest,\n CanUseToolControlRequest,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n SendMessage,\n AnyAgentTool,\n ExecuteExternalToolRequest,\n ListMessagesOptions,\n ListMessagesResult,\n ListModelsResult,\n BootstrapStateOptions,\n BootstrapStateResult,\n SDKStreamEventPayload,\n RunTurnOptions,\n RecoverPendingApprovalsOptions,\n RecoverPendingApprovalsResult,\n SDKProtocolCommand,\n SDKProtocolMessage,\n SendCommandOptions,\n UpdateModelOptions,\n UpdateModelResult,\n} from \"./types.js\";\nimport {\n isHeadlessAutoAllowTool,\n requiresRuntimeUserInput,\n} from \"./interactiveToolPolicy.js\";\nimport { isUnrestrictedPermissionMode } from \"./remote-client-session-core.js\";\n\n\n// All logging gated behind DEBUG_SDK env var\nfunction sessionLog(tag: string, ...args: unknown[]) {\n if (process.env.DEBUG_SDK) console.error(`[SDK-Session] [${tag}]`, ...args);\n}\n\nconst MAX_BUFFERED_STREAM_MESSAGES = 100;\nconst DEFAULT_MAX_APPROVAL_RECOVERY_ATTEMPTS = 1;\nconst DEFAULT_APPROVAL_RECOVERY_TIMEOUT_MS = 5_000;\n\nconst KNOWN_SDK_ERROR_CODES = new Set<SDKErrorCode>([\n \"approval_conflict\",\n \"approval_conflict_terminal\",\n \"protocol_error\",\n \"error\",\n \"llm_api_error\",\n \"max_steps\",\n \"interrupted\",\n \"stream_closed\",\n]);\n\nfunction isKnownSdkErrorCode(value: string): value is SDKErrorCode {\n return KNOWN_SDK_ERROR_CODES.has(value as SDKErrorCode);\n}\n\nfunction toSdkErrorCode(value: string | undefined): SDKErrorCode | undefined {\n if (!value || value.length === 0) return undefined;\n return isKnownSdkErrorCode(value) ? value : undefined;\n}\n\nfunction isUnknownControlSubtypeError(\n errorMessage: string | undefined,\n subtype: string,\n): boolean {\n if (!errorMessage) return false;\n return errorMessage\n .toLowerCase()\n .includes(`unknown control request subtype: ${subtype}`.toLowerCase());\n}\n\nfunction extractApiErrorDetail(apiError: Record<string, unknown> | undefined): string | undefined {\n const detail = apiError?.detail;\n if (typeof detail !== \"string\") return undefined;\n const trimmed = detail.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction isApprovalConflictSignal(params: {\n detail?: string;\n message?: string;\n stopReason?: string;\n}): boolean {\n if (params.stopReason === \"requires_approval\") return true;\n // Stopgap heuristic until the server emits a first-class structured\n // approval-conflict code in wire payloads.\n const haystack = [params.detail, params.message]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\")\n .toLowerCase();\n if (!haystack) return false;\n return (\n haystack.includes(\"waiting for approval on a tool call\") ||\n haystack.includes(\"cannot send a new message\") ||\n haystack.includes(\"requires_approval\")\n );\n}\n\ntype BufferedStreamMessage = {\n message: SDKMessage;\n generation: number;\n runId?: string;\n};\n\nexport class Session implements AsyncDisposable {\n private transport: SubprocessTransport;\n private _agentId: string | null = null;\n private _sessionId: string | null = null;\n private _conversationId: string | null = null;\n private initialized = false;\n private externalTools: Map<string, AnyAgentTool> = new Map();\n private streamQueue: BufferedStreamMessage[] = [];\n private streamResolvers: Array<(msg: BufferedStreamMessage | null) => void> = [];\n private pumpPromise: Promise<void> | null = null;\n private pumpClosed = false;\n private droppedStreamMessages = 0;\n // Monotonic counter incremented after each send(). Messages enqueued by the\n // pump are tagged with the current generation; stream() filters out messages\n // from earlier generations to prevent N-1 desync (stale events from a\n // previous run leaking into the current run's stream).\n private sendGeneration = 0;\n // Run IDs that completed in the previous streamed turn. Used to drop\n // late-arriving stale events from the old run if they arrive after send().\n private lastCompletedRunIds = new Set<string>();\n // Waiters for SDK-initiated control requests (e.g., listMessages).\n // Keyed by request_id; pump resolves the matching waiter when it sees\n // a control_response with that request_id instead of queuing it as a stream msg.\n private controlResponseWaiters = new Map<\n string,\n (response: { subtype: string; response?: unknown; error?: string }) => void\n >();\n\n constructor(\n private options: InternalSessionOptions = {}\n ) {\n // Note: Validation happens in public API functions (createSession, createAgent, etc.)\n if (options.reasoningEffort !== undefined) {\n throw new Error(\n \"reasoningEffort is not supported by this session. Create a Cloud, Remote, or local agent session before setting reasoning effort.\",\n );\n }\n this.transport = new SubprocessTransport(options);\n\n // Store external tools in a map for quick lookup\n if (options.tools) {\n for (const tool of options.tools) {\n this.externalTools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Initialize the session (called automatically on first send)\n */\n async initialize(): Promise<SDKInitMessage> {\n if (this.initialized) {\n throw new Error(\"Session already initialized\");\n }\n\n sessionLog(\"init\", \"connecting transport...\");\n await this.transport.connect();\n sessionLog(\"init\", \"transport connected, sending initialize request\");\n\n // Send initialize control request\n await this.transport.write({\n type: \"control_request\",\n request_id: \"init_1\",\n request: { subtype: \"initialize\" },\n });\n\n // Wait for init message\n sessionLog(\"init\", \"waiting for init message from CLI...\");\n for await (const msg of this.transport.messages()) {\n sessionLog(\"init\", `received wire message: type=${msg.type}`);\n\n if (msg.type === \"control_request\") {\n const handled = await this.handleControlRequest(msg as ControlRequest);\n if (!handled) {\n const wireMsgAny = msg as unknown as Record<string, unknown>;\n sessionLog(\"init\", `DROPPED unsupported control_request: subtype=${(wireMsgAny.request as Record<string, unknown>)?.subtype || \"N/A\"}`);\n }\n continue;\n }\n\n if (msg.type === \"system\" && \"subtype\" in msg && msg.subtype === \"init\") {\n const initMsg = msg as WireMessage & {\n agent_id: string;\n session_id: string;\n conversation_id: string;\n model: string;\n tools: string[];\n memfs_enabled?: boolean;\n skill_sources?: Array<\"bundled\" | \"global\" | \"agent\" | \"project\">;\n system_info_reminder_enabled?: boolean;\n reflection_trigger?: \"off\" | \"step-count\" | \"compaction-event\";\n reflection_behavior?: \"reminder\" | \"auto-launch\";\n reflection_step_count?: number;\n };\n this._agentId = initMsg.agent_id;\n this._sessionId = initMsg.session_id;\n this._conversationId = initMsg.conversation_id;\n this.initialized = true;\n this.startBackgroundPump();\n\n // Register external tools with CLI\n if (this.externalTools.size > 0) {\n await this.registerExternalTools();\n }\n\n // Include external tool names in the tools list\n const allTools = [\n ...initMsg.tools,\n ...Array.from(this.externalTools.keys()),\n ];\n\n sessionLog(\"init\", `initialized: agent=${initMsg.agent_id} conversation=${initMsg.conversation_id} model=${initMsg.model} tools=${allTools.length} (${this.externalTools.size} external)`);\n\n return {\n type: \"init\",\n agentId: initMsg.agent_id,\n sessionId: initMsg.session_id,\n conversationId: initMsg.conversation_id,\n model: initMsg.model,\n tools: allTools,\n memfsEnabled: initMsg.memfs_enabled,\n skillSources: initMsg.skill_sources,\n systemInfoReminderEnabled: initMsg.system_info_reminder_enabled,\n dreaming:\n initMsg.reflection_trigger &&\n initMsg.reflection_behavior &&\n typeof initMsg.reflection_step_count === \"number\"\n ? {\n trigger: initMsg.reflection_trigger,\n behavior: initMsg.reflection_behavior,\n stepCount: initMsg.reflection_step_count,\n }\n : undefined,\n };\n }\n }\n\n const stderr = this.transport.getStderr();\n const detail = stderr ? `\\nCLI stderr:\\n${stderr}` : '';\n sessionLog(\"init\", `ERROR: transport closed before init message received${detail}`);\n throw new Error(`Failed to initialize session - no init message received${detail}`);\n }\n\n /**\n * Send a message to the agent\n * \n * @param message - Text string or multimodal content array\n * \n * @example\n * // Simple text\n * await session.send(\"Hello!\");\n * \n * @example\n * // With image\n * await session.send([\n * { type: \"text\", text: \"What's in this image?\" },\n * { type: \"image\", source: { type: \"base64\", mediaType: \"image/png\", data: \"...\" } }\n * ]);\n */\n async send(message: SendMessage): Promise<void> {\n if (!this.initialized) {\n sessionLog(\"send\", \"auto-initializing (not yet initialized)\");\n await this.initialize();\n }\n\n const preview = typeof message === \"string\"\n ? message.slice(0, 100)\n : Array.isArray(message) ? `[multimodal: ${message.length} parts]` : String(message).slice(0, 100);\n sessionLog(\"send\", `sending message: ${preview}${typeof message === \"string\" && message.length > 100 ? \"...\" : \"\"}`);\n\n // Clear stale messages from previous turn to prevent desync\n if (this.streamQueue.length > 0) {\n sessionLog(\"send\", `clearing ${this.streamQueue.length} stale messages from previous turn`);\n this.streamQueue.length = 0;\n }\n\n await this.transport.write({\n type: \"user\",\n message: { role: \"user\", content: message },\n });\n\n // Advance generation AFTER the write so any messages the pump enqueues\n // during the await (from the previous run's lingering events) are tagged\n // with the old generation and will be filtered by stream().\n this.sendGeneration++;\n sessionLog(\"send\", `message written to transport (generation=${this.sendGeneration})`);\n }\n\n /**\n * Run a full turn (send + stream terminal result), with optional bounded\n * SDK-owned approval-conflict recovery.\n */\n async runTurn(\n message: SendMessage,\n options: RunTurnOptions = {},\n ): Promise<SDKResultMessage> {\n const maxApprovalRecoveryAttempts =\n this.resolveMaxApprovalRecoveryAttempts(options);\n const recoveryTimeoutMs = this.resolveApprovalRecoveryTimeoutMs(options);\n\n let recoveryAttempts = 0;\n let result = await this.runSingleTurn(message);\n\n while (\n !result.success &&\n result.approvalConflict === true &&\n recoveryAttempts < maxApprovalRecoveryAttempts\n ) {\n recoveryAttempts += 1;\n const recovery = await this.recoverPendingApprovals({\n timeoutMs: recoveryTimeoutMs,\n });\n\n if (!recovery.recovered) {\n return this.toTerminalApprovalConflictResult(result, {\n recoveryAttempts,\n detail: recovery.detail,\n });\n }\n\n result = await this.runSingleTurn(message);\n }\n\n if (!result.success && result.approvalConflict === true) {\n return this.toTerminalApprovalConflictResult(result, { recoveryAttempts });\n }\n\n if (recoveryAttempts > 0) {\n result.recoveryAttempts = recoveryAttempts;\n }\n\n return result;\n }\n\n /**\n * Ask the CLI to recover pending approvals for the current\n * agent/conversation context.\n */\n async recoverPendingApprovals(\n options: RecoverPendingApprovalsOptions = {},\n ): Promise<RecoverPendingApprovalsResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const timeoutMs =\n options.timeoutMs ??\n this.options.approvalRecoveryTimeoutMs ??\n DEFAULT_APPROVAL_RECOVERY_TIMEOUT_MS;\n\n if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {\n throw new Error(\n \"Invalid approval recovery timeout. Expected a positive integer.\",\n );\n }\n\n const requestId = `recover-approvals-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n\n let resp: { subtype: string; response?: unknown; error?: string };\n try {\n resp = await this.requestControlResponse(\n requestId,\n {\n subtype: \"recover_pending_approvals\",\n ...(this._agentId ? { agent_id: this._agentId } : {}),\n ...(this._conversationId ? { conversation_id: this._conversationId } : {}),\n },\n { timeoutMs },\n );\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n return {\n recovered: false,\n unsupported: false,\n detail,\n };\n }\n\n if (resp.subtype === \"error\") {\n const detail = resp.error ?? \"recover_pending_approvals failed\";\n return {\n recovered: false,\n pendingApproval: true,\n unsupported: isUnknownControlSubtypeError(\n detail,\n \"recover_pending_approvals\",\n ),\n detail,\n };\n }\n\n return {\n recovered: true,\n pendingApproval: false,\n unsupported: false,\n };\n }\n\n private resolveMaxApprovalRecoveryAttempts(options: RunTurnOptions): number {\n const value =\n options.maxApprovalRecoveryAttempts ??\n this.options.maxApprovalRecoveryAttempts ??\n DEFAULT_MAX_APPROVAL_RECOVERY_ATTEMPTS;\n\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(\n \"Invalid maxApprovalRecoveryAttempts. Expected a non-negative integer.\",\n );\n }\n\n return value;\n }\n\n private resolveApprovalRecoveryTimeoutMs(options: RunTurnOptions): number {\n const value =\n options.recoveryTimeoutMs ??\n this.options.approvalRecoveryTimeoutMs ??\n DEFAULT_APPROVAL_RECOVERY_TIMEOUT_MS;\n\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(\n \"Invalid approval recovery timeout. Expected a positive integer.\",\n );\n }\n\n return value;\n }\n\n private toTerminalApprovalConflictResult(\n result: SDKResultMessage,\n options: { recoveryAttempts: number; detail?: string },\n ): SDKResultMessage {\n return {\n ...result,\n success: false,\n error: \"approval_conflict_terminal\",\n errorCode: \"approval_conflict_terminal\",\n approvalConflict: true,\n recoverable: false,\n recoveryAttempts: options.recoveryAttempts,\n errorDetail:\n options.detail ||\n result.errorDetail ||\n \"Approval conflict remained unresolved after bounded SDK recovery.\",\n };\n }\n\n private async runSingleTurn(message: SendMessage): Promise<SDKResultMessage> {\n await this.send(message);\n\n let latestApprovalConflictDetail: string | undefined;\n let latestNonConflictErrorDetail: string | undefined;\n\n for await (const msg of this.stream()) {\n if (msg.type === \"error\") {\n const detail = msg.errorDetail || msg.message;\n if (msg.approvalConflict) {\n latestApprovalConflictDetail = detail;\n } else {\n latestNonConflictErrorDetail = detail;\n }\n continue;\n }\n\n if (msg.type === \"result\") {\n if (!msg.success && !msg.errorDetail) {\n if (msg.approvalConflict && latestApprovalConflictDetail) {\n return {\n ...msg,\n errorDetail: latestApprovalConflictDetail,\n };\n }\n\n if (!msg.approvalConflict && latestNonConflictErrorDetail) {\n return {\n ...msg,\n errorDetail: latestNonConflictErrorDetail,\n };\n }\n }\n\n return msg;\n }\n }\n\n return {\n type: \"result\",\n success: false,\n error: \"stream_closed\",\n errorCode: \"stream_closed\",\n recoverable: false,\n errorDetail: \"Stream ended before terminal result\",\n durationMs: 0,\n conversationId: this._conversationId,\n };\n }\n\n /**\n * Stream messages from the agent\n */\n async *stream(): AsyncGenerator<SDKMessage> {\n const streamStart = Date.now();\n const minGeneration = this.sendGeneration;\n let yieldCount = 0;\n let staleCount = 0;\n let staleRunIdCount = 0;\n let gotResult = false;\n const currentStreamRunIds = new Set<string>();\n const staleRunIds = new Set(this.lastCompletedRunIds);\n const approvalConflictDetailsByRunId = new Map<string, string>();\n let latestApprovalConflictDetail: string | undefined;\n\n this.startBackgroundPump();\n sessionLog(\"stream\", `starting stream (agent=${this._agentId}, conversation=${this._conversationId}, generation=${minGeneration})`);\n\n while (true) {\n const bufferedMsg = await this.nextBufferedMessage();\n if (!bufferedMsg) {\n break;\n }\n\n // Filter stale messages from previous runs. Messages enqueued before\n // the current send() carry an older generation tag.\n if (bufferedMsg.generation < minGeneration) {\n staleCount++;\n sessionLog(\"stream\", `discarding stale message: type=${bufferedMsg.message.type} generation=${bufferedMsg.generation} (current=${minGeneration})`);\n continue;\n }\n\n // Filter late old-run messages that arrive after send() has already\n // advanced generation and stream queue was cleared.\n if (bufferedMsg.runId && staleRunIds.has(bufferedMsg.runId)) {\n staleRunIdCount++;\n sessionLog(\"stream\", `discarding stale message: type=${bufferedMsg.message.type} runId=${bufferedMsg.runId}`);\n continue;\n }\n\n if (bufferedMsg.runId) {\n currentStreamRunIds.add(bufferedMsg.runId);\n }\n\n const sdkMsg = bufferedMsg.message;\n\n if (sdkMsg.type === \"error\" && sdkMsg.approvalConflict) {\n const detail = sdkMsg.errorDetail || sdkMsg.message;\n if (detail) {\n latestApprovalConflictDetail = detail;\n if (sdkMsg.runId) {\n approvalConflictDetailsByRunId.set(sdkMsg.runId, detail);\n }\n }\n }\n\n let normalizedMsg: SDKMessage = sdkMsg;\n\n if (sdkMsg.type === \"result\" && !sdkMsg.success) {\n let detail = sdkMsg.errorDetail;\n if (!detail && Array.isArray(sdkMsg.runIds)) {\n for (const runId of sdkMsg.runIds) {\n const fromRun = approvalConflictDetailsByRunId.get(runId);\n if (fromRun) {\n detail = fromRun;\n break;\n }\n }\n }\n if (!detail) {\n detail = latestApprovalConflictDetail;\n }\n\n const approvalConflict =\n sdkMsg.approvalConflict === true\n || isApprovalConflictSignal({\n detail,\n message: sdkMsg.errorCode || sdkMsg.error,\n stopReason: sdkMsg.stopReason,\n });\n\n if (approvalConflict) {\n const normalizedErrorCode =\n !sdkMsg.errorCode || sdkMsg.errorCode === \"error\"\n ? \"approval_conflict\"\n : sdkMsg.errorCode;\n const normalizedError =\n !sdkMsg.error || sdkMsg.error === \"error\"\n ? normalizedErrorCode\n : sdkMsg.error;\n\n normalizedMsg = {\n ...sdkMsg,\n approvalConflict: true,\n recoverable: sdkMsg.recoverable ?? true,\n ...(detail ? { errorDetail: detail } : {}),\n errorCode: normalizedErrorCode,\n error: normalizedError,\n };\n } else if (!sdkMsg.errorCode && sdkMsg.error) {\n const errorCode = toSdkErrorCode(sdkMsg.error);\n if (errorCode) {\n normalizedMsg = {\n ...sdkMsg,\n errorCode,\n };\n }\n }\n }\n\n yieldCount++;\n sessionLog(\"stream\", `yield #${yieldCount}: type=${normalizedMsg.type}${normalizedMsg.type === \"result\" ? ` success=${(normalizedMsg as SDKResultMessage).success} error=${(normalizedMsg as SDKResultMessage).error || \"none\"}` : \"\"}`);\n yield normalizedMsg;\n\n // Stop on result message\n if (normalizedMsg.type === \"result\") {\n gotResult = true;\n this.updateCompletedRunIds((normalizedMsg as SDKResultMessage).runIds, currentStreamRunIds);\n break;\n }\n }\n\n const elapsed = Date.now() - streamStart;\n sessionLog(\"stream\", `stream ended: duration=${elapsed}ms yielded=${yieldCount} staleFiltered=${staleCount} staleRunIdFiltered=${staleRunIdCount} dropped=${this.droppedStreamMessages} gotResult=${gotResult}`);\n if (!gotResult) {\n sessionLog(\"stream\", \"WARNING: stream ended WITHOUT a result message -- transport may have closed unexpectedly\");\n }\n }\n\n private startBackgroundPump(): void {\n if (this.pumpPromise) {\n return;\n }\n\n this.pumpClosed = false;\n this.pumpPromise = this.runBackgroundPump()\n .catch((err) => {\n sessionLog(\"pump\", `ERROR: ${err instanceof Error ? err.message : String(err)}`);\n })\n .finally(() => {\n this.pumpClosed = true;\n this.resolveAllStreamWaiters(null);\n });\n }\n\n private async runBackgroundPump(): Promise<void> {\n sessionLog(\"pump\", \"background pump started\");\n\n // Tool call chunks are emitted immediately (no buffering).\n // Consumers that need complete arguments should accumulate rawArguments\n // across chunks sharing the same toolCallId on their side.\n //\n // Index-to-ID mapping: The Letta API follows the OpenAI streaming format\n // for parallel tool calls -- only the first chunk per tool call includes\n // tool_call_id, subsequent chunks identify themselves via index only.\n // We maintain a lightweight index->id map so transformMessage() can\n // resolve the ID for every chunk without buffering.\n const indexToToolCallId = new Map<number, string>();\n\n for await (const wireMsg of this.transport.messages()) {\n const wireMsgAny = wireMsg as unknown as Record<string, unknown>;\n\n if (wireMsg.type === \"control_request\") {\n const handled = await this.handleControlRequest(wireMsg as ControlRequest);\n if (!handled) {\n sessionLog(\"pump\", `DROPPED unsupported control_request: subtype=${(wireMsgAny.request as Record<string, unknown>)?.subtype || \"N/A\"}`);\n }\n continue;\n }\n\n // Route control_response to a registered waiter (e.g., from listMessages).\n // Unmatched control_responses are logged and dropped — they never reach the stream.\n if (wireMsg.type === \"control_response\") {\n const respMsg = wireMsg as unknown as {\n response: { subtype: string; request_id?: string; response?: unknown; error?: string };\n };\n const requestId = respMsg.response?.request_id;\n if (requestId && this.controlResponseWaiters.has(requestId)) {\n const resolve = this.controlResponseWaiters.get(requestId)!;\n this.controlResponseWaiters.delete(requestId);\n resolve(respMsg.response);\n } else {\n sessionLog(\"pump\", `DROPPED unmatched control_response: request_id=${requestId ?? \"N/A\"}`);\n }\n continue;\n }\n\n // For tool_call_message chunks, resolve index-based IDs before transform.\n // The first chunk has both tool_call_id and index; subsequent chunks have\n // only index. Patch the wire message so transformMessage() always sees an ID.\n const messageType = wireMsgAny.message_type as string | undefined;\n if (wireMsg.type === \"message\" && (messageType === \"tool_call_message\" || messageType === \"approval_request_message\")) {\n const toolCalls = wireMsgAny.tool_calls as Array<Record<string, unknown>> | undefined;\n const toolCall = wireMsgAny.tool_call as Record<string, unknown> | undefined;\n const tc = toolCalls?.[0] || toolCall;\n if (tc) {\n const fnObj = tc.function as Record<string, unknown> | undefined;\n const tcId = (tc.tool_call_id as string | undefined) ?? (tc.id as string | undefined);\n const tcIndex = tc.index as number | undefined;\n\n if (tcId && tcIndex !== undefined) {\n indexToToolCallId.set(tcIndex, tcId);\n } else if (!tcId && tcIndex !== undefined) {\n const resolvedId = indexToToolCallId.get(tcIndex);\n if (resolvedId) {\n // Patch the resolved ID into the wire message for transformMessage\n if (fnObj) {\n tc.id = resolvedId;\n } else {\n tc.tool_call_id = resolvedId;\n }\n }\n }\n }\n }\n\n const sdkMsg = this.transformMessage(wireMsg);\n if (sdkMsg) {\n this.enqueueStreamMessage(sdkMsg);\n } else {\n sessionLog(\"pump\", `DROPPED wire message: type=${wireMsg.type} message_type=${wireMsgAny.message_type || \"N/A\"} subtype=${wireMsgAny.subtype || \"N/A\"}`);\n }\n }\n\n sessionLog(\"pump\", \"background pump ended\");\n }\n\n private async handleControlRequest(controlReq: ControlRequest): Promise<boolean> {\n // Widen to string to allow SDK-extension subtypes not in the protocol union\n const subtype: string = controlReq.request.subtype;\n sessionLog(\"pump\", `control_request: subtype=${subtype} tool=${(controlReq.request as CanUseToolControlRequest).tool_name || \"N/A\"}`);\n\n if (subtype === \"can_use_tool\") {\n await this.handleCanUseTool(\n controlReq.request_id,\n controlReq.request as CanUseToolControlRequest\n );\n return true;\n }\n\n if (subtype === \"execute_external_tool\") {\n // SDK extension: not in protocol ControlRequestBody union, extract fields via Record\n const rawReq = controlReq.request as Record<string, unknown>;\n await this.handleExecuteExternalTool(\n controlReq.request_id,\n {\n subtype: \"execute_external_tool\",\n tool_call_id: rawReq.tool_call_id as string,\n tool_name: rawReq.tool_name as string,\n input: rawReq.input as Record<string, unknown>,\n }\n );\n return true;\n }\n\n return false;\n }\n\n private enqueueStreamMessage(msg: SDKMessage): void {\n const bufferedMsg: BufferedStreamMessage = {\n message: msg,\n generation: this.sendGeneration,\n runId: this.getMessageRunId(msg),\n };\n\n if (this.streamResolvers.length > 0) {\n const resolve = this.streamResolvers.shift()!;\n resolve(bufferedMsg);\n return;\n }\n\n if (this.streamQueue.length >= MAX_BUFFERED_STREAM_MESSAGES) {\n this.streamQueue.shift();\n this.droppedStreamMessages++;\n sessionLog(\"pump\", `stream queue overflow: dropped oldest message (total_dropped=${this.droppedStreamMessages}, max=${MAX_BUFFERED_STREAM_MESSAGES})`);\n }\n\n this.streamQueue.push(bufferedMsg);\n }\n\n private async nextBufferedMessage(): Promise<BufferedStreamMessage | null> {\n if (this.streamQueue.length > 0) {\n return this.streamQueue.shift()!;\n }\n\n if (this.pumpClosed) {\n return null;\n }\n\n return new Promise((resolve) => {\n this.streamResolvers.push(resolve);\n });\n }\n\n private resolveAllStreamWaiters(msg: BufferedStreamMessage | null): void {\n for (const resolve of this.streamResolvers) {\n resolve(msg);\n }\n this.streamResolvers = [];\n // Also cancel any in-flight control request waiters (e.g., listMessages)\n for (const resolve of this.controlResponseWaiters.values()) {\n resolve({ subtype: \"error\", error: \"session closed\" });\n }\n this.controlResponseWaiters.clear();\n }\n\n private getMessageRunId(msg: SDKMessage): string | undefined {\n switch (msg.type) {\n case \"assistant\":\n case \"tool_call\":\n case \"tool_result\":\n case \"reasoning\":\n case \"error\":\n case \"retry\":\n return msg.runId;\n default:\n return undefined;\n }\n }\n\n private updateCompletedRunIds(\n resultRunIds: string[] | undefined,\n streamedRunIds: Set<string>,\n ): void {\n const nextRunIds = new Set<string>();\n\n if (Array.isArray(resultRunIds)) {\n for (const runId of resultRunIds) {\n if (runId) {\n nextRunIds.add(runId);\n }\n }\n }\n\n for (const runId of streamedRunIds) {\n if (runId) {\n nextRunIds.add(runId);\n }\n }\n\n this.lastCompletedRunIds = nextRunIds;\n }\n\n /**\n * Register external tools with the CLI\n */\n private async registerExternalTools(): Promise<void> {\n const toolDefs = Array.from(this.externalTools.values()).map((tool) => ({\n name: tool.name,\n label: tool.label,\n description: tool.description,\n // Convert TypeBox schema to plain JSON Schema\n parameters: this.schemaToJsonSchema(tool.parameters),\n }));\n\n sessionLog(\"registerTools\", `registering ${toolDefs.length} external tools: ${toolDefs.map(t => t.name).join(\", \")}`);\n\n await this.transport.write({\n type: \"control_request\",\n request_id: `register_tools_${Date.now()}`,\n request: {\n subtype: \"register_external_tools\",\n tools: toolDefs,\n },\n });\n }\n\n /**\n * Convert TypeBox schema to JSON Schema\n */\n private schemaToJsonSchema(schema: unknown): Record<string, unknown> {\n // TypeBox schemas are already JSON Schema compatible\n // Just need to extract the schema object\n if (schema && typeof schema === \"object\") {\n // TypeBox schemas have these JSON Schema properties\n const s = schema as Record<string, unknown>;\n return {\n type: s.type,\n properties: s.properties,\n required: s.required,\n additionalProperties: s.additionalProperties,\n description: s.description,\n };\n }\n return { type: \"object\" };\n }\n\n /**\n * Handle execute_external_tool control request from CLI\n */\n private async handleExecuteExternalTool(\n requestId: string,\n req: ExecuteExternalToolRequest\n ): Promise<void> {\n const tool = this.externalTools.get(req.tool_name);\n \n if (!tool) {\n // Tool not found - send error result\n sessionLog(\"executeExternalTool\", `ERROR: unknown tool ${req.tool_name}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: [{ type: \"text\", text: `Unknown external tool: ${req.tool_name}` }],\n is_error: true,\n },\n });\n return;\n }\n\n try {\n sessionLog(\"executeExternalTool\", `executing ${req.tool_name} (call_id=${req.tool_call_id})`);\n // Execute the tool\n const result = await tool.execute(req.tool_call_id, req.input);\n \n // Send success result\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: result.content,\n is_error: false,\n },\n });\n sessionLog(\"executeExternalTool\", `${req.tool_name} completed successfully`);\n } catch (err) {\n // Send error result\n const errorMessage = err instanceof Error ? err.message : String(err);\n sessionLog(\"executeExternalTool\", `${req.tool_name} failed: ${errorMessage}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: [{ type: \"text\", text: `Tool execution error: ${errorMessage}` }],\n is_error: true,\n },\n });\n }\n }\n\n /**\n * Handle can_use_tool control request from CLI (Claude SDK compatible format)\n */\n private async handleCanUseTool(\n requestId: string,\n req: CanUseToolControlRequest\n ): Promise<void> {\n let response: CanUseToolResponse;\n const toolName = req.tool_name;\n const hasCallback = typeof this.options.canUseTool === \"function\";\n const toolNeedsRuntimeUserInput = requiresRuntimeUserInput(toolName);\n const autoAllowWithoutCallback =\n isHeadlessAutoAllowTool(toolName);\n\n sessionLog(\"canUseTool\", `tool=${toolName} mode=${this.options.permissionMode || \"standard\"} requestId=${requestId}`);\n\n // Tools that require runtime user input cannot be auto-allowed without a callback.\n if (toolNeedsRuntimeUserInput && !hasCallback) {\n response = {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n } else if (\n isUnrestrictedPermissionMode(this.options.permissionMode) &&\n !toolNeedsRuntimeUserInput\n ) {\n // unrestricted auto-allows non-interactive tools.\n sessionLog(\"canUseTool\", `AUTO-ALLOW ${toolName} (unrestricted)`);\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\n } else if (hasCallback) {\n try {\n const result = await this.options.canUseTool!(toolName, req.input);\n if (result.behavior === \"allow\") {\n response = {\n behavior: \"allow\",\n updatedInput: result.updatedInput ?? null,\n updatedPermissions: [], // TODO: not implemented\n } satisfies CanUseToolResponseAllow;\n } else {\n response = {\n behavior: \"deny\",\n message: result.message ?? \"Denied by canUseTool callback\",\n interrupt: false, // TODO: not wired up yet\n } satisfies CanUseToolResponseDeny;\n }\n } catch (err) {\n response = {\n behavior: \"deny\",\n message: err instanceof Error ? err.message : \"Callback error\",\n interrupt: false,\n };\n }\n } else if (autoAllowWithoutCallback) {\n // Default headless behavior matches Claude: EnterPlanMode can proceed\n // without requiring a callback in bidirectional mode.\n sessionLog(\"canUseTool\", `AUTO-ALLOW ${toolName} (default behavior)`);\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\n } else {\n // No callback registered - deny by default\n response = {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n }\n\n // Send control_response (Claude SDK compatible format)\n const responseBehavior = \"behavior\" in response ? response.behavior : \"unknown\";\n sessionLog(\"canUseTool\", `responding: requestId=${requestId} behavior=${responseBehavior}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response,\n },\n });\n sessionLog(\"canUseTool\", `response sent for ${toolName}`);\n }\n\n /**\n * Abort the current operation (interrupt without closing the session)\n */\n async abort(): Promise<void> {\n if (!this.initialized || this.pumpClosed) return;\n sessionLog(\"abort\", `aborting session (agent=${this._agentId})`);\n await this.transport.write({\n type: \"control_request\",\n request_id: `interrupt-${Date.now()}`,\n request: { subtype: \"interrupt\" },\n });\n }\n\n private async requestControlResponse(\n requestId: string,\n request: Record<string, unknown>,\n options: { timeoutMs?: number } = {},\n ): Promise<{ subtype: string; response?: unknown; error?: string }> {\n const responsePromise = new Promise<{\n subtype: string;\n response?: unknown;\n error?: string;\n }>((resolve) => {\n this.controlResponseWaiters.set(requestId, resolve);\n });\n\n try {\n await this.transport.write({\n type: \"control_request\",\n request_id: requestId,\n request: request as unknown as ControlRequest[\"request\"],\n });\n } catch (error) {\n this.controlResponseWaiters.delete(requestId);\n throw error;\n }\n\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n try {\n if (typeof options.timeoutMs === \"number\") {\n return await Promise.race([\n responsePromise,\n new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n this.controlResponseWaiters.delete(requestId);\n reject(\n new Error(\n `Timed out waiting for control_response (${requestId})`,\n ),\n );\n }, options.timeoutMs);\n }),\n ]);\n }\n\n return await responsePromise;\n } finally {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n }\n }\n\n /**\n * Fetch a page of conversation messages via the CLI control protocol.\n *\n * The session must be initialized before calling this method.\n * Safe to call concurrently with an active stream() — the pump routes\n * matching control_response messages to this waiter without touching the\n * stream queue.\n */\n async listMessages(options: ListMessagesOptions = {}): Promise<ListMessagesResult> {\n if (!this.initialized) {\n throw new Error(\"Session must be initialized before calling listMessages()\");\n }\n\n const requestId = `list-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n\n const resp = await this.requestControlResponse(requestId, {\n subtype: \"list_messages\",\n ...(options.conversationId ? { conversation_id: options.conversationId } : {}),\n ...(options.before ? { before: options.before } : {}),\n ...(options.after ? { after: options.after } : {}),\n ...(options.order ? { order: options.order } : {}),\n ...(options.limit !== undefined ? { limit: options.limit } : {}),\n });\n\n if (!resp) {\n throw new Error(\"Session closed before listMessages response arrived\");\n }\n if (resp.subtype === \"error\") {\n throw new Error(resp.error ?? \"listMessages failed\");\n }\n\n const payload = resp.response as {\n messages?: unknown[];\n next_before?: string | null;\n has_more?: boolean;\n } | undefined;\n\n return {\n messages: payload?.messages ?? [],\n nextBefore: payload?.next_before ?? null,\n hasMore: payload?.has_more ?? false,\n };\n }\n\n async listModels(): Promise<ListModelsResult> {\n throw new Error(\n \"listModels() is not supported by this session. Use a Cloud, Remote, or local agent session.\",\n );\n }\n\n async sendCommand(command: SDKProtocolCommand): Promise<void>;\n async sendCommand<TResponse extends SDKProtocolMessage = SDKProtocolMessage>(\n command: SDKProtocolCommand,\n options: SendCommandOptions,\n ): Promise<TResponse>;\n async sendCommand(\n _command?: SDKProtocolCommand,\n _options?: SendCommandOptions,\n ): Promise<void> {\n throw new Error(\n \"sendCommand() is not supported by this session. Use a Cloud, Remote, or local agent session.\",\n );\n }\n\n async updateModel(_update: string | UpdateModelOptions): Promise<UpdateModelResult> {\n throw new Error(\n \"updateModel() is not supported by this session. Use a Cloud, Remote, or local agent session.\",\n );\n }\n\n /**\n * Fetch all data needed to render the initial conversation view in one round-trip.\n *\n * Returns resolved session metadata + initial history page + pending approval flag\n * + optional timing breakdown. This is faster than separate initialize() + listMessages()\n * calls because the CLI collects and returns everything in a single control response.\n *\n * The session must be initialized before calling this method.\n */\n async bootstrapState(\n options: BootstrapStateOptions = {},\n ): Promise<BootstrapStateResult> {\n if (!this.initialized) {\n throw new Error(\n \"Session must be initialized before calling bootstrapState()\",\n );\n }\n\n const requestId = `bootstrap-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n\n const resp = await this.requestControlResponse(requestId, {\n subtype: \"bootstrap_session_state\",\n ...(options.limit !== undefined ? { limit: options.limit } : {}),\n ...(options.order ? { order: options.order } : {}),\n });\n\n if (!resp) {\n throw new Error(\"Session closed before bootstrapState response arrived\");\n }\n if (resp.subtype === \"error\") {\n throw new Error(\n (resp as { error?: string }).error ?? \"bootstrapState failed\",\n );\n }\n\n const payload = resp.response as {\n agent_id?: string;\n conversation_id?: string;\n model?: string;\n tools?: string[];\n memfs_enabled?: boolean;\n messages?: unknown[];\n next_before?: string | null;\n has_more?: boolean;\n has_pending_approval?: boolean;\n timings?: {\n resolve_ms: number;\n list_messages_ms: number;\n total_ms: number;\n };\n } | undefined;\n\n const state: BootstrapStateResult = {\n agentId: payload?.agent_id ?? this._agentId ?? \"\",\n conversationId: payload?.conversation_id ?? this._conversationId ?? \"\",\n model: payload?.model,\n memfsEnabled: payload?.memfs_enabled ?? false,\n messages: payload?.messages ?? [],\n nextBefore: payload?.next_before ?? null,\n hasMore: payload?.has_more ?? false,\n hasPendingApproval: payload?.has_pending_approval ?? false,\n };\n if (payload?.tools !== undefined) state.tools = payload.tools;\n if (payload?.timings !== undefined) state.timings = payload.timings;\n return state;\n }\n\n async updateToolset(_toolsetPreference: string): Promise<void> {\n throw new Error(\"updateToolset() is not supported by this session. Use a Cloud, Remote, or local agent session.\");\n }\n\n /**\n * Close the session\n */\n close(): void {\n sessionLog(\"close\", `closing session (agent=${this._agentId}, conversation=${this._conversationId})`);\n this.transport.close();\n this.pumpClosed = true;\n this.resolveAllStreamWaiters(null);\n }\n\n /**\n * Get the agent ID (available after initialization)\n */\n get agentId(): string | null {\n return this._agentId;\n }\n\n /**\n * Get the session ID (available after initialization)\n */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Get the conversation ID (available after initialization)\n */\n get conversationId(): string | null {\n return this._conversationId;\n }\n\n /**\n * AsyncDisposable implementation for `await using`\n */\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n }\n\n /**\n * Transform wire message to SDK message\n */\n private transformMessage(wireMsg: WireMessage | MessageWire): SDKMessage | null {\n // Init message\n if (wireMsg.type === \"system\" && \"subtype\" in wireMsg && wireMsg.subtype === \"init\") {\n const msg = wireMsg as WireMessage & {\n agent_id: string;\n session_id: string;\n conversation_id: string;\n model: string;\n tools: string[];\n memfs_enabled?: boolean;\n skill_sources?: Array<\"bundled\" | \"global\" | \"agent\" | \"project\">;\n system_info_reminder_enabled?: boolean;\n reflection_trigger?: \"off\" | \"step-count\" | \"compaction-event\";\n reflection_behavior?: \"reminder\" | \"auto-launch\";\n reflection_step_count?: number;\n };\n return {\n type: \"init\",\n agentId: msg.agent_id,\n sessionId: msg.session_id,\n conversationId: msg.conversation_id,\n model: msg.model,\n tools: msg.tools,\n memfsEnabled: msg.memfs_enabled,\n skillSources: msg.skill_sources,\n systemInfoReminderEnabled: msg.system_info_reminder_enabled,\n dreaming:\n msg.reflection_trigger &&\n msg.reflection_behavior &&\n typeof msg.reflection_step_count === \"number\"\n ? {\n trigger: msg.reflection_trigger,\n behavior: msg.reflection_behavior,\n stepCount: msg.reflection_step_count,\n }\n : undefined,\n };\n }\n\n // Handle message types (all have type: \"message\" with message_type field)\n if (wireMsg.type === \"message\" && \"message_type\" in wireMsg) {\n const msg = wireMsg as WireMessage & {\n message_type: string;\n uuid: string;\n run_id?: string;\n // assistant_message fields\n content?: string;\n // tool_call_message fields\n tool_call?: { name: string; arguments: string; tool_call_id: string };\n tool_calls?: Array<{ name: string; arguments: string; tool_call_id: string }>;\n // tool_return_message fields\n tool_call_id?: string;\n tool_return?: string;\n status?: \"success\" | \"error\";\n // reasoning_message fields\n reasoning?: string;\n };\n\n const runId = msg.run_id || undefined;\n\n // Assistant message\n if (msg.message_type === \"assistant_message\" && msg.content) {\n return {\n type: \"assistant\",\n content: msg.content,\n uuid: msg.uuid,\n runId,\n };\n }\n\n // Tool call message (tool_call_message = auto-executed, approval_request_message = needs approval)\n if (msg.message_type === \"tool_call_message\" || msg.message_type === \"approval_request_message\") {\n const toolCallRaw = (msg.tool_calls?.[0] || msg.tool_call) as Record<string, unknown> | undefined;\n if (toolCallRaw) {\n const fnObj = toolCallRaw.function as Record<string, unknown> | undefined;\n const toolCallId =\n (toolCallRaw.tool_call_id as string | undefined) ??\n (toolCallRaw.id as string | undefined);\n if (!toolCallId) {\n const detail = `Missing tool_call_id in ${msg.message_type} (uuid=${msg.uuid || \"unknown\"})`;\n sessionLog(\"transform\", detail);\n return {\n type: \"error\",\n message: detail,\n errorCode: \"protocol_error\",\n stopReason: \"protocol_error\",\n runId,\n apiError: {\n error_type: \"protocol_error\",\n detail,\n message_type: msg.message_type,\n },\n recoverable: false,\n errorDetail: detail,\n };\n }\n\n const toolName =\n (toolCallRaw.name as string | undefined) ??\n (fnObj?.name as string | undefined) ??\n \"?\";\n const toolArgs =\n (toolCallRaw.arguments as string | undefined) ??\n (fnObj?.arguments as string | undefined) ??\n \"\";\n\n let toolInput: Record<string, unknown> = {};\n try {\n toolInput = JSON.parse(toolArgs);\n } catch {\n toolInput = { raw: toolArgs };\n }\n return {\n type: \"tool_call\",\n toolCallId,\n toolName,\n toolInput,\n rawArguments: toolArgs || undefined,\n uuid: msg.uuid,\n runId,\n };\n }\n }\n\n // Tool return message\n if (msg.message_type === \"tool_return_message\" && msg.tool_call_id) {\n return {\n type: \"tool_result\",\n toolCallId: msg.tool_call_id,\n content: msg.tool_return || \"\",\n isError: msg.status === \"error\",\n uuid: msg.uuid,\n runId,\n };\n }\n\n // Reasoning message\n if (msg.message_type === \"reasoning_message\" && msg.reasoning) {\n return {\n type: \"reasoning\",\n content: msg.reasoning,\n uuid: msg.uuid,\n runId,\n };\n }\n }\n\n // Stream event (partial message updates)\n if (wireMsg.type === \"stream_event\") {\n const msg = wireMsg as WireMessage & {\n event: unknown;\n uuid: string;\n };\n const eventPayload = (msg.event ?? {}) as SDKStreamEventPayload;\n return {\n type: \"stream_event\",\n event: eventPayload,\n uuid: msg.uuid,\n };\n }\n\n // Result message\n if (wireMsg.type === \"result\") {\n const msg = wireMsg as WireMessage & {\n subtype: string;\n result?: string;\n duration_ms: number;\n total_cost_usd?: number;\n conversation_id: string;\n stop_reason?: string;\n run_ids?: unknown[];\n };\n const runIds = Array.isArray(msg.run_ids)\n ? msg.run_ids.filter((id): id is string => typeof id === \"string\")\n : undefined;\n const approvalConflict = isApprovalConflictSignal({\n stopReason: msg.stop_reason,\n });\n const legacyError = msg.subtype !== \"success\"\n ? (approvalConflict && msg.subtype === \"error\" ? \"approval_conflict\" : msg.subtype)\n : undefined;\n const errorCode = toSdkErrorCode(legacyError);\n return {\n type: \"result\",\n success: msg.subtype === \"success\",\n result: msg.result,\n error: legacyError,\n errorCode,\n ...(approvalConflict\n ? {\n approvalConflict: true as const,\n recoverable: true as const,\n }\n : {}),\n stopReason: msg.stop_reason,\n durationMs: msg.duration_ms,\n totalCostUsd: msg.total_cost_usd,\n conversationId: msg.conversation_id,\n runIds,\n };\n }\n\n // Error message — carries the actual error detail from the CLI.\n // The subsequent type=result only has the opaque string \"error\";\n // this message has the human-readable description and API error.\n if (wireMsg.type === \"error\") {\n const msg = wireMsg as WireMessage & {\n message: string;\n stop_reason: string;\n run_id?: string;\n api_error?: Record<string, unknown>;\n };\n const errorDetail = extractApiErrorDetail(msg.api_error);\n const approvalConflict = isApprovalConflictSignal({\n detail: errorDetail,\n message: msg.message,\n stopReason: msg.stop_reason,\n });\n const errorCode = approvalConflict\n ? \"approval_conflict\"\n : toSdkErrorCode(msg.stop_reason);\n return {\n type: \"error\" as const,\n message: msg.message,\n ...(errorCode ? { errorCode } : {}),\n ...(approvalConflict\n ? {\n approvalConflict: true as const,\n recoverable: true as const,\n }\n : {}),\n ...(errorDetail ? { errorDetail } : {}),\n stopReason: msg.stop_reason,\n runId: msg.run_id,\n apiError: msg.api_error,\n };\n }\n\n // Retry message — the CLI is retrying after a transient failure.\n if (wireMsg.type === \"retry\") {\n const msg = wireMsg as WireMessage & {\n reason: string;\n attempt: number;\n max_attempts: number;\n delay_ms: number;\n run_id?: string;\n };\n return {\n type: \"retry\" as const,\n reason: msg.reason,\n attempt: msg.attempt,\n maxAttempts: msg.max_attempts,\n delayMs: msg.delay_ms,\n runId: msg.run_id,\n };\n }\n\n // Skip other message types (system_message, user_message, etc.)\n return null;\n }\n}\n",
8
9
  "import type {\n CreateRepositoryFileParams,\n CreateRepositoryParams,\n DeleteRepositoryFileParams,\n DeleteRepositoryFileResult,\n GetRepositoryVersionParams,\n LettaCodeCloudClientOptions,\n ListRepositoriesParams,\n ListRepositoriesResult,\n ListRepositoryFilesParams,\n ListRepositoryFilesResult,\n ListRepositoryVersionsParams,\n Repository,\n RepositoryFile,\n RepositoryFileMutationResult,\n RepositoryVersion,\n UpdateRepositoryFileParams,\n} from \"./types.js\";\n\nconst DEFAULT_CLOUD_API_BASE_URL = \"https://api.letta.com\";\n\ntype FetchLike = typeof fetch;\n\nfunction getDefaultApiKey(): string | undefined {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env;\n return env?.LETTA_API_KEY ?? env?.LETTA_CLOUD_API_KEY;\n}\n\nfunction bearerTokenFromHeaders(headers: Record<string, string> | undefined): string | undefined {\n const authorization = headers?.Authorization ?? headers?.authorization;\n if (!authorization) return undefined;\n const match = /^Bearer\\s+(.+)$/i.exec(authorization);\n return match?.[1];\n}\n\nfunction getCloudApiKey(options: LettaCodeCloudClientOptions): string | undefined {\n return options.apiKey ?? bearerTokenFromHeaders(options.headers) ?? getDefaultApiKey();\n}\n\nfunction getFetch(fetchOverride?: FetchLike): FetchLike {\n const resolved = fetchOverride ?? globalThis.fetch;\n if (!resolved) throw new Error(\"No fetch implementation available for cloud backend.\");\n return resolved.bind(globalThis) as FetchLike;\n}\n\nfunction normalizeCloudApiBaseUrl(url: string | undefined): string {\n const parsed = new URL(url ?? DEFAULT_CLOUD_API_BASE_URL);\n parsed.pathname = parsed.pathname.replace(/\\/+$/, \"\");\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nfunction cloudHeaders(options: LettaCodeCloudClientOptions): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options.headers ?? {}),\n };\n const apiKey = getCloudApiKey(options);\n if (apiKey && !headers.Authorization && !headers.authorization) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n return headers;\n}\n\nasync function parseJsonResponse(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nfunction responseErrorMessage(body: unknown, fallback: string): string {\n if (body && typeof body === \"object\") {\n const record = body as Record<string, unknown>;\n const message = record.message ?? record.error ?? record.detail;\n const reasonText = record.reason_text;\n const pieces = [message, reasonText]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (pieces.length > 0) return pieces.join(\": \");\n }\n return fallback;\n}\n\nfunction assertOkResponse(response: Response, body: unknown, action: string): void {\n if (!response.ok) {\n throw new Error(responseErrorMessage(body, `${action} failed with HTTP ${response.status}`));\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction requireString(value: unknown, name: string): string {\n if (typeof value !== \"string\") throw new Error(`Cloud repositories response missing ${name}.`);\n return value;\n}\n\nfunction toRepository(body: unknown): Repository {\n if (!body || typeof body !== \"object\") {\n throw new Error(\"Cloud repositories response did not include a repository.\");\n }\n const record = body as Record<string, unknown>;\n return {\n id: requireString(record.id, \"id\"),\n name: requireString(record.name, \"name\"),\n createdAt: requireString(record.created_at, \"created_at\"),\n updatedAt: requireString(record.updated_at, \"updated_at\"),\n };\n}\n\nfunction toFileMutation(body: unknown): RepositoryFileMutationResult {\n if (!body || typeof body !== \"object\") {\n throw new Error(\"Cloud repositories file response did not include file details.\");\n }\n const record = body as Record<string, unknown>;\n return {\n path: requireString(record.path, \"path\"),\n contentSha256: requireString(record.content_sha256, \"content_sha256\"),\n commitSha: requireString(record.commit_sha, \"commit_sha\"),\n };\n}\n\nfunction addOptionalSearchParam(url: URL, key: string, value: string | number | undefined): void {\n if (value !== undefined) url.searchParams.set(key, String(value));\n}\n\nexport class RepositoriesClient {\n constructor(private readonly options: LettaCodeCloudClientOptions) {}\n\n async create(params: CreateRepositoryParams): Promise<Repository> {\n return toRepository(await this.request(\"/v1/repositories\", \"POST\", { name: params.name }, \"Cloud create repository\"));\n }\n\n async list(params: ListRepositoriesParams = {}): Promise<ListRepositoriesResult> {\n const url = this.url(\"/v1/repositories\");\n addOptionalSearchParam(url, \"limit\", params.limit);\n addOptionalSearchParam(url, \"offset\", params.offset);\n const body = await this.requestUrl(url, \"GET\", undefined, \"Cloud list repositories\");\n if (!body || typeof body !== \"object\") {\n throw new Error(\"Cloud list repositories response did not include repositories.\");\n }\n const record = body as Record<string, unknown>;\n const repositories = Array.isArray(record.repositories)\n ? record.repositories.map(toRepository)\n : [];\n return {\n repositories,\n hasNextPage: record.has_next_page === true,\n };\n }\n\n async get(repositoryId: string): Promise<Repository> {\n return toRepository(await this.request(`/v1/repositories/${encodeURIComponent(repositoryId)}`, \"GET\", undefined, \"Cloud get repository\"));\n }\n\n /**\n * Delete a repository. The server soft-deletes it (marks the repository\n * deleted rather than removing its data). Resolves on success; throws if the\n * repository does not exist or is not visible to the caller's organization.\n */\n async delete(repositoryId: string): Promise<void> {\n await this.request(\n `/v1/repositories/${encodeURIComponent(repositoryId)}`,\n \"DELETE\",\n undefined,\n \"Cloud delete repository\",\n );\n }\n\n readonly files = {\n list: async (\n repositoryId: string,\n params: ListRepositoryFilesParams = {},\n ): Promise<ListRepositoryFilesResult> => {\n const url = this.url(`/v1/repositories/${encodeURIComponent(repositoryId)}/files`);\n addOptionalSearchParam(url, \"path_prefix\", params.pathPrefix);\n addOptionalSearchParam(url, \"depth\", params.depth);\n addOptionalSearchParam(url, \"ref\", params.ref);\n const body = await this.requestUrl(url, \"GET\", undefined, \"Cloud list repository files\");\n if (!body || typeof body !== \"object\") {\n throw new Error(\"Cloud list repository files response did not include files.\");\n }\n const record = body as Record<string, unknown>;\n const files = Array.isArray(record.files)\n ? record.files.map((entry) => {\n if (!entry || typeof entry !== \"object\") {\n throw new Error(\"Cloud list repository files response included an invalid file entry.\");\n }\n const file = entry as Record<string, unknown>;\n const type = file.type;\n if (type !== \"file\" && type !== \"directory\") {\n throw new Error(\"Cloud list repository files response included an invalid file type.\");\n }\n return { path: requireString(file.path, \"path\"), type: type as \"file\" | \"directory\" };\n })\n : [];\n return { files, ref: requireString(record.ref, \"ref\") };\n },\n\n create: async (\n repositoryId: string,\n params: CreateRepositoryFileParams,\n ): Promise<RepositoryFileMutationResult> => toFileMutation(await this.request(\n `/v1/repositories/${encodeURIComponent(repositoryId)}/files`,\n \"POST\",\n { path: params.path, content: params.content },\n \"Cloud create repository file\",\n )),\n\n read: async (repositoryId: string, params: { path: string; ref?: string }): Promise<RepositoryFile> => {\n const url = this.url(`/v1/repositories/${encodeURIComponent(repositoryId)}/files/content`);\n url.searchParams.set(\"path\", params.path);\n addOptionalSearchParam(url, \"ref\", params.ref);\n const body = await this.requestUrl(url, \"GET\", undefined, \"Cloud read repository file\");\n if (!body || typeof body !== \"object\") {\n throw new Error(\"Cloud read repository file response did not include file content.\");\n }\n const record = body as Record<string, unknown>;\n return {\n path: requireString(record.path, \"path\"),\n content: requireString(record.content, \"content\"),\n contentSha256: requireString(record.content_sha256, \"content_sha256\"),\n ref: optionalString(record.ref),\n };\n },\n\n update: async (\n repositoryId: string,\n params: UpdateRepositoryFileParams,\n ): Promise<RepositoryFileMutationResult> => toFileMutation(await this.request(\n `/v1/repositories/${encodeURIComponent(repositoryId)}/files/content`,\n \"POST\",\n {\n path: params.path,\n ...(params.content !== undefined ? { content: params.content } : {}),\n ...(params.newPath !== undefined ? { new_path: params.newPath } : {}),\n ...(params.precondition !== undefined\n ? {\n precondition: {\n type: \"content_sha256\",\n content_sha256: params.precondition.contentSha256,\n },\n }\n : {}),\n },\n \"Cloud update repository file\",\n )),\n\n delete: async (\n repositoryId: string,\n params: DeleteRepositoryFileParams,\n ): Promise<DeleteRepositoryFileResult> => {\n const body = await this.request(\n `/v1/repositories/${encodeURIComponent(repositoryId)}/files/content`,\n \"DELETE\",\n { path: params.path },\n \"Cloud delete repository file\",\n );\n if (!body || typeof body !== \"object\") {\n throw new Error(\"Cloud delete repository file response did not include delete details.\");\n }\n const record = body as Record<string, unknown>;\n return { success: record.success === true, commitSha: requireString(record.commit_sha, \"commit_sha\") };\n },\n };\n\n readonly versions = {\n list: async (\n repositoryId: string,\n params: ListRepositoryVersionsParams = {},\n ): Promise<RepositoryVersion[]> => {\n const url = this.url(`/v1/repositories/${encodeURIComponent(repositoryId)}/versions`);\n addOptionalSearchParam(url, \"path\", params.path);\n addOptionalSearchParam(url, \"limit\", params.limit);\n const body = await this.requestUrl(url, \"GET\", undefined, \"Cloud list repository versions\");\n if (Array.isArray(body)) return body as RepositoryVersion[];\n if (body && typeof body === \"object\") {\n const record = body as Record<string, unknown>;\n if (Array.isArray(record.commits)) return record.commits as RepositoryVersion[];\n if (Array.isArray(record.versions)) return record.versions as RepositoryVersion[];\n }\n return [];\n },\n\n get: async (\n repositoryId: string,\n sha: string,\n params: GetRepositoryVersionParams,\n ): Promise<RepositoryFile> => {\n const url = this.url(`/v1/repositories/${encodeURIComponent(repositoryId)}/versions/${encodeURIComponent(sha)}`);\n url.searchParams.set(\"path\", params.path);\n const body = await this.requestUrl(url, \"GET\", undefined, \"Cloud get repository version\");\n if (!body || typeof body !== \"object\") {\n throw new Error(\"Cloud get repository version response did not include file content.\");\n }\n const record = body as Record<string, unknown>;\n return {\n path: requireString(record.path, \"path\"),\n content: requireString(record.content, \"content\"),\n contentSha256: requireString(record.content_sha256, \"content_sha256\"),\n ref: requireString(record.sha, \"sha\"),\n };\n },\n };\n\n private url(path: string): URL {\n return new URL(`${normalizeCloudApiBaseUrl(this.options.apiBaseUrl)}${path}`);\n }\n\n private async request(\n path: string,\n method: string,\n body: unknown,\n action: string,\n ): Promise<unknown> {\n return this.requestUrl(this.url(path), method, body, action);\n }\n\n private async requestUrl(\n url: URL,\n method: string,\n body: unknown,\n action: string,\n ): Promise<unknown> {\n const response = await getFetch(this.options.fetch)(url, {\n method,\n headers: cloudHeaders(this.options),\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n const parsed = await parseJsonResponse(response);\n assertOkResponse(response, parsed, action);\n return parsed;\n }\n}\n",
9
- "// src/app-server-client.ts\nvar DEFAULT_REQUEST_TIMEOUT_MS = 30000;\nvar WEBSOCKET_OPEN_STATE = 1;\nfunction getGlobalWebSocket() {\n return globalThis.WebSocket;\n}\nfunction normalizeBaseUrl(url) {\n const parsed = new URL(url);\n if (parsed.protocol === \"http:\")\n parsed.protocol = \"ws:\";\n if (parsed.protocol === \"https:\")\n parsed.protocol = \"wss:\";\n if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new Error(`Unsupported app-server URL protocol: ${parsed.protocol}`);\n }\n if (!parsed.pathname || parsed.pathname === \"/\") {\n parsed.pathname = \"/ws\";\n }\n return parsed;\n}\nfunction resolveAppServerChannelUrl(url, channel) {\n const parsed = normalizeBaseUrl(url);\n parsed.searchParams.set(\"channel\", channel);\n return parsed.toString();\n}\nfunction attachSocketListener(socket, type, listener) {\n if (socket.addEventListener && socket.removeEventListener) {\n socket.addEventListener(type, listener);\n return () => socket.removeEventListener?.(type, listener);\n }\n if (socket.on) {\n socket.on(type, listener);\n return () => socket.off?.(type, listener);\n }\n throw new Error(\"WebSocket implementation does not support event listeners\");\n}\nfunction onceSocketEvent(socket, type, listener) {\n if (socket.once) {\n socket.once(type, listener);\n return () => socket.off?.(type, listener);\n }\n let detach = () => {};\n detach = attachSocketListener(socket, type, (event) => {\n detach();\n listener(event);\n });\n return detach;\n}\nfunction waitForSocketOpen(socket) {\n if (socket.readyState === WEBSOCKET_OPEN_STATE) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n let detachOpen = () => {};\n let detachError = () => {};\n const cleanup = () => {\n detachOpen();\n detachError();\n };\n detachOpen = onceSocketEvent(socket, \"open\", () => {\n cleanup();\n resolve();\n });\n detachError = onceSocketEvent(socket, \"error\", (event) => {\n cleanup();\n reject(new Error(`App-server WebSocket failed to open: ${String(event)}`));\n });\n });\n}\nfunction rawEventData(event) {\n if (event && typeof event === \"object\" && \"data\" in event) {\n return event.data;\n }\n return event;\n}\nfunction messageDataToString(data) {\n const raw = rawEventData(data);\n if (typeof raw === \"string\")\n return raw;\n if (raw instanceof ArrayBuffer) {\n return new TextDecoder().decode(raw);\n }\n if (raw instanceof Uint8Array) {\n return new TextDecoder().decode(raw);\n }\n if (ArrayBuffer.isView(raw)) {\n return new TextDecoder().decode(new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength));\n }\n return String(raw);\n}\nfunction parseProtocolMessage(event) {\n return JSON.parse(messageDataToString(event));\n}\nfunction appServerSocketOptions(authToken) {\n if (authToken === undefined) {\n return;\n }\n const token = authToken.trim();\n if (!token) {\n throw new Error(\"app-server auth token must not be empty\");\n }\n return { headers: { Authorization: `Bearer ${token}` } };\n}\nfunction sameRuntime(a, b) {\n return a?.agent_id === b.agent_id && a?.conversation_id === b.conversation_id;\n}\nfunction isWaitingLoopStatus(message) {\n return message.loop_status.status === \"WAITING_ON_INPUT\";\n}\nfunction isWaitingOnApprovalLoopStatus(message) {\n return message.loop_status.status === \"WAITING_ON_APPROVAL\";\n}\nfunction streamDeltaRunId(message) {\n const runId = message.delta.run_id;\n return typeof runId === \"string\" ? runId : null;\n}\nfunction streamDeltaMessageType(message) {\n const messageType = message.delta.message_type;\n return typeof messageType === \"string\" ? messageType : null;\n}\nfunction streamDeltaStopReason(message) {\n const stopReason = message.delta.stop_reason;\n return typeof stopReason === \"string\" ? stopReason : null;\n}\nfunction streamDeltaErrorMessage(message) {\n const delta = message.delta;\n const apiMessage = delta.api_error?.message ?? delta.api_error?.detail;\n if (typeof apiMessage === \"string\" && apiMessage.length > 0)\n return apiMessage;\n if (typeof delta.message === \"string\" && delta.message.length > 0)\n return delta.message;\n return \"App-server turn failed\";\n}\n\nclass AppServerClient {\n control;\n stream;\n requestTimeoutMs;\n pending = new Map;\n messageHandlers = new Set;\n sendHandlers = new Set;\n activeTurnRuntimes = new Set;\n nextRequestNumber = 0;\n constructor(options) {\n const WebSocket = options.WebSocket ?? getGlobalWebSocket();\n if (!WebSocket) {\n throw new Error(\"No WebSocket implementation available\");\n }\n this.requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const socketOptions = appServerSocketOptions(options.authToken);\n this.control = new WebSocket(resolveAppServerChannelUrl(options.url, \"control\"), socketOptions);\n this.stream = new WebSocket(resolveAppServerChannelUrl(options.url, \"stream\"), socketOptions);\n attachSocketListener(this.control, \"message\", (event) => {\n this.handleMessage(event, \"control\");\n });\n attachSocketListener(this.stream, \"message\", (event) => {\n this.handleMessage(event, \"stream\");\n });\n const rejectPending = () => this.rejectAllPending(\"App-server socket closed\");\n attachSocketListener(this.control, \"close\", rejectPending);\n attachSocketListener(this.stream, \"close\", rejectPending);\n }\n async connect() {\n await Promise.all([\n waitForSocketOpen(this.control),\n waitForSocketOpen(this.stream)\n ]);\n return this;\n }\n close() {\n this.rejectAllPending(\"App-server client closed\");\n this.control.close();\n this.stream.close();\n }\n onMessage(handler) {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n onSend(handler) {\n this.sendHandlers.add(handler);\n return () => this.sendHandlers.delete(handler);\n }\n nextRequestId(prefix = \"req\") {\n this.nextRequestNumber += 1;\n return `${prefix}-${this.nextRequestNumber}`;\n }\n send(command) {\n for (const handler of this.sendHandlers) {\n handler(command);\n }\n this.control.send(JSON.stringify(command));\n }\n request(commandOrType, bodyOrOptions = {}, maybeOptions = {}) {\n const isTypeRequest = typeof commandOrType === \"string\";\n const command = isTypeRequest ? {\n type: commandOrType,\n request_id: bodyOrOptions.request_id ?? this.nextRequestId(commandOrType),\n ...bodyOrOptions\n } : commandOrType;\n const options = isTypeRequest ? maybeOptions : bodyOrOptions;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(command.request_id);\n reject(new Error(`Timed out waiting for ${command.request_id}`));\n }, timeoutMs);\n this.pending.set(command.request_id, {\n resolve: (message) => resolve(message),\n reject,\n predicate: options.predicate,\n timeout\n });\n try {\n this.send(command);\n } catch (error) {\n clearTimeout(timeout);\n this.pending.delete(command.request_id);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n runtimeStart(command, options = {}) {\n return this.request({\n type: \"runtime_start\",\n request_id: command.request_id ?? this.nextRequestId(\"runtime-start\"),\n ...command\n }, {\n ...options,\n predicate: (message) => message.type === \"runtime_start_response\"\n });\n }\n sync(command, options = {}) {\n return this.request({\n type: \"sync\",\n request_id: command.request_id ?? this.nextRequestId(\"sync\"),\n ...command\n }, {\n ...options,\n predicate: (message) => message.type === \"sync_response\"\n });\n }\n abort(command, options = {}) {\n return this.request({\n type: \"abort_message\",\n request_id: command.request_id ?? this.nextRequestId(\"abort\"),\n ...command\n }, {\n ...options,\n predicate: (message) => message.type === \"abort_message_response\"\n });\n }\n onExternalToolCall(handler) {\n return this.onMessage((message, channel) => {\n if (channel !== \"control\" || message.type !== \"external_tool_call_request\") {\n return;\n }\n Promise.resolve(handler(message)).then((result) => {\n this.send({\n type: \"external_tool_call_response\",\n request_id: message.request_id,\n result\n });\n }).catch((error) => {\n this.send({\n type: \"external_tool_call_response\",\n request_id: message.request_id,\n error: error instanceof Error ? error.message : String(error)\n });\n });\n });\n }\n input(command) {\n this.send({ type: \"input\", ...command });\n }\n runTurn(command, options = {}) {\n const runtimeKey = `${command.runtime.agent_id}/${command.runtime.conversation_id}`;\n if (this.activeTurnRuntimes.has(runtimeKey)) {\n return Promise.reject(new Error(`A turn is already in flight for ${runtimeKey}`));\n }\n this.activeTurnRuntimes.add(runtimeKey);\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n const commandWithIds = this.withClientMessageIds(command);\n const runIds = new Set;\n let observedTurnEvidence = false;\n let observedRequiresApprovalStop = false;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(`Timed out waiting for app-server turn on ${command.runtime.agent_id}/${command.runtime.conversation_id}`));\n }, timeoutMs);\n const cleanup = () => {\n clearTimeout(timeout);\n this.activeTurnRuntimes.delete(runtimeKey);\n offMessage();\n };\n const finish = (completedBy, terminalMessage, stopReason) => {\n cleanup();\n resolve({\n runtime: command.runtime,\n stopReason,\n runIds: [...runIds],\n clientMessageIds: commandWithIds.clientMessageIds,\n completedBy,\n terminalMessage\n });\n };\n const fail = (error) => {\n cleanup();\n reject(error);\n };\n const offMessage = this.onMessage((message) => {\n if (!sameRuntime(message.runtime, command.runtime)) {\n return;\n }\n if (message.type === \"stream_delta\") {\n observedTurnEvidence = true;\n const runId = streamDeltaRunId(message);\n if (runId)\n runIds.add(runId);\n const messageType = streamDeltaMessageType(message);\n if (messageType === \"loop_error\" || messageType === \"error_message\") {\n fail(new Error(streamDeltaErrorMessage(message)));\n return;\n }\n if (messageType === \"stop_reason\") {\n const stopReason = streamDeltaStopReason(message);\n if (stopReason === \"requires_approval\") {\n observedRequiresApprovalStop = true;\n return;\n }\n finish(\"stop_reason\", message, stopReason);\n }\n return;\n }\n if (message.type === \"update_loop_status\") {\n const hadTurnEvidenceBeforeLoopStatus = observedTurnEvidence || observedRequiresApprovalStop;\n if (!hadTurnEvidenceBeforeLoopStatus && (isWaitingOnApprovalLoopStatus(message) || options.allowLoopStatusFallback === true && isWaitingLoopStatus(message))) {\n return;\n }\n for (const runId of message.loop_status.active_run_ids) {\n observedTurnEvidence = true;\n runIds.add(runId);\n }\n if (hadTurnEvidenceBeforeLoopStatus && isWaitingOnApprovalLoopStatus(message)) {\n finish(\"loop_status_waiting_on_approval\", message, \"requires_approval\");\n return;\n }\n if (options.allowLoopStatusFallback === true && hadTurnEvidenceBeforeLoopStatus && isWaitingLoopStatus(message)) {\n finish(\"loop_status_waiting_fallback\", message, null);\n }\n }\n });\n try {\n this.input(commandWithIds.command);\n } catch (error) {\n fail(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n withClientMessageIds(command) {\n if (command.payload.kind !== \"create_message\") {\n return { command, clientMessageIds: [] };\n }\n const clientMessageIds = [];\n const messages = command.payload.messages.map((message) => {\n if (message.role !== \"user\")\n return message;\n const existing = message.client_message_id;\n const clientMessageId = typeof existing === \"string\" && existing.length > 0 ? existing : this.nextRequestId(\"client-message\");\n clientMessageIds.push(clientMessageId);\n return { ...message, client_message_id: clientMessageId };\n });\n return {\n command: {\n ...command,\n payload: { ...command.payload, messages }\n },\n clientMessageIds\n };\n }\n handleMessage(event, channel) {\n const message = parseProtocolMessage(event);\n for (const handler of this.messageHandlers) {\n handler(message, channel);\n }\n const requestId = message && typeof message === \"object\" && \"request_id\" in message ? message.request_id : undefined;\n if (channel !== \"control\" || typeof requestId !== \"string\") {\n return;\n }\n const pending = this.pending.get(requestId);\n if (!pending || pending.predicate && !pending.predicate(message)) {\n return;\n }\n clearTimeout(pending.timeout);\n this.pending.delete(requestId);\n pending.resolve(message);\n }\n rejectAllPending(reason) {\n for (const [requestId, pending] of this.pending) {\n clearTimeout(pending.timeout);\n this.pending.delete(requestId);\n pending.reject(new Error(reason));\n }\n }\n}\nfunction createAppServerClient(options) {\n return new AppServerClient(options);\n}\nexport {\n resolveAppServerChannelUrl,\n createAppServerClient,\n AppServerClient\n};\n\n//# debugId=2626B1D6D5898D3F64756E2164756E21\n",
10
+ "// src/app-server-client.ts\nvar DEFAULT_REQUEST_TIMEOUT_MS = 30000;\nvar WEBSOCKET_OPEN_STATE = 1;\nfunction getGlobalWebSocket() {\n return globalThis.WebSocket;\n}\nfunction normalizeBaseUrl(url) {\n const parsed = new URL(url);\n if (parsed.protocol === \"http:\")\n parsed.protocol = \"ws:\";\n if (parsed.protocol === \"https:\")\n parsed.protocol = \"wss:\";\n if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new Error(`Unsupported app-server URL protocol: ${parsed.protocol}`);\n }\n if (!parsed.pathname || parsed.pathname === \"/\") {\n parsed.pathname = \"/ws\";\n }\n return parsed;\n}\nfunction resolveAppServerChannelUrl(url, channel) {\n const parsed = normalizeBaseUrl(url);\n parsed.searchParams.set(\"channel\", channel);\n return parsed.toString();\n}\nfunction attachSocketListener(socket, type, listener) {\n if (socket.addEventListener && socket.removeEventListener) {\n socket.addEventListener(type, listener);\n return () => socket.removeEventListener?.(type, listener);\n }\n if (socket.on) {\n socket.on(type, listener);\n return () => socket.off?.(type, listener);\n }\n throw new Error(\"WebSocket implementation does not support event listeners\");\n}\nfunction onceSocketEvent(socket, type, listener) {\n if (socket.once) {\n socket.once(type, listener);\n return () => socket.off?.(type, listener);\n }\n let detach = () => {};\n detach = attachSocketListener(socket, type, (event) => {\n detach();\n listener(event);\n });\n return detach;\n}\nfunction waitForSocketOpen(socket) {\n if (socket.readyState === WEBSOCKET_OPEN_STATE) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n let detachOpen = () => {};\n let detachError = () => {};\n const cleanup = () => {\n detachOpen();\n detachError();\n };\n detachOpen = onceSocketEvent(socket, \"open\", () => {\n cleanup();\n resolve();\n });\n detachError = onceSocketEvent(socket, \"error\", (event) => {\n cleanup();\n reject(new Error(`App-server WebSocket failed to open: ${String(event)}`));\n });\n });\n}\nfunction rawEventData(event) {\n if (event && typeof event === \"object\" && \"data\" in event) {\n return event.data;\n }\n return event;\n}\nfunction messageDataToString(data) {\n const raw = rawEventData(data);\n if (typeof raw === \"string\")\n return raw;\n if (raw instanceof ArrayBuffer) {\n return new TextDecoder().decode(raw);\n }\n if (raw instanceof Uint8Array) {\n return new TextDecoder().decode(raw);\n }\n if (ArrayBuffer.isView(raw)) {\n return new TextDecoder().decode(new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength));\n }\n return String(raw);\n}\nfunction parseProtocolMessage(event) {\n return JSON.parse(messageDataToString(event));\n}\nfunction appServerSocketOptions(authToken) {\n if (authToken === undefined) {\n return;\n }\n const token = authToken.trim();\n if (!token) {\n throw new Error(\"app-server auth token must not be empty\");\n }\n return { headers: { Authorization: `Bearer ${token}` } };\n}\nfunction sameRuntime(a, b) {\n return a?.agent_id === b.agent_id && a?.conversation_id === b.conversation_id;\n}\nfunction isWaitingLoopStatus(message) {\n return message.loop_status.status === \"WAITING_ON_INPUT\";\n}\nfunction isWaitingOnApprovalLoopStatus(message) {\n return message.loop_status.status === \"WAITING_ON_APPROVAL\";\n}\nfunction streamDeltaRunId(message) {\n const runId = message.delta.run_id;\n return typeof runId === \"string\" ? runId : null;\n}\nfunction streamDeltaMessageType(message) {\n const messageType = message.delta.message_type;\n return typeof messageType === \"string\" ? messageType : null;\n}\nfunction streamDeltaStopReason(message) {\n const stopReason = message.delta.stop_reason;\n return typeof stopReason === \"string\" ? stopReason : null;\n}\nfunction streamDeltaErrorMessage(message) {\n const delta = message.delta;\n const apiMessage = delta.api_error?.message ?? delta.api_error?.detail;\n if (typeof apiMessage === \"string\" && apiMessage.length > 0)\n return apiMessage;\n if (typeof delta.message === \"string\" && delta.message.length > 0)\n return delta.message;\n return \"App-server turn failed\";\n}\n\nclass AppServerClient {\n control;\n stream;\n requestTimeoutMs;\n pending = new Map;\n messageHandlers = new Set;\n sendHandlers = new Set;\n disconnectHandlers = new Set;\n activeTurnRuntimes = new Set;\n explicitlyClosed = false;\n disconnectNotified = false;\n nextRequestNumber = 0;\n constructor(options) {\n const WebSocket = options.WebSocket ?? getGlobalWebSocket();\n if (!WebSocket) {\n throw new Error(\"No WebSocket implementation available\");\n }\n this.requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const socketOptions = appServerSocketOptions(options.authToken);\n this.control = new WebSocket(resolveAppServerChannelUrl(options.url, \"control\"), socketOptions);\n this.stream = new WebSocket(resolveAppServerChannelUrl(options.url, \"stream\"), socketOptions);\n attachSocketListener(this.control, \"message\", (event) => {\n this.handleMessage(event, \"control\");\n });\n attachSocketListener(this.stream, \"message\", (event) => {\n this.handleMessage(event, \"stream\");\n });\n attachSocketListener(this.control, \"close\", (event) => {\n this.handleDisconnect(\"control\", event);\n });\n attachSocketListener(this.stream, \"close\", (event) => {\n this.handleDisconnect(\"stream\", event);\n });\n }\n async connect() {\n await Promise.all([\n waitForSocketOpen(this.control),\n waitForSocketOpen(this.stream)\n ]);\n return this;\n }\n close() {\n if (this.explicitlyClosed)\n return;\n this.explicitlyClosed = true;\n this.rejectAllPending(\"App-server client closed\");\n this.control.close();\n this.stream.close();\n }\n onMessage(handler) {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n onSend(handler) {\n this.sendHandlers.add(handler);\n return () => this.sendHandlers.delete(handler);\n }\n onDisconnect(handler) {\n this.disconnectHandlers.add(handler);\n return () => this.disconnectHandlers.delete(handler);\n }\n nextRequestId(prefix = \"req\") {\n this.nextRequestNumber += 1;\n return `${prefix}-${this.nextRequestNumber}`;\n }\n send(command) {\n for (const handler of this.sendHandlers) {\n handler(command);\n }\n this.control.send(JSON.stringify(command));\n }\n request(commandOrType, bodyOrOptions = {}, maybeOptions = {}) {\n const isTypeRequest = typeof commandOrType === \"string\";\n const command = isTypeRequest ? {\n type: commandOrType,\n request_id: bodyOrOptions.request_id ?? this.nextRequestId(commandOrType),\n ...bodyOrOptions\n } : commandOrType;\n const options = isTypeRequest ? maybeOptions : bodyOrOptions;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(command.request_id);\n reject(new Error(`Timed out waiting for ${command.request_id}`));\n }, timeoutMs);\n this.pending.set(command.request_id, {\n resolve: (message) => resolve(message),\n reject,\n predicate: options.predicate,\n timeout\n });\n try {\n this.send(command);\n } catch (error) {\n clearTimeout(timeout);\n this.pending.delete(command.request_id);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n runtimeStart(command, options = {}) {\n return this.request({\n type: \"runtime_start\",\n request_id: command.request_id ?? this.nextRequestId(\"runtime-start\"),\n ...command\n }, {\n ...options,\n predicate: (message) => message.type === \"runtime_start_response\"\n });\n }\n sync(command, options = {}) {\n return this.request({\n type: \"sync\",\n request_id: command.request_id ?? this.nextRequestId(\"sync\"),\n ...command\n }, {\n ...options,\n predicate: (message) => message.type === \"sync_response\"\n });\n }\n abort(command, options = {}) {\n return this.request({\n type: \"abort_message\",\n request_id: command.request_id ?? this.nextRequestId(\"abort\"),\n ...command\n }, {\n ...options,\n predicate: (message) => message.type === \"abort_message_response\"\n });\n }\n conversationList(command = {}, options = {}) {\n return this.request({\n type: \"conversation_list\",\n request_id: command.request_id ?? this.nextRequestId(\"conversation-list\"),\n ...command\n }, {\n ...options,\n predicate: (message) => message.type === \"conversation_list_response\"\n });\n }\n onExternalToolCall(handler) {\n return this.onMessage((message, channel) => {\n if (channel !== \"control\" || message.type !== \"external_tool_call_request\") {\n return;\n }\n Promise.resolve(handler(message)).then((result) => {\n this.send({\n type: \"external_tool_call_response\",\n request_id: message.request_id,\n result\n });\n }).catch((error) => {\n this.send({\n type: \"external_tool_call_response\",\n request_id: message.request_id,\n error: error instanceof Error ? error.message : String(error)\n });\n });\n });\n }\n input(command) {\n this.send({ type: \"input\", ...command });\n }\n runTurn(command, options = {}) {\n const runtimeKey = `${command.runtime.agent_id}/${command.runtime.conversation_id}`;\n if (this.activeTurnRuntimes.has(runtimeKey)) {\n return Promise.reject(new Error(`A turn is already in flight for ${runtimeKey}`));\n }\n this.activeTurnRuntimes.add(runtimeKey);\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n const commandWithIds = this.withClientMessageIds(command);\n const runIds = new Set;\n let observedTurnEvidence = false;\n let observedRequiresApprovalStop = false;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(`Timed out waiting for app-server turn on ${command.runtime.agent_id}/${command.runtime.conversation_id}`));\n }, timeoutMs);\n const cleanup = () => {\n clearTimeout(timeout);\n this.activeTurnRuntimes.delete(runtimeKey);\n offMessage();\n };\n const finish = (completedBy, terminalMessage, stopReason) => {\n cleanup();\n resolve({\n runtime: command.runtime,\n stopReason,\n runIds: [...runIds],\n clientMessageIds: commandWithIds.clientMessageIds,\n completedBy,\n terminalMessage\n });\n };\n const fail = (error) => {\n cleanup();\n reject(error);\n };\n const offMessage = this.onMessage((message) => {\n if (!sameRuntime(message.runtime, command.runtime)) {\n return;\n }\n if (message.type === \"stream_delta\") {\n observedTurnEvidence = true;\n const runId = streamDeltaRunId(message);\n if (runId)\n runIds.add(runId);\n const messageType = streamDeltaMessageType(message);\n if (messageType === \"loop_error\" || messageType === \"error_message\") {\n fail(new Error(streamDeltaErrorMessage(message)));\n return;\n }\n if (messageType === \"stop_reason\") {\n const stopReason = streamDeltaStopReason(message);\n if (stopReason === \"requires_approval\") {\n observedRequiresApprovalStop = true;\n return;\n }\n finish(\"stop_reason\", message, stopReason);\n }\n return;\n }\n if (message.type === \"update_loop_status\") {\n const hadTurnEvidenceBeforeLoopStatus = observedTurnEvidence || observedRequiresApprovalStop;\n if (!hadTurnEvidenceBeforeLoopStatus && (isWaitingOnApprovalLoopStatus(message) || options.allowLoopStatusFallback === true && isWaitingLoopStatus(message))) {\n return;\n }\n for (const runId of message.loop_status.active_run_ids) {\n observedTurnEvidence = true;\n runIds.add(runId);\n }\n if (hadTurnEvidenceBeforeLoopStatus && isWaitingOnApprovalLoopStatus(message)) {\n finish(\"loop_status_waiting_on_approval\", message, \"requires_approval\");\n return;\n }\n if (options.allowLoopStatusFallback === true && hadTurnEvidenceBeforeLoopStatus && isWaitingLoopStatus(message)) {\n finish(\"loop_status_waiting_fallback\", message, null);\n }\n }\n });\n try {\n this.input(commandWithIds.command);\n } catch (error) {\n fail(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n withClientMessageIds(command) {\n if (command.payload.kind !== \"create_message\") {\n return { command, clientMessageIds: [] };\n }\n const clientMessageIds = [];\n const messages = command.payload.messages.map((message) => {\n if (message.role !== \"user\")\n return message;\n const existing = message.client_message_id;\n const clientMessageId = typeof existing === \"string\" && existing.length > 0 ? existing : this.nextRequestId(\"client-message\");\n clientMessageIds.push(clientMessageId);\n return { ...message, client_message_id: clientMessageId };\n });\n return {\n command: {\n ...command,\n payload: { ...command.payload, messages }\n },\n clientMessageIds\n };\n }\n handleMessage(event, channel) {\n const message = parseProtocolMessage(event);\n for (const handler of this.messageHandlers) {\n handler(message, channel);\n }\n const requestId = message && typeof message === \"object\" && \"request_id\" in message ? message.request_id : undefined;\n if (channel !== \"control\" || typeof requestId !== \"string\") {\n return;\n }\n const pending = this.pending.get(requestId);\n if (!pending || pending.predicate && !pending.predicate(message)) {\n return;\n }\n clearTimeout(pending.timeout);\n this.pending.delete(requestId);\n pending.resolve(message);\n }\n rejectAllPending(reason) {\n for (const [requestId, pending] of this.pending) {\n clearTimeout(pending.timeout);\n this.pending.delete(requestId);\n pending.reject(new Error(reason));\n }\n }\n handleDisconnect(channel, event) {\n this.rejectAllPending(\"App-server socket closed\");\n if (this.explicitlyClosed || this.disconnectNotified)\n return;\n this.disconnectNotified = true;\n for (const handler of this.disconnectHandlers) {\n handler({ channel, event });\n }\n }\n}\nfunction createAppServerClient(options) {\n return new AppServerClient(options);\n}\nexport {\n resolveAppServerChannelUrl,\n createAppServerClient,\n AppServerClient\n};\n\n//# debugId=B185C8697A26493664756E2164756E21\n",
10
11
  "import { spawn, type ChildProcess } from \"node:child_process\";\nimport { findLettaCli } from \"./cli-resolver.js\";\n\nexport interface LocalAppServerHandle {\n url: string;\n close(): void;\n}\n\nexport interface StartLocalAppServerOptions {\n listen?: string;\n backend?: string;\n startupTimeoutMs?: number;\n cliPath?: string;\n env?: Record<string, string | undefined>;\n}\n\nconst DEFAULT_LISTEN_URL = \"ws://127.0.0.1:0\";\nconst DEFAULT_STARTUP_TIMEOUT_MS = 30_000;\nconst LISTENING_RE = /^Listening on\\s+(ws:\\/\\/\\S+)\\s*$/m;\n\nfunction appendLine(buffer: string, chunk: unknown): string {\n return buffer + String(chunk);\n}\n\nfunction tryExtractListeningUrl(output: string): string | null {\n const match = output.match(LISTENING_RE);\n return match?.[1] ?? null;\n}\n\nexport function buildLocalAppServerArgs(\n cliPath: string,\n options: Pick<StartLocalAppServerOptions, \"backend\" | \"listen\"> = {},\n): string[] {\n return [\n cliPath,\n ...(options.backend !== undefined ? [\"--backend\", options.backend] : []),\n \"app-server\",\n \"--listen\",\n options.listen ?? DEFAULT_LISTEN_URL,\n ];\n}\n\nfunction terminateProcess(child: ChildProcess): void {\n if (child.exitCode !== null || child.signalCode !== null) return;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (child.exitCode === null && child.signalCode === null) {\n child.kill(\"SIGKILL\");\n }\n }, 1_000).unref?.();\n}\n\n/**\n * Spawn an SDK-owned Letta Code app-server on an ephemeral loopback port.\n */\nexport function startLocalAppServer(\n options: StartLocalAppServerOptions = {},\n): Promise<LocalAppServerHandle> {\n const cliPath = options.cliPath ?? findLettaCli();\n const args = buildLocalAppServerArgs(cliPath, options);\n const startupTimeoutMs = options.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...(options.env ?? {}) },\n });\n\n let settled = false;\n let output = \"\";\n\n const cleanup = () => {\n child.stdout?.off(\"data\", onStdout);\n child.stderr?.off(\"data\", onStderr);\n child.off(\"error\", onError);\n child.off(\"exit\", onExit);\n clearTimeout(timeout);\n };\n\n const fail = (error: Error) => {\n if (settled) return;\n settled = true;\n cleanup();\n terminateProcess(child);\n reject(error);\n };\n\n const succeed = (url: string) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve({\n url,\n close: () => terminateProcess(child),\n });\n };\n\n const onOutput = (chunk: unknown) => {\n output = appendLine(output, chunk);\n const url = tryExtractListeningUrl(output);\n if (url) succeed(url);\n };\n\n const onStdout = (chunk: unknown) => onOutput(chunk);\n const onStderr = (chunk: unknown) => {\n // Startup failures are printed to stderr by the CLI. Keep stderr in the\n // collected output so timeout/exit errors are actionable.\n output = appendLine(output, chunk);\n };\n const onError = (error: Error) => fail(error);\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n if (settled) return;\n fail(\n new Error(\n `Local Letta Code app-server exited before listening (code=${code ?? \"null\"}, signal=${signal ?? \"null\"}).${\n output ? ` Output:\\n${output.trim()}` : \"\"\n }`,\n ),\n );\n };\n\n const timeout = setTimeout(() => {\n fail(\n new Error(\n `Timed out waiting for local Letta Code app-server to start.${\n output ? ` Output:\\n${output.trim()}` : \"\"\n }`,\n ),\n );\n }, startupTimeoutMs);\n\n child.stdout?.on(\"data\", onStdout);\n child.stderr?.on(\"data\", onStderr);\n child.once(\"error\", onError);\n child.once(\"exit\", onExit);\n });\n}\n",
11
12
  "import { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst require = createRequire(import.meta.url);\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Resolve the Letta Code CLI entrypoint used by SDK-owned transports.\n *\n * Resolution order intentionally matches the historical subprocess transport:\n * explicit LETTA_CLI_PATH first, then the installed @letta-ai/letta-code package,\n * then local development fallbacks.\n */\nexport function findLettaCli(): string {\n const envPath = process.env.LETTA_CLI_PATH;\n if (envPath && existsSync(envPath)) {\n return envPath;\n }\n\n try {\n return require.resolve(\"@letta-ai/letta-code\");\n } catch {\n // Fall through to local development paths.\n }\n\n const localPaths = [\n join(__dirname, \"..\", \"node_modules\", \"@letta-ai\", \"letta-code\", \"letta.js\"),\n join(__dirname, \"../../@letta-ai/letta-code/letta.js\"),\n join(__dirname, \"../../../letta-code-prod/letta.js\"),\n join(__dirname, \"../../../letta-code/letta.js\"),\n join(__dirname, \"..\", \"..\", \"letta-code\", \"letta.js\"),\n ];\n\n for (const path of localPaths) {\n if (existsSync(path)) {\n return path;\n }\n }\n\n throw new Error(\n \"Could not find Letta Code CLI. Set LETTA_CLI_PATH environment variable or install @letta-ai/letta-code.\",\n );\n}\n",
12
- "import type {\n BootstrapStateOptions,\n BootstrapStateResult,\n CreateAgentOptions,\n LettaCodeClientSessionOptions,\n LettaCodeSession,\n LettaCodeModelEntry,\n ListModelsResult,\n ListMessagesOptions,\n ListMessagesResult,\n MessageContentItem,\n RecoverPendingApprovalsOptions,\n RecoverPendingApprovalsResult,\n ReasoningEffort,\n RunTurnOptions,\n SDKErrorCode,\n SDKInitMessage,\n SDKLoopStatusMessage,\n SDKMessage,\n SDKProtocolCommand,\n SDKProtocolMessage,\n SDKQueueItem,\n SDKQueueUpdateMessage,\n SDKResultMessage,\n SDKStreamEventPayload,\n SendCommandOptions,\n SendMessage,\n UpdateModelOptions,\n UpdateModelResult,\n} from \"./types.js\";\n\nexport type RuntimeScope = {\n agent_id: string;\n conversation_id: string;\n};\n\nexport type ProtocolMessage = Record<string, unknown> & {\n type: string;\n request_id?: string;\n runtime?: RuntimeScope;\n};\n\nexport type RuntimeSessionMode =\n | { kind: \"create-agent\"; options: CreateAgentOptions }\n | {\n kind: \"session\";\n agentId?: string;\n conversationId?: string;\n newConversation?: boolean;\n defaultConversation?: boolean;\n options: LettaCodeClientSessionOptions;\n };\n\nexport type RuntimeTurnResult = {\n runtime: RuntimeScope;\n stopReason: string | null;\n runIds: string[];\n success?: boolean;\n detail?: string;\n errorCode?: SDKErrorCode;\n};\n\nexport type RuntimeSendTurnOptions = {\n clientMessageId: string;\n};\n\nexport type RuntimeRequestOptions = {\n timeoutMs?: number;\n predicate?: (message: ProtocolMessage) => boolean;\n};\n\nexport interface RemoteClientRuntimeController {\n onMessage(handler: (message: ProtocolMessage, channel?: string) => void): () => void;\n send(command: Record<string, unknown>): void;\n sendTurnMessage(\n runtime: RuntimeScope,\n message: SendMessage,\n options: RuntimeSendTurnOptions,\n ): void;\n abort(runtime: RuntimeScope): Promise<void>;\n request(\n type: string,\n body: Record<string, unknown>,\n options?: RuntimeRequestOptions,\n ): Promise<ProtocolMessage>;\n recoverPendingApprovals(\n runtime: RuntimeScope,\n options?: RecoverPendingApprovalsOptions,\n ): Promise<RecoverPendingApprovalsResult>;\n listMessages(\n conversationId: string,\n options?: ListMessagesOptions,\n ): Promise<ListMessagesResult>;\n listModels(): Promise<ListModelsResult>;\n updateModel(\n runtime: RuntimeScope,\n payload: { model_id?: string; model_handle?: string },\n ): Promise<UpdateModelResult>;\n close(): void;\n}\n\nexport type RuntimeSessionInit = {\n controller: RemoteClientRuntimeController;\n runtime: RuntimeScope;\n model?: string | null;\n modelSettings?: Record<string, unknown> | null;\n tools?: string[];\n};\n\ntype RemoteClientSessionCoreConfig = {\n label: string;\n requestTimeoutMs?: number;\n};\n\ntype ReflectionSettings = {\n trigger: \"off\" | \"step-count\" | \"compaction-event\";\n step_count: number;\n};\n\ntype UpdateModelPayload = {\n model_id?: string;\n model_handle?: string;\n};\n\ntype NormalizedUpdateModelInput = {\n model?: string;\n modelId?: string;\n modelHandle?: string;\n reasoningEffort?: ReasoningEffort;\n};\n\ntype TurnTracker = {\n id: number;\n runtime: RuntimeScope;\n clientMessageId: string;\n queuedAt: number;\n startedAt: number;\n assistantText: string;\n runIds: Set<string>;\n observedTurnEvidence: boolean;\n observedRequiresApprovalStop: boolean;\n abortRequested: boolean;\n timeout: ReturnType<typeof setTimeout> | null;\n};\n\nconst FAILURE_STOP_REASONS = new Set([\n \"error\",\n \"llm_api_error\",\n \"max_steps\",\n \"interrupted\",\n \"cancelled\",\n \"canceled\",\n]);\nconst REASONING_EFFORTS = new Set<ReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n]);\nconst KNOWN_SDK_ERROR_CODES = new Set<SDKErrorCode>([\n \"approval_conflict\",\n \"approval_conflict_terminal\",\n \"protocol_error\",\n \"error\",\n \"llm_api_error\",\n \"max_steps\",\n \"interrupted\",\n \"stream_closed\",\n]);\n\nexport function mapPermissionMode(\n mode: LettaCodeClientSessionOptions[\"permissionMode\"],\n): string | undefined {\n if (mode === undefined || mode === \"default\") return undefined;\n if (mode === \"acceptEdits\") return \"acceptEdits\";\n if (mode === \"bypassPermissions\") return \"unrestricted\";\n if (mode === \"plan\") return \"memory\";\n return undefined;\n}\n\nexport function ensureSuccess(message: Record<string, unknown>, fallback: string): void {\n if (message.success === false) {\n throw new Error(typeof message.error === \"string\" ? message.error : fallback);\n }\n}\n\nfunction toSdkErrorCode(value: string | null | undefined): SDKErrorCode | undefined {\n if (!value || value.length === 0) return undefined;\n return KNOWN_SDK_ERROR_CODES.has(value as SDKErrorCode)\n ? (value as SDKErrorCode)\n : undefined;\n}\n\nfunction isReasoningEffort(value: unknown): value is ReasoningEffort {\n return typeof value === \"string\" && REASONING_EFFORTS.has(value as ReasoningEffort);\n}\n\nfunction nonEmptyString(value: unknown, name: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Invalid ${name}. Expected a non-empty string.`);\n }\n return value;\n}\n\nfunction normalizeUpdateModelInput(update: string | UpdateModelOptions): NormalizedUpdateModelInput {\n if (typeof update === \"string\") {\n if (update.length === 0) {\n throw new Error(\"Invalid model. Expected a non-empty string.\");\n }\n return { model: update };\n }\n if (!update || typeof update !== \"object\" || Array.isArray(update)) {\n throw new Error(\"Invalid updateModel options. Expected a model string or options object.\");\n }\n\n const model = nonEmptyString(update.model, \"model\");\n const modelId = nonEmptyString(update.modelId, \"modelId\");\n const modelHandle = nonEmptyString(update.modelHandle, \"modelHandle\");\n const reasoningEffort = update.reasoningEffort;\n if (reasoningEffort !== undefined && !isReasoningEffort(reasoningEffort)) {\n throw new Error(\n `Invalid reasoningEffort '${String(reasoningEffort)}'. Valid values: ${[...REASONING_EFFORTS].join(\", \")}`,\n );\n }\n if (model !== undefined && (modelId !== undefined || modelHandle !== undefined)) {\n throw new Error(\"Invalid updateModel options. Use either model or explicit modelId/modelHandle, not both.\");\n }\n if (\n model === undefined &&\n modelId === undefined &&\n modelHandle === undefined &&\n reasoningEffort === undefined\n ) {\n throw new Error(\"Invalid updateModel options. Provide model, modelId, modelHandle, or reasoningEffort.\");\n }\n return {\n ...(model !== undefined ? { model } : {}),\n ...(modelId !== undefined ? { modelId } : {}),\n ...(modelHandle !== undefined ? { modelHandle } : {}),\n ...(reasoningEffort !== undefined ? { reasoningEffort } : {}),\n };\n}\n\nfunction modelPayloadWithoutReasoning(input: NormalizedUpdateModelInput): UpdateModelPayload {\n const payload: UpdateModelPayload = {};\n if (input.modelId !== undefined) payload.model_id = input.modelId;\n if (input.modelHandle !== undefined) payload.model_handle = input.modelHandle;\n if (input.model !== undefined) {\n if (input.model.includes(\"/\")) payload.model_handle = input.model;\n else payload.model_id = input.model;\n }\n return payload;\n}\n\nfunction toBaseModelHandle(\n handle: string | undefined,\n byokProviderAliases: Record<string, string> | undefined,\n): string | undefined {\n if (!handle) return undefined;\n const slashIndex = handle.indexOf(\"/\");\n if (slashIndex === -1) return handle;\n const provider = handle.slice(0, slashIndex);\n const model = handle.slice(slashIndex + 1);\n const baseProvider = byokProviderAliases?.[provider];\n return baseProvider ? `${baseProvider}/${model}` : handle;\n}\n\nfunction getContextWindow(value: Record<string, unknown> | null | undefined): number | undefined {\n const contextWindow = value?.context_window;\n return typeof contextWindow === \"number\" ? contextWindow : undefined;\n}\n\nfunction getReasoningEffort(entry: LettaCodeModelEntry): string | undefined {\n const effort = entry.updateArgs?.reasoning_effort;\n return typeof effort === \"string\" ? effort : undefined;\n}\n\nfunction sameContextCandidates(\n candidates: LettaCodeModelEntry[],\n contextWindow: number | undefined,\n): LettaCodeModelEntry[] {\n if (contextWindow === undefined) return candidates;\n const matches = candidates.filter(\n (entry) => getContextWindow(entry.updateArgs) === contextWindow,\n );\n return matches.length > 0 ? matches : candidates;\n}\n\nfunction isApprovalConflictSignal(params: {\n detail?: string;\n message?: string;\n stopReason?: string | null;\n}): boolean {\n if (params.stopReason === \"requires_approval\") return true;\n const haystack = [params.detail, params.message]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\")\n .toLowerCase();\n return (\n haystack.includes(\"waiting for approval on a tool call\") ||\n haystack.includes(\"cannot send a new message\") ||\n haystack.includes(\"requires_approval\")\n );\n}\n\nfunction resolveDreamingSettings(\n dreaming: LettaCodeClientSessionOptions[\"dreaming\"],\n): ReflectionSettings | null {\n if (!dreaming) return null;\n return {\n trigger: dreaming.trigger ?? \"step-count\",\n step_count: dreaming.stepCount ?? 5,\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const pieces: string[] = [];\n for (const part of content) {\n if (typeof part === \"string\") {\n pieces.push(part);\n continue;\n }\n if (part && typeof part === \"object\") {\n const record = part as Record<string, unknown>;\n if (typeof record.text === \"string\") {\n pieces.push(record.text);\n }\n }\n }\n const joined = pieces.join(\"\");\n return joined.length > 0 ? joined : null;\n }\n if (content && typeof content === \"object\") {\n const record = content as Record<string, unknown>;\n if (typeof record.text === \"string\") return record.text;\n }\n return null;\n}\n\nfunction toolInputFromArguments(args: unknown): { input: Record<string, unknown>; raw?: string } {\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n return { input: args as Record<string, unknown> };\n }\n const raw = typeof args === \"string\" ? args : \"\";\n if (!raw) return { input: {} };\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return { input: parsed as Record<string, unknown>, raw };\n }\n } catch {\n // Fall through to raw wrapper.\n }\n return { input: { raw }, raw };\n}\n\nfunction firstToolCall(delta: Record<string, unknown>): Record<string, unknown> | undefined {\n const toolCalls = delta.tool_calls;\n if (Array.isArray(toolCalls)) {\n const first = toolCalls[0];\n return first && typeof first === \"object\" ? (first as Record<string, unknown>) : undefined;\n }\n if (toolCalls && typeof toolCalls === \"object\") {\n return toolCalls as Record<string, unknown>;\n }\n const toolCall = delta.tool_call;\n return toolCall && typeof toolCall === \"object\" ? (toolCall as Record<string, unknown>) : undefined;\n}\n\nfunction firstToolReturn(delta: Record<string, unknown>): Record<string, unknown> | undefined {\n const toolReturns = delta.tool_returns;\n if (Array.isArray(toolReturns)) {\n const first = toolReturns[0];\n return first && typeof first === \"object\" ? (first as Record<string, unknown>) : undefined;\n }\n return undefined;\n}\n\nfunction sameRuntime(message: ProtocolMessage, runtime: RuntimeScope): boolean {\n const msgRuntime = message.runtime;\n if (msgRuntime) {\n return (\n msgRuntime.agent_id === runtime.agent_id &&\n msgRuntime.conversation_id === runtime.conversation_id\n );\n }\n const messageAgentId =\n typeof message.agent_id === \"string\"\n ? message.agent_id\n : typeof message.agentId === \"string\"\n ? message.agentId\n : undefined;\n const messageConversationId =\n typeof message.conversation_id === \"string\"\n ? message.conversation_id\n : typeof message.conversationId === \"string\"\n ? message.conversationId\n : undefined;\n\n if (messageAgentId && messageAgentId !== runtime.agent_id) return false;\n if (messageConversationId && messageConversationId !== runtime.conversation_id) return false;\n return true;\n}\n\nfunction streamDeltaRecord(message: ProtocolMessage): Record<string, unknown> | null {\n if (message.type !== \"stream_delta\") return null;\n const delta = message.delta;\n return delta && typeof delta === \"object\" && !Array.isArray(delta)\n ? (delta as Record<string, unknown>)\n : null;\n}\n\nfunction streamDeltaMessageType(delta: Record<string, unknown>): string | undefined {\n return typeof delta.message_type === \"string\" ? delta.message_type : undefined;\n}\n\nfunction streamDeltaRunId(delta: Record<string, unknown>): string | undefined {\n return typeof delta.run_id === \"string\" ? delta.run_id : undefined;\n}\n\nfunction streamDeltaStopReason(delta: Record<string, unknown>): string | null | undefined {\n return typeof delta.stop_reason === \"string\" ? delta.stop_reason : undefined;\n}\n\nfunction loopStatusRecord(message: ProtocolMessage): Record<string, unknown> | null {\n if (message.type !== \"update_loop_status\") return null;\n const loopStatus = message.loop_status;\n return loopStatus && typeof loopStatus === \"object\" && !Array.isArray(loopStatus)\n ? (loopStatus as Record<string, unknown>)\n : null;\n}\n\nfunction loopStatusValue(message: ProtocolMessage): string | undefined {\n const loopStatus = loopStatusRecord(message);\n return typeof loopStatus?.status === \"string\" ? loopStatus.status : undefined;\n}\n\nfunction loopStatusRunIds(message: ProtocolMessage): string[] {\n const activeRunIds = loopStatusRecord(message)?.active_run_ids;\n return Array.isArray(activeRunIds)\n ? activeRunIds.filter((runId): runId is string => typeof runId === \"string\")\n : [];\n}\n\nfunction queueItems(message: ProtocolMessage): SDKQueueItem[] {\n const queue = message.queue;\n if (!Array.isArray(queue)) return [];\n return queue.flatMap((item) => {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return [];\n const record = item as Record<string, unknown>;\n if (typeof record.id !== \"string\") return [];\n return [\n {\n id: record.id,\n clientMessageId:\n typeof record.client_message_id === \"string\" ? record.client_message_id : \"\",\n kind: typeof record.kind === \"string\" ? record.kind : \"message\",\n source: typeof record.source === \"string\" ? record.source : \"user\",\n content: record.content,\n enqueuedAt: typeof record.enqueued_at === \"string\" ? record.enqueued_at : \"\",\n },\n ];\n });\n}\n\nexport function normalizeSendMessage(message: SendMessage): string | MessageContentItem[] {\n return message;\n}\n\nexport abstract class RemoteClientSessionCore implements LettaCodeSession {\n protected controller: RemoteClientRuntimeController | null = null;\n protected runtime: RuntimeScope | null = null;\n protected initialized = false;\n protected closed = false;\n protected activeTurnStartedAt = 0;\n protected _agentId: string | null = null;\n protected _sessionId: string | null = null;\n protected _conversationId: string | null = null;\n protected _model = \"\";\n protected _modelSettings: Record<string, unknown> | null = null;\n\n private readonly label: string;\n private readonly requestTimeoutMs: number | undefined;\n private streamQueue: SDKMessage[] = [];\n private streamResolvers: Array<(msg: SDKMessage | null) => void> = [];\n private removeMessageHandler: (() => void) | null = null;\n private activeTurn: TurnTracker | null = null;\n private pendingTurns: TurnTracker[] = [];\n private nextTurnId = 0;\n private messageCounter = 0;\n private clientMessageCounter = 0;\n private toolNames: string[] | undefined;\n\n protected constructor(\n protected readonly mode: RuntimeSessionMode,\n config: RemoteClientSessionCoreConfig,\n ) {\n this.label = config.label;\n this.requestTimeoutMs = config.requestTimeoutMs;\n }\n\n async initialize(): Promise<SDKInitMessage> {\n if (this.initialized) {\n throw new Error(\"Session already initialized\");\n }\n if (this.closed) {\n throw new Error(\"Session is closed\");\n }\n\n try {\n const init = await this.initializeRuntimeController();\n this.controller = init.controller;\n this.runtime = init.runtime;\n this._agentId = init.runtime.agent_id;\n this._conversationId = init.runtime.conversation_id;\n this._sessionId = `${init.runtime.agent_id}:${init.runtime.conversation_id}`;\n this._modelSettings = init.modelSettings ?? null;\n this._model =\n typeof init.model === \"string\"\n ? init.model\n : typeof this._modelSettings?.model === \"string\"\n ? this._modelSettings.model\n : \"\";\n this.toolNames = init.tools;\n this.removeMessageHandler = this.controller.onMessage(this.handleProtocolMessage);\n this.initialized = true;\n\n await this.afterRuntimeInitialized();\n await this.applyPostInitializeOptions();\n\n const initMessage: SDKInitMessage = {\n type: \"init\",\n agentId: init.runtime.agent_id,\n sessionId: this._sessionId,\n conversationId: init.runtime.conversation_id,\n model: this._model,\n };\n if (this.toolNames !== undefined) initMessage.tools = this.toolNames;\n return initMessage;\n } catch (error) {\n this.close();\n throw error;\n }\n }\n\n async send(message: SendMessage): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n\n await this.beforeTurn();\n\n const turn = this.trackSentTurn(this.runtime);\n try {\n this.controller.sendTurnMessage(this.runtime, message, {\n clientMessageId: turn.clientMessageId,\n });\n } catch (error) {\n this.removeTrackedTurn(turn);\n throw error;\n }\n }\n\n async runTurn(\n message: SendMessage,\n _options: RunTurnOptions = {},\n ): Promise<SDKResultMessage> {\n if (this.activeTurn || this.pendingTurns.length > 0) {\n throw new Error(\n `A turn is already in flight for this ${this.label} session. Use send() and stream() to let the listener queue messages.`,\n );\n }\n await this.send(message);\n for await (const msg of this.stream()) {\n if (msg.type === \"result\") {\n return msg;\n }\n }\n return {\n type: \"result\",\n success: false,\n error: \"stream_closed\",\n errorCode: \"stream_closed\",\n recoverable: false,\n errorDetail: \"Stream ended before terminal result\",\n durationMs: Date.now() - this.activeTurnStartedAt,\n conversationId: this._conversationId,\n };\n }\n\n async *stream(): AsyncGenerator<SDKMessage> {\n while (true) {\n const msg = await this.nextMessage();\n if (!msg) break;\n yield msg;\n if (msg.type === \"result\") break;\n }\n }\n\n async abort(): Promise<void> {\n if (!this.initialized) return;\n if (!this.controller || !this.runtime) return;\n if (this.activeTurn) this.activeTurn.abortRequested = true;\n await this.controller.abort(this.runtime);\n }\n\n async sendCommand(command: SDKProtocolCommand): Promise<void>;\n async sendCommand<TResponse extends SDKProtocolMessage = SDKProtocolMessage>(\n command: SDKProtocolCommand,\n options: SendCommandOptions,\n ): Promise<TResponse>;\n async sendCommand<TResponse extends SDKProtocolMessage = SDKProtocolMessage>(\n command: SDKProtocolCommand,\n options?: SendCommandOptions,\n ): Promise<void | TResponse> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller) {\n throw new Error(\"Session is not initialized\");\n }\n if (!command || typeof command !== \"object\" || Array.isArray(command)) {\n throw new Error(\"Invalid command. Expected a protocol command object.\");\n }\n if (typeof command.type !== \"string\" || command.type.length === 0) {\n throw new Error(\"Invalid command. Expected a non-empty type.\");\n }\n\n if (!options || (!options.responseType && !options.predicate && options.timeoutMs === undefined)) {\n this.controller.send(command);\n return;\n }\n\n const { type, ...body } = command;\n const response = await this.controller.request(type, body, {\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n predicate: options.predicate\n ? (message) => options.predicate?.(message as SDKProtocolMessage) === true\n : options.responseType\n ? (message) => message.type === options.responseType\n : undefined,\n });\n return response as TResponse;\n }\n\n async listModels(): Promise<ListModelsResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller) {\n throw new Error(\"Session is not initialized\");\n }\n return this.controller.listModels();\n }\n\n async updateModel(update: string | UpdateModelOptions): Promise<UpdateModelResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n\n const normalized = normalizeUpdateModelInput(update);\n const payload = await this.resolveUpdateModelPayload(normalized);\n const result = await this.controller.updateModel(this.runtime, payload);\n\n if (result.modelHandle !== undefined) {\n this._model = result.modelHandle;\n } else if (payload.model_handle !== undefined) {\n this._model = payload.model_handle;\n } else if (typeof result.modelSettings?.model === \"string\") {\n this._model = result.modelSettings.model;\n }\n if (\"modelSettings\" in result) {\n this._modelSettings = result.modelSettings ?? null;\n }\n return result;\n }\n\n async recoverPendingApprovals(\n options: RecoverPendingApprovalsOptions = {},\n ): Promise<RecoverPendingApprovalsResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n return this.controller.recoverPendingApprovals(this.runtime, options);\n }\n\n async listMessages(options: ListMessagesOptions = {}): Promise<ListMessagesResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller) {\n throw new Error(\"Session is not initialized\");\n }\n const conversationId = options.conversationId ?? this._conversationId;\n if (!conversationId) {\n throw new Error(\"No conversation id available for listMessages()\");\n }\n return this.controller.listMessages(conversationId, options);\n }\n\n async bootstrapState(\n options: BootstrapStateOptions = {},\n ): Promise<BootstrapStateResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n const page = await this.listMessages({\n limit: options.limit,\n order: options.order,\n });\n\n const state: BootstrapStateResult = {\n agentId: this._agentId ?? \"\",\n conversationId: this._conversationId ?? \"\",\n model: this._model,\n messages: page.messages,\n };\n if (this.toolNames !== undefined) {\n state.tools = this.toolNames;\n }\n if (page.nextBefore !== undefined) {\n state.nextBefore = page.nextBefore;\n }\n if (page.hasMore !== undefined) {\n state.hasMore = page.hasMore;\n }\n return state;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.removeMessageHandler?.();\n this.removeMessageHandler = null;\n if (this.activeTurn?.timeout) clearTimeout(this.activeTurn.timeout);\n for (const turn of this.pendingTurns) {\n if (turn.timeout) clearTimeout(turn.timeout);\n }\n this.activeTurn = null;\n this.pendingTurns.length = 0;\n this.controller?.close();\n this.controller = null;\n this.onCoreClose();\n this.resolveAll(null);\n }\n\n get agentId(): string | null {\n return this._agentId;\n }\n\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n get conversationId(): string | null {\n return this._conversationId;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n }\n\n async changeDeviceState(\n updates: {\n cwd?: string;\n permissionMode?: LettaCodeClientSessionOptions[\"permissionMode\"];\n agentId?: string;\n conversationId?: string;\n },\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n const payload: Record<string, unknown> = {};\n if (updates.cwd !== undefined) payload.cwd = updates.cwd;\n const mode = mapPermissionMode(updates.permissionMode);\n if (mode !== undefined) payload.mode = mode;\n if (updates.agentId !== undefined) payload.agent_id = updates.agentId;\n if (updates.conversationId !== undefined) payload.conversation_id = updates.conversationId;\n\n this.controller.send({\n type: \"change_device_state\",\n runtime: this.runtime,\n payload,\n });\n }\n\n async updateToolset(toolsetPreference: string): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n if (!this.controller || !this.runtime) {\n throw new Error(\"Session is not initialized\");\n }\n const response = await this.controller.request(\n \"update_toolset\",\n {\n runtime: this.runtime,\n toolset_preference: toolsetPreference,\n },\n { predicate: (message) => message.type === \"update_toolset_response\" },\n );\n ensureSuccess(response, \"Failed to update toolset\");\n }\n\n protected abstract initializeRuntimeController(): Promise<RuntimeSessionInit>;\n\n protected async afterRuntimeInitialized(): Promise<void> {\n // Optional hook for subclasses to send transport-specific startup frames.\n }\n\n protected async beforeTurn(): Promise<void> {\n // Optional hook for subclasses to refresh transport-specific lifecycle state.\n }\n\n protected onCoreClose(): void {\n // Optional hook for subclass-owned resources outside the controller.\n }\n\n protected currentOptions(): LettaCodeClientSessionOptions | CreateAgentOptions {\n return this.mode.options;\n }\n\n protected shouldEnableMemfs(options: LettaCodeClientSessionOptions | CreateAgentOptions): boolean {\n void options;\n return false;\n }\n\n protected enableMemfsBody(): Record<string, unknown> {\n if (!this.runtime) return {};\n return { agent_id: this.runtime.agent_id };\n }\n\n protected setModel(model: string): void {\n this._model = model;\n }\n\n private trackSentTurn(runtime: RuntimeScope): TurnTracker {\n const turn: TurnTracker = {\n id: ++this.nextTurnId,\n runtime,\n clientMessageId: `sdk-message-${Date.now()}-${++this.clientMessageCounter}`,\n queuedAt: Date.now(),\n startedAt: 0,\n assistantText: \"\",\n runIds: new Set<string>(),\n observedTurnEvidence: false,\n observedRequiresApprovalStop: false,\n abortRequested: false,\n timeout: null,\n };\n\n if (this.activeTurn) {\n this.pendingTurns.push(turn);\n } else {\n this.activateTurn(turn);\n }\n return turn;\n }\n\n private activateTurn(turn: TurnTracker): void {\n this.activeTurn = turn;\n turn.startedAt = Date.now();\n this.activeTurnStartedAt = turn.startedAt;\n if (this.requestTimeoutMs !== undefined) {\n turn.timeout = setTimeout(() => {\n this.failTurn(turn, `Timed out waiting for ${this.label} turn`);\n }, this.requestTimeoutMs);\n (turn.timeout as { unref?: () => void }).unref?.();\n }\n }\n\n private activateNextTurnFromProtocol(): TurnTracker | null {\n if (this.activeTurn) return this.activeTurn;\n const next = this.pendingTurns.shift();\n if (!next) return null;\n this.activateTurn(next);\n return next;\n }\n\n private removeTrackedTurn(turn: TurnTracker): void {\n if (turn.timeout) clearTimeout(turn.timeout);\n if (this.activeTurn === turn) {\n this.activeTurn = null;\n return;\n }\n const index = this.pendingTurns.indexOf(turn);\n if (index !== -1) this.pendingTurns.splice(index, 1);\n }\n\n private failTurn(turn: TurnTracker, detail: string): void {\n if (this.activeTurn !== turn) return;\n this.enqueue({\n type: \"error\",\n message: detail,\n errorCode: \"error\",\n stopReason: \"error\",\n errorDetail: detail,\n recoverable: false,\n });\n this.completeActiveTurn({\n runtime: turn.runtime,\n stopReason: \"error\",\n runIds: [...turn.runIds],\n success: false,\n detail,\n errorCode: \"error\",\n });\n }\n\n private completeActiveTurn(turn: RuntimeTurnResult): void {\n const active = this.activeTurn;\n if (!active) return;\n if (active.timeout) {\n clearTimeout(active.timeout);\n active.timeout = null;\n }\n this.enqueue(this.resultFromTurn(turn, active));\n this.activeTurn = null;\n }\n\n private async resolveUpdateModelPayload(\n input: NormalizedUpdateModelInput,\n ): Promise<UpdateModelPayload> {\n if (input.reasoningEffort === undefined) {\n return modelPayloadWithoutReasoning(input);\n }\n if (!this.controller) {\n throw new Error(\"Session is not initialized\");\n }\n\n const catalog = await this.controller.listModels();\n const byId = new Map(catalog.entries.map((entry) => [entry.id, entry]));\n const aliases = catalog.byokProviderAliases;\n\n let baseEntry: LettaCodeModelEntry | undefined;\n let explicitHandle: string | undefined;\n let targetHandle: string | undefined;\n\n if (input.modelId !== undefined) {\n baseEntry = byId.get(input.modelId);\n explicitHandle = input.modelHandle;\n targetHandle = baseEntry?.handle ?? toBaseModelHandle(input.modelHandle, aliases);\n } else if (input.modelHandle !== undefined) {\n explicitHandle = input.modelHandle;\n targetHandle = toBaseModelHandle(input.modelHandle, aliases);\n } else if (input.model !== undefined) {\n baseEntry = byId.get(input.model);\n if (baseEntry) {\n targetHandle = baseEntry.handle;\n } else {\n explicitHandle = input.model;\n targetHandle = toBaseModelHandle(input.model, aliases);\n }\n } else {\n explicitHandle = this._model || undefined;\n targetHandle = toBaseModelHandle(this._model || undefined, aliases);\n }\n\n if (!targetHandle) {\n throw new Error(\"reasoningEffort requires a current model or explicit model/modelId/modelHandle.\");\n }\n\n const candidates = catalog.entries.filter(\n (entry) => entry.handle === targetHandle || entry.handle === explicitHandle,\n );\n if (candidates.length === 0) {\n throw new Error(\n `reasoningEffort requires a model from listModels(); no catalog entry found for ${targetHandle}.`,\n );\n }\n\n const contextWindow =\n getContextWindow(baseEntry?.updateArgs) ?? getContextWindow(this._modelSettings);\n const scopedCandidates = sameContextCandidates(candidates, contextWindow);\n const matchingEntry =\n scopedCandidates.find((entry) => getReasoningEffort(entry) === input.reasoningEffort) ??\n candidates.find((entry) => getReasoningEffort(entry) === input.reasoningEffort);\n\n if (!matchingEntry) {\n throw new Error(\n `No ${input.reasoningEffort} reasoning tier found for model ${targetHandle}.`,\n );\n }\n\n const payload: UpdateModelPayload = { model_id: matchingEntry.id };\n if (explicitHandle !== undefined) {\n payload.model_handle = explicitHandle;\n }\n return payload;\n }\n\n protected async applyPostInitializeOptions(): Promise<void> {\n if (!this.controller || !this.runtime) return;\n\n const options = this.currentOptions();\n\n if (this.shouldEnableMemfs(options)) {\n const response = await this.controller.request(\n \"enable_memfs\",\n this.enableMemfsBody(),\n { predicate: (message) => message.type === \"enable_memfs_response\" },\n );\n ensureSuccess(response, \"Failed to enable memfs\");\n }\n\n const dreamingSettings = resolveDreamingSettings(options.dreaming);\n if (dreamingSettings) {\n const response = await this.controller.request(\n \"set_reflection_settings\",\n {\n runtime: this.runtime,\n settings: dreamingSettings,\n scope: \"both\",\n },\n { predicate: (message) => message.type === \"set_reflection_settings_response\" },\n );\n ensureSuccess(response, \"Failed to update dreaming settings\");\n }\n\n if (this.mode.kind !== \"session\") return;\n\n if (\n this.mode.options.model !== undefined ||\n this.mode.options.reasoningEffort !== undefined\n ) {\n await this.updateModel({\n ...(this.mode.options.model !== undefined ? { model: this.mode.options.model } : {}),\n ...(this.mode.options.reasoningEffort !== undefined\n ? { reasoningEffort: this.mode.options.reasoningEffort }\n : {}),\n });\n }\n\n // Initial cwd and permission mode are part of runtime_start for\n // websocket protocol sessions. Reserve change_device_state for explicit\n // post-init mutations via changeDeviceState().\n }\n\n private handleProtocolMessage = (message: ProtocolMessage): void => {\n if (!this.runtime || !sameRuntime(message, this.runtime)) return;\n\n if (message.type === \"update_queue\") {\n const sdkMessage: SDKQueueUpdateMessage = {\n type: \"queue_update\",\n queue: queueItems(message),\n };\n this.enqueue(sdkMessage);\n return;\n }\n\n if (message.type === \"update_loop_status\") {\n this.handleLoopStatusMessage(message);\n return;\n }\n\n const delta = streamDeltaRecord(message);\n if (!delta) return;\n const active = this.activateNextTurnFromProtocol();\n if (active) {\n active.observedTurnEvidence = true;\n const runId = streamDeltaRunId(delta);\n if (runId) active.runIds.add(runId);\n }\n\n const sdkMessage = this.transformStreamDelta(delta);\n if (sdkMessage) {\n this.enqueue(sdkMessage);\n }\n\n this.handleTurnTerminalDelta(delta, sdkMessage);\n };\n\n private handleLoopStatusMessage(message: ProtocolMessage): void {\n const status = loopStatusValue(message);\n if (!status) return;\n const activeRunIds = loopStatusRunIds(message);\n const sdkMessage: SDKLoopStatusMessage = {\n type: \"loop_status\",\n status,\n activeRunIds,\n };\n this.enqueue(sdkMessage);\n\n const active = this.activeTurn;\n if (!active) return;\n for (const runId of activeRunIds) active.runIds.add(runId);\n\n const hadTurnEvidence = active.observedTurnEvidence || active.observedRequiresApprovalStop;\n if (!hadTurnEvidence) return;\n if (status === \"WAITING_ON_APPROVAL\") {\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason: \"requires_approval\",\n runIds: [...active.runIds],\n });\n return;\n }\n if (status === \"WAITING_ON_INPUT\" && active.abortRequested) {\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason: \"interrupted\",\n runIds: [...active.runIds],\n success: false,\n detail: \"Interrupted\",\n errorCode: \"interrupted\",\n });\n return;\n }\n if (status === \"WAITING_ON_INPUT\" && active.observedTurnEvidence) {\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason: null,\n runIds: [...active.runIds],\n });\n }\n }\n\n private handleTurnTerminalDelta(\n delta: Record<string, unknown>,\n sdkMessage: SDKMessage | null,\n ): void {\n const active = this.activeTurn;\n if (!active) return;\n const messageType = streamDeltaMessageType(delta);\n if (messageType === \"stop_reason\") {\n const stopReason = streamDeltaStopReason(delta) ?? null;\n if (stopReason === \"requires_approval\") {\n active.observedRequiresApprovalStop = true;\n return;\n }\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason,\n runIds: [...active.runIds],\n });\n return;\n }\n\n if (sdkMessage?.type === \"error\") {\n this.completeActiveTurn({\n runtime: active.runtime,\n stopReason: sdkMessage.stopReason,\n runIds: [...active.runIds],\n success: false,\n detail: sdkMessage.errorDetail ?? sdkMessage.message,\n errorCode: sdkMessage.errorCode,\n });\n }\n }\n\n private transformStreamDelta(delta: Record<string, unknown>): SDKMessage | null {\n const messageType = typeof delta.message_type === \"string\" ? delta.message_type : undefined;\n const runId = typeof delta.run_id === \"string\" ? delta.run_id : undefined;\n const uuid = typeof delta.id === \"string\" ? delta.id : `${this.label}-${++this.messageCounter}`;\n\n if (messageType === \"assistant_message\") {\n const content = extractTextFromContent(delta.content);\n if (!content) return null;\n if (this.activeTurn) this.activeTurn.assistantText += content;\n return { type: \"assistant\", content, uuid, runId };\n }\n\n if (messageType === \"reasoning_message\") {\n const content = typeof delta.reasoning === \"string\"\n ? delta.reasoning\n : extractTextFromContent(delta.content);\n if (!content) return null;\n return { type: \"reasoning\", content, uuid, runId };\n }\n\n if (messageType === \"tool_call_message\" || messageType === \"approval_request_message\") {\n const toolCall = firstToolCall(delta);\n if (!toolCall) return null;\n const fn = toolCall.function && typeof toolCall.function === \"object\"\n ? (toolCall.function as Record<string, unknown>)\n : undefined;\n const toolCallId =\n (typeof toolCall.tool_call_id === \"string\" ? toolCall.tool_call_id : undefined) ??\n (typeof toolCall.id === \"string\" ? toolCall.id : undefined);\n if (!toolCallId) {\n const detail = `Missing tool_call_id in ${messageType} (uuid=${uuid})`;\n return {\n type: \"error\",\n message: detail,\n errorCode: \"protocol_error\",\n stopReason: \"protocol_error\",\n runId,\n recoverable: false,\n errorDetail: detail,\n };\n }\n const toolName =\n (typeof toolCall.name === \"string\" ? toolCall.name : undefined) ??\n (typeof fn?.name === \"string\" ? fn.name : undefined) ??\n \"?\";\n const { input, raw } = toolInputFromArguments(toolCall.arguments ?? fn?.arguments);\n return {\n type: \"tool_call\",\n toolCallId,\n toolName,\n toolInput: input,\n rawArguments: raw,\n uuid,\n runId,\n };\n }\n\n if (messageType === \"tool_return_message\") {\n const toolReturn = firstToolReturn(delta) ?? delta;\n const toolCallId =\n (typeof delta.tool_call_id === \"string\" ? delta.tool_call_id : undefined) ??\n (typeof toolReturn.tool_call_id === \"string\" ? toolReturn.tool_call_id : undefined);\n if (!toolCallId) return null;\n const content =\n extractTextFromContent(delta.tool_return ?? toolReturn.tool_return ?? toolReturn.content) ?? \"\";\n const status = typeof delta.status === \"string\" ? delta.status : toolReturn.status;\n return {\n type: \"tool_result\",\n toolCallId,\n content,\n isError: status === \"error\",\n uuid,\n runId,\n };\n }\n\n if (messageType === \"error_message\" || messageType === \"loop_error\") {\n const detail =\n (typeof delta.detail === \"string\" ? delta.detail : undefined) ??\n (typeof delta.message === \"string\" ? delta.message : undefined) ??\n `${this.label} turn failed`;\n const stopReason =\n (typeof delta.stop_reason === \"string\" ? delta.stop_reason : undefined) ??\n (typeof delta.error_type === \"string\" ? delta.error_type : undefined) ??\n \"error\";\n const approvalConflict = isApprovalConflictSignal({\n detail,\n message: typeof delta.message === \"string\" ? delta.message : undefined,\n stopReason,\n });\n return {\n type: \"error\",\n message: detail,\n errorCode: approvalConflict ? \"approval_conflict\" : toSdkErrorCode(stopReason),\n approvalConflict: approvalConflict || undefined,\n recoverable: approvalConflict ? true : false,\n errorDetail: detail,\n stopReason,\n runId,\n };\n }\n\n if (messageType === \"retry\") {\n return {\n type: \"retry\",\n reason: typeof delta.reason === \"string\" ? delta.reason : \"error\",\n attempt: typeof delta.attempt === \"number\" ? delta.attempt : 0,\n maxAttempts: typeof delta.max_attempts === \"number\" ? delta.max_attempts : 0,\n delayMs: typeof delta.delay_ms === \"number\" ? delta.delay_ms : 0,\n runId,\n };\n }\n\n if (messageType === \"stop_reason\" || messageType === \"ping\") {\n return null;\n }\n\n return {\n type: \"stream_event\",\n event: delta as SDKStreamEventPayload,\n uuid,\n };\n }\n\n private resultFromTurn(turn: RuntimeTurnResult, tracker?: TurnTracker): SDKResultMessage {\n const stopReason = turn.stopReason ?? (turn.success === false ? \"error\" : undefined);\n const approvalConflict = isApprovalConflictSignal({\n detail: turn.detail,\n stopReason,\n });\n const success = turn.success !== undefined\n ? turn.success && !approvalConflict && !FAILURE_STOP_REASONS.has(stopReason ?? \"\")\n : !approvalConflict && !FAILURE_STOP_REASONS.has(stopReason ?? \"\");\n const errorCode = approvalConflict\n ? \"approval_conflict\"\n : (turn.errorCode ?? toSdkErrorCode(stopReason));\n\n return {\n type: \"result\",\n success,\n result: success ? (tracker?.assistantText || undefined) : undefined,\n error: success ? undefined : (errorCode ?? stopReason ?? \"error\"),\n errorCode: success ? undefined : (errorCode ?? \"error\"),\n approvalConflict: approvalConflict || undefined,\n recoverable: approvalConflict ? true : success ? undefined : false,\n errorDetail: success ? undefined : turn.detail,\n stopReason,\n durationMs: Date.now() - (tracker?.startedAt || this.activeTurnStartedAt),\n conversationId: turn.runtime.conversation_id,\n runIds: turn.runIds.length > 0 ? turn.runIds : undefined,\n };\n }\n\n private enqueue(message: SDKMessage): void {\n const resolver = this.streamResolvers.shift();\n if (resolver) {\n resolver(message);\n return;\n }\n this.streamQueue.push(message);\n }\n\n private nextMessage(): Promise<SDKMessage | null> {\n const next = this.streamQueue.shift();\n if (next) return Promise.resolve(next);\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.streamResolvers.push(resolve);\n });\n }\n\n private resolveAll(value: SDKMessage | null): void {\n for (const resolve of this.streamResolvers.splice(0)) {\n resolve(value);\n }\n }\n}\n",
13
- "import {\n createAppServerClient,\n type AppServerClient,\n type AppServerExternalToolCallHandler,\n type AppServerSocketConstructor,\n} from \"@letta-ai/letta-code/app-server-client\";\nimport {\n isHeadlessAutoAllowTool,\n requiresRuntimeUserInput,\n} from \"./interactiveToolPolicy.js\";\nimport { startLocalAppServer, type LocalAppServerHandle } from \"./local-app-server.js\";\nimport {\n RemoteClientSessionCore,\n ensureSuccess,\n mapPermissionMode,\n normalizeSendMessage,\n type ProtocolMessage,\n type RemoteClientRuntimeController,\n type RuntimeSendTurnOptions,\n type RuntimeScope,\n type RuntimeSessionInit,\n type RuntimeSessionMode,\n} from \"./remote-client-session-core.js\";\nimport type {\n AnyAgentTool,\n CanUseToolResponse,\n CreateAgentOptions,\n LettaCodeRemoteClientOptions,\n LettaCodeClientSessionOptions,\n ListModelsResult,\n ListMessagesOptions,\n ListMessagesResult,\n MessageContentItem,\n RecoverPendingApprovalsOptions,\n RecoverPendingApprovalsResult,\n SendMessage,\n UpdateModelResult,\n} from \"./types.js\";\n\ntype RuntimeStartResponse = ProtocolMessage & {\n type: \"runtime_start_response\";\n success: boolean;\n runtime: RuntimeScope | null;\n agent: (Record<string, unknown> & {\n id?: string;\n model?: string | null;\n model_settings?: Record<string, unknown> | null;\n }) | null;\n conversation: (Record<string, unknown> & { id?: string; agent_id?: string }) | null;\n error?: string;\n};\n\ntype ConversationRetrieveResponse = ProtocolMessage & {\n type: \"conversation_retrieve_response\";\n success: boolean;\n conversation: (Record<string, unknown> & { id?: string; agent_id?: string }) | null;\n error?: string;\n};\n\ntype ConversationMessagesListResponse = ProtocolMessage & {\n type: \"conversation_messages_list_response\";\n success: boolean;\n messages: unknown[];\n next_before?: string | null;\n nextBefore?: string | null;\n has_more?: boolean;\n hasMore?: boolean;\n error?: string;\n};\n\ntype ListModelsResponse = ProtocolMessage & {\n type: \"list_models_response\";\n success: boolean;\n entries?: unknown;\n available_handles?: unknown;\n byok_provider_aliases?: unknown;\n error?: string;\n};\n\ntype UpdateModelResponse = ProtocolMessage & {\n type: \"update_model_response\";\n success: boolean;\n applied_to?: unknown;\n model_id?: unknown;\n model_handle?: unknown;\n model_settings?: unknown;\n error?: string;\n};\n\ntype UpdateModelPayload = {\n model_id?: string;\n model_handle?: string;\n};\n\ntype RuntimeStartCommand = Parameters<AppServerClient[\"runtimeStart\"]>[0];\n\nexport function agentToolNames(\n agent: Record<string, unknown> | null | undefined,\n): string[] | undefined {\n const tools = agent?.tools;\n if (!Array.isArray(tools)) return undefined;\n return tools.flatMap((tool) => {\n if (typeof tool === \"string\" && tool.length > 0) return [tool];\n if (!tool || typeof tool !== \"object\") return [];\n const name = (tool as { name?: unknown }).name;\n return typeof name === \"string\" && name.length > 0 ? [name] : [];\n });\n}\n\nexport type AppServerSessionOptions = Partial<LettaCodeRemoteClientOptions> & {\n /** Base websocket URL. Remote sessions require this; local sessions may omit\n * it to spawn an SDK-owned app-server lazily at initialize(). */\n url?: string;\n /** Spawn a local app-server when url is omitted. */\n local?: boolean;\n /** Optional backend for SDK-owned local app-server processes. */\n localBackend?: string;\n /** Optional local app-server listen URL. Defaults to ws://127.0.0.1:0. */\n localListen?: string;\n /** Timeout for local app-server startup. */\n localStartupTimeoutMs?: number;\n /** Extra environment variables for SDK-owned local app-server processes. */\n localEnv?: Record<string, string | undefined>;\n /** Whether create-agent runtime_start should pin the created agent globally. */\n pinGlobalAgent?: boolean;\n /** Whether SDK create-agent payloads should add the origin tag automatically. */\n includeSdkOriginTag?: boolean;\n};\n\nexport type AppServerSessionMode = RuntimeSessionMode;\n\nconst SDK_AGENT_ORIGIN_TAG = \"origin:letta-code\";\n\nfunction isPresetSystemPrompt(value: string): boolean {\n return [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ].includes(value);\n}\n\nfunction includeSdkAgentOriginTag(tags: string[] | undefined): string[] {\n const normalizedTags: string[] = [];\n let hasOriginTag = false;\n\n for (const tag of tags ?? []) {\n if (tag === SDK_AGENT_ORIGIN_TAG) {\n if (hasOriginTag) continue;\n hasOriginTag = true;\n }\n normalizedTags.push(tag);\n }\n\n if (!hasOriginTag) {\n normalizedTags.push(SDK_AGENT_ORIGIN_TAG);\n }\n\n return normalizedTags;\n}\n\nfunction assertRemoteCreateAgentOptionsSupported(options: CreateAgentOptions): void {\n if (options.allowedTools !== undefined || options.disallowedTools !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support allowedTools/disallowedTools.\");\n }\n if (options.canUseTool !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support canUseTool callbacks.\");\n }\n if (options.skillSources !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support skillSources overrides.\");\n }\n if (options.systemInfoReminder !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support systemInfoReminder overrides.\");\n }\n if (options.dreaming?.behavior !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support dreaming.behavior overrides.\");\n }\n}\n\nexport function assertRemoteSessionOptionsSupported(\n action: string,\n options: LettaCodeClientSessionOptions,\n): void {\n if (options.systemPrompt !== undefined) {\n throw new Error(`App-server ${action}() does not yet support systemPrompt overrides for existing agents.`);\n }\n if (options.allowedTools !== undefined || options.disallowedTools !== undefined) {\n throw new Error(`App-server ${action}() does not yet support allowedTools/disallowedTools.`);\n }\n if (options.skillSources !== undefined) {\n throw new Error(`App-server ${action}() does not yet support skillSources overrides.`);\n }\n if (options.systemInfoReminder !== undefined) {\n throw new Error(`App-server ${action}() does not yet support systemInfoReminder overrides.`);\n }\n if (options.dreaming?.behavior !== undefined) {\n throw new Error(`App-server ${action}() does not yet support dreaming.behavior overrides.`);\n }\n if ((options as { memfsStartup?: unknown }).memfsStartup !== undefined) {\n throw new Error(`App-server ${action}() does not support memfsStartup.`);\n }\n if (options.includePartialMessages !== undefined) {\n throw new Error(`App-server ${action}() streams app-server deltas directly and does not support includePartialMessages.`);\n }\n}\n\nfunction normalizeMemoryBlock(block: Record<string, unknown>): Record<string, unknown> {\n const normalized = { ...block };\n if (normalized.value === undefined && typeof normalized.content === \"string\") {\n normalized.value = normalized.content;\n }\n return normalized;\n}\n\nexport function createAgentBody(\n options: CreateAgentOptions,\n settings: { includeSdkOriginTag?: boolean } = {},\n): Record<string, unknown> {\n assertRemoteCreateAgentOptionsSupported(options);\n\n const includeOriginTag = settings.includeSdkOriginTag ?? true;\n const body: Record<string, unknown> = {};\n if (includeOriginTag || options.tags !== undefined) {\n body.tags = includeOriginTag ? includeSdkAgentOriginTag(options.tags) : options.tags;\n }\n\n if (options.model !== undefined) body.model = options.model;\n if (options.embedding !== undefined) body.embedding = options.embedding;\n\n if (options.systemPrompt !== undefined) {\n if (typeof options.systemPrompt === \"string\") {\n if (isPresetSystemPrompt(options.systemPrompt)) {\n throw new Error(\"createAgent() does not yet support system prompt presets for this backend.\");\n }\n body.system = options.systemPrompt;\n } else {\n throw new Error(\"createAgent() does not yet support system prompt preset objects for this backend.\");\n }\n }\n\n const memoryBlocks: Array<Record<string, unknown>> = [];\n const blockIds: string[] = [];\n for (const item of options.memory ?? []) {\n if (typeof item === \"string\") {\n throw new Error(\"App-server createAgent() does not yet support memory preset names.\");\n }\n if (\"blockId\" in item) {\n blockIds.push(item.blockId);\n } else {\n memoryBlocks.push(normalizeMemoryBlock(item as unknown as Record<string, unknown>));\n }\n }\n if (options.persona !== undefined) {\n memoryBlocks.push({ label: \"persona\", value: options.persona });\n }\n if (options.human !== undefined) {\n memoryBlocks.push({ label: \"human\", value: options.human });\n }\n if (memoryBlocks.length > 0) body.memory_blocks = memoryBlocks;\n if (blockIds.length > 0) body.block_ids = blockIds;\n\n return body;\n}\n\nexport function externalToolGroups(tools: AnyAgentTool[] | undefined): Array<Record<string, unknown>> | undefined {\n if (!tools || tools.length === 0) return undefined;\n return [\n {\n tools: tools.map((tool) => ({\n name: tool.name,\n label: tool.label,\n description: tool.description,\n parameters: tool.parameters as Record<string, unknown>,\n })),\n },\n ];\n}\n\nexport function createExternalToolCallHandler(\n externalTools: Map<string, AnyAgentTool>,\n): AppServerExternalToolCallHandler {\n return async (request) => {\n const tool = externalTools.get(request.tool_name);\n if (!tool) {\n throw new Error(`Unknown external tool: ${request.tool_name}`);\n }\n const result = await tool.execute(request.tool_call_id, request.input);\n return {\n content: result.content.map((part) => ({\n type: part.type,\n ...(part.text !== undefined ? { text: part.text } : {}),\n ...(part.data !== undefined ? { data: part.data } : {}),\n ...(part.mimeType !== undefined ? { mimeType: part.mimeType } : {}),\n })),\n };\n };\n}\n\ntype AppServerApprovalOptions = LettaCodeClientSessionOptions | CreateAgentOptions;\n\ntype AppServerApprovalResponseDecision =\n | {\n behavior: \"allow\";\n message?: string;\n updated_input?: Record<string, unknown> | null;\n selected_permission_suggestion_ids?: string[];\n }\n | {\n behavior: \"deny\";\n message: string;\n };\n\nexport async function resolveAppServerToolApproval(\n options: AppServerApprovalOptions,\n toolName: string,\n toolInput: Record<string, unknown>,\n): Promise<CanUseToolResponse> {\n const hasCallback = typeof options.canUseTool === \"function\";\n const toolNeedsRuntimeUserInput = requiresRuntimeUserInput(toolName);\n\n if (toolNeedsRuntimeUserInput && !hasCallback) {\n return {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n }\n\n if (options.permissionMode === \"bypassPermissions\" && !toolNeedsRuntimeUserInput) {\n return { behavior: \"allow\", updatedInput: null, updatedPermissions: [] };\n }\n\n if (hasCallback) {\n try {\n const result = await options.canUseTool!(toolName, toolInput);\n if (result.behavior === \"allow\") {\n return {\n behavior: \"allow\",\n message: result.message,\n updatedInput: result.updatedInput ?? null,\n updatedPermissions: result.updatedPermissions ?? [],\n };\n }\n return {\n behavior: \"deny\",\n message: result.message ?? \"Denied by canUseTool callback\",\n interrupt: result.interrupt ?? false,\n };\n } catch (error) {\n return {\n behavior: \"deny\",\n message: error instanceof Error ? error.message : \"Callback error\",\n interrupt: false,\n };\n }\n }\n\n if (isHeadlessAutoAllowTool(toolName)) {\n return { behavior: \"allow\", updatedInput: null, updatedPermissions: [] };\n }\n\n return {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n}\n\nfunction permissionSuggestionId(value: unknown): string | null {\n if (typeof value === \"string\") return value;\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n if (typeof record.id === \"string\") return record.id;\n if (typeof record.suggestion_id === \"string\") return record.suggestion_id;\n if (typeof record.permission_suggestion_id === \"string\") return record.permission_suggestion_id;\n return null;\n}\n\nexport function toAppServerApprovalDecision(\n decision: CanUseToolResponse,\n): AppServerApprovalResponseDecision {\n if (decision.behavior === \"deny\") {\n return {\n behavior: \"deny\",\n message: decision.message,\n };\n }\n\n const selectedPermissionSuggestionIds = (decision.updatedPermissions ?? [])\n .map(permissionSuggestionId)\n .filter((id): id is string => id !== null);\n\n return {\n behavior: \"allow\",\n ...(decision.message !== undefined ? { message: decision.message } : {}),\n updated_input: decision.updatedInput ?? null,\n selected_permission_suggestion_ids: selectedPermissionSuggestionIds,\n };\n}\n\nfunction stringRecord(value: unknown): Record<string, string> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const record: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (typeof entry === \"string\") record[key] = entry;\n }\n return record;\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return { ...(value as Record<string, unknown>) };\n}\n\nfunction normalizeListModelsResponse(response: ListModelsResponse): ListModelsResult {\n if (!response.success) {\n throw new Error(response.error ?? \"listModels failed\");\n }\n\n const entries = Array.isArray(response.entries)\n ? response.entries.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") return [];\n const record = entry as Record<string, unknown>;\n if (\n typeof record.id !== \"string\" ||\n typeof record.handle !== \"string\" ||\n typeof record.label !== \"string\" ||\n typeof record.description !== \"string\"\n ) {\n return [];\n }\n const updateArgs = objectRecord(record.updateArgs);\n return [\n {\n id: record.id,\n handle: record.handle,\n label: record.label,\n description: record.description,\n ...(typeof record.isDefault === \"boolean\" ? { isDefault: record.isDefault } : {}),\n ...(typeof record.isFeatured === \"boolean\" ? { isFeatured: record.isFeatured } : {}),\n ...(typeof record.free === \"boolean\" ? { free: record.free } : {}),\n ...(updateArgs ? { updateArgs } : {}),\n },\n ];\n })\n : [];\n\n const result: ListModelsResult = { entries };\n if (response.available_handles === null) {\n result.availableHandles = null;\n } else if (Array.isArray(response.available_handles)) {\n result.availableHandles = response.available_handles.filter(\n (handle): handle is string => typeof handle === \"string\",\n );\n }\n const aliases = stringRecord(response.byok_provider_aliases);\n if (aliases) result.byokProviderAliases = aliases;\n return result;\n}\n\nfunction normalizeUpdateModelResponse(response: UpdateModelResponse): UpdateModelResult {\n if (!response.success) {\n throw new Error(response.error ?? \"Failed to update model\");\n }\n const result: UpdateModelResult = {};\n if (response.applied_to === \"agent\" || response.applied_to === \"conversation\") {\n result.appliedTo = response.applied_to;\n }\n if (typeof response.model_id === \"string\") result.modelId = response.model_id;\n if (typeof response.model_handle === \"string\") result.modelHandle = response.model_handle;\n if (response.model_settings === null) {\n result.modelSettings = null;\n } else if (response.model_settings && typeof response.model_settings === \"object\") {\n result.modelSettings = { ...(response.model_settings as Record<string, unknown>) };\n }\n return result;\n}\n\nfunction runtimeScopeFromMessage(message: ProtocolMessage): RuntimeScope | null {\n if (message.runtime) return message.runtime;\n const agentId = typeof message.agent_id === \"string\" ? message.agent_id : null;\n const conversationId = typeof message.conversation_id === \"string\" ? message.conversation_id : null;\n if (agentId && conversationId) {\n return { agent_id: agentId, conversation_id: conversationId };\n }\n return null;\n}\n\nexport function registerAppServerControlRequestHandler(config: {\n client: AppServerClient;\n getRuntime: () => RuntimeScope | null;\n getOptions: () => AppServerApprovalOptions;\n}): () => void {\n return config.client.onMessage((rawMessage, channel) => {\n const message = rawMessage as unknown as ProtocolMessage;\n if (channel !== \"control\" || message.type !== \"control_request\") return;\n void respondToAppServerControlRequest(config, message).catch(() => {\n // Permission callback failures are converted into deny responses by resolveAppServerToolApproval().\n });\n });\n}\n\nasync function respondToAppServerControlRequest(\n config: {\n client: AppServerClient;\n getRuntime: () => RuntimeScope | null;\n getOptions: () => AppServerApprovalOptions;\n },\n message: ProtocolMessage,\n): Promise<void> {\n const runtime = runtimeScopeFromMessage(message) ?? config.getRuntime();\n if (!runtime) return;\n\n const requestId = typeof message.request_id === \"string\" ? message.request_id : undefined;\n const request = message.request;\n if (!requestId || !request || typeof request !== \"object\") return;\n const requestRecord = request as Record<string, unknown>;\n if (requestRecord.subtype !== \"can_use_tool\") return;\n\n const toolName = typeof requestRecord.tool_name === \"string\" ? requestRecord.tool_name : \"unknown\";\n const toolInput =\n requestRecord.input && typeof requestRecord.input === \"object\" && !Array.isArray(requestRecord.input)\n ? (requestRecord.input as Record<string, unknown>)\n : {};\n const decision = await resolveAppServerToolApproval(config.getOptions(), toolName, toolInput);\n config.client.input({\n runtime,\n payload: {\n kind: \"approval_response\",\n request_id: requestId,\n decision: toAppServerApprovalDecision(decision),\n },\n } as Parameters<AppServerClient[\"input\"]>[0]);\n}\n\nexport class AppServerRuntimeController implements RemoteClientRuntimeController {\n constructor(\n private readonly client: AppServerClient,\n private readonly options: AppServerSessionOptions,\n ) {}\n\n onMessage(handler: (message: ProtocolMessage, channel?: string) => void): () => void {\n return this.client.onMessage((message, channel) => {\n handler(message as unknown as ProtocolMessage, channel);\n });\n }\n\n send(command: Record<string, unknown>): void {\n this.client.send(command as unknown as Parameters<AppServerClient[\"send\"]>[0]);\n }\n\n sendTurnMessage(\n runtime: RuntimeScope,\n message: SendMessage,\n options: RuntimeSendTurnOptions,\n ): void {\n const payload: Record<string, unknown> = {\n kind: \"create_message\",\n messages: [\n {\n role: \"user\",\n content: normalizeSendMessage(message),\n client_message_id: options.clientMessageId,\n },\n ],\n };\n this.client.input({\n runtime,\n payload,\n } as Parameters<AppServerClient[\"input\"]>[0]);\n }\n\n async abort(runtime: RuntimeScope): Promise<void> {\n await this.client.abort({ runtime } as Parameters<AppServerClient[\"abort\"]>[0]);\n }\n\n request(\n type: string,\n body: Record<string, unknown>,\n options: { timeoutMs?: number; predicate?: (message: ProtocolMessage) => boolean } = {},\n ): Promise<ProtocolMessage> {\n const request = this.client.request.bind(this.client) as unknown as (\n commandType: string,\n commandBody: Record<string, unknown>,\n requestOptions?: {\n timeoutMs?: number;\n predicate?: (message: ProtocolMessage) => boolean;\n },\n ) => Promise<ProtocolMessage>;\n return request(type, body, options);\n }\n\n async listModels(): Promise<ListModelsResult> {\n const response = (await this.request(\n \"list_models\",\n {},\n { predicate: (message) => message.type === \"list_models_response\" },\n )) as ListModelsResponse;\n return normalizeListModelsResponse(response);\n }\n\n async updateModel(\n runtime: RuntimeScope,\n payload: UpdateModelPayload,\n ): Promise<UpdateModelResult> {\n const response = (await this.request(\n \"update_model\",\n {\n runtime,\n payload,\n },\n { predicate: (message) => message.type === \"update_model_response\" },\n )) as UpdateModelResponse;\n return normalizeUpdateModelResponse(response);\n }\n\n async recoverPendingApprovals(\n runtime: RuntimeScope,\n options: RecoverPendingApprovalsOptions = {},\n ): Promise<RecoverPendingApprovalsResult> {\n const response = await this.client.sync(\n {\n runtime,\n recover_approvals: true,\n force_device_status: true,\n },\n options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {},\n );\n\n if (!response.success) {\n return {\n recovered: false,\n unsupported: false,\n detail: response.error ?? \"Failed to recover pending approvals\",\n };\n }\n\n return { recovered: true, unsupported: false };\n }\n\n async listMessages(\n conversationId: string,\n options: ListMessagesOptions = {},\n ): Promise<ListMessagesResult> {\n const query: Record<string, unknown> = {};\n if (options.before !== undefined) query.before = options.before;\n if (options.after !== undefined) query.after = options.after;\n if (options.order !== undefined) query.order = options.order;\n if (options.limit !== undefined) query.limit = options.limit;\n\n const response = (await this.request(\n \"conversation_messages_list\",\n {\n conversation_id: conversationId,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n },\n { predicate: (message) => message.type === \"conversation_messages_list_response\" },\n )) as ConversationMessagesListResponse;\n\n if (!response.success) {\n throw new Error(response.error ?? \"listMessages failed\");\n }\n\n const result: ListMessagesResult = {\n messages: response.messages ?? [],\n };\n const nextBefore =\n typeof response.nextBefore === \"string\" || response.nextBefore === null\n ? response.nextBefore\n : typeof response.next_before === \"string\" || response.next_before === null\n ? response.next_before\n : undefined;\n if (nextBefore !== undefined) result.nextBefore = nextBefore;\n const hasMore =\n typeof response.hasMore === \"boolean\"\n ? response.hasMore\n : typeof response.has_more === \"boolean\"\n ? response.has_more\n : undefined;\n if (hasMore !== undefined) result.hasMore = hasMore;\n return result;\n }\n\n close(): void {\n this.client.close();\n }\n}\n\nexport class AppServerSession extends RemoteClientSessionCore {\n private ownedAppServer: LocalAppServerHandle | null = null;\n private externalTools = new Map<string, AnyAgentTool>();\n private removeExternalToolHandler: (() => void) | null = null;\n private removeControlRequestHandler: (() => void) | null = null;\n\n constructor(\n private readonly remoteOptions: AppServerSessionOptions,\n mode: AppServerSessionMode,\n ) {\n super(mode, {\n label: \"app-server\",\n requestTimeoutMs: remoteOptions.requestTimeoutMs,\n });\n const tools = mode.options.tools;\n for (const tool of tools ?? []) {\n this.externalTools.set(tool.name, tool);\n }\n }\n\n protected override shouldEnableMemfs(options: LettaCodeClientSessionOptions | CreateAgentOptions): boolean {\n void options;\n return this.mode.kind === \"create-agent\";\n }\n\n protected override async initializeRuntimeController(): Promise<RuntimeSessionInit> {\n const url = await this.resolveAppServerUrl();\n const client = createAppServerClient({\n url,\n ...(this.remoteOptions.authToken !== undefined\n ? { authToken: this.remoteOptions.authToken }\n : {}),\n ...(this.remoteOptions.WebSocket\n ? { WebSocket: this.remoteOptions.WebSocket as AppServerSocketConstructor }\n : {}),\n ...(this.remoteOptions.requestTimeoutMs !== undefined\n ? { requestTimeoutMs: this.remoteOptions.requestTimeoutMs }\n : {}),\n });\n\n this.removeControlRequestHandler = registerAppServerControlRequestHandler({\n client,\n getRuntime: () => this.runtime,\n getOptions: () => this.currentOptions(),\n });\n\n if (this.externalTools.size > 0) {\n this.removeExternalToolHandler = client.onExternalToolCall(\n createExternalToolCallHandler(this.externalTools),\n );\n }\n\n try {\n await client.connect();\n const response = await this.startRuntime(client);\n if (!response.success || !response.runtime) {\n throw new Error(response.error ?? \"Failed to start app-server runtime\");\n }\n\n const tools = agentToolNames(response.agent);\n return {\n controller: new AppServerRuntimeController(client, this.remoteOptions),\n runtime: response.runtime,\n model: typeof response.agent?.model === \"string\" ? response.agent.model : \"\",\n modelSettings: response.agent?.model_settings ?? null,\n ...(tools !== undefined ? { tools } : {}),\n };\n } catch (error) {\n this.removeExternalToolHandler?.();\n this.removeExternalToolHandler = null;\n this.removeControlRequestHandler?.();\n this.removeControlRequestHandler = null;\n client.close();\n throw error;\n }\n }\n\n protected override onCoreClose(): void {\n this.removeExternalToolHandler?.();\n this.removeExternalToolHandler = null;\n this.removeControlRequestHandler?.();\n this.removeControlRequestHandler = null;\n this.ownedAppServer?.close();\n this.ownedAppServer = null;\n }\n\n private async resolveAppServerUrl(): Promise<string> {\n if (this.remoteOptions.url) {\n return this.remoteOptions.url;\n }\n if (this.remoteOptions.local !== true) {\n throw new Error(\"App-server session requires a url unless local app-server spawning is enabled.\");\n }\n this.ownedAppServer = await startLocalAppServer({\n listen: this.remoteOptions.localListen,\n backend: this.remoteOptions.localBackend,\n startupTimeoutMs: this.remoteOptions.localStartupTimeoutMs,\n env: this.remoteOptions.localEnv,\n });\n return this.ownedAppServer.url;\n }\n\n private async startRuntime(client: AppServerClient): Promise<RuntimeStartResponse> {\n const command = await this.buildRuntimeStartCommand(client);\n const response = (await client.runtimeStart(command)) as unknown as RuntimeStartResponse;\n return response;\n }\n\n private async buildRuntimeStartCommand(client: AppServerClient): Promise<RuntimeStartCommand> {\n const options = this.mode.options;\n const command: Record<string, unknown> = {\n client_info: {\n name: \"@letta-ai/letta-agent-sdk\",\n title: \"Letta Agent SDK\",\n },\n recover_approvals: false,\n force_device_status: true,\n };\n\n const mode = mapPermissionMode(options.permissionMode);\n if (mode) command.mode = mode;\n if (options.cwd !== undefined) command.cwd = options.cwd;\n const groups = externalToolGroups(options.tools);\n if (groups) command.external_tools = groups;\n\n if (this.mode.kind === \"create-agent\") {\n command.create_agent = {\n body: createAgentBody(this.mode.options, {\n includeSdkOriginTag: this.remoteOptions.includeSdkOriginTag,\n }),\n pin_global: this.remoteOptions.pinGlobalAgent ?? true,\n };\n return command as RuntimeStartCommand;\n }\n\n if (this.mode.agentId) {\n command.agent_id = this.mode.agentId;\n if (this.mode.newConversation) {\n command.create_conversation = { body: {} };\n } else if (this.mode.defaultConversation) {\n command.conversation_id = \"default\";\n }\n return command as RuntimeStartCommand;\n }\n\n if (this.mode.conversationId) {\n const agentId = await this.resolveConversationAgentId(client, this.mode.conversationId);\n command.agent_id = agentId;\n command.conversation_id = this.mode.conversationId;\n return command as RuntimeStartCommand;\n }\n\n throw new Error(\n \"App-server createSession() requires an agent id. Call createAgent() first or pass an agent id.\",\n );\n }\n\n private async resolveConversationAgentId(\n client: AppServerClient,\n conversationId: string,\n ): Promise<string> {\n const request = client.request.bind(client) as unknown as (\n commandType: string,\n commandBody: Record<string, unknown>,\n options?: { predicate?: (message: ProtocolMessage) => boolean },\n ) => Promise<ProtocolMessage>;\n const response = (await request(\n \"conversation_retrieve\",\n { conversation_id: conversationId },\n { predicate: (message) => message.type === \"conversation_retrieve_response\" },\n )) as ConversationRetrieveResponse;\n if (!response.success || !response.conversation?.agent_id) {\n throw new Error(response.error ?? `Failed to retrieve conversation ${conversationId}`);\n }\n return response.conversation.agent_id;\n }\n\n}\n",
13
+ "import {\n createAppServerClient,\n type AppServerClient,\n type AppServerExternalToolCallHandler,\n type AppServerSocketConstructor,\n} from \"@letta-ai/letta-code/app-server-client\";\nimport {\n isHeadlessAutoAllowTool,\n requiresRuntimeUserInput,\n} from \"./interactiveToolPolicy.js\";\nimport { startLocalAppServer, type LocalAppServerHandle } from \"./local-app-server.js\";\nimport {\n RemoteClientSessionCore,\n ensureSuccess,\n isUnrestrictedPermissionMode,\n mapPermissionMode,\n normalizeSendMessage,\n type ProtocolMessage,\n type RemoteClientRuntimeController,\n type RuntimeSendTurnOptions,\n type RuntimeScope,\n type RuntimeSessionInit,\n type RuntimeSessionMode,\n} from \"./remote-client-session-core.js\";\nimport type {\n AnyAgentTool,\n CanUseToolResponse,\n CreateAgentOptions,\n LettaCodeRemoteClientOptions,\n LettaCodeClientSessionOptions,\n ListModelsResult,\n ListMessagesOptions,\n ListMessagesResult,\n MessageContentItem,\n RecoverPendingApprovalsOptions,\n RecoverPendingApprovalsResult,\n SendMessage,\n UpdateModelResult,\n} from \"./types.js\";\n\ntype RuntimeStartResponse = ProtocolMessage & {\n type: \"runtime_start_response\";\n success: boolean;\n runtime: RuntimeScope | null;\n agent: (Record<string, unknown> & {\n id?: string;\n model?: string | null;\n model_settings?: Record<string, unknown> | null;\n }) | null;\n conversation: (Record<string, unknown> & { id?: string; agent_id?: string }) | null;\n error?: string;\n};\n\ntype ConversationRetrieveResponse = ProtocolMessage & {\n type: \"conversation_retrieve_response\";\n success: boolean;\n conversation: (Record<string, unknown> & { id?: string; agent_id?: string }) | null;\n error?: string;\n};\n\ntype ConversationMessagesListResponse = ProtocolMessage & {\n type: \"conversation_messages_list_response\";\n success: boolean;\n messages: unknown[];\n next_before?: string | null;\n nextBefore?: string | null;\n has_more?: boolean;\n hasMore?: boolean;\n error?: string;\n};\n\ntype ListModelsResponse = ProtocolMessage & {\n type: \"list_models_response\";\n success: boolean;\n entries?: unknown;\n available_handles?: unknown;\n byok_provider_aliases?: unknown;\n error?: string;\n};\n\ntype UpdateModelResponse = ProtocolMessage & {\n type: \"update_model_response\";\n success: boolean;\n applied_to?: unknown;\n model_id?: unknown;\n model_handle?: unknown;\n model_settings?: unknown;\n error?: string;\n};\n\ntype UpdateModelPayload = {\n model_id?: string;\n model_handle?: string;\n};\n\ntype RuntimeStartCommand = Parameters<AppServerClient[\"runtimeStart\"]>[0];\n\nexport function agentToolNames(\n agent: Record<string, unknown> | null | undefined,\n): string[] | undefined {\n const tools = agent?.tools;\n if (!Array.isArray(tools)) return undefined;\n return tools.flatMap((tool) => {\n if (typeof tool === \"string\" && tool.length > 0) return [tool];\n if (!tool || typeof tool !== \"object\") return [];\n const name = (tool as { name?: unknown }).name;\n return typeof name === \"string\" && name.length > 0 ? [name] : [];\n });\n}\n\nexport type AppServerSessionOptions = Partial<LettaCodeRemoteClientOptions> & {\n /** Base websocket URL. Remote sessions require this; local sessions may omit\n * it to spawn an SDK-owned app-server lazily at initialize(). */\n url?: string;\n /** Spawn a local app-server when url is omitted. */\n local?: boolean;\n /** Optional backend for SDK-owned local app-server processes. */\n localBackend?: string;\n /** Optional local app-server listen URL. Defaults to ws://127.0.0.1:0. */\n localListen?: string;\n /** Timeout for local app-server startup. */\n localStartupTimeoutMs?: number;\n /** Extra environment variables for SDK-owned local app-server processes. */\n localEnv?: Record<string, string | undefined>;\n /** Whether create-agent runtime_start should pin the created agent globally. */\n pinGlobalAgent?: boolean;\n /** Whether SDK create-agent payloads should add the origin tag automatically. */\n includeSdkOriginTag?: boolean;\n};\n\nexport type AppServerSessionMode = RuntimeSessionMode;\n\nconst SDK_AGENT_ORIGIN_TAG = \"origin:letta-code\";\n\nfunction isPresetSystemPrompt(value: string): boolean {\n return [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ].includes(value);\n}\n\nfunction includeSdkAgentOriginTag(tags: string[] | undefined): string[] {\n const normalizedTags: string[] = [];\n let hasOriginTag = false;\n\n for (const tag of tags ?? []) {\n if (tag === SDK_AGENT_ORIGIN_TAG) {\n if (hasOriginTag) continue;\n hasOriginTag = true;\n }\n normalizedTags.push(tag);\n }\n\n if (!hasOriginTag) {\n normalizedTags.push(SDK_AGENT_ORIGIN_TAG);\n }\n\n return normalizedTags;\n}\n\nfunction assertRemoteCreateAgentOptionsSupported(options: CreateAgentOptions): void {\n if (options.allowedTools !== undefined || options.disallowedTools !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support allowedTools/disallowedTools.\");\n }\n if (options.canUseTool !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support canUseTool callbacks.\");\n }\n if (options.systemInfoReminder !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support systemInfoReminder overrides.\");\n }\n if (options.dreaming?.behavior !== undefined) {\n throw new Error(\"App-server createAgent() does not yet support dreaming.behavior overrides.\");\n }\n}\n\nexport function assertRemoteSessionOptionsSupported(\n action: string,\n options: LettaCodeClientSessionOptions,\n): void {\n if (options.systemPrompt !== undefined) {\n throw new Error(`App-server ${action}() does not yet support systemPrompt overrides for existing agents.`);\n }\n if (options.disallowedTools !== undefined) {\n throw new Error(`App-server ${action}() does not yet support disallowedTools.`);\n }\n if (options.systemInfoReminder !== undefined) {\n throw new Error(`App-server ${action}() does not yet support systemInfoReminder overrides.`);\n }\n if (options.dreaming?.behavior !== undefined) {\n throw new Error(`App-server ${action}() does not yet support dreaming.behavior overrides.`);\n }\n if ((options as { memfsStartup?: unknown }).memfsStartup !== undefined) {\n throw new Error(`App-server ${action}() does not support memfsStartup.`);\n }\n if (options.includePartialMessages !== undefined) {\n throw new Error(`App-server ${action}() streams app-server deltas directly and does not support includePartialMessages.`);\n }\n}\n\nfunction normalizeMemoryBlock(block: Record<string, unknown>): Record<string, unknown> {\n const normalized = { ...block };\n if (normalized.value === undefined && typeof normalized.content === \"string\") {\n normalized.value = normalized.content;\n }\n return normalized;\n}\n\nexport function createAgentBody(\n options: CreateAgentOptions,\n settings: { includeSdkOriginTag?: boolean } = {},\n): Record<string, unknown> {\n assertRemoteCreateAgentOptionsSupported(options);\n\n const includeOriginTag = settings.includeSdkOriginTag ?? true;\n const body: Record<string, unknown> = {};\n if (includeOriginTag || options.tags !== undefined) {\n body.tags = includeOriginTag ? includeSdkAgentOriginTag(options.tags) : options.tags;\n }\n\n if (options.model !== undefined) body.model = options.model;\n if (options.embedding !== undefined) body.embedding = options.embedding;\n if (options.name !== undefined) body.name = options.name;\n if (options.description !== undefined) body.description = options.description;\n if (options.hidden !== undefined) body.hidden = options.hidden;\n if (options.baseTools !== undefined) {\n body.tools = options.baseTools;\n // `tools: []` alone does not suppress the Letta agent type's defaults.\n // Keep the SDK's documented `baseTools: []` contract by disabling both\n // default tool attachment and its corresponding default tool rules.\n body.include_base_tools = false;\n body.include_base_tool_rules = false;\n }\n\n if (options.systemPrompt === undefined) {\n body.system = \"\";\n } else {\n if (typeof options.systemPrompt === \"string\") {\n if (isPresetSystemPrompt(options.systemPrompt)) {\n throw new Error(\"createAgent() does not yet support system prompt presets for this backend.\");\n }\n body.system = options.systemPrompt;\n } else {\n throw new Error(\"createAgent() does not yet support system prompt preset objects for this backend.\");\n }\n }\n\n const memoryBlocks: Array<Record<string, unknown>> = [];\n const blockIds: string[] = [];\n for (const item of options.memory ?? []) {\n if (typeof item === \"string\") {\n throw new Error(\"App-server createAgent() does not yet support memory preset names.\");\n }\n if (\"blockId\" in item) {\n blockIds.push(item.blockId);\n } else {\n memoryBlocks.push(normalizeMemoryBlock(item as unknown as Record<string, unknown>));\n }\n }\n if (options.persona !== undefined) {\n memoryBlocks.push({ label: \"persona\", value: options.persona });\n }\n if (options.human !== undefined) {\n memoryBlocks.push({ label: \"human\", value: options.human });\n }\n if (memoryBlocks.length > 0) body.memory_blocks = memoryBlocks;\n if (blockIds.length > 0) body.block_ids = blockIds;\n\n return body;\n}\n\nexport function externalToolGroups(tools: AnyAgentTool[] | undefined): Array<Record<string, unknown>> | undefined {\n if (!tools || tools.length === 0) return undefined;\n return [\n {\n tools: tools.map((tool) => ({\n name: tool.name,\n label: tool.label,\n description: tool.description,\n parameters: tool.parameters as Record<string, unknown>,\n })),\n },\n ];\n}\n\nexport function createExternalToolCallHandler(\n externalTools: Map<string, AnyAgentTool>,\n): AppServerExternalToolCallHandler {\n return async (request) => {\n const tool = externalTools.get(request.tool_name);\n if (!tool) {\n throw new Error(`Unknown external tool: ${request.tool_name}`);\n }\n const result = await tool.execute(request.tool_call_id, request.input);\n return {\n content: result.content.map((part) => ({\n type: part.type,\n ...(part.text !== undefined ? { text: part.text } : {}),\n ...(part.data !== undefined ? { data: part.data } : {}),\n ...(part.mimeType !== undefined ? { mimeType: part.mimeType } : {}),\n })),\n };\n };\n}\n\ntype AppServerApprovalOptions = LettaCodeClientSessionOptions | CreateAgentOptions;\n\ntype AppServerApprovalResponseDecision =\n | {\n behavior: \"allow\";\n message?: string;\n updated_input?: Record<string, unknown> | null;\n selected_permission_suggestion_ids?: string[];\n }\n | {\n behavior: \"deny\";\n message: string;\n };\n\nexport async function resolveAppServerToolApproval(\n options: AppServerApprovalOptions,\n toolName: string,\n toolInput: Record<string, unknown>,\n): Promise<CanUseToolResponse> {\n const hasCallback = typeof options.canUseTool === \"function\";\n const toolNeedsRuntimeUserInput = requiresRuntimeUserInput(toolName);\n\n if (toolNeedsRuntimeUserInput && !hasCallback) {\n return {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n }\n\n if (isUnrestrictedPermissionMode(options.permissionMode) && !toolNeedsRuntimeUserInput) {\n return { behavior: \"allow\", updatedInput: null, updatedPermissions: [] };\n }\n\n if (hasCallback) {\n try {\n const result = await options.canUseTool!(toolName, toolInput);\n if (result.behavior === \"allow\") {\n return {\n behavior: \"allow\",\n message: result.message,\n updatedInput: result.updatedInput ?? null,\n updatedPermissions: result.updatedPermissions ?? [],\n };\n }\n return {\n behavior: \"deny\",\n message: result.message ?? \"Denied by canUseTool callback\",\n interrupt: result.interrupt ?? false,\n };\n } catch (error) {\n return {\n behavior: \"deny\",\n message: error instanceof Error ? error.message : \"Callback error\",\n interrupt: false,\n };\n }\n }\n\n if (isHeadlessAutoAllowTool(toolName)) {\n return { behavior: \"allow\", updatedInput: null, updatedPermissions: [] };\n }\n\n return {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n}\n\nfunction permissionSuggestionId(value: unknown): string | null {\n if (typeof value === \"string\") return value;\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n if (typeof record.id === \"string\") return record.id;\n if (typeof record.suggestion_id === \"string\") return record.suggestion_id;\n if (typeof record.permission_suggestion_id === \"string\") return record.permission_suggestion_id;\n return null;\n}\n\nexport function toAppServerApprovalDecision(\n decision: CanUseToolResponse,\n): AppServerApprovalResponseDecision {\n if (decision.behavior === \"deny\") {\n return {\n behavior: \"deny\",\n message: decision.message,\n };\n }\n\n const selectedPermissionSuggestionIds = (decision.updatedPermissions ?? [])\n .map(permissionSuggestionId)\n .filter((id): id is string => id !== null);\n\n return {\n behavior: \"allow\",\n ...(decision.message !== undefined ? { message: decision.message } : {}),\n updated_input: decision.updatedInput ?? null,\n selected_permission_suggestion_ids: selectedPermissionSuggestionIds,\n };\n}\n\nfunction stringRecord(value: unknown): Record<string, string> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const record: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (typeof entry === \"string\") record[key] = entry;\n }\n return record;\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return { ...(value as Record<string, unknown>) };\n}\n\nfunction normalizeListModelsResponse(response: ListModelsResponse): ListModelsResult {\n if (!response.success) {\n throw new Error(response.error ?? \"listModels failed\");\n }\n\n const entries = Array.isArray(response.entries)\n ? response.entries.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") return [];\n const record = entry as Record<string, unknown>;\n if (\n typeof record.id !== \"string\" ||\n typeof record.handle !== \"string\" ||\n typeof record.label !== \"string\" ||\n typeof record.description !== \"string\"\n ) {\n return [];\n }\n const updateArgs = objectRecord(record.updateArgs);\n return [\n {\n id: record.id,\n handle: record.handle,\n label: record.label,\n description: record.description,\n ...(typeof record.isDefault === \"boolean\" ? { isDefault: record.isDefault } : {}),\n ...(typeof record.isFeatured === \"boolean\" ? { isFeatured: record.isFeatured } : {}),\n ...(typeof record.free === \"boolean\" ? { free: record.free } : {}),\n ...(updateArgs ? { updateArgs } : {}),\n },\n ];\n })\n : [];\n\n const result: ListModelsResult = { entries };\n if (response.available_handles === null) {\n result.availableHandles = null;\n } else if (Array.isArray(response.available_handles)) {\n result.availableHandles = response.available_handles.filter(\n (handle): handle is string => typeof handle === \"string\",\n );\n }\n const aliases = stringRecord(response.byok_provider_aliases);\n if (aliases) result.byokProviderAliases = aliases;\n return result;\n}\n\nfunction normalizeUpdateModelResponse(response: UpdateModelResponse): UpdateModelResult {\n if (!response.success) {\n throw new Error(response.error ?? \"Failed to update model\");\n }\n const result: UpdateModelResult = {};\n if (response.applied_to === \"agent\" || response.applied_to === \"conversation\") {\n result.appliedTo = response.applied_to;\n }\n if (typeof response.model_id === \"string\") result.modelId = response.model_id;\n if (typeof response.model_handle === \"string\") result.modelHandle = response.model_handle;\n if (response.model_settings === null) {\n result.modelSettings = null;\n } else if (response.model_settings && typeof response.model_settings === \"object\") {\n result.modelSettings = { ...(response.model_settings as Record<string, unknown>) };\n }\n return result;\n}\n\nfunction runtimeScopeFromMessage(message: ProtocolMessage): RuntimeScope | null {\n if (message.runtime) return message.runtime;\n const agentId = typeof message.agent_id === \"string\" ? message.agent_id : null;\n const conversationId = typeof message.conversation_id === \"string\" ? message.conversation_id : null;\n if (agentId && conversationId) {\n return { agent_id: agentId, conversation_id: conversationId };\n }\n return null;\n}\n\nexport function registerAppServerControlRequestHandler(config: {\n client: AppServerClient;\n getRuntime: () => RuntimeScope | null;\n getOptions: () => AppServerApprovalOptions;\n}): () => void {\n return config.client.onMessage((rawMessage, channel) => {\n const message = rawMessage as unknown as ProtocolMessage;\n if (channel !== \"control\" || message.type !== \"control_request\") return;\n void respondToAppServerControlRequest(config, message).catch(() => {\n // Permission callback failures are converted into deny responses by resolveAppServerToolApproval().\n });\n });\n}\n\nasync function respondToAppServerControlRequest(\n config: {\n client: AppServerClient;\n getRuntime: () => RuntimeScope | null;\n getOptions: () => AppServerApprovalOptions;\n },\n message: ProtocolMessage,\n): Promise<void> {\n const runtime = runtimeScopeFromMessage(message) ?? config.getRuntime();\n if (!runtime) return;\n\n const requestId = typeof message.request_id === \"string\" ? message.request_id : undefined;\n const request = message.request;\n if (!requestId || !request || typeof request !== \"object\") return;\n const requestRecord = request as Record<string, unknown>;\n if (requestRecord.subtype !== \"can_use_tool\") return;\n\n const toolName = typeof requestRecord.tool_name === \"string\" ? requestRecord.tool_name : \"unknown\";\n const toolInput =\n requestRecord.input && typeof requestRecord.input === \"object\" && !Array.isArray(requestRecord.input)\n ? (requestRecord.input as Record<string, unknown>)\n : {};\n const decision = await resolveAppServerToolApproval(config.getOptions(), toolName, toolInput);\n config.client.input({\n runtime,\n payload: {\n kind: \"approval_response\",\n request_id: requestId,\n decision: toAppServerApprovalDecision(decision),\n },\n } as Parameters<AppServerClient[\"input\"]>[0]);\n}\n\nexport class AppServerRuntimeController implements RemoteClientRuntimeController {\n constructor(\n private readonly client: AppServerClient,\n private readonly options: AppServerSessionOptions,\n private readonly clientToolAllowlist?: readonly string[],\n ) {}\n\n onMessage(handler: (message: ProtocolMessage, channel?: string) => void): () => void {\n return this.client.onMessage((message, channel) => {\n handler(message as unknown as ProtocolMessage, channel);\n });\n }\n\n send(command: Record<string, unknown>): void {\n this.client.send(command as unknown as Parameters<AppServerClient[\"send\"]>[0]);\n }\n\n sendTurnMessage(\n runtime: RuntimeScope,\n message: SendMessage,\n options: RuntimeSendTurnOptions,\n ): void {\n const payload: Record<string, unknown> = {\n kind: \"create_message\",\n messages: [\n {\n role: \"user\",\n content: normalizeSendMessage(message),\n client_message_id: options.clientMessageId,\n },\n ],\n };\n if (this.clientToolAllowlist !== undefined) {\n payload.client_tool_allowlist = [...new Set(this.clientToolAllowlist)];\n }\n this.client.input({\n runtime,\n payload,\n } as Parameters<AppServerClient[\"input\"]>[0]);\n }\n\n async abort(runtime: RuntimeScope): Promise<void> {\n await this.client.abort({ runtime } as Parameters<AppServerClient[\"abort\"]>[0]);\n }\n\n request(\n type: string,\n body: Record<string, unknown>,\n options: { timeoutMs?: number; predicate?: (message: ProtocolMessage) => boolean } = {},\n ): Promise<ProtocolMessage> {\n const request = this.client.request.bind(this.client) as unknown as (\n commandType: string,\n commandBody: Record<string, unknown>,\n requestOptions?: {\n timeoutMs?: number;\n predicate?: (message: ProtocolMessage) => boolean;\n },\n ) => Promise<ProtocolMessage>;\n return request(type, body, options);\n }\n\n async listModels(): Promise<ListModelsResult> {\n const response = (await this.request(\n \"list_models\",\n {},\n { predicate: (message) => message.type === \"list_models_response\" },\n )) as ListModelsResponse;\n return normalizeListModelsResponse(response);\n }\n\n async updateModel(\n runtime: RuntimeScope,\n payload: UpdateModelPayload,\n ): Promise<UpdateModelResult> {\n const response = (await this.request(\n \"update_model\",\n {\n runtime,\n payload,\n },\n { predicate: (message) => message.type === \"update_model_response\" },\n )) as UpdateModelResponse;\n return normalizeUpdateModelResponse(response);\n }\n\n async recoverPendingApprovals(\n runtime: RuntimeScope,\n options: RecoverPendingApprovalsOptions = {},\n ): Promise<RecoverPendingApprovalsResult> {\n const response = await this.client.sync(\n {\n runtime,\n recover_approvals: true,\n force_device_status: true,\n },\n options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {},\n );\n\n if (!response.success) {\n return {\n recovered: false,\n unsupported: false,\n detail: response.error ?? \"Failed to recover pending approvals\",\n };\n }\n\n return { recovered: true, unsupported: false };\n }\n\n async listMessages(\n conversationId: string,\n options: ListMessagesOptions = {},\n ): Promise<ListMessagesResult> {\n const query: Record<string, unknown> = {};\n if (options.before !== undefined) query.before = options.before;\n if (options.after !== undefined) query.after = options.after;\n if (options.order !== undefined) query.order = options.order;\n if (options.limit !== undefined) query.limit = options.limit;\n\n const response = (await this.request(\n \"conversation_messages_list\",\n {\n conversation_id: conversationId,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n },\n { predicate: (message) => message.type === \"conversation_messages_list_response\" },\n )) as ConversationMessagesListResponse;\n\n if (!response.success) {\n throw new Error(response.error ?? \"listMessages failed\");\n }\n\n const result: ListMessagesResult = {\n messages: response.messages ?? [],\n };\n const nextBefore =\n typeof response.nextBefore === \"string\" || response.nextBefore === null\n ? response.nextBefore\n : typeof response.next_before === \"string\" || response.next_before === null\n ? response.next_before\n : undefined;\n if (nextBefore !== undefined) result.nextBefore = nextBefore;\n const hasMore =\n typeof response.hasMore === \"boolean\"\n ? response.hasMore\n : typeof response.has_more === \"boolean\"\n ? response.has_more\n : undefined;\n if (hasMore !== undefined) result.hasMore = hasMore;\n return result;\n }\n\n close(): void {\n this.client.close();\n }\n}\n\nexport class AppServerSession extends RemoteClientSessionCore {\n private ownedAppServer: LocalAppServerHandle | null = null;\n private externalTools = new Map<string, AnyAgentTool>();\n private removeExternalToolHandler: (() => void) | null = null;\n private removeControlRequestHandler: (() => void) | null = null;\n\n constructor(\n private readonly remoteOptions: AppServerSessionOptions,\n mode: AppServerSessionMode,\n ) {\n super(mode, {\n label: \"app-server\",\n requestTimeoutMs: remoteOptions.requestTimeoutMs,\n });\n const tools = mode.options.tools;\n for (const tool of tools ?? []) {\n this.externalTools.set(tool.name, tool);\n }\n }\n\n protected override shouldEnableMemfs(options: LettaCodeClientSessionOptions | CreateAgentOptions): boolean {\n if (this.mode.kind !== \"create-agent\") return false;\n return (options as CreateAgentOptions).memfs !== false;\n }\n\n protected override async initializeRuntimeController(): Promise<RuntimeSessionInit> {\n const url = await this.resolveAppServerUrl();\n const client = createAppServerClient({\n url,\n ...(this.remoteOptions.authToken !== undefined\n ? { authToken: this.remoteOptions.authToken }\n : {}),\n ...(this.remoteOptions.WebSocket\n ? { WebSocket: this.remoteOptions.WebSocket as AppServerSocketConstructor }\n : {}),\n ...(this.remoteOptions.requestTimeoutMs !== undefined\n ? { requestTimeoutMs: this.remoteOptions.requestTimeoutMs }\n : {}),\n });\n\n this.removeControlRequestHandler = registerAppServerControlRequestHandler({\n client,\n getRuntime: () => this.runtime,\n getOptions: () => this.currentOptions(),\n });\n\n if (this.externalTools.size > 0) {\n this.removeExternalToolHandler = client.onExternalToolCall(\n createExternalToolCallHandler(this.externalTools),\n );\n }\n\n try {\n await client.connect();\n const response = await this.startRuntime(client);\n if (!response.success || !response.runtime) {\n throw new Error(response.error ?? \"Failed to start app-server runtime\");\n }\n\n const tools = agentToolNames(response.agent);\n const skillSources = this.currentOptions().skillSources;\n return {\n controller: new AppServerRuntimeController(\n client,\n this.remoteOptions,\n this.currentOptions().allowedTools,\n ),\n runtime: response.runtime,\n model: typeof response.agent?.model === \"string\" ? response.agent.model : \"\",\n modelSettings: response.agent?.model_settings ?? null,\n ...(tools !== undefined ? { tools } : {}),\n ...(skillSources !== undefined ? { skillSources: [...skillSources] } : {}),\n };\n } catch (error) {\n this.removeExternalToolHandler?.();\n this.removeExternalToolHandler = null;\n this.removeControlRequestHandler?.();\n this.removeControlRequestHandler = null;\n client.close();\n throw error;\n }\n }\n\n protected override onCoreClose(): void {\n this.removeExternalToolHandler?.();\n this.removeExternalToolHandler = null;\n this.removeControlRequestHandler?.();\n this.removeControlRequestHandler = null;\n this.ownedAppServer?.close();\n this.ownedAppServer = null;\n }\n\n private async resolveAppServerUrl(): Promise<string> {\n if (this.remoteOptions.url) {\n return this.remoteOptions.url;\n }\n if (this.remoteOptions.local !== true) {\n throw new Error(\"App-server session requires a url unless local app-server spawning is enabled.\");\n }\n // Session-level env layers over client-level env: each SDK-owned session\n // spawns its own app-server process, so this is a per-session scope.\n const sessionEnv = (\n this.mode.options as { env?: Record<string, string> }\n ).env;\n this.ownedAppServer = await startLocalAppServer({\n listen: this.remoteOptions.localListen,\n backend: this.remoteOptions.localBackend,\n startupTimeoutMs: this.remoteOptions.localStartupTimeoutMs,\n env: { ...this.remoteOptions.localEnv, ...sessionEnv },\n });\n return this.ownedAppServer.url;\n }\n\n private async startRuntime(client: AppServerClient): Promise<RuntimeStartResponse> {\n const command = await this.buildRuntimeStartCommand(client);\n const response = (await client.runtimeStart(command)) as unknown as RuntimeStartResponse;\n return response;\n }\n\n private async buildRuntimeStartCommand(client: AppServerClient): Promise<RuntimeStartCommand> {\n const options = this.mode.options;\n const command: Record<string, unknown> = {\n client_info: {\n name: \"@letta-ai/letta-agent-sdk\",\n title: \"Letta Agent SDK\",\n },\n recover_approvals: false,\n force_device_status: true,\n };\n\n const mode = mapPermissionMode(options.permissionMode);\n if (mode) command.mode = mode;\n if (options.cwd !== undefined) command.cwd = options.cwd;\n // Keep the distinction between omitted (use harness defaults) and []\n // (disable bundled/global/agent/project skills). The app-server runtime is\n // session-scoped, so this must be sent on creation and every resume.\n if (options.skillSources !== undefined) {\n command.skill_sources = [...new Set(options.skillSources)];\n }\n const groups = externalToolGroups(options.tools);\n if (groups) command.external_tools = groups;\n\n if (this.mode.kind === \"create-agent\") {\n command.create_agent = {\n body: createAgentBody(this.mode.options, {\n includeSdkOriginTag: this.remoteOptions.includeSdkOriginTag,\n }),\n // Hidden (worker-style) agents default to unpinned.\n pin_global:\n this.remoteOptions.pinGlobalAgent ??\n (this.mode.options as CreateAgentOptions).hidden !== true,\n // Signal memfs-less (worker-style) creation to the harness so it\n // skips the memfs tag/settings/clone entirely; older harnesses\n // ignore the field, and the client-side enable_memfs skip still\n // applies either way.\n ...((this.mode.options as CreateAgentOptions).memfs === false\n ? { memfs: false }\n : {}),\n };\n return command as RuntimeStartCommand;\n }\n\n if (this.mode.agentId) {\n command.agent_id = this.mode.agentId;\n if (this.mode.newConversation) {\n command.create_conversation = { body: {} };\n } else if (this.mode.defaultConversation) {\n command.conversation_id = \"default\";\n }\n return command as RuntimeStartCommand;\n }\n\n if (this.mode.conversationId) {\n const agentId = await this.resolveConversationAgentId(client, this.mode.conversationId);\n command.agent_id = agentId;\n command.conversation_id = this.mode.conversationId;\n return command as RuntimeStartCommand;\n }\n\n throw new Error(\n \"App-server createSession() requires an agent id. Call createAgent() first or pass an agent id.\",\n );\n }\n\n private async resolveConversationAgentId(\n client: AppServerClient,\n conversationId: string,\n ): Promise<string> {\n const request = client.request.bind(client) as unknown as (\n commandType: string,\n commandBody: Record<string, unknown>,\n options?: { predicate?: (message: ProtocolMessage) => boolean },\n ) => Promise<ProtocolMessage>;\n const response = (await request(\n \"conversation_retrieve\",\n { conversation_id: conversationId },\n { predicate: (message) => message.type === \"conversation_retrieve_response\" },\n )) as ConversationRetrieveResponse;\n if (!response.success || !response.conversation?.agent_id) {\n throw new Error(response.error ?? `Failed to retrieve conversation ${conversationId}`);\n }\n return response.conversation.agent_id;\n }\n\n}\n",
14
14
  "export type RemoteEnvironmentTarget =\n | { connectionId: string }\n | { environmentId: string }\n | { deviceId: string }\n | { connectionName: string };\n\nexport interface RemoteEnvironmentClientOptions {\n /** Letta API base URL. Defaults to https://api.letta.com. */\n baseUrl?: string;\n /** Bearer token / API key. Defaults to process.env.LETTA_API_KEY when present. */\n apiKey?: string;\n /** Additional headers, e.g. x-project-id. */\n headers?: Record<string, string>;\n /** Custom fetch implementation for tests or non-standard runtimes. */\n fetch?: typeof fetch;\n}\n\nexport interface RemoteEnvironmentConnection {\n id: string;\n connectionId: string | null;\n deviceId: string;\n connectionName: string;\n organizationId: string;\n userId?: string;\n apiKeyOwner?: string;\n podId: string | null;\n connectedAt: number | null;\n lastHeartbeat: number | null;\n lastSeenAt: number;\n firstSeenAt: number;\n currentMode?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RemoteEnvironmentListResult {\n connections: RemoteEnvironmentConnection[];\n hasNextPage: boolean;\n}\n\nexport interface ResolvedRemoteEnvironment {\n connectionId: string;\n environment?: RemoteEnvironmentConnection;\n target: RemoteEnvironmentTarget;\n}\n\ntype RemoteFetch = typeof fetch;\n\nfunction getDefaultApiKey(): string | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n return process.env.LETTA_API_KEY;\n}\n\nfunction createHeaders(options: RemoteEnvironmentClientOptions): Record<string, string> {\n const apiKey = options.apiKey ?? getDefaultApiKey();\n return {\n ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n ...(options.headers ?? {}),\n };\n}\n\nfunction getFetch(options: RemoteEnvironmentClientOptions): RemoteFetch {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\"Remote environments require a fetch implementation\");\n }\n return fetchImpl.bind(globalThis) as RemoteFetch;\n}\n\nfunction normalizeBaseUrl(baseUrl?: string): string {\n return (baseUrl ?? \"https://api.letta.com\").replace(/\\/$/, \"\");\n}\n\nfunction ensureOnline(\n environment: RemoteEnvironmentConnection,\n target: RemoteEnvironmentTarget,\n): ResolvedRemoteEnvironment {\n if (!environment.connectionId) {\n const label =\n \"deviceId\" in target\n ? target.deviceId\n : \"environmentId\" in target\n ? target.environmentId\n : \"connectionName\" in target\n ? target.connectionName\n : environment.deviceId;\n throw new Error(`Remote environment is offline: ${label}`);\n }\n\n return {\n connectionId: environment.connectionId,\n environment,\n target,\n };\n}\n\nasync function parseJsonResponse<T>(response: Response): Promise<T> {\n const text = await response.text();\n const body = text ? JSON.parse(text) : null;\n\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"message\" in body\n ? String((body as { message: unknown }).message)\n : response.statusText;\n throw new Error(`Letta API request failed (${response.status}): ${message}`);\n }\n\n return body as T;\n}\n\n/**\n * Small Cloud API helper for resolving explicit Letta Code environments.\n */\nexport class RemoteEnvironmentClient {\n private readonly baseUrl: string;\n private readonly fetchImpl: RemoteFetch;\n\n constructor(private readonly options: RemoteEnvironmentClientOptions = {}) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n this.fetchImpl = getFetch(options);\n }\n\n async listEnvironments(): Promise<RemoteEnvironmentListResult> {\n const url = new URL(`${this.baseUrl}/v1/environments`);\n const response = await this.fetchImpl(url, {\n headers: createHeaders(this.options),\n });\n return parseJsonResponse<RemoteEnvironmentListResult>(response);\n }\n\n async getEnvironmentByDeviceId(deviceId: string): Promise<RemoteEnvironmentConnection> {\n const response = await this.fetchImpl(\n `${this.baseUrl}/v1/environments/${encodeURIComponent(deviceId)}`,\n { headers: createHeaders(this.options) },\n );\n return parseJsonResponse<RemoteEnvironmentConnection>(response);\n }\n\n async resolveEnvironment(target: RemoteEnvironmentTarget): Promise<ResolvedRemoteEnvironment> {\n if (\"connectionId\" in target) {\n return { connectionId: target.connectionId, target };\n }\n\n if (\"deviceId\" in target) {\n return ensureOnline(await this.getEnvironmentByDeviceId(target.deviceId), target);\n }\n\n const { connections } = await this.listEnvironments();\n if (\"environmentId\" in target) {\n const match = connections.find((env) => env.id === target.environmentId);\n if (!match) {\n throw new Error(`Remote environment not found: ${target.environmentId}`);\n }\n return ensureOnline(match, target);\n }\n\n const matches = connections.filter(\n (env) => env.connectionName === target.connectionName,\n );\n if (matches.length === 0) {\n throw new Error(`Remote environment not found: ${target.connectionName}`);\n }\n if (matches.length > 1) {\n throw new Error(\n `Remote environment name is ambiguous: ${target.connectionName}`,\n );\n }\n const match = matches[0];\n if (!match) {\n throw new Error(`Remote environment not found: ${target.connectionName}`);\n }\n return ensureOnline(match, target);\n }\n\n}\n",
15
- "import {\n createAppServerClient,\n type AppServerClient,\n type AppServerSocketConstructor,\n type AppServerSocketLike,\n type AppServerSocketOptions,\n} from \"@letta-ai/letta-code/app-server-client\";\nimport {\n AppServerRuntimeController,\n AppServerSession,\n agentToolNames,\n createExternalToolCallHandler,\n externalToolGroups,\n registerAppServerControlRequestHandler,\n type AppServerSessionOptions,\n} from \"./app-server-session.js\";\nimport {\n RemoteEnvironmentClient,\n type RemoteEnvironmentTarget,\n} from \"./remote.js\";\nimport {\n RemoteClientSessionCore,\n mapPermissionMode,\n type ProtocolMessage,\n type RuntimeScope,\n type RuntimeSessionInit,\n type RuntimeSessionMode,\n} from \"./remote-client-session-core.js\";\nimport type {\n AnyAgentTool,\n CreateAgentOptions,\n LettaCodeClientSessionOptions,\n LettaCodeCloudClientOptions,\n LettaCodeCloudSandboxOptions,\n LettaCodeEnvironment,\n LettaCodeSocketConstructor,\n LettaCodeSocketLike,\n RepositoryResource,\n} from \"./types.js\";\n\nconst DEFAULT_CLOUD_API_BASE_URL = \"https://api.letta.com\";\nconst DEFAULT_TURN_TIMEOUT_MS = 120_000;\nconst DEFAULT_PING_INTERVAL_MS = 30_000;\nconst DEFAULT_SANDBOX_TTL_MINUTES = 5;\nconst MIN_SANDBOX_TTL_MINUTES = 1;\nconst MAX_SANDBOX_TTL_MINUTES = 60;\nconst DEFAULT_SANDBOX_READY_TIMEOUT_MS = 120_000;\nconst DEFAULT_SANDBOX_READY_POLL_INTERVAL_MS = 1_000;\nconst DEFAULT_REPOSITORY_ATTACH_TIMEOUT_MS = 10_000;\nconst DEFAULT_REPOSITORY_ATTACH_POLL_INTERVAL_MS = 250;\nconst SDK_AGENT_ORIGIN = \"@letta-ai/letta-agent-sdk\";\n\ntype FetchLike = typeof fetch;\n\ntype CloudStatusMessage = ProtocolMessage & {\n type: string;\n seq?: unknown;\n event_seq?: unknown;\n idempotency_key?: unknown;\n runId?: unknown;\n run_id?: unknown;\n stopReason?: unknown;\n stop_reason?: unknown;\n conversation_id?: unknown;\n conversationId?: unknown;\n agent_id?: unknown;\n agentId?: unknown;\n request?: unknown;\n loop_status?: unknown;\n delta?: unknown;\n};\n\ntype CloudRuntimeStartResponse = ProtocolMessage & {\n type: \"runtime_start_response\";\n success: boolean;\n runtime: RuntimeScope | null;\n agent: (Record<string, unknown> & {\n id?: string;\n model?: string | null;\n model_settings?: Record<string, unknown> | null;\n }) | null;\n conversation: (Record<string, unknown> & { id?: string; agent_id?: string }) | null;\n error?: string;\n};\n\ntype CloudConversation = Record<string, unknown> & {\n id?: string;\n agent_id?: string;\n};\n\ntype CloudAgentSandbox = Record<string, unknown> & {\n sandboxId?: string;\n deviceId?: string;\n connectionName?: string;\n};\n\ntype CloudAgentSandboxRefresh = Record<string, unknown> & {\n success?: boolean;\n sandboxId?: string;\n ttlMinutes?: number;\n};\n\ntype ManagedCloudSandbox = {\n agentId: string;\n sandboxId: string;\n deviceId: string;\n connectionName: string;\n ttlMinutes: number;\n readyTimeoutMs: number;\n readyPollIntervalMs: number;\n refreshIntervalMs: number;\n terminateOnClose: boolean;\n};\n\ntype ResolvedCloudConnection = {\n connectionId: string;\n};\n\nclass CloudManagedSandboxOwnershipError extends Error {}\n\ntype CloudSessionMode = Extract<RuntimeSessionMode, { kind: \"session\" }>;\n\ntype CloudAgentRepository = {\n id: string;\n name?: string;\n is_primary?: boolean;\n};\n\nfunction getDefaultApiKey(): string | undefined {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env;\n return env?.LETTA_API_KEY ?? env?.LETTA_CLOUD_API_KEY;\n}\n\nfunction bearerTokenFromHeaders(headers: Record<string, string> | undefined): string | undefined {\n const authorization = headers?.Authorization ?? headers?.authorization;\n if (!authorization) return undefined;\n const match = /^Bearer\\s+(.+)$/i.exec(authorization);\n return match?.[1];\n}\n\nfunction getCloudApiKey(options: LettaCodeCloudClientOptions): string | undefined {\n return options.apiKey ?? bearerTokenFromHeaders(options.headers) ?? getDefaultApiKey();\n}\n\nfunction getFetch(fetchOverride?: FetchLike): FetchLike {\n const resolved = fetchOverride ?? globalThis.fetch;\n if (!resolved) {\n throw new Error(\"No fetch implementation available for cloud backend.\");\n }\n return resolved.bind(globalThis) as FetchLike;\n}\n\nfunction getWebSocketConstructor(\n websocketOverride?: LettaCodeSocketConstructor,\n): LettaCodeSocketConstructor {\n const resolved =\n websocketOverride ??\n (globalThis as { WebSocket?: LettaCodeSocketConstructor }).WebSocket;\n if (!resolved) {\n throw new Error(\"No WebSocket implementation available for cloud backend.\");\n }\n return resolved;\n}\n\nfunction normalizeCloudApiBaseUrl(url: string | undefined): string {\n const parsed = new URL(url ?? DEFAULT_CLOUD_API_BASE_URL);\n parsed.pathname = parsed.pathname.replace(/\\/+$/, \"\");\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nfunction cloudHeaders(options: LettaCodeCloudClientOptions): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options.headers ?? {}),\n };\n const apiKey = getCloudApiKey(options);\n if (apiKey && !headers.Authorization && !headers.authorization) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n return headers;\n}\n\nfunction cloudWebSocketHeaders(options: LettaCodeCloudClientOptions): Record<string, string> | undefined {\n const headers = { ...(options.headers ?? {}) };\n delete headers.authorization;\n delete headers.Authorization;\n const apiKey = getCloudApiKey(options);\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nasync function parseJsonResponse(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nfunction responseErrorMessage(body: unknown, fallback: string): string {\n if (body && typeof body === \"object\") {\n const record = body as Record<string, unknown>;\n const message = record.message ?? record.error ?? record.detail;\n const reasonText = record.reason_text;\n const pieces = [message, reasonText]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (pieces.length > 0) return pieces.join(\": \");\n }\n return fallback;\n}\n\nfunction assertOkResponse(response: Response, body: unknown, action: string): void {\n if (!response.ok) {\n throw new Error(\n responseErrorMessage(body, `${action} failed with HTTP ${response.status}`),\n );\n }\n}\n\nfunction validatePositiveInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value <= 0)) {\n throw new Error(`Invalid ${name}. Expected a positive integer.`);\n }\n}\n\nfunction validateIntegerRange(\n value: number | undefined,\n name: string,\n min: number,\n max: number,\n): void {\n if (value === undefined) return;\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`Invalid ${name}. Expected an integer between ${min} and ${max}.`);\n }\n}\n\nfunction validateCloudSandboxOptions(\n options: LettaCodeCloudSandboxOptions | undefined,\n name: string,\n): void {\n if (options === undefined) return;\n if (options === null || typeof options !== \"object\" || Array.isArray(options)) {\n throw new Error(`Invalid ${name}. Expected an object.`);\n }\n validateIntegerRange(\n options.ttlMinutes,\n `${name}.ttlMinutes`,\n MIN_SANDBOX_TTL_MINUTES,\n MAX_SANDBOX_TTL_MINUTES,\n );\n validatePositiveInteger(options.readyTimeoutMs, `${name}.readyTimeoutMs`);\n validatePositiveInteger(options.readyPollIntervalMs, `${name}.readyPollIntervalMs`);\n validatePositiveInteger(options.refreshIntervalMs, `${name}.refreshIntervalMs`);\n if (\n options.terminateOnClose !== undefined &&\n typeof options.terminateOnClose !== \"boolean\"\n ) {\n throw new Error(`Invalid ${name}.terminateOnClose. Expected a boolean.`);\n }\n}\n\nexport function validateCloudClientOptions(options: LettaCodeCloudClientOptions): void {\n validatePositiveInteger(options.requestTimeoutMs, \"requestTimeoutMs\");\n validatePositiveInteger(options.appServer?.requestTimeoutMs, \"appServer.requestTimeoutMs\");\n validatePositiveInteger(options.appServer?.startupTimeoutMs, \"appServer.startupTimeoutMs\");\n validateCloudSandboxOptions(options.sandbox, \"sandbox\");\n if (options.environment !== undefined && options.sandbox !== undefined) {\n throw new Error(\"Constellation sessions cannot specify both environment and sandbox options.\");\n }\n if (\n options.webSocketAuth !== undefined &&\n options.webSocketAuth !== \"header\" &&\n options.webSocketAuth !== \"query\"\n ) {\n throw new Error(\"Invalid webSocketAuth. Valid values: header, query.\");\n }\n}\n\nfunction environmentToRemoteTarget(\n environment: LettaCodeEnvironment,\n): RemoteEnvironmentTarget {\n if (typeof environment === \"string\") {\n return { connectionName: environment };\n }\n if (\"name\" in environment) {\n return { connectionName: environment.name };\n }\n if (\"id\" in environment) {\n return { environmentId: environment.id };\n }\n if (\"connectionId\" in environment) {\n return { connectionId: environment.connectionId };\n }\n if (\"deviceId\" in environment) {\n return { deviceId: environment.deviceId };\n }\n throw new Error(\"Unknown cloud environment selector.\");\n}\n\nfunction buildCloudStatusWebSocketUrl(params: {\n apiBaseUrl?: string;\n connectionId: string;\n agentId: string;\n conversationId: string;\n apiKey?: string;\n authMode: \"header\" | \"query\";\n}): string {\n const base = new URL(normalizeCloudApiBaseUrl(params.apiBaseUrl));\n if (base.protocol === \"http:\") {\n base.protocol = \"ws:\";\n } else if (base.protocol === \"https:\") {\n base.protocol = \"wss:\";\n } else if (base.protocol !== \"ws:\" && base.protocol !== \"wss:\") {\n throw new Error(`Unsupported cloud apiBaseUrl protocol: ${base.protocol}`);\n }\n base.pathname = `/v1/environments/${encodeURIComponent(params.connectionId)}/status/ws`;\n base.searchParams.set(\"agentId\", params.agentId);\n base.searchParams.set(\"conversationId\", params.conversationId);\n base.searchParams.set(\"channel\", \"stream\");\n if (params.authMode === \"query\" && params.apiKey) {\n base.searchParams.set(\"token\", params.apiKey);\n }\n return base.toString();\n}\n\nfunction addSocketListener(\n socket: LettaCodeSocketLike,\n type: string,\n listener: (event: unknown) => void,\n): () => void {\n if (socket.addEventListener) {\n socket.addEventListener(type, listener);\n return () => socket.removeEventListener?.(type, listener);\n }\n if (socket.on) {\n socket.on(type, listener);\n return () => socket.off?.(type, listener);\n }\n throw new Error(\"WebSocket implementation does not support event listeners.\");\n}\n\nfunction messageEventData(event: unknown): string | null {\n if (typeof event === \"string\") return event;\n if (event && typeof event === \"object\") {\n const data = (event as { data?: unknown }).data;\n if (typeof data === \"string\") return data;\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(data);\n }\n if (data instanceof Uint8Array) {\n return new TextDecoder().decode(data);\n }\n }\n return null;\n}\n\ntype CloudStatusSocketControl = AppServerSocketLike & {\n sendCloudCommand(command: Record<string, unknown>): void;\n};\n\ntype CloudStatusSocketState = {\n runtime: RuntimeScope;\n seenIdempotencyKeys: Set<string>;\n seenIdempotencyOrder: string[];\n lastEventSeq: number | null;\n controlSocket: CloudStatusSocketControl | null;\n};\n\nfunction createCloudStatusWebSocketConstructor(params: {\n cloudOptions: LettaCodeCloudClientOptions;\n runtime: RuntimeScope;\n}): AppServerSocketConstructor {\n const WebSocketCtor = getWebSocketConstructor(params.cloudOptions.WebSocket);\n const authMode = params.cloudOptions.webSocketAuth ?? \"header\";\n const cloudHeaders = authMode === \"header\" ? cloudWebSocketHeaders(params.cloudOptions) : undefined;\n const pingIntervalMs = params.cloudOptions.pingIntervalMs ?? DEFAULT_PING_INTERVAL_MS;\n const state: CloudStatusSocketState = {\n runtime: params.runtime,\n seenIdempotencyKeys: new Set<string>(),\n seenIdempotencyOrder: [],\n lastEventSeq: null,\n controlSocket: null,\n };\n\n class CloudStatusSocketAdapter implements AppServerSocketLike {\n private readonly socket: LettaCodeSocketLike;\n private readonly channel: string | null;\n private readonly listenerRemovers = new Map<string, Map<(event: unknown) => void, () => void>>();\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private removeCloseListener: (() => void) | null = null;\n\n constructor(url: string, options?: AppServerSocketOptions) {\n this.channel = new URL(url).searchParams.get(\"channel\");\n const mergedHeaders = authMode === \"header\"\n ? {\n ...(options?.headers ?? {}),\n ...(cloudHeaders ?? {}),\n }\n : undefined;\n const socketOptions = mergedHeaders && Object.keys(mergedHeaders).length > 0\n ? { headers: mergedHeaders }\n : undefined;\n this.socket = new WebSocketCtor(url, socketOptions);\n if (this.channel === \"control\") {\n state.controlSocket = this;\n }\n this.removeCloseListener = addSocketListener(this.socket, \"close\", () => {\n this.stopPing();\n if (state.controlSocket === this) state.controlSocket = null;\n });\n this.startPing(pingIntervalMs);\n }\n\n get readyState(): number {\n return this.socket.readyState;\n }\n\n send(data: string): void {\n this.socket.send(data);\n }\n\n close(): void {\n this.stopPing();\n this.removeCloseListener?.();\n this.removeCloseListener = null;\n if (state.controlSocket === this) state.controlSocket = null;\n this.socket.close();\n }\n\n addEventListener(type: string, listener: (event: unknown) => void): void {\n const wrapped = type === \"message\"\n ? (event: unknown) => {\n if (this.handleIncomingMessage(event)) {\n listener(event);\n }\n }\n : listener;\n const remove = addSocketListener(this.socket, type, wrapped);\n let typeRemovers = this.listenerRemovers.get(type);\n if (!typeRemovers) {\n typeRemovers = new Map();\n this.listenerRemovers.set(type, typeRemovers);\n }\n typeRemovers.set(listener, remove);\n }\n\n removeEventListener(type: string, listener: (event: unknown) => void): void {\n const typeRemovers = this.listenerRemovers.get(type);\n const remove = typeRemovers?.get(listener);\n if (!remove) return;\n remove();\n typeRemovers?.delete(listener);\n if (typeRemovers?.size === 0) {\n this.listenerRemovers.delete(type);\n }\n }\n\n private handleIncomingMessage(event: unknown): boolean {\n const data = messageEventData(event);\n if (!data) return true;\n\n let message: CloudStatusMessage;\n try {\n message = JSON.parse(data) as CloudStatusMessage;\n } catch {\n return true;\n }\n\n this.ackIfSequenced(message);\n\n // The status gateway can mirror device stream frames to the control\n // subscriber. Drop them at the Cloud transport boundary instead of making\n // shared app-server session code understand Cloud fanout quirks. Do this\n // before idempotency/event tracking so the canonical stream-channel frame\n // is still delivered and sequenced.\n if (this.channel === \"control\" && message.type === \"stream_delta\") {\n return false;\n }\n\n if (this.isDuplicate(message)) return false;\n this.trackEventSeq(message);\n return true;\n }\n\n private ackIfSequenced(message: CloudStatusMessage): void {\n if (typeof message.seq !== \"number\") return;\n this.sendCloudCommand({ type: \"ack\", seq: message.seq });\n }\n\n private isDuplicate(message: CloudStatusMessage): boolean {\n const idempotencyKey =\n typeof message.idempotency_key === \"string\" ? message.idempotency_key : undefined;\n if (!idempotencyKey) return false;\n if (state.seenIdempotencyKeys.has(idempotencyKey)) return true;\n state.seenIdempotencyKeys.add(idempotencyKey);\n state.seenIdempotencyOrder.push(idempotencyKey);\n while (state.seenIdempotencyOrder.length > 1_000) {\n const oldest = state.seenIdempotencyOrder.shift();\n if (oldest) state.seenIdempotencyKeys.delete(oldest);\n }\n return false;\n }\n\n private trackEventSeq(message: CloudStatusMessage): void {\n if (typeof message.event_seq !== \"number\") return;\n if (state.lastEventSeq !== null && message.event_seq > state.lastEventSeq + 1) {\n this.sendSync(true);\n }\n if (state.lastEventSeq === null || message.event_seq > state.lastEventSeq) {\n state.lastEventSeq = message.event_seq;\n }\n }\n\n private sendSync(recoverApprovals: boolean): void {\n const target = state.controlSocket?.readyState === 1 ? state.controlSocket : this;\n target.sendCloudCommand({\n type: \"sync\",\n runtime: state.runtime,\n recover_approvals: recoverApprovals,\n force_device_status: true,\n });\n }\n\n sendCloudCommand(command: Record<string, unknown>): void {\n if (this.readyState !== 1) return;\n try {\n this.socket.send(JSON.stringify(command));\n } catch {\n // Best-effort Cloud status reliability command.\n }\n }\n\n private startPing(intervalMs: number): void {\n if (this.pingTimer) return;\n this.pingTimer = setInterval(() => {\n this.sendCloudCommand({ type: \"ping\" });\n }, intervalMs);\n (this.pingTimer as { unref?: () => void }).unref?.();\n }\n\n private stopPing(): void {\n if (!this.pingTimer) return;\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n\n return CloudStatusSocketAdapter as AppServerSocketConstructor;\n}\n\nfunction isCloudConversation(value: unknown): value is CloudConversation & { id: string } {\n return Boolean(value && typeof value === \"object\" && typeof (value as CloudConversation).id === \"string\");\n}\n\nfunction isCloudAgentSandbox(\n value: unknown,\n): value is CloudAgentSandbox & { sandboxId: string; deviceId: string; connectionName: string } {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as CloudAgentSandbox).sandboxId === \"string\" &&\n typeof (value as CloudAgentSandbox).deviceId === \"string\" &&\n typeof (value as CloudAgentSandbox).connectionName === \"string\",\n );\n}\n\nfunction isCloudAgentSandboxRefresh(\n value: unknown,\n): value is CloudAgentSandboxRefresh & { success: boolean; sandboxId: string; ttlMinutes: number } {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as CloudAgentSandboxRefresh).success === \"boolean\" &&\n typeof (value as CloudAgentSandboxRefresh).sandboxId === \"string\" &&\n typeof (value as CloudAgentSandboxRefresh).ttlMinutes === \"number\",\n );\n}\n\nfunction isRetryableManagedSandboxResolveError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return (\n message.includes(\"Remote environment is offline\") ||\n message.toLowerCase().includes(\"not found\") ||\n message.includes(\"(404)\")\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction externalToolsByName(tools: AnyAgentTool[] | undefined): Map<string, AnyAgentTool> {\n const result = new Map<string, AnyAgentTool>();\n for (const tool of tools ?? []) {\n result.set(tool.name, tool);\n }\n return result;\n}\n\nfunction cloudHarnessAppServerOptions(\n clientOptions: LettaCodeCloudClientOptions,\n): AppServerSessionOptions {\n const appServer = clientOptions.appServer;\n const apiKey = getCloudApiKey(clientOptions);\n const localEnv: Record<string, string | undefined> = {\n ...(apiKey ? { LETTA_API_KEY: apiKey } : {}),\n ...(clientOptions.apiBaseUrl\n ? { LETTA_BASE_URL: normalizeCloudApiBaseUrl(clientOptions.apiBaseUrl) }\n : {}),\n };\n return {\n local: appServer?.url === undefined,\n localBackend: \"api\",\n ...(appServer?.url !== undefined ? { url: appServer.url } : {}),\n ...(appServer?.WebSocket !== undefined ? { WebSocket: appServer.WebSocket } : {}),\n ...(clientOptions.requestTimeoutMs !== undefined || appServer?.requestTimeoutMs !== undefined\n ? { requestTimeoutMs: appServer?.requestTimeoutMs ?? clientOptions.requestTimeoutMs }\n : {}),\n ...(appServer?.listen !== undefined ? { localListen: appServer.listen } : {}),\n ...(appServer?.startupTimeoutMs !== undefined\n ? { localStartupTimeoutMs: appServer.startupTimeoutMs }\n : {}),\n ...(Object.keys(localEnv).length > 0 ? { localEnv } : {}),\n };\n}\n\nexport async function createCloudAgent(\n clientOptions: LettaCodeCloudClientOptions,\n agentOptions: CreateAgentOptions,\n): Promise<string> {\n const session = new AppServerSession(cloudHarnessAppServerOptions(clientOptions), {\n kind: \"create-agent\",\n options: agentOptions,\n });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n}\n\nexport function assertCloudSessionOptionsSupported(\n action: string,\n options: LettaCodeClientSessionOptions,\n): void {\n validateCloudSandboxOptions(options.sandbox, \"sandbox\");\n if (options.environment !== undefined && options.sandbox !== undefined) {\n throw new Error(`Constellation ${action}() cannot specify both environment and sandbox options.`);\n }\n if (options.systemPrompt !== undefined) {\n throw new Error(`Constellation ${action}() cannot rewrite an existing agent's systemPrompt from the SDK adapter yet.`);\n }\n if (options.allowedTools !== undefined || options.disallowedTools !== undefined) {\n throw new Error(`Constellation ${action}() has not wired allowedTools/disallowedTools to the remote device protocol yet.`);\n }\n if (options.skillSources !== undefined) {\n throw new Error(`Constellation ${action}() has not wired skillSources to the remote device protocol yet.`);\n }\n if (options.systemInfoReminder !== undefined) {\n throw new Error(`Constellation ${action}() has not wired systemInfoReminder to the remote device protocol yet.`);\n }\n if (options.dreaming?.behavior !== undefined) {\n throw new Error(`Constellation ${action}() does not yet support dreaming.behavior overrides.`);\n }\n if ((options as { memfsStartup?: unknown }).memfsStartup !== undefined) {\n throw new Error(`Constellation ${action}() does not support memfsStartup.`);\n }\n if (options.includePartialMessages !== undefined) {\n throw new Error(`Constellation ${action}() streams Remote Client deltas directly; includePartialMessages is not a separate toggle.`);\n }\n}\n\nexport class CloudEnvironmentSession extends RemoteClientSessionCore {\n private connectionId: string | null = null;\n private removeExternalToolHandler: (() => void) | null = null;\n private removeControlRequestHandler: (() => void) | null = null;\n private externalTools = new Map<string, AnyAgentTool>();\n private managedSandbox: ManagedCloudSandbox | null = null;\n private sandboxRefreshTimer: ReturnType<typeof setInterval> | null = null;\n private sandboxRefreshInFlight: Promise<void> | null = null;\n private attachedRepositoryIds = new Set<string>();\n private readonly cloudMode: CloudSessionMode;\n\n constructor(\n private readonly cloudOptions: LettaCodeCloudClientOptions,\n mode: CloudSessionMode,\n ) {\n super(mode, {\n label: \"cloud\",\n requestTimeoutMs: cloudOptions.requestTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n });\n this.cloudMode = mode;\n const tools = mode.options.tools;\n this.externalTools = externalToolsByName(tools);\n }\n\n protected override async initializeRuntimeController(): Promise<RuntimeSessionInit> {\n const resolved = await this.resolveRuntime();\n const connection = await this.resolveConnectionForRuntime(resolved.runtime);\n this.connectionId = connection.connectionId;\n\n const apiKey = getCloudApiKey(this.cloudOptions);\n const url = buildCloudStatusWebSocketUrl({\n apiBaseUrl: this.cloudOptions.apiBaseUrl,\n connectionId: connection.connectionId,\n agentId: resolved.runtime.agent_id,\n conversationId: resolved.runtime.conversation_id,\n apiKey,\n authMode: this.cloudOptions.webSocketAuth ?? \"header\",\n });\n const client = createAppServerClient({\n url,\n WebSocket: createCloudStatusWebSocketConstructor({\n cloudOptions: this.cloudOptions,\n runtime: resolved.runtime,\n }),\n requestTimeoutMs: this.cloudOptions.requestTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n });\n this.removeControlRequestHandler = registerAppServerControlRequestHandler({\n client,\n getRuntime: () => this.runtime,\n getOptions: () => this.currentOptions(),\n });\n if (this.externalTools.size > 0) {\n this.removeExternalToolHandler = client.onExternalToolCall(\n createExternalToolCallHandler(this.externalTools),\n );\n }\n\n try {\n await client.connect();\n const response = await this.startCloudRuntime(client, resolved.runtime);\n if (!response.success || !response.runtime) {\n throw new Error(response.error ?? \"Failed to start Cloud status runtime\");\n }\n\n const tools = agentToolNames(response.agent);\n return {\n controller: new AppServerRuntimeController(client, {\n requestTimeoutMs: this.cloudOptions.requestTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n }),\n runtime: response.runtime,\n model: typeof response.agent?.model === \"string\" ? response.agent.model : \"\",\n modelSettings: response.agent?.model_settings ?? null,\n ...(tools !== undefined ? { tools } : {}),\n };\n } catch (error) {\n this.removeExternalToolHandler?.();\n this.removeExternalToolHandler = null;\n this.removeControlRequestHandler?.();\n this.removeControlRequestHandler = null;\n client.close();\n await this.cleanupManagedSandbox();\n await this.cleanupSessionRepositories(resolved.runtime.agent_id);\n throw error;\n }\n }\n\n private async startCloudRuntime(\n client: AppServerClient,\n runtime: RuntimeScope,\n ): Promise<CloudRuntimeStartResponse> {\n const options = this.currentOptions();\n const command: Record<string, unknown> = {\n client_info: {\n name: SDK_AGENT_ORIGIN,\n title: \"Letta Agent SDK\",\n },\n agent_id: runtime.agent_id,\n conversation_id: runtime.conversation_id,\n recover_approvals: false,\n force_device_status: true,\n };\n\n const mode = mapPermissionMode(options.permissionMode);\n if (mode) command.mode = mode;\n if (options.cwd !== undefined) command.cwd = options.cwd;\n const groups = externalToolGroups(options.tools);\n if (groups) command.external_tools = groups;\n\n return (await client.runtimeStart(\n command as Parameters<AppServerClient[\"runtimeStart\"]>[0],\n )) as unknown as CloudRuntimeStartResponse;\n }\n\n protected override async afterRuntimeInitialized(): Promise<void> {\n if (!this.controller || !this.runtime) return;\n this.controller.send({\n type: \"sync\",\n runtime: this.runtime,\n recover_approvals: true,\n force_device_status: true,\n });\n }\n\n protected override async beforeTurn(): Promise<void> {\n const sandbox = this.managedSandbox;\n if (!sandbox) return;\n await this.refreshManagedSandbox(sandbox);\n }\n\n protected override onCoreClose(): void {\n this.removeExternalToolHandler?.();\n this.removeExternalToolHandler = null;\n this.removeControlRequestHandler?.();\n this.removeControlRequestHandler = null;\n void this.cleanupManagedSandbox();\n if (this.runtime?.agent_id) void this.cleanupSessionRepositories(this.runtime.agent_id);\n }\n\n private async resolveRuntime(): Promise<{ runtime: RuntimeScope }> {\n let agentId = this.cloudMode.agentId;\n let conversationId = this.cloudMode.conversationId;\n\n if (!agentId && conversationId) {\n const conversation = await this.retrieveConversation(conversationId);\n if (!conversation.agent_id) {\n throw new Error(`Cloud conversation ${conversationId} did not include an agent id.`);\n }\n agentId = conversation.agent_id;\n }\n\n if (!agentId) {\n throw new Error(\n \"Constellation createSession()/resumeSession() requires an agent id or conversation id.\",\n );\n }\n\n await this.attachSessionRepositories(agentId);\n\n if (this.cloudMode.newConversation) {\n const conversation = await this.createConversation(agentId);\n conversationId = conversation.id;\n } else if (this.cloudMode.defaultConversation) {\n conversationId = \"default\";\n }\n\n if (!conversationId) {\n throw new Error(\n \"Constellation createSession()/resumeSession() requires an agent id or conversation id.\",\n );\n }\n\n return { runtime: { agent_id: agentId, conversation_id: conversationId } };\n }\n\n private async attachSessionRepositories(agentId: string): Promise<void> {\n const resources = this.repositoryResources();\n if (resources.length === 0) return;\n\n const existing = await this.listAgentRepositories(agentId);\n const existingIds = new Set(existing.map((repository) => repository.id));\n\n try {\n for (const resource of resources) {\n if (existingIds.has(resource.repositoryId) || this.attachedRepositoryIds.has(resource.repositoryId)) {\n continue;\n }\n await this.linkAgentRepository(agentId, resource.repositoryId);\n await this.waitForAgentRepository(agentId, resource.repositoryId);\n this.attachedRepositoryIds.add(resource.repositoryId);\n }\n } catch (error) {\n await this.cleanupSessionRepositories(agentId);\n throw error;\n }\n }\n\n private async cleanupSessionRepositories(agentId: string): Promise<void> {\n const repositoryIds = [...this.attachedRepositoryIds];\n this.attachedRepositoryIds.clear();\n await Promise.all(repositoryIds.map(async (repositoryId) => {\n try {\n await this.unlinkAgentRepository(agentId, repositoryId);\n } catch {\n // Best-effort cleanup: only repositories this SDK session attached are removed.\n }\n }));\n }\n\n private repositoryResources(): RepositoryResource[] {\n const resources = this.cloudMode.options.resources ?? [];\n const seen = new Set<string>();\n const result: RepositoryResource[] = [];\n for (const resource of resources) {\n if (resource.type !== \"repository\") {\n throw new Error(`Unsupported Cloud session resource type: ${String(resource.type)}`);\n }\n if (typeof resource.repositoryId !== \"string\" || resource.repositoryId.length === 0) {\n throw new Error(\"Cloud session repository resources require repositoryId.\");\n }\n if (seen.has(resource.repositoryId)) continue;\n seen.add(resource.repositoryId);\n result.push(resource);\n }\n return result;\n }\n\n private async listAgentRepositories(agentId: string): Promise<CloudAgentRepository[]> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(agentId)}/repositories`,\n { headers: cloudHeaders(this.cloudOptions) },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud list agent repositories\");\n if (!body || typeof body !== \"object\") return [];\n const repositories = (body as Record<string, unknown>).repositories;\n return Array.isArray(repositories)\n ? repositories.filter((repository): repository is CloudAgentRepository => (\n repository !== null &&\n typeof repository === \"object\" &&\n typeof (repository as Record<string, unknown>).id === \"string\"\n ))\n : [];\n }\n\n private async waitForAgentRepository(agentId: string, repositoryId: string): Promise<void> {\n const deadline = Date.now() + DEFAULT_REPOSITORY_ATTACH_TIMEOUT_MS;\n while (true) {\n const repositories = await this.listAgentRepositories(agentId);\n if (repositories.some((repository) => repository.id === repositoryId)) return;\n if (Date.now() >= deadline) {\n throw new Error(`Cloud attach agent repository did not become visible for ${agentId}: ${repositoryId}`);\n }\n await sleep(DEFAULT_REPOSITORY_ATTACH_POLL_INTERVAL_MS);\n }\n }\n\n private async linkAgentRepository(agentId: string, repositoryId: string): Promise<void> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(agentId)}/repositories`,\n {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({ repository_id: repositoryId }),\n },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud attach agent repository\");\n }\n\n private async unlinkAgentRepository(agentId: string, repositoryId: string): Promise<void> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(agentId)}/repositories/${encodeURIComponent(repositoryId)}`,\n { method: \"DELETE\", headers: cloudHeaders(this.cloudOptions) },\n );\n const body = await parseJsonResponse(response);\n if (response.status === 404) return;\n assertOkResponse(response, body, \"Cloud detach agent repository\");\n }\n\n private async createConversation(agentId: string): Promise<{ id: string; agent_id?: string }> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const url = new URL(`${baseUrl}/v1/conversations/`);\n url.searchParams.set(\"agent_id\", agentId);\n const response = await fetchImpl(url, {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({}),\n });\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud createSession()\");\n if (!isCloudConversation(body)) {\n throw new Error(\"Cloud createSession() response did not include a conversation id.\");\n }\n return { id: body.id, agent_id: body.agent_id };\n }\n\n private async retrieveConversation(conversationId: string): Promise<{ id: string; agent_id?: string }> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/conversations/${encodeURIComponent(conversationId)}`,\n { headers: cloudHeaders(this.cloudOptions) },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud resumeSession()\");\n if (!isCloudConversation(body)) {\n throw new Error(`Cloud resumeSession() could not retrieve conversation ${conversationId}.`);\n }\n return { id: body.id, agent_id: body.agent_id };\n }\n\n private async resolveConnectionForRuntime(\n runtime: RuntimeScope,\n ): Promise<ResolvedCloudConnection> {\n const environment = this.effectiveEnvironment();\n const sandboxOptions = this.effectiveSandboxOptions();\n if (environment !== undefined) {\n if (sandboxOptions !== undefined) {\n throw new Error(\"Constellation sessions cannot specify both environment and sandbox options.\");\n }\n return this.resolveExplicitConnection(environment);\n }\n return this.createManagedSandboxConnection(runtime);\n }\n\n private async resolveExplicitConnection(\n environment: LettaCodeEnvironment,\n ): Promise<{ connectionId: string }> {\n const target = environmentToRemoteTarget(environment);\n const resolved = await this.remoteEnvironmentClient().resolveEnvironment(target);\n return { connectionId: resolved.connectionId };\n }\n\n private async createManagedSandboxConnection(\n runtime: RuntimeScope,\n ): Promise<ResolvedCloudConnection> {\n const sandbox = await this.createManagedSandbox(runtime.agent_id);\n this.managedSandbox = sandbox;\n\n try {\n await this.refreshManagedSandbox(sandbox);\n const connection = await this.waitForManagedSandboxConnection(sandbox);\n this.startManagedSandboxRefresh(sandbox);\n return { connectionId: connection.connectionId };\n } catch (error) {\n await this.cleanupManagedSandbox();\n throw error;\n }\n }\n\n private async createManagedSandbox(agentId: string): Promise<ManagedCloudSandbox> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(agentId)}/sandboxes`,\n {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({}),\n },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud create managed sandbox\");\n if (!isCloudAgentSandbox(body)) {\n throw new Error(\"Cloud create managed sandbox response did not include sandbox connection details.\");\n }\n\n const sandboxOptions = this.resolvedSandboxOptions();\n const ttlMinutes = sandboxOptions.ttlMinutes ?? DEFAULT_SANDBOX_TTL_MINUTES;\n const readyTimeoutMs = sandboxOptions.readyTimeoutMs\n ?? DEFAULT_SANDBOX_READY_TIMEOUT_MS;\n const readyPollIntervalMs = sandboxOptions.readyPollIntervalMs\n ?? DEFAULT_SANDBOX_READY_POLL_INTERVAL_MS;\n const defaultRefreshIntervalMs = Math.max(\n 1_000,\n Math.floor(ttlMinutes * 60_000 * 0.8),\n );\n\n return {\n agentId,\n sandboxId: body.sandboxId,\n deviceId: body.deviceId,\n connectionName: body.connectionName,\n ttlMinutes,\n readyTimeoutMs,\n readyPollIntervalMs,\n refreshIntervalMs: sandboxOptions.refreshIntervalMs ?? defaultRefreshIntervalMs,\n terminateOnClose: sandboxOptions.terminateOnClose ?? true,\n };\n }\n\n private async refreshManagedSandbox(sandbox: ManagedCloudSandbox): Promise<void> {\n if (this.sandboxRefreshInFlight) {\n await this.sandboxRefreshInFlight;\n return;\n }\n\n this.sandboxRefreshInFlight = this.refreshManagedSandboxOnce(sandbox);\n try {\n await this.sandboxRefreshInFlight;\n } finally {\n this.sandboxRefreshInFlight = null;\n }\n }\n\n private async refreshManagedSandboxOnce(sandbox: ManagedCloudSandbox): Promise<void> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(sandbox.agentId)}/sandboxes/refresh`,\n {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({ ttlMinutes: sandbox.ttlMinutes }),\n },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud refresh managed sandbox\");\n if (!isCloudAgentSandboxRefresh(body) || !body.success) {\n throw new Error(\"Cloud refresh managed sandbox response did not confirm refresh.\");\n }\n if (body.sandboxId !== sandbox.sandboxId) {\n throw new CloudManagedSandboxOwnershipError(\n `Cloud managed sandbox ownership changed for agent ${sandbox.agentId}: expected ${sandbox.sandboxId}, got ${body.sandboxId}.`,\n );\n }\n }\n\n private async terminateManagedSandbox(sandbox: ManagedCloudSandbox): Promise<void> {\n await this.refreshManagedSandbox(sandbox);\n\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(sandbox.agentId)}/sandboxes`,\n {\n method: \"DELETE\",\n headers: cloudHeaders(this.cloudOptions),\n },\n );\n const body = await parseJsonResponse(response);\n if (response.status === 404) return;\n assertOkResponse(response, body, \"Cloud terminate managed sandbox\");\n }\n\n private async waitForManagedSandboxConnection(\n sandbox: ManagedCloudSandbox,\n ): Promise<{ connectionId: string }> {\n const deadline = Date.now() + sandbox.readyTimeoutMs;\n let lastError: unknown;\n\n while (true) {\n try {\n const resolved = await this.remoteEnvironmentClient().resolveEnvironment({\n deviceId: sandbox.deviceId,\n });\n return { connectionId: resolved.connectionId };\n } catch (error) {\n lastError = error;\n if (!isRetryableManagedSandboxResolveError(error) || Date.now() >= deadline) {\n break;\n }\n const remainingMs = Math.max(0, deadline - Date.now());\n await sleep(Math.min(sandbox.readyPollIntervalMs, remainingMs));\n }\n }\n\n const detail = lastError instanceof Error ? lastError.message : String(lastError);\n throw new Error(\n `Cloud managed sandbox ${sandbox.sandboxId} did not come online within ${sandbox.readyTimeoutMs}ms: ${detail}`,\n );\n }\n\n private startManagedSandboxRefresh(sandbox: ManagedCloudSandbox): void {\n this.stopManagedSandboxRefresh();\n this.sandboxRefreshTimer = setInterval(() => {\n void this.refreshManagedSandbox(sandbox).catch((error) => {\n if (error instanceof CloudManagedSandboxOwnershipError) {\n this.stopManagedSandboxRefresh();\n }\n });\n }, sandbox.refreshIntervalMs);\n (this.sandboxRefreshTimer as { unref?: () => void }).unref?.();\n }\n\n private stopManagedSandboxRefresh(): void {\n if (!this.sandboxRefreshTimer) return;\n clearInterval(this.sandboxRefreshTimer);\n this.sandboxRefreshTimer = null;\n }\n\n private async cleanupManagedSandbox(): Promise<void> {\n this.stopManagedSandboxRefresh();\n const sandbox = this.managedSandbox;\n this.managedSandbox = null;\n if (!sandbox || !sandbox.terminateOnClose) return;\n try {\n await this.terminateManagedSandbox(sandbox);\n } catch {\n // Best-effort cleanup: Cloud TTL still bounds leaked managed sandboxes.\n }\n }\n\n private remoteEnvironmentClient(): RemoteEnvironmentClient {\n return new RemoteEnvironmentClient({\n baseUrl: this.cloudOptions.apiBaseUrl,\n apiKey: getCloudApiKey(this.cloudOptions),\n headers: this.cloudOptions.headers,\n fetch: this.cloudOptions.fetch,\n });\n }\n\n private effectiveEnvironment(): LettaCodeEnvironment | undefined {\n const modeEnvironment = this.mode.kind === \"session\"\n ? this.mode.options.environment\n : undefined;\n return modeEnvironment ?? this.cloudOptions.environment;\n }\n\n private effectiveSandboxOptions(): LettaCodeCloudSandboxOptions | undefined {\n const modeSandbox = this.mode.kind === \"session\"\n ? this.mode.options.sandbox\n : undefined;\n return modeSandbox ?? this.cloudOptions.sandbox;\n }\n\n private resolvedSandboxOptions(): LettaCodeCloudSandboxOptions {\n return this.effectiveSandboxOptions() ?? {};\n }\n}\n",
15
+ "import {\n createAppServerClient,\n type AppServerClient,\n type AppServerSocketConstructor,\n type AppServerSocketLike,\n type AppServerSocketOptions,\n} from \"@letta-ai/letta-code/app-server-client\";\nimport {\n AppServerRuntimeController,\n AppServerSession,\n agentToolNames,\n createExternalToolCallHandler,\n externalToolGroups,\n registerAppServerControlRequestHandler,\n type AppServerSessionOptions,\n} from \"./app-server-session.js\";\nimport {\n RemoteEnvironmentClient,\n type RemoteEnvironmentTarget,\n} from \"./remote.js\";\nimport {\n RemoteClientSessionCore,\n mapPermissionMode,\n type ProtocolMessage,\n type RuntimeScope,\n type RuntimeSessionInit,\n type RuntimeSessionMode,\n} from \"./remote-client-session-core.js\";\nimport type {\n AnyAgentTool,\n CreateAgentOptions,\n LettaCodeClientSessionOptions,\n LettaCodeCloudClientOptions,\n LettaCodeCloudSandboxOptions,\n LettaCodeEnvironment,\n LettaCodeSocketConstructor,\n LettaCodeSocketLike,\n RepositoryResource,\n} from \"./types.js\";\n\nconst DEFAULT_CLOUD_API_BASE_URL = \"https://api.letta.com\";\nconst DEFAULT_TURN_TIMEOUT_MS = 120_000;\nconst DEFAULT_PING_INTERVAL_MS = 30_000;\nconst DEFAULT_SANDBOX_TTL_MINUTES = 5;\nconst MIN_SANDBOX_TTL_MINUTES = 1;\nconst MAX_SANDBOX_TTL_MINUTES = 60;\nconst DEFAULT_SANDBOX_READY_TIMEOUT_MS = 120_000;\nconst DEFAULT_SANDBOX_READY_POLL_INTERVAL_MS = 1_000;\nconst DEFAULT_REPOSITORY_ATTACH_TIMEOUT_MS = 10_000;\nconst DEFAULT_REPOSITORY_ATTACH_POLL_INTERVAL_MS = 250;\nconst SDK_AGENT_ORIGIN = \"@letta-ai/letta-agent-sdk\";\n\ntype FetchLike = typeof fetch;\n\ntype CloudStatusMessage = ProtocolMessage & {\n type: string;\n seq?: unknown;\n event_seq?: unknown;\n idempotency_key?: unknown;\n runId?: unknown;\n run_id?: unknown;\n stopReason?: unknown;\n stop_reason?: unknown;\n conversation_id?: unknown;\n conversationId?: unknown;\n agent_id?: unknown;\n agentId?: unknown;\n request?: unknown;\n loop_status?: unknown;\n delta?: unknown;\n};\n\ntype CloudRuntimeStartResponse = ProtocolMessage & {\n type: \"runtime_start_response\";\n success: boolean;\n runtime: RuntimeScope | null;\n agent: (Record<string, unknown> & {\n id?: string;\n model?: string | null;\n model_settings?: Record<string, unknown> | null;\n }) | null;\n conversation: (Record<string, unknown> & { id?: string; agent_id?: string }) | null;\n error?: string;\n};\n\ntype CloudConversation = Record<string, unknown> & {\n id?: string;\n agent_id?: string;\n};\n\ntype CloudAgentSandbox = Record<string, unknown> & {\n sandboxId?: string;\n deviceId?: string;\n connectionName?: string;\n conversationId?: string;\n resumed?: boolean;\n};\n\ntype CloudAgentSandboxRefresh = Record<string, unknown> & {\n success?: boolean;\n sandboxId?: string;\n ttlMinutes?: number;\n};\n\ntype ManagedCloudSandbox = {\n agentId: string;\n /** Non-null when the server confirmed conversation scoping by echoing the\n * conversationId (legacy servers strip unknown body keys and answer\n * without it, so the sandbox falls back to the agent-scoped lifecycle). */\n conversationId: string | null;\n sandboxId: string;\n deviceId: string;\n connectionName: string;\n ttlMinutes: number;\n readyTimeoutMs: number;\n readyPollIntervalMs: number;\n refreshIntervalMs: number;\n terminateOnClose: boolean;\n};\n\ntype ResolvedCloudConnection = {\n connectionId: string;\n};\n\nclass CloudManagedSandboxOwnershipError extends Error {}\n\n/**\n * The Cloud API reaped a conversation-scoped managed sandbox before the SDK\n * could refresh it. The failed refresh happens before the next turn is sent,\n * so callers can safely create a new SDK session for {@link conversationId}\n * and retry that turn.\n */\nexport class CloudManagedSandboxExpiredError extends Error {\n readonly code = \"managed_sandbox_expired\" as const;\n\n constructor(\n readonly sandboxId: string,\n readonly conversationId: string,\n ) {\n super(\n `Cloud managed sandbox ${sandboxId} expired. Resume conversation ${conversationId} with a new SDK session and retry the turn.`,\n );\n this.name = \"CloudManagedSandboxExpiredError\";\n }\n}\n\ntype CloudSessionMode = Extract<RuntimeSessionMode, { kind: \"session\" }>;\n\ntype CloudAgentRepository = {\n id: string;\n name?: string;\n is_primary?: boolean;\n};\n\nfunction getDefaultApiKey(): string | undefined {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env;\n return env?.LETTA_API_KEY ?? env?.LETTA_CLOUD_API_KEY;\n}\n\nfunction bearerTokenFromHeaders(headers: Record<string, string> | undefined): string | undefined {\n const authorization = headers?.Authorization ?? headers?.authorization;\n if (!authorization) return undefined;\n const match = /^Bearer\\s+(.+)$/i.exec(authorization);\n return match?.[1];\n}\n\nfunction getCloudApiKey(options: LettaCodeCloudClientOptions): string | undefined {\n return options.apiKey ?? bearerTokenFromHeaders(options.headers) ?? getDefaultApiKey();\n}\n\nfunction getFetch(fetchOverride?: FetchLike): FetchLike {\n const resolved = fetchOverride ?? globalThis.fetch;\n if (!resolved) {\n throw new Error(\"No fetch implementation available for cloud backend.\");\n }\n return resolved.bind(globalThis) as FetchLike;\n}\n\nfunction getWebSocketConstructor(\n websocketOverride?: LettaCodeSocketConstructor,\n): LettaCodeSocketConstructor {\n const resolved =\n websocketOverride ??\n (globalThis as { WebSocket?: LettaCodeSocketConstructor }).WebSocket;\n if (!resolved) {\n throw new Error(\"No WebSocket implementation available for cloud backend.\");\n }\n return resolved;\n}\n\nfunction normalizeCloudApiBaseUrl(url: string | undefined): string {\n const parsed = new URL(url ?? DEFAULT_CLOUD_API_BASE_URL);\n parsed.pathname = parsed.pathname.replace(/\\/+$/, \"\");\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nfunction cloudHeaders(options: LettaCodeCloudClientOptions): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options.headers ?? {}),\n };\n const apiKey = getCloudApiKey(options);\n if (apiKey && !headers.Authorization && !headers.authorization) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n return headers;\n}\n\nfunction cloudWebSocketHeaders(options: LettaCodeCloudClientOptions): Record<string, string> | undefined {\n const headers = { ...(options.headers ?? {}) };\n delete headers.authorization;\n delete headers.Authorization;\n const apiKey = getCloudApiKey(options);\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nasync function parseJsonResponse(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nfunction responseErrorMessage(body: unknown, fallback: string): string {\n if (body && typeof body === \"object\") {\n const record = body as Record<string, unknown>;\n const message = record.message ?? record.error ?? record.detail;\n const reasonText = record.reason_text;\n const pieces = [message, reasonText]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (pieces.length > 0) return pieces.join(\": \");\n }\n return fallback;\n}\n\nfunction assertOkResponse(response: Response, body: unknown, action: string): void {\n if (!response.ok) {\n throw new Error(\n responseErrorMessage(body, `${action} failed with HTTP ${response.status}`),\n );\n }\n}\n\nfunction validatePositiveInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value <= 0)) {\n throw new Error(`Invalid ${name}. Expected a positive integer.`);\n }\n}\n\nfunction validateIntegerRange(\n value: number | undefined,\n name: string,\n min: number,\n max: number,\n): void {\n if (value === undefined) return;\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`Invalid ${name}. Expected an integer between ${min} and ${max}.`);\n }\n}\n\nfunction validateCloudSandboxOptions(\n options: LettaCodeCloudSandboxOptions | undefined,\n name: string,\n): void {\n if (options === undefined) return;\n if (options === null || typeof options !== \"object\" || Array.isArray(options)) {\n throw new Error(`Invalid ${name}. Expected an object.`);\n }\n validateIntegerRange(\n options.ttlMinutes,\n `${name}.ttlMinutes`,\n MIN_SANDBOX_TTL_MINUTES,\n MAX_SANDBOX_TTL_MINUTES,\n );\n validatePositiveInteger(options.readyTimeoutMs, `${name}.readyTimeoutMs`);\n validatePositiveInteger(options.readyPollIntervalMs, `${name}.readyPollIntervalMs`);\n validatePositiveInteger(options.refreshIntervalMs, `${name}.refreshIntervalMs`);\n if (\n options.terminateOnClose !== undefined &&\n typeof options.terminateOnClose !== \"boolean\"\n ) {\n throw new Error(`Invalid ${name}.terminateOnClose. Expected a boolean.`);\n }\n}\n\nexport function validateCloudClientOptions(options: LettaCodeCloudClientOptions): void {\n validatePositiveInteger(options.requestTimeoutMs, \"requestTimeoutMs\");\n validatePositiveInteger(options.appServer?.requestTimeoutMs, \"appServer.requestTimeoutMs\");\n validatePositiveInteger(options.appServer?.startupTimeoutMs, \"appServer.startupTimeoutMs\");\n validateCloudSandboxOptions(options.sandbox, \"sandbox\");\n if (options.environment !== undefined && options.sandbox !== undefined) {\n throw new Error(\"Constellation sessions cannot specify both environment and sandbox options.\");\n }\n if (\n options.webSocketAuth !== undefined &&\n options.webSocketAuth !== \"header\" &&\n options.webSocketAuth !== \"query\"\n ) {\n throw new Error(\"Invalid webSocketAuth. Valid values: header, query.\");\n }\n}\n\nfunction environmentToRemoteTarget(\n environment: LettaCodeEnvironment,\n): RemoteEnvironmentTarget {\n if (typeof environment === \"string\") {\n return { connectionName: environment };\n }\n if (\"name\" in environment) {\n return { connectionName: environment.name };\n }\n if (\"id\" in environment) {\n return { environmentId: environment.id };\n }\n if (\"connectionId\" in environment) {\n return { connectionId: environment.connectionId };\n }\n if (\"deviceId\" in environment) {\n return { deviceId: environment.deviceId };\n }\n throw new Error(\"Unknown cloud environment selector.\");\n}\n\nfunction buildCloudStatusWebSocketUrl(params: {\n apiBaseUrl?: string;\n connectionId: string;\n agentId: string;\n conversationId: string;\n apiKey?: string;\n authMode: \"header\" | \"query\";\n}): string {\n const base = new URL(normalizeCloudApiBaseUrl(params.apiBaseUrl));\n if (base.protocol === \"http:\") {\n base.protocol = \"ws:\";\n } else if (base.protocol === \"https:\") {\n base.protocol = \"wss:\";\n } else if (base.protocol !== \"ws:\" && base.protocol !== \"wss:\") {\n throw new Error(`Unsupported cloud apiBaseUrl protocol: ${base.protocol}`);\n }\n base.pathname = `/v1/environments/${encodeURIComponent(params.connectionId)}/status/ws`;\n base.searchParams.set(\"agentId\", params.agentId);\n base.searchParams.set(\"conversationId\", params.conversationId);\n base.searchParams.set(\"channel\", \"stream\");\n if (params.authMode === \"query\" && params.apiKey) {\n base.searchParams.set(\"token\", params.apiKey);\n }\n return base.toString();\n}\n\nfunction addSocketListener(\n socket: LettaCodeSocketLike,\n type: string,\n listener: (event: unknown) => void,\n): () => void {\n if (socket.addEventListener) {\n socket.addEventListener(type, listener);\n return () => socket.removeEventListener?.(type, listener);\n }\n if (socket.on) {\n socket.on(type, listener);\n return () => socket.off?.(type, listener);\n }\n throw new Error(\"WebSocket implementation does not support event listeners.\");\n}\n\nfunction messageEventData(event: unknown): string | null {\n if (typeof event === \"string\") return event;\n if (event && typeof event === \"object\") {\n const data = (event as { data?: unknown }).data;\n if (typeof data === \"string\") return data;\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(data);\n }\n if (data instanceof Uint8Array) {\n return new TextDecoder().decode(data);\n }\n }\n return null;\n}\n\ntype CloudStatusSocketControl = AppServerSocketLike & {\n sendCloudCommand(command: Record<string, unknown>): void;\n};\n\ntype CloudStatusSocketState = {\n runtime: RuntimeScope;\n seenIdempotencyKeys: Set<string>;\n seenIdempotencyOrder: string[];\n lastEventSeq: number | null;\n controlSocket: CloudStatusSocketControl | null;\n};\n\nfunction createCloudStatusWebSocketConstructor(params: {\n cloudOptions: LettaCodeCloudClientOptions;\n runtime: RuntimeScope;\n}): AppServerSocketConstructor {\n const WebSocketCtor = getWebSocketConstructor(params.cloudOptions.WebSocket);\n const authMode = params.cloudOptions.webSocketAuth ?? \"header\";\n const cloudHeaders = authMode === \"header\" ? cloudWebSocketHeaders(params.cloudOptions) : undefined;\n const pingIntervalMs = params.cloudOptions.pingIntervalMs ?? DEFAULT_PING_INTERVAL_MS;\n const state: CloudStatusSocketState = {\n runtime: params.runtime,\n seenIdempotencyKeys: new Set<string>(),\n seenIdempotencyOrder: [],\n lastEventSeq: null,\n controlSocket: null,\n };\n\n class CloudStatusSocketAdapter implements AppServerSocketLike {\n private readonly socket: LettaCodeSocketLike;\n private readonly channel: string | null;\n private readonly listenerRemovers = new Map<string, Map<(event: unknown) => void, () => void>>();\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private removeCloseListener: (() => void) | null = null;\n\n constructor(url: string, options?: AppServerSocketOptions) {\n this.channel = new URL(url).searchParams.get(\"channel\");\n const mergedHeaders = authMode === \"header\"\n ? {\n ...(options?.headers ?? {}),\n ...(cloudHeaders ?? {}),\n }\n : undefined;\n const socketOptions = mergedHeaders && Object.keys(mergedHeaders).length > 0\n ? { headers: mergedHeaders }\n : undefined;\n this.socket = new WebSocketCtor(url, socketOptions);\n if (this.channel === \"control\") {\n state.controlSocket = this;\n }\n this.removeCloseListener = addSocketListener(this.socket, \"close\", () => {\n this.stopPing();\n if (state.controlSocket === this) state.controlSocket = null;\n });\n this.startPing(pingIntervalMs);\n }\n\n get readyState(): number {\n return this.socket.readyState;\n }\n\n send(data: string): void {\n this.socket.send(data);\n }\n\n close(): void {\n this.stopPing();\n this.removeCloseListener?.();\n this.removeCloseListener = null;\n if (state.controlSocket === this) state.controlSocket = null;\n this.socket.close();\n }\n\n addEventListener(type: string, listener: (event: unknown) => void): void {\n const wrapped = type === \"message\"\n ? (event: unknown) => {\n if (this.handleIncomingMessage(event)) {\n listener(event);\n }\n }\n : listener;\n const remove = addSocketListener(this.socket, type, wrapped);\n let typeRemovers = this.listenerRemovers.get(type);\n if (!typeRemovers) {\n typeRemovers = new Map();\n this.listenerRemovers.set(type, typeRemovers);\n }\n typeRemovers.set(listener, remove);\n }\n\n removeEventListener(type: string, listener: (event: unknown) => void): void {\n const typeRemovers = this.listenerRemovers.get(type);\n const remove = typeRemovers?.get(listener);\n if (!remove) return;\n remove();\n typeRemovers?.delete(listener);\n if (typeRemovers?.size === 0) {\n this.listenerRemovers.delete(type);\n }\n }\n\n private handleIncomingMessage(event: unknown): boolean {\n const data = messageEventData(event);\n if (!data) return true;\n\n let message: CloudStatusMessage;\n try {\n message = JSON.parse(data) as CloudStatusMessage;\n } catch {\n return true;\n }\n\n this.ackIfSequenced(message);\n\n // The status gateway can mirror device stream frames to the control\n // subscriber. Drop them at the Cloud transport boundary instead of making\n // shared app-server session code understand Cloud fanout quirks. Do this\n // before idempotency/event tracking so the canonical stream-channel frame\n // is still delivered and sequenced.\n if (this.channel === \"control\" && message.type === \"stream_delta\") {\n return false;\n }\n\n if (this.isDuplicate(message)) return false;\n this.trackEventSeq(message);\n return true;\n }\n\n private ackIfSequenced(message: CloudStatusMessage): void {\n if (typeof message.seq !== \"number\") return;\n this.sendCloudCommand({ type: \"ack\", seq: message.seq });\n }\n\n private isDuplicate(message: CloudStatusMessage): boolean {\n const idempotencyKey =\n typeof message.idempotency_key === \"string\" ? message.idempotency_key : undefined;\n if (!idempotencyKey) return false;\n if (state.seenIdempotencyKeys.has(idempotencyKey)) return true;\n state.seenIdempotencyKeys.add(idempotencyKey);\n state.seenIdempotencyOrder.push(idempotencyKey);\n while (state.seenIdempotencyOrder.length > 1_000) {\n const oldest = state.seenIdempotencyOrder.shift();\n if (oldest) state.seenIdempotencyKeys.delete(oldest);\n }\n return false;\n }\n\n private trackEventSeq(message: CloudStatusMessage): void {\n if (typeof message.event_seq !== \"number\") return;\n if (state.lastEventSeq !== null && message.event_seq > state.lastEventSeq + 1) {\n this.sendSync(true);\n }\n if (state.lastEventSeq === null || message.event_seq > state.lastEventSeq) {\n state.lastEventSeq = message.event_seq;\n }\n }\n\n private sendSync(recoverApprovals: boolean): void {\n const target = state.controlSocket?.readyState === 1 ? state.controlSocket : this;\n target.sendCloudCommand({\n type: \"sync\",\n runtime: state.runtime,\n recover_approvals: recoverApprovals,\n force_device_status: true,\n });\n }\n\n sendCloudCommand(command: Record<string, unknown>): void {\n if (this.readyState !== 1) return;\n try {\n this.socket.send(JSON.stringify(command));\n } catch {\n // Best-effort Cloud status reliability command.\n }\n }\n\n private startPing(intervalMs: number): void {\n if (this.pingTimer) return;\n this.pingTimer = setInterval(() => {\n this.sendCloudCommand({ type: \"ping\" });\n }, intervalMs);\n (this.pingTimer as { unref?: () => void }).unref?.();\n }\n\n private stopPing(): void {\n if (!this.pingTimer) return;\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n\n return CloudStatusSocketAdapter as AppServerSocketConstructor;\n}\n\nfunction isCloudConversation(value: unknown): value is CloudConversation & { id: string } {\n return Boolean(value && typeof value === \"object\" && typeof (value as CloudConversation).id === \"string\");\n}\n\nfunction isCloudAgentSandbox(\n value: unknown,\n): value is CloudAgentSandbox & { sandboxId: string; deviceId: string; connectionName: string } {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as CloudAgentSandbox).sandboxId === \"string\" &&\n typeof (value as CloudAgentSandbox).deviceId === \"string\" &&\n typeof (value as CloudAgentSandbox).connectionName === \"string\",\n );\n}\n\nfunction isCloudAgentSandboxRefresh(\n value: unknown,\n): value is CloudAgentSandboxRefresh & { success: boolean; sandboxId: string; ttlMinutes: number } {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as CloudAgentSandboxRefresh).success === \"boolean\" &&\n typeof (value as CloudAgentSandboxRefresh).sandboxId === \"string\" &&\n typeof (value as CloudAgentSandboxRefresh).ttlMinutes === \"number\",\n );\n}\n\nfunction isRetryableManagedSandboxResolveError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return (\n message.includes(\"Remote environment is offline\") ||\n message.toLowerCase().includes(\"not found\") ||\n message.includes(\"(404)\")\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction externalToolsByName(tools: AnyAgentTool[] | undefined): Map<string, AnyAgentTool> {\n const result = new Map<string, AnyAgentTool>();\n for (const tool of tools ?? []) {\n result.set(tool.name, tool);\n }\n return result;\n}\n\nfunction cloudHarnessAppServerOptions(\n clientOptions: LettaCodeCloudClientOptions,\n): AppServerSessionOptions {\n const appServer = clientOptions.appServer;\n const apiKey = getCloudApiKey(clientOptions);\n const localEnv: Record<string, string | undefined> = {\n ...(apiKey ? { LETTA_API_KEY: apiKey } : {}),\n ...(clientOptions.apiBaseUrl\n ? { LETTA_BASE_URL: normalizeCloudApiBaseUrl(clientOptions.apiBaseUrl) }\n : {}),\n };\n return {\n local: appServer?.url === undefined,\n localBackend: \"api\",\n ...(appServer?.url !== undefined ? { url: appServer.url } : {}),\n ...(appServer?.WebSocket !== undefined ? { WebSocket: appServer.WebSocket } : {}),\n ...(clientOptions.requestTimeoutMs !== undefined || appServer?.requestTimeoutMs !== undefined\n ? { requestTimeoutMs: appServer?.requestTimeoutMs ?? clientOptions.requestTimeoutMs }\n : {}),\n ...(appServer?.listen !== undefined ? { localListen: appServer.listen } : {}),\n ...(appServer?.startupTimeoutMs !== undefined\n ? { localStartupTimeoutMs: appServer.startupTimeoutMs }\n : {}),\n ...(Object.keys(localEnv).length > 0 ? { localEnv } : {}),\n };\n}\n\nexport async function createCloudAgent(\n clientOptions: LettaCodeCloudClientOptions,\n agentOptions: CreateAgentOptions,\n): Promise<string> {\n const session = new AppServerSession(cloudHarnessAppServerOptions(clientOptions), {\n kind: \"create-agent\",\n options: agentOptions,\n });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n}\n\nexport function assertCloudSessionOptionsSupported(\n action: string,\n options: LettaCodeClientSessionOptions,\n): void {\n validateCloudSandboxOptions(options.sandbox, \"sandbox\");\n if (options.environment !== undefined && options.sandbox !== undefined) {\n throw new Error(`Constellation ${action}() cannot specify both environment and sandbox options.`);\n }\n if (options.systemPrompt !== undefined) {\n throw new Error(`Constellation ${action}() cannot rewrite an existing agent's systemPrompt from the SDK adapter yet.`);\n }\n if (options.allowedTools !== undefined || options.disallowedTools !== undefined) {\n throw new Error(`Constellation ${action}() has not wired allowedTools/disallowedTools to the remote device protocol yet.`);\n }\n if (options.systemInfoReminder !== undefined) {\n throw new Error(`Constellation ${action}() has not wired systemInfoReminder to the remote device protocol yet.`);\n }\n if (options.dreaming?.behavior !== undefined) {\n throw new Error(`Constellation ${action}() does not yet support dreaming.behavior overrides.`);\n }\n if ((options as { memfsStartup?: unknown }).memfsStartup !== undefined) {\n throw new Error(`Constellation ${action}() does not support memfsStartup.`);\n }\n if (options.includePartialMessages !== undefined) {\n throw new Error(`Constellation ${action}() streams Remote Client deltas directly; includePartialMessages is not a separate toggle.`);\n }\n}\n\nexport class CloudEnvironmentSession extends RemoteClientSessionCore {\n private connectionId: string | null = null;\n private removeExternalToolHandler: (() => void) | null = null;\n private removeControlRequestHandler: (() => void) | null = null;\n private externalTools = new Map<string, AnyAgentTool>();\n private managedSandbox: ManagedCloudSandbox | null = null;\n private sandboxRefreshTimer: ReturnType<typeof setInterval> | null = null;\n private sandboxRefreshInFlight: Promise<void> | null = null;\n private sandboxLifecycleClosing = false;\n private attachedRepositoryIds = new Set<string>();\n private readonly cloudMode: CloudSessionMode;\n\n constructor(\n private readonly cloudOptions: LettaCodeCloudClientOptions,\n mode: CloudSessionMode,\n ) {\n super(mode, {\n label: \"cloud\",\n requestTimeoutMs: cloudOptions.requestTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n });\n this.cloudMode = mode;\n const tools = mode.options.tools;\n this.externalTools = externalToolsByName(tools);\n }\n\n protected override async initializeRuntimeController(): Promise<RuntimeSessionInit> {\n const resolved = await this.resolveRuntime();\n const connection = await this.resolveConnectionForRuntime(resolved.runtime);\n this.connectionId = connection.connectionId;\n\n const apiKey = getCloudApiKey(this.cloudOptions);\n const url = buildCloudStatusWebSocketUrl({\n apiBaseUrl: this.cloudOptions.apiBaseUrl,\n connectionId: connection.connectionId,\n agentId: resolved.runtime.agent_id,\n conversationId: resolved.runtime.conversation_id,\n apiKey,\n authMode: this.cloudOptions.webSocketAuth ?? \"header\",\n });\n const client = createAppServerClient({\n url,\n WebSocket: createCloudStatusWebSocketConstructor({\n cloudOptions: this.cloudOptions,\n runtime: resolved.runtime,\n }),\n requestTimeoutMs: this.cloudOptions.requestTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n });\n this.removeControlRequestHandler = registerAppServerControlRequestHandler({\n client,\n getRuntime: () => this.runtime,\n getOptions: () => this.currentOptions(),\n });\n if (this.externalTools.size > 0) {\n this.removeExternalToolHandler = client.onExternalToolCall(\n createExternalToolCallHandler(this.externalTools),\n );\n }\n\n try {\n await client.connect();\n const response = await this.startCloudRuntime(client, resolved.runtime);\n if (!response.success || !response.runtime) {\n throw new Error(response.error ?? \"Failed to start Cloud status runtime\");\n }\n\n const tools = agentToolNames(response.agent);\n const skillSources = this.currentOptions().skillSources;\n return {\n controller: new AppServerRuntimeController(client, {\n requestTimeoutMs: this.cloudOptions.requestTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n }),\n runtime: response.runtime,\n model: typeof response.agent?.model === \"string\" ? response.agent.model : \"\",\n modelSettings: response.agent?.model_settings ?? null,\n ...(tools !== undefined ? { tools } : {}),\n ...(skillSources !== undefined ? { skillSources: [...skillSources] } : {}),\n };\n } catch (error) {\n this.removeExternalToolHandler?.();\n this.removeExternalToolHandler = null;\n this.removeControlRequestHandler?.();\n this.removeControlRequestHandler = null;\n client.close();\n await this.cleanupManagedSandbox();\n await this.cleanupSessionRepositories(resolved.runtime.agent_id);\n throw error;\n }\n }\n\n private async startCloudRuntime(\n client: AppServerClient,\n runtime: RuntimeScope,\n ): Promise<CloudRuntimeStartResponse> {\n const options = this.currentOptions();\n const command: Record<string, unknown> = {\n client_info: {\n name: SDK_AGENT_ORIGIN,\n title: \"Letta Agent SDK\",\n },\n agent_id: runtime.agent_id,\n conversation_id: runtime.conversation_id,\n recover_approvals: false,\n force_device_status: true,\n };\n\n const mode = mapPermissionMode(options.permissionMode);\n if (mode) command.mode = mode;\n if (options.cwd !== undefined) command.cwd = options.cwd;\n if (options.skillSources !== undefined) {\n command.skill_sources = [...new Set(options.skillSources)];\n }\n const groups = externalToolGroups(options.tools);\n if (groups) command.external_tools = groups;\n\n return (await client.runtimeStart(\n command as Parameters<AppServerClient[\"runtimeStart\"]>[0],\n )) as unknown as CloudRuntimeStartResponse;\n }\n\n protected override async afterRuntimeInitialized(): Promise<void> {\n if (!this.controller || !this.runtime) return;\n this.controller.send({\n type: \"sync\",\n runtime: this.runtime,\n recover_approvals: true,\n force_device_status: true,\n });\n }\n\n protected override async beforeTurn(): Promise<void> {\n const sandbox = this.managedSandbox;\n if (!sandbox) return;\n await this.refreshManagedSandbox(sandbox);\n }\n\n protected override onCoreClose(): void {\n this.removeExternalToolHandler?.();\n this.removeExternalToolHandler = null;\n this.removeControlRequestHandler?.();\n this.removeControlRequestHandler = null;\n void this.cleanupManagedSandbox();\n if (this.runtime?.agent_id) void this.cleanupSessionRepositories(this.runtime.agent_id);\n }\n\n private async resolveRuntime(): Promise<{ runtime: RuntimeScope }> {\n let agentId = this.cloudMode.agentId;\n let conversationId = this.cloudMode.conversationId;\n\n if (!agentId && conversationId) {\n const conversation = await this.retrieveConversation(conversationId);\n if (!conversation.agent_id) {\n throw new Error(`Cloud conversation ${conversationId} did not include an agent id.`);\n }\n agentId = conversation.agent_id;\n }\n\n if (!agentId) {\n throw new Error(\n \"Constellation createSession()/resumeSession() requires an agent id or conversation id.\",\n );\n }\n\n await this.attachSessionRepositories(agentId);\n\n if (this.cloudMode.newConversation) {\n const conversation = await this.createConversation(agentId);\n conversationId = conversation.id;\n } else if (this.cloudMode.defaultConversation) {\n conversationId = \"default\";\n }\n\n if (!conversationId) {\n throw new Error(\n \"Constellation createSession()/resumeSession() requires an agent id or conversation id.\",\n );\n }\n\n return { runtime: { agent_id: agentId, conversation_id: conversationId } };\n }\n\n private async attachSessionRepositories(agentId: string): Promise<void> {\n const resources = this.repositoryResources();\n if (resources.length === 0) return;\n\n const existing = await this.listAgentRepositories(agentId);\n const existingIds = new Set(existing.map((repository) => repository.id));\n\n try {\n for (const resource of resources) {\n if (existingIds.has(resource.repositoryId) || this.attachedRepositoryIds.has(resource.repositoryId)) {\n continue;\n }\n await this.linkAgentRepository(agentId, resource.repositoryId);\n await this.waitForAgentRepository(agentId, resource.repositoryId);\n this.attachedRepositoryIds.add(resource.repositoryId);\n }\n } catch (error) {\n await this.cleanupSessionRepositories(agentId);\n throw error;\n }\n }\n\n private async cleanupSessionRepositories(agentId: string): Promise<void> {\n const repositoryIds = [...this.attachedRepositoryIds];\n this.attachedRepositoryIds.clear();\n await Promise.all(repositoryIds.map(async (repositoryId) => {\n try {\n await this.unlinkAgentRepository(agentId, repositoryId);\n } catch {\n // Best-effort cleanup: only repositories this SDK session attached are removed.\n }\n }));\n }\n\n private repositoryResources(): RepositoryResource[] {\n const resources = this.cloudMode.options.resources ?? [];\n const seen = new Set<string>();\n const result: RepositoryResource[] = [];\n for (const resource of resources) {\n if (resource.type !== \"repository\") {\n throw new Error(`Unsupported Cloud session resource type: ${String(resource.type)}`);\n }\n if (typeof resource.repositoryId !== \"string\" || resource.repositoryId.length === 0) {\n throw new Error(\"Cloud session repository resources require repositoryId.\");\n }\n if (seen.has(resource.repositoryId)) continue;\n seen.add(resource.repositoryId);\n result.push(resource);\n }\n return result;\n }\n\n private async listAgentRepositories(agentId: string): Promise<CloudAgentRepository[]> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(agentId)}/repositories`,\n { headers: cloudHeaders(this.cloudOptions) },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud list agent repositories\");\n if (!body || typeof body !== \"object\") return [];\n const repositories = (body as Record<string, unknown>).repositories;\n return Array.isArray(repositories)\n ? repositories.filter((repository): repository is CloudAgentRepository => (\n repository !== null &&\n typeof repository === \"object\" &&\n typeof (repository as Record<string, unknown>).id === \"string\"\n ))\n : [];\n }\n\n private async waitForAgentRepository(agentId: string, repositoryId: string): Promise<void> {\n const deadline = Date.now() + DEFAULT_REPOSITORY_ATTACH_TIMEOUT_MS;\n while (true) {\n const repositories = await this.listAgentRepositories(agentId);\n if (repositories.some((repository) => repository.id === repositoryId)) return;\n if (Date.now() >= deadline) {\n throw new Error(`Cloud attach agent repository did not become visible for ${agentId}: ${repositoryId}`);\n }\n await sleep(DEFAULT_REPOSITORY_ATTACH_POLL_INTERVAL_MS);\n }\n }\n\n private async linkAgentRepository(agentId: string, repositoryId: string): Promise<void> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(agentId)}/repositories`,\n {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({ repository_id: repositoryId }),\n },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud attach agent repository\");\n }\n\n private async unlinkAgentRepository(agentId: string, repositoryId: string): Promise<void> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(agentId)}/repositories/${encodeURIComponent(repositoryId)}`,\n { method: \"DELETE\", headers: cloudHeaders(this.cloudOptions) },\n );\n const body = await parseJsonResponse(response);\n if (response.status === 404) return;\n assertOkResponse(response, body, \"Cloud detach agent repository\");\n }\n\n private async createConversation(agentId: string): Promise<{ id: string; agent_id?: string }> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const url = new URL(`${baseUrl}/v1/conversations/`);\n url.searchParams.set(\"agent_id\", agentId);\n const response = await fetchImpl(url, {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({}),\n });\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud createSession()\");\n if (!isCloudConversation(body)) {\n throw new Error(\"Cloud createSession() response did not include a conversation id.\");\n }\n return { id: body.id, agent_id: body.agent_id };\n }\n\n private async retrieveConversation(conversationId: string): Promise<{ id: string; agent_id?: string }> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/conversations/${encodeURIComponent(conversationId)}`,\n { headers: cloudHeaders(this.cloudOptions) },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud resumeSession()\");\n if (!isCloudConversation(body)) {\n throw new Error(`Cloud resumeSession() could not retrieve conversation ${conversationId}.`);\n }\n return { id: body.id, agent_id: body.agent_id };\n }\n\n private async resolveConnectionForRuntime(\n runtime: RuntimeScope,\n ): Promise<ResolvedCloudConnection> {\n const environment = this.effectiveEnvironment();\n const sandboxOptions = this.effectiveSandboxOptions();\n if (environment !== undefined) {\n if (sandboxOptions !== undefined) {\n throw new Error(\"Constellation sessions cannot specify both environment and sandbox options.\");\n }\n return this.resolveExplicitConnection(environment);\n }\n return this.createManagedSandboxConnection(runtime);\n }\n\n private async resolveExplicitConnection(\n environment: LettaCodeEnvironment,\n ): Promise<{ connectionId: string }> {\n const target = environmentToRemoteTarget(environment);\n const resolved = await this.remoteEnvironmentClient().resolveEnvironment(target);\n return { connectionId: resolved.connectionId };\n }\n\n private async createManagedSandboxConnection(\n runtime: RuntimeScope,\n ): Promise<ResolvedCloudConnection> {\n // Scope the managed sandbox to the conversation when one exists: the\n // server treats create-with-conversationId as create-or-resume, so\n // sessions of the same conversation share one sandbox and sessions of\n // different conversations stop contending for a single per-agent one.\n const conversationId =\n runtime.conversation_id && runtime.conversation_id !== \"default\"\n ? runtime.conversation_id\n : undefined;\n const sandbox = await this.createManagedSandbox(\n runtime.agent_id,\n conversationId,\n );\n this.managedSandbox = sandbox;\n\n if (this.sandboxLifecycleClosing) {\n await this.cleanupManagedSandbox();\n throw new Error(\"Cloud managed sandbox session closed during initialization.\");\n }\n\n try {\n await this.refreshManagedSandbox(sandbox);\n const connection = await this.waitForManagedSandboxConnection(sandbox);\n this.startManagedSandboxRefresh(sandbox);\n return { connectionId: connection.connectionId };\n } catch (error) {\n await this.cleanupManagedSandbox();\n throw error;\n }\n }\n\n private async createManagedSandbox(\n agentId: string,\n conversationId?: string,\n ): Promise<ManagedCloudSandbox> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(agentId)}/sandboxes`,\n {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify(conversationId ? { conversationId } : {}),\n },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud create managed sandbox\");\n if (!isCloudAgentSandbox(body)) {\n throw new Error(\"Cloud create managed sandbox response did not include sandbox connection details.\");\n }\n\n const responseConversationId =\n typeof body.conversationId === \"string\" ? body.conversationId : null;\n if (\n responseConversationId !== null &&\n responseConversationId !== conversationId\n ) {\n throw new Error(\n `Cloud managed sandbox response conversation mismatch: expected ${conversationId ?? \"none\"}, got ${responseConversationId}.`,\n );\n }\n\n const sandboxOptions = this.resolvedSandboxOptions();\n const ttlMinutes = sandboxOptions.ttlMinutes ?? DEFAULT_SANDBOX_TTL_MINUTES;\n const readyTimeoutMs = sandboxOptions.readyTimeoutMs\n ?? DEFAULT_SANDBOX_READY_TIMEOUT_MS;\n const readyPollIntervalMs = sandboxOptions.readyPollIntervalMs\n ?? DEFAULT_SANDBOX_READY_POLL_INTERVAL_MS;\n const defaultRefreshIntervalMs = Math.max(\n 1_000,\n Math.floor(ttlMinutes * 60_000 * 0.8),\n );\n\n return {\n agentId,\n conversationId: responseConversationId,\n sandboxId: body.sandboxId,\n deviceId: body.deviceId,\n connectionName: body.connectionName,\n ttlMinutes,\n readyTimeoutMs,\n readyPollIntervalMs,\n refreshIntervalMs: sandboxOptions.refreshIntervalMs ?? defaultRefreshIntervalMs,\n // Default to TTL cleanup: terminating on close kills a sandbox that\n // other sessions of the same conversation (or a reconnecting client)\n // may still be using; the server-side TTL bounds leaked sandboxes.\n terminateOnClose: sandboxOptions.terminateOnClose ?? false,\n };\n }\n\n private async refreshManagedSandbox(sandbox: ManagedCloudSandbox): Promise<void> {\n if (this.sandboxRefreshInFlight) {\n await this.sandboxRefreshInFlight;\n return;\n }\n\n this.sandboxRefreshInFlight = this.refreshManagedSandboxOnce(sandbox);\n try {\n await this.sandboxRefreshInFlight;\n } finally {\n this.sandboxRefreshInFlight = null;\n }\n }\n\n private async refreshManagedSandboxOnce(sandbox: ManagedCloudSandbox): Promise<void> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n\n if (sandbox.conversationId) {\n // Conversation-scoped sandboxes refresh by id — no \"latest active\"\n // indirection, so ownership changes are structurally impossible.\n const response = await fetchImpl(\n `${baseUrl}/v1/sandboxes/${encodeURIComponent(sandbox.sandboxId)}/refresh`,\n {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({ ttlMinutes: sandbox.ttlMinutes }),\n },\n );\n if (response.status === 404) {\n await parseJsonResponse(response);\n // The current control and stream WebSockets are bound to this\n // sandbox's ephemeral connection id. Recreating only the sandbox would\n // leave both sockets targeting the dead connection, so surface a\n // pre-turn error and let the caller resume the same conversation with\n // a new SDK session.\n throw new CloudManagedSandboxExpiredError(\n sandbox.sandboxId,\n sandbox.conversationId,\n );\n }\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud refresh managed sandbox\");\n if (!isCloudAgentSandboxRefresh(body) || !body.success) {\n throw new Error(\"Cloud refresh managed sandbox response did not confirm refresh.\");\n }\n return;\n }\n\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(sandbox.agentId)}/sandboxes/refresh`,\n {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({ ttlMinutes: sandbox.ttlMinutes }),\n },\n );\n const body = await parseJsonResponse(response);\n assertOkResponse(response, body, \"Cloud refresh managed sandbox\");\n if (!isCloudAgentSandboxRefresh(body) || !body.success) {\n throw new Error(\"Cloud refresh managed sandbox response did not confirm refresh.\");\n }\n if (body.sandboxId !== sandbox.sandboxId) {\n throw new CloudManagedSandboxOwnershipError(\n `Cloud managed sandbox ownership changed for agent ${sandbox.agentId}: expected ${sandbox.sandboxId}, got ${body.sandboxId}.`,\n );\n }\n }\n\n private async terminateManagedSandbox(sandbox: ManagedCloudSandbox): Promise<void> {\n const fetchImpl = getFetch(this.cloudOptions.fetch);\n const baseUrl = normalizeCloudApiBaseUrl(this.cloudOptions.apiBaseUrl);\n\n if (sandbox.conversationId) {\n // Terminate exactly this sandbox — the agent-scoped DELETE targets the\n // agent's \"latest active\" sandbox, which may not be ours.\n const response = await fetchImpl(\n `${baseUrl}/v1/sandboxes/${encodeURIComponent(sandbox.sandboxId)}/terminate`,\n {\n method: \"POST\",\n headers: cloudHeaders(this.cloudOptions),\n body: JSON.stringify({}),\n },\n );\n const body = await parseJsonResponse(response);\n if (response.status === 404) return;\n assertOkResponse(response, body, \"Cloud terminate managed sandbox\");\n return;\n }\n\n // Agent-scoped: refresh first so the ownership check confirms the\n // \"latest active\" sandbox the DELETE will target is still ours.\n await this.refreshManagedSandbox(sandbox);\n\n const response = await fetchImpl(\n `${baseUrl}/v1/agents/${encodeURIComponent(sandbox.agentId)}/sandboxes`,\n {\n method: \"DELETE\",\n headers: cloudHeaders(this.cloudOptions),\n },\n );\n const body = await parseJsonResponse(response);\n if (response.status === 404) return;\n assertOkResponse(response, body, \"Cloud terminate managed sandbox\");\n }\n\n private async waitForManagedSandboxConnection(\n sandbox: ManagedCloudSandbox,\n ): Promise<{ connectionId: string }> {\n const deadline = Date.now() + sandbox.readyTimeoutMs;\n let lastError: unknown;\n\n while (true) {\n try {\n const resolved = await this.remoteEnvironmentClient().resolveEnvironment({\n deviceId: sandbox.deviceId,\n });\n return { connectionId: resolved.connectionId };\n } catch (error) {\n lastError = error;\n if (!isRetryableManagedSandboxResolveError(error) || Date.now() >= deadline) {\n break;\n }\n const remainingMs = Math.max(0, deadline - Date.now());\n await sleep(Math.min(sandbox.readyPollIntervalMs, remainingMs));\n }\n }\n\n const detail = lastError instanceof Error ? lastError.message : String(lastError);\n throw new Error(\n `Cloud managed sandbox ${sandbox.sandboxId} did not come online within ${sandbox.readyTimeoutMs}ms: ${detail}`,\n );\n }\n\n private startManagedSandboxRefresh(sandbox: ManagedCloudSandbox): void {\n this.stopManagedSandboxRefresh();\n this.sandboxRefreshTimer = setInterval(() => {\n void this.refreshManagedSandbox(sandbox).catch((error) => {\n if (\n error instanceof CloudManagedSandboxOwnershipError ||\n error instanceof CloudManagedSandboxExpiredError\n ) {\n this.stopManagedSandboxRefresh();\n }\n });\n }, sandbox.refreshIntervalMs);\n (this.sandboxRefreshTimer as { unref?: () => void }).unref?.();\n }\n\n private stopManagedSandboxRefresh(): void {\n if (!this.sandboxRefreshTimer) return;\n clearInterval(this.sandboxRefreshTimer);\n this.sandboxRefreshTimer = null;\n }\n\n private async cleanupManagedSandbox(): Promise<void> {\n this.sandboxLifecycleClosing = true;\n this.stopManagedSandboxRefresh();\n const sandbox = this.managedSandbox;\n this.managedSandbox = null;\n\n // Do not race termination against a refresh already in flight. In\n // particular, this ensures cleanup observes the final refresh outcome\n // before issuing the by-id terminate request.\n try {\n await this.sandboxRefreshInFlight;\n } catch {\n // Expiration/refresh failures do not prevent best-effort cleanup.\n }\n\n if (!sandbox || !sandbox.terminateOnClose) return;\n try {\n await this.terminateManagedSandbox(sandbox);\n } catch {\n // Best-effort cleanup: Cloud TTL still bounds leaked managed sandboxes.\n }\n }\n\n private remoteEnvironmentClient(): RemoteEnvironmentClient {\n return new RemoteEnvironmentClient({\n baseUrl: this.cloudOptions.apiBaseUrl,\n apiKey: getCloudApiKey(this.cloudOptions),\n headers: this.cloudOptions.headers,\n fetch: this.cloudOptions.fetch,\n });\n }\n\n private effectiveEnvironment(): LettaCodeEnvironment | undefined {\n const modeEnvironment = this.mode.kind === \"session\"\n ? this.mode.options.environment\n : undefined;\n return modeEnvironment ?? this.cloudOptions.environment;\n }\n\n private effectiveSandboxOptions(): LettaCodeCloudSandboxOptions | undefined {\n const modeSandbox = this.mode.kind === \"session\"\n ? this.mode.options.sandbox\n : undefined;\n return modeSandbox ?? this.cloudOptions.sandbox;\n }\n\n private resolvedSandboxOptions(): LettaCodeCloudSandboxOptions {\n return this.effectiveSandboxOptions() ?? {};\n }\n}\n",
16
16
  "/**\n * SDK Validation\n *\n * Validates user-provided options before spawning the CLI.\n */\n\nimport type { \n CreateSessionOptions,\n CreateAgentOptions,\n MemoryItem, \n CreateBlock,\n SystemPromptPreset,\n SkillSource,\n DreamingOptions,\n} from \"./types.js\";\n\nconst VALID_SKILL_SOURCES: SkillSource[] = [\n \"bundled\",\n \"global\",\n \"agent\",\n \"project\",\n];\n\nconst VALID_REASONING_EFFORTS = [\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n] as const;\n\n/**\n * Extract block labels from memory items.\n */\nfunction getBlockLabels(memory: MemoryItem[]): string[] {\n return memory\n .map((item) => {\n if (typeof item === \"string\") return item; // preset name\n if (\"label\" in item) return (item as CreateBlock).label; // CreateBlock\n return null; // blockId - no label to check\n })\n .filter((label): label is string => label !== null);\n}\n\nfunction validateApprovalRecoveryOptions(options: CreateSessionOptions): void {\n if (\n options.maxApprovalRecoveryAttempts !== undefined &&\n (!Number.isInteger(options.maxApprovalRecoveryAttempts) ||\n options.maxApprovalRecoveryAttempts < 0)\n ) {\n throw new Error(\n \"Invalid maxApprovalRecoveryAttempts. Expected a non-negative integer.\"\n );\n }\n\n if (\n options.approvalRecoveryTimeoutMs !== undefined &&\n (!Number.isInteger(options.approvalRecoveryTimeoutMs) ||\n options.approvalRecoveryTimeoutMs <= 0)\n ) {\n throw new Error(\n \"Invalid approvalRecoveryTimeoutMs. Expected a positive integer.\"\n );\n }\n}\n\nfunction validateRemovedSessionOptions(options: CreateSessionOptions): void {\n if ((options as { memfsStartup?: unknown }).memfsStartup !== undefined) {\n throw new Error(\n \"memfsStartup is not supported by the SDK.\",\n );\n }\n}\n\n/**\n * Validate systemPrompt preset value.\n */\nfunction validateSystemPromptPreset(preset: string): void {\n const validPresets = [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ];\n if (!validPresets.includes(preset)) {\n throw new Error(\n `Invalid system prompt preset '${preset}'. ` +\n `Valid presets: ${validPresets.join(\", \")}`\n );\n }\n}\n\nfunction validateSkillSources(sources: SkillSource[] | undefined): void {\n if (sources === undefined) {\n return;\n }\n\n for (const source of sources) {\n if (!VALID_SKILL_SOURCES.includes(source)) {\n throw new Error(\n `Invalid skill source '${source}'. Valid values: ${VALID_SKILL_SOURCES.join(\", \")}`\n );\n }\n }\n}\n\nfunction validateDreamingOptions(dreaming: DreamingOptions | undefined): void {\n if (dreaming === undefined) {\n return;\n }\n\n if (\n dreaming.trigger !== undefined &&\n ![\"off\", \"step-count\", \"compaction-event\"].includes(dreaming.trigger)\n ) {\n throw new Error(\n `Invalid dreaming.trigger '${String(dreaming.trigger)}'. Valid values: off, step-count, compaction-event`\n );\n }\n\n if (\n dreaming.behavior !== undefined &&\n ![\"reminder\", \"auto-launch\"].includes(dreaming.behavior)\n ) {\n throw new Error(\n `Invalid dreaming.behavior '${String(dreaming.behavior)}'. Valid values: reminder, auto-launch`\n );\n }\n\n if (\n dreaming.stepCount !== undefined &&\n (!Number.isInteger(dreaming.stepCount) || dreaming.stepCount <= 0)\n ) {\n throw new Error(\n \"Invalid dreaming.stepCount. Expected a positive integer.\"\n );\n }\n}\n\nfunction validateReasoningEffort(value: unknown): void {\n if (value === undefined) return;\n if (\n typeof value !== \"string\" ||\n !VALID_REASONING_EFFORTS.includes(value as (typeof VALID_REASONING_EFFORTS)[number])\n ) {\n throw new Error(\n `Invalid reasoningEffort '${String(value)}'. Valid values: ${VALID_REASONING_EFFORTS.join(\", \")}`\n );\n }\n}\n\n/**\n * Validate CreateSessionOptions (used by createSession and resumeSession).\n */\nexport function validateCreateSessionOptions(options: CreateSessionOptions): void {\n // Validate systemPrompt preset if provided\n if (options.systemPrompt !== undefined) {\n validateSystemPromptPreset(options.systemPrompt);\n }\n\n validateSkillSources(options.skillSources);\n validateReasoningEffort(options.reasoningEffort);\n validateDreamingOptions(options.dreaming);\n validateApprovalRecoveryOptions(options);\n validateRemovedSessionOptions(options);\n}\n\n/**\n * Validate CreateAgentOptions (used by createAgent).\n */\nexport function validateCreateAgentOptions(options: CreateAgentOptions): void {\n // Validate memory/persona consistency\n if (options.memory !== undefined) {\n const blockLabels = getBlockLabels(options.memory);\n\n if (options.persona !== undefined && !blockLabels.includes(\"persona\")) {\n throw new Error(\n \"Cannot set 'persona' value - block not included in 'memory'. \" +\n \"Either add 'persona' to memory array or remove the persona option.\"\n );\n }\n\n if (options.human !== undefined && !blockLabels.includes(\"human\")) {\n throw new Error(\n \"Cannot set 'human' value - block not included in 'memory'. \" +\n \"Either add 'human' to memory array or remove the human option.\"\n );\n }\n }\n\n // Validate systemPrompt preset if provided as preset object\n if (\n options.systemPrompt !== undefined &&\n typeof options.systemPrompt === \"object\"\n ) {\n validateSystemPromptPreset(options.systemPrompt.preset);\n } else if (\n options.systemPrompt !== undefined &&\n typeof options.systemPrompt === \"string\"\n ) {\n // Check if it's a preset name (if so, validate it)\n const validPresets = [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ] as const;\n if (validPresets.includes(options.systemPrompt as SystemPromptPreset)) {\n validateSystemPromptPreset(options.systemPrompt);\n }\n // If not a preset, it's a custom string - no validation needed\n }\n\n validateSkillSources(options.skillSources);\n validateDreamingOptions(options.dreaming);\n}\n",
17
- "import { Session } from \"./session.js\";\nimport { RepositoriesClient } from \"./repositories.js\";\nimport {\n AppServerSession,\n assertRemoteSessionOptionsSupported,\n} from \"./app-server-session.js\";\nimport {\n CloudEnvironmentSession,\n assertCloudSessionOptionsSupported,\n createCloudAgent,\n validateCloudClientOptions,\n} from \"./cloud-session.js\";\nimport type {\n CreateAgentOptions,\n CreateSessionOptions,\n LettaCodeBackend,\n LettaCodeClientOptions,\n LettaCodeClientSessionOptions,\n LettaCodeEnvironment,\n LettaCodeRemoteClientOptions,\n LettaCodeLocalClientOptions,\n LettaCodeCloudClientOptions,\n LettaCodeSession,\n SDKResultMessage,\n SendMessage,\n} from \"./types.js\";\nimport {\n validateCreateAgentOptions,\n validateCreateSessionOptions,\n} from \"./validation.js\";\n\nconst VALID_BACKENDS = new Set<LettaCodeBackend>([\n \"local\",\n \"remote\",\n \"cloud\",\n]);\n\nfunction isLettaCodeBackend(value: string): value is LettaCodeBackend {\n return VALID_BACKENDS.has(value as LettaCodeBackend);\n}\n\nfunction getOptionsEnvironment(\n options: LettaCodeClientOptions,\n): LettaCodeEnvironment | undefined {\n if (\"environment\" in options) {\n return options.environment;\n }\n return undefined;\n}\n\nfunction stripCloudExecutionOptions(\n options: LettaCodeClientSessionOptions,\n): CreateSessionOptions {\n const sessionOptions = { ...options };\n delete sessionOptions.environment;\n delete sessionOptions.sandbox;\n return sessionOptions;\n}\n\nfunction hasRepositoryResources(options: LettaCodeClientSessionOptions): boolean {\n return options.resources !== undefined && options.resources.length > 0;\n}\n\nfunction hasCreateAgentEnvironment(options: CreateAgentOptions): boolean {\n return \"environment\" in (options as Record<string, unknown>);\n}\n\nfunction hasExplicitCreateAgentModel(options: CreateAgentOptions): boolean {\n return typeof options.model === \"string\" && options.model.trim().length > 0;\n}\n\nfunction looksLikeConversationId(id: string): boolean {\n return id.startsWith(\"conv-\") || id.startsWith(\"local-conv-\");\n}\n\ntype TurnSession = LettaCodeSession & {\n runTurn(message: SendMessage): Promise<SDKResultMessage>;\n};\n\n/**\n * Top-level Letta Agent SDK client.\n *\n * `backend` selects how the SDK reaches or runs the Letta Code harness.\n * `local` spawns an SDK-owned Letta Code app-server and speaks the websocket\n * protocol by default, with an explicit stdio fallback for legacy flows.\n * `remote` connects to a user-managed Letta Code app-server websocket endpoint.\n * `cloud` uses agents hosted on Constellation, with an explicit remote\n * environment or SDK-managed sandbox.\n */\nexport class LettaAgentClient {\n readonly backend: LettaCodeBackend;\n readonly environment: LettaCodeEnvironment | undefined;\n private readonly options: LettaCodeClientOptions;\n private repositoriesClient: RepositoriesClient | null = null;\n\n constructor(options: LettaCodeClientOptions = {}) {\n const backend = options.backend ?? \"local\";\n if (!isLettaCodeBackend(backend)) {\n throw new Error(\n `Invalid Letta Code backend '${String(backend)}'. Valid values: local, remote, cloud.`,\n );\n }\n\n this.backend = backend;\n this.environment = getOptionsEnvironment(options);\n this.options = options;\n\n if (this.backend === \"local\" && this.environment !== undefined) {\n throw new Error(\n 'LettaAgentClient environment is only valid with backend: \"cloud\".',\n );\n }\n if (this.backend === \"remote\" && this.environment !== undefined) {\n throw new Error(\n 'LettaAgentClient environment is only valid with backend: \"cloud\"; remote url selects the app-server runtime.',\n );\n }\n if (this.backend !== \"cloud\" && (options as { sandbox?: unknown }).sandbox !== undefined) {\n throw new Error('LettaAgentClient sandbox options are only valid with backend: \"cloud\".');\n }\n\n if (this.backend === \"local\") {\n const localOptions = options as LettaCodeLocalClientOptions;\n if (\n localOptions.transport !== undefined &&\n localOptions.transport !== \"app-server\" &&\n localOptions.transport !== \"stdio\"\n ) {\n throw new Error(\"Invalid local transport. Valid values: app-server, stdio.\");\n }\n const requestTimeoutMs = localOptions.appServer?.requestTimeoutMs;\n if (\n requestTimeoutMs !== undefined &&\n (!Number.isInteger(requestTimeoutMs) || requestTimeoutMs <= 0)\n ) {\n throw new Error(\"Invalid appServer.requestTimeoutMs. Expected a positive integer.\");\n }\n const startupTimeoutMs = localOptions.appServer?.startupTimeoutMs;\n if (\n startupTimeoutMs !== undefined &&\n (!Number.isInteger(startupTimeoutMs) || startupTimeoutMs <= 0)\n ) {\n throw new Error(\"Invalid appServer.startupTimeoutMs. Expected a positive integer.\");\n }\n }\n\n if (this.backend === \"remote\") {\n if (!(\"url\" in options) || typeof options.url !== \"string\" || options.url.length === 0) {\n throw new Error(\"LettaAgentClient remote backend requires a non-empty url.\");\n }\n if (\n options.requestTimeoutMs !== undefined &&\n (!Number.isInteger(options.requestTimeoutMs) || options.requestTimeoutMs <= 0)\n ) {\n throw new Error(\"Invalid requestTimeoutMs. Expected a positive integer.\");\n }\n }\n\n if (this.backend === \"cloud\") {\n validateCloudClientOptions(options as LettaCodeCloudClientOptions);\n }\n }\n\n /**\n * Create a new Letta Code agent with a default conversation.\n *\n * Environment/device selection is intentionally not part of the agent payload;\n * it belongs to the client/session execution context.\n */\n get repositories(): RepositoriesClient {\n return this.getRepositoriesClient();\n }\n\n async createAgent(options: CreateAgentOptions = {}): Promise<string> {\n if (hasCreateAgentEnvironment(options)) {\n throw new Error(\n \"createAgent() does not accept environment. Set a client default or pass environment to resumeSession()/createSession().\",\n );\n }\n\n validateCreateAgentOptions(options);\n\n if (this.backend === \"remote\") {\n const session = new AppServerSession(this.remoteOptions(), {\n kind: \"create-agent\",\n options,\n });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n }\n if (this.backend === \"cloud\") {\n if (!hasExplicitCreateAgentModel(options)) {\n throw new Error(\n 'Constellation createAgent() requires an explicit model. Pass model in createAgent({ model: \"provider/model\" }).',\n );\n }\n return createCloudAgent(this.cloudOptions(), options);\n }\n this.assertLocalBackend(\"createAgent\");\n if (!this.useLegacyLocalStdio()) {\n const session = new AppServerSession(this.localAppServerOptions(), {\n kind: \"create-agent\",\n options,\n });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n }\n const session = new Session({ ...options, createOnly: true });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n }\n\n /**\n * Create a new conversation/session.\n *\n * Without an agent id, this uses the default/LRU agent, matching the legacy\n * top-level createSession() helper.\n */\n createSession(\n agentIdOrOptions?: string | LettaCodeClientSessionOptions,\n options: LettaCodeClientSessionOptions = {},\n ): LettaCodeSession {\n const agentId =\n typeof agentIdOrOptions === \"string\" ? agentIdOrOptions : undefined;\n const resolvedOptions =\n typeof agentIdOrOptions === \"string\" ? options : (agentIdOrOptions ?? {});\n\n this.assertSessionBackend(\"createSession\", resolvedOptions);\n const sessionOptions = stripCloudExecutionOptions(resolvedOptions);\n validateCreateSessionOptions(sessionOptions);\n\n if (this.backend === \"remote\") {\n if (!agentId) {\n throw new Error(\n \"App-server createSession() requires an agent id. Call createAgent() first or pass an agent id.\",\n );\n }\n return new AppServerSession(this.remoteOptions(), {\n kind: \"session\",\n agentId,\n newConversation: true,\n options: resolvedOptions,\n });\n }\n if (this.backend === \"cloud\") {\n if (!agentId) {\n throw new Error(\n \"Constellation createSession() requires an agent id. Call createAgent() first or pass an agent id.\",\n );\n }\n return new CloudEnvironmentSession(this.cloudOptions(), {\n kind: \"session\",\n agentId,\n newConversation: true,\n options: resolvedOptions,\n });\n }\n if (!this.useLegacyLocalStdio() && agentId) {\n return new AppServerSession(this.localAppServerOptions(), {\n kind: \"session\",\n agentId,\n newConversation: true,\n options: resolvedOptions,\n });\n }\n if (agentId) {\n return new Session({ ...sessionOptions, agentId, newConversation: true });\n }\n return new Session({ ...sessionOptions, newConversation: true });\n }\n\n /**\n * Resume an existing agent default conversation or a specific conversation.\n *\n * `options.environment` overrides the client's default execution target for\n * Constellation sessions. Remote app-server URLs already select the runtime.\n */\n resumeSession(\n id: string,\n options: LettaCodeClientSessionOptions = {},\n ): LettaCodeSession {\n this.assertSessionBackend(\"resumeSession\", options);\n const sessionOptions = stripCloudExecutionOptions(options);\n validateCreateSessionOptions(sessionOptions);\n\n if (this.backend === \"remote\") {\n if (looksLikeConversationId(id)) {\n return new AppServerSession(this.remoteOptions(), {\n kind: \"session\",\n conversationId: id,\n options,\n });\n }\n return new AppServerSession(this.remoteOptions(), {\n kind: \"session\",\n agentId: id,\n defaultConversation: true,\n options,\n });\n }\n if (this.backend === \"cloud\") {\n if (looksLikeConversationId(id)) {\n return new CloudEnvironmentSession(this.cloudOptions(), {\n kind: \"session\",\n conversationId: id,\n options,\n });\n }\n return new CloudEnvironmentSession(this.cloudOptions(), {\n kind: \"session\",\n agentId: id,\n defaultConversation: true,\n options,\n });\n }\n if (!this.useLegacyLocalStdio()) {\n if (looksLikeConversationId(id)) {\n return new AppServerSession(this.localAppServerOptions(), {\n kind: \"session\",\n conversationId: id,\n options,\n });\n }\n return new AppServerSession(this.localAppServerOptions(), {\n kind: \"session\",\n agentId: id,\n defaultConversation: true,\n options,\n });\n }\n if (looksLikeConversationId(id)) {\n return new Session({ ...sessionOptions, conversationId: id });\n }\n return new Session({\n ...sessionOptions,\n agentId: id,\n defaultConversation: true,\n });\n }\n\n /** One-shot prompt convenience helper using a new conversation. */\n async prompt(\n message: SendMessage,\n agentId?: string,\n options: LettaCodeClientSessionOptions = {},\n ): Promise<SDKResultMessage> {\n const session = agentId\n ? this.createSession(agentId, options)\n : this.createSession(options);\n\n try {\n return await (session as TurnSession).runTurn(message);\n } finally {\n session.close();\n }\n }\n\n private assertLocalBackend(action: string): void {\n if (this.backend === \"local\") {\n return;\n }\n\n throw new Error(\n `LettaAgentClient backend '${this.backend}' is not implemented yet. ${action} currently supports backend 'local' only.`,\n );\n }\n\n private assertSessionBackend(\n action: string,\n options: LettaCodeClientSessionOptions,\n ): void {\n const effectiveEnvironment = options.environment ?? this.environment;\n if (this.backend === \"local\") {\n if (effectiveEnvironment !== undefined) {\n throw new Error(\n `${action}() environment overrides are only valid with backend: \"cloud\".`,\n );\n }\n if (options.sandbox !== undefined) {\n throw new Error(`${action}() sandbox options are only valid with backend: \"cloud\".`);\n }\n if (hasRepositoryResources(options)) {\n throw new Error(`${action}() repository resources are only valid with backend: \"cloud\".`);\n }\n if (!this.useLegacyLocalStdio()) {\n assertRemoteSessionOptionsSupported(action, options);\n }\n return;\n }\n\n if (this.backend === \"remote\") {\n if (options.environment !== undefined) {\n throw new Error(\n `${action}() environment overrides are only valid with backend: \"cloud\"; remote url selects the app-server runtime.`,\n );\n }\n if (options.sandbox !== undefined) {\n throw new Error(`${action}() sandbox options are only valid with backend: \"cloud\"; remote url selects the app-server runtime.`);\n }\n if (hasRepositoryResources(options)) {\n throw new Error(`${action}() repository resources are only valid with backend: \"cloud\".`);\n }\n assertRemoteSessionOptionsSupported(action, options);\n return;\n }\n if (this.backend === \"cloud\") {\n const cloudOptions = this.cloudOptions();\n if (cloudOptions.environment !== undefined && options.sandbox !== undefined) {\n throw new Error(`Constellation ${action}() cannot specify sandbox options when the client has a default environment.`);\n }\n if (cloudOptions.sandbox !== undefined && options.environment !== undefined) {\n throw new Error(`Constellation ${action}() cannot specify an environment when the client has default sandbox options.`);\n }\n assertCloudSessionOptionsSupported(action, options);\n return;\n }\n throw new Error(\n `LettaAgentClient backend '${this.backend}' is not implemented yet. ${action} currently supports backend 'local' only.`,\n );\n }\n\n private useLegacyLocalStdio(): boolean {\n return (this.options as LettaCodeLocalClientOptions).transport === \"stdio\";\n }\n\n private localAppServerOptions() {\n const localOptions = this.options as LettaCodeLocalClientOptions;\n const appServer = localOptions.appServer;\n return {\n local: appServer?.url === undefined,\n localBackend: \"local\",\n ...(appServer?.url !== undefined ? { url: appServer.url } : {}),\n ...(appServer?.WebSocket !== undefined ? { WebSocket: appServer.WebSocket } : {}),\n ...(appServer?.requestTimeoutMs !== undefined\n ? { requestTimeoutMs: appServer.requestTimeoutMs }\n : {}),\n ...(appServer?.listen !== undefined ? { localListen: appServer.listen } : {}),\n ...(appServer?.startupTimeoutMs !== undefined\n ? { localStartupTimeoutMs: appServer.startupTimeoutMs }\n : {}),\n };\n }\n\n private remoteOptions(): LettaCodeRemoteClientOptions {\n if (this.backend !== \"remote\") {\n throw new Error(\"Remote options requested for non-remote backend.\");\n }\n return this.options as LettaCodeRemoteClientOptions;\n }\n\n private getRepositoriesClient(): RepositoriesClient {\n if (this.backend !== \"cloud\") {\n throw new Error('client.repositories is only available with backend: \"cloud\".');\n }\n this.repositoriesClient ??= new RepositoriesClient(this.cloudOptions());\n return this.repositoriesClient;\n }\n\n private cloudOptions(): LettaCodeCloudClientOptions {\n if (this.backend !== \"cloud\") {\n throw new Error('Constellation options requested for non-\"cloud\" backend.');\n }\n return this.options as LettaCodeCloudClientOptions;\n }\n}\n",
17
+ "import { Session } from \"./session.js\";\nimport { RepositoriesClient } from \"./repositories.js\";\nimport {\n AppServerSession,\n assertRemoteSessionOptionsSupported,\n} from \"./app-server-session.js\";\nimport {\n CloudEnvironmentSession,\n assertCloudSessionOptionsSupported,\n createCloudAgent,\n validateCloudClientOptions,\n} from \"./cloud-session.js\";\nimport type {\n CreateAgentOptions,\n CreateSessionOptions,\n LettaCodeBackend,\n LettaCodeClientOptions,\n LettaCodeClientSessionOptions,\n LettaCodeEnvironment,\n LettaCodeRemoteClientOptions,\n LettaCodeLocalClientOptions,\n LettaCodeCloudClientOptions,\n LettaCodeSession,\n SDKResultMessage,\n SendMessage,\n} from \"./types.js\";\nimport {\n validateCreateAgentOptions,\n validateCreateSessionOptions,\n} from \"./validation.js\";\n\nconst VALID_BACKENDS = new Set<LettaCodeBackend>([\n \"local\",\n \"remote\",\n \"cloud\",\n]);\n\nfunction isLettaCodeBackend(value: string): value is LettaCodeBackend {\n return VALID_BACKENDS.has(value as LettaCodeBackend);\n}\n\nfunction getOptionsEnvironment(\n options: LettaCodeClientOptions,\n): LettaCodeEnvironment | undefined {\n if (\"environment\" in options) {\n return options.environment;\n }\n return undefined;\n}\n\nfunction stripCloudExecutionOptions(\n options: LettaCodeClientSessionOptions,\n): CreateSessionOptions {\n const sessionOptions = { ...options };\n delete sessionOptions.environment;\n delete sessionOptions.sandbox;\n return sessionOptions;\n}\n\nfunction hasRepositoryResources(options: LettaCodeClientSessionOptions): boolean {\n return options.resources !== undefined && options.resources.length > 0;\n}\n\nfunction hasCreateAgentEnvironment(options: CreateAgentOptions): boolean {\n return \"environment\" in (options as Record<string, unknown>);\n}\n\nfunction hasExplicitCreateAgentModel(options: CreateAgentOptions): boolean {\n return typeof options.model === \"string\" && options.model.trim().length > 0;\n}\n\nfunction looksLikeConversationId(id: string): boolean {\n return id.startsWith(\"conv-\") || id.startsWith(\"local-conv-\");\n}\n\ntype TurnSession = LettaCodeSession & {\n runTurn(message: SendMessage): Promise<SDKResultMessage>;\n};\n\n/**\n * Top-level Letta Agent SDK client.\n *\n * `backend` selects how the SDK reaches or runs the Letta Code harness.\n * `local` spawns an SDK-owned Letta Code app-server and speaks the websocket\n * protocol by default, with an explicit stdio fallback for legacy flows.\n * `remote` connects to a user-managed Letta Code app-server websocket endpoint.\n * `cloud` uses agents hosted on Constellation, with an explicit remote\n * environment or SDK-managed sandbox.\n */\nexport class LettaAgentClient {\n readonly backend: LettaCodeBackend;\n readonly environment: LettaCodeEnvironment | undefined;\n private readonly options: LettaCodeClientOptions;\n private repositoriesClient: RepositoriesClient | null = null;\n\n constructor(options: LettaCodeClientOptions = {}) {\n const backend = options.backend ?? \"local\";\n if (!isLettaCodeBackend(backend)) {\n throw new Error(\n `Invalid Letta Code backend '${String(backend)}'. Valid values: local, remote, cloud.`,\n );\n }\n\n this.backend = backend;\n this.environment = getOptionsEnvironment(options);\n this.options = options;\n\n if (this.backend === \"local\" && this.environment !== undefined) {\n throw new Error(\n 'LettaAgentClient environment is only valid with backend: \"cloud\".',\n );\n }\n if (this.backend === \"remote\" && this.environment !== undefined) {\n throw new Error(\n 'LettaAgentClient environment is only valid with backend: \"cloud\"; remote url selects the app-server runtime.',\n );\n }\n if (this.backend !== \"cloud\" && (options as { sandbox?: unknown }).sandbox !== undefined) {\n throw new Error('LettaAgentClient sandbox options are only valid with backend: \"cloud\".');\n }\n\n if (this.backend === \"local\") {\n const localOptions = options as LettaCodeLocalClientOptions;\n if (\n localOptions.transport !== undefined &&\n localOptions.transport !== \"app-server\" &&\n localOptions.transport !== \"stdio\"\n ) {\n throw new Error(\"Invalid local transport. Valid values: app-server, stdio.\");\n }\n const requestTimeoutMs = localOptions.appServer?.requestTimeoutMs;\n if (\n requestTimeoutMs !== undefined &&\n (!Number.isInteger(requestTimeoutMs) || requestTimeoutMs <= 0)\n ) {\n throw new Error(\"Invalid appServer.requestTimeoutMs. Expected a positive integer.\");\n }\n const startupTimeoutMs = localOptions.appServer?.startupTimeoutMs;\n if (\n startupTimeoutMs !== undefined &&\n (!Number.isInteger(startupTimeoutMs) || startupTimeoutMs <= 0)\n ) {\n throw new Error(\"Invalid appServer.startupTimeoutMs. Expected a positive integer.\");\n }\n }\n\n if (this.backend === \"remote\") {\n if (!(\"url\" in options) || typeof options.url !== \"string\" || options.url.length === 0) {\n throw new Error(\"LettaAgentClient remote backend requires a non-empty url.\");\n }\n if (\n options.requestTimeoutMs !== undefined &&\n (!Number.isInteger(options.requestTimeoutMs) || options.requestTimeoutMs <= 0)\n ) {\n throw new Error(\"Invalid requestTimeoutMs. Expected a positive integer.\");\n }\n }\n\n if (this.backend === \"cloud\") {\n validateCloudClientOptions(options as LettaCodeCloudClientOptions);\n }\n }\n\n /**\n * Create a new Letta Code agent with a default conversation.\n *\n * Environment/device selection is intentionally not part of the agent payload;\n * it belongs to the client/session execution context.\n */\n get repositories(): RepositoriesClient {\n return this.getRepositoriesClient();\n }\n\n async createAgent(options: CreateAgentOptions = {}): Promise<string> {\n if (hasCreateAgentEnvironment(options)) {\n throw new Error(\n \"createAgent() does not accept environment. Set a client default or pass environment to resumeSession()/createSession().\",\n );\n }\n\n validateCreateAgentOptions(options);\n\n if (this.backend === \"remote\") {\n const session = new AppServerSession(this.remoteOptions(), {\n kind: \"create-agent\",\n options,\n });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n }\n if (this.backend === \"cloud\") {\n if (!hasExplicitCreateAgentModel(options)) {\n throw new Error(\n 'Constellation createAgent() requires an explicit model. Pass model in createAgent({ model: \"provider/model\" }).',\n );\n }\n return createCloudAgent(this.cloudOptions(), options);\n }\n this.assertLocalBackend(\"createAgent\");\n if (!this.useLegacyLocalStdio()) {\n const session = new AppServerSession(this.localAppServerOptions(), {\n kind: \"create-agent\",\n options,\n });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n }\n const session = new Session({ ...options, createOnly: true });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n }\n\n /**\n * Create a new conversation/session.\n *\n * Without an agent id, this uses the default/LRU agent, matching the legacy\n * top-level createSession() helper.\n */\n createSession(\n agentIdOrOptions?: string | LettaCodeClientSessionOptions,\n options: LettaCodeClientSessionOptions = {},\n ): LettaCodeSession {\n const agentId =\n typeof agentIdOrOptions === \"string\" ? agentIdOrOptions : undefined;\n const resolvedOptions =\n typeof agentIdOrOptions === \"string\" ? options : (agentIdOrOptions ?? {});\n\n this.assertSessionBackend(\"createSession\", resolvedOptions);\n const sessionOptions = stripCloudExecutionOptions(resolvedOptions);\n validateCreateSessionOptions(sessionOptions);\n\n if (this.backend === \"remote\") {\n if (!agentId) {\n throw new Error(\n \"App-server createSession() requires an agent id. Call createAgent() first or pass an agent id.\",\n );\n }\n return new AppServerSession(this.remoteOptions(), {\n kind: \"session\",\n agentId,\n newConversation: true,\n options: resolvedOptions,\n });\n }\n if (this.backend === \"cloud\") {\n if (!agentId) {\n throw new Error(\n \"Constellation createSession() requires an agent id. Call createAgent() first or pass an agent id.\",\n );\n }\n return new CloudEnvironmentSession(this.cloudOptions(), {\n kind: \"session\",\n agentId,\n newConversation: true,\n options: resolvedOptions,\n });\n }\n if (!this.useLegacyLocalStdio() && agentId) {\n return new AppServerSession(this.localAppServerOptions(), {\n kind: \"session\",\n agentId,\n newConversation: true,\n options: resolvedOptions,\n });\n }\n if (agentId) {\n return new Session({ ...sessionOptions, agentId, newConversation: true });\n }\n return new Session({ ...sessionOptions, newConversation: true });\n }\n\n /**\n * Resume an existing agent default conversation or a specific conversation.\n *\n * `options.environment` overrides the client's default execution target for\n * Constellation sessions. Remote app-server URLs already select the runtime.\n */\n resumeSession(\n id: string,\n options: LettaCodeClientSessionOptions = {},\n ): LettaCodeSession {\n this.assertSessionBackend(\"resumeSession\", options);\n const sessionOptions = stripCloudExecutionOptions(options);\n validateCreateSessionOptions(sessionOptions);\n\n if (this.backend === \"remote\") {\n if (looksLikeConversationId(id)) {\n return new AppServerSession(this.remoteOptions(), {\n kind: \"session\",\n conversationId: id,\n options,\n });\n }\n return new AppServerSession(this.remoteOptions(), {\n kind: \"session\",\n agentId: id,\n defaultConversation: true,\n options,\n });\n }\n if (this.backend === \"cloud\") {\n if (looksLikeConversationId(id)) {\n return new CloudEnvironmentSession(this.cloudOptions(), {\n kind: \"session\",\n conversationId: id,\n options,\n });\n }\n return new CloudEnvironmentSession(this.cloudOptions(), {\n kind: \"session\",\n agentId: id,\n defaultConversation: true,\n options,\n });\n }\n if (!this.useLegacyLocalStdio()) {\n if (looksLikeConversationId(id)) {\n return new AppServerSession(this.localAppServerOptions(), {\n kind: \"session\",\n conversationId: id,\n options,\n });\n }\n return new AppServerSession(this.localAppServerOptions(), {\n kind: \"session\",\n agentId: id,\n defaultConversation: true,\n options,\n });\n }\n if (looksLikeConversationId(id)) {\n return new Session({ ...sessionOptions, conversationId: id });\n }\n return new Session({\n ...sessionOptions,\n agentId: id,\n defaultConversation: true,\n });\n }\n\n /** One-shot prompt convenience helper using a new conversation. */\n async prompt(\n message: SendMessage,\n agentId?: string,\n options: LettaCodeClientSessionOptions = {},\n ): Promise<SDKResultMessage> {\n const session = agentId\n ? this.createSession(agentId, options)\n : this.createSession(options);\n\n try {\n return await (session as TurnSession).runTurn(message);\n } finally {\n session.close();\n }\n }\n\n private assertLocalBackend(action: string): void {\n if (this.backend === \"local\") {\n return;\n }\n\n throw new Error(\n `LettaAgentClient backend '${this.backend}' is not implemented yet. ${action} currently supports backend 'local' only.`,\n );\n }\n\n private assertSessionBackend(\n action: string,\n options: LettaCodeClientSessionOptions,\n ): void {\n const effectiveEnvironment = options.environment ?? this.environment;\n if (this.backend === \"local\") {\n if (effectiveEnvironment !== undefined) {\n throw new Error(\n `${action}() environment overrides are only valid with backend: \"cloud\".`,\n );\n }\n if (options.sandbox !== undefined) {\n throw new Error(`${action}() sandbox options are only valid with backend: \"cloud\".`);\n }\n if (hasRepositoryResources(options)) {\n throw new Error(`${action}() repository resources are only valid with backend: \"cloud\".`);\n }\n if (!this.useLegacyLocalStdio()) {\n assertRemoteSessionOptionsSupported(action, options);\n }\n return;\n }\n\n if (this.backend === \"remote\") {\n if (options.environment !== undefined) {\n throw new Error(\n `${action}() environment overrides are only valid with backend: \"cloud\"; remote url selects the app-server runtime.`,\n );\n }\n if (options.sandbox !== undefined) {\n throw new Error(`${action}() sandbox options are only valid with backend: \"cloud\"; remote url selects the app-server runtime.`);\n }\n if (hasRepositoryResources(options)) {\n throw new Error(`${action}() repository resources are only valid with backend: \"cloud\".`);\n }\n assertRemoteSessionOptionsSupported(action, options);\n return;\n }\n if (this.backend === \"cloud\") {\n const cloudOptions = this.cloudOptions();\n if (cloudOptions.environment !== undefined && options.sandbox !== undefined) {\n throw new Error(`Constellation ${action}() cannot specify sandbox options when the client has a default environment.`);\n }\n if (cloudOptions.sandbox !== undefined && options.environment !== undefined) {\n throw new Error(`Constellation ${action}() cannot specify an environment when the client has default sandbox options.`);\n }\n assertCloudSessionOptionsSupported(action, options);\n return;\n }\n throw new Error(\n `LettaAgentClient backend '${this.backend}' is not implemented yet. ${action} currently supports backend 'local' only.`,\n );\n }\n\n private useLegacyLocalStdio(): boolean {\n return (this.options as LettaCodeLocalClientOptions).transport === \"stdio\";\n }\n\n private localAppServerOptions() {\n const localOptions = this.options as LettaCodeLocalClientOptions;\n const appServer = localOptions.appServer;\n return {\n local: appServer?.url === undefined,\n localBackend: appServer?.harnessBackend ?? \"local\",\n ...(appServer?.url !== undefined ? { url: appServer.url } : {}),\n ...(appServer?.WebSocket !== undefined ? { WebSocket: appServer.WebSocket } : {}),\n ...(appServer?.requestTimeoutMs !== undefined\n ? { requestTimeoutMs: appServer.requestTimeoutMs }\n : {}),\n ...(appServer?.listen !== undefined ? { localListen: appServer.listen } : {}),\n ...(appServer?.startupTimeoutMs !== undefined\n ? { localStartupTimeoutMs: appServer.startupTimeoutMs }\n : {}),\n };\n }\n\n private remoteOptions(): LettaCodeRemoteClientOptions {\n if (this.backend !== \"remote\") {\n throw new Error(\"Remote options requested for non-remote backend.\");\n }\n return this.options as LettaCodeRemoteClientOptions;\n }\n\n private getRepositoriesClient(): RepositoriesClient {\n if (this.backend !== \"cloud\") {\n throw new Error('client.repositories is only available with backend: \"cloud\".');\n }\n this.repositoriesClient ??= new RepositoriesClient(this.cloudOptions());\n return this.repositoriesClient;\n }\n\n private cloudOptions(): LettaCodeCloudClientOptions {\n if (this.backend !== \"cloud\") {\n throw new Error('Constellation options requested for non-\"cloud\" backend.');\n }\n return this.options as LettaCodeCloudClientOptions;\n }\n}\n",
18
18
  "import type { SDKStreamEventPayload } from \"./types.js\";\n\nexport type StreamTextKind = \"assistant\" | \"reasoning\";\n\nexport interface StreamTextDelta {\n kind: StreamTextKind;\n text: string;\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (Array.isArray(content)) {\n const pieces: string[] = [];\n for (const part of content) {\n if (typeof part === \"string\") {\n pieces.push(part);\n continue;\n }\n if (!part || typeof part !== \"object\") {\n continue;\n }\n const rec = part as Record<string, unknown>;\n if (typeof rec.text === \"string\") {\n pieces.push(rec.text);\n }\n }\n const joined = pieces.join(\"\");\n return joined.length > 0 ? joined : null;\n }\n\n if (content && typeof content === \"object\") {\n const rec = content as Record<string, unknown>;\n if (typeof rec.text === \"string\") {\n return rec.text;\n }\n }\n\n return null;\n}\n\n/**\n * Extract appendable assistant/reasoning text from a stream_event payload.\n *\n * Supports both shapes currently emitted by headless mode:\n * 1) content_block style: { type, delta: { text|reasoning } }\n * 2) message chunk style: { message_type: \"assistant_message\"|\"reasoning_message\", ... }\n */\nexport function extractStreamTextDelta(event: SDKStreamEventPayload): StreamTextDelta | null {\n if (!event || typeof event !== \"object\") {\n return null;\n }\n\n const rec = event as Record<string, unknown>;\n\n const maybeDelta = rec.delta;\n if (maybeDelta && typeof maybeDelta === \"object\") {\n const delta = maybeDelta as Record<string, unknown>;\n\n if (typeof delta.reasoning === \"string\" && delta.reasoning.length > 0) {\n return { kind: \"reasoning\", text: delta.reasoning };\n }\n\n if (typeof delta.text === \"string\" && delta.text.length > 0) {\n return { kind: \"assistant\", text: delta.text };\n }\n }\n\n const messageType = rec.message_type;\n if (messageType === \"reasoning_message\") {\n const reasoningText =\n typeof rec.reasoning === \"string\" ? rec.reasoning : extractTextFromContent(rec.content);\n if (reasoningText && reasoningText.length > 0) {\n return { kind: \"reasoning\", text: reasoningText };\n }\n }\n\n if (messageType === \"assistant_message\") {\n const assistantText = extractTextFromContent(rec.content);\n if (assistantText && assistantText.length > 0) {\n return { kind: \"assistant\", text: assistantText };\n }\n }\n\n return null;\n}\n",
19
19
  "/**\n * Tool Helpers\n * \n * Helper functions for creating tool results and parsing parameters.\n * Matches the API from pi-coding-agent.\n */\n\nimport type { AgentToolResult } from \"./types.js\";\n\n/**\n * Create a JSON tool result\n */\nexport function jsonResult(payload: unknown): AgentToolResult<unknown> {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(payload, null, 2),\n },\n ],\n details: payload,\n };\n}\n\n/**\n * Options for reading string parameters\n */\nexport interface StringParamOptions {\n required?: boolean;\n trim?: boolean;\n label?: string;\n allowEmpty?: boolean;\n}\n\n/**\n * Read a string parameter from tool args\n */\nexport function readStringParam(\n params: Record<string, unknown>,\n key: string,\n options?: StringParamOptions & { required: true },\n): string;\nexport function readStringParam(\n params: Record<string, unknown>,\n key: string,\n options?: StringParamOptions,\n): string | undefined;\nexport function readStringParam(\n params: Record<string, unknown>,\n key: string,\n options: StringParamOptions = {},\n): string | undefined {\n const { required = false, trim = true, label = key, allowEmpty = false } = options;\n const raw = params[key];\n if (typeof raw !== \"string\") {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n const value = trim ? raw.trim() : raw;\n if (!value && !allowEmpty) {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n return value;\n}\n\n/**\n * Read a number parameter from tool args\n */\nexport function readNumberParam(\n params: Record<string, unknown>,\n key: string,\n options: { required?: boolean; label?: string; integer?: boolean } = {},\n): number | undefined {\n const { required = false, label = key, integer = false } = options;\n const raw = params[key];\n let value: number | undefined;\n if (typeof raw === \"number\" && Number.isFinite(raw)) {\n value = raw;\n } else if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n if (trimmed) {\n const parsed = Number.parseFloat(trimmed);\n if (Number.isFinite(parsed)) value = parsed;\n }\n }\n if (value === undefined) {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n return integer ? Math.trunc(value) : value;\n}\n\n/**\n * Read a boolean parameter from tool args\n */\nexport function readBooleanParam(\n params: Record<string, unknown>,\n key: string,\n options: { required?: boolean; label?: string } = {},\n): boolean | undefined {\n const { required = false, label = key } = options;\n const raw = params[key];\n if (typeof raw === \"boolean\") {\n return raw;\n }\n if (typeof raw === \"string\") {\n const lower = raw.toLowerCase().trim();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\") return true;\n if (lower === \"false\" || lower === \"0\" || lower === \"no\") return false;\n }\n if (required) throw new Error(`${label} required`);\n return undefined;\n}\n\n/**\n * Read a string array parameter from tool args\n */\nexport function readStringArrayParam(\n params: Record<string, unknown>,\n key: string,\n options: StringParamOptions = {},\n): string[] | undefined {\n const { required = false, label = key } = options;\n const raw = params[key];\n if (Array.isArray(raw)) {\n const values = raw\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n if (values.length === 0) {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n return values;\n }\n if (typeof raw === \"string\") {\n const value = raw.trim();\n if (!value) {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n return [value];\n }\n if (required) throw new Error(`${label} required`);\n return undefined;\n}\n",
20
- "/**\n * Letta Agent SDK\n *\n * Programmatic control of Letta Code CLI with persistent agent memory.\n *\n * @example\n * ```typescript\n * import { LettaAgentClient, createAgent, createSession, resumeSession, prompt } from '@letta-ai/letta-agent-sdk';\n *\n * const client = new LettaAgentClient({ backend: 'local' });\n * const agentId = await client.createAgent();\n * const clientSession = client.resumeSession(agentId);\n *\n * // Start session with default agent + new conversation (like `letta`)\n * const session = createSession();\n *\n * // Create a new agent explicitly\n * const agentId = await createAgent();\n *\n * // Resume default conversation on an agent\n * const session = resumeSession(agentId);\n *\n * // Resume specific conversation\n * const session = resumeSession('conv-xxx');\n *\n * // Create new conversation on specific agent\n * const session = createSession(agentId);\n *\n * // One-shot prompt (uses default agent)\n * const result = await prompt('Hello');\n * const result = await prompt('Hello', agentId); // specific agent\n * ```\n */\n\nimport { Session } from \"./session.js\";\nimport { LettaAgentClient } from \"./client.js\";\nimport type {\n CreateSessionOptions,\n CreateAgentOptions,\n LettaCodeSession,\n SDKInitMessage,\n SDKResultMessage,\n SendMessage,\n} from \"./types.js\";\nimport { validateCreateSessionOptions, validateCreateAgentOptions } from \"./validation.js\";\n\n// Re-export types\nexport type {\n CreateSessionOptions,\n CreateAgentOptions,\n LettaCodeBackend,\n LettaCodeEnvironment,\n LettaCodeLocalClientOptions,\n LettaCodeLocalAppServerOptions,\n LettaCodeRemoteClientOptions,\n LettaCodeCloudClientOptions,\n LettaCodeClientOptions,\n LettaCodeClientSessionOptions,\n LettaCodeSession,\n LettaCodeSocketLike,\n LettaCodeSocketConstructor,\n SDKMessage,\n SDKInitMessage,\n SDKAssistantMessage,\n SDKToolCallMessage,\n SDKToolResultMessage,\n SDKReasoningMessage,\n SDKResultMessage,\n SDKErrorCode,\n SDKStreamEventMessage,\n SDKStreamEventPayload,\n SDKStreamEventDeltaPayload,\n SDKStreamEventMessagePayload,\n SDKUnknownStreamEventPayload,\n SDKErrorMessage,\n SDKRetryMessage,\n SDKQueueItem,\n SDKQueueUpdateMessage,\n SDKLoopStatusMessage,\n SDKProtocolMessage,\n SDKProtocolCommand,\n SendCommandOptions,\n RunTurnOptions,\n RecoverPendingApprovalsOptions,\n RecoverPendingApprovalsResult,\n SkillSource,\n DreamingOptions,\n DreamingTrigger,\n DreamingBehavior,\n EffectiveDreamingSettings,\n PermissionMode,\n ReasoningEffort,\n CanUseToolCallback,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n // Multimodal content types\n TextContent,\n ImageContent,\n MessageContentItem,\n SendMessage,\n // List messages API\n ListMessagesOptions,\n ListMessagesResult,\n ListModelsResult,\n LettaCodeModelEntry,\n UpdateModelOptions,\n UpdateModelResult,\n Repository,\n CreateRepositoryParams,\n ListRepositoriesParams,\n ListRepositoriesResult,\n RepositoryResource,\n RepositoryFileEntry,\n ListRepositoryFilesParams,\n ListRepositoryFilesResult,\n CreateRepositoryFileParams,\n RepositoryFile,\n UpdateRepositoryFileParams,\n RepositoryFileMutationResult,\n DeleteRepositoryFileParams,\n DeleteRepositoryFileResult,\n RepositoryVersion,\n ListRepositoryVersionsParams,\n GetRepositoryVersionParams,\n // Bootstrap API\n BootstrapStateOptions,\n BootstrapStateResult,\n // Tool types\n AgentTool,\n AgentToolResult,\n AgentToolResultContent,\n AgentToolUpdateCallback,\n AnyAgentTool,\n} from \"./types.js\";\n\nexport { Session } from \"./session.js\";\nexport { RepositoriesClient } from \"./repositories.js\";\nexport { LettaAgentClient } from \"./client.js\";\n\nexport { extractStreamTextDelta } from \"./stream-events.js\";\n\n// Tool helpers\nexport {\n jsonResult,\n readStringParam,\n readNumberParam,\n readBooleanParam,\n readStringArrayParam,\n} from \"./tool-helpers.js\";\n\n/**\n * Create a new agent with a default conversation.\n * Returns the agentId which can be used with resumeSession or createSession.\n *\n * @example\n * ```typescript\n * // Create agent with default settings.\n * const agentId = await createAgent();\n *\n * // Create agent with custom memory\n * const agentId = await createAgent({\n * memory: ['persona', 'project'],\n * persona: 'You are a helpful coding assistant',\n * model: 'claude-sonnet-4',\n * tags: ['project:docs']\n * });\n *\n * // Then resume the default conversation:\n * const session = resumeSession(agentId);\n * ```\n */\nexport async function createAgent(options: CreateAgentOptions = {}): Promise<string> {\n validateCreateAgentOptions(options);\n return new LettaAgentClient().createAgent(options);\n}\n\n/**\n * Create a new conversation (session).\n *\n * - Without agentId: uses default/LRU agent with new conversation (like `letta`)\n * - With agentId: creates new conversation on specified agent\n *\n * @example\n * ```typescript\n * // New conversation on default agent (like `letta`)\n * await using session = createSession();\n *\n * // New conversation on specific agent\n * await using session = createSession(agentId);\n * ```\n */\nexport function createSession(\n agentId?: string,\n options: CreateSessionOptions = {},\n): LettaCodeSession {\n validateCreateSessionOptions(options);\n if (agentId) {\n return new LettaAgentClient().createSession(agentId, options);\n }\n // The app-server runtime_start protocol requires an explicit agent id. Keep\n // the historical default/LRU-agent helper on the legacy stdio transport.\n return new LettaAgentClient({ backend: \"local\", transport: \"stdio\" }).createSession(options);\n}\n\n/**\n * Resume an existing session.\n *\n * - Pass an agent ID (agent-xxx) to resume the default conversation\n * - Pass a conversation ID (conv-xxx) to resume a specific conversation\n *\n * The default conversation always exists after createAgent, so you can:\n * `createAgent()` → `resumeSession(agentId)` without needing createSession first.\n *\n * @example\n * ```typescript\n * // Resume default conversation\n * await using session = resumeSession(agentId);\n *\n * // Resume specific conversation\n * await using session = resumeSession('conv-xxx');\n * ```\n */\nexport function resumeSession(\n id: string,\n options: CreateSessionOptions = {},\n): LettaCodeSession {\n validateCreateSessionOptions(options);\n return new LettaAgentClient().resumeSession(id, options);\n}\n\n/**\n * One-shot prompt convenience function.\n *\n * - Without agentId: uses default agent (like `letta -p`), new conversation\n * - With agentId: uses specific agent, new conversation\n * - Uses a short-lived session and returns the final turn result.\n *\n * @example\n * ```typescript\n * const result = await prompt('What is 2+2?'); // default agent\n * const result = await prompt('What is the capital of France?', agentId); // specific agent\n * ```\n */\ntype TurnSession = LettaCodeSession & {\n runTurn(message: SendMessage): Promise<SDKResultMessage>;\n};\n\ntype InitializableSession = LettaCodeSession & {\n initialize(): Promise<SDKInitMessage>;\n};\n\nexport async function prompt(\n message: string,\n agentId?: string\n): Promise<SDKResultMessage> {\n // Use default agent behavior (like letta -p) when no agentId specified\n const session = agentId\n ? createSession(agentId)\n : createSession();\n\n try {\n return await (session as TurnSession).runTurn(message);\n } finally {\n session.close();\n }\n}\n\n// ═══════════════════════════════════════════════════════════════\n// SESSIONLESS APIs\n// ═══════════════════════════════════════════════════════════════\n\nimport type { ListMessagesOptions, ListMessagesResult } from \"./types.js\";\n\n/**\n * Fetch conversation messages without requiring a pre-existing session.\n *\n * Creates a transient CLI subprocess, fetches the requested message page, and\n * closes the subprocess. Useful for prefetching conversation histories before\n * opening a full session (e.g. desktop sidebar warm-up).\n *\n * Routing follows the same agent/conversation semantics as session history:\n * - Pass a conv-xxx conversationId to read a specific conversation.\n * - Omit conversationId to read the agent's default conversation.\n *\n * @param agentId - Agent ID to fetch messages for.\n * @param options - Pagination / filtering options (same as ListMessagesOptions).\n *\n * @example\n * ```typescript\n * // Prefetch default conversation\n * const { messages } = await listMessagesDirect(agentId);\n *\n * // Prefetch a specific conversation\n * const { messages, hasMore, nextBefore } = await listMessagesDirect(agentId, {\n * conversationId: 'conv-abc',\n * limit: 20,\n * order: 'desc',\n * });\n * ```\n */\nexport async function listMessagesDirect(\n agentId: string,\n options: ListMessagesOptions = {},\n): Promise<ListMessagesResult> {\n // resumeSession uses --default which maps to the agent's default conversation.\n // The session is transient: we only need it long enough to list messages.\n const session = new LettaAgentClient().resumeSession(agentId, {\n permissionMode: \"bypassPermissions\",\n });\n await (session as InitializableSession).initialize();\n try {\n return await session.listMessages(options);\n } finally {\n session.close();\n }\n}\n\n// ═══════════════════════════════════════════════════════════════\n// IMAGE HELPERS\n// ═══════════════════════════════════════════════════════════════\n\nimport { readFileSync } from \"node:fs\";\nimport type { ImageContent } from \"./types.js\";\n\n/**\n * Create image content from a file path.\n * \n * @example\n * ```typescript\n * await session.send([\n * { type: \"text\", text: \"What's in this image?\" },\n * imageFromFile(\"./screenshot.png\")\n * ]);\n * ```\n */\nexport function imageFromFile(filePath: string): ImageContent {\n const data = readFileSync(filePath).toString(\"base64\");\n const ext = filePath.toLowerCase();\n const media_type: ImageContent[\"source\"][\"media_type\"] = \n ext.endsWith(\".png\") ? \"image/png\"\n : ext.endsWith(\".gif\") ? \"image/gif\"\n : ext.endsWith(\".webp\") ? \"image/webp\"\n : \"image/jpeg\";\n \n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n\n/**\n * Create image content from base64 data.\n * \n * @example\n * ```typescript\n * const base64 = fs.readFileSync(\"image.png\").toString(\"base64\");\n * await session.send([\n * { type: \"text\", text: \"Describe this\" },\n * imageFromBase64(base64, \"image/png\")\n * ]);\n * ```\n */\nexport function imageFromBase64(\n data: string,\n media_type: ImageContent[\"source\"][\"media_type\"] = \"image/png\"\n): ImageContent {\n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n\n/**\n * Create image content from a URL.\n * Fetches the image and converts to base64.\n * \n * @example\n * ```typescript\n * const img = await imageFromURL(\"https://example.com/image.png\");\n * await session.send([\n * { type: \"text\", text: \"What's this?\" },\n * img\n * ]);\n * ```\n */\nexport async function imageFromURL(url: string): Promise<ImageContent> {\n const response = await fetch(url);\n const buffer = await response.arrayBuffer();\n const data = Buffer.from(buffer).toString(\"base64\");\n \n // Detect media type from content-type header or URL\n const contentType = response.headers.get(\"content-type\");\n let media_type: ImageContent[\"source\"][\"media_type\"] = \"image/png\";\n \n if (contentType?.includes(\"jpeg\") || contentType?.includes(\"jpg\") || url.match(/\\.jpe?g$/i)) {\n media_type = \"image/jpeg\";\n } else if (contentType?.includes(\"gif\") || url.endsWith(\".gif\")) {\n media_type = \"image/gif\";\n } else if (contentType?.includes(\"webp\") || url.endsWith(\".webp\")) {\n media_type = \"image/webp\";\n }\n \n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n"
20
+ "/**\n * Letta Agent SDK\n *\n * Programmatic control of Letta Code CLI with persistent agent memory.\n *\n * @example\n * ```typescript\n * import { LettaAgentClient, createAgent, createSession, resumeSession, prompt } from '@letta-ai/letta-agent-sdk';\n *\n * const client = new LettaAgentClient({ backend: 'local' });\n * const agentId = await client.createAgent();\n * const clientSession = client.resumeSession(agentId);\n *\n * // Start session with default agent + new conversation (like `letta`)\n * const session = createSession();\n *\n * // Create a new agent explicitly\n * const agentId = await createAgent();\n *\n * // Resume default conversation on an agent\n * const session = resumeSession(agentId);\n *\n * // Resume specific conversation\n * const session = resumeSession('conv-xxx');\n *\n * // Create new conversation on specific agent\n * const session = createSession(agentId);\n *\n * // One-shot prompt (uses default agent)\n * const result = await prompt('Hello');\n * const result = await prompt('Hello', agentId); // specific agent\n * ```\n */\n\nimport { Session } from \"./session.js\";\nimport { LettaAgentClient } from \"./client.js\";\nimport type {\n CreateSessionOptions,\n CreateAgentOptions,\n LettaCodeSession,\n SDKInitMessage,\n SDKResultMessage,\n SendMessage,\n} from \"./types.js\";\nimport { validateCreateSessionOptions, validateCreateAgentOptions } from \"./validation.js\";\n\n// Re-export types\nexport type {\n CreateSessionOptions,\n CreateAgentOptions,\n LettaCodeBackend,\n LettaCodeEnvironment,\n LettaCodeLocalClientOptions,\n LettaCodeLocalAppServerOptions,\n LettaCodeRemoteClientOptions,\n LettaCodeCloudClientOptions,\n LettaCodeClientOptions,\n LettaCodeClientSessionOptions,\n LettaCodeSession,\n LettaCodeSocketLike,\n LettaCodeSocketConstructor,\n SDKMessage,\n SDKInitMessage,\n SDKAssistantMessage,\n SDKToolCallMessage,\n SDKToolResultMessage,\n SDKReasoningMessage,\n SDKResultMessage,\n SDKErrorCode,\n SDKStreamEventMessage,\n SDKStreamEventPayload,\n SDKStreamEventDeltaPayload,\n SDKStreamEventMessagePayload,\n SDKUnknownStreamEventPayload,\n SDKErrorMessage,\n SDKRetryMessage,\n SDKQueueItem,\n SDKQueueUpdateMessage,\n SDKLoopStatusMessage,\n SDKProtocolMessage,\n SDKProtocolCommand,\n SendCommandOptions,\n RunTurnOptions,\n RecoverPendingApprovalsOptions,\n RecoverPendingApprovalsResult,\n SkillSource,\n DreamingOptions,\n DreamingTrigger,\n DreamingBehavior,\n EffectiveDreamingSettings,\n PermissionMode,\n ReasoningEffort,\n CanUseToolCallback,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n // Multimodal content types\n TextContent,\n ImageContent,\n MessageContentItem,\n SendMessage,\n // List messages API\n ListMessagesOptions,\n ListMessagesResult,\n ListModelsResult,\n LettaCodeModelEntry,\n UpdateModelOptions,\n UpdateModelResult,\n Repository,\n CreateRepositoryParams,\n ListRepositoriesParams,\n ListRepositoriesResult,\n RepositoryResource,\n RepositoryFileEntry,\n ListRepositoryFilesParams,\n ListRepositoryFilesResult,\n CreateRepositoryFileParams,\n RepositoryFile,\n UpdateRepositoryFileParams,\n RepositoryFileMutationResult,\n DeleteRepositoryFileParams,\n DeleteRepositoryFileResult,\n RepositoryVersion,\n ListRepositoryVersionsParams,\n GetRepositoryVersionParams,\n // Bootstrap API\n BootstrapStateOptions,\n BootstrapStateResult,\n // Tool types\n AgentTool,\n AgentToolResult,\n AgentToolResultContent,\n AgentToolUpdateCallback,\n AnyAgentTool,\n} from \"./types.js\";\n\nexport { Session } from \"./session.js\";\nexport { RepositoriesClient } from \"./repositories.js\";\nexport { LettaAgentClient } from \"./client.js\";\nexport { CloudManagedSandboxExpiredError } from \"./cloud-session.js\";\n\nexport { extractStreamTextDelta } from \"./stream-events.js\";\n\n// Tool helpers\nexport {\n jsonResult,\n readStringParam,\n readNumberParam,\n readBooleanParam,\n readStringArrayParam,\n} from \"./tool-helpers.js\";\n\n/**\n * Create a new agent with a default conversation.\n * Returns the agentId which can be used with resumeSession or createSession.\n *\n * @example\n * ```typescript\n * // Create agent with default settings.\n * const agentId = await createAgent();\n *\n * // Create agent with custom memory\n * const agentId = await createAgent({\n * memory: ['persona', 'project'],\n * persona: 'You are a helpful coding assistant',\n * model: 'claude-sonnet-4',\n * tags: ['project:docs']\n * });\n *\n * // Then resume the default conversation:\n * const session = resumeSession(agentId);\n * ```\n */\nexport async function createAgent(options: CreateAgentOptions = {}): Promise<string> {\n validateCreateAgentOptions(options);\n return new LettaAgentClient().createAgent(options);\n}\n\n/**\n * Create a new conversation (session).\n *\n * - Without agentId: uses default/LRU agent with new conversation (like `letta`)\n * - With agentId: creates new conversation on specified agent\n *\n * @example\n * ```typescript\n * // New conversation on default agent (like `letta`)\n * await using session = createSession();\n *\n * // New conversation on specific agent\n * await using session = createSession(agentId);\n * ```\n */\nexport function createSession(\n agentId?: string,\n options: CreateSessionOptions = {},\n): LettaCodeSession {\n validateCreateSessionOptions(options);\n if (agentId) {\n return new LettaAgentClient().createSession(agentId, options);\n }\n // The app-server runtime_start protocol requires an explicit agent id. Keep\n // the historical default/LRU-agent helper on the legacy stdio transport.\n return new LettaAgentClient({ backend: \"local\", transport: \"stdio\" }).createSession(options);\n}\n\n/**\n * Resume an existing session.\n *\n * - Pass an agent ID (agent-xxx) to resume the default conversation\n * - Pass a conversation ID (conv-xxx) to resume a specific conversation\n *\n * The default conversation always exists after createAgent, so you can:\n * `createAgent()` → `resumeSession(agentId)` without needing createSession first.\n *\n * @example\n * ```typescript\n * // Resume default conversation\n * await using session = resumeSession(agentId);\n *\n * // Resume specific conversation\n * await using session = resumeSession('conv-xxx');\n * ```\n */\nexport function resumeSession(\n id: string,\n options: CreateSessionOptions = {},\n): LettaCodeSession {\n validateCreateSessionOptions(options);\n return new LettaAgentClient().resumeSession(id, options);\n}\n\n/**\n * One-shot prompt convenience function.\n *\n * - Without agentId: uses default agent (like `letta -p`), new conversation\n * - With agentId: uses specific agent, new conversation\n * - Uses a short-lived session and returns the final turn result.\n *\n * @example\n * ```typescript\n * const result = await prompt('What is 2+2?'); // default agent\n * const result = await prompt('What is the capital of France?', agentId); // specific agent\n * ```\n */\ntype TurnSession = LettaCodeSession & {\n runTurn(message: SendMessage): Promise<SDKResultMessage>;\n};\n\ntype InitializableSession = LettaCodeSession & {\n initialize(): Promise<SDKInitMessage>;\n};\n\nexport async function prompt(\n message: string,\n agentId?: string\n): Promise<SDKResultMessage> {\n // Use default agent behavior (like letta -p) when no agentId specified\n const session = agentId\n ? createSession(agentId)\n : createSession();\n\n try {\n return await (session as TurnSession).runTurn(message);\n } finally {\n session.close();\n }\n}\n\n// ═══════════════════════════════════════════════════════════════\n// SESSIONLESS APIs\n// ═══════════════════════════════════════════════════════════════\n\nimport type { ListMessagesOptions, ListMessagesResult } from \"./types.js\";\n\n/**\n * Fetch conversation messages without requiring a pre-existing session.\n *\n * Creates a transient CLI subprocess, fetches the requested message page, and\n * closes the subprocess. Useful for prefetching conversation histories before\n * opening a full session (e.g. desktop sidebar warm-up).\n *\n * Routing follows the same agent/conversation semantics as session history:\n * - Pass a conv-xxx conversationId to read a specific conversation.\n * - Omit conversationId to read the agent's default conversation.\n *\n * @param agentId - Agent ID to fetch messages for.\n * @param options - Pagination / filtering options (same as ListMessagesOptions).\n *\n * @example\n * ```typescript\n * // Prefetch default conversation\n * const { messages } = await listMessagesDirect(agentId);\n *\n * // Prefetch a specific conversation\n * const { messages, hasMore, nextBefore } = await listMessagesDirect(agentId, {\n * conversationId: 'conv-abc',\n * limit: 20,\n * order: 'desc',\n * });\n * ```\n */\nexport async function listMessagesDirect(\n agentId: string,\n options: ListMessagesOptions = {},\n): Promise<ListMessagesResult> {\n // resumeSession uses --default which maps to the agent's default conversation.\n // The session is transient: we only need it long enough to list messages.\n const session = new LettaAgentClient().resumeSession(agentId, {\n permissionMode: \"unrestricted\",\n });\n await (session as InitializableSession).initialize();\n try {\n return await session.listMessages(options);\n } finally {\n session.close();\n }\n}\n\n// ═══════════════════════════════════════════════════════════════\n// IMAGE HELPERS\n// ═══════════════════════════════════════════════════════════════\n\nimport { readFileSync } from \"node:fs\";\nimport type { ImageContent } from \"./types.js\";\n\n/**\n * Create image content from a file path.\n * \n * @example\n * ```typescript\n * await session.send([\n * { type: \"text\", text: \"What's in this image?\" },\n * imageFromFile(\"./screenshot.png\")\n * ]);\n * ```\n */\nexport function imageFromFile(filePath: string): ImageContent {\n const data = readFileSync(filePath).toString(\"base64\");\n const ext = filePath.toLowerCase();\n const media_type: ImageContent[\"source\"][\"media_type\"] = \n ext.endsWith(\".png\") ? \"image/png\"\n : ext.endsWith(\".gif\") ? \"image/gif\"\n : ext.endsWith(\".webp\") ? \"image/webp\"\n : \"image/jpeg\";\n \n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n\n/**\n * Create image content from base64 data.\n * \n * @example\n * ```typescript\n * const base64 = fs.readFileSync(\"image.png\").toString(\"base64\");\n * await session.send([\n * { type: \"text\", text: \"Describe this\" },\n * imageFromBase64(base64, \"image/png\")\n * ]);\n * ```\n */\nexport function imageFromBase64(\n data: string,\n media_type: ImageContent[\"source\"][\"media_type\"] = \"image/png\"\n): ImageContent {\n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n\n/**\n * Create image content from a URL.\n * Fetches the image and converts to base64.\n * \n * @example\n * ```typescript\n * const img = await imageFromURL(\"https://example.com/image.png\");\n * await session.send([\n * { type: \"text\", text: \"What's this?\" },\n * img\n * ]);\n * ```\n */\nexport async function imageFromURL(url: string): Promise<ImageContent> {\n const response = await fetch(url);\n const buffer = await response.arrayBuffer();\n const data = Buffer.from(buffer).toString(\"base64\");\n \n // Detect media type from content-type header or URL\n const contentType = response.headers.get(\"content-type\");\n let media_type: ImageContent[\"source\"][\"media_type\"] = \"image/png\";\n \n if (contentType?.includes(\"jpeg\") || contentType?.includes(\"jpg\") || url.match(/\\.jpe?g$/i)) {\n media_type = \"image/jpeg\";\n } else if (contentType?.includes(\"gif\") || url.endsWith(\".gif\")) {\n media_type = \"image/gif\";\n } else if (contentType?.includes(\"webp\") || url.endsWith(\".webp\")) {\n media_type = \"image/webp\";\n }\n \n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n\n// ═══════════════════════════════════════════════════════════════\n// DREAMING — batch memory formation over recorded sessions\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n dream,\n collectTranscripts,\n initDreamAgent,\n createMemfsWritePolicy,\n installMemfsGuard,\n loadDreamAgent,\n packDreamBatches,\n recreateMemfsDirectories,\n getTrajectorySource,\n listTrajectorySourceTypes,\n AGGREGATOR_PERSONA,\n REFLECTION_SYSTEM_PROMPT,\n} from \"./dream/index.js\";\nexport type {\n DreamOptions,\n DreamResult,\n CollectTranscriptsOptions,\n Transcript,\n TranscriptSourceSpec,\n DreamBatch,\n DreamAggregationOutcome,\n DreamAgentConfig,\n DreamAgentGuardOptions,\n InitDreamAgentOptions,\n LoadedDreamAgent,\n BatchReflectionResult,\n DiscoveredSession,\n NormalizedRecord,\n NormalizedSession,\n TrajectorySource,\n MemfsOperation,\n MemfsOperationRule,\n MemfsGuardInstallation,\n MemfsStructure,\n MemfsWritePolicy,\n} from \"./dream/index.js\";\n",
21
+ "// Dreaming: form durable agent memory from an explicit list of normalized\n// transcripts.\n//\n// collectTranscripts() -> initDreamAgent() -> dream()\n//\n// dream() deliberately does not discover or normalize source stores. The\n// caller supplies immutable transcript snapshots, which makes selection easy\n// to inspect and makes a run reproducible after its source files change.\n\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { LettaAgentClient } from \"../client.js\";\nimport {\n DEFAULT_BATCH_TOKEN_BUDGET,\n DEFAULT_MAX_SESSIONS_PER_BATCH,\n type DreamBatch,\n packDreamBatches,\n} from \"./batching.js\";\nimport {\n type DreamAggregationOutcome,\n runDreamAggregation,\n} from \"./aggregate.js\";\nimport {\n type BatchReflectionResult,\n runBatchReflections,\n} from \"./reflect.js\";\nimport {\n loadDreamAgent,\n prepareDreamAgentMemfs,\n saveDreamAgentConfig,\n} from \"./agent.js\";\nimport { loadDreamCursors, saveDreamCursors } from \"./cursors.js\";\nimport { AGGREGATOR_PERSONA } from \"./prompts.js\";\nimport { redactSensitiveText } from \"./redact.js\";\nimport { sessionKey } from \"./select.js\";\nimport type {\n DiscoveredSession,\n NormalizedSession,\n} from \"./types.js\";\nimport {\n estimateTokens,\n} from \"./types.js\";\nimport { validateRecords } from \"./normalize-core.js\";\nimport { ensureDreamWorkers } from \"./workers.js\";\n\nexport type { DreamBatch } from \"./batching.js\";\nexport type { DreamAggregationOutcome } from \"./aggregate.js\";\nexport type { BatchReflectionResult } from \"./reflect.js\";\nexport { packDreamBatches } from \"./batching.js\";\nexport {\n AGGREGATOR_PERSONA,\n REFLECTION_SYSTEM_PROMPT,\n} from \"./prompts.js\";\nexport { getTrajectorySource, listTrajectorySourceTypes } from \"./registry.js\";\nexport {\n type DreamAgentConfig,\n type DreamAgentGuardOptions,\n type InitDreamAgentOptions,\n type LoadedDreamAgent,\n initDreamAgent,\n loadDreamAgent,\n} from \"./agent.js\";\nexport {\n createMemfsWritePolicy,\n installMemfsGuard,\n recreateMemfsDirectories,\n type MemfsGuardInstallation,\n type MemfsOperation,\n type MemfsOperationRule,\n type MemfsStructure,\n type MemfsWritePolicy,\n} from \"./memfs.js\";\nexport {\n collectTranscripts,\n type CollectTranscriptsOptions,\n type Transcript,\n type TranscriptSourceSpec,\n} from \"./transcripts.js\";\nexport type {\n DiscoveredSession,\n NormalizedRecord,\n NormalizedSession,\n TrajectorySource,\n} from \"./types.js\";\n\nexport interface DreamOptions {\n client: LettaAgentClient;\n /** Initialized dream-agent id returned by initDreamAgent(). */\n agentId: string;\n /** Immutable normalized transcript snapshots to reflect on. */\n transcripts: readonly NormalizedSession[];\n /**\n * Additional caller instruction for the run, provided to every reflection\n * batch AND to the aggregation pass. The aggregator is the stage that\n * lands the final commit on the memory filesystem, so instructions about\n * maintaining specific files (e.g. a projected AGENTS.md) reach it too —\n * an instruction that steered only the batches would be unreliable.\n */\n instruction?: string;\n /** Override the harness agents directory (tests). */\n agentsDir?: string;\n /** Per-batch token budget (default 60k, measured on normalized content). */\n batchTokenBudget?: number;\n /** Maximum transcripts in one batch (default 10). */\n maxTranscriptsPerBatch?: number;\n /** Concurrent reflection sessions; default: every batch at once. */\n concurrency?: number;\n /** Preview cursor filtering and batch packing without running agents. */\n planOnly?: boolean;\n /**\n * Abort the run: in-flight reflector/aggregator sessions are closed, no\n * new batches start, the run's artifacts (clones, runRoot) are removed,\n * cursors are NOT advanced, and dream() rejects with the abort reason.\n * Shutting down a spawned app-server remains the caller's job via\n * client.close().\n */\n signal?: AbortSignal;\n log?: (line: string) => void;\n}\n\n/** Long-lived streams tracked incrementally between dreams. */\nconst CURSOR_TRACKED_HARNESSES = new Set([\"openhands\"]);\n\nexport type DreamResult =\n | { kind: \"nothing_to_dream\" }\n | {\n kind: \"plan\";\n transcripts: DiscoveredSession[];\n batches: DreamBatch[];\n }\n | {\n kind: \"completed\";\n runRoot: string;\n success: boolean;\n transcripts: DiscoveredSession[];\n batches: BatchReflectionResult[];\n aggregation: DreamAggregationOutcome;\n reflectorAgentId: string;\n aggregatorAgentId: string;\n };\n\nfunction dreamRunId(): string {\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\..+/, \"\")\n .replace(\"T\", \"-\");\n return `dream-${stamp}`;\n}\n\nfunction orderedTranscripts(\n transcripts: readonly NormalizedSession[],\n): NormalizedSession[] {\n return [...transcripts].sort((a, b) =>\n a.session.startTime.localeCompare(b.session.startTime) ||\n a.session.endTime.localeCompare(b.session.endTime) ||\n a.session.harness.localeCompare(b.session.harness) ||\n a.session.sessionId.localeCompare(b.session.sessionId)\n );\n}\n\nfunction validateTranscripts(\n transcripts: readonly NormalizedSession[],\n): void {\n const seen = new Set<string>();\n for (const transcript of transcripts) {\n const key = sessionKey(transcript.session);\n if (seen.has(key)) {\n throw new Error(`dream(): duplicate transcript ${key}`);\n }\n seen.add(key);\n const problem = validateRecords(transcript.records);\n if (problem) {\n throw new Error(`dream(): invalid transcript ${key}: ${problem}`);\n }\n }\n}\n\nexport async function dream(options: DreamOptions): Promise<DreamResult> {\n const log = options.log ?? (() => {});\n options.signal?.throwIfAborted();\n validateTranscripts(options.transcripts);\n\n const agent = await loadDreamAgent(options.agentId, {\n ...(options.agentsDir ? { agentsDir: options.agentsDir } : {}),\n });\n const memoryDir = agent.memoryDir;\n const cursorDir = agent.stateDir;\n\n if (options.transcripts.length === 0) {\n return { kind: \"nothing_to_dream\" };\n }\n await prepareDreamAgentMemfs(agent);\n\n const cursors = await loadDreamCursors(cursorDir);\n const lastReflectedTsByKey = new Map<string, string>();\n const normalizedJsonByKey = new Map<string, string>();\n const measuredTranscripts: DiscoveredSession[] = [];\n\n for (const transcript of orderedTranscripts(options.transcripts)) {\n const session = transcript.session;\n const key = sessionKey(session);\n let records = [...transcript.records];\n\n if (CURSOR_TRACKED_HARNESSES.has(session.harness)) {\n const cursor = cursors[key];\n if (cursor) {\n const body = records.filter(\n (record) =>\n record.role !== \"meta\" &&\n (record.timestamp ?? \"\") > cursor.reflectedThrough,\n );\n if (body.length === 0) {\n log(\n `[cursor] ${key}: nothing new past ${cursor.reflectedThrough}; skipping`,\n );\n continue;\n }\n records = [\n ...records.filter((record) => record.role === \"meta\"),\n ...body,\n ];\n }\n const lastTs = [...records]\n .reverse()\n .find((record) => record.role !== \"meta\" && record.timestamp)\n ?.timestamp;\n if (lastTs) lastReflectedTsByKey.set(key, lastTs);\n }\n\n // Run artifacts and reflection prompts should never retain credentials\n // that a recorded shell/env command happened to print.\n const json = redactSensitiveText(JSON.stringify(records, null, 1));\n normalizedJsonByKey.set(key, json);\n measuredTranscripts.push({\n ...session,\n estTokens: estimateTokens(json),\n });\n }\n\n if (measuredTranscripts.length === 0) {\n return { kind: \"nothing_to_dream\" };\n }\n\n const batches = packDreamBatches(\n measuredTranscripts,\n options.batchTokenBudget ?? DEFAULT_BATCH_TOKEN_BUDGET,\n options.maxTranscriptsPerBatch ?? DEFAULT_MAX_SESSIONS_PER_BATCH,\n );\n if (options.planOnly) {\n return {\n kind: \"plan\",\n transcripts: measuredTranscripts,\n batches,\n };\n }\n\n options.signal?.throwIfAborted();\n await mkdir(agent.runsDir, { recursive: true });\n const runRoot = join(agent.runsDir, dreamRunId());\n await mkdir(runRoot, { recursive: true });\n\n // On abort: remove this run's artifacts (batch clones live under runRoot)\n // and reject. Cursors are never advanced (the success gate below already\n // requires a non-aborted, fully successful run).\n const throwIfAbortedWithCleanup = async () => {\n if (!options.signal?.aborted) return;\n log(\"[abort] dream aborted; removing run artifacts\");\n await rm(runRoot, { recursive: true, force: true }).catch(() => {});\n options.signal.throwIfAborted();\n };\n\n const workers = await ensureDreamWorkers(options.client, {\n reflectorAgentId: agent.config.reflectorAgentId,\n aggregatorAgentId: agent.agentId,\n model: agent.config.model,\n log,\n });\n if (agent.config.reflectorAgentId !== workers.reflectorAgentId) {\n agent.config.reflectorAgentId = workers.reflectorAgentId;\n await saveDreamAgentConfig(agent);\n }\n\n log(\n `Selected ${measuredTranscripts.length} transcript(s) in ${batches.length} batch(es)`,\n );\n const batchResults = await runBatchReflections({\n client: options.client,\n reflectorAgentId: workers.reflectorAgentId,\n parentAgentId: agent.agentId,\n memoryDir,\n runRoot,\n batches,\n normalizedJsonByKey,\n memfsPolicy: agent.config.memfs.policy,\n concurrency: options.concurrency ?? batches.length,\n ...(options.instruction ? { instruction: options.instruction } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n log,\n });\n await throwIfAbortedWithCleanup();\n\n const aggregation = await runDreamAggregation({\n client: options.client,\n aggregatorAgentId: agent.agentId,\n memoryDir,\n runRoot,\n reflections: batchResults,\n memfsPolicy: agent.config.memfs.policy,\n personaPreamble: AGGREGATOR_PERSONA,\n ...(options.instruction ? { instruction: options.instruction } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n log,\n });\n await throwIfAbortedWithCleanup();\n\n const everyBatchSucceeded = batchResults.every((batch) => batch.success);\n const success = everyBatchSucceeded && aggregation.success;\n\n if (success && lastReflectedTsByKey.size > 0) {\n const reflectedKeys = new Set(\n batchResults\n .filter((batch) => batch.success)\n .flatMap((batch) => batch.sessionIds),\n );\n let advanced = 0;\n for (const [key, reflectedThrough] of lastReflectedTsByKey) {\n if (!reflectedKeys.has(key)) continue;\n cursors[key] = { reflectedThrough };\n advanced += 1;\n }\n if (advanced > 0) {\n await saveDreamCursors(cursorDir, cursors);\n log(`[cursor] advanced ${advanced} cursor(s)`);\n }\n }\n\n return {\n kind: \"completed\",\n runRoot,\n success,\n transcripts: measuredTranscripts,\n batches: batchResults,\n aggregation,\n reflectorAgentId: workers.reflectorAgentId,\n aggregatorAgentId: agent.agentId,\n };\n}\n",
22
+ "// Pack discovered sessions into sequential, size-bounded batches.\n//\n// Sessions are ordered by their first-record timestamp, then greedily packed:\n// a batch closes when adding the next session would exceed the token budget or\n// the session cap. Batches are therefore contiguous time segments, and a\n// single oversized session still gets its own batch.\n\nimport type { DiscoveredSession } from \"./types.js\";\n\nexport const DEFAULT_BATCH_TOKEN_BUDGET = 60_000;\nexport const DEFAULT_MAX_SESSIONS_PER_BATCH = 10;\n\nexport interface DreamBatch {\n index: number;\n sessions: DiscoveredSession[];\n estTokens: number;\n startTime: string;\n endTime: string;\n}\n\nexport function packDreamBatches(\n sessions: DiscoveredSession[],\n tokenBudget: number,\n maxSessions: number,\n): DreamBatch[] {\n const ordered = [...sessions].sort((a, b) =>\n a.startTime.localeCompare(b.startTime),\n );\n\n const batches: DreamBatch[] = [];\n let current: DiscoveredSession[] = [];\n let currentTokens = 0;\n\n const flush = () => {\n const first = current[0];\n const last = current[current.length - 1];\n if (!first || !last) return;\n batches.push({\n index: batches.length,\n sessions: current,\n estTokens: currentTokens,\n startTime: first.startTime,\n endTime: last.endTime,\n });\n current = [];\n currentTokens = 0;\n };\n\n for (const session of ordered) {\n const wouldOverflow =\n current.length > 0 &&\n (currentTokens + session.estTokens > tokenBudget ||\n current.length >= maxSessions);\n if (wouldOverflow) flush();\n current.push(session);\n currentTokens += session.estTokens;\n }\n flush();\n return batches;\n}\n",
23
+ "// Aggregation stage: synthesize every batch's memory changes (diffs against\n// the shared base revision) into the target memory filesystem, in ONE pass.\n// The aggregator always runs (even for one batch) and is the only stage that\n// edits the target. Batches that failed or produced nothing are skipped. When\n// the input count is large, the aggregator itself decides whether to delegate\n// aspects to its own subagents — the pipeline imposes no fan-out structure.\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { LettaAgentClient } from \"../client.js\";\nimport { gitOutput, snapshotMemoryTree } from \"./clone.js\";\nimport {\n installMemfsGuard,\n recreateMemfsDirectories,\n validateMemfsChanges,\n type MemfsWritePolicy,\n} from \"./memfs.js\";\nimport {\n AGGREGATOR_CONTINUE_PROMPT,\n buildAggregatorUserPrompt,\n} from \"./prompts.js\";\nimport type { BatchReflectionResult } from \"./reflect.js\";\nimport { runAgentToCompletion } from \"./runner.js\";\nimport { normalizeSdkMessages } from \"./sdk-messages.js\";\n\nexport interface DreamAggregationOutcome {\n success: boolean;\n /** The aggregator's final report (or the skip reason). */\n report: string;\n error?: string;\n conversationId?: string;\n /** Commits the aggregator landed on the target, relative to the base. */\n commitCount: number;\n}\n\nexport async function runDreamAggregation(params: {\n client: LettaAgentClient;\n aggregatorAgentId: string;\n /** The target memory filesystem the synthesis lands on. */\n memoryDir: string;\n runRoot: string;\n reflections: BatchReflectionResult[];\n /** Write policy enforced on the canonical MemFS and checked afterward. */\n memfsPolicy: MemfsWritePolicy;\n /**\n * Persona text prepended to the prompt when the aggregating agent doesn't\n * carry a dedicated aggregator persona block (a dream agent synthesizing\n * its own memory).\n */\n personaPreamble?: string;\n /**\n * Additional caller instruction. The aggregator is the only stage that\n * edits the target memory, so instructions about maintaining specific\n * files (e.g. a projected AGENTS.md) must reach it here.\n */\n instruction?: string;\n /** Abort: close the aggregator session and stop nudging. */\n signal?: AbortSignal;\n log?: (line: string) => void;\n}): Promise<DreamAggregationOutcome> {\n const log = params.log ?? (() => {});\n\n // Batches that failed or produced nothing contribute nothing to merge.\n const withContent = params.reflections.filter(\n (r) => r.success && (r.commitCount > 0 || r.dirty),\n );\n if (withContent.length === 0) {\n const outcome: DreamAggregationOutcome = {\n success: true,\n report:\n \"Reflections found no durable learnings to persist; memory left unchanged.\",\n commitCount: 0,\n };\n const aggregateDir = join(params.runRoot, \"aggregate\");\n await mkdir(aggregateDir, { recursive: true });\n await writeFile(\n join(aggregateDir, \"report.json\"),\n JSON.stringify(\n {\n agentId: params.aggregatorAgentId,\n success: true,\n durationMs: 0,\n inputs: [],\n report: outcome.report,\n },\n null,\n 2,\n ),\n \"utf-8\",\n );\n const outputDir = join(aggregateDir, \"output\");\n await snapshotMemoryTree(params.memoryDir, outputDir);\n await recreateMemfsDirectories(\n outputDir,\n params.memfsPolicy.declaredDirectories ?? [],\n );\n return outcome;\n }\n\n const aggregateDir = join(params.runRoot, \"aggregate\");\n await mkdir(aggregateDir, { recursive: true });\n const guard = await installMemfsGuard(params.memoryDir, params.memfsPolicy);\n const baseRevision = await gitOutput(params.memoryDir, [\"rev-parse\", \"HEAD\"]);\n\n const builtPrompt = buildAggregatorUserPrompt({\n batchesDir: join(params.runRoot, \"batches\"),\n batchCount: params.reflections.length,\n memoryDir: params.memoryDir,\n ...(params.instruction ? { instruction: params.instruction } : {}),\n });\n const userPrompt = params.personaPreamble\n ? `${params.personaPreamble.trim()}\\n\\n${builtPrompt}`\n : builtPrompt;\n\n log(\n `[aggregate] integrating ${withContent.length} reflection output(s) into memory`,\n );\n const landedCommits = async () =>\n Number(\n (\n await gitOutput(params.memoryDir, [\n \"rev-list\",\n \"--count\",\n `${baseRevision}..HEAD`,\n ]).catch(() => \"0\")\n ).trim() || \"0\",\n );\n // Scope the session's memory to the target memfs so the harness's memory\n // guard applies to the tree the aggregator is synthesizing onto. The\n // EXPLICIT marker distinguishes this deliberate scope from stale leakage.\n const memoryEnv = {\n MEMORY_DIR: params.memoryDir,\n LETTA_MEMORY_DIR: params.memoryDir,\n LETTA_MEMORY_DIR_EXPLICIT: \"1\",\n };\n let run = await runAgentToCompletion(params.client, {\n agentId: params.aggregatorAgentId,\n userPrompt,\n // cwd one level above the target so the harness's own state doesn't land\n // inside (and get committed to) the memory filesystem.\n cwd: dirname(params.memoryDir),\n label: \"aggregate\",\n env: memoryEnv,\n ...(params.signal ? { signal: params.signal } : {}),\n onProgress: log,\n });\n // The model can end its turn narrating its plan instead of executing it.\n // While nothing has landed on the target, nudge the same conversation to\n // keep going — its plan and diff survey are already in context.\n const passes: { prompt: string; run: typeof run }[] = [\n { prompt: userPrompt, run },\n ];\n for (\n let nudge = 0;\n nudge < 2 &&\n !params.signal?.aborted &&\n run.success &&\n run.conversationId !== null &&\n (await landedCommits()) === 0;\n nudge++\n ) {\n log(\n \"[aggregate] turn ended with no commits on target — nudging to continue\",\n );\n run = await runAgentToCompletion(params.client, {\n agentId: params.aggregatorAgentId,\n userPrompt: AGGREGATOR_CONTINUE_PROMPT,\n cwd: dirname(params.memoryDir),\n label: \"aggregate\",\n resumeConversationId: run.conversationId,\n env: memoryEnv,\n ...(params.signal ? { signal: params.signal } : {}),\n onProgress: log,\n });\n passes.push({ prompt: AGGREGATOR_CONTINUE_PROMPT, run });\n }\n\n const records = passes.flatMap(\n (pass) => normalizeSdkMessages(pass.prompt, pass.run.messages) ?? [],\n );\n if (records.length > 0) {\n await writeFile(\n join(aggregateDir, \"trajectory.json\"),\n JSON.stringify(records, null, 1),\n \"utf-8\",\n );\n }\n const successfulPass = [...passes]\n .reverse()\n .find((pass) => pass.run.success)?.run;\n const executionSucceeded = successfulPass !== undefined;\n\n // The aggregator may finish after applying the synthesis but before its\n // requested git commit. Preserve those edits only after the same MemFS\n // policy check used for a normal landed commit. A failed continuation does\n // not invalidate work completed by an earlier successful pass.\n let recoveryError: string | undefined;\n if ((await landedCommits()) === 0 && executionSucceeded) {\n const status = await gitOutput(params.memoryDir, [\n \"status\",\n \"--porcelain\",\n \"--untracked-files=all\",\n ]).catch(() => \"\");\n if (status !== \"\") {\n const recoveryPolicyCheck = await validateMemfsChanges(\n params.memoryDir,\n baseRevision,\n params.memfsPolicy,\n { baselineDirectories: guard.baselineDirectories },\n );\n if (!recoveryPolicyCheck.valid) {\n recoveryError =\n `MemFS write policy rejected ${recoveryPolicyCheck.violations.length} ` +\n `uncommitted aggregation change(s): ${recoveryPolicyCheck.violations\n .map((violation) => `${violation.path} (${violation.reason})`)\n .join(\"; \")}`;\n } else {\n try {\n await gitOutput(params.memoryDir, [\"add\", \"-A\"]);\n await gitOutput(params.memoryDir, [\n \"-c\",\n \"user.name=Dream Aggregator\",\n \"-c\",\n \"user.email=dream-aggregator@letta.com\",\n \"commit\",\n \"-m\",\n `feat(aggregation): recover ${withContent.length} reflection outputs`,\n ]);\n log(\n \"[aggregate] recovered and committed uncommitted synthesis edits\",\n );\n } catch (error) {\n recoveryError =\n error instanceof Error ? error.message : String(error);\n }\n }\n }\n }\n const gitLog = await gitOutput(params.memoryDir, [\n \"log\",\n \"--format=%h %s\",\n \"--reverse\",\n `${baseRevision}..HEAD`,\n ]).catch(() => \"\");\n const gitPatch = await gitOutput(params.memoryDir, [\n \"log\",\n \"-p\",\n \"--reverse\",\n \"--format=commit %h%n%s%n\",\n `${baseRevision}..HEAD`,\n ]).catch(() => \"\");\n await writeFile(join(aggregateDir, \"git-log.txt\"), `${gitLog}\\n`, \"utf-8\");\n await writeFile(join(aggregateDir, \"memfs.patch\"), `${gitPatch}\\n`, \"utf-8\");\n\n const commitCount = gitLog ? gitLog.split(\"\\n\").length : 0;\n const landed = commitCount > 0;\n const policyCheck = await validateMemfsChanges(\n params.memoryDir,\n baseRevision,\n params.memfsPolicy,\n { baselineDirectories: guard.baselineDirectories },\n );\n const policyError = policyCheck.valid\n ? undefined\n : `MemFS write policy rejected ${policyCheck.violations.length} change(s): ${policyCheck.violations\n .map((violation) => `${violation.path} (${violation.reason})`)\n .join(\"; \")}`;\n const outcome: DreamAggregationOutcome = {\n success:\n executionSucceeded && landed && policyCheck.valid && !recoveryError,\n report: run.report || successfulPass?.report || \"\",\n error:\n recoveryError ??\n (!executionSucceeded ? run.error : undefined) ??\n policyError ??\n (landed\n ? undefined\n : \"Aggregation ended without committing the reflection outputs\"),\n conversationId: run.conversationId ?? undefined,\n commitCount,\n };\n await writeFile(\n join(aggregateDir, \"report.json\"),\n JSON.stringify(\n {\n agentId: params.aggregatorAgentId,\n conversationId: outcome.conversationId,\n success: outcome.success,\n error: outcome.error,\n durationMs: passes.reduce(\n (total, pass) => total + pass.run.durationMs,\n 0,\n ),\n inputs: withContent.map((r) => `batch-${r.batchIndex}`),\n report: outcome.report,\n },\n null,\n 2,\n ),\n \"utf-8\",\n );\n if (outcome.success) {\n const outputDir = join(aggregateDir, \"output\");\n await snapshotMemoryTree(params.memoryDir, outputDir);\n await recreateMemfsDirectories(\n outputDir,\n params.memfsPolicy.declaredDirectories ?? [],\n );\n }\n log(\n `[aggregate] ${outcome.success ? \"done\" : `FAILED: ${outcome.error ?? \"unknown error\"}`} ` +\n `(${commitCount} commit(s) on target)`,\n );\n return outcome;\n}\n",
24
+ "// Give a batch reflection agent an isolated copy of the target memory\n// filesystem to edit: a local `git clone` at its current revision. The agent\n// reconciles its batch's learnings against existing memory in place; the\n// aggregator later reads each batch's diff against the shared base revision\n// and synthesizes one edit onto the target. Clones are fully independent\n// repos, so any number of batches can run concurrently.\n\nimport { execFile } from \"node:child_process\";\nimport { rm } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function gitOutput(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim();\n}\n\n/**\n * Clone the memory filesystem into outputDir and return the base revision the\n * clone starts from (the revision batch diffs are taken against).\n */\nexport async function cloneMemoryTree(\n memoryDir: string,\n outputDir: string,\n): Promise<string> {\n await execFileAsync(\"git\", [\"clone\", \"--quiet\", memoryDir, outputDir]);\n // Commits are authored per the reflection prompt; the committer identity\n // just needs to exist inside the clone.\n await gitOutput(outputDir, [\"config\", \"user.name\", \"Dream Reflection\"]);\n await gitOutput(outputDir, [\"config\", \"user.email\", \"dream@letta.com\"]);\n return gitOutput(outputDir, [\"rev-parse\", \"HEAD\"]);\n}\n\n/** Commits past the base revision, and whether the tree has uncommitted edits. */\nexport async function inspectMemoryTree(\n memoryDir: string,\n baseRevision: string,\n): Promise<{ commitCount: number; dirty: boolean }> {\n try {\n const total = Number.parseInt(\n await gitOutput(memoryDir, [\"rev-list\", \"--count\", `${baseRevision}..HEAD`]),\n 10,\n );\n const dirty =\n (await gitOutput(memoryDir, [\"status\", \"--porcelain\"])) !== \"\";\n return {\n commitCount: Number.isFinite(total) ? Math.max(0, total) : 0,\n dirty,\n };\n } catch {\n return { commitCount: 0, dirty: false };\n }\n}\n\n/** Record an immutable checkout of the final memory tree with a run. */\nexport async function snapshotMemoryTree(\n memoryDir: string,\n outputDir: string,\n): Promise<void> {\n await rm(outputDir, { recursive: true, force: true });\n await execFileAsync(\n \"git\",\n [\"clone\", \"--quiet\", \"--no-hardlinks\", memoryDir, outputDir],\n );\n}\n",
25
+ "import { execFile } from \"node:child_process\";\nimport {\n chmod,\n copyFile,\n lstat,\n mkdir,\n readdir,\n readFile,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, posix, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nconst MAX_GIT_OUTPUT = 16 * 1024 * 1024;\nconst RESERVED_COMPONENTS = new Set([\".git\", \".letta\"]);\n\nexport interface MemfsStructure {\n /** UTF-8 file contents keyed by path relative to the MemFS root. */\n files?: Readonly<Record<string, string>>;\n /** Directories to materialize even when they contain no tracked files. */\n directories?: readonly string[];\n}\n\nexport interface ValidatedMemfsStructure {\n files: readonly { path: string; content: string }[];\n directories: readonly string[];\n}\n\nexport type MemfsOperation = \"create\" | \"modify\" | \"delete\";\n\nexport interface MemfsOperationRule {\n /** Exact relative path, or directory path when recursive is true. */\n path: string;\n recursive?: boolean;\n operations: readonly MemfsOperation[];\n}\n\n/**\n * Default policy semantics:\n * - paths in existingPaths may be modified (but not created or deleted);\n * - paths below allowedNewFilePrefixes may be created, modified, or deleted;\n * - everything else is denied.\n *\n * A matching allowedOperations rule overrides those defaults. This permits,\n * for example, an existing AGENTS.md to be modifiable but not deletable.\n */\nexport interface MemfsWritePolicy {\n existingPaths: readonly string[];\n allowedNewFilePrefixes?: readonly string[];\n allowedOperations?: readonly MemfsOperationRule[];\n /** Empty directories that must be recreated after a Git clone. */\n declaredDirectories?: readonly string[];\n}\n\ninterface NormalizedPolicy {\n existingPaths: readonly string[];\n allowedNewFilePrefixes: readonly string[];\n allowedOperations: readonly Required<MemfsOperationRule>[];\n declaredDirectories: readonly string[];\n}\n\nexport interface MemfsGuardInstallation {\n hooksDir: string;\n preCommitPath: string;\n postCommitPath: string;\n /** Directories present when the guard was installed, excluding .git. */\n baselineDirectories: readonly string[];\n}\n\nexport interface MemfsPolicyViolation {\n path: string;\n operation?: MemfsOperation;\n source: \"commit\" | \"working-tree\" | \"untracked\" | \"directory\";\n commit?: string;\n reason: string;\n}\n\nexport interface MemfsValidationResult {\n valid: boolean;\n violations: readonly MemfsPolicyViolation[];\n}\n\nfunction normalizeRelativePath(input: string, kind: \"file\" | \"directory\"): string {\n if (typeof input !== \"string\" || input.length === 0) {\n throw new Error(`MemFS ${kind} path must be a non-empty string`);\n }\n if (input.includes(\"\\0\") || /[\\x00-\\x1f\\x7f]/.test(input)) {\n throw new Error(`Invalid MemFS path ${JSON.stringify(input)}: control characters are not allowed`);\n }\n if (input.includes(\"\\\\\")) {\n throw new Error(`Invalid MemFS path ${JSON.stringify(input)}: use POSIX '/' separators`);\n }\n if (isAbsolute(input) || input.startsWith(\"/\")) {\n throw new Error(`Invalid MemFS path ${JSON.stringify(input)}: paths must be relative`);\n }\n\n const withoutTrailingSlash = kind === \"directory\" ? input.replace(/\\/+$/, \"\") : input;\n const parts = withoutTrailingSlash.split(\"/\");\n if (\n withoutTrailingSlash.length === 0 ||\n parts.some((part) => part === \"\" || part === \".\" || part === \"..\")\n ) {\n throw new Error(`Invalid MemFS path ${JSON.stringify(input)}: traversal and empty segments are not allowed`);\n }\n const reserved = parts.find((part) => RESERVED_COMPONENTS.has(part));\n if (reserved) {\n throw new Error(`Invalid MemFS path ${JSON.stringify(input)}: ${reserved} is reserved`);\n }\n\n const normalized = posix.normalize(withoutTrailingSlash);\n if (normalized !== withoutTrailingSlash) {\n throw new Error(`Invalid MemFS path ${JSON.stringify(input)}: path must already be normalized`);\n }\n return normalized;\n}\n\nfunction uniqueSorted(paths: readonly string[]): string[] {\n return [...new Set(paths)].sort((a, b) => a.localeCompare(b));\n}\n\nfunction parentPaths(path: string): string[] {\n const result: string[] = [];\n let current = posix.dirname(path);\n while (current !== \".\") {\n result.push(current);\n current = posix.dirname(current);\n }\n return result;\n}\n\nexport function validateMemfsStructure(\n structure: MemfsStructure,\n): ValidatedMemfsStructure {\n if (!structure || typeof structure !== \"object\") {\n throw new Error(\"MemFS structure must be an object\");\n }\n\n const files = Object.entries(structure.files ?? {}).map(([rawPath, content]) => {\n if (typeof content !== \"string\") {\n throw new Error(`MemFS file ${JSON.stringify(rawPath)} must contain a string`);\n }\n return { path: normalizeRelativePath(rawPath, \"file\"), content };\n });\n files.sort((a, b) => a.path.localeCompare(b.path));\n const directories = uniqueSorted(\n (structure.directories ?? []).map((path) =>\n normalizeRelativePath(path, \"directory\"),\n ),\n );\n\n const filePaths = new Set(files.map((file) => file.path));\n for (const directory of directories) {\n if (filePaths.has(directory)) {\n throw new Error(`MemFS path ${directory} cannot be both a file and a directory`);\n }\n }\n for (const file of files) {\n for (const parent of parentPaths(file.path)) {\n if (filePaths.has(parent)) {\n throw new Error(`MemFS file ${parent} conflicts with descendant ${file.path}`);\n }\n }\n }\n for (const directory of directories) {\n for (const parent of parentPaths(directory)) {\n if (filePaths.has(parent)) {\n throw new Error(`MemFS file ${parent} conflicts with directory ${directory}`);\n }\n }\n }\n\n return { files, directories };\n}\n\nexport function createMemfsWritePolicy(\n structure: MemfsStructure | ValidatedMemfsStructure,\n options: {\n allowedNewFilePrefixes?: readonly string[];\n allowedOperations?: readonly MemfsOperationRule[];\n } = {},\n): MemfsWritePolicy {\n const validated = Array.isArray((structure as ValidatedMemfsStructure).files)\n ? (structure as ValidatedMemfsStructure)\n : validateMemfsStructure(structure as MemfsStructure);\n return validateMemfsWritePolicy({\n existingPaths: validated.files.map((file) => file.path),\n declaredDirectories: validated.directories,\n allowedNewFilePrefixes: options.allowedNewFilePrefixes,\n allowedOperations: options.allowedOperations,\n });\n}\n\nexport function validateMemfsWritePolicy(\n policy: MemfsWritePolicy,\n): MemfsWritePolicy {\n const normalized = normalizePolicy(policy);\n return {\n existingPaths: normalized.existingPaths,\n allowedNewFilePrefixes: normalized.allowedNewFilePrefixes,\n allowedOperations: normalized.allowedOperations,\n declaredDirectories: normalized.declaredDirectories,\n };\n}\n\nfunction normalizePolicy(policy: MemfsWritePolicy): NormalizedPolicy {\n if (!policy || typeof policy !== \"object\") {\n throw new Error(\"MemFS write policy must be an object\");\n }\n const existingPaths = uniqueSorted(\n (policy.existingPaths ?? []).map((path) => normalizeRelativePath(path, \"file\")),\n );\n const allowedNewFilePrefixes = uniqueSorted(\n (policy.allowedNewFilePrefixes ?? []).map((path) =>\n normalizeRelativePath(path, \"directory\"),\n ),\n );\n const declaredDirectories = uniqueSorted(\n (policy.declaredDirectories ?? []).map((path) =>\n normalizeRelativePath(path, \"directory\"),\n ),\n );\n const allowedOperations = (policy.allowedOperations ?? []).map((rule) => {\n if (!rule || typeof rule !== \"object\") {\n throw new Error(\"MemFS operation rule must be an object\");\n }\n const operations = [...new Set(rule.operations ?? [])];\n if (\n operations.length === 0 ||\n operations.some(\n (operation) =>\n operation !== \"create\" && operation !== \"modify\" && operation !== \"delete\",\n )\n ) {\n throw new Error(`Invalid MemFS operations for ${JSON.stringify(rule.path)}`);\n }\n return {\n path: normalizeRelativePath(rule.path, rule.recursive ? \"directory\" : \"file\"),\n recursive: rule.recursive ?? false,\n operations,\n } satisfies Required<MemfsOperationRule>;\n });\n allowedOperations.sort(\n (a, b) =>\n b.path.length - a.path.length ||\n Number(a.recursive) - Number(b.recursive) ||\n a.path.localeCompare(b.path),\n );\n return {\n existingPaths,\n allowedNewFilePrefixes,\n allowedOperations,\n declaredDirectories,\n };\n}\n\nasync function assertNoSymlinkTraversal(root: string, relativePath: string): Promise<void> {\n let current = root;\n for (const component of relativePath.split(\"/\")) {\n current = join(current, component);\n const info = await lstat(current).catch(() => null);\n if (info?.isSymbolicLink()) {\n throw new Error(`Refusing to materialize MemFS path through symlink: ${relativePath}`);\n }\n }\n}\n\nexport async function recreateMemfsDirectories(\n memoryDir: string,\n directories: readonly string[],\n): Promise<readonly string[]> {\n const normalized = uniqueSorted(\n directories.map((path) => normalizeRelativePath(path, \"directory\")),\n ).sort((a, b) => a.split(\"/\").length - b.split(\"/\").length || a.localeCompare(b));\n for (const directory of normalized) {\n await assertNoSymlinkTraversal(memoryDir, directory);\n const destination = join(memoryDir, ...directory.split(\"/\"));\n const info = await lstat(destination).catch(() => null);\n if (info && !info.isDirectory()) {\n throw new Error(`Cannot materialize MemFS directory ${directory}: a file already exists there`);\n }\n await mkdir(destination, { recursive: true });\n }\n return normalized;\n}\n\nexport async function materializeMemfsStructure(\n memoryDir: string,\n structure: MemfsStructure,\n): Promise<ValidatedMemfsStructure> {\n const validated = validateMemfsStructure(structure);\n await mkdir(memoryDir, { recursive: true });\n await recreateMemfsDirectories(memoryDir, validated.directories);\n for (const file of validated.files) {\n await assertNoSymlinkTraversal(memoryDir, file.path);\n const destination = join(memoryDir, ...file.path.split(\"/\"));\n const info = await lstat(destination).catch(() => null);\n if (info?.isDirectory()) {\n throw new Error(`Cannot materialize MemFS file ${file.path}: a directory already exists there`);\n }\n await mkdir(dirname(destination), { recursive: true });\n await writeFile(destination, file.content, \"utf-8\");\n }\n return validated;\n}\n\nasync function gitRaw(cwd: string, args: readonly string[]): Promise<string> {\n const { stdout } = await execFileAsync(\"git\", [...args], {\n cwd,\n encoding: \"utf-8\",\n maxBuffer: MAX_GIT_OUTPUT,\n });\n return stdout;\n}\n\nasync function gitCommonDir(memoryDir: string): Promise<string> {\n const raw = (await gitRaw(memoryDir, [\"rev-parse\", \"--git-common-dir\"])).trim();\n return isAbsolute(raw) ? raw : resolve(memoryDir, raw);\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction operationCase(operations: readonly MemfsOperation[]): string {\n return operations.map(shellQuote).join(\"|\");\n}\n\nfunction buildPolicyShell(policy: NormalizedPolicy): string {\n const rules = policy.allowedOperations\n .map((rule) => {\n const allowed = operationCase(rule.operations);\n if (rule.recursive) {\n return ` case \"$path\" in\\n ${shellQuote(`${rule.path}/`)}*)\\n case \"$operation\" in ${allowed}) return 0 ;; *) return 1 ;; esac\\n ;;\\n esac`;\n }\n return ` if [ \"$path\" = ${shellQuote(rule.path)} ]; then\\n case \"$operation\" in ${allowed}) return 0 ;; *) return 1 ;; esac\\n fi`;\n })\n .join(\"\\n\");\n const existing = policy.existingPaths.length\n ? ` case \"$path\" in\\n ${policy.existingPaths.map(shellQuote).join(\"|\")})\\n case \"$operation\" in 'modify') return 0 ;; *) return 1 ;; esac\\n ;;\\n esac`\n : \"\";\n const prefixes = policy.allowedNewFilePrefixes\n .map(\n (prefix) =>\n ` case \"$path\" in ${shellQuote(`${prefix}/`)}*) return 0 ;; esac`,\n )\n .join(\"\\n\");\n return [rules, prefixes, existing].filter(Boolean).join(\"\\n\");\n}\n\nfunction buildDirectoryShell(\n policy: NormalizedPolicy,\n baselineDirectories: readonly string[],\n): string {\n const ancestors = [\n ...policy.existingPaths.flatMap(parentPaths),\n ...policy.declaredDirectories,\n ...policy.declaredDirectories.flatMap(parentPaths),\n ...policy.allowedNewFilePrefixes,\n ...policy.allowedNewFilePrefixes.flatMap(parentPaths),\n ...baselineDirectories,\n ];\n const exact = uniqueSorted(ancestors);\n const exactCase = exact.length\n ? ` ${exact.map(shellQuote).join(\"|\")}) return 0 ;;`\n : \"\";\n const prefixCases = policy.allowedNewFilePrefixes\n .map((prefix) => ` ${shellQuote(`${prefix}/`)}*) return 0 ;;`)\n .join(\"\\n\");\n return [exactCase, prefixCases].filter(Boolean).join(\"\\n\");\n}\n\nfunction buildPreCommitHook(\n policy: NormalizedPolicy,\n baselineDirectories: readonly string[],\n nativePreCommitPath: string,\n): string {\n return `#!/usr/bin/env bash\nset -u\n\nviolations=0\n\noperation_for_status() {\n case \"$1\" in\n A) printf '%s' create ;;\n M) printf '%s' modify ;;\n D) printf '%s' delete ;;\n *) return 1 ;;\n esac\n}\n\npath_allowed() {\n operation=\"$1\"\n path=\"$2\"\n case \"$path\" in\n .git|.git/*|.letta|.letta/*) return 1 ;;\n esac\n${buildPolicyShell(policy)}\n return 1\n}\n\nreport_change() {\n status=\"$1\"\n path=\"$2\"\n source=\"$3\"\n operation=$(operation_for_status \"$status\") || {\n printf 'MemFS guard: %s has unsupported git status %s (%s)\\n' \"$path\" \"$status\" \"$source\" >&2\n violations=1\n return\n }\n if ! path_allowed \"$operation\" \"$path\"; then\n printf 'MemFS guard: %s of %s is not allowed (%s)\\n' \"$operation\" \"$path\" \"$source\" >&2\n violations=1\n fi\n}\n\nreport_index_mode() {\n status=\"$1\"\n path=\"$2\"\n [ \"$status\" = D ] && return\n mode=$(git ls-files --stage -- \"$path\" | head -n 1 | cut -d' ' -f1)\n case \"$mode\" in\n 100644|100755) ;;\n *)\n printf 'MemFS guard: %s has disallowed staged mode %s (symlinks and submodules are not allowed)\\n' \"$path\" \"\\${mode:-missing}\" >&2\n violations=1\n ;;\n esac\n}\n\nwhile IFS= read -r -d '' status && IFS= read -r -d '' path; do\n report_change \"$status\" \"$path\" staged\n report_index_mode \"$status\" \"$path\"\ndone < <(git diff --cached --name-status -z --no-renames)\n\nwhile IFS= read -r -d '' status && IFS= read -r -d '' path; do\n report_change \"$status\" \"$path\" unstaged\n if [ \"$status\" != D ] && { [ -L \"$path\" ] || [ ! -f \"$path\" ]; }; then\n printf 'MemFS guard: %s is not a regular file\\n' \"$path\" >&2\n violations=1\n fi\ndone < <(git diff --name-status -z --no-renames)\n\nwhile IFS= read -r -d '' path; do\n report_change A \"$path\" untracked\n if [ -L \"$path\" ] || [ ! -f \"$path\" ]; then\n printf 'MemFS guard: %s is not a regular file\\n' \"$path\" >&2\n violations=1\n fi\ndone < <(git ls-files --others --exclude-standard -z)\n\ndirectory_allowed() {\n path=\"$1\"\n case \"$path\" in\n${buildDirectoryShell(policy, baselineDirectories)}\n esac\n return 1\n}\n\nwhile IFS= read -r -d '' directory; do\n path=\"\\${directory#./}\"\n [ \"$path\" = . ] && continue\n case \"$path\" in .git|.git/*) continue ;; esac\n if ! directory_allowed \"$path\"; then\n printf 'MemFS guard: directory %s is outside the allowed structure\\n' \"$path\" >&2\n violations=1\n fi\ndone < <(find . -path ./.git -prune -o -type d -print0)\n\nif [ \"$violations\" -ne 0 ]; then\n exit 1\nfi\n\nnative_pre_commit=${shellQuote(nativePreCommitPath)}\nif [ -x \"$native_pre_commit\" ]; then\n exec \"$native_pre_commit\" \"$@\"\nfi\nexit 0\n`;\n}\n\nfunction buildPostCommitHook(nativePostCommitPath: string): string {\n return `#!/usr/bin/env bash\nnative_post_commit=${shellQuote(nativePostCommitPath)}\nif [ -x \"$native_post_commit\" ]; then\n exec \"$native_post_commit\" \"$@\"\nfi\nexit 0\n`;\n}\n\nasync function listWorktreeDirectories(memoryDir: string): Promise<string[]> {\n const result: string[] = [];\n async function visit(absolute: string, relative: string): Promise<void> {\n for (const entry of await readdir(absolute, { withFileTypes: true })) {\n if (relative === \"\" && entry.name === \".git\") continue;\n if (!entry.isDirectory()) continue;\n const childRelative = relative ? `${relative}/${entry.name}` : entry.name;\n result.push(childRelative);\n await visit(join(absolute, entry.name), childRelative);\n }\n }\n await visit(memoryDir, \"\");\n return uniqueSorted(result);\n}\n\nexport async function installMemfsGuard(\n memoryDir: string,\n policy: MemfsWritePolicy,\n): Promise<MemfsGuardInstallation> {\n const normalized = normalizePolicy(policy);\n const commonDir = await gitCommonDir(memoryDir);\n const nativeHooksDir = join(commonDir, \"hooks\");\n const hooksDir = join(commonDir, \"dream-hooks\");\n const preCommitPath = join(hooksDir, \"pre-commit\");\n const postCommitPath = join(hooksDir, \"post-commit\");\n const baselineDirectories = await listWorktreeDirectories(memoryDir);\n\n await mkdir(hooksDir, { recursive: true });\n await writeFile(\n preCommitPath,\n buildPreCommitHook(\n normalized,\n baselineDirectories,\n join(nativeHooksDir, \"pre-commit\"),\n ),\n \"utf-8\",\n );\n await writeFile(\n postCommitPath,\n buildPostCommitHook(join(nativeHooksDir, \"post-commit\")),\n \"utf-8\",\n );\n await chmod(preCommitPath, 0o755);\n await chmod(postCommitPath, 0o755);\n await gitRaw(memoryDir, [\"config\", \"--local\", \"core.hooksPath\", hooksDir]);\n return {\n hooksDir,\n preCommitPath,\n postCommitPath,\n baselineDirectories,\n };\n}\n\nasync function copyNativeHook(\n sourceMemoryDir: string,\n cloneMemoryDir: string,\n name: \"pre-commit\" | \"post-commit\",\n): Promise<void> {\n const source = join(await gitCommonDir(sourceMemoryDir), \"hooks\", name);\n const destination = join(await gitCommonDir(cloneMemoryDir), \"hooks\", name);\n const sourceInfo = await stat(source).catch(() => null);\n if (!sourceInfo?.isFile()) return;\n await mkdir(dirname(destination), { recursive: true });\n await copyFile(source, destination);\n await chmod(destination, 0o755);\n}\n\n/** Configure a freshly cloned MemFS repo, whose hooks and local config Git did not copy. */\nexport async function configureMemfsCloneGuard(\n sourceMemoryDir: string,\n cloneMemoryDir: string,\n policy: MemfsWritePolicy,\n): Promise<MemfsGuardInstallation> {\n const normalized = normalizePolicy(policy);\n await recreateMemfsDirectories(cloneMemoryDir, normalized.declaredDirectories);\n await copyNativeHook(sourceMemoryDir, cloneMemoryDir, \"pre-commit\");\n await copyNativeHook(sourceMemoryDir, cloneMemoryDir, \"post-commit\");\n return installMemfsGuard(cloneMemoryDir, normalized);\n}\n\nfunction pathOperationAllowed(\n path: string,\n operation: MemfsOperation,\n policy: NormalizedPolicy,\n): boolean {\n let normalizedPath: string;\n try {\n normalizedPath = normalizeRelativePath(path, \"file\");\n } catch {\n return false;\n }\n for (const rule of policy.allowedOperations) {\n const matches = rule.recursive\n ? normalizedPath.startsWith(`${rule.path}/`)\n : normalizedPath === rule.path;\n if (matches) return rule.operations.includes(operation);\n }\n if (\n policy.allowedNewFilePrefixes.some((prefix) =>\n normalizedPath.startsWith(`${prefix}/`),\n )\n ) {\n return true;\n }\n if (policy.existingPaths.includes(normalizedPath)) {\n return operation === \"modify\";\n }\n return false;\n}\n\nfunction parseNameStatus(raw: string): { status: string; path: string }[] {\n const fields = raw.split(\"\\0\");\n if (fields.at(-1) === \"\") fields.pop();\n const result: { status: string; path: string }[] = [];\n for (let index = 0; index < fields.length; index += 2) {\n const status = fields[index];\n const path = fields[index + 1];\n if (status !== undefined && path !== undefined) result.push({ status, path });\n }\n return result;\n}\n\nfunction operationFromStatus(status: string): MemfsOperation | null {\n if (status === \"A\") return \"create\";\n if (status === \"M\") return \"modify\";\n if (status === \"D\") return \"delete\";\n return null;\n}\n\nasync function committedMode(\n memoryDir: string,\n revision: string,\n path: string,\n): Promise<string | null> {\n const raw = await gitRaw(memoryDir, [\"ls-tree\", \"-z\", revision, \"--\", path]);\n return raw.match(/^(\\d+) /)?.[1] ?? null;\n}\n\nasync function validateChangeSet(\n memoryDir: string,\n entries: readonly { status: string; path: string }[],\n policy: NormalizedPolicy,\n source: MemfsPolicyViolation[\"source\"],\n violations: MemfsPolicyViolation[],\n options: { revision?: string; commit?: string } = {},\n): Promise<void> {\n for (const entry of entries) {\n const operation = operationFromStatus(entry.status);\n if (!operation || !pathOperationAllowed(entry.path, operation, policy)) {\n violations.push({\n path: entry.path,\n ...(operation ? { operation } : {}),\n source,\n ...(options.commit ? { commit: options.commit } : {}),\n reason: operation\n ? `${operation} is outside the MemFS write policy`\n : `unsupported git status ${entry.status}`,\n });\n continue;\n }\n if (operation === \"delete\") continue;\n\n let regular = false;\n if (options.revision) {\n const mode = await committedMode(memoryDir, options.revision, entry.path);\n regular = mode === \"100644\" || mode === \"100755\";\n } else {\n const info = await lstat(join(memoryDir, ...entry.path.split(\"/\"))).catch(\n () => null,\n );\n regular = info?.isFile() === true && !info.isSymbolicLink();\n }\n if (!regular) {\n violations.push({\n path: entry.path,\n operation,\n source,\n ...(options.commit ? { commit: options.commit } : {}),\n reason: \"only regular files are allowed (no symlinks or submodules)\",\n });\n }\n }\n}\n\nfunction allowedDirectorySet(\n policy: NormalizedPolicy,\n baselineDirectories: readonly string[],\n): Set<string> {\n return new Set([\n ...baselineDirectories,\n ...policy.existingPaths.flatMap(parentPaths),\n ...policy.declaredDirectories,\n ...policy.declaredDirectories.flatMap(parentPaths),\n ...policy.allowedNewFilePrefixes,\n ...policy.allowedNewFilePrefixes.flatMap(parentPaths),\n ]);\n}\n\n/**\n * Defense-in-depth validation after an agent run. Every commit is inspected,\n * so an illegal add followed by a delete cannot disappear in an endpoint diff.\n */\nexport async function validateMemfsChanges(\n memoryDir: string,\n baseRevision: string,\n policy: MemfsWritePolicy,\n options: { baselineDirectories?: readonly string[] } = {},\n): Promise<MemfsValidationResult> {\n const normalized = normalizePolicy(policy);\n const violations: MemfsPolicyViolation[] = [];\n const commits = (await gitRaw(memoryDir, [\"rev-list\", \"--reverse\", `${baseRevision}..HEAD`]))\n .trim()\n .split(\"\\n\")\n .filter(Boolean);\n\n for (const commit of commits) {\n const parent = (await gitRaw(memoryDir, [\"rev-parse\", `${commit}^1`])).trim();\n const entries = parseNameStatus(\n await gitRaw(memoryDir, [\n \"diff\",\n \"--name-status\",\n \"-z\",\n \"--no-renames\",\n parent,\n commit,\n ]),\n );\n await validateChangeSet(memoryDir, entries, normalized, \"commit\", violations, {\n revision: commit,\n commit,\n });\n }\n\n const workingEntries = parseNameStatus(\n await gitRaw(memoryDir, [\n \"diff\",\n \"--name-status\",\n \"-z\",\n \"--no-renames\",\n \"HEAD\",\n ]),\n );\n await validateChangeSet(\n memoryDir,\n workingEntries,\n normalized,\n \"working-tree\",\n violations,\n );\n\n const untracked = (await gitRaw(memoryDir, [\n \"ls-files\",\n \"--others\",\n \"--exclude-standard\",\n \"-z\",\n ]))\n .split(\"\\0\")\n .filter(Boolean)\n .map((path) => ({ status: \"A\", path }));\n await validateChangeSet(\n memoryDir,\n untracked,\n normalized,\n \"untracked\",\n violations,\n );\n\n const baselineDirectories = options.baselineDirectories ?? [\".letta\"];\n const allowedDirectories = allowedDirectorySet(normalized, baselineDirectories);\n for (const directory of await listWorktreeDirectories(memoryDir)) {\n if (\n allowedDirectories.has(directory) ||\n normalized.allowedNewFilePrefixes.some((prefix) =>\n directory.startsWith(`${prefix}/`),\n )\n ) {\n continue;\n }\n violations.push({\n path: directory,\n source: \"directory\",\n reason: \"directory is outside the MemFS write policy\",\n });\n }\n\n return { valid: violations.length === 0, violations };\n}\n\n/** Read a materialized file in tests/callers without exposing path traversal. */\nexport async function readMemfsFile(memoryDir: string, path: string): Promise<string> {\n const normalized = normalizeRelativePath(path, \"file\");\n return readFile(join(memoryDir, ...normalized.split(\"/\")), \"utf-8\");\n}\n",
26
+ "// Prompt loading + templating for the dream pipeline's agents. The reflector\n// carries the reflection system prompt; every batch runs as a session on it\n// with a path-bearing user prompt. The aggregator carries the default system\n// prompt with AGGREGATOR_PERSONA as its persona block. Keep prompt TEXT in\n// prompts/*.md — the .md files are the editing surface; this module only\n// interpolates {{vars}}. render() throws on unresolved {{vars}} so a renamed\n// placeholder fails at run start instead of leaking into a prompt.\n\nimport aggregatorContinueMd from \"./prompts/aggregator-continue.md\";\nimport aggregatorPersonaMd from \"./prompts/aggregator-persona.md\";\nimport aggregatorUserMd from \"./prompts/aggregator-user.md\";\nimport memoryRoutingContractMd from \"./prompts/memory-routing-contract.md\";\nimport reflectionContinueMd from \"./prompts/reflection-continue.md\";\nimport reflectionSystemMd from \"./prompts/reflection-system.md\";\nimport reflectionUserMd from \"./prompts/reflection-user.md\";\n\nexport const MEMORY_ROUTING_CONTRACT: string = memoryRoutingContractMd.trim();\nexport const REFLECTION_SYSTEM_PROMPT: string = render(reflectionSystemMd, {\n memoryRoutingContract: MEMORY_ROUTING_CONTRACT,\n});\nexport const AGGREGATOR_PERSONA: string = render(aggregatorPersonaMd, {\n memoryRoutingContract: MEMORY_ROUTING_CONTRACT,\n});\nexport const AGGREGATOR_CONTINUE_PROMPT: string = aggregatorContinueMd.trim();\n\nfunction render(\n template: string,\n vars: Record<string, string | number>,\n): string {\n return template\n .replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => {\n const value = vars[key];\n if (value === undefined) {\n throw new Error(`prompt template: missing variable ${match}`);\n }\n return String(value);\n })\n .trim();\n}\n\nfunction instructionSection(instruction: string | undefined): string {\n return instruction?.trim()\n ? `\\n\\nAdditional user-provided instruction for this pass:\\n${instruction.trim()}`\n : \"\";\n}\n\nexport function buildReflectionUserPrompt(input: {\n batchIndex: number;\n inputDir: string;\n sessionFileNames: string[];\n memoryDir: string;\n timeRange: { start: string; end: string };\n instruction?: string;\n}): string {\n return render(reflectionUserMd, {\n batchIndex: input.batchIndex,\n sessionCount: input.sessionFileNames.length,\n startTime: input.timeRange.start,\n endTime: input.timeRange.end,\n inputDir: input.inputDir,\n sessionList: input.sessionFileNames.map((name) => `- ${name}`).join(\"\\n\"),\n memoryDir: input.memoryDir,\n instructionSection: instructionSection(input.instruction),\n });\n}\n\nexport function buildReflectionContinuePrompt(input: {\n memoryDir: string;\n}): string {\n return render(reflectionContinueMd, { memoryDir: input.memoryDir });\n}\n\nexport function buildAggregatorUserPrompt(input: {\n batchesDir: string;\n batchCount: number;\n memoryDir: string;\n /** Additional caller instruction for the aggregation pass. */\n instruction?: string;\n}): string {\n return render(aggregatorUserMd, {\n count: input.batchCount,\n batchesDir: input.batchesDir,\n memoryDir: input.memoryDir,\n instructionSection: instructionSection(input.instruction),\n });\n}\n",
27
+ "// Thin wrapper around the SDK client: run one prompt to completion in an\n// unrestricted session on an existing agent, capturing the full trajectory\n// (every SDKMessage the stream emits).\n//\n// Sessions are scoped to their workspace by cwd and prompt; there is no OS\n// sandbox on this path.\n\nimport type { LettaAgentClient } from \"../client.js\";\nimport type { SDKMessage, SkillSource } from \"../types.js\";\n\nexport interface RunAgentOptions {\n agentId: string;\n userPrompt: string;\n cwd: string;\n /** Progress label for logging. */\n label: string;\n /** Continue this existing conversation instead of starting a new one. */\n resumeConversationId?: string;\n /** Extra env for the session's harness process (see session options). */\n env?: Record<string, string>;\n /** Restrict Letta Code skills for this runtime. [] disables every source. */\n skillSources?: SkillSource[];\n /** Abort: closes the session and returns a failed result promptly. */\n signal?: AbortSignal;\n onProgress?: (line: string) => void;\n}\n\nexport interface RunAgentResult {\n agentId: string;\n conversationId: string | null;\n success: boolean;\n error?: string;\n /** Final assistant report (result.result when present, else last assistant message). */\n report: string;\n durationMs: number;\n messages: SDKMessage[];\n}\n\nexport async function runAgentToCompletion(\n client: LettaAgentClient,\n options: RunAgentOptions,\n): Promise<RunAgentResult> {\n const started = Date.now();\n const log = options.onProgress ?? (() => {});\n\n if (options.signal?.aborted) {\n return {\n agentId: options.agentId,\n conversationId: null,\n success: false,\n error: \"aborted before start\",\n report: \"\",\n durationMs: 0,\n messages: [],\n };\n }\n\n const sessionOptions = {\n permissionMode: \"unrestricted\" as const,\n cwd: options.cwd,\n dreaming: { trigger: \"off\" as const },\n ...(options.env ? { env: options.env } : {}),\n ...(options.skillSources !== undefined\n ? { skillSources: options.skillSources }\n : {}),\n };\n const session = options.resumeConversationId\n ? client.resumeSession(options.resumeConversationId, sessionOptions)\n : client.createSession(options.agentId, sessionOptions);\n\n const messages: SDKMessage[] = [];\n let success = false;\n let error: string | undefined;\n let report = \"\";\n let lastAssistant = \"\";\n\n // Abort mid-turn by closing the session: the stream ends and the normal\n // failure handling below reports the run as unsuccessful.\n const onAbort = () => {\n log(`[${options.label}] aborted; closing session`);\n session.close();\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n await session.send(options.userPrompt);\n for await (const msg of session.stream()) {\n messages.push(msg as SDKMessage);\n if (msg.type === \"assistant\") {\n lastAssistant = msg.content;\n } else if (msg.type === \"tool_call\") {\n log(`[${options.label}] tool: ${msg.toolName}`);\n } else if (msg.type === \"error\") {\n error = msg.message;\n } else if (msg.type === \"result\") {\n success = msg.success;\n report = msg.result ?? lastAssistant;\n if (!msg.success) error = error ?? msg.errorDetail ?? msg.error;\n break;\n }\n }\n } catch (err) {\n error = err instanceof Error ? err.message : String(err);\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n session.close();\n }\n if (options.signal?.aborted) {\n success = false;\n error = error ?? \"aborted\";\n }\n\n return {\n agentId: options.agentId,\n conversationId: session.conversationId,\n success,\n error,\n report: report || lastAssistant,\n durationMs: Date.now() - started,\n messages,\n };\n}\n",
28
+ "// Shared assembly for the normalized-v1 transcript format: pseudo-rows (one\n// per content block, produced by the per-harness parsers) are normalized into\n// v1 records with noise filtering, tool-call linking, truncation, timestamp\n// interpolation/synthesis, and structural validation.\n//\n// This is a faithful TypeScript port of `extract_transcripts.py` (itself\n// ported from `envs/memory_synth_gen/swe_chat/normalize.py` in\n// letta-ai/letta-train).\n\nimport type { NormalizedRecord } from \"./types.js\";\n\n// Caps from the letta-train normalizer: args pass through essentially whole\n// (pathological-payload guard); results are the bulky, truncatable part.\nexport const TOOL_INPUT_MAX_CHARS = 20_000;\nexport const TOOL_RESULT_MAX_CHARS = 2_500;\nconst ARGS_LEAF_FLOOR = 2_000;\n\n// Harness-noise classes: slash-command echoes and background-task pings are\n// dropped; all other harness-injected context is kept verbatim.\nconst INJECTED_NOISE_PREFIXES = [\n \"<local-command-caveat>\",\n \"<command-name>\",\n \"<command-message>\",\n \"<local-command-stdout>\",\n \"<local-command-stderr>\",\n \"<task-notification\",\n];\n\n// Codex system-prompt-class blocks injected as user-role response items —\n// dropped like the agent's own system prompt, not kept as user context.\nexport const CODEX_INJECTED_PREFIXES = [\n \"<environment_context>\",\n \"<user_instructions>\",\n \"<permissions instructions>\",\n \"<turn_context>\",\n];\n\nconst SYNTH_BASE_MS = Date.UTC(2026, 0, 1);\nconst SYNTH_STEP_SECONDS = 15;\n\nconst TS_RE =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})$/;\n\nfunction truncationMarker(n: number): string {\n return `\\n… [truncated, ${n} more chars]`;\n}\n\nexport function truncateText(text: string, limit: number): string {\n if (text.length <= limit) return text;\n return text.slice(0, limit) + truncationMarker(text.length - limit);\n}\n\nfunction iso(date: Date): string {\n return date.toISOString(); // YYYY-MM-DDTHH:MM:SS.mmmZ, matching _iso()\n}\n\n/**\n * Timestamp from the raw formats: ISO string or epoch millis. Suffix-less\n * (naive) timestamps are treated as UTC so ordering is stable.\n */\nexport function parseTimestamp(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === \"number\" && value > 1e11) {\n return new Date(value); // epoch millis\n }\n if (typeof value === \"string\" && value) {\n const withZone = /(Z|[+-]\\d{2}:?\\d{2})$/.test(value) ? value : `${value}Z`;\n const date = new Date(withZone);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\n/**\n * ISO timestamps for n records: real where present, interpolated in gaps,\n * synthesized monotonically when the source recorded none.\n */\nexport function fillTimestamps(\n n: number,\n anchors: Map<number, Date>,\n createdAt: Date | null,\n durationSeconds: number | null,\n): string[] {\n if (n === 0) return [];\n if (anchors.size === 0) {\n const baseMs = (createdAt ?? new Date(SYNTH_BASE_MS)).getTime();\n let step = SYNTH_STEP_SECONDS;\n if (durationSeconds && n > 1) step = durationSeconds / (n - 1);\n return Array.from({ length: n }, (_, i) =>\n iso(new Date(baseMs + step * 1000 * i)),\n );\n }\n\n const out: string[] = new Array(n).fill(\"\");\n const idxs = [...anchors.keys()].sort((a, b) => a - b);\n const first = idxs[0] ?? 0;\n const last = idxs[idxs.length - 1] ?? 0;\n const anchorMs = (i: number): number => anchors.get(i)?.getTime() ?? 0;\n\n for (let i = 0; i < first; i++) {\n out[i] = iso(new Date(anchorMs(first) - (first - i) * 1000));\n }\n for (let k = 0; k + 1 < idxs.length; k++) {\n const a = idxs[k] ?? 0;\n const b = idxs[k + 1] ?? 0;\n out[a] = iso(new Date(anchorMs(a)));\n const spanMs = anchorMs(b) - anchorMs(a);\n const gap = b - a;\n for (let i = a + 1; i < b; i++) {\n out[i] = iso(new Date(anchorMs(a) + (spanMs * (i - a)) / gap));\n }\n }\n out[last] = iso(new Date(anchorMs(last)));\n for (let i = last + 1; i < n; i++) {\n out[i] = iso(new Date(anchorMs(last) + (i - last) * 1000));\n }\n return out;\n}\n\ntype LeafParent = Record<string, unknown> | unknown[];\n\n/**\n * Return the args string (and whether it was reshaped). Byte-verbatim when\n * under the cap and already a JSON object; otherwise reshaped to a valid JSON\n * object, trimming the longest string values until the serialization fits.\n */\nexport function shrinkArgs(rawInput: string): {\n args: string;\n shrunk: boolean;\n} {\n const raw = rawInput || \"{}\";\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n parsed = null;\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {\n args: JSON.stringify({ _raw: truncateText(raw, TOOL_INPUT_MAX_CHARS) }),\n shrunk: true,\n };\n }\n if (raw.length <= TOOL_INPUT_MAX_CHARS) return { args: raw, shrunk: false };\n\n const leaves: { node: LeafParent; key: string | number }[] = [];\n const collect = (node: unknown): void => {\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) {\n const val = node[i];\n if (typeof val === \"string\") leaves.push({ node, key: i });\n else if (val && typeof val === \"object\") collect(val);\n }\n } else if (node && typeof node === \"object\") {\n const obj = node as Record<string, unknown>;\n for (const [key, val] of Object.entries(obj)) {\n if (typeof val === \"string\") leaves.push({ node: obj, key });\n else if (val && typeof val === \"object\") collect(val);\n }\n }\n };\n collect(parsed);\n\n const leafValue = (leaf: {\n node: LeafParent;\n key: string | number;\n }): string =>\n (leaf.node as Record<string | number, unknown>)[leaf.key] as string;\n\n let dumped = JSON.stringify(parsed);\n while (dumped.length > TOOL_INPUT_MAX_CHARS && leaves.length > 0) {\n let best = leaves[0];\n if (!best) break;\n for (const leaf of leaves) {\n if (leafValue(leaf).length > leafValue(best).length) best = leaf;\n }\n const val = leafValue(best);\n if (val.length <= ARGS_LEAF_FLOOR) break;\n const keep = Math.max(ARGS_LEAF_FLOOR, Math.floor(val.length / 2));\n (best.node as Record<string | number, unknown>)[best.key] =\n val.slice(0, keep) + truncationMarker(val.length - keep);\n dumped = JSON.stringify(parsed);\n }\n return { args: dumped, shrunk: true };\n}\n\n/**\n * Flatten a content field (string | block list) into text; image blocks\n * render as a placeholder.\n */\nexport function blocksText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n const out: string[] = [];\n for (const block of content) {\n if (!block || typeof block !== \"object\" || Array.isArray(block)) continue;\n const b = block as { type?: string | null; text?: string | null };\n if (\n b.type === \"text\" ||\n b.type === \"input_text\" ||\n b.type === \"output_text\" ||\n (b.type == null && \"text\" in b)\n ) {\n out.push(b.text ?? \"\");\n } else if (b.type === \"image\") {\n out.push(\"[image]\");\n }\n }\n return out.filter((x) => x).join(\"\\n\");\n}\n\n/** One raw content block, as emitted by a per-harness parser. */\nexport interface PseudoRow {\n role: \"user\" | \"assistant\" | \"tool_use\" | \"tool_result\";\n turnType:\n | \"user_prompt\"\n | \"system_injected\"\n | \"assistant_thinking\"\n | \"assistant_response\"\n | \"tool_use\"\n | \"tool_result\";\n content?: string;\n timestamp?: Date | null;\n toolName?: string;\n toolCallId?: string;\n toolInputJson?: string;\n model?: string;\n}\n\n/** Session-level context mined from the raw store during parsing. */\nexport interface SessionContext {\n source: string;\n cwd?: string;\n gitBranch?: string;\n model?: string;\n createdAt?: Date | null;\n durationSeconds?: number | null;\n}\n\nexport type NormalizeRowsResult =\n | { status: \"ok\"; records: NormalizedRecord[] }\n | { status: string; records?: undefined };\n\n/**\n * Normalize ordered pseudo-rows into v1 records. Returns `{status: \"ok\",\n * records}` or a `skipped:…` / `invalid:…` status with no output records.\n */\nexport function normalizeSessionRows(\n rows: PseudoRow[],\n context: SessionContext,\n): NormalizeRowsResult {\n const body: NormalizedRecord[] = [];\n const anchors = new Map<number, Date>();\n const openCalls = new Map<string, { finalId: string; consumed: boolean }[]>();\n const usedIds = new Set<string>();\n const models = new Map<string, number>();\n let n = 0; // running row index for synthetic call ids\n\n for (const row of rows) {\n n += 1;\n if (row.model) models.set(row.model, (models.get(row.model) ?? 0) + 1);\n const content = row.content ?? \"\";\n let record: NormalizedRecord;\n\n if (\n row.role === \"user\" &&\n (row.turnType === \"user_prompt\" || row.turnType === \"system_injected\")\n ) {\n const head = content.trimStart();\n if (!head) continue; // blank row\n if (INJECTED_NOISE_PREFIXES.some((prefix) => head.startsWith(prefix))) {\n continue; // harness noise\n }\n record = { role: \"user\", content };\n } else if (\n row.role === \"assistant\" &&\n row.turnType === \"assistant_thinking\"\n ) {\n if (!content.trim()) continue;\n record = { role: \"reasoning\", content };\n } else if (row.role === \"assistant\") {\n if (!content.trim()) continue;\n record = { role: \"assistant\", content };\n } else if (row.role === \"tool_use\") {\n const sourceId = row.toolCallId || `call_${n}`;\n let finalId = sourceId;\n if (usedIds.has(finalId)) {\n let k = 2;\n while (usedIds.has(`${sourceId}__${k}`)) k += 1;\n finalId = `${sourceId}__${k}`;\n }\n usedIds.add(finalId);\n const entries = openCalls.get(sourceId) ?? [];\n entries.push({ finalId, consumed: false });\n openCalls.set(sourceId, entries);\n const { args } = shrinkArgs(row.toolInputJson || \"{}\");\n record = {\n role: \"assistant\",\n content: null,\n tool_calls: [\n { id: finalId, name: row.toolName || \"unknown_tool\", args },\n ],\n };\n } else if (row.role === \"tool_result\") {\n const entries = openCalls.get(row.toolCallId || \"\");\n const entry = entries?.find((e) => !e.consumed);\n if (!entry) continue; // orphan or duplicate result\n entry.consumed = true;\n record = {\n role: \"tool\",\n tool_call_id: entry.finalId,\n content: truncateText(content, TOOL_RESULT_MAX_CHARS),\n };\n } else {\n continue; // metadata rows: transport, not conversation\n }\n\n const ts = row.timestamp;\n if (ts instanceof Date && !Number.isNaN(ts.getTime())) {\n anchors.set(body.length, ts);\n }\n body.push(record);\n }\n\n const rolesPresent = new Set(body.map((r) => r.role));\n for (const required of [\"user\", \"assistant\"] as const) {\n if (!rolesPresent.has(required)) {\n return { status: `skipped:no_${required}_records` };\n }\n }\n\n const meta: NormalizedRecord = { role: \"meta\", source: context.source };\n if (context.cwd) meta.cwd = context.cwd;\n if (context.gitBranch) meta.git_branch = context.gitBranch;\n let model = context.model;\n if (!model && models.size > 0) {\n // Most common model; ties break by first-seen (stable sort).\n const ranked = [...models.entries()].sort((a, b) => b[1] - a[1]);\n model = ranked[0]?.[0];\n }\n if (model) meta.model = model;\n\n const stamps = fillTimestamps(\n body.length,\n anchors,\n context.createdAt ?? null,\n context.durationSeconds ?? null,\n );\n for (let i = 0; i < body.length; i++) {\n const record = body[i];\n if (record) record.timestamp = stamps[i];\n }\n const records = [meta, ...body];\n\n const problem = validateRecords(records);\n if (problem) return { status: `invalid:${problem}` };\n return { status: \"ok\", records };\n}\n\n/**\n * Minimal structural validation of the normalized-v1 contract. Returns an\n * error string, or null when valid.\n */\nexport function validateRecords(records: NormalizedRecord[]): string | null {\n if (records.length === 0) return \"empty transcript\";\n const openIds = new Set<string>();\n for (let i = 0; i < records.length; i++) {\n const rec = records[i];\n if (!rec) return `record ${i}: missing`;\n const role = rec.role;\n if (role === \"meta\") {\n if (i !== 0) return `record ${i}: meta must be leading`;\n if (!rec.source) return \"meta: missing source\";\n continue;\n }\n const ts = rec.timestamp;\n if (typeof ts !== \"string\" || !TS_RE.test(ts)) {\n return `record ${i}: bad timestamp ${JSON.stringify(ts)}`;\n }\n if (role === \"user\" || role === \"reasoning\") {\n if (typeof rec.content !== \"string\") {\n return `record ${i}: ${role} content must be a string`;\n }\n } else if (role === \"assistant\") {\n const calls = rec.tool_calls;\n if (calls !== undefined) {\n if (rec.content !== null && rec.content !== undefined) {\n return `record ${i}: assistant with tool_calls must have null content`;\n }\n if (calls.length === 0) return `record ${i}: empty tool_calls`;\n for (const call of calls) {\n if (!call.id || !call.name) {\n return `record ${i}: tool_call missing id/name`;\n }\n if (typeof call.args !== \"string\") {\n return `record ${i}: tool_call args must be a string`;\n }\n try {\n JSON.parse(call.args);\n } catch {\n return `record ${i}: tool_call args not valid JSON`;\n }\n openIds.add(call.id);\n }\n } else if (!(typeof rec.content === \"string\" && rec.content)) {\n return `record ${i}: prose assistant must have non-empty content`;\n }\n } else if (role === \"tool\") {\n if (!rec.tool_call_id || !openIds.has(rec.tool_call_id)) {\n return `record ${i}: tool result with unknown tool_call_id`;\n }\n if (typeof rec.content !== \"string\") {\n return `record ${i}: tool content must be a string`;\n }\n } else {\n return `record ${i}: unknown role ${JSON.stringify(role)}`;\n }\n }\n return null;\n}\n",
29
+ "/** Remove credential-shaped values before transcripts become run artifacts. */\nexport function redactSensitiveText(text: string): string {\n return text\n .replace(\n /(LETTA_API_KEY\\s*[=:]\\s*)[^\\s\"'\\\\]+/gi,\n \"$1[REDACTED_LETTA_API_KEY]\",\n )\n .replace(/sk-let-[A-Za-z0-9_+=/-]+/g, \"[REDACTED_LETTA_API_KEY]\");\n}\n",
30
+ "// SDK stream messages (a completed session's trajectory) → normalized-v1,\n// via the same row pipeline the harness sources use — so a recorded\n// reflection-agent run is byte-compatible with normalized session\n// transcripts.\n\nimport type { PseudoRow } from \"./normalize-core.js\";\nimport { normalizeSessionRows } from \"./normalize-core.js\";\nimport type { SDKMessage } from \"../types.js\";\nimport type { NormalizedRecord } from \"./types.js\";\nimport { redactSensitiveText } from \"./redact.js\";\n\n/**\n * Convert a session's captured SDKMessages into normalized-v1 records, with\n * the run's user prompt as the leading user record. Returns null when the\n * messages contain no conversational content.\n */\n/**\n * The cloud (api-backend) wire streams reasoning/assistant content as\n * per-token deltas that all share their logical message's id; stitch those\n * runs back into whole messages. Complete-message streams (local backend)\n * pass through unchanged, since consecutive distinct messages have distinct\n * ids.\n */\nfunction coalesceStreamDeltas(messages: SDKMessage[]): SDKMessage[] {\n const coalesced: SDKMessage[] = [];\n const toolCallIndex = new Map<string, number>();\n for (const msg of messages) {\n const prev = coalesced[coalesced.length - 1];\n if (\n prev !== undefined &&\n (msg.type === \"reasoning\" || msg.type === \"assistant\") &&\n prev.type === msg.type &&\n prev.uuid === msg.uuid\n ) {\n prev.content += msg.content;\n continue;\n }\n if (msg.type === \"tool_call\") {\n const key = `${msg.runId ?? \"\"}:${msg.uuid}:${msg.toolCallId}`;\n const existingIndex = toolCallIndex.get(key);\n const chunk =\n msg.rawArguments ?? JSON.stringify(msg.toolInput ?? {});\n if (existingIndex !== undefined) {\n const existing = coalesced[existingIndex];\n if (existing?.type === \"tool_call\") {\n const raw = `${existing.rawArguments ?? \"\"}${chunk}`;\n let toolInput: Record<string, unknown> = { raw };\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n toolInput = parsed as Record<string, unknown>;\n }\n } catch {\n // Keep the accumulated raw arguments until the final chunk lands.\n }\n existing.rawArguments = raw;\n existing.toolInput = toolInput;\n if (existing.toolName === \"?\" && msg.toolName !== \"?\") {\n existing.toolName = msg.toolName;\n }\n continue;\n }\n }\n toolCallIndex.set(key, coalesced.length);\n coalesced.push({ ...msg, rawArguments: chunk });\n continue;\n }\n if (msg.type === \"tool_result\") {\n for (const key of toolCallIndex.keys()) {\n if (key.endsWith(`:${msg.toolCallId}`)) toolCallIndex.delete(key);\n }\n }\n coalesced.push(\n msg.type === \"reasoning\" || msg.type === \"assistant\"\n ? { ...msg }\n : msg,\n );\n }\n return coalesced;\n}\n\nexport function normalizeSdkMessages(\n userPrompt: string,\n messages: SDKMessage[],\n): NormalizedRecord[] | null {\n const rows: PseudoRow[] = [\n {\n role: \"user\",\n turnType: \"user_prompt\",\n content: redactSensitiveText(userPrompt),\n timestamp: null,\n },\n ];\n for (const msg of coalesceStreamDeltas(messages)) {\n switch (msg.type) {\n case \"reasoning\":\n if (msg.content) {\n rows.push({\n role: \"assistant\",\n turnType: \"assistant_thinking\",\n content: redactSensitiveText(msg.content),\n timestamp: null,\n });\n }\n break;\n case \"assistant\":\n if (msg.content) {\n rows.push({\n role: \"assistant\",\n turnType: \"assistant_response\",\n content: redactSensitiveText(msg.content),\n timestamp: null,\n });\n }\n break;\n case \"tool_call\":\n rows.push({\n role: \"tool_use\",\n turnType: \"tool_use\",\n timestamp: null,\n toolName: msg.toolName,\n toolCallId: msg.toolCallId,\n toolInputJson: redactSensitiveText(\n msg.rawArguments ?? JSON.stringify(msg.toolInput ?? {}),\n ),\n });\n break;\n case \"tool_result\": {\n const content =\n msg.isError && !/^error/i.test(msg.content)\n ? `Error: ${redactSensitiveText(msg.content)}`\n : redactSensitiveText(msg.content);\n rows.push({\n role: \"tool_result\",\n turnType: \"tool_result\",\n content,\n timestamp: null,\n toolCallId: msg.toolCallId,\n });\n break;\n }\n default:\n break; // init/result/error/retry carry no conversational content\n }\n }\n if (rows.length <= 1) return null;\n const result = normalizeSessionRows(rows, { source: \"letta-agent-sdk\" });\n return result.status === \"ok\" ? (result.records ?? null) : null;\n}\n",
31
+ "// Batch reflection stage: one session per batch on the reflector agent, each\n// editing its own isolated CLONE of the target memory filesystem (taken at a\n// shared base revision), so it reconciles new learnings against existing\n// memory in place. Nothing here touches the target — the aggregation stage\n// reads each batch's diff against the base and synthesizes one edit.\n//\n// Each batch directory is self-contained:\n// input/ the batch's normalized session transcripts\n// output/ the agent's edited clone of the memory filesystem\n// diff.patch the batch's changes relative to the base revision\n// trajectory.json the agent's own run, normalized-v1 (same format as input/)\n// report.json structured outcome + the agent's final report\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { LettaAgentClient } from \"../client.js\";\nimport type { DreamBatch } from \"./batching.js\";\nimport { cloneMemoryTree, gitOutput, inspectMemoryTree } from \"./clone.js\";\nimport {\n configureMemfsCloneGuard,\n validateMemfsChanges,\n type MemfsWritePolicy,\n} from \"./memfs.js\";\nimport {\n buildReflectionContinuePrompt,\n buildReflectionUserPrompt,\n} from \"./prompts.js\";\nimport { runAgentToCompletion } from \"./runner.js\";\nimport { normalizeSdkMessages } from \"./sdk-messages.js\";\nimport { sessionFileName } from \"./select.js\";\n\nexport interface BatchReflectionResult {\n batchIndex: number;\n /** The reflector agent this batch ran on. */\n agentId: string;\n /** Conversation on the reflector agent this batch ran as. */\n conversationId?: string;\n sessionIds: string[];\n timeRange: { start: string; end: string };\n outputDir: string;\n reportPath: string;\n /** Target memfs revision the batch's clone (and diff.patch) is based on. */\n baseRevision: string;\n success: boolean;\n error?: string;\n /** Commits the agent made past the base revision. */\n commitCount: number;\n /** Uncommitted edits left behind (agent broke protocol; contents on disk). */\n dirty: boolean;\n durationMs: number;\n}\n\nexport interface RunBatchReflectionsParams {\n client: LettaAgentClient;\n reflectorAgentId: string;\n /** Dream agent whose memfs is being reflected on. */\n parentAgentId: string;\n /** The target memory filesystem batches clone. */\n memoryDir: string;\n runRoot: string;\n batches: DreamBatch[];\n /** sessionKey(session) → normalized-v1 JSON (already serialized). */\n normalizedJsonByKey: Map<string, string>;\n /** Write policy installed on every isolated clone and checked afterward. */\n memfsPolicy: MemfsWritePolicy;\n concurrency: number;\n /** Additional caller instruction, also provided to the aggregation pass. */\n instruction?: string;\n /** Abort: stop dispatching new batches and close in-flight sessions. */\n signal?: AbortSignal;\n log?: (line: string) => void;\n}\n\nasync function runOneBatch(\n params: RunBatchReflectionsParams,\n batch: DreamBatch,\n): Promise<BatchReflectionResult> {\n const log = params.log ?? (() => {});\n const batchDir = join(params.runRoot, \"batches\", String(batch.index));\n const inputDir = join(batchDir, \"input\");\n const outputDir = join(batchDir, \"output\");\n const reportPath = join(batchDir, \"report.json\");\n await mkdir(inputDir, { recursive: true });\n const baseRevision = await cloneMemoryTree(params.memoryDir, outputDir);\n const guard = await configureMemfsCloneGuard(\n params.memoryDir,\n outputDir,\n params.memfsPolicy,\n );\n\n // Stage this batch's normalized sessions into its own input/ directory so\n // the batch is self-contained and the aggregator can consult the original\n // data. Normalization already happened during packing.\n const sessionFileNames: string[] = [];\n for (const session of batch.sessions) {\n const key = `${session.harness}:${session.sessionId}`;\n const json = params.normalizedJsonByKey.get(key);\n if (!json) {\n throw new Error(`No normalized transcript staged for session ${key}`);\n }\n const fileName = sessionFileName(session);\n await writeFile(join(inputDir, fileName), json, \"utf-8\");\n sessionFileNames.push(fileName);\n }\n\n const userPrompt = buildReflectionUserPrompt({\n batchIndex: batch.index,\n inputDir,\n sessionFileNames,\n memoryDir: outputDir,\n timeRange: { start: batch.startTime, end: batch.endTime },\n ...(params.instruction ? { instruction: params.instruction } : {}),\n });\n\n const label = `reflect:batch-${batch.index}`;\n log(\n `[${label}] ${batch.sessions.length} session(s), ~${batch.estTokens} tokens, ` +\n `${batch.startTime} → ${batch.endTime}`,\n );\n\n // Session startup is the contended phase: concurrent sessions on the shared\n // reflector can collide on its git config lock, and a thundering herd of\n // runtime starts can push the slowest past the request timeout. Both are\n // transient — retry with jitter instead of failing the batch.\n const TRANSIENT_INIT_ERROR =\n /could not lock config file|Timed out waiting for runtime-start/;\n // Scope the session's memory to its clone: the harness's memory guard then\n // applies to the batch's own memory copy rather than being stripped. The\n // EXPLICIT marker distinguishes this deliberate scope from stale leakage.\n const memoryEnv = {\n MEMORY_DIR: outputDir,\n LETTA_MEMORY_DIR: outputDir,\n LETTA_MEMORY_DIR_EXPLICIT: \"1\",\n // The guard accepts memory clones under this dream agent's state tree\n // only when the worker is explicitly scoped as its child.\n LETTA_PARENT_AGENT_ID: params.parentAgentId,\n };\n let run = await runAgentToCompletion(params.client, {\n agentId: params.reflectorAgentId,\n userPrompt,\n cwd: batchDir,\n label,\n env: memoryEnv,\n skillSources: [],\n ...(params.signal ? { signal: params.signal } : {}),\n onProgress: log,\n });\n for (\n let retry = 0;\n !params.signal?.aborted &&\n !run.success &&\n run.error !== undefined &&\n TRANSIENT_INIT_ERROR.test(run.error) &&\n retry < 3;\n retry++\n ) {\n const delayMs = 500 + Math.floor(Math.random() * 2000);\n log(`[${label}] transient session-init contention, retrying in ${delayMs}ms`);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n run = await runAgentToCompletion(params.client, {\n agentId: params.reflectorAgentId,\n userPrompt,\n cwd: batchDir,\n label,\n env: memoryEnv,\n skillSources: [],\n ...(params.signal ? { signal: params.signal } : {}),\n onProgress: log,\n });\n }\n\n // The model can end its turn before doing the work (e.g. after narrating a\n // plan). While the clone is completely untouched, nudge the same\n // conversation onward — its survey of the sessions is already in context.\n const passes: { prompt: string; run: typeof run }[] = [\n { prompt: userPrompt, run },\n ];\n const explicitlyNoChanges = () =>\n /\\b(no commit|no relevant trajector(?:y|ies)|no durable learnings|nothing (?:to|worth) persist)/i.test(\n run.report,\n );\n for (\n let nudge = 0;\n nudge < 2 &&\n !params.signal?.aborted &&\n run.success &&\n run.conversationId !== null;\n nudge++\n ) {\n const state = await inspectMemoryTree(outputDir, baseRevision);\n if (state.commitCount > 0 || state.dirty) break;\n // A clean no-op is a valid reflection outcome. In particular, a scoped\n // prompt may require irrelevant transcripts to be skipped without a\n // commit; do not nudge the model into inventing memory in that case.\n if (explicitlyNoChanges()) break;\n const continuePrompt = buildReflectionContinuePrompt({\n memoryDir: outputDir,\n });\n log(`[${label}] turn ended with no memory changes — nudging to continue`);\n run = await runAgentToCompletion(params.client, {\n agentId: params.reflectorAgentId,\n userPrompt: continuePrompt,\n cwd: batchDir,\n label,\n resumeConversationId: run.conversationId,\n env: memoryEnv,\n skillSources: [],\n ...(params.signal ? { signal: params.signal } : {}),\n onProgress: log,\n });\n passes.push({ prompt: continuePrompt, run });\n }\n\n const records = passes.flatMap(\n (pass) => normalizeSdkMessages(pass.prompt, pass.run.messages) ?? [],\n );\n if (records.length > 0) {\n await writeFile(\n join(batchDir, \"trajectory.json\"),\n JSON.stringify(records, null, 1),\n \"utf-8\",\n );\n }\n let { commitCount, dirty } = await inspectMemoryTree(\n outputDir,\n baseRevision,\n );\n if (dirty) {\n // Agents occasionally end without committing their last edits. That tree\n // content is the batch's real output — commit it so diff.patch (the\n // aggregator's primary input) reflects it. `dirty` stays true to record\n // the protocol break.\n try {\n await gitOutput(outputDir, [\"add\", \"-A\"]);\n await gitOutput(outputDir, [\n \"commit\",\n \"-m\",\n `reflection: batch ${batch.index} (recovered uncommitted edits)`,\n ]);\n commitCount += 1;\n } catch {\n // Recovery is best-effort; an unrecoverable tree still ships its diff\n // of whatever WAS committed.\n }\n }\n // The batch's changes relative to the shared base — the aggregator's\n // primary input.\n try {\n const patch = await gitOutput(outputDir, [\"diff\", baseRevision, \"HEAD\"]);\n await writeFile(join(batchDir, \"diff.patch\"), `${patch}\\n`, \"utf-8\");\n } catch {\n // A missing diff just reads as an empty batch to the aggregator.\n }\n\n const policyCheck = await validateMemfsChanges(\n outputDir,\n baseRevision,\n params.memfsPolicy,\n { baselineDirectories: guard.baselineDirectories },\n );\n const policyError = policyCheck.valid\n ? undefined\n : `MemFS write policy rejected ${policyCheck.violations.length} change(s): ${policyCheck.violations\n .map((violation) => `${violation.path} (${violation.reason})`)\n .join(\"; \")}`;\n\n const result: BatchReflectionResult = {\n batchIndex: batch.index,\n agentId: run.agentId,\n conversationId: run.conversationId ?? undefined,\n sessionIds: batch.sessions.map((s) => `${s.harness}:${s.sessionId}`),\n timeRange: { start: batch.startTime, end: batch.endTime },\n outputDir,\n reportPath,\n baseRevision,\n success: run.success && policyCheck.valid,\n error: run.error ?? policyError,\n commitCount,\n dirty,\n durationMs: run.durationMs,\n };\n await writeFile(\n reportPath,\n JSON.stringify({ ...result, report: run.report }, null, 2),\n \"utf-8\",\n );\n log(\n `[${label}] ${result.success ? \"done\" : `FAILED: ${result.error ?? \"unknown error\"}`} ` +\n `(${commitCount} commit(s)${dirty ? \", uncommitted edits left\" : \"\"})`,\n );\n return result;\n}\n\n/** Run all batches with bounded concurrency; results ordered by batch index. */\nexport async function runBatchReflections(\n params: RunBatchReflectionsParams,\n): Promise<BatchReflectionResult[]> {\n const results: BatchReflectionResult[] = [];\n let next = 0;\n const workerCount = Math.max(\n 1,\n Math.min(params.concurrency, params.batches.length),\n );\n const workers = Array.from({ length: workerCount }, async (_, workerIndex) => {\n // Stagger session startups: a same-instant herd of runtime starts can\n // push the slowest past the protocol request timeout.\n await new Promise((resolve) => setTimeout(resolve, workerIndex * 1500));\n while (!params.signal?.aborted && next < params.batches.length) {\n const batch = params.batches[next++];\n if (!batch) break;\n results.push(await runOneBatch(params, batch));\n }\n });\n await Promise.all(workers);\n results.sort((a, b) => a.batchIndex - b.batchIndex);\n return results;\n}\n",
32
+ "// Stable transcript identity and artifact naming shared by collection and\n// dream execution.\n\nimport type { DiscoveredSession } from \"./types.js\";\n\n/** A stable identity for a discovered session across sources. */\nexport function sessionKey(session: DiscoveredSession): string {\n return `${session.harness}:${session.sessionId}`;\n}\n\n/** Filesystem-safe file name for one normalized session. */\nexport function sessionFileName(session: DiscoveredSession): string {\n const safe = (value: string) => value.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n return `${safe(session.harness)}-${safe(session.sessionId)}.json`;\n}\n",
33
+ "// A dream agent is a memfs-enabled Letta agent. Its identity is the Letta\n// agent id; the harness owns its memory checkout while this SDK stores dream\n// run state alongside it:\n//\n// ~/.letta/agents/<agent-id>/\n// memory/ harness-owned MemFS Git checkout\n// dream/ SDK configuration, cursors, and run artifacts\n\n// Initialization accepts the complete starting MemFS shape. A write policy is\n// installed as a Git pre-commit hook and is also checked after every agent run\n// so --no-verify cannot bypass it.\n\nimport { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { LettaAgentClient } from \"../client.js\";\nimport { gitOutput } from \"./clone.js\";\nimport {\n createMemfsWritePolicy,\n installMemfsGuard,\n materializeMemfsStructure,\n recreateMemfsDirectories,\n validateMemfsWritePolicy,\n type MemfsGuardInstallation,\n type MemfsOperationRule,\n type MemfsStructure,\n type MemfsWritePolicy,\n} from \"./memfs.js\";\n\nexport interface DreamAgentConfig {\n schema_version: \"v1\";\n name?: string;\n createdAt: string;\n /** Model for the dream agent and its lazily-created reflection worker. */\n model?: string;\n reflectorAgentId?: string;\n memfs: {\n /** Empty directories that initialization must preserve across clones. */\n directories: readonly string[];\n /** Persistent write policy enforced for reflection and aggregation. */\n policy: MemfsWritePolicy;\n };\n}\n\nexport interface DreamAgentGuardOptions {\n /** Directory prefixes under which agents may create new files/folders. */\n allowedNewFilePrefixes?: readonly string[];\n /** Optional exact/recursive overrides for create, modify, and delete. */\n allowedOperations?: readonly MemfsOperationRule[];\n}\n\nexport interface InitDreamAgentOptions {\n name?: string;\n /** Model for the dream agent and its reflection worker. */\n model?: string;\n /** Complete initial contents and declared empty directories for MemFS. */\n memfs?: MemfsStructure;\n /** Restrict what later reflection/aggregation sessions may write. */\n guard?: DreamAgentGuardOptions;\n /** Override the harness agents directory (primarily for tests). */\n agentsDir?: string;\n /** Reuse an existing memfs-enabled Letta agent instead of creating one. */\n agentId?: string;\n}\n\nexport interface LoadedDreamAgent {\n agentId: string;\n memoryDir: string;\n stateDir: string;\n runsDir: string;\n configPath: string;\n config: DreamAgentConfig;\n}\n\nfunction harnessAgentDir(agentId: string, agentsDir?: string): string {\n return join(agentsDir ?? join(homedir(), \".letta\", \"agents\"), agentId);\n}\n\nfunction agentPaths(\n agentId: string,\n agentsDir?: string,\n): Omit<LoadedDreamAgent, \"config\"> {\n const base = harnessAgentDir(agentId, agentsDir);\n const stateDir = join(base, \"dream\");\n return {\n agentId,\n memoryDir: join(base, \"memory\"),\n stateDir,\n runsDir: join(stateDir, \"runs\"),\n configPath: join(stateDir, \"agent.json\"),\n };\n}\n\nexport async function saveDreamAgentConfig(\n agent: LoadedDreamAgent,\n): Promise<void> {\n await writeFile(\n agent.configPath,\n `${JSON.stringify(agent.config, null, 2)}\\n`,\n \"utf-8\",\n );\n}\n\nexport async function loadDreamAgent(\n agentId: string,\n options: { agentsDir?: string } = {},\n): Promise<LoadedDreamAgent> {\n const paths = agentPaths(agentId, options.agentsDir);\n const raw = await readFile(paths.configPath, \"utf-8\").catch(() => null);\n if (raw === null) {\n throw new Error(\n `${agentId} is not an initialized dream agent (missing ${paths.configPath} — run initDreamAgent first)`,\n );\n }\n const parsed = JSON.parse(raw) as Partial<DreamAgentConfig>;\n if (parsed.schema_version !== \"v1\" || !parsed.memfs?.policy) {\n throw new Error(\n `${agentId} has an incompatible dream-agent configuration; initialize a new dream agent`,\n );\n }\n const config: DreamAgentConfig = {\n ...parsed,\n schema_version: \"v1\",\n createdAt: parsed.createdAt ?? new Date(0).toISOString(),\n memfs: {\n directories: parsed.memfs.directories ?? [],\n policy: validateMemfsWritePolicy(parsed.memfs.policy),\n },\n };\n return { ...paths, config };\n}\n\n/** Reinstall the guard and recreate declared empty directories before a run. */\nexport async function prepareDreamAgentMemfs(\n agent: LoadedDreamAgent,\n): Promise<MemfsGuardInstallation> {\n await recreateMemfsDirectories(\n agent.memoryDir,\n agent.config.memfs.directories,\n );\n await assertDreamAgentMemfsReady(agent);\n return installMemfsGuard(agent.memoryDir, agent.config.memfs.policy);\n}\n\nasync function assertDreamAgentMemfsReady(\n agent: LoadedDreamAgent,\n): Promise<void> {\n const untrackedSeeds: string[] = [];\n for (const path of agent.config.memfs.policy.existingPaths) {\n const tracked = await gitOutput(agent.memoryDir, [\n \"ls-files\",\n \"--error-unmatch\",\n \"--\",\n path,\n ]).catch(() => null);\n if (tracked === null) untrackedSeeds.push(path);\n }\n if (untrackedSeeds.length > 0) {\n throw new Error(\n `Dream agent MemFS is not ready: seeded path(s) are not tracked: ${untrackedSeeds.join(\", \")}. ` +\n \"The harness may still be initializing or may have replaced the checkout after seeding.\",\n );\n }\n\n const status = await gitOutput(agent.memoryDir, [\n \"status\",\n \"--porcelain\",\n \"--untracked-files=all\",\n ]);\n if (status !== \"\") {\n throw new Error(\n `Dream agent MemFS must be clean before use; found:\\n${status}`,\n );\n }\n}\n\n/**\n * Create or bind a memfs-enabled Letta agent, seed its initial MemFS, commit\n * that seed, and install the requested write guard.\n */\nexport async function initDreamAgent(\n client: LettaAgentClient,\n options: InitDreamAgentOptions = {},\n): Promise<LoadedDreamAgent> {\n const agentId =\n options.agentId ??\n (await client.createAgent({\n ...(options.model ? { model: options.model } : {}),\n tags: [\"role:dream-agent\"],\n }));\n\n const paths = agentPaths(agentId, options.agentsDir);\n const existing = await readFile(paths.configPath, \"utf-8\").catch(() => null);\n if (existing !== null) {\n throw new Error(`${agentId} is already an initialized dream agent`);\n }\n const memoryInfo = await stat(paths.memoryDir).catch(() => null);\n if (!memoryInfo?.isDirectory()) {\n throw new Error(\n `No memory filesystem checkout at ${paths.memoryDir} — the dream agent must be memfs-enabled`,\n );\n }\n\n const structure = options.memfs ?? {};\n const validated = await materializeMemfsStructure(paths.memoryDir, structure);\n if (validated.files.length > 0) {\n await gitOutput(paths.memoryDir, [\n \"add\",\n \"--\",\n ...validated.files.map((file) => file.path),\n ]);\n const staged = await gitOutput(paths.memoryDir, [\n \"diff\",\n \"--cached\",\n \"--name-only\",\n ]);\n if (staged !== \"\") {\n await gitOutput(paths.memoryDir, [\n \"-c\",\n \"user.name=Dream\",\n \"-c\",\n \"user.email=dream@letta.com\",\n \"commit\",\n \"-m\",\n \"dream: initialize memory\",\n ]);\n }\n }\n\n const policy = createMemfsWritePolicy(validated, options.guard);\n await mkdir(paths.runsDir, { recursive: true });\n const agent: LoadedDreamAgent = {\n ...paths,\n config: {\n schema_version: \"v1\",\n ...(options.name ? { name: options.name } : {}),\n createdAt: new Date().toISOString(),\n ...(options.model ? { model: options.model } : {}),\n memfs: {\n directories: validated.directories,\n policy,\n },\n },\n };\n await saveDreamAgentConfig(agent);\n await prepareDreamAgentMemfs(agent);\n return agent;\n}\n",
34
+ "// Reflection cursors for long-lived sources — the port of letta-code's\n// openhands incremental ingestion. An OpenHands conversation is an\n// append-only event stream a dream may run against many times as it grows;\n// after a successful aggregation the conversation's last-reflected record\n// timestamp is recorded, and later runs drop everything at or before it — no\n// new experience → nothing to reflect (which also keeps target docs like\n// AGENTS.md churn-free). Claude/Codex sessions are finite files selected per\n// run and stay cursor-free: re-processing what a spec selects is deliberate.\n//\n// The cursor file is SDK run state, not agent memory, so it lives in the\n// dream-agent state directory and never competes with MemFS write guards.\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nconst CURSORS_REL_PATH = \"cursors.json\";\n\n/** sessionKey (\"openhands:<conversation-id>\") → last reflected timestamp. */\nexport type DreamCursors = Record<string, { reflectedThrough: string }>;\n\nexport async function loadDreamCursors(\n stateDir: string,\n): Promise<DreamCursors> {\n try {\n const raw = await readFile(join(stateDir, CURSORS_REL_PATH), \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n return parsed && typeof parsed === \"object\"\n ? (parsed as DreamCursors)\n : {};\n } catch {\n return {};\n }\n}\n\nexport async function saveDreamCursors(\n stateDir: string,\n cursors: DreamCursors,\n): Promise<void> {\n const absPath = join(stateDir, CURSORS_REL_PATH);\n await mkdir(dirname(absPath), { recursive: true });\n await writeFile(absPath, `${JSON.stringify(cursors, null, 2)}\\n`, \"utf-8\");\n}\n",
35
+ "// Shared types for the trajectory normalization pipeline (\"normalized-v1\").\n//\n// A normalized transcript is a JSON array whose optional leading record is\n// `{role: \"meta\", source, cwd?, git_branch?, model?}` followed by\n// user / reasoning / assistant / tool records, each with an ISO timestamp.\n// Assistant records are either prose (content, no tool_calls) or tool\n// invocations (content null, tool_calls with stringified JSON args). Tool\n// results link back via tool_call_id.\n//\n// This record shape must stay compatible with the batch-reflection prototype.\n\nexport interface NormalizedRecord {\n role: \"meta\" | \"user\" | \"reasoning\" | \"assistant\" | \"tool\";\n content?: string | null;\n timestamp?: string;\n source?: string;\n tool_calls?: { id: string; name: string; args: string }[];\n tool_call_id?: string;\n cwd?: string;\n git_branch?: string;\n model?: string;\n}\n\nexport interface DiscoveredSession {\n harness: string; // \"claude\" | \"codex\" | \"openhands\" | \"transcript\"\n sessionId: string;\n path: string; // session file or directory on disk\n startTime: string; // ISO timestamp of first conversation record\n endTime: string; // ISO timestamp of last conversation record\n estTokens: number; // ~chars/4 of raw content\n recordCount: number;\n mtimeMs: number;\n cwd?: string; // working directory the session ran in, when known\n}\n\nexport interface NormalizedSession {\n session: DiscoveredSession;\n records: NormalizedRecord[]; // leading meta record when metadata known\n}\n\nexport interface TrajectorySource {\n /** The scheme used in `--from <type>[:<locator>]`. */\n type: string;\n /**\n * Discover candidate sessions. With no locator, scan the harness's default\n * local store. With a locator, resolve it as a path (session file, session\n * dir, project dir, or store dir) or a session-id prefix and return the\n * matching session(s) — cursor filtering happens in the caller, so discover\n * should return ALL sessions in the store when the locator names a store or\n * is absent, and the single named session when it names one.\n */\n discover(locator?: string): Promise<DiscoveredSession[]>;\n /** Fully parse + normalize one discovered session. */\n normalize(session: DiscoveredSession): Promise<NormalizedSession>;\n}\n\nconst CHARS_PER_TOKEN = 4;\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nconst NORMALIZED_ROLES = new Set([\n \"meta\",\n \"user\",\n \"reasoning\",\n \"assistant\",\n \"tool\",\n]);\n\nexport function isNormalizedRecordArray(\n value: unknown,\n): value is NormalizedRecord[] {\n if (!Array.isArray(value)) return false;\n return value.every((item) => {\n if (item === null || typeof item !== \"object\" || Array.isArray(item)) {\n return false;\n }\n const rec = item as Record<string, unknown>;\n if (typeof rec.role !== \"string\" || !NORMALIZED_ROLES.has(rec.role)) {\n return false;\n }\n if (\n rec.content !== undefined &&\n rec.content !== null &&\n typeof rec.content !== \"string\"\n ) {\n return false;\n }\n if (rec.timestamp !== undefined && typeof rec.timestamp !== \"string\") {\n return false;\n }\n if (rec.tool_calls !== undefined) {\n if (!Array.isArray(rec.tool_calls)) return false;\n for (const call of rec.tool_calls) {\n if (call === null || typeof call !== \"object\") return false;\n const c = call as Record<string, unknown>;\n if (\n typeof c.id !== \"string\" ||\n typeof c.name !== \"string\" ||\n typeof c.args !== \"string\"\n ) {\n return false;\n }\n }\n }\n return true;\n });\n}\n",
36
+ "// Worker agents for the dream pipeline:\n//\n// - The REFLECTOR carries the reflection system prompt; every batch runs as\n// its own session on it (sessions are independent conversations, so any\n// number of batches run concurrently without contention).\n// - The AGGREGATOR carries the default system prompt with the aggregator\n// persona block; the aggregation pass runs as a session on it.\n//\n// Callers may pass existing agent ids to reuse workers across runs (their\n// conversation history then doubles as the dream run history); otherwise one\n// of each is created per dream() call, tagged for later discovery.\n\nimport type { LettaAgentClient } from \"../client.js\";\nimport { AGGREGATOR_PERSONA, REFLECTION_SYSTEM_PROMPT } from \"./prompts.js\";\n\nexport interface DreamWorkers {\n reflectorAgentId: string;\n aggregatorAgentId: string;\n}\n\nexport async function ensureDreamWorkers(\n client: LettaAgentClient,\n options: {\n reflectorAgentId?: string;\n aggregatorAgentId?: string;\n model?: string;\n log?: (line: string) => void;\n },\n): Promise<DreamWorkers> {\n const log = options.log ?? (() => {});\n\n // Creation parameters mirror letta-code's dream workers exactly: hidden\n // subagent-style agents with NO server-side base tools and no memfs of\n // their own — reflection edits per-batch clones (via $MEMORY_DIR),\n // aggregation edits the target, and a shared memfs would make concurrent\n // sessions contend on its git state.\n let reflectorAgentId = options.reflectorAgentId;\n if (!reflectorAgentId) {\n reflectorAgentId = await client.createAgent({\n name: \"dream-reflector\",\n description: \"Dream pipeline reflector\",\n systemPrompt: REFLECTION_SYSTEM_PROMPT,\n ...(options.model ? { model: options.model } : {}),\n tags: [\"type:reflection\", \"role:dream-reflector\"],\n hidden: true,\n baseTools: [],\n // Reflection must derive its output from the provided trajectories and\n // prompt, not from Letta Code's bundled/global/agent/project skills.\n skillSources: [],\n memfs: false,\n });\n log(`[reflector] created ${reflectorAgentId}`);\n }\n\n let aggregatorAgentId = options.aggregatorAgentId;\n if (!aggregatorAgentId) {\n aggregatorAgentId = await client.createAgent({\n name: \"dream-aggregator\",\n description: \"Dream pipeline aggregator\",\n memory: [\n {\n label: \"persona\",\n value: AGGREGATOR_PERSONA,\n description:\n \"Who I am: a memory aggregator agent merging reflection outputs into one cohesive memory filesystem.\",\n },\n ],\n ...(options.model ? { model: options.model } : {}),\n tags: [\"type:aggregation\", \"role:dream-aggregator\"],\n hidden: true,\n baseTools: [],\n memfs: false,\n });\n log(`[aggregator] created ${aggregatorAgentId}`);\n }\n\n return { reflectorAgentId, aggregatorAgentId };\n}\n",
37
+ "// Claude Code session store → normalized-v1.\n//\n// Store layout: ~/.claude/projects/<project-slug>/<session-uuid>.jsonl — one\n// JSON record per line. Parsing ported from `parse_cc_jsonl` in\n// extract_transcripts.py: one content block = one pseudo-row; sidechain\n// records and transport records (incl. `progress`, which holds subagent\n// transcripts) are dropped; cwd/gitBranch/model are mined for the meta record.\n\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport type {\n PseudoRow,\n SessionContext,\n} from \"../normalize-core.js\";\nimport {\n blocksText,\n normalizeSessionRows,\n parseTimestamp,\n} from \"../normalize-core.js\";\nimport {\n buildDiscoveredSession,\n listFilesRecursive,\n matchSessionIds,\n statOrNull,\n} from \"../store-utils.js\";\nimport type {\n DiscoveredSession,\n NormalizedRecord,\n NormalizedSession,\n TrajectorySource,\n} from \"../types.js\";\n\nconst CC_TRANSPORT_TYPES = new Set([\n \"progress\",\n \"queue-operation\",\n \"file-history-snapshot\",\n \"summary\",\n \"system\",\n \"pr-link\",\n \"last-prompt\",\n \"custom-title\",\n \"ai-title\",\n \"agent-name\",\n \"permission-mode\",\n \"attachment\",\n \"mode\",\n]);\n\ninterface CcParseOutput {\n rows: PseudoRow[];\n extras: { cwd?: string; gitBranch?: string };\n}\n\n/** Claude Code session JSONL → pseudo-rows plus mined session context. */\nexport function parseClaudeCodeJsonl(text: string): CcParseOutput {\n const rows: PseudoRow[] = [];\n const extras: { cwd?: string; gitBranch?: string } = {};\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n let rec: unknown;\n try {\n rec = JSON.parse(line);\n } catch {\n continue;\n }\n if (!rec || typeof rec !== \"object\" || Array.isArray(rec)) continue;\n const record = rec as Record<string, unknown>;\n const rtype = record.type;\n if (\n (typeof rtype === \"string\" && CC_TRANSPORT_TYPES.has(rtype)) ||\n record.isSidechain\n ) {\n continue;\n }\n if (typeof record.cwd === \"string\" && record.cwd && !extras.cwd) {\n extras.cwd = record.cwd;\n }\n if (\n typeof record.gitBranch === \"string\" &&\n record.gitBranch &&\n !extras.gitBranch\n ) {\n extras.gitBranch = record.gitBranch;\n }\n const msg = record.message;\n if (\n (rtype !== \"user\" && rtype !== \"assistant\") ||\n !msg ||\n typeof msg !== \"object\" ||\n Array.isArray(msg)\n ) {\n continue;\n }\n const message = msg as Record<string, unknown>;\n const ts = parseTimestamp(record.timestamp);\n const model = typeof message.model === \"string\" ? message.model : undefined;\n const content = message.content;\n const turnType = record.isMeta ? \"system_injected\" : \"user_prompt\";\n\n if (rtype === \"user\") {\n if (typeof content === \"string\") {\n rows.push({ role: \"user\", turnType, content, timestamp: ts });\n continue;\n }\n const textParts: string[] = [];\n for (const block of Array.isArray(content) ? content : []) {\n if (!block || typeof block !== \"object\") continue;\n const b = block as Record<string, unknown>;\n if (b.type === \"tool_result\") {\n rows.push({\n role: \"tool_result\",\n turnType: \"tool_result\",\n content: blocksText(b.content),\n timestamp: ts,\n toolCallId:\n typeof b.tool_use_id === \"string\" ? b.tool_use_id : undefined,\n });\n } else if (b.type === \"text\") {\n textParts.push(typeof b.text === \"string\" ? b.text : \"\");\n } else if (b.type === \"image\") {\n textParts.push(\"[image]\");\n }\n }\n if (textParts.length > 0) {\n rows.push({\n role: \"user\",\n turnType,\n content: textParts.join(\"\\n\"),\n timestamp: ts,\n });\n }\n } else {\n // assistant\n for (const block of Array.isArray(content) ? content : []) {\n if (!block || typeof block !== \"object\") continue;\n const b = block as Record<string, unknown>;\n if (b.type === \"thinking\") {\n rows.push({\n role: \"assistant\",\n turnType: \"assistant_thinking\",\n content: typeof b.thinking === \"string\" ? b.thinking : \"\",\n timestamp: ts,\n model,\n });\n } else if (b.type === \"text\") {\n rows.push({\n role: \"assistant\",\n turnType: \"assistant_response\",\n content: typeof b.text === \"string\" ? b.text : \"\",\n timestamp: ts,\n model,\n });\n } else if (b.type === \"tool_use\") {\n rows.push({\n role: \"tool_use\",\n turnType: \"tool_use\",\n timestamp: ts,\n model,\n toolName: typeof b.name === \"string\" ? b.name : undefined,\n toolCallId: typeof b.id === \"string\" ? b.id : undefined,\n toolInputJson: JSON.stringify(b.input ?? {}),\n });\n }\n }\n if (typeof content === \"string\" && content.trim()) {\n rows.push({\n role: \"assistant\",\n turnType: \"assistant_response\",\n content,\n timestamp: ts,\n model,\n });\n }\n }\n }\n return { rows, extras };\n}\n\nfunction sessionIdFromPath(path: string): string {\n return basename(path).replace(/\\.jsonl$/, \"\");\n}\n\ninterface ParsedSessionFile {\n session: DiscoveredSession;\n records: NormalizedRecord[];\n}\n\nfunction parseSessionFile(path: string): ParsedSessionFile | null {\n const info = statOrNull(path);\n if (!info?.isFile()) return null;\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n const { rows, extras } = parseClaudeCodeJsonl(text);\n const context: SessionContext = {\n source: \"claude_code\",\n ...extras,\n createdAt: new Date(info.mtimeMs),\n };\n const result = normalizeSessionRows(rows, context);\n const session = buildDiscoveredSession(\n \"claude\",\n sessionIdFromPath(path),\n path,\n info.mtimeMs,\n result,\n );\n if (!session || !result.records) return null;\n return { session, records: result.records };\n}\n\n/**\n * Trajectory source for local Claude Code sessions. `storeDir` overrides the\n * default store (~/.claude/projects), mainly for tests.\n */\nexport function createClaudeCodeSource(storeDir?: string): TrajectorySource {\n const root = storeDir ?? join(homedir(), \".claude\", \"projects\");\n const isSessionFile = (name: string) => name.endsWith(\".jsonl\");\n\n return {\n type: \"claude\",\n\n async discover(locator?: string): Promise<DiscoveredSession[]> {\n let files: string[];\n if (!locator) {\n files = listFilesRecursive(root, isSessionFile);\n } else {\n const info = statOrNull(locator);\n if (info?.isFile()) {\n files = [locator];\n } else if (info?.isDirectory()) {\n // Project dir or store dir — both hold .jsonl sessions below them.\n files = listFilesRecursive(locator, isSessionFile);\n } else {\n const all = listFilesRecursive(root, isSessionFile).map((path) => ({\n sessionId: sessionIdFromPath(path),\n path,\n }));\n const matches = matchSessionIds(locator, all);\n if (matches.length === 0) {\n throw new Error(\n `No Claude Code session matches \"${locator}\" in ${root}`,\n );\n }\n files = matches.map((m) => m.path);\n }\n }\n const sessions: DiscoveredSession[] = [];\n for (const file of files) {\n const parsed = parseSessionFile(file);\n if (parsed) sessions.push(parsed.session);\n }\n sessions.sort((a, b) => a.mtimeMs - b.mtimeMs);\n return sessions;\n },\n\n async normalize(session: DiscoveredSession): Promise<NormalizedSession> {\n const parsed = parseSessionFile(session.path);\n if (!parsed) {\n throw new Error(\n `Could not normalize Claude Code session ${session.sessionId} at ${session.path}`,\n );\n }\n return { session, records: parsed.records };\n },\n };\n}\n",
38
+ "// Filesystem helpers shared by the trajectory-source discovery paths.\n\nimport type { Stats } from \"node:fs\";\nimport { readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { NormalizeRowsResult } from \"./normalize-core.js\";\nimport type { DiscoveredSession } from \"./types.js\";\nimport { estimateTokens } from \"./types.js\";\n\nexport function statOrNull(path: string): Stats | null {\n try {\n return statSync(path);\n } catch {\n return null;\n }\n}\n\n/** Recursively list files under `dir` whose basename matches `match`. */\nexport function listFilesRecursive(\n dir: string,\n match: (name: string) => boolean,\n): string[] {\n const out: string[] = [];\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return out;\n }\n for (const entry of entries.sort()) {\n const path = join(dir, entry);\n const info = statOrNull(path);\n if (!info) continue;\n if (info.isDirectory()) {\n out.push(...listFilesRecursive(path, match));\n } else if (info.isFile() && match(entry)) {\n out.push(path);\n }\n }\n return out;\n}\n\n/**\n * Build a DiscoveredSession from a normalize result, or null when the session\n * was skipped or invalid. Time bounds come from the conversation records\n * (meta excluded); estTokens is ~chars/4 of the serialized transcript.\n */\nexport function buildDiscoveredSession(\n harness: string,\n sessionId: string,\n path: string,\n mtimeMs: number,\n result: NormalizeRowsResult,\n): DiscoveredSession | null {\n if (result.status !== \"ok\" || !result.records) return null;\n const records = result.records;\n const meta = records[0]?.role === \"meta\" ? records[0] : undefined;\n const body = records.filter((r) => r.role !== \"meta\");\n const startTime = body[0]?.timestamp;\n const endTime = body[body.length - 1]?.timestamp;\n if (!startTime || !endTime) return null;\n return {\n harness,\n sessionId,\n path,\n startTime,\n endTime,\n estTokens: estimateTokens(JSON.stringify(records)),\n recordCount: body.length,\n mtimeMs,\n ...(meta?.cwd ? { cwd: meta.cwd } : {}),\n };\n}\n\n/**\n * Resolve a session-id locator against ids of store sessions: exact match\n * first, then unique-prefix semantics (all sessions whose id starts with the\n * locator).\n */\nexport function matchSessionIds<T extends { sessionId: string }>(\n locator: string,\n candidates: T[],\n): T[] {\n const exact = candidates.filter((c) => c.sessionId === locator);\n if (exact.length > 0) return exact;\n return candidates.filter((c) => c.sessionId.startsWith(locator));\n}\n",
39
+ "// Codex CLI session store → normalized-v1.\n//\n// Store layout: ~/.codex/sessions/YYYY/MM/DD/rollout-<ts>-<uuid>.jsonl — one\n// JSON record per line. Parsing ported from `parse_codex_rollout` in\n// extract_transcripts.py: `response_item` records are the canonical\n// model-context stream; `event_msg/agent_reasoning` supplies the plaintext\n// reasoning summaries (`response_item/reasoning` is encrypted); `session_meta`\n// is mined for cwd / created_at / git branch, `turn_context` for cwd / model.\n\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport type {\n PseudoRow,\n SessionContext,\n} from \"../normalize-core.js\";\nimport {\n blocksText,\n CODEX_INJECTED_PREFIXES,\n normalizeSessionRows,\n parseTimestamp,\n} from \"../normalize-core.js\";\nimport {\n buildDiscoveredSession,\n listFilesRecursive,\n matchSessionIds,\n statOrNull,\n} from \"../store-utils.js\";\nimport type {\n DiscoveredSession,\n NormalizedRecord,\n NormalizedSession,\n TrajectorySource,\n} from \"../types.js\";\n\ninterface CodexParseOutput {\n rows: PseudoRow[];\n extras: {\n cwd?: string;\n gitBranch?: string;\n model?: string;\n createdAt?: Date;\n };\n}\n\n/** Codex rollout JSONL → pseudo-rows plus mined session context. */\nexport function parseCodexRollout(text: string): CodexParseOutput {\n const rows: PseudoRow[] = [];\n const extras: CodexParseOutput[\"extras\"] = {};\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n let rec: unknown;\n try {\n rec = JSON.parse(line);\n } catch {\n continue;\n }\n if (!rec || typeof rec !== \"object\" || Array.isArray(rec)) continue;\n const record = rec as Record<string, unknown>;\n const rtype = record.type;\n const payload = (\n record.payload && typeof record.payload === \"object\" ? record.payload : {}\n ) as Record<string, unknown>;\n const ts = parseTimestamp(record.timestamp);\n const ptype = payload.type;\n\n if (rtype === \"session_meta\") {\n if (typeof payload.cwd === \"string\" && payload.cwd && !extras.cwd) {\n extras.cwd = payload.cwd;\n }\n const created = parseTimestamp(payload.timestamp) ?? ts;\n if (created && !extras.createdAt) extras.createdAt = created;\n const git = payload.git;\n if (git && typeof git === \"object\" && !Array.isArray(git)) {\n const branch = (git as Record<string, unknown>).branch;\n if (typeof branch === \"string\" && branch && !extras.gitBranch) {\n extras.gitBranch = branch;\n }\n }\n continue;\n }\n if (rtype === \"turn_context\") {\n if (typeof payload.cwd === \"string\" && payload.cwd && !extras.cwd) {\n extras.cwd = payload.cwd;\n }\n if (typeof payload.model === \"string\" && payload.model && !extras.model) {\n extras.model = payload.model;\n }\n continue;\n }\n if (rtype === \"event_msg\") {\n const reasoning = typeof payload.text === \"string\" ? payload.text : \"\";\n if (ptype === \"agent_reasoning\" && reasoning.trim()) {\n rows.push({\n role: \"assistant\",\n turnType: \"assistant_thinking\",\n content: reasoning,\n timestamp: ts,\n });\n }\n continue; // user_message/agent_message duplicate response items; rest is transport\n }\n if (rtype !== \"response_item\") continue;\n\n if (ptype === \"message\") {\n const role = payload.role;\n const body = blocksText(payload.content);\n if (role === \"user\") {\n const head = body.trimStart();\n if (CODEX_INJECTED_PREFIXES.some((prefix) => head.startsWith(prefix))) {\n continue; // system-prompt-class injection\n }\n rows.push({\n role: \"user\",\n turnType: \"user_prompt\",\n content: body,\n timestamp: ts,\n });\n } else if (role === \"assistant\") {\n rows.push({\n role: \"assistant\",\n turnType: \"assistant_response\",\n content: body,\n timestamp: ts,\n });\n }\n // developer-role messages are the agent's instruction surface → dropped\n } else if (ptype === \"function_call\") {\n rows.push({\n role: \"tool_use\",\n turnType: \"tool_use\",\n timestamp: ts,\n toolName: typeof payload.name === \"string\" ? payload.name : undefined,\n toolCallId:\n typeof payload.call_id === \"string\" ? payload.call_id : undefined,\n toolInputJson:\n (typeof payload.arguments === \"string\" && payload.arguments) || \"{}\",\n });\n } else if (ptype === \"custom_tool_call\") {\n rows.push({\n role: \"tool_use\",\n turnType: \"tool_use\",\n timestamp: ts,\n toolName: typeof payload.name === \"string\" ? payload.name : undefined,\n toolCallId:\n typeof payload.call_id === \"string\" ? payload.call_id : undefined,\n toolInputJson: JSON.stringify({ input: payload.input ?? \"\" }),\n });\n } else if (ptype === \"web_search_call\") {\n const args: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (key !== \"type\" && key !== \"call_id\" && key !== \"status\") {\n args[key] = value;\n }\n }\n rows.push({\n role: \"tool_use\",\n turnType: \"tool_use\",\n timestamp: ts,\n toolName: \"web_search\",\n toolCallId:\n typeof payload.call_id === \"string\" ? payload.call_id : undefined,\n toolInputJson: JSON.stringify(args),\n });\n } else if (\n ptype === \"function_call_output\" ||\n ptype === \"custom_tool_call_output\"\n ) {\n let output: unknown = payload.output;\n if (Array.isArray(output)) {\n // content-block list form\n output = blocksText(output) || JSON.stringify(output);\n } else if (output && typeof output === \"object\") {\n const content = (output as Record<string, unknown>).content;\n output = content || JSON.stringify(output);\n }\n if (typeof output !== \"string\") {\n output = output == null ? \"\" : String(output);\n }\n rows.push({\n role: \"tool_result\",\n turnType: \"tool_result\",\n content: (output as string) || \"\",\n timestamp: ts,\n toolCallId:\n typeof payload.call_id === \"string\" ? payload.call_id : undefined,\n });\n }\n }\n return { rows, extras };\n}\n\nfunction sessionIdFromPath(path: string): string {\n // rollout-YYYY-MM-DDThh-mm-ss-<uuid>.jsonl → YYYY-MM-DDThh-mm-ss-<uuid>\n return basename(path)\n .replace(/\\.jsonl$/, \"\")\n .replace(/^rollout-/, \"\");\n}\n\ninterface ParsedSessionFile {\n session: DiscoveredSession;\n records: NormalizedRecord[];\n}\n\nfunction parseSessionFile(path: string): ParsedSessionFile | null {\n const info = statOrNull(path);\n if (!info?.isFile()) return null;\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n const { rows, extras } = parseCodexRollout(text);\n const context: SessionContext = {\n source: \"codex\",\n cwd: extras.cwd,\n gitBranch: extras.gitBranch,\n model: extras.model,\n createdAt: extras.createdAt ?? new Date(info.mtimeMs),\n };\n const result = normalizeSessionRows(rows, context);\n const session = buildDiscoveredSession(\n \"codex\",\n sessionIdFromPath(path),\n path,\n info.mtimeMs,\n result,\n );\n if (!session || !result.records) return null;\n return { session, records: result.records };\n}\n\n/**\n * Trajectory source for local Codex CLI sessions. `storeDir` overrides the\n * default store (~/.codex/sessions), mainly for tests.\n */\nexport function createCodexSource(storeDir?: string): TrajectorySource {\n const root = storeDir ?? join(homedir(), \".codex\", \"sessions\");\n const isRollout = (name: string) =>\n name.startsWith(\"rollout-\") && name.endsWith(\".jsonl\");\n\n return {\n type: \"codex\",\n\n async discover(locator?: string): Promise<DiscoveredSession[]> {\n let files: string[];\n if (!locator) {\n files = listFilesRecursive(root, isRollout);\n } else {\n const info = statOrNull(locator);\n if (info?.isFile()) {\n files = [locator];\n } else if (info?.isDirectory()) {\n // Date dir or store dir — rollouts live below either.\n files = listFilesRecursive(locator, isRollout);\n } else {\n const all = listFilesRecursive(root, isRollout).map((path) => ({\n sessionId: sessionIdFromPath(path),\n path,\n }));\n const matches = matchSessionIds(locator, all);\n if (matches.length === 0) {\n throw new Error(`No Codex session matches \"${locator}\" in ${root}`);\n }\n files = matches.map((m) => m.path);\n }\n }\n const sessions: DiscoveredSession[] = [];\n for (const file of files) {\n const parsed = parseSessionFile(file);\n if (parsed) sessions.push(parsed.session);\n }\n sessions.sort((a, b) => a.mtimeMs - b.mtimeMs);\n return sessions;\n },\n\n async normalize(session: DiscoveredSession): Promise<NormalizedSession> {\n const parsed = parseSessionFile(session.path);\n if (!parsed) {\n throw new Error(\n `Could not normalize Codex session ${session.sessionId} at ${session.path}`,\n );\n }\n return { session, records: parsed.records };\n },\n };\n}\n",
40
+ "// Letta agent conversations → normalized-v1.\n//\n// Reads the locally recorded reflection transcript for one agent conversation\n// (`{transcriptRoot}/{agentId}/{conversationId}/transcript.jsonl`, one entry\n// per line: user / assistant / reasoning / error prose rows and tool_call rows\n// carrying their result inline) and runs it through the shared row pipeline,\n// so a letta conversation normalizes exactly like any external harness\n// session.\n//\n// There is no store-wide discovery: the locator names one conversation as\n// `<agent-id>/<conversation-id>` (callers canonicalize bare agent ids and\n// conversation ids into that form). A letta conversation IS the session — its\n// conversation id is the session id.\n\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { PseudoRow } from \"../normalize-core.js\";\nimport {\n normalizeSessionRows,\n parseTimestamp,\n} from \"../normalize-core.js\";\nimport { statOrNull } from \"../store-utils.js\";\nimport type {\n DiscoveredSession,\n NormalizedSession,\n TrajectorySource,\n} from \"../types.js\";\nimport { estimateTokens } from \"../types.js\";\n\n/** Default transcript root: `$LETTA_TRANSCRIPT_ROOT` when set, else\n * `~/.letta/transcripts`. */\nfunction getTranscriptRoot(): string {\n const fromEnv = process.env.LETTA_TRANSCRIPT_ROOT;\n if (fromEnv) return fromEnv;\n return join(homedir(), \".letta\", \"transcripts\");\n}\n\ninterface LettaTranscriptRow {\n kind?: string;\n text?: string;\n name?: string;\n argsText?: string;\n resultText?: string;\n resultOk?: boolean;\n captured_at?: string;\n}\n\nfunction parseRows(raw: string): LettaTranscriptRow[] {\n const rows: LettaTranscriptRow[] = [];\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as LettaTranscriptRow;\n if (parsed && typeof parsed === \"object\" && parsed.kind) {\n rows.push(parsed);\n }\n } catch {\n // Skip unparseable lines rather than failing the whole conversation.\n }\n }\n return rows;\n}\n\nfunction rowsToPseudoRows(rows: LettaTranscriptRow[]): PseudoRow[] {\n const out: PseudoRow[] = [];\n let n = 0;\n for (const row of rows) {\n const timestamp = parseTimestamp(row.captured_at);\n switch (row.kind) {\n case \"user\":\n if (row.text) {\n out.push({\n role: \"user\",\n turnType: \"user_prompt\",\n content: row.text,\n timestamp,\n });\n }\n break;\n case \"assistant\":\n if (row.text) {\n out.push({\n role: \"assistant\",\n turnType: \"assistant_response\",\n content: row.text,\n timestamp,\n });\n }\n break;\n case \"reasoning\":\n if (row.text) {\n out.push({\n role: \"assistant\",\n turnType: \"assistant_thinking\",\n content: row.text,\n timestamp,\n });\n }\n break;\n case \"tool_call\": {\n n += 1;\n const callId = `letta_${n}`;\n out.push({\n role: \"tool_use\",\n turnType: \"tool_use\",\n timestamp,\n toolName: row.name,\n toolCallId: callId,\n toolInputJson: row.argsText || \"{}\",\n });\n if (row.resultText !== undefined) {\n const content =\n row.resultOk === false && !/^error/i.test(row.resultText)\n ? `Error: ${row.resultText}`\n : row.resultText;\n out.push({\n role: \"tool_result\",\n turnType: \"tool_result\",\n content,\n timestamp,\n toolCallId: callId,\n });\n }\n break;\n }\n default:\n // \"error\" rows and unknown kinds carry no conversational content.\n break;\n }\n }\n return out;\n}\n\nfunction timestampsFromRows(rows: LettaTranscriptRow[]): string[] {\n return rows\n .map((row) => row.captured_at)\n .filter((t): t is string => typeof t === \"string\" && t.length > 0);\n}\n\nexport function createLettaSource(transcriptRoot?: string): TrajectorySource {\n const root = () => transcriptRoot ?? getTranscriptRoot();\n\n const discoverOne = (locator: string): DiscoveredSession[] => {\n const sep = locator.indexOf(\"/\");\n if (sep <= 0 || sep === locator.length - 1) {\n throw new Error(\n `Invalid letta locator \"${locator}\": expected <agent-id>/<conversation-id>`,\n );\n }\n const agentId = locator.slice(0, sep);\n const conversationId = locator.slice(sep + 1);\n const transcriptPath = join(\n root(),\n agentId,\n conversationId,\n \"transcript.jsonl\",\n );\n const info = statOrNull(transcriptPath);\n if (!info?.isFile()) {\n throw new Error(\n `No recorded transcript for conversation \"${conversationId}\" of ${agentId} (${transcriptPath})`,\n );\n }\n const raw = readFileSync(transcriptPath, \"utf-8\");\n const rows = parseRows(raw);\n const timestamps = timestampsFromRows(rows);\n if (rows.length === 0 || timestamps.length === 0) {\n return [];\n }\n return [\n {\n harness: \"letta\",\n sessionId: conversationId,\n path: transcriptPath,\n startTime: timestamps[0] ?? \"\",\n endTime: timestamps[timestamps.length - 1] ?? \"\",\n estTokens: estimateTokens(raw),\n recordCount: rows.length,\n mtimeMs: info.mtimeMs,\n },\n ];\n };\n\n return {\n type: \"letta\",\n async discover(locator?: string): Promise<DiscoveredSession[]> {\n if (!locator) {\n throw new Error(\n 'The \"letta\" source needs a locator: letta:<conversation-id>, ' +\n \"letta:<agent-id> (its default conversation), or \" +\n \"letta:<agent-id>/<conversation-id>\",\n );\n }\n return discoverOne(locator);\n },\n async normalize(session: DiscoveredSession): Promise<NormalizedSession> {\n const raw = readFileSync(session.path, \"utf-8\");\n const rows = rowsToPseudoRows(parseRows(raw));\n const result = normalizeSessionRows(rows, { source: \"letta\" });\n if (result.status !== \"ok\" || !result.records) {\n throw new Error(\n `Could not normalize letta conversation ${session.sessionId}: ${result.status}`,\n );\n }\n return { session, records: result.records };\n },\n };\n}\n",
41
+ "// OpenHands conversation events → normalized-v1.\n//\n// MessageEvents become user/assistant prose, an\n// ActionEvent's `thought` (batched tool-call turns produce no MessageEvent —\n// the assistant text rides on the first ActionEvent) becomes a reasoning\n// record, ActionEvents become tool_calls, and ObservationEvent /\n// AgentErrorEvent / UserRejectObservation become tool results linked back via\n// tool_call_id (or via the observation's action_id when the call id is\n// absent).\n//\n// There is no default local store: discovery requires a locator naming either\n// a single JSON events file (an array, or the `{items: [...]}` events-API\n// envelope), a conversation directory (with an `events/` subdir or the\n// `events/` dir itself, one `event-<seq>-<uuid>.json` per event), or a store\n// directory containing several conversation directories.\n\nimport { readdirSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport type {\n PseudoRow,\n SessionContext,\n} from \"../normalize-core.js\";\nimport {\n normalizeSessionRows,\n parseTimestamp,\n} from \"../normalize-core.js\";\nimport {\n buildDiscoveredSession,\n statOrNull,\n} from \"../store-utils.js\";\nimport type {\n DiscoveredSession,\n NormalizedRecord,\n NormalizedSession,\n TrajectorySource,\n} from \"../types.js\";\n\ninterface OpenHandsTextContent {\n type?: string;\n text?: string;\n}\n\ninterface OpenHandsEvent {\n kind?: string;\n id?: string;\n timestamp?: string;\n source?: string;\n llm_message?: {\n role?: string;\n content?: OpenHandsTextContent[];\n };\n // ActionEvent fields\n thought?: OpenHandsTextContent[];\n action?: Record<string, unknown> | null;\n tool_name?: string;\n tool_call_id?: string;\n tool_call?: { arguments?: string } | null;\n // ObservationEvent / result fields\n action_id?: string;\n observation?: {\n content?: OpenHandsTextContent[];\n is_error?: boolean;\n } | null;\n error?: string;\n rejection_reason?: string;\n}\n\nfunction joinTextContent(content: OpenHandsTextContent[] | undefined): string {\n if (!Array.isArray(content)) return \"\";\n return content\n .filter((item) => item?.type === \"text\" && typeof item.text === \"string\")\n .map((item) => item.text)\n .join(\"\");\n}\n\n/**\n * OpenHands timestamps are naive local datetimes (no timezone suffix) in most\n * deployments. Treat suffix-less timestamps as UTC so ordering is stable.\n */\nfunction eventTimestamp(event: OpenHandsEvent): Date | null {\n return parseTimestamp(event.timestamp);\n}\n\nfunction extractToolResultText(event: OpenHandsEvent): string | null {\n switch (event.kind) {\n case \"ObservationEvent\":\n return joinTextContent(event.observation?.content);\n case \"AgentErrorEvent\":\n return event.error ?? \"\";\n case \"UserRejectObservation\":\n return event.rejection_reason ?? \"\";\n default:\n return null;\n }\n}\n\nfunction actionArgsText(event: OpenHandsEvent): string | undefined {\n const raw = event.tool_call?.arguments;\n if (typeof raw === \"string\" && raw.length > 0) return raw;\n if (event.action && typeof event.action === \"object\") {\n const { kind: _kind, ...rest } = event.action;\n return JSON.stringify(rest);\n }\n return undefined;\n}\n\n/**\n * Convert OpenHands conversation events into pseudo-rows. Non-conversational\n * events (system prompts, state updates, condensation, streaming deltas) are\n * skipped.\n */\nexport function openHandsEventsToRows(events: OpenHandsEvent[]): PseudoRow[] {\n const rows: PseudoRow[] = [];\n // Observation events may reference the action by action_id instead of\n // carrying a tool_call_id; remember each action's call id.\n const callIdByActionId = new Map<string, string>();\n\n for (const event of events) {\n if (!event.id) continue;\n const ts = eventTimestamp(event);\n\n if (event.kind === \"MessageEvent\") {\n if (event.source !== \"user\" && event.source !== \"agent\") continue;\n const text = joinTextContent(event.llm_message?.content);\n if (!text) continue;\n rows.push(\n event.source === \"user\"\n ? {\n role: \"user\",\n turnType: \"user_prompt\",\n content: text,\n timestamp: ts,\n }\n : {\n role: \"assistant\",\n turnType: \"assistant_response\",\n content: text,\n timestamp: ts,\n },\n );\n continue;\n }\n\n if (event.kind === \"ActionEvent\") {\n // Batched tool-call turns produce no MessageEvent; the assistant text\n // rides on the first ActionEvent's `thought`.\n const thought = joinTextContent(event.thought);\n if (thought) {\n rows.push({\n role: \"assistant\",\n turnType: \"assistant_thinking\",\n content: thought,\n timestamp: ts,\n });\n }\n const callId = event.tool_call_id || `oh_${event.id}`;\n callIdByActionId.set(event.id, callId);\n rows.push({\n role: \"tool_use\",\n turnType: \"tool_use\",\n timestamp: ts,\n toolName: event.tool_name,\n toolCallId: callId,\n toolInputJson: actionArgsText(event) ?? \"{}\",\n });\n continue;\n }\n\n const resultText = extractToolResultText(event);\n if (resultText !== null) {\n const callId =\n event.tool_call_id ||\n (event.action_id ? callIdByActionId.get(event.action_id) : undefined);\n rows.push({\n role: \"tool_result\",\n turnType: \"tool_result\",\n content: resultText,\n timestamp: ts,\n toolCallId: callId,\n });\n }\n }\n return rows;\n}\n\nfunction parseEventsFile(raw: string, path: string): OpenHandsEvent[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n parsed = null;\n }\n if (Array.isArray(parsed)) return parsed as OpenHandsEvent[];\n if (\n parsed &&\n typeof parsed === \"object\" &&\n Array.isArray((parsed as { items?: unknown[] }).items)\n ) {\n return (parsed as { items: OpenHandsEvent[] }).items;\n }\n throw new Error(\n `Could not parse ${path}: expected a JSON array of events or {\"items\": [...]}`,\n );\n}\n\n/** The `<seq>` in `event-<seq>-<uuid>.json` — the durable ordering key. */\nfunction eventSequence(fileName: string): number {\n const digits = fileName.match(/^event-(\\d+)-/)?.[1];\n return digits ? Number.parseInt(digits, 10) : 0;\n}\n\nconst EVENT_FILE_RE = /^event-\\d+-.*\\.json$/;\n\n/** Resolve a conversation dir (or the events/ dir itself) to its events dir,\n * or null when it holds no event files. */\nfunction resolveEventsDir(dir: string): string | null {\n const nested = join(dir, \"events\");\n for (const candidate of [nested, dir]) {\n const info = statOrNull(candidate);\n if (!info?.isDirectory()) continue;\n try {\n if (readdirSync(candidate).some((name) => EVENT_FILE_RE.test(name))) {\n return candidate;\n }\n } catch {\n // unreadable — keep looking\n }\n }\n return null;\n}\n\ninterface LoadedEvents {\n events: OpenHandsEvent[];\n mtimeMs: number;\n}\n\n/** Read one conversation's events from a directory of event-*.json files. */\nfunction readEventDir(eventsDir: string): LoadedEvents {\n const fileNames = readdirSync(eventsDir)\n .filter((name) => EVENT_FILE_RE.test(name))\n .sort((a, b) => eventSequence(a) - eventSequence(b));\n const events: OpenHandsEvent[] = [];\n let mtimeMs = statOrNull(eventsDir)?.mtimeMs ?? 0;\n for (const name of fileNames) {\n const path = join(eventsDir, name);\n const info = statOrNull(path);\n if (info && info.mtimeMs > mtimeMs) mtimeMs = info.mtimeMs;\n let event: unknown;\n try {\n event = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n continue;\n }\n if (event && typeof event === \"object\" && !Array.isArray(event)) {\n events.push(event as OpenHandsEvent);\n }\n }\n return { events, mtimeMs };\n}\n\n/** Load a session locator (events file or conversation/events dir). */\nfunction loadEvents(path: string): LoadedEvents | null {\n const info = statOrNull(path);\n if (!info) return null;\n if (info.isDirectory()) {\n const eventsDir = resolveEventsDir(path);\n if (!eventsDir) return null;\n return readEventDir(eventsDir);\n }\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n return { events: parseEventsFile(raw, path), mtimeMs: info.mtimeMs };\n}\n\nfunction sessionIdForPath(path: string, isDir: boolean): string {\n const name = basename(path);\n if (!isDir) return name.replace(/\\.json$/, \"\");\n // For `<conversation-id>/events` locators the conversation dir is the id.\n return name === \"events\" ? basename(dirname(path)) : name;\n}\n\ninterface ParsedSession {\n session: DiscoveredSession;\n records: NormalizedRecord[];\n}\n\nfunction parseSessionPath(path: string): ParsedSession | null {\n const info = statOrNull(path);\n if (!info) return null;\n let loaded: LoadedEvents | null;\n try {\n loaded = loadEvents(path);\n } catch {\n return null;\n }\n if (!loaded || loaded.events.length === 0) return null;\n const rows = openHandsEventsToRows(loaded.events);\n const context: SessionContext = {\n source: \"openhands\",\n createdAt: new Date(loaded.mtimeMs),\n };\n const result = normalizeSessionRows(rows, context);\n const session = buildDiscoveredSession(\n \"openhands\",\n sessionIdForPath(path, info.isDirectory()),\n path,\n loaded.mtimeMs,\n result,\n );\n if (!session || !result.records) return null;\n return { session, records: result.records };\n}\n\n/**\n * Trajectory source for OpenHands conversation exports. There is no default\n * local store, so `discover` requires a locator.\n */\nexport function createOpenHandsSource(): TrajectorySource {\n return {\n type: \"openhands\",\n\n async discover(locator?: string): Promise<DiscoveredSession[]> {\n if (!locator) {\n throw new Error(\n \"The openhands source has no default local store; pass a locator \" +\n \"(an events JSON file, a conversation directory, or a directory \" +\n \"of conversations), e.g. --from openhands:<path>\",\n );\n }\n const info = statOrNull(locator);\n if (!info) {\n throw new Error(`No such OpenHands session path: ${locator}`);\n }\n\n // A single events file or a single conversation directory.\n if (info.isFile() || resolveEventsDir(locator)) {\n const parsed = parseSessionPath(locator);\n return parsed ? [parsed.session] : [];\n }\n\n // A store directory: each child dir with events is a conversation.\n const sessions: DiscoveredSession[] = [];\n let children: string[] = [];\n try {\n children = readdirSync(locator).sort();\n } catch {\n children = [];\n }\n for (const child of children) {\n const childPath = join(locator, child);\n if (!statOrNull(childPath)?.isDirectory()) continue;\n if (!resolveEventsDir(childPath)) continue;\n const parsed = parseSessionPath(childPath);\n if (parsed) sessions.push(parsed.session);\n }\n if (sessions.length === 0) {\n throw new Error(\n `No OpenHands event files (event-*.json) found under ${locator}`,\n );\n }\n sessions.sort((a, b) => a.mtimeMs - b.mtimeMs);\n return sessions;\n },\n\n async normalize(session: DiscoveredSession): Promise<NormalizedSession> {\n const parsed = parseSessionPath(session.path);\n if (!parsed) {\n throw new Error(\n `Could not normalize OpenHands session ${session.sessionId} at ${session.path}`,\n );\n }\n return { session, records: parsed.records };\n },\n };\n}\n",
42
+ "// Passthrough source for transcripts already in the normalized-v1 format:\n// `.json` files whose content is a record array (optional leading meta).\n// Reading/validation ported from `loadSessionTrace`/`listJsonFiles` in the\n// batch-reflection prototype's batching.ts.\n\nimport { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport {\n listFilesRecursive,\n statOrNull,\n} from \"../store-utils.js\";\nimport type {\n DiscoveredSession,\n NormalizedRecord,\n NormalizedSession,\n TrajectorySource,\n} from \"../types.js\";\nimport {\n estimateTokens,\n isNormalizedRecordArray,\n} from \"../types.js\";\n\ninterface LoadedTranscript {\n session: DiscoveredSession;\n records: NormalizedRecord[];\n}\n\n/** Load a single normalized transcript file, or null if the file is not a\n * normalized-v1 transcript. */\nfunction loadTranscriptFile(path: string): LoadedTranscript | null {\n const info = statOrNull(path);\n if (!info?.isFile()) return null;\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!isNormalizedRecordArray(parsed) || parsed.length === 0) return null;\n const records = parsed;\n const meta = records[0]?.role === \"meta\" ? records[0] : undefined;\n const body = records.filter((r) => r.role !== \"meta\");\n if (body.length === 0) return null;\n const timestamps = body\n .map((r) => r.timestamp)\n .filter((t): t is string => typeof t === \"string\");\n const startTime = timestamps[0];\n const endTime = timestamps[timestamps.length - 1];\n if (!startTime || !endTime) return null;\n return {\n session: {\n harness: \"transcript\",\n sessionId: basename(path).replace(/\\.json$/, \"\"),\n path,\n startTime,\n endTime,\n estTokens: estimateTokens(raw),\n recordCount: body.length,\n mtimeMs: info.mtimeMs,\n ...(meta?.cwd ? { cwd: meta.cwd } : {}),\n },\n records,\n };\n}\n\n/**\n * Trajectory source for normalized-v1 transcript files: a single `.json`\n * file, or a directory tree of them. There is no default store, so `discover`\n * requires a locator.\n */\nexport function createTranscriptFileSource(): TrajectorySource {\n return {\n type: \"transcript\",\n\n async discover(locator?: string): Promise<DiscoveredSession[]> {\n if (!locator) {\n throw new Error(\n \"The transcript source has no default local store; pass a locator \" +\n \"(a normalized-v1 .json file or a directory of them), \" +\n \"e.g. --from transcript:<path>\",\n );\n }\n const info = statOrNull(locator);\n if (!info) {\n throw new Error(`No such transcript path: ${locator}`);\n }\n const files = info.isDirectory()\n ? listFilesRecursive(locator, (name) => name.endsWith(\".json\"))\n : [locator];\n const sessions: DiscoveredSession[] = [];\n for (const file of files) {\n const loaded = loadTranscriptFile(file);\n if (loaded) sessions.push(loaded.session);\n }\n sessions.sort((a, b) => a.startTime.localeCompare(b.startTime));\n return sessions;\n },\n\n async normalize(session: DiscoveredSession): Promise<NormalizedSession> {\n const loaded = loadTranscriptFile(session.path);\n if (!loaded) {\n throw new Error(`Not a normalized-v1 transcript: ${session.path}`);\n }\n return { session, records: loaded.records };\n },\n };\n}\n",
43
+ "// Registry of the built-in trajectory sources, keyed by the scheme used in\n// `--from <type>[:<locator>]`.\n\nimport { createClaudeCodeSource } from \"./sources/claude-code.js\";\nimport { createCodexSource } from \"./sources/codex.js\";\nimport { createLettaSource } from \"./sources/letta.js\";\nimport { createOpenHandsSource } from \"./sources/openhands.js\";\nimport { createTranscriptFileSource } from \"./sources/transcript-file.js\";\nimport type { TrajectorySource } from \"./types.js\";\n\nconst FACTORIES: Record<string, () => TrajectorySource> = {\n claude: () => createClaudeCodeSource(),\n codex: () => createCodexSource(),\n letta: () => createLettaSource(),\n openhands: () => createOpenHandsSource(),\n transcript: () => createTranscriptFileSource(),\n};\n\nexport function getTrajectorySource(type: string): TrajectorySource {\n const factory = FACTORIES[type];\n if (!factory) {\n throw new Error(\n `Unknown trajectory source type \"${type}\". Supported types: ${Object.keys(\n FACTORIES,\n ).join(\", \")}`,\n );\n }\n return factory();\n}\n\nexport function listTrajectorySourceTypes(): string[] {\n return Object.keys(FACTORIES);\n}\n",
44
+ "// Public transcript collection: discover sessions from one or more harness\n// stores, select a bounded recent set from each source spec, and return\n// normalized in-memory snapshots ready for dream().\n\nimport { getTrajectorySource } from \"./registry.js\";\nimport { sessionKey } from \"./select.js\";\nimport type {\n DiscoveredSession,\n NormalizedRecord,\n NormalizedSession,\n} from \"./types.js\";\nimport { estimateTokens } from \"./types.js\";\nimport { validateRecords } from \"./normalize-core.js\";\n\nexport interface TranscriptSourceSpec {\n type: string;\n /** A source-specific file, directory, session id, or conversation locator. */\n locator?: string;\n /** Keep the latest N eligible sessions from this source spec. */\n limit?: number;\n}\n\nexport interface CollectTranscriptsOptions {\n sources: TranscriptSourceSpec[];\n /**\n * Include sessions containing activity strictly after this instant. The\n * cutoff is applied to endTime; the full transcript is retained for context.\n */\n after?: Date | string;\n}\n\n/** A fully normalized transcript plus its source-session metadata. */\nexport type Transcript = NormalizedSession;\n\nfunction timestampMs(value: string, label: string): number {\n const result = Date.parse(value);\n if (Number.isNaN(result)) {\n throw new Error(`Invalid ${label} timestamp: ${JSON.stringify(value)}`);\n }\n return result;\n}\n\nfunction cutoffMs(after: Date | string | undefined): number {\n if (after === undefined) return Number.NEGATIVE_INFINITY;\n const result = after instanceof Date ? after.getTime() : Date.parse(after);\n if (Number.isNaN(result)) {\n throw new Error(`Invalid transcript cutoff: ${JSON.stringify(after)}`);\n }\n return result;\n}\n\nfunction validateLimit(spec: TranscriptSourceSpec): void {\n if (\n spec.limit !== undefined &&\n (!Number.isInteger(spec.limit) || spec.limit <= 0)\n ) {\n throw new Error(\n `Transcript source ${JSON.stringify(spec.type)} limit must be a positive integer`,\n );\n }\n}\n\nfunction compareSessionsByRecency(\n a: DiscoveredSession,\n b: DiscoveredSession,\n): number {\n return (\n timestampMs(a.endTime, \"session endTime\") -\n timestampMs(b.endTime, \"session endTime\") ||\n timestampMs(a.startTime, \"session startTime\") -\n timestampMs(b.startTime, \"session startTime\") ||\n a.harness.localeCompare(b.harness) ||\n a.sessionId.localeCompare(b.sessionId) ||\n a.path.localeCompare(b.path)\n );\n}\n\nfunction compareTranscriptsChronologically(\n a: Transcript,\n b: Transcript,\n): number {\n return (\n timestampMs(a.session.startTime, \"session startTime\") -\n timestampMs(b.session.startTime, \"session startTime\") ||\n timestampMs(a.session.endTime, \"session endTime\") -\n timestampMs(b.session.endTime, \"session endTime\") ||\n a.session.harness.localeCompare(b.session.harness) ||\n a.session.sessionId.localeCompare(b.session.sessionId) ||\n a.session.path.localeCompare(b.session.path)\n );\n}\n\nfunction cloneRecords(records: NormalizedRecord[]): NormalizedRecord[] {\n return records.map((record) => ({\n ...record,\n ...(record.tool_calls\n ? { tool_calls: record.tool_calls.map((call) => ({ ...call })) }\n : {}),\n }));\n}\n\nfunction normalizedSnapshot(normalized: NormalizedSession): Transcript {\n const records = cloneRecords(normalized.records);\n const problem = validateRecords(records);\n if (problem) {\n throw new Error(\n `Invalid normalized transcript ${sessionKey(normalized.session)}: ${problem}`,\n );\n }\n\n const body = records.filter((record) => record.role !== \"meta\");\n const startTime = body[0]?.timestamp;\n const endTime = body[body.length - 1]?.timestamp;\n if (!startTime || !endTime) {\n throw new Error(\n `Invalid normalized transcript ${sessionKey(normalized.session)}: missing time bounds`,\n );\n }\n const meta = records[0]?.role === \"meta\" ? records[0] : undefined;\n const json = JSON.stringify(records);\n\n return {\n session: {\n ...normalized.session,\n startTime,\n endTime,\n estTokens: estimateTokens(json),\n recordCount: body.length,\n ...(meta?.cwd ? { cwd: meta.cwd } : {}),\n },\n records,\n };\n}\n\nfunction dedupeDiscovered(\n sessions: DiscoveredSession[],\n): DiscoveredSession[] {\n const byKey = new Map<string, DiscoveredSession>();\n for (const session of [...sessions].sort(compareSessionsByRecency)) {\n // Later entries win, which deterministically keeps the newest snapshot\n // when a source reports the same logical session more than once.\n byKey.set(sessionKey(session), session);\n }\n return [...byKey.values()];\n}\n\n/**\n * Collect normalized transcript snapshots from local trajectory sources.\n *\n * Source specs are independent: the cutoff and each spec's limit are applied\n * before results are combined. Overlapping specs are deduplicated by stable\n * harness/session identity, and the returned list is globally chronological.\n */\nexport async function collectTranscripts(\n options: CollectTranscriptsOptions,\n): Promise<Transcript[]> {\n const afterMs = cutoffMs(options.after);\n const collected = new Map<string, Transcript>();\n\n for (const spec of options.sources) {\n validateLimit(spec);\n const source = getTrajectorySource(spec.type);\n // Deliberately call the source directly. In particular, a Claude/Codex\n // locator names exactly what discover() resolves; it never expands into\n // an implicit range of later sessions.\n const discovered = await source.discover(spec.locator);\n const eligible = dedupeDiscovered(discovered)\n .filter(\n (session) =>\n timestampMs(session.endTime, \"session endTime\") > afterMs,\n )\n .sort(compareSessionsByRecency);\n const selected =\n spec.limit === undefined ? eligible : eligible.slice(-spec.limit);\n\n for (const session of selected) {\n const normalized = normalizedSnapshot(await source.normalize(session));\n const key = sessionKey(normalized.session);\n if (!collected.has(key)) collected.set(key, normalized);\n }\n }\n\n return [...collected.values()].sort(compareTranscriptsChronologically);\n}\n"
21
45
  ],
22
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAMA;AACA;AAIA,SAAS,MAAM,CAAC,QAAgB,MAAiB;AAAA,EAC/C,IAAI,QAAQ,IAAI;AAAA,IAAW,QAAQ,MAAM,oBAAoB,QAAQ,GAAG,IAAI;AAAA;AAG9E,IAAM,uBAAuB;AAE7B,SAAS,2BAA2B,CAAC,SAA0C;AAAA,EAC7E,OAAO,QAAQ,eAAe;AAAA;AAGhC,SAAS,wBAAwB,CAAC,MAAsC;AAAA,EACtE,MAAM,iBAA2B,CAAC;AAAA,EAClC,IAAI,eAAe;AAAA,EAEnB,WAAW,OAAO,QAAQ,CAAC,GAAG;AAAA,IAC5B,IAAI,QAAQ,sBAAsB;AAAA,MAChC,IAAI;AAAA,QAAc;AAAA,MAClB,eAAe;AAAA,IACjB;AAAA,IACA,eAAe,KAAK,GAAG;AAAA,EACzB;AAAA,EAEA,IAAI,CAAC,cAAc;AAAA,IACjB,eAAe,KAAK,oBAAoB;AAAA,EAC1C;AAAA,EAEA,OAAO;AAAA;AASF,SAAS,YAAY,CAAC,SAA2C;AAAA,EACtE,MAAM,OAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM,wBAAwB,4BAA4B,OAAO;AAAA,EAGjE,IAAI,QAAQ,gBAAgB;AAAA,IAC1B,KAAK,KAAK,kBAAkB,QAAQ,cAAc;AAAA,EACpD,EAAO,SAAI,QAAQ,SAAS;AAAA,IAC1B,KAAK,KAAK,WAAW,QAAQ,OAAO;AAAA,IACpC,IAAI,QAAQ,iBAAiB;AAAA,MAC3B,KAAK,KAAK,OAAO;AAAA,IACnB,EAAO,SAAI,QAAQ,qBAAqB;AAAA,MACtC,KAAK,KAAK,kBAAkB,SAAS;AAAA,IACvC;AAAA,EACF,EAAO,SAAI,QAAQ,YAAY;AAAA,IAC7B,KAAK,KAAK,aAAa;AAAA,EACzB,EAAO,SAAI,QAAQ,iBAAiB;AAAA,IAClC,KAAK,KAAK,OAAO;AAAA,EACnB;AAAA,EAGA,IAAI,QAAQ,OAAO;AAAA,IACjB,KAAK,KAAK,MAAM,QAAQ,KAAK;AAAA,EAC/B;AAAA,EAGA,IAAI,QAAQ,wBAAwB;AAAA,IAClC,KAAK,KAAK,4BAA4B;AAAA,EACxC;AAAA,EAGA,IAAI,QAAQ,WAAW;AAAA,IACrB,KAAK,KAAK,eAAe,QAAQ,SAAS;AAAA,EAC5C;AAAA,EAGA,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,IAAI,OAAO,QAAQ,iBAAiB,UAAU;AAAA,MAC5C,MAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI,aAAa,SAAS,QAAQ,YAAY,GAAG;AAAA,QAC/C,KAAK,KAAK,YAAY,QAAQ,YAAY;AAAA,MAC5C,EAAO;AAAA,QACL,KAAK,KAAK,mBAAmB,QAAQ,YAAY;AAAA;AAAA,IAErD,EAAO;AAAA,MACL,KAAK,KAAK,YAAY,QAAQ,aAAa,MAAM;AAAA,MACjD,IAAI,QAAQ,aAAa,QAAQ;AAAA,QAC/B,KAAK,KAAK,mBAAmB,QAAQ,aAAa,MAAM;AAAA,MAC1D;AAAA;AAAA,EAEJ;AAAA,EAGA,IAAI,QAAQ,WAAW,aAAa,CAAC,QAAQ,SAAS;AAAA,IACpD,IAAI,QAAQ,OAAO,WAAW,GAAG;AAAA,MAC/B,KAAK,KAAK,iBAAiB,EAAE;AAAA,IAC/B,EAAO;AAAA,MACL,MAAM,cAAwB,CAAC;AAAA,MAC/B,MAAM,mBAGF,CAAC;AAAA,MAEL,WAAW,QAAQ,QAAQ,QAAQ;AAAA,QACjC,IAAI,OAAO,SAAS,UAAU;AAAA,UAC5B,YAAY,KAAK,IAAI;AAAA,QACvB,EAAO,SAAI,aAAa,MAAM;AAAA,UAC5B,iBAAiB,KAAK,IAA2B;AAAA,QACnD,EAAO;AAAA,UACL,iBAAiB,KAAK,IAAwC;AAAA;AAAA,MAElE;AAAA,MAEA,IAAI,iBAAiB,SAAS,GAAG;AAAA,QAC/B,KAAK,KAAK,mBAAmB,KAAK,UAAU,gBAAgB,CAAC;AAAA,QAC7D,IAAI,YAAY,SAAS,GAAG;AAAA,UAC1B,QAAQ,KACN,mDACA,8DAA8D,YAAY,KAAK,IAAI,GACrF;AAAA,QACF;AAAA,MACF,EAAO,SAAI,YAAY,SAAS,GAAG;AAAA,QACjC,KAAK,KAAK,iBAAiB,YAAY,KAAK,GAAG,CAAC;AAAA,MAClD;AAAA;AAAA,EAEJ;AAAA,EAGA,IAAI,CAAC,QAAQ,SAAS;AAAA,IACpB,IAAI,QAAQ,YAAY,WAAW;AAAA,MACjC,KAAK,KAAK,iBAAiB,WAAW,QAAQ,SAAS;AAAA,IACzD;AAAA,IACA,IAAI,QAAQ,UAAU,WAAW;AAAA,MAC/B,KAAK,KAAK,iBAAiB,SAAS,QAAQ,OAAO;AAAA,IACrD;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,mBAAmB,qBAAqB;AAAA,IAClD,KAAK,KAAK,QAAQ;AAAA,EACpB,EAAO,SAAI,QAAQ,kBAAkB,QAAQ,mBAAmB,WAAW;AAAA,IACzE,KAAK,KAAK,qBAAqB,QAAQ,cAAc;AAAA,EACvD;AAAA,EAGA,IAAI,QAAQ,cAAc;AAAA,IACxB,KAAK,KAAK,kBAAkB,QAAQ,aAAa,KAAK,GAAG,CAAC;AAAA,EAC5D;AAAA,EACA,IAAI,QAAQ,iBAAiB;AAAA,IAC3B,KAAK,KAAK,qBAAqB,QAAQ,gBAAgB,KAAK,GAAG,CAAC;AAAA,EAClE;AAAA,EAGA,MAAM,OAAO,wBACT,yBAAyB,QAAQ,IAAI,IACrC,QAAQ;AAAA,EACZ,IAAI,QAAQ,KAAK,SAAS,GAAG;AAAA,IAC3B,KAAK,KAAK,UAAU,KAAK,KAAK,GAAG,CAAC;AAAA,EACpC;AAAA,EAGA,IAAI,uBAAuB;AAAA,IACzB,KAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAGA,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,YAAY,CAAC;AAAA,IACjD,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,KAAK,KAAK,aAAa;AAAA,IACzB,EAAO;AAAA,MACL,KAAK,KAAK,mBAAmB,QAAQ,KAAK,GAAG,CAAC;AAAA;AAAA,EAElD;AAAA,EAGA,IAAI,QAAQ,uBAAuB,OAAO;AAAA,IACxC,KAAK,KAAK,2BAA2B;AAAA,EACvC;AAAA,EAGA,IAAI,QAAQ,UAAU,YAAY,WAAW;AAAA,IAC3C,KAAK,KAAK,wBAAwB,QAAQ,SAAS,OAAO;AAAA,EAC5D;AAAA,EACA,IAAI,QAAQ,UAAU,aAAa,WAAW;AAAA,IAC5C,KAAK,KAAK,yBAAyB,QAAQ,SAAS,QAAQ;AAAA,EAC9D;AAAA,EACA,IAAI,QAAQ,UAAU,cAAc,WAAW;AAAA,IAC7C,KAAK,KAAK,2BAA2B,OAAO,QAAQ,SAAS,SAAS,CAAC;AAAA,EACzE;AAAA,EAEA,OAAO;AAAA;AAAA;AAGF,MAAM,oBAAoB;AAAA,EAYrB;AAAA,EAXF,UAA+B;AAAA,EAC/B,SAA2B;AAAA,EAC3B,eAA8B,CAAC;AAAA,EAC/B,mBAA6D,CAAC;AAAA,EAC9D,SAAS;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,cAAwB,CAAC;AAAA,EAEjC,WAAW,CACD,UAAkC,CAAC,GAC3C;AAAA,IADQ;AAAA;AAAA,OAMJ,QAAO,GAAkB;AAAA,IAC7B,MAAM,OAAO,KAAK,UAAU;AAAA,IAG5B,MAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,IACnC,OAAO,WAAW,QAAQ,SAAS;AAAA,IACnC,OAAO,WAAW,SAAS,KAAK,KAAK,GAAG,GAAG;AAAA,IAC3C,OAAO,WAAW,QAAQ,KAAK,QAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC7D,OAAO,WAAW,mBAAmB,KAAK,QAAQ,kBAAkB,WAAW;AAAA,IAE/E,KAAK,UAAU,MAAM,QAAQ,CAAC,SAAS,GAAG,IAAI,GAAG;AAAA,MAC/C,KAAK,KAAK,QAAQ,OAAO,QAAQ,IAAI;AAAA,MACrC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK,KAAK,QAAQ,IAAI;AAAA,IACxB,CAAC;AAAA,IAED,MAAM,MAAM,KAAK,QAAQ;AAAA,IACzB,OAAO,WAAW,4BAA4B,KAAK;AAAA,IAEnD,IAAI,CAAC,KAAK,QAAQ,UAAU,CAAC,KAAK,QAAQ,OAAO;AAAA,MAC/C,MAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,IAGA,KAAK,SAAS,gBAAgB;AAAA,MAC5B,OAAO,KAAK,QAAQ;AAAA,MACpB,WAAW;AAAA,IACb,CAAC;AAAA,IAED,KAAK,OAAO,GAAG,QAAQ,CAAC,SAAS;AAAA,MAC/B,IAAI,CAAC,KAAK,KAAK;AAAA,QAAG;AAAA,MAClB,IAAI;AAAA,QACF,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,QAC3B,KAAK,cAAc,GAAG;AAAA,QACtB,MAAM;AAAA,QAEN,OAAO,UAAU,cAAc,KAAK,MAAM,GAAG,GAAG,GAAG;AAAA;AAAA,KAEtD;AAAA,IAID,IAAI,KAAK,QAAQ,QAAQ;AAAA,MACvB,KAAK,QAAQ,OAAO,GAAG,QAAQ,CAAC,SAAiB;AAAA,QAC/C,MAAM,MAAM,KAAK,SAAS,EAAE,KAAK;AAAA,QACjC,IAAI,KAAK;AAAA,UACP,QAAQ,MAAM,iCAAiC,GAAG;AAAA,UAClD,KAAK,YAAY,KAAK,GAAG;AAAA,QAC3B;AAAA,OACD;AAAA,IACH;AAAA,IAUA,KAAK,QAAQ,GAAG,SAAS,CAAC,MAAM,WAAW;AAAA,MACzC,IAAI,SAAS,KAAK,SAAS,MAAM;AAAA,QAC/B,QAAQ,MAAM,kDAAkD,MAAM;AAAA,MACxE;AAAA,MACA,OAAO,SAAS,2BAA2B,YAAY,eAAe,uBAAuB,KAAK,mCAAmC,KAAK,gBAAgB,KAAK,IAAI,IAAI,KAAK,gBAAgB,sBAAsB,KAAK,iBAAiB,mBAAmB,KAAK,aAAa,QAAQ;AAAA,MACrR,KAAK,SAAS;AAAA,MAEd,WAAW,WAAW,KAAK,kBAAkB;AAAA,QAC3C,QAAQ,IAAI;AAAA,MACd;AAAA,MACA,KAAK,mBAAmB,CAAC;AAAA,KAC1B;AAAA,IAED,KAAK,QAAQ,GAAG,SAAS,CAAC,QAAQ;AAAA,MAChC,QAAQ,MAAM,wCAAwC,GAAG;AAAA,MACzD,KAAK,SAAS;AAAA,KACf;AAAA;AAAA,OAMG,MAAK,CAAC,MAA6B;AAAA,IACvC,IAAI,CAAC,KAAK,SAAS,SAAS,KAAK,QAAQ;AAAA,MACvC,MAAM,MAAM,IAAI,MAAM,mCAAmC,KAAK,eAAe,KAAK,SAAS,cAAc,CAAC,CAAC,KAAK,SAAS,QAAQ;AAAA,MACjI,OAAO,SAAS,IAAI,OAAO;AAAA,MAC3B,MAAM;AAAA,IACR;AAAA,IACA,MAAM,UAAU;AAAA,IAChB,OAAO,SAAS,QAAQ,QAAQ,gBAAiB,QAAQ,SAAqC,WAAY,QAAQ,UAAsC,WAAW,OAAO;AAAA,IAC1K,KAAK,QAAQ,MAAM,MAAM,KAAK,UAAU,IAAI,IAAI;AAAA,CAAI;AAAA;AAAA,OAMhD,KAAI,GAAgC;AAAA,IAExC,IAAI,KAAK,aAAa,SAAS,GAAG;AAAA,MAChC,OAAO,KAAK,aAAa,MAAM;AAAA,IACjC;AAAA,IAGA,IAAI,KAAK,QAAQ;AAAA,MACf,OAAO,QAAQ,+CAA+C,KAAK,kBAAkB;AAAA,MACrF,OAAO;AAAA,IACT;AAAA,IAGA,OAAO,QAAQ,uCAAuC,KAAK,iBAAiB,SAAS,YAAY,KAAK,aAAa,SAAS;AAAA,IAC5H,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,iBAAiB,KAAK,OAAO;AAAA,KACnC;AAAA;AAAA,SAMI,QAAQ,GAAgC;AAAA,IAC7C,OAAO,MAAM;AAAA,MACX,MAAM,MAAM,MAAM,KAAK,KAAK;AAAA,MAC5B,IAAI,QAAQ,MAAM;AAAA,QAChB,OAAO,YAAY,2BAA2B,KAAK,wBAAwB,KAAK,mBAAmB;AAAA,QACnG;AAAA,MACF;AAAA,MACA,MAAM;AAAA,IACR;AAAA;AAAA,EAMF,KAAK,GAAS;AAAA,IACZ,OAAO,SAAS,uCAAuC,KAAK,sCAAsC,KAAK,iBAAiB,eAAe,KAAK,SAAS,MAAM;AAAA,IAC3J,IAAI,KAAK,SAAS;AAAA,MAChB,KAAK,QAAQ,OAAO,IAAI;AAAA,MACxB,KAAK,QAAQ,KAAK;AAAA,MAClB,KAAK,UAAU;AAAA,IACjB;AAAA,IACA,KAAK,SAAS;AAAA,IAGd,WAAW,WAAW,KAAK,kBAAkB;AAAA,MAC3C,QAAQ,IAAI;AAAA,IACd;AAAA,IACA,KAAK,mBAAmB,CAAC;AAAA;AAAA,MAGvB,QAAQ,GAAY;AAAA,IACtB,OAAO,KAAK;AAAA;AAAA,EAId,SAAS,GAAW;AAAA,IAClB,OAAO,KAAK,YAAY,KAAK;AAAA,CAAI;AAAA;AAAA,EAG3B,aAAa,CAAC,KAAwB;AAAA,IAC5C,KAAK;AAAA,IACL,KAAK,gBAAgB,KAAK,IAAI;AAAA,IAG9B,MAAM,cAAc;AAAA,IACpB,MAAM,UAAU,YAAY,gBAAgB,YAAY,WAAW;AAAA,IACnE,OAAO,QAAQ,IAAI,KAAK,yBAAyB,IAAI,QAAQ,UAAU,YAAY,YAAY,gBAAgB,KAAK,iBAAiB,gBAAgB,KAAK,aAAa,QAAQ;AAAA,IAG/K,IAAI,IAAI,SAAS,UAAU;AAAA,MACzB,MAAM,SAAS;AAAA,MACf,OAAO,QAAQ,mBAAmB,OAAO,uBAAuB,OAAO,eAAe,kBAAkB,OAAO,2BAA2B,OAAO,QAAQ,UAAU,GAAG;AAAA,IACxK;AAAA,IAGA,IAAI,IAAI,SAAS,YAAY,aAAa,OAAO,IAAI,YAAY,QAAQ;AAAA,MACvE,KAAK,UAAW,IAAwC;AAAA,MACxD,OAAO,QAAQ,kBAAkB,KAAK,SAAS;AAAA,IACjD;AAAA,IAGA,IAAI,IAAI,SAAS,mBAAmB;AAAA,MAClC,MAAM,MAAM;AAAA,MACZ,OAAO,QAAQ,uBAAuB,IAAI,sBAAsB,IAAI,SAAS,gBAAgB,IAAI,SAAS,aAAa,OAAO;AAAA,IAChI;AAAA,IAGA,IAAI,KAAK,iBAAiB,SAAS,GAAG;AAAA,MACpC,MAAM,UAAU,KAAK,iBAAiB,MAAM;AAAA,MAC5C,QAAQ,GAAG;AAAA,IACb,EAAO;AAAA,MAEL,KAAK,aAAa,KAAK,GAAG;AAAA;AAAA;AAAA,EAItB,SAAS,GAAa;AAAA,IAC5B,OAAO,aAAa,KAAK,OAAO;AAAA;AAAA,OAKpB,QAAO,GAAoB;AAAA,IAEvC,QAAQ,eAAe,MAAa;AAAA,IACpC,QAAQ,SAAS,SAAS,MAAa;AAAA,IACvC,QAAQ,kBAAkB,MAAa;AAAA,IAGvC,IAAI,QAAQ,IAAI,kBAAkB,WAAW,QAAQ,IAAI,cAAc,GAAG;AAAA,MACxE,OAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,IAKA,IAAI;AAAA,MACF,QAAQ,kCAAkB,MAAa;AAAA,MACvC,MAAM,WAAU,eAAc,YAAY,GAAG;AAAA,MAC7C,MAAM,WAAW,SAAQ,QAAQ,sBAAsB;AAAA,MACvD,IAAI,WAAW,QAAQ,GAAG;AAAA,QACxB,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA,IAKR,MAAM,cAAa,cAAc,YAAY,GAAG;AAAA,IAChD,MAAM,aAAY,QAAQ,WAAU;AAAA,IACpC,MAAM,aAAa;AAAA,MACjB,KAAK,YAAW,qCAAqC;AAAA,MACrD,KAAK,YAAW,mCAAmC;AAAA,MACnD,KAAK,YAAW,8BAA8B;AAAA,IAChD;AAAA,IAEA,WAAW,KAAK,YAAY;AAAA,MAC1B,IAAI,WAAW,CAAC,GAAG;AAAA,QACjB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,MACR,+EACF;AAAA;AAEJ;;;ACxdA,IAAM,6BAA6B,IAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,2BAA2B,IAAI,IAAI,CAAC,mBAAmB,cAAc,CAAC;AAE5E,IAAM,4BAA4B,IAAI,IAAI,CAAC,eAAe,CAAC;AAMpD,SAAS,wBAAwB,CAAC,UAA2B;AAAA,EAClE,OAAO,yBAAyB,IAAI,QAAQ;AAAA;AAGvC,SAAS,uBAAuB,CAAC,UAA2B;AAAA,EACjE,OAAO,0BAA0B,IAAI,QAAQ;AAAA;;;ACwB/C,SAAS,UAAU,CAAC,QAAgB,MAAiB;AAAA,EACnD,IAAI,QAAQ,IAAI;AAAA,IAAW,QAAQ,MAAM,kBAAkB,QAAQ,GAAG,IAAI;AAAA;AAG5E,IAAM,+BAA+B;AACrC,IAAM,yCAAyC;AAC/C,IAAM,uCAAuC;AAE7C,IAAM,wBAAwB,IAAI,IAAkB;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAsC;AAAA,EACjE,OAAO,sBAAsB,IAAI,KAAqB;AAAA;AAGxD,SAAS,cAAc,CAAC,OAAqD;AAAA,EAC3E,IAAI,CAAC,SAAS,MAAM,WAAW;AAAA,IAAG;AAAA,EAClC,OAAO,oBAAoB,KAAK,IAAI,QAAQ;AAAA;AAG9C,SAAS,4BAA4B,CACnC,cACA,SACS;AAAA,EACT,IAAI,CAAC;AAAA,IAAc,OAAO;AAAA,EAC1B,OAAO,aACJ,YAAY,EACZ,SAAS,oCAAoC,UAAU,YAAY,CAAC;AAAA;AAGzE,SAAS,qBAAqB,CAAC,UAAmE;AAAA,EAChG,MAAM,SAAS,UAAU;AAAA,EACzB,IAAI,OAAO,WAAW;AAAA,IAAU;AAAA,EAChC,MAAM,UAAU,OAAO,KAAK;AAAA,EAC5B,OAAO,QAAQ,SAAS,IAAI,UAAU;AAAA;AAGxC,SAAS,wBAAwB,CAAC,QAItB;AAAA,EACV,IAAI,OAAO,eAAe;AAAA,IAAqB,OAAO;AAAA,EAGtD,MAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,OAAO,EAC5C,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC,EAChF,KAAK;AAAA,CAAI,EACT,YAAY;AAAA,EACf,IAAI,CAAC;AAAA,IAAU,OAAO;AAAA,EACtB,OACE,SAAS,SAAS,qCAAqC,KACvD,SAAS,SAAS,2BAA2B,KAC7C,SAAS,SAAS,mBAAmB;AAAA;AAAA;AAUlC,MAAM,QAAmC;AAAA,EA6BpC;AAAA,EA5BF;AAAA,EACA,WAA0B;AAAA,EAC1B,aAA4B;AAAA,EAC5B,kBAAiC;AAAA,EACjC,cAAc;AAAA,EACd,gBAA2C,IAAI;AAAA,EAC/C,cAAuC,CAAC;AAAA,EACxC,kBAAsE,CAAC;AAAA,EACvE,cAAoC;AAAA,EACpC,aAAa;AAAA,EACb,wBAAwB;AAAA,EAKxB,iBAAiB;AAAA,EAGjB,sBAAsB,IAAI;AAAA,EAI1B,yBAAyB,IAAI;AAAA,EAKrC,WAAW,CACD,UAAkC,CAAC,GAC3C;AAAA,IADQ;AAAA,IAGR,IAAI,QAAQ,oBAAoB,WAAW;AAAA,MACzC,MAAM,IAAI,MACR,mIACF;AAAA,IACF;AAAA,IACA,KAAK,YAAY,IAAI,oBAAoB,OAAO;AAAA,IAGhD,IAAI,QAAQ,OAAO;AAAA,MACjB,WAAW,QAAQ,QAAQ,OAAO;AAAA,QAChC,KAAK,cAAc,IAAI,KAAK,MAAM,IAAI;AAAA,MACxC;AAAA,IACF;AAAA;AAAA,OAMI,WAAU,GAA4B;AAAA,IAC1C,IAAI,KAAK,aAAa;AAAA,MACpB,MAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAAA,IAEA,WAAW,QAAQ,yBAAyB;AAAA,IAC5C,MAAM,KAAK,UAAU,QAAQ;AAAA,IAC7B,WAAW,QAAQ,iDAAiD;AAAA,IAGpE,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS,EAAE,SAAS,aAAa;AAAA,IACnC,CAAC;AAAA,IAGD,WAAW,QAAQ,sCAAsC;AAAA,IACzD,iBAAiB,OAAO,KAAK,UAAU,SAAS,GAAG;AAAA,MACjD,WAAW,QAAQ,+BAA+B,IAAI,MAAM;AAAA,MAE5D,IAAI,IAAI,SAAS,mBAAmB;AAAA,QAClC,MAAM,UAAU,MAAM,KAAK,qBAAqB,GAAqB;AAAA,QACrE,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,aAAa;AAAA,UACnB,WAAW,QAAQ,gDAAiD,WAAW,SAAqC,WAAW,OAAO;AAAA,QACxI;AAAA,QACA;AAAA,MACF;AAAA,MAEA,IAAI,IAAI,SAAS,YAAY,aAAa,OAAO,IAAI,YAAY,QAAQ;AAAA,QACvE,MAAM,UAAU;AAAA,QAahB,KAAK,WAAW,QAAQ;AAAA,QACxB,KAAK,aAAa,QAAQ;AAAA,QAC1B,KAAK,kBAAkB,QAAQ;AAAA,QAC/B,KAAK,cAAc;AAAA,QACnB,KAAK,oBAAoB;AAAA,QAGzB,IAAI,KAAK,cAAc,OAAO,GAAG;AAAA,UAC/B,MAAM,KAAK,sBAAsB;AAAA,QACnC;AAAA,QAGA,MAAM,WAAW;AAAA,UACf,GAAG,QAAQ;AAAA,UACX,GAAG,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC;AAAA,QACzC;AAAA,QAEA,WAAW,QAAQ,sBAAsB,QAAQ,yBAAyB,QAAQ,yBAAyB,QAAQ,eAAe,SAAS,WAAW,KAAK,cAAc,gBAAgB;AAAA,QAEzL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,QAAQ;AAAA,UACjB,WAAW,QAAQ;AAAA,UACnB,gBAAgB,QAAQ;AAAA,UACxB,OAAO,QAAQ;AAAA,UACf,OAAO;AAAA,UACP,cAAc,QAAQ;AAAA,UACtB,cAAc,QAAQ;AAAA,UACtB,2BAA2B,QAAQ;AAAA,UACnC,UACE,QAAQ,sBACR,QAAQ,uBACR,OAAO,QAAQ,0BAA0B,WACrC;AAAA,YACE,SAAS,QAAQ;AAAA,YACjB,UAAU,QAAQ;AAAA,YAClB,WAAW,QAAQ;AAAA,UACrB,IACA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,KAAK,UAAU,UAAU;AAAA,IACxC,MAAM,SAAS,SAAS;AAAA;AAAA,EAAkB,WAAW;AAAA,IACrD,WAAW,QAAQ,uDAAuD,QAAQ;AAAA,IAClF,MAAM,IAAI,MAAM,0DAA0D,QAAQ;AAAA;AAAA,OAmB9E,KAAI,CAAC,SAAqC;AAAA,IAC9C,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,WAAW,QAAQ,yCAAyC;AAAA,MAC5D,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IAEA,MAAM,UAAU,OAAO,YAAY,WAC/B,QAAQ,MAAM,GAAG,GAAG,IACpB,MAAM,QAAQ,OAAO,IAAI,gBAAgB,QAAQ,kBAAkB,OAAO,OAAO,EAAE,MAAM,GAAG,GAAG;AAAA,IACnG,WAAW,QAAQ,oBAAoB,UAAU,OAAO,YAAY,YAAY,QAAQ,SAAS,MAAM,QAAQ,IAAI;AAAA,IAGnH,IAAI,KAAK,YAAY,SAAS,GAAG;AAAA,MAC/B,WAAW,QAAQ,YAAY,KAAK,YAAY,0CAA0C;AAAA,MAC1F,KAAK,YAAY,SAAS;AAAA,IAC5B;AAAA,IAEA,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,SAAS,EAAE,MAAM,QAAQ,SAAS,QAAQ;AAAA,IAC5C,CAAC;AAAA,IAKD,KAAK;AAAA,IACL,WAAW,QAAQ,4CAA4C,KAAK,iBAAiB;AAAA;AAAA,OAOjF,QAAO,CACX,SACA,UAA0B,CAAC,GACA;AAAA,IAC3B,MAAM,8BACJ,KAAK,mCAAmC,OAAO;AAAA,IACjD,MAAM,oBAAoB,KAAK,iCAAiC,OAAO;AAAA,IAEvE,IAAI,mBAAmB;AAAA,IACvB,IAAI,SAAS,MAAM,KAAK,cAAc,OAAO;AAAA,IAE7C,OACE,CAAC,OAAO,WACR,OAAO,qBAAqB,QAC5B,mBAAmB,6BACnB;AAAA,MACA,oBAAoB;AAAA,MACpB,MAAM,WAAW,MAAM,KAAK,wBAAwB;AAAA,QAClD,WAAW;AAAA,MACb,CAAC;AAAA,MAED,IAAI,CAAC,SAAS,WAAW;AAAA,QACvB,OAAO,KAAK,iCAAiC,QAAQ;AAAA,UACnD;AAAA,UACA,QAAQ,SAAS;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,MAEA,SAAS,MAAM,KAAK,cAAc,OAAO;AAAA,IAC3C;AAAA,IAEA,IAAI,CAAC,OAAO,WAAW,OAAO,qBAAqB,MAAM;AAAA,MACvD,OAAO,KAAK,iCAAiC,QAAQ,EAAE,iBAAiB,CAAC;AAAA,IAC3E;AAAA,IAEA,IAAI,mBAAmB,GAAG;AAAA,MACxB,OAAO,mBAAmB;AAAA,IAC5B;AAAA,IAEA,OAAO;AAAA;AAAA,OAOH,wBAAuB,CAC3B,UAA0C,CAAC,GACH;AAAA,IACxC,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IAEA,MAAM,YACJ,QAAQ,aACR,KAAK,QAAQ,6BACb;AAAA,IAEF,IAAI,CAAC,OAAO,UAAU,SAAS,KAAK,aAAa,GAAG;AAAA,MAClD,MAAM,IAAI,MACR,iEACF;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,qBAAqB,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA,IAE1F,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,OAAO,MAAM,KAAK,uBAChB,WACA;AAAA,QACE,SAAS;AAAA,WACL,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,WAC/C,KAAK,kBAAkB,EAAE,iBAAiB,KAAK,gBAAgB,IAAI,CAAC;AAAA,MAC1E,GACA,EAAE,UAAU,CACd;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACpE,OAAO;AAAA,QACL,WAAW;AAAA,QACX,aAAa;AAAA,QACb;AAAA,MACF;AAAA;AAAA,IAGF,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,MAAM,SAAS,KAAK,SAAS;AAAA,MAC7B,OAAO;AAAA,QACL,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,aAAa,6BACX,QACA,2BACF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACf;AAAA;AAAA,EAGM,kCAAkC,CAAC,SAAiC;AAAA,IAC1E,MAAM,QACJ,QAAQ,+BACR,KAAK,QAAQ,+BACb;AAAA,IAEF,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AAAA,MACzC,MAAM,IAAI,MACR,uEACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAGD,gCAAgC,CAAC,SAAiC;AAAA,IACxE,MAAM,QACJ,QAAQ,qBACR,KAAK,QAAQ,6BACb;AAAA,IAEF,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAAA,MAC1C,MAAM,IAAI,MACR,iEACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAGD,gCAAgC,CACtC,QACA,SACkB;AAAA,IAClB,OAAO;AAAA,SACF;AAAA,MACH,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,MACX,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,kBAAkB,QAAQ;AAAA,MAC1B,aACE,QAAQ,UACR,OAAO,eACP;AAAA,IACJ;AAAA;AAAA,OAGY,cAAa,CAAC,SAAiD;AAAA,IAC3E,MAAM,KAAK,KAAK,OAAO;AAAA,IAEvB,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,iBAAiB,OAAO,KAAK,OAAO,GAAG;AAAA,MACrC,IAAI,IAAI,SAAS,SAAS;AAAA,QACxB,MAAM,SAAS,IAAI,eAAe,IAAI;AAAA,QACtC,IAAI,IAAI,kBAAkB;AAAA,UACxB,+BAA+B;AAAA,QACjC,EAAO;AAAA,UACL,+BAA+B;AAAA;AAAA,QAEjC;AAAA,MACF;AAAA,MAEA,IAAI,IAAI,SAAS,UAAU;AAAA,QACzB,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,aAAa;AAAA,UACpC,IAAI,IAAI,oBAAoB,8BAA8B;AAAA,YACxD,OAAO;AAAA,iBACF;AAAA,cACH,aAAa;AAAA,YACf;AAAA,UACF;AAAA,UAEA,IAAI,CAAC,IAAI,oBAAoB,8BAA8B;AAAA,YACzD,OAAO;AAAA,iBACF;AAAA,cACH,aAAa;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,QAEA,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,gBAAgB,KAAK;AAAA,IACvB;AAAA;AAAA,SAMK,MAAM,GAA+B;AAAA,IAC1C,MAAM,cAAc,KAAK,IAAI;AAAA,IAC7B,MAAM,gBAAgB,KAAK;AAAA,IAC3B,IAAI,aAAa;AAAA,IACjB,IAAI,aAAa;AAAA,IACjB,IAAI,kBAAkB;AAAA,IACtB,IAAI,YAAY;AAAA,IAChB,MAAM,sBAAsB,IAAI;AAAA,IAChC,MAAM,cAAc,IAAI,IAAI,KAAK,mBAAmB;AAAA,IACpD,MAAM,iCAAiC,IAAI;AAAA,IAC3C,IAAI;AAAA,IAEJ,KAAK,oBAAoB;AAAA,IACzB,WAAW,UAAU,0BAA0B,KAAK,0BAA0B,KAAK,+BAA+B,gBAAgB;AAAA,IAElI,OAAO,MAAM;AAAA,MACX,MAAM,cAAc,MAAM,KAAK,oBAAoB;AAAA,MACnD,IAAI,CAAC,aAAa;AAAA,QAChB;AAAA,MACF;AAAA,MAIA,IAAI,YAAY,aAAa,eAAe;AAAA,QAC1C;AAAA,QACA,WAAW,UAAU,kCAAkC,YAAY,QAAQ,mBAAmB,YAAY,uBAAuB,gBAAgB;AAAA,QACjJ;AAAA,MACF;AAAA,MAIA,IAAI,YAAY,SAAS,YAAY,IAAI,YAAY,KAAK,GAAG;AAAA,QAC3D;AAAA,QACA,WAAW,UAAU,kCAAkC,YAAY,QAAQ,cAAc,YAAY,OAAO;AAAA,QAC5G;AAAA,MACF;AAAA,MAEA,IAAI,YAAY,OAAO;AAAA,QACrB,oBAAoB,IAAI,YAAY,KAAK;AAAA,MAC3C;AAAA,MAEA,MAAM,SAAS,YAAY;AAAA,MAE3B,IAAI,OAAO,SAAS,WAAW,OAAO,kBAAkB;AAAA,QACtD,MAAM,SAAS,OAAO,eAAe,OAAO;AAAA,QAC5C,IAAI,QAAQ;AAAA,UACV,+BAA+B;AAAA,UAC/B,IAAI,OAAO,OAAO;AAAA,YAChB,+BAA+B,IAAI,OAAO,OAAO,MAAM;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAI,gBAA4B;AAAA,MAEhC,IAAI,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS;AAAA,QAC/C,IAAI,SAAS,OAAO;AAAA,QACpB,IAAI,CAAC,UAAU,MAAM,QAAQ,OAAO,MAAM,GAAG;AAAA,UAC3C,WAAW,SAAS,OAAO,QAAQ;AAAA,YACjC,MAAM,UAAU,+BAA+B,IAAI,KAAK;AAAA,YACxD,IAAI,SAAS;AAAA,cACX,SAAS;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,IAAI,CAAC,QAAQ;AAAA,UACX,SAAS;AAAA,QACX;AAAA,QAEA,MAAM,mBACJ,OAAO,qBAAqB,QACzB,yBAAyB;AAAA,UAC1B;AAAA,UACA,SAAS,OAAO,aAAa,OAAO;AAAA,UACpC,YAAY,OAAO;AAAA,QACrB,CAAC;AAAA,QAEH,IAAI,kBAAkB;AAAA,UACpB,MAAM,sBACJ,CAAC,OAAO,aAAa,OAAO,cAAc,UACtC,sBACA,OAAO;AAAA,UACb,MAAM,kBACJ,CAAC,OAAO,SAAS,OAAO,UAAU,UAC9B,sBACA,OAAO;AAAA,UAEb,gBAAgB;AAAA,eACX;AAAA,YACH,kBAAkB;AAAA,YAClB,aAAa,OAAO,eAAe;AAAA,eAC/B,SAAS,EAAE,aAAa,OAAO,IAAI,CAAC;AAAA,YACxC,WAAW;AAAA,YACX,OAAO;AAAA,UACT;AAAA,QACF,EAAO,SAAI,CAAC,OAAO,aAAa,OAAO,OAAO;AAAA,UAC5C,MAAM,YAAY,eAAe,OAAO,KAAK;AAAA,UAC7C,IAAI,WAAW;AAAA,YACb,gBAAgB;AAAA,iBACX;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA;AAAA,MACA,WAAW,UAAU,UAAU,oBAAoB,cAAc,OAAO,cAAc,SAAS,WAAW,YAAa,cAAmC,iBAAkB,cAAmC,SAAS,WAAW,IAAI;AAAA,MACvO,MAAM;AAAA,MAGN,IAAI,cAAc,SAAS,UAAU;AAAA,QACnC,YAAY;AAAA,QACZ,KAAK,sBAAuB,cAAmC,QAAQ,mBAAmB;AAAA,QAC1F;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,KAAK,IAAI,IAAI;AAAA,IAC7B,WAAW,UAAU,0BAA0B,qBAAqB,4BAA4B,iCAAiC,2BAA2B,KAAK,mCAAmC,WAAW;AAAA,IAC/M,IAAI,CAAC,WAAW;AAAA,MACd,WAAW,UAAU,0FAA0F;AAAA,IACjH;AAAA;AAAA,EAGM,mBAAmB,GAAS;AAAA,IAClC,IAAI,KAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAAA,IAEA,KAAK,aAAa;AAAA,IAClB,KAAK,cAAc,KAAK,kBAAkB,EACvC,MAAM,CAAC,QAAQ;AAAA,MACd,WAAW,QAAQ,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG;AAAA,KAChF,EACA,QAAQ,MAAM;AAAA,MACb,KAAK,aAAa;AAAA,MAClB,KAAK,wBAAwB,IAAI;AAAA,KAClC;AAAA;AAAA,OAGS,kBAAiB,GAAkB;AAAA,IAC/C,WAAW,QAAQ,yBAAyB;AAAA,IAW5C,MAAM,oBAAoB,IAAI;AAAA,IAE9B,iBAAiB,WAAW,KAAK,UAAU,SAAS,GAAG;AAAA,MACrD,MAAM,aAAa;AAAA,MAEnB,IAAI,QAAQ,SAAS,mBAAmB;AAAA,QACtC,MAAM,UAAU,MAAM,KAAK,qBAAqB,OAAyB;AAAA,QACzE,IAAI,CAAC,SAAS;AAAA,UACZ,WAAW,QAAQ,gDAAiD,WAAW,SAAqC,WAAW,OAAO;AAAA,QACxI;AAAA,QACA;AAAA,MACF;AAAA,MAIA,IAAI,QAAQ,SAAS,oBAAoB;AAAA,QACvC,MAAM,UAAU;AAAA,QAGhB,MAAM,YAAY,QAAQ,UAAU;AAAA,QACpC,IAAI,aAAa,KAAK,uBAAuB,IAAI,SAAS,GAAG;AAAA,UAC3D,MAAM,UAAU,KAAK,uBAAuB,IAAI,SAAS;AAAA,UACzD,KAAK,uBAAuB,OAAO,SAAS;AAAA,UAC5C,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,EAAO;AAAA,UACL,WAAW,QAAQ,kDAAkD,aAAa,OAAO;AAAA;AAAA,QAE3F;AAAA,MACF;AAAA,MAKA,MAAM,cAAc,WAAW;AAAA,MAC/B,IAAI,QAAQ,SAAS,cAAc,gBAAgB,uBAAuB,gBAAgB,6BAA6B;AAAA,QACrH,MAAM,YAAY,WAAW;AAAA,QAC7B,MAAM,WAAW,WAAW;AAAA,QAC5B,MAAM,KAAK,YAAY,MAAM;AAAA,QAC7B,IAAI,IAAI;AAAA,UACN,MAAM,QAAQ,GAAG;AAAA,UACjB,MAAM,OAAQ,GAAG,gBAAwC,GAAG;AAAA,UAC5D,MAAM,UAAU,GAAG;AAAA,UAEnB,IAAI,QAAQ,YAAY,WAAW;AAAA,YACjC,kBAAkB,IAAI,SAAS,IAAI;AAAA,UACrC,EAAO,SAAI,CAAC,QAAQ,YAAY,WAAW;AAAA,YACzC,MAAM,aAAa,kBAAkB,IAAI,OAAO;AAAA,YAChD,IAAI,YAAY;AAAA,cAEd,IAAI,OAAO;AAAA,gBACT,GAAG,KAAK;AAAA,cACV,EAAO;AAAA,gBACL,GAAG,eAAe;AAAA;AAAA,YAEtB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,KAAK,iBAAiB,OAAO;AAAA,MAC5C,IAAI,QAAQ;AAAA,QACV,KAAK,qBAAqB,MAAM;AAAA,MAClC,EAAO;AAAA,QACL,WAAW,QAAQ,8BAA8B,QAAQ,qBAAqB,WAAW,gBAAgB,iBAAiB,WAAW,WAAW,OAAO;AAAA;AAAA,IAE3J;AAAA,IAEA,WAAW,QAAQ,uBAAuB;AAAA;AAAA,OAG9B,qBAAoB,CAAC,YAA8C;AAAA,IAE/E,MAAM,UAAkB,WAAW,QAAQ;AAAA,IAC3C,WAAW,QAAQ,4BAA4B,gBAAiB,WAAW,QAAqC,aAAa,OAAO;AAAA,IAEpI,IAAI,YAAY,gBAAgB;AAAA,MAC9B,MAAM,KAAK,iBACT,WAAW,YACX,WAAW,OACb;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,YAAY,yBAAyB;AAAA,MAEvC,MAAM,SAAS,WAAW;AAAA,MAC1B,MAAM,KAAK,0BACT,WAAW,YACX;AAAA,QACE,SAAS;AAAA,QACT,cAAc,OAAO;AAAA,QACrB,WAAW,OAAO;AAAA,QAClB,OAAO,OAAO;AAAA,MAChB,CACF;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA;AAAA,EAGD,oBAAoB,CAAC,KAAuB;AAAA,IAClD,MAAM,cAAqC;AAAA,MACzC,SAAS;AAAA,MACT,YAAY,KAAK;AAAA,MACjB,OAAO,KAAK,gBAAgB,GAAG;AAAA,IACjC;AAAA,IAEA,IAAI,KAAK,gBAAgB,SAAS,GAAG;AAAA,MACnC,MAAM,UAAU,KAAK,gBAAgB,MAAM;AAAA,MAC3C,QAAQ,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,YAAY,UAAU,8BAA8B;AAAA,MAC3D,KAAK,YAAY,MAAM;AAAA,MACvB,KAAK;AAAA,MACL,WAAW,QAAQ,gEAAgE,KAAK,8BAA8B,+BAA+B;AAAA,IACvJ;AAAA,IAEA,KAAK,YAAY,KAAK,WAAW;AAAA;AAAA,OAGrB,oBAAmB,GAA0C;AAAA,IACzE,IAAI,KAAK,YAAY,SAAS,GAAG;AAAA,MAC/B,OAAO,KAAK,YAAY,MAAM;AAAA,IAChC;AAAA,IAEA,IAAI,KAAK,YAAY;AAAA,MACnB,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,gBAAgB,KAAK,OAAO;AAAA,KAClC;AAAA;AAAA,EAGK,uBAAuB,CAAC,KAAyC;AAAA,IACvE,WAAW,WAAW,KAAK,iBAAiB;AAAA,MAC1C,QAAQ,GAAG;AAAA,IACb;AAAA,IACA,KAAK,kBAAkB,CAAC;AAAA,IAExB,WAAW,WAAW,KAAK,uBAAuB,OAAO,GAAG;AAAA,MAC1D,QAAQ,EAAE,SAAS,SAAS,OAAO,iBAAiB,CAAC;AAAA,IACvD;AAAA,IACA,KAAK,uBAAuB,MAAM;AAAA;AAAA,EAG5B,eAAe,CAAC,KAAqC;AAAA,IAC3D,QAAQ,IAAI;AAAA,WACL;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,QACH,OAAO,IAAI;AAAA;AAAA,QAEX;AAAA;AAAA;AAAA,EAIE,qBAAqB,CAC3B,cACA,gBACM;AAAA,IACN,MAAM,aAAa,IAAI;AAAA,IAEvB,IAAI,MAAM,QAAQ,YAAY,GAAG;AAAA,MAC/B,WAAW,SAAS,cAAc;AAAA,QAChC,IAAI,OAAO;AAAA,UACT,WAAW,IAAI,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAW,SAAS,gBAAgB;AAAA,MAClC,IAAI,OAAO;AAAA,QACT,WAAW,IAAI,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,KAAK,sBAAsB;AAAA;AAAA,OAMf,sBAAqB,GAAkB;AAAA,IACnD,MAAM,WAAW,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU;AAAA,MACtE,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAElB,YAAY,KAAK,mBAAmB,KAAK,UAAU;AAAA,IACrD,EAAE;AAAA,IAEF,WAAW,iBAAiB,eAAe,SAAS,0BAA0B,SAAS,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG;AAAA,IAEpH,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,YAAY,kBAAkB,KAAK,IAAI;AAAA,MACvC,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA;AAAA,EAMK,kBAAkB,CAAC,QAA0C;AAAA,IAGnE,IAAI,UAAU,OAAO,WAAW,UAAU;AAAA,MAExC,MAAM,IAAI;AAAA,MACV,OAAO;AAAA,QACL,MAAM,EAAE;AAAA,QACR,YAAY,EAAE;AAAA,QACd,UAAU,EAAE;AAAA,QACZ,sBAAsB,EAAE;AAAA,QACxB,aAAa,EAAE;AAAA,MACjB;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,SAAS;AAAA;AAAA,OAMZ,0BAAyB,CACrC,WACA,KACe;AAAA,IACf,MAAM,OAAO,KAAK,cAAc,IAAI,IAAI,SAAS;AAAA,IAEjD,IAAI,CAAC,MAAM;AAAA,MAET,WAAW,uBAAuB,uBAAuB,IAAI,WAAW;AAAA,MACxE,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,MAAM;AAAA,QACN,UAAU;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc,IAAI;AAAA,UAClB,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,0BAA0B,IAAI,YAAY,CAAC;AAAA,UAC3E,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,MACF,WAAW,uBAAuB,aAAa,IAAI,sBAAsB,IAAI,eAAe;AAAA,MAE5F,MAAM,SAAS,MAAM,KAAK,QAAQ,IAAI,cAAc,IAAI,KAAK;AAAA,MAG7D,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,MAAM;AAAA,QACN,UAAU;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc,IAAI;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,MACD,WAAW,uBAAuB,GAAG,IAAI,kCAAkC;AAAA,MAC3E,OAAO,KAAK;AAAA,MAEZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACpE,WAAW,uBAAuB,GAAG,IAAI,qBAAqB,cAAc;AAAA,MAC5E,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,MAAM;AAAA,QACN,UAAU;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc,IAAI;AAAA,UAClB,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,yBAAyB,eAAe,CAAC;AAAA,UACzE,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA;AAAA;AAAA,OAOS,iBAAgB,CAC5B,WACA,KACe;AAAA,IACf,IAAI;AAAA,IACJ,MAAM,WAAW,IAAI;AAAA,IACrB,MAAM,cAAc,OAAO,KAAK,QAAQ,eAAe;AAAA,IACvD,MAAM,4BAA4B,yBAAyB,QAAQ;AAAA,IACnE,MAAM,2BACJ,wBAAwB,QAAQ;AAAA,IAElC,WAAW,cAAc,QAAQ,iBAAiB,KAAK,QAAQ,kBAAkB,uBAAuB,WAAW;AAAA,IAGnH,IAAI,6BAA6B,CAAC,aAAa;AAAA,MAC7C,WAAW;AAAA,QACT,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF,EAAO,SACL,KAAK,QAAQ,mBAAmB,uBAChC,CAAC,2BACD;AAAA,MAEA,WAAW,cAAc,cAAc,8BAA8B;AAAA,MACrE,WAAW;AAAA,QACT,UAAU;AAAA,QACV,cAAc;AAAA,QACd,oBAAoB,CAAC;AAAA,MACvB;AAAA,IACF,EAAO,SAAI,aAAa;AAAA,MACtB,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK,QAAQ,WAAY,UAAU,IAAI,KAAK;AAAA,QACjE,IAAI,OAAO,aAAa,SAAS;AAAA,UAC/B,WAAW;AAAA,YACT,UAAU;AAAA,YACV,cAAc,OAAO,gBAAgB;AAAA,YACrC,oBAAoB,CAAC;AAAA,UACvB;AAAA,QACF,EAAO;AAAA,UACL,WAAW;AAAA,YACT,UAAU;AAAA,YACV,SAAS,OAAO,WAAW;AAAA,YAC3B,WAAW;AAAA,UACb;AAAA;AAAA,QAEF,OAAO,KAAK;AAAA,QACZ,WAAW;AAAA,UACT,UAAU;AAAA,UACV,SAAS,eAAe,QAAQ,IAAI,UAAU;AAAA,UAC9C,WAAW;AAAA,QACb;AAAA;AAAA,IAEJ,EAAO,SAAI,0BAA0B;AAAA,MAGnC,WAAW,cAAc,cAAc,6BAA6B;AAAA,MACpE,WAAW;AAAA,QACT,UAAU;AAAA,QACV,cAAc;AAAA,QACd,oBAAoB,CAAC;AAAA,MACvB;AAAA,IACF,EAAO;AAAA,MAEL,WAAW;AAAA,QACT,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA;AAAA,IAIF,MAAM,mBAAmB,cAAc,WAAW,SAAS,WAAW;AAAA,IACtE,WAAW,cAAc,yBAAyB,sBAAsB,kBAAkB;AAAA,IAC1F,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,UAAU;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,WAAW,cAAc,qBAAqB,UAAU;AAAA;AAAA,OAMpD,MAAK,GAAkB;AAAA,IAC3B,IAAI,CAAC,KAAK,eAAe,KAAK;AAAA,MAAY;AAAA,IAC1C,WAAW,SAAS,2BAA2B,KAAK,WAAW;AAAA,IAC/D,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,YAAY,aAAa,KAAK,IAAI;AAAA,MAClC,SAAS,EAAE,SAAS,YAAY;AAAA,IAClC,CAAC;AAAA;AAAA,OAGW,uBAAsB,CAClC,WACA,SACA,UAAkC,CAAC,GAC+B;AAAA,IAClE,MAAM,kBAAkB,IAAI,QAIzB,CAAC,YAAY;AAAA,MACd,KAAK,uBAAuB,IAAI,WAAW,OAAO;AAAA,KACnD;AAAA,IAED,IAAI;AAAA,MACF,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,MAAM;AAAA,QACN,YAAY;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,MACD,OAAO,OAAO;AAAA,MACd,KAAK,uBAAuB,OAAO,SAAS;AAAA,MAC5C,MAAM;AAAA;AAAA,IAGR,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,IAAI,OAAO,QAAQ,cAAc,UAAU;AAAA,QACzC,OAAO,MAAM,QAAQ,KAAK;AAAA,UACxB;AAAA,UACA,IAAI,QAAe,CAAC,GAAG,WAAW;AAAA,YAChC,gBAAgB,WAAW,MAAM;AAAA,cAC/B,KAAK,uBAAuB,OAAO,SAAS;AAAA,cAC5C,OACE,IAAI,MACF,2CAA2C,YAC7C,CACF;AAAA,eACC,QAAQ,SAAS;AAAA,WACrB;AAAA,QACH,CAAC;AAAA,MACH;AAAA,MAEA,OAAO,MAAM;AAAA,cACb;AAAA,MACA,IAAI,eAAe;AAAA,QACjB,aAAa,aAAa;AAAA,MAC5B;AAAA;AAAA;AAAA,OAYE,aAAY,CAAC,UAA+B,CAAC,GAAgC;AAAA,IACjF,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAAA,IAEA,MAAM,YAAY,QAAQ,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA,IAE7E,MAAM,OAAO,MAAM,KAAK,uBAAuB,WAAW;AAAA,MACxD,SAAS;AAAA,SACL,QAAQ,iBAAiB,EAAE,iBAAiB,QAAQ,eAAe,IAAI,CAAC;AAAA,SACxE,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,SAC/C,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,SAC5C,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,SAC5C,QAAQ,UAAU,YAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChE,CAAC;AAAA,IAED,IAAI,CAAC,MAAM;AAAA,MACT,MAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAAA,IACA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,MAAM,IAAI,MAAM,KAAK,SAAS,qBAAqB;AAAA,IACrD;AAAA,IAEA,MAAM,UAAU,KAAK;AAAA,IAMrB,OAAO;AAAA,MACL,UAAU,SAAS,YAAY,CAAC;AAAA,MAChC,YAAY,SAAS,eAAe;AAAA,MACpC,SAAS,SAAS,YAAY;AAAA,IAChC;AAAA;AAAA,OAGI,WAAU,GAA8B;AAAA,IAC5C,MAAM,IAAI,MACR,6FACF;AAAA;AAAA,OAQI,YAAW,CACf,UACA,UACe;AAAA,IACf,MAAM,IAAI,MACR,8FACF;AAAA;AAAA,OAGI,YAAW,CAAC,SAAkE;AAAA,IAClF,MAAM,IAAI,MACR,8FACF;AAAA;AAAA,OAYI,eAAc,CAClB,UAAiC,CAAC,GACH;AAAA,IAC/B,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,IAAI,MACR,6DACF;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,aAAa,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA,IAElF,MAAM,OAAO,MAAM,KAAK,uBAAuB,WAAW;AAAA,MACxD,SAAS;AAAA,SACL,QAAQ,UAAU,YAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,SAC1D,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAClD,CAAC;AAAA,IAED,IAAI,CAAC,MAAM;AAAA,MACT,MAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAAA,IACA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,MAAM,IAAI,MACP,KAA4B,SAAS,uBACxC;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,KAAK;AAAA,IAiBrB,MAAM,QAA8B;AAAA,MAClC,SAAS,SAAS,YAAY,KAAK,YAAY;AAAA,MAC/C,gBAAgB,SAAS,mBAAmB,KAAK,mBAAmB;AAAA,MACpE,OAAO,SAAS;AAAA,MAChB,cAAc,SAAS,iBAAiB;AAAA,MACxC,UAAU,SAAS,YAAY,CAAC;AAAA,MAChC,YAAY,SAAS,eAAe;AAAA,MACpC,SAAS,SAAS,YAAY;AAAA,MAC9B,oBAAoB,SAAS,wBAAwB;AAAA,IACvD;AAAA,IACA,IAAI,SAAS,UAAU;AAAA,MAAW,MAAM,QAAQ,QAAQ;AAAA,IACxD,IAAI,SAAS,YAAY;AAAA,MAAW,MAAM,UAAU,QAAQ;AAAA,IAC5D,OAAO;AAAA;AAAA,OAGH,cAAa,CAAC,oBAA2C;AAAA,IAC7D,MAAM,IAAI,MAAM,gGAAgG;AAAA;AAAA,EAMlH,KAAK,GAAS;AAAA,IACZ,WAAW,SAAS,0BAA0B,KAAK,0BAA0B,KAAK,kBAAkB;AAAA,IACpG,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,aAAa;AAAA,IAClB,KAAK,wBAAwB,IAAI;AAAA;AAAA,MAM/B,OAAO,GAAkB;AAAA,IAC3B,OAAO,KAAK;AAAA;AAAA,MAMV,SAAS,GAAkB;AAAA,IAC7B,OAAO,KAAK;AAAA;AAAA,MAMV,cAAc,GAAkB;AAAA,IAClC,OAAO,KAAK;AAAA;AAAA,QAMP,OAAO,aAAa,GAAkB;AAAA,IAC3C,KAAK,MAAM;AAAA;AAAA,EAML,gBAAgB,CAAC,SAAuD;AAAA,IAE9E,IAAI,QAAQ,SAAS,YAAY,aAAa,WAAW,QAAQ,YAAY,QAAQ;AAAA,MACnF,MAAM,MAAM;AAAA,MAaZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,IAAI;AAAA,QACb,WAAW,IAAI;AAAA,QACf,gBAAgB,IAAI;AAAA,QACpB,OAAO,IAAI;AAAA,QACX,OAAO,IAAI;AAAA,QACX,cAAc,IAAI;AAAA,QAClB,cAAc,IAAI;AAAA,QAClB,2BAA2B,IAAI;AAAA,QAC/B,UACE,IAAI,sBACJ,IAAI,uBACJ,OAAO,IAAI,0BAA0B,WACjC;AAAA,UACE,SAAS,IAAI;AAAA,UACb,UAAU,IAAI;AAAA,UACd,WAAW,IAAI;AAAA,QACjB,IACA;AAAA,MACR;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,SAAS,aAAa,kBAAkB,SAAS;AAAA,MAC3D,MAAM,MAAM;AAAA,MAiBZ,MAAM,QAAQ,IAAI,UAAU;AAAA,MAG5B,IAAI,IAAI,iBAAiB,uBAAuB,IAAI,SAAS;AAAA,QAC3D,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MAGA,IAAI,IAAI,iBAAiB,uBAAuB,IAAI,iBAAiB,4BAA4B;AAAA,QAC/F,MAAM,cAAe,IAAI,aAAa,MAAM,IAAI;AAAA,QAChD,IAAI,aAAa;AAAA,UACf,MAAM,QAAQ,YAAY;AAAA,UAC1B,MAAM,aACH,YAAY,gBACZ,YAAY;AAAA,UACf,IAAI,CAAC,YAAY;AAAA,YACf,MAAM,SAAS,2BAA2B,IAAI,sBAAsB,IAAI,QAAQ;AAAA,YAChF,WAAW,aAAa,MAAM;AAAA,YAC9B,OAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,cACT,WAAW;AAAA,cACX,YAAY;AAAA,cACZ;AAAA,cACA,UAAU;AAAA,gBACR,YAAY;AAAA,gBACZ;AAAA,gBACA,cAAc,IAAI;AAAA,cACpB;AAAA,cACA,aAAa;AAAA,cACb,aAAa;AAAA,YACf;AAAA,UACF;AAAA,UAEA,MAAM,WACH,YAAY,QACZ,OAAO,QACR;AAAA,UACF,MAAM,WACH,YAAY,aACZ,OAAO,aACR;AAAA,UAEF,IAAI,YAAqC,CAAC;AAAA,UAC1C,IAAI;AAAA,YACF,YAAY,KAAK,MAAM,QAAQ;AAAA,YAC/B,MAAM;AAAA,YACN,YAAY,EAAE,KAAK,SAAS;AAAA;AAAA,UAE9B,OAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc,YAAY;AAAA,YAC1B,MAAM,IAAI;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAGA,IAAI,IAAI,iBAAiB,yBAAyB,IAAI,cAAc;AAAA,QAClE,OAAO;AAAA,UACL,MAAM;AAAA,UACN,YAAY,IAAI;AAAA,UAChB,SAAS,IAAI,eAAe;AAAA,UAC5B,SAAS,IAAI,WAAW;AAAA,UACxB,MAAM,IAAI;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MAGA,IAAI,IAAI,iBAAiB,uBAAuB,IAAI,WAAW;AAAA,QAC7D,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,SAAS,gBAAgB;AAAA,MACnC,MAAM,MAAM;AAAA,MAIZ,MAAM,eAAgB,IAAI,SAAS,CAAC;AAAA,MACpC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM,IAAI;AAAA,MACZ;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,SAAS,UAAU;AAAA,MAC7B,MAAM,MAAM;AAAA,MASZ,MAAM,SAAS,MAAM,QAAQ,IAAI,OAAO,IACpC,IAAI,QAAQ,OAAO,CAAC,OAAqB,OAAO,OAAO,QAAQ,IAC/D;AAAA,MACJ,MAAM,mBAAmB,yBAAyB;AAAA,QAChD,YAAY,IAAI;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,cAAc,IAAI,YAAY,YAC/B,oBAAoB,IAAI,YAAY,UAAU,sBAAsB,IAAI,UACzE;AAAA,MACJ,MAAM,YAAY,eAAe,WAAW;AAAA,MAC5C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,IAAI,YAAY;AAAA,QACzB,QAAQ,IAAI;AAAA,QACZ,OAAO;AAAA,QACP;AAAA,WACI,mBACA;AAAA,UACE,kBAAkB;AAAA,UAClB,aAAa;AAAA,QACf,IACA,CAAC;AAAA,QACL,YAAY,IAAI;AAAA,QAChB,YAAY,IAAI;AAAA,QAChB,cAAc,IAAI;AAAA,QAClB,gBAAgB,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,IAKA,IAAI,QAAQ,SAAS,SAAS;AAAA,MAC5B,MAAM,MAAM;AAAA,MAMZ,MAAM,cAAc,sBAAsB,IAAI,SAAS;AAAA,MACvD,MAAM,mBAAmB,yBAAyB;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS,IAAI;AAAA,QACb,YAAY,IAAI;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,YAAY,mBACd,sBACA,eAAe,IAAI,WAAW;AAAA,MAClC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,IAAI;AAAA,WACT,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,WAC7B,mBACA;AAAA,UACE,kBAAkB;AAAA,UAClB,aAAa;AAAA,QACf,IACA,CAAC;AAAA,WACD,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACrC,YAAY,IAAI;AAAA,QAChB,OAAO,IAAI;AAAA,QACX,UAAU,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,SAAS,SAAS;AAAA,MAC5B,MAAM,MAAM;AAAA,MAOZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,IAAI;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,aAAa,IAAI;AAAA,QACjB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IAGA,OAAO;AAAA;AAEX;;;AC//CA,IAAM,6BAA6B;AAInC,SAAS,gBAAgB,GAAuB;AAAA,EAC9C,MAAM,MAAO,WACV,SAAS;AAAA,EACZ,OAAO,KAAK,iBAAiB,KAAK;AAAA;AAGpC,SAAS,sBAAsB,CAAC,SAAiE;AAAA,EAC/F,MAAM,gBAAgB,SAAS,iBAAiB,SAAS;AAAA,EACzD,IAAI,CAAC;AAAA,IAAe;AAAA,EACpB,MAAM,QAAQ,mBAAmB,KAAK,aAAa;AAAA,EACnD,OAAO,QAAQ;AAAA;AAGjB,SAAS,cAAc,CAAC,SAA0D;AAAA,EAChF,OAAO,QAAQ,UAAU,uBAAuB,QAAQ,OAAO,KAAK,iBAAiB;AAAA;AAGvF,SAAS,QAAQ,CAAC,eAAsC;AAAA,EACtD,MAAM,WAAW,iBAAiB,WAAW;AAAA,EAC7C,IAAI,CAAC;AAAA,IAAU,MAAM,IAAI,MAAM,sDAAsD;AAAA,EACrF,OAAO,SAAS,KAAK,UAAU;AAAA;AAGjC,SAAS,wBAAwB,CAAC,KAAiC;AAAA,EACjE,MAAM,SAAS,IAAI,IAAI,OAAO,0BAA0B;AAAA,EACxD,OAAO,WAAW,OAAO,SAAS,QAAQ,QAAQ,EAAE;AAAA,EACpD,OAAO,SAAS;AAAA,EAChB,OAAO,OAAO;AAAA,EACd,OAAO,OAAO,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA;AAG5C,SAAS,YAAY,CAAC,SAA8D;AAAA,EAClF,MAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,OACZ,QAAQ,WAAW,CAAC;AAAA,EAC1B;AAAA,EACA,MAAM,SAAS,eAAe,OAAO;AAAA,EACrC,IAAI,UAAU,CAAC,QAAQ,iBAAiB,CAAC,QAAQ,eAAe;AAAA,IAC9D,QAAQ,gBAAgB,UAAU;AAAA,EACpC;AAAA,EACA,OAAO;AAAA;AAGT,eAAe,iBAAiB,CAAC,UAAsC;AAAA,EACrE,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,EACjC,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,IAAI;AAAA,IACF,OAAO,KAAK,MAAM,IAAI;AAAA,IACtB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,oBAAoB,CAAC,MAAe,UAA0B;AAAA,EACrE,IAAI,QAAQ,OAAO,SAAS,UAAU;AAAA,IACpC,MAAM,SAAS;AAAA,IACf,MAAM,UAAU,OAAO,WAAW,OAAO,SAAS,OAAO;AAAA,IACzD,MAAM,aAAa,OAAO;AAAA,IAC1B,MAAM,SAAS,CAAC,SAAS,UAAU,EAChC,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC;AAAA,IACnF,IAAI,OAAO,SAAS;AAAA,MAAG,OAAO,OAAO,KAAK,IAAI;AAAA,EAChD;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,UAAoB,MAAe,QAAsB;AAAA,EACjF,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,IAAI,MAAM,qBAAqB,MAAM,GAAG,2BAA2B,SAAS,QAAQ,CAAC;AAAA,EAC7F;AAAA;AAGF,SAAS,cAAc,CAAC,OAAoC;AAAA,EAC1D,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA;AAG7C,SAAS,aAAa,CAAC,OAAgB,MAAsB;AAAA,EAC3D,IAAI,OAAO,UAAU;AAAA,IAAU,MAAM,IAAI,MAAM,uCAAuC,OAAO;AAAA,EAC7F,OAAO;AAAA;AAGT,SAAS,YAAY,CAAC,MAA2B;AAAA,EAC/C,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,IACrC,MAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAAA,EACA,MAAM,SAAS;AAAA,EACf,OAAO;AAAA,IACL,IAAI,cAAc,OAAO,IAAI,IAAI;AAAA,IACjC,MAAM,cAAc,OAAO,MAAM,MAAM;AAAA,IACvC,WAAW,cAAc,OAAO,YAAY,YAAY;AAAA,IACxD,WAAW,cAAc,OAAO,YAAY,YAAY;AAAA,EAC1D;AAAA;AAGF,SAAS,cAAc,CAAC,MAA6C;AAAA,EACnE,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,IACrC,MAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AAAA,EACA,MAAM,SAAS;AAAA,EACf,OAAO;AAAA,IACL,MAAM,cAAc,OAAO,MAAM,MAAM;AAAA,IACvC,eAAe,cAAc,OAAO,gBAAgB,gBAAgB;AAAA,IACpE,WAAW,cAAc,OAAO,YAAY,YAAY;AAAA,EAC1D;AAAA;AAGF,SAAS,sBAAsB,CAAC,KAAU,KAAa,OAA0C;AAAA,EAC/F,IAAI,UAAU;AAAA,IAAW,IAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA;AAAA;AAG3D,MAAM,mBAAmB;AAAA,EACD;AAAA,EAA7B,WAAW,CAAkB,SAAsC;AAAA,IAAtC;AAAA;AAAA,OAEvB,OAAM,CAAC,QAAqD;AAAA,IAChE,OAAO,aAAa,MAAM,KAAK,QAAQ,oBAAoB,QAAQ,EAAE,MAAM,OAAO,KAAK,GAAG,yBAAyB,CAAC;AAAA;AAAA,OAGhH,KAAI,CAAC,SAAiC,CAAC,GAAoC;AAAA,IAC/E,MAAM,MAAM,KAAK,IAAI,kBAAkB;AAAA,IACvC,uBAAuB,KAAK,SAAS,OAAO,KAAK;AAAA,IACjD,uBAAuB,KAAK,UAAU,OAAO,MAAM;AAAA,IACnD,MAAM,OAAO,MAAM,KAAK,WAAW,KAAK,OAAO,WAAW,yBAAyB;AAAA,IACnF,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,MACrC,MAAM,IAAI,MAAM,gEAAgE;AAAA,IAClF;AAAA,IACA,MAAM,SAAS;AAAA,IACf,MAAM,eAAe,MAAM,QAAQ,OAAO,YAAY,IAClD,OAAO,aAAa,IAAI,YAAY,IACpC,CAAC;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,aAAa,OAAO,kBAAkB;AAAA,IACxC;AAAA;AAAA,OAGI,IAAG,CAAC,cAA2C;AAAA,IACnD,OAAO,aAAa,MAAM,KAAK,QAAQ,oBAAoB,mBAAmB,YAAY,KAAK,OAAO,WAAW,sBAAsB,CAAC;AAAA;AAAA,OAQpI,OAAM,CAAC,cAAqC;AAAA,IAChD,MAAM,KAAK,QACT,oBAAoB,mBAAmB,YAAY,KACnD,UACA,WACA,yBACF;AAAA;AAAA,EAGO,QAAQ;AAAA,IACf,MAAM,OACJ,cACA,SAAoC,CAAC,MACE;AAAA,MACvC,MAAM,MAAM,KAAK,IAAI,oBAAoB,mBAAmB,YAAY,SAAS;AAAA,MACjF,uBAAuB,KAAK,eAAe,OAAO,UAAU;AAAA,MAC5D,uBAAuB,KAAK,SAAS,OAAO,KAAK;AAAA,MACjD,uBAAuB,KAAK,OAAO,OAAO,GAAG;AAAA,MAC7C,MAAM,OAAO,MAAM,KAAK,WAAW,KAAK,OAAO,WAAW,6BAA6B;AAAA,MACvF,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,QACrC,MAAM,IAAI,MAAM,6DAA6D;AAAA,MAC/E;AAAA,MACA,MAAM,SAAS;AAAA,MACf,MAAM,QAAQ,MAAM,QAAQ,OAAO,KAAK,IACpC,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAC5B,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAAA,UACvC,MAAM,IAAI,MAAM,sEAAsE;AAAA,QACxF;AAAA,QACA,MAAM,OAAO;AAAA,QACb,MAAM,OAAO,KAAK;AAAA,QAClB,IAAI,SAAS,UAAU,SAAS,aAAa;AAAA,UAC3C,MAAM,IAAI,MAAM,qEAAqE;AAAA,QACvF;AAAA,QACA,OAAO,EAAE,MAAM,cAAc,KAAK,MAAM,MAAM,GAAG,KAAmC;AAAA,OACrF,IACC,CAAC;AAAA,MACL,OAAO,EAAE,OAAO,KAAK,cAAc,OAAO,KAAK,KAAK,EAAE;AAAA;AAAA,IAGxD,QAAQ,OACN,cACA,WAC0C,eAAe,MAAM,KAAK,QACpE,oBAAoB,mBAAmB,YAAY,WACnD,QACA,EAAE,MAAM,OAAO,MAAM,SAAS,OAAO,QAAQ,GAC7C,8BACF,CAAC;AAAA,IAED,MAAM,OAAO,cAAsB,WAAoE;AAAA,MACrG,MAAM,MAAM,KAAK,IAAI,oBAAoB,mBAAmB,YAAY,iBAAiB;AAAA,MACzF,IAAI,aAAa,IAAI,QAAQ,OAAO,IAAI;AAAA,MACxC,uBAAuB,KAAK,OAAO,OAAO,GAAG;AAAA,MAC7C,MAAM,OAAO,MAAM,KAAK,WAAW,KAAK,OAAO,WAAW,4BAA4B;AAAA,MACtF,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,QACrC,MAAM,IAAI,MAAM,mEAAmE;AAAA,MACrF;AAAA,MACA,MAAM,SAAS;AAAA,MACf,OAAO;AAAA,QACL,MAAM,cAAc,OAAO,MAAM,MAAM;AAAA,QACvC,SAAS,cAAc,OAAO,SAAS,SAAS;AAAA,QAChD,eAAe,cAAc,OAAO,gBAAgB,gBAAgB;AAAA,QACpE,KAAK,eAAe,OAAO,GAAG;AAAA,MAChC;AAAA;AAAA,IAGF,QAAQ,OACN,cACA,WAC0C,eAAe,MAAM,KAAK,QACpE,oBAAoB,mBAAmB,YAAY,mBACnD,QACA;AAAA,MACE,MAAM,OAAO;AAAA,SACT,OAAO,YAAY,YAAY,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,SAC9D,OAAO,YAAY,YAAY,EAAE,UAAU,OAAO,QAAQ,IAAI,CAAC;AAAA,SAC/D,OAAO,iBAAiB,YACxB;AAAA,QACA,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,gBAAgB,OAAO,aAAa;AAAA,QACtC;AAAA,MACF,IACE,CAAC;AAAA,IACP,GACA,8BACF,CAAC;AAAA,IAED,QAAQ,OACN,cACA,WACwC;AAAA,MACxC,MAAM,OAAO,MAAM,KAAK,QACtB,oBAAoB,mBAAmB,YAAY,mBACnD,UACA,EAAE,MAAM,OAAO,KAAK,GACpB,8BACF;AAAA,MACA,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,QACrC,MAAM,IAAI,MAAM,uEAAuE;AAAA,MACzF;AAAA,MACA,MAAM,SAAS;AAAA,MACf,OAAO,EAAE,SAAS,OAAO,YAAY,MAAM,WAAW,cAAc,OAAO,YAAY,YAAY,EAAE;AAAA;AAAA,EAEzG;AAAA,EAES,WAAW;AAAA,IAClB,MAAM,OACJ,cACA,SAAuC,CAAC,MACP;AAAA,MACjC,MAAM,MAAM,KAAK,IAAI,oBAAoB,mBAAmB,YAAY,YAAY;AAAA,MACpF,uBAAuB,KAAK,QAAQ,OAAO,IAAI;AAAA,MAC/C,uBAAuB,KAAK,SAAS,OAAO,KAAK;AAAA,MACjD,MAAM,OAAO,MAAM,KAAK,WAAW,KAAK,OAAO,WAAW,gCAAgC;AAAA,MAC1F,IAAI,MAAM,QAAQ,IAAI;AAAA,QAAG,OAAO;AAAA,MAChC,IAAI,QAAQ,OAAO,SAAS,UAAU;AAAA,QACpC,MAAM,SAAS;AAAA,QACf,IAAI,MAAM,QAAQ,OAAO,OAAO;AAAA,UAAG,OAAO,OAAO;AAAA,QACjD,IAAI,MAAM,QAAQ,OAAO,QAAQ;AAAA,UAAG,OAAO,OAAO;AAAA,MACpD;AAAA,MACA,OAAO,CAAC;AAAA;AAAA,IAGV,KAAK,OACH,cACA,KACA,WAC4B;AAAA,MAC5B,MAAM,MAAM,KAAK,IAAI,oBAAoB,mBAAmB,YAAY,cAAc,mBAAmB,GAAG,GAAG;AAAA,MAC/G,IAAI,aAAa,IAAI,QAAQ,OAAO,IAAI;AAAA,MACxC,MAAM,OAAO,MAAM,KAAK,WAAW,KAAK,OAAO,WAAW,8BAA8B;AAAA,MACxF,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,QACrC,MAAM,IAAI,MAAM,qEAAqE;AAAA,MACvF;AAAA,MACA,MAAM,SAAS;AAAA,MACf,OAAO;AAAA,QACL,MAAM,cAAc,OAAO,MAAM,MAAM;AAAA,QACvC,SAAS,cAAc,OAAO,SAAS,SAAS;AAAA,QAChD,eAAe,cAAc,OAAO,gBAAgB,gBAAgB;AAAA,QACpE,KAAK,cAAc,OAAO,KAAK,KAAK;AAAA,MACtC;AAAA;AAAA,EAEJ;AAAA,EAEQ,GAAG,CAAC,MAAmB;AAAA,IAC7B,OAAO,IAAI,IAAI,GAAG,yBAAyB,KAAK,QAAQ,UAAU,IAAI,MAAM;AAAA;AAAA,OAGhE,QAAO,CACnB,MACA,QACA,MACA,QACkB;AAAA,IAClB,OAAO,KAAK,WAAW,KAAK,IAAI,IAAI,GAAG,QAAQ,MAAM,MAAM;AAAA;AAAA,OAG/C,WAAU,CACtB,KACA,QACA,MACA,QACkB;AAAA,IAClB,MAAM,WAAW,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,KAAK;AAAA,MACvD;AAAA,MACA,SAAS,aAAa,KAAK,OAAO;AAAA,SAC9B,SAAS,YAAY,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,IAC7D,CAAC;AAAA,IACD,MAAM,SAAS,MAAM,kBAAkB,QAAQ;AAAA,IAC/C,iBAAiB,UAAU,QAAQ,MAAM;AAAA,IACzC,OAAO;AAAA;AAEX;;;AClVA,IAAI,6BAA6B;AACjC,IAAI,uBAAuB;AAC3B,SAAS,kBAAkB,GAAG;AAAA,EAC5B,OAAO,WAAW;AAAA;AAEpB,SAAS,gBAAgB,CAAC,KAAK;AAAA,EAC7B,MAAM,SAAS,IAAI,IAAI,GAAG;AAAA,EAC1B,IAAI,OAAO,aAAa;AAAA,IACtB,OAAO,WAAW;AAAA,EACpB,IAAI,OAAO,aAAa;AAAA,IACtB,OAAO,WAAW;AAAA,EACpB,IAAI,OAAO,aAAa,SAAS,OAAO,aAAa,QAAQ;AAAA,IAC3D,MAAM,IAAI,MAAM,wCAAwC,OAAO,UAAU;AAAA,EAC3E;AAAA,EACA,IAAI,CAAC,OAAO,YAAY,OAAO,aAAa,KAAK;AAAA,IAC/C,OAAO,WAAW;AAAA,EACpB;AAAA,EACA,OAAO;AAAA;AAET,SAAS,0BAA0B,CAAC,KAAK,SAAS;AAAA,EAChD,MAAM,SAAS,iBAAiB,GAAG;AAAA,EACnC,OAAO,aAAa,IAAI,WAAW,OAAO;AAAA,EAC1C,OAAO,OAAO,SAAS;AAAA;AAEzB,SAAS,oBAAoB,CAAC,QAAQ,MAAM,UAAU;AAAA,EACpD,IAAI,OAAO,oBAAoB,OAAO,qBAAqB;AAAA,IACzD,OAAO,iBAAiB,MAAM,QAAQ;AAAA,IACtC,OAAO,MAAM,OAAO,sBAAsB,MAAM,QAAQ;AAAA,EAC1D;AAAA,EACA,IAAI,OAAO,IAAI;AAAA,IACb,OAAO,GAAG,MAAM,QAAQ;AAAA,IACxB,OAAO,MAAM,OAAO,MAAM,MAAM,QAAQ;AAAA,EAC1C;AAAA,EACA,MAAM,IAAI,MAAM,2DAA2D;AAAA;AAE7E,SAAS,eAAe,CAAC,QAAQ,MAAM,UAAU;AAAA,EAC/C,IAAI,OAAO,MAAM;AAAA,IACf,OAAO,KAAK,MAAM,QAAQ;AAAA,IAC1B,OAAO,MAAM,OAAO,MAAM,MAAM,QAAQ;AAAA,EAC1C;AAAA,EACA,IAAI,SAAS,MAAM;AAAA,EACnB,SAAS,qBAAqB,QAAQ,MAAM,CAAC,UAAU;AAAA,IACrD,OAAO;AAAA,IACP,SAAS,KAAK;AAAA,GACf;AAAA,EACD,OAAO;AAAA;AAET,SAAS,iBAAiB,CAAC,QAAQ;AAAA,EACjC,IAAI,OAAO,eAAe,sBAAsB;AAAA,IAC9C,OAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACtC,IAAI,aAAa,MAAM;AAAA,IACvB,IAAI,cAAc,MAAM;AAAA,IACxB,MAAM,UAAU,MAAM;AAAA,MACpB,WAAW;AAAA,MACX,YAAY;AAAA;AAAA,IAEd,aAAa,gBAAgB,QAAQ,QAAQ,MAAM;AAAA,MACjD,QAAQ;AAAA,MACR,QAAQ;AAAA,KACT;AAAA,IACD,cAAc,gBAAgB,QAAQ,SAAS,CAAC,UAAU;AAAA,MACxD,QAAQ;AAAA,MACR,OAAO,IAAI,MAAM,wCAAwC,OAAO,KAAK,GAAG,CAAC;AAAA,KAC1E;AAAA,GACF;AAAA;AAEH,SAAS,YAAY,CAAC,OAAO;AAAA,EAC3B,IAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;AAAA,IACzD,OAAO,MAAM;AAAA,EACf;AAAA,EACA,OAAO;AAAA;AAET,SAAS,mBAAmB,CAAC,MAAM;AAAA,EACjC,MAAM,MAAM,aAAa,IAAI;AAAA,EAC7B,IAAI,OAAO,QAAQ;AAAA,IACjB,OAAO;AAAA,EACT,IAAI,eAAe,aAAa;AAAA,IAC9B,OAAO,IAAI,YAAY,EAAE,OAAO,GAAG;AAAA,EACrC;AAAA,EACA,IAAI,eAAe,YAAY;AAAA,IAC7B,OAAO,IAAI,YAAY,EAAE,OAAO,GAAG;AAAA,EACrC;AAAA,EACA,IAAI,YAAY,OAAO,GAAG,GAAG;AAAA,IAC3B,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU,CAAC;AAAA,EAC5F;AAAA,EACA,OAAO,OAAO,GAAG;AAAA;AAEnB,SAAS,oBAAoB,CAAC,OAAO;AAAA,EACnC,OAAO,KAAK,MAAM,oBAAoB,KAAK,CAAC;AAAA;AAE9C,SAAS,sBAAsB,CAAC,WAAW;AAAA,EACzC,IAAI,cAAc,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,UAAU,KAAK;AAAA,EAC7B,IAAI,CAAC,OAAO;AAAA,IACV,MAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAAA,EACA,OAAO,EAAE,SAAS,EAAE,eAAe,UAAU,QAAQ,EAAE;AAAA;AAEzD,SAAS,WAAW,CAAC,GAAG,GAAG;AAAA,EACzB,OAAO,GAAG,aAAa,EAAE,YAAY,GAAG,oBAAoB,EAAE;AAAA;AAEhE,SAAS,mBAAmB,CAAC,SAAS;AAAA,EACpC,OAAO,QAAQ,YAAY,WAAW;AAAA;AAExC,SAAS,6BAA6B,CAAC,SAAS;AAAA,EAC9C,OAAO,QAAQ,YAAY,WAAW;AAAA;AAExC,SAAS,gBAAgB,CAAC,SAAS;AAAA,EACjC,MAAM,QAAQ,QAAQ,MAAM;AAAA,EAC5B,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA;AAE7C,SAAS,sBAAsB,CAAC,SAAS;AAAA,EACvC,MAAM,cAAc,QAAQ,MAAM;AAAA,EAClC,OAAO,OAAO,gBAAgB,WAAW,cAAc;AAAA;AAEzD,SAAS,qBAAqB,CAAC,SAAS;AAAA,EACtC,MAAM,aAAa,QAAQ,MAAM;AAAA,EACjC,OAAO,OAAO,eAAe,WAAW,aAAa;AAAA;AAEvD,SAAS,uBAAuB,CAAC,SAAS;AAAA,EACxC,MAAM,QAAQ,QAAQ;AAAA,EACtB,MAAM,aAAa,MAAM,WAAW,WAAW,MAAM,WAAW;AAAA,EAChE,IAAI,OAAO,eAAe,YAAY,WAAW,SAAS;AAAA,IACxD,OAAO;AAAA,EACT,IAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS;AAAA,IAC9D,OAAO,MAAM;AAAA,EACf,OAAO;AAAA;AAAA;AAGT,MAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,IAAI;AAAA,EACd,kBAAkB,IAAI;AAAA,EACtB,eAAe,IAAI;AAAA,EACnB,qBAAqB,IAAI;AAAA,EACzB,oBAAoB;AAAA,EACpB,WAAW,CAAC,SAAS;AAAA,IACnB,MAAM,YAAY,QAAQ,aAAa,mBAAmB;AAAA,IAC1D,IAAI,CAAC,WAAW;AAAA,MACd,MAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAAA,IACA,KAAK,mBAAmB,QAAQ,oBAAoB;AAAA,IACpD,MAAM,gBAAgB,uBAAuB,QAAQ,SAAS;AAAA,IAC9D,KAAK,UAAU,IAAI,UAAU,2BAA2B,QAAQ,KAAK,SAAS,GAAG,aAAa;AAAA,IAC9F,KAAK,SAAS,IAAI,UAAU,2BAA2B,QAAQ,KAAK,QAAQ,GAAG,aAAa;AAAA,IAC5F,qBAAqB,KAAK,SAAS,WAAW,CAAC,UAAU;AAAA,MACvD,KAAK,cAAc,OAAO,SAAS;AAAA,KACpC;AAAA,IACD,qBAAqB,KAAK,QAAQ,WAAW,CAAC,UAAU;AAAA,MACtD,KAAK,cAAc,OAAO,QAAQ;AAAA,KACnC;AAAA,IACD,MAAM,gBAAgB,MAAM,KAAK,iBAAiB,0BAA0B;AAAA,IAC5E,qBAAqB,KAAK,SAAS,SAAS,aAAa;AAAA,IACzD,qBAAqB,KAAK,QAAQ,SAAS,aAAa;AAAA;AAAA,OAEpD,QAAO,GAAG;AAAA,IACd,MAAM,QAAQ,IAAI;AAAA,MAChB,kBAAkB,KAAK,OAAO;AAAA,MAC9B,kBAAkB,KAAK,MAAM;AAAA,IAC/B,CAAC;AAAA,IACD,OAAO;AAAA;AAAA,EAET,KAAK,GAAG;AAAA,IACN,KAAK,iBAAiB,0BAA0B;AAAA,IAChD,KAAK,QAAQ,MAAM;AAAA,IACnB,KAAK,OAAO,MAAM;AAAA;AAAA,EAEpB,SAAS,CAAC,SAAS;AAAA,IACjB,KAAK,gBAAgB,IAAI,OAAO;AAAA,IAChC,OAAO,MAAM,KAAK,gBAAgB,OAAO,OAAO;AAAA;AAAA,EAElD,MAAM,CAAC,SAAS;AAAA,IACd,KAAK,aAAa,IAAI,OAAO;AAAA,IAC7B,OAAO,MAAM,KAAK,aAAa,OAAO,OAAO;AAAA;AAAA,EAE/C,aAAa,CAAC,SAAS,OAAO;AAAA,IAC5B,KAAK,qBAAqB;AAAA,IAC1B,OAAO,GAAG,UAAU,KAAK;AAAA;AAAA,EAE3B,IAAI,CAAC,SAAS;AAAA,IACZ,WAAW,WAAW,KAAK,cAAc;AAAA,MACvC,QAAQ,OAAO;AAAA,IACjB;AAAA,IACA,KAAK,QAAQ,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA;AAAA,EAE3C,OAAO,CAAC,eAAe,gBAAgB,CAAC,GAAG,eAAe,CAAC,GAAG;AAAA,IAC5D,MAAM,gBAAgB,OAAO,kBAAkB;AAAA,IAC/C,MAAM,UAAU,gBAAgB;AAAA,MAC9B,MAAM;AAAA,MACN,YAAY,cAAc,cAAc,KAAK,cAAc,aAAa;AAAA,SACrE;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,UAAU,gBAAgB,eAAe;AAAA,IAC/C,MAAM,YAAY,QAAQ,aAAa,KAAK;AAAA,IAC5C,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,UAAU,WAAW,MAAM;AAAA,QAC/B,KAAK,QAAQ,OAAO,QAAQ,UAAU;AAAA,QACtC,OAAO,IAAI,MAAM,yBAAyB,QAAQ,YAAY,CAAC;AAAA,SAC9D,SAAS;AAAA,MACZ,KAAK,QAAQ,IAAI,QAAQ,YAAY;AAAA,QACnC,SAAS,CAAC,YAAY,QAAQ,OAAO;AAAA,QACrC;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,IAAI;AAAA,QACF,KAAK,KAAK,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,QACd,aAAa,OAAO;AAAA,QACpB,KAAK,QAAQ,OAAO,QAAQ,UAAU;AAAA,QACtC,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA,KAEnE;AAAA;AAAA,EAEH,YAAY,CAAC,SAAS,UAAU,CAAC,GAAG;AAAA,IAClC,OAAO,KAAK,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,YAAY,QAAQ,cAAc,KAAK,cAAc,eAAe;AAAA,SACjE;AAAA,IACL,GAAG;AAAA,SACE;AAAA,MACH,WAAW,CAAC,YAAY,QAAQ,SAAS;AAAA,IAC3C,CAAC;AAAA;AAAA,EAEH,IAAI,CAAC,SAAS,UAAU,CAAC,GAAG;AAAA,IAC1B,OAAO,KAAK,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,YAAY,QAAQ,cAAc,KAAK,cAAc,MAAM;AAAA,SACxD;AAAA,IACL,GAAG;AAAA,SACE;AAAA,MACH,WAAW,CAAC,YAAY,QAAQ,SAAS;AAAA,IAC3C,CAAC;AAAA;AAAA,EAEH,KAAK,CAAC,SAAS,UAAU,CAAC,GAAG;AAAA,IAC3B,OAAO,KAAK,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,YAAY,QAAQ,cAAc,KAAK,cAAc,OAAO;AAAA,SACzD;AAAA,IACL,GAAG;AAAA,SACE;AAAA,MACH,WAAW,CAAC,YAAY,QAAQ,SAAS;AAAA,IAC3C,CAAC;AAAA;AAAA,EAEH,kBAAkB,CAAC,SAAS;AAAA,IAC1B,OAAO,KAAK,UAAU,CAAC,SAAS,YAAY;AAAA,MAC1C,IAAI,YAAY,aAAa,QAAQ,SAAS,8BAA8B;AAAA,QAC1E;AAAA,MACF;AAAA,MACA,QAAQ,QAAQ,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW;AAAA,QACjD,KAAK,KAAK;AAAA,UACR,MAAM;AAAA,UACN,YAAY,QAAQ;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,OACF,EAAE,MAAM,CAAC,UAAU;AAAA,QAClB,KAAK,KAAK;AAAA,UACR,MAAM;AAAA,UACN,YAAY,QAAQ;AAAA,UACpB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,CAAC;AAAA,OACF;AAAA,KACF;AAAA;AAAA,EAEH,KAAK,CAAC,SAAS;AAAA,IACb,KAAK,KAAK,EAAE,MAAM,YAAY,QAAQ,CAAC;AAAA;AAAA,EAEzC,OAAO,CAAC,SAAS,UAAU,CAAC,GAAG;AAAA,IAC7B,MAAM,aAAa,GAAG,QAAQ,QAAQ,YAAY,QAAQ,QAAQ;AAAA,IAClE,IAAI,KAAK,mBAAmB,IAAI,UAAU,GAAG;AAAA,MAC3C,OAAO,QAAQ,OAAO,IAAI,MAAM,mCAAmC,YAAY,CAAC;AAAA,IAClF;AAAA,IACA,KAAK,mBAAmB,IAAI,UAAU;AAAA,IACtC,MAAM,YAAY,QAAQ,aAAa,KAAK;AAAA,IAC5C,MAAM,iBAAiB,KAAK,qBAAqB,OAAO;AAAA,IACxD,MAAM,SAAS,IAAI;AAAA,IACnB,IAAI,uBAAuB;AAAA,IAC3B,IAAI,+BAA+B;AAAA,IACnC,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,UAAU,WAAW,MAAM;AAAA,QAC/B,QAAQ;AAAA,QACR,OAAO,IAAI,MAAM,4CAA4C,QAAQ,QAAQ,YAAY,QAAQ,QAAQ,iBAAiB,CAAC;AAAA,SAC1H,SAAS;AAAA,MACZ,MAAM,UAAU,MAAM;AAAA,QACpB,aAAa,OAAO;AAAA,QACpB,KAAK,mBAAmB,OAAO,UAAU;AAAA,QACzC,WAAW;AAAA;AAAA,MAEb,MAAM,SAAS,CAAC,aAAa,iBAAiB,eAAe;AAAA,QAC3D,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,SAAS,QAAQ;AAAA,UACjB;AAAA,UACA,QAAQ,CAAC,GAAG,MAAM;AAAA,UAClB,kBAAkB,eAAe;AAAA,UACjC;AAAA,UACA;AAAA,QACF,CAAC;AAAA;AAAA,MAEH,MAAM,OAAO,CAAC,UAAU;AAAA,QACtB,QAAQ;AAAA,QACR,OAAO,KAAK;AAAA;AAAA,MAEd,MAAM,aAAa,KAAK,UAAU,CAAC,YAAY;AAAA,QAC7C,IAAI,CAAC,YAAY,QAAQ,SAAS,QAAQ,OAAO,GAAG;AAAA,UAClD;AAAA,QACF;AAAA,QACA,IAAI,QAAQ,SAAS,gBAAgB;AAAA,UACnC,uBAAuB;AAAA,UACvB,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACtC,IAAI;AAAA,YACF,OAAO,IAAI,KAAK;AAAA,UAClB,MAAM,cAAc,uBAAuB,OAAO;AAAA,UAClD,IAAI,gBAAgB,gBAAgB,gBAAgB,iBAAiB;AAAA,YACnE,KAAK,IAAI,MAAM,wBAAwB,OAAO,CAAC,CAAC;AAAA,YAChD;AAAA,UACF;AAAA,UACA,IAAI,gBAAgB,eAAe;AAAA,YACjC,MAAM,aAAa,sBAAsB,OAAO;AAAA,YAChD,IAAI,eAAe,qBAAqB;AAAA,cACtC,+BAA+B;AAAA,cAC/B;AAAA,YACF;AAAA,YACA,OAAO,eAAe,SAAS,UAAU;AAAA,UAC3C;AAAA,UACA;AAAA,QACF;AAAA,QACA,IAAI,QAAQ,SAAS,sBAAsB;AAAA,UACzC,MAAM,kCAAkC,wBAAwB;AAAA,UAChE,IAAI,CAAC,oCAAoC,8BAA8B,OAAO,KAAK,QAAQ,4BAA4B,QAAQ,oBAAoB,OAAO,IAAI;AAAA,YAC5J;AAAA,UACF;AAAA,UACA,WAAW,SAAS,QAAQ,YAAY,gBAAgB;AAAA,YACtD,uBAAuB;AAAA,YACvB,OAAO,IAAI,KAAK;AAAA,UAClB;AAAA,UACA,IAAI,mCAAmC,8BAA8B,OAAO,GAAG;AAAA,YAC7E,OAAO,mCAAmC,SAAS,mBAAmB;AAAA,YACtE;AAAA,UACF;AAAA,UACA,IAAI,QAAQ,4BAA4B,QAAQ,mCAAmC,oBAAoB,OAAO,GAAG;AAAA,YAC/G,OAAO,gCAAgC,SAAS,IAAI;AAAA,UACtD;AAAA,QACF;AAAA,OACD;AAAA,MACD,IAAI;AAAA,QACF,KAAK,MAAM,eAAe,OAAO;AAAA,QACjC,OAAO,OAAO;AAAA,QACd,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA,KAEjE;AAAA;AAAA,EAEH,oBAAoB,CAAC,SAAS;AAAA,IAC5B,IAAI,QAAQ,QAAQ,SAAS,kBAAkB;AAAA,MAC7C,OAAO,EAAE,SAAS,kBAAkB,CAAC,EAAE;AAAA,IACzC;AAAA,IACA,MAAM,mBAAmB,CAAC;AAAA,IAC1B,MAAM,WAAW,QAAQ,QAAQ,SAAS,IAAI,CAAC,YAAY;AAAA,MACzD,IAAI,QAAQ,SAAS;AAAA,QACnB,OAAO;AAAA,MACT,MAAM,WAAW,QAAQ;AAAA,MACzB,MAAM,kBAAkB,OAAO,aAAa,YAAY,SAAS,SAAS,IAAI,WAAW,KAAK,cAAc,gBAAgB;AAAA,MAC5H,iBAAiB,KAAK,eAAe;AAAA,MACrC,OAAO,KAAK,SAAS,mBAAmB,gBAAgB;AAAA,KACzD;AAAA,IACD,OAAO;AAAA,MACL,SAAS;AAAA,WACJ;AAAA,QACH,SAAS,KAAK,QAAQ,SAAS,SAAS;AAAA,MAC1C;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAEF,aAAa,CAAC,OAAO,SAAS;AAAA,IAC5B,MAAM,UAAU,qBAAqB,KAAK;AAAA,IAC1C,WAAW,WAAW,KAAK,iBAAiB;AAAA,MAC1C,QAAQ,SAAS,OAAO;AAAA,IAC1B;AAAA,IACA,MAAM,YAAY,WAAW,OAAO,YAAY,YAAY,gBAAgB,UAAU,QAAQ,aAAa;AAAA,IAC3G,IAAI,YAAY,aAAa,OAAO,cAAc,UAAU;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,MAAM,UAAU,KAAK,QAAQ,IAAI,SAAS;AAAA,IAC1C,IAAI,CAAC,WAAW,QAAQ,aAAa,CAAC,QAAQ,UAAU,OAAO,GAAG;AAAA,MAChE;AAAA,IACF;AAAA,IACA,aAAa,QAAQ,OAAO;AAAA,IAC5B,KAAK,QAAQ,OAAO,SAAS;AAAA,IAC7B,QAAQ,QAAQ,OAAO;AAAA;AAAA,EAEzB,gBAAgB,CAAC,QAAQ;AAAA,IACvB,YAAY,WAAW,YAAY,KAAK,SAAS;AAAA,MAC/C,aAAa,QAAQ,OAAO;AAAA,MAC5B,KAAK,QAAQ,OAAO,SAAS;AAAA,MAC7B,QAAQ,OAAO,IAAI,MAAM,MAAM,CAAC;AAAA,IAClC;AAAA;AAEJ;AACA,SAAS,qBAAqB,CAAC,SAAS;AAAA,EACtC,OAAO,IAAI,gBAAgB,OAAO;AAAA;;;ACtZpC,kBAAS;;;ACAT;AACA,0BAAS;AACT;AACA;AAEA,IAAM,WAAU,eAAc,YAAY,GAAG;AAC7C,IAAM,cAAa,cAAc,YAAY,GAAG;AAChD,IAAM,aAAY,QAAQ,WAAU;AAS7B,SAAS,YAAY,GAAW;AAAA,EACrC,MAAM,UAAU,QAAQ,IAAI;AAAA,EAC5B,IAAI,WAAW,WAAW,OAAO,GAAG;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EAEA,IAAI;AAAA,IACF,OAAO,SAAQ,QAAQ,sBAAsB;AAAA,IAC7C,MAAM;AAAA,EAIR,MAAM,aAAa;AAAA,IACjB,KAAK,YAAW,MAAM,gBAAgB,aAAa,cAAc,UAAU;AAAA,IAC3E,KAAK,YAAW,qCAAqC;AAAA,IACrD,KAAK,YAAW,mCAAmC;AAAA,IACnD,KAAK,YAAW,8BAA8B;AAAA,IAC9C,KAAK,YAAW,MAAM,MAAM,cAAc,UAAU;AAAA,EACtD;AAAA,EAEA,WAAW,QAAQ,YAAY;AAAA,IAC7B,IAAI,WAAW,IAAI,GAAG;AAAA,MACpB,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MACR,yGACF;AAAA;;;AD5BF,IAAM,qBAAqB;AAC3B,IAAM,6BAA6B;AACnC,IAAM,eAAe;AAErB,SAAS,UAAU,CAAC,QAAgB,OAAwB;AAAA,EAC1D,OAAO,SAAS,OAAO,KAAK;AAAA;AAG9B,SAAS,sBAAsB,CAAC,QAA+B;AAAA,EAC7D,MAAM,QAAQ,OAAO,MAAM,YAAY;AAAA,EACvC,OAAO,QAAQ,MAAM;AAAA;AAGhB,SAAS,uBAAuB,CACrC,SACA,UAAkE,CAAC,GACzD;AAAA,EACV,OAAO;AAAA,IACL;AAAA,IACA,GAAI,QAAQ,YAAY,YAAY,CAAC,aAAa,QAAQ,OAAO,IAAI,CAAC;AAAA,IACtE;AAAA,IACA;AAAA,IACA,QAAQ,UAAU;AAAA,EACpB;AAAA;AAGF,SAAS,gBAAgB,CAAC,OAA2B;AAAA,EACnD,IAAI,MAAM,aAAa,QAAQ,MAAM,eAAe;AAAA,IAAM;AAAA,EAC1D,MAAM,KAAK,SAAS;AAAA,EACpB,WAAW,MAAM;AAAA,IACf,IAAI,MAAM,aAAa,QAAQ,MAAM,eAAe,MAAM;AAAA,MACxD,MAAM,KAAK,SAAS;AAAA,IACtB;AAAA,KACC,IAAK,EAAE,QAAQ;AAAA;AAMb,SAAS,mBAAmB,CACjC,UAAsC,CAAC,GACR;AAAA,EAC/B,MAAM,UAAU,QAAQ,WAAW,aAAa;AAAA,EAChD,MAAM,OAAO,wBAAwB,SAAS,OAAO;AAAA,EACrD,MAAM,mBAAmB,QAAQ,oBAAoB;AAAA,EAErD,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACtC,MAAM,QAAQ,OAAM,QAAQ,UAAU,MAAM;AAAA,MAC1C,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,KAAK,QAAQ,QAAS,QAAQ,OAAO,CAAC,EAAG;AAAA,IAChD,CAAC;AAAA,IAED,IAAI,UAAU;AAAA,IACd,IAAI,SAAS;AAAA,IAEb,MAAM,UAAU,MAAM;AAAA,MACpB,MAAM,QAAQ,IAAI,QAAQ,QAAQ;AAAA,MAClC,MAAM,QAAQ,IAAI,QAAQ,QAAQ;AAAA,MAClC,MAAM,IAAI,SAAS,OAAO;AAAA,MAC1B,MAAM,IAAI,QAAQ,MAAM;AAAA,MACxB,aAAa,OAAO;AAAA;AAAA,IAGtB,MAAM,OAAO,CAAC,UAAiB;AAAA,MAC7B,IAAI;AAAA,QAAS;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,iBAAiB,KAAK;AAAA,MACtB,OAAO,KAAK;AAAA;AAAA,IAGd,MAAM,UAAU,CAAC,QAAgB;AAAA,MAC/B,IAAI;AAAA,QAAS;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,QACA,OAAO,MAAM,iBAAiB,KAAK;AAAA,MACrC,CAAC;AAAA;AAAA,IAGH,MAAM,WAAW,CAAC,UAAmB;AAAA,MACnC,SAAS,WAAW,QAAQ,KAAK;AAAA,MACjC,MAAM,MAAM,uBAAuB,MAAM;AAAA,MACzC,IAAI;AAAA,QAAK,QAAQ,GAAG;AAAA;AAAA,IAGtB,MAAM,WAAW,CAAC,UAAmB,SAAS,KAAK;AAAA,IACnD,MAAM,WAAW,CAAC,UAAmB;AAAA,MAGnC,SAAS,WAAW,QAAQ,KAAK;AAAA;AAAA,IAEnC,MAAM,UAAU,CAAC,UAAiB,KAAK,KAAK;AAAA,IAC5C,MAAM,SAAS,CAAC,MAAqB,WAAkC;AAAA,MACrE,IAAI;AAAA,QAAS;AAAA,MACb,KACE,IAAI,MACF,6DAA6D,QAAQ,kBAAkB,UAAU,WAC/F,SAAS;AAAA,EAAa,OAAO,KAAK,MAAM,IAE5C,CACF;AAAA;AAAA,IAGF,MAAM,UAAU,WAAW,MAAM;AAAA,MAC/B,KACE,IAAI,MACF,8DACE,SAAS;AAAA,EAAa,OAAO,KAAK,MAAM,IAE5C,CACF;AAAA,OACC,gBAAgB;AAAA,IAEnB,MAAM,QAAQ,GAAG,QAAQ,QAAQ;AAAA,IACjC,MAAM,QAAQ,GAAG,QAAQ,QAAQ;AAAA,IACjC,MAAM,KAAK,SAAS,OAAO;AAAA,IAC3B,MAAM,KAAK,QAAQ,MAAM;AAAA,GAC1B;AAAA;;;AEUH,IAAM,uBAAuB,IAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,oBAAoB,IAAI,IAAqB;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,yBAAwB,IAAI,IAAkB;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,iBAAiB,CAC/B,MACoB;AAAA,EACpB,IAAI,SAAS,aAAa,SAAS;AAAA,IAAW;AAAA,EAC9C,IAAI,SAAS;AAAA,IAAe,OAAO;AAAA,EACnC,IAAI,SAAS;AAAA,IAAqB,OAAO;AAAA,EACzC,IAAI,SAAS;AAAA,IAAQ,OAAO;AAAA,EAC5B;AAAA;AAGK,SAAS,aAAa,CAAC,SAAkC,UAAwB;AAAA,EACtF,IAAI,QAAQ,YAAY,OAAO;AAAA,IAC7B,MAAM,IAAI,MAAM,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ,QAAQ;AAAA,EAC9E;AAAA;AAGF,SAAS,eAAc,CAAC,OAA4D;AAAA,EAClF,IAAI,CAAC,SAAS,MAAM,WAAW;AAAA,IAAG;AAAA,EAClC,OAAO,uBAAsB,IAAI,KAAqB,IACjD,QACD;AAAA;AAGN,SAAS,iBAAiB,CAAC,OAA0C;AAAA,EACnE,OAAO,OAAO,UAAU,YAAY,kBAAkB,IAAI,KAAwB;AAAA;AAGpF,SAAS,cAAc,CAAC,OAAgB,MAAkC;AAAA,EACxE,IAAI,UAAU;AAAA,IAAW;AAAA,EACzB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AAAA,IACnD,MAAM,IAAI,MAAM,WAAW,oCAAoC;AAAA,EACjE;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,yBAAyB,CAAC,QAAiE;AAAA,EAClG,IAAI,OAAO,WAAW,UAAU;AAAA,IAC9B,IAAI,OAAO,WAAW,GAAG;AAAA,MACvB,MAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAAA,IACA,OAAO,EAAE,OAAO,OAAO;AAAA,EACzB;AAAA,EACA,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAAA,IAClE,MAAM,IAAI,MAAM,yEAAyE;AAAA,EAC3F;AAAA,EAEA,MAAM,QAAQ,eAAe,OAAO,OAAO,OAAO;AAAA,EAClD,MAAM,UAAU,eAAe,OAAO,SAAS,SAAS;AAAA,EACxD,MAAM,cAAc,eAAe,OAAO,aAAa,aAAa;AAAA,EACpE,MAAM,kBAAkB,OAAO;AAAA,EAC/B,IAAI,oBAAoB,aAAa,CAAC,kBAAkB,eAAe,GAAG;AAAA,IACxE,MAAM,IAAI,MACR,4BAA4B,OAAO,eAAe,qBAAqB,CAAC,GAAG,iBAAiB,EAAE,KAAK,IAAI,GACzG;AAAA,EACF;AAAA,EACA,IAAI,UAAU,cAAc,YAAY,aAAa,gBAAgB,YAAY;AAAA,IAC/E,MAAM,IAAI,MAAM,0FAA0F;AAAA,EAC5G;AAAA,EACA,IACE,UAAU,aACV,YAAY,aACZ,gBAAgB,aAChB,oBAAoB,WACpB;AAAA,IACA,MAAM,IAAI,MAAM,uFAAuF;AAAA,EACzG;AAAA,EACA,OAAO;AAAA,OACD,UAAU,YAAY,EAAE,MAAM,IAAI,CAAC;AAAA,OACnC,YAAY,YAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,OACvC,gBAAgB,YAAY,EAAE,YAAY,IAAI,CAAC;AAAA,OAC/C,oBAAoB,YAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,EAC7D;AAAA;AAGF,SAAS,4BAA4B,CAAC,OAAuD;AAAA,EAC3F,MAAM,UAA8B,CAAC;AAAA,EACrC,IAAI,MAAM,YAAY;AAAA,IAAW,QAAQ,WAAW,MAAM;AAAA,EAC1D,IAAI,MAAM,gBAAgB;AAAA,IAAW,QAAQ,eAAe,MAAM;AAAA,EAClE,IAAI,MAAM,UAAU,WAAW;AAAA,IAC7B,IAAI,MAAM,MAAM,SAAS,GAAG;AAAA,MAAG,QAAQ,eAAe,MAAM;AAAA,IACvD;AAAA,cAAQ,WAAW,MAAM;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CACxB,QACA,qBACoB;AAAA,EACpB,IAAI,CAAC;AAAA,IAAQ;AAAA,EACb,MAAM,aAAa,OAAO,QAAQ,GAAG;AAAA,EACrC,IAAI,eAAe;AAAA,IAAI,OAAO;AAAA,EAC9B,MAAM,WAAW,OAAO,MAAM,GAAG,UAAU;AAAA,EAC3C,MAAM,QAAQ,OAAO,MAAM,aAAa,CAAC;AAAA,EACzC,MAAM,eAAe,sBAAsB;AAAA,EAC3C,OAAO,eAAe,GAAG,gBAAgB,UAAU;AAAA;AAGrD,SAAS,gBAAgB,CAAC,OAAuE;AAAA,EAC/F,MAAM,gBAAgB,OAAO;AAAA,EAC7B,OAAO,OAAO,kBAAkB,WAAW,gBAAgB;AAAA;AAG7D,SAAS,kBAAkB,CAAC,OAAgD;AAAA,EAC1E,MAAM,SAAS,MAAM,YAAY;AAAA,EACjC,OAAO,OAAO,WAAW,WAAW,SAAS;AAAA;AAG/C,SAAS,qBAAqB,CAC5B,YACA,eACuB;AAAA,EACvB,IAAI,kBAAkB;AAAA,IAAW,OAAO;AAAA,EACxC,MAAM,UAAU,WAAW,OACzB,CAAC,UAAU,iBAAiB,MAAM,UAAU,MAAM,aACpD;AAAA,EACA,OAAO,QAAQ,SAAS,IAAI,UAAU;AAAA;AAGxC,SAAS,yBAAwB,CAAC,QAItB;AAAA,EACV,IAAI,OAAO,eAAe;AAAA,IAAqB,OAAO;AAAA,EACtD,MAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,OAAO,EAC5C,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC,EAChF,KAAK;AAAA,CAAI,EACT,YAAY;AAAA,EACf,OACE,SAAS,SAAS,qCAAqC,KACvD,SAAS,SAAS,2BAA2B,KAC7C,SAAS,SAAS,mBAAmB;AAAA;AAIzC,SAAS,uBAAuB,CAC9B,UAC2B;AAAA,EAC3B,IAAI,CAAC;AAAA,IAAU,OAAO;AAAA,EACtB,OAAO;AAAA,IACL,SAAS,SAAS,WAAW;AAAA,IAC7B,YAAY,SAAS,aAAa;AAAA,EACpC;AAAA;AAGF,SAAS,sBAAsB,CAAC,SAAiC;AAAA,EAC/D,IAAI,OAAO,YAAY;AAAA,IAAU,OAAO;AAAA,EACxC,IAAI,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC1B,MAAM,SAAmB,CAAC;AAAA,IAC1B,WAAW,QAAQ,SAAS;AAAA,MAC1B,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,OAAO,KAAK,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,OAAO,SAAS,UAAU;AAAA,QACpC,MAAM,SAAS;AAAA,QACf,IAAI,OAAO,OAAO,SAAS,UAAU;AAAA,UACnC,OAAO,KAAK,OAAO,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,SAAS,OAAO,KAAK,EAAE;AAAA,IAC7B,OAAO,OAAO,SAAS,IAAI,SAAS;AAAA,EACtC;AAAA,EACA,IAAI,WAAW,OAAO,YAAY,UAAU;AAAA,IAC1C,MAAM,SAAS;AAAA,IACf,IAAI,OAAO,OAAO,SAAS;AAAA,MAAU,OAAO,OAAO;AAAA,EACrD;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,sBAAsB,CAAC,MAAiE;AAAA,EAC/F,IAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAAA,IAC5D,OAAO,EAAE,OAAO,KAAgC;AAAA,EAClD;AAAA,EACA,MAAM,MAAM,OAAO,SAAS,WAAW,OAAO;AAAA,EAC9C,IAAI,CAAC;AAAA,IAAK,OAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EAC7B,IAAI;AAAA,IACF,MAAM,SAAS,KAAK,MAAM,GAAG;AAAA,IAC7B,IAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,MAClE,OAAO,EAAE,OAAO,QAAmC,IAAI;AAAA,IACzD;AAAA,IACA,MAAM;AAAA,EAGR,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,IAAI;AAAA;AAG/B,SAAS,aAAa,CAAC,OAAqE;AAAA,EAC1F,MAAM,YAAY,MAAM;AAAA,EACxB,IAAI,MAAM,QAAQ,SAAS,GAAG;AAAA,IAC5B,MAAM,QAAQ,UAAU;AAAA,IACxB,OAAO,SAAS,OAAO,UAAU,WAAY,QAAoC;AAAA,EACnF;AAAA,EACA,IAAI,aAAa,OAAO,cAAc,UAAU;AAAA,IAC9C,OAAO;AAAA,EACT;AAAA,EACA,MAAM,WAAW,MAAM;AAAA,EACvB,OAAO,YAAY,OAAO,aAAa,WAAY,WAAuC;AAAA;AAG5F,SAAS,eAAe,CAAC,OAAqE;AAAA,EAC5F,MAAM,cAAc,MAAM;AAAA,EAC1B,IAAI,MAAM,QAAQ,WAAW,GAAG;AAAA,IAC9B,MAAM,QAAQ,YAAY;AAAA,IAC1B,OAAO,SAAS,OAAO,UAAU,WAAY,QAAoC;AAAA,EACnF;AAAA,EACA;AAAA;AAGF,SAAS,YAAW,CAAC,SAA0B,SAAgC;AAAA,EAC7E,MAAM,aAAa,QAAQ;AAAA,EAC3B,IAAI,YAAY;AAAA,IACd,OACE,WAAW,aAAa,QAAQ,YAChC,WAAW,oBAAoB,QAAQ;AAAA,EAE3C;AAAA,EACA,MAAM,iBACJ,OAAO,QAAQ,aAAa,WACxB,QAAQ,WACR,OAAO,QAAQ,YAAY,WACzB,QAAQ,UACR;AAAA,EACR,MAAM,wBACJ,OAAO,QAAQ,oBAAoB,WAC/B,QAAQ,kBACR,OAAO,QAAQ,mBAAmB,WAChC,QAAQ,iBACR;AAAA,EAER,IAAI,kBAAkB,mBAAmB,QAAQ;AAAA,IAAU,OAAO;AAAA,EAClE,IAAI,yBAAyB,0BAA0B,QAAQ;AAAA,IAAiB,OAAO;AAAA,EACvF,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,SAA0D;AAAA,EACnF,IAAI,QAAQ,SAAS;AAAA,IAAgB,OAAO;AAAA,EAC5C,MAAM,QAAQ,QAAQ;AAAA,EACtB,OAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AAAA;AAGN,SAAS,uBAAsB,CAAC,OAAoD;AAAA,EAClF,OAAO,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe;AAAA;AAGvE,SAAS,iBAAgB,CAAC,OAAoD;AAAA,EAC5E,OAAO,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA;AAG3D,SAAS,sBAAqB,CAAC,OAA2D;AAAA,EACxF,OAAO,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA;AAGrE,SAAS,gBAAgB,CAAC,SAA0D;AAAA,EAClF,IAAI,QAAQ,SAAS;AAAA,IAAsB,OAAO;AAAA,EAClD,MAAM,aAAa,QAAQ;AAAA,EAC3B,OAAO,cAAc,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,UAAU,IAC3E,aACD;AAAA;AAGN,SAAS,eAAe,CAAC,SAA8C;AAAA,EACrE,MAAM,aAAa,iBAAiB,OAAO;AAAA,EAC3C,OAAO,OAAO,YAAY,WAAW,WAAW,WAAW,SAAS;AAAA;AAGtE,SAAS,gBAAgB,CAAC,SAAoC;AAAA,EAC5D,MAAM,eAAe,iBAAiB,OAAO,GAAG;AAAA,EAChD,OAAO,MAAM,QAAQ,YAAY,IAC7B,aAAa,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IACzE,CAAC;AAAA;AAGP,SAAS,UAAU,CAAC,SAA0C;AAAA,EAC5D,MAAM,QAAQ,QAAQ;AAAA,EACtB,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO,CAAC;AAAA,EACnC,OAAO,MAAM,QAAQ,CAAC,SAAS;AAAA,IAC7B,IAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI;AAAA,MAAG,OAAO,CAAC;AAAA,IACtE,MAAM,SAAS;AAAA,IACf,IAAI,OAAO,OAAO,OAAO;AAAA,MAAU,OAAO,CAAC;AAAA,IAC3C,OAAO;AAAA,MACL;AAAA,QACE,IAAI,OAAO;AAAA,QACX,iBACE,OAAO,OAAO,sBAAsB,WAAW,OAAO,oBAAoB;AAAA,QAC5E,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,QACtD,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,QAC5D,SAAS,OAAO;AAAA,QAChB,YAAY,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,MAC5E;AAAA,IACF;AAAA,GACD;AAAA;AAGI,SAAS,oBAAoB,CAAC,SAAqD;AAAA,EACxF,OAAO;AAAA;AAAA;AAGF,MAAe,wBAAoD;AAAA,EAyBnD;AAAA,EAxBX,aAAmD;AAAA,EACnD,UAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,WAA0B;AAAA,EAC1B,aAA4B;AAAA,EAC5B,kBAAiC;AAAA,EACjC,SAAS;AAAA,EACT,iBAAiD;AAAA,EAE1C;AAAA,EACA;AAAA,EACT,cAA4B,CAAC;AAAA,EAC7B,kBAA2D,CAAC;AAAA,EAC5D,uBAA4C;AAAA,EAC5C,aAAiC;AAAA,EACjC,eAA8B,CAAC;AAAA,EAC/B,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB;AAAA,EAEE,WAAW,CACA,MACnB,QACA;AAAA,IAFmB;AAAA,IAGnB,KAAK,QAAQ,OAAO;AAAA,IACpB,KAAK,mBAAmB,OAAO;AAAA;AAAA,OAG3B,WAAU,GAA4B;AAAA,IAC1C,IAAI,KAAK,aAAa;AAAA,MACpB,MAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAAA,IACA,IAAI,KAAK,QAAQ;AAAA,MACf,MAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,OAAO,MAAM,KAAK,4BAA4B;AAAA,MACpD,KAAK,aAAa,KAAK;AAAA,MACvB,KAAK,UAAU,KAAK;AAAA,MACpB,KAAK,WAAW,KAAK,QAAQ;AAAA,MAC7B,KAAK,kBAAkB,KAAK,QAAQ;AAAA,MACpC,KAAK,aAAa,GAAG,KAAK,QAAQ,YAAY,KAAK,QAAQ;AAAA,MAC3D,KAAK,iBAAiB,KAAK,iBAAiB;AAAA,MAC5C,KAAK,SACH,OAAO,KAAK,UAAU,WAClB,KAAK,QACL,OAAO,KAAK,gBAAgB,UAAU,WACpC,KAAK,eAAe,QACpB;AAAA,MACR,KAAK,YAAY,KAAK;AAAA,MACtB,KAAK,uBAAuB,KAAK,WAAW,UAAU,KAAK,qBAAqB;AAAA,MAChF,KAAK,cAAc;AAAA,MAEnB,MAAM,KAAK,wBAAwB;AAAA,MACnC,MAAM,KAAK,2BAA2B;AAAA,MAEtC,MAAM,cAA8B;AAAA,QAClC,MAAM;AAAA,QACN,SAAS,KAAK,QAAQ;AAAA,QACtB,WAAW,KAAK;AAAA,QAChB,gBAAgB,KAAK,QAAQ;AAAA,QAC7B,OAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAI,KAAK,cAAc;AAAA,QAAW,YAAY,QAAQ,KAAK;AAAA,MAC3D,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,KAAK,MAAM;AAAA,MACX,MAAM;AAAA;AAAA;AAAA,OAIJ,KAAI,CAAC,SAAqC;AAAA,IAC9C,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,SAAS;AAAA,MACrC,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IAEA,MAAM,KAAK,WAAW;AAAA,IAEtB,MAAM,OAAO,KAAK,cAAc,KAAK,OAAO;AAAA,IAC5C,IAAI;AAAA,MACF,KAAK,WAAW,gBAAgB,KAAK,SAAS,SAAS;AAAA,QACrD,iBAAiB,KAAK;AAAA,MACxB,CAAC;AAAA,MACD,OAAO,OAAO;AAAA,MACd,KAAK,kBAAkB,IAAI;AAAA,MAC3B,MAAM;AAAA;AAAA;AAAA,OAIJ,QAAO,CACX,SACA,WAA2B,CAAC,GACD;AAAA,IAC3B,IAAI,KAAK,cAAc,KAAK,aAAa,SAAS,GAAG;AAAA,MACnD,MAAM,IAAI,MACR,wCAAwC,KAAK,4EAC/C;AAAA,IACF;AAAA,IACA,MAAM,KAAK,KAAK,OAAO;AAAA,IACvB,iBAAiB,OAAO,KAAK,OAAO,GAAG;AAAA,MACrC,IAAI,IAAI,SAAS,UAAU;AAAA,QACzB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,YAAY,KAAK,IAAI,IAAI,KAAK;AAAA,MAC9B,gBAAgB,KAAK;AAAA,IACvB;AAAA;AAAA,SAGK,MAAM,GAA+B;AAAA,IAC1C,OAAO,MAAM;AAAA,MACX,MAAM,MAAM,MAAM,KAAK,YAAY;AAAA,MACnC,IAAI,CAAC;AAAA,QAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI,IAAI,SAAS;AAAA,QAAU;AAAA,IAC7B;AAAA;AAAA,OAGI,MAAK,GAAkB;AAAA,IAC3B,IAAI,CAAC,KAAK;AAAA,MAAa;AAAA,IACvB,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK;AAAA,MAAS;AAAA,IACvC,IAAI,KAAK;AAAA,MAAY,KAAK,WAAW,iBAAiB;AAAA,IACtD,MAAM,KAAK,WAAW,MAAM,KAAK,OAAO;AAAA;AAAA,OAQpC,YAAsE,CAC1E,SACA,SAC2B;AAAA,IAC3B,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,IAAI,CAAC,KAAK,YAAY;AAAA,MACpB,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IACA,IAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AAAA,MACrE,MAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAAA,IACA,IAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAK,WAAW,GAAG;AAAA,MACjE,MAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAAA,IAEA,IAAI,CAAC,WAAY,CAAC,QAAQ,gBAAgB,CAAC,QAAQ,aAAa,QAAQ,cAAc,WAAY;AAAA,MAChG,KAAK,WAAW,KAAK,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,QAAQ,SAAS,SAAS;AAAA,IAC1B,MAAM,WAAW,MAAM,KAAK,WAAW,QAAQ,MAAM,MAAM;AAAA,SACrD,QAAQ,cAAc,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,MAC1E,WAAW,QAAQ,YACf,CAAC,YAAY,QAAQ,YAAY,OAA6B,MAAM,OACpE,QAAQ,eACN,CAAC,YAAY,QAAQ,SAAS,QAAQ,eACtC;AAAA,IACR,CAAC;AAAA,IACD,OAAO;AAAA;AAAA,OAGH,WAAU,GAA8B;AAAA,IAC5C,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,IAAI,CAAC,KAAK,YAAY;AAAA,MACpB,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IACA,OAAO,KAAK,WAAW,WAAW;AAAA;AAAA,OAG9B,YAAW,CAAC,QAAiE;AAAA,IACjF,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,SAAS;AAAA,MACrC,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IAEA,MAAM,aAAa,0BAA0B,MAAM;AAAA,IACnD,MAAM,UAAU,MAAM,KAAK,0BAA0B,UAAU;AAAA,IAC/D,MAAM,SAAS,MAAM,KAAK,WAAW,YAAY,KAAK,SAAS,OAAO;AAAA,IAEtE,IAAI,OAAO,gBAAgB,WAAW;AAAA,MACpC,KAAK,SAAS,OAAO;AAAA,IACvB,EAAO,SAAI,QAAQ,iBAAiB,WAAW;AAAA,MAC7C,KAAK,SAAS,QAAQ;AAAA,IACxB,EAAO,SAAI,OAAO,OAAO,eAAe,UAAU,UAAU;AAAA,MAC1D,KAAK,SAAS,OAAO,cAAc;AAAA,IACrC;AAAA,IACA,IAAI,mBAAmB,QAAQ;AAAA,MAC7B,KAAK,iBAAiB,OAAO,iBAAiB;AAAA,IAChD;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,wBAAuB,CAC3B,UAA0C,CAAC,GACH;AAAA,IACxC,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,SAAS;AAAA,MACrC,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IACA,OAAO,KAAK,WAAW,wBAAwB,KAAK,SAAS,OAAO;AAAA;AAAA,OAGhE,aAAY,CAAC,UAA+B,CAAC,GAAgC;AAAA,IACjF,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,IAAI,CAAC,KAAK,YAAY;AAAA,MACpB,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IACA,MAAM,iBAAiB,QAAQ,kBAAkB,KAAK;AAAA,IACtD,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AAAA,IACA,OAAO,KAAK,WAAW,aAAa,gBAAgB,OAAO;AAAA;AAAA,OAGvD,eAAc,CAClB,UAAiC,CAAC,GACH;AAAA,IAC/B,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,MAAM,OAAO,MAAM,KAAK,aAAa;AAAA,MACnC,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,IAED,MAAM,QAA8B;AAAA,MAClC,SAAS,KAAK,YAAY;AAAA,MAC1B,gBAAgB,KAAK,mBAAmB;AAAA,MACxC,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,IACjB;AAAA,IACA,IAAI,KAAK,cAAc,WAAW;AAAA,MAChC,MAAM,QAAQ,KAAK;AAAA,IACrB;AAAA,IACA,IAAI,KAAK,eAAe,WAAW;AAAA,MACjC,MAAM,aAAa,KAAK;AAAA,IAC1B;AAAA,IACA,IAAI,KAAK,YAAY,WAAW;AAAA,MAC9B,MAAM,UAAU,KAAK;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,KAAK,GAAS;AAAA,IACZ,IAAI,KAAK;AAAA,MAAQ;AAAA,IACjB,KAAK,SAAS;AAAA,IACd,KAAK,uBAAuB;AAAA,IAC5B,KAAK,uBAAuB;AAAA,IAC5B,IAAI,KAAK,YAAY;AAAA,MAAS,aAAa,KAAK,WAAW,OAAO;AAAA,IAClE,WAAW,QAAQ,KAAK,cAAc;AAAA,MACpC,IAAI,KAAK;AAAA,QAAS,aAAa,KAAK,OAAO;AAAA,IAC7C;AAAA,IACA,KAAK,aAAa;AAAA,IAClB,KAAK,aAAa,SAAS;AAAA,IAC3B,KAAK,YAAY,MAAM;AAAA,IACvB,KAAK,aAAa;AAAA,IAClB,KAAK,YAAY;AAAA,IACjB,KAAK,WAAW,IAAI;AAAA;AAAA,MAGlB,OAAO,GAAkB;AAAA,IAC3B,OAAO,KAAK;AAAA;AAAA,MAGV,SAAS,GAAkB;AAAA,IAC7B,OAAO,KAAK;AAAA;AAAA,MAGV,cAAc,GAAkB;AAAA,IAClC,OAAO,KAAK;AAAA;AAAA,QAGP,OAAO,aAAa,GAAkB;AAAA,IAC3C,KAAK,MAAM;AAAA;AAAA,OAGP,kBAAiB,CACrB,SAMe;AAAA,IACf,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,SAAS;AAAA,MACrC,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IACA,MAAM,UAAmC,CAAC;AAAA,IAC1C,IAAI,QAAQ,QAAQ;AAAA,MAAW,QAAQ,MAAM,QAAQ;AAAA,IACrD,MAAM,OAAO,kBAAkB,QAAQ,cAAc;AAAA,IACrD,IAAI,SAAS;AAAA,MAAW,QAAQ,OAAO;AAAA,IACvC,IAAI,QAAQ,YAAY;AAAA,MAAW,QAAQ,WAAW,QAAQ;AAAA,IAC9D,IAAI,QAAQ,mBAAmB;AAAA,MAAW,QAAQ,kBAAkB,QAAQ;AAAA,IAE5E,KAAK,WAAW,KAAK;AAAA,MACnB,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA;AAAA,OAGG,cAAa,CAAC,mBAA0C;AAAA,IAC5D,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IACA,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,SAAS;AAAA,MACrC,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IACA,MAAM,WAAW,MAAM,KAAK,WAAW,QACrC,kBACA;AAAA,MACE,SAAS,KAAK;AAAA,MACd,oBAAoB;AAAA,IACtB,GACA,EAAE,WAAW,CAAC,YAAY,QAAQ,SAAS,0BAA0B,CACvE;AAAA,IACA,cAAc,UAAU,0BAA0B;AAAA;AAAA,OAKpC,wBAAuB,GAAkB;AAAA,OAIzC,WAAU,GAAkB;AAAA,EAIlC,WAAW,GAAS;AAAA,EAIpB,cAAc,GAAuD;AAAA,IAC7E,OAAO,KAAK,KAAK;AAAA;AAAA,EAGT,iBAAiB,CAAC,SAAsE;AAAA,IAEhG,OAAO;AAAA;AAAA,EAGC,eAAe,GAA4B;AAAA,IACnD,IAAI,CAAC,KAAK;AAAA,MAAS,OAAO,CAAC;AAAA,IAC3B,OAAO,EAAE,UAAU,KAAK,QAAQ,SAAS;AAAA;AAAA,EAGjC,QAAQ,CAAC,OAAqB;AAAA,IACtC,KAAK,SAAS;AAAA;AAAA,EAGR,aAAa,CAAC,SAAoC;AAAA,IACxD,MAAM,OAAoB;AAAA,MACxB,IAAI,EAAE,KAAK;AAAA,MACX;AAAA,MACA,iBAAiB,eAAe,KAAK,IAAI,KAAK,EAAE,KAAK;AAAA,MACrD,UAAU,KAAK,IAAI;AAAA,MACnB,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ,IAAI;AAAA,MACZ,sBAAsB;AAAA,MACtB,8BAA8B;AAAA,MAC9B,gBAAgB;AAAA,MAChB,SAAS;AAAA,IACX;AAAA,IAEA,IAAI,KAAK,YAAY;AAAA,MACnB,KAAK,aAAa,KAAK,IAAI;AAAA,IAC7B,EAAO;AAAA,MACL,KAAK,aAAa,IAAI;AAAA;AAAA,IAExB,OAAO;AAAA;AAAA,EAGD,YAAY,CAAC,MAAyB;AAAA,IAC5C,KAAK,aAAa;AAAA,IAClB,KAAK,YAAY,KAAK,IAAI;AAAA,IAC1B,KAAK,sBAAsB,KAAK;AAAA,IAChC,IAAI,KAAK,qBAAqB,WAAW;AAAA,MACvC,KAAK,UAAU,WAAW,MAAM;AAAA,QAC9B,KAAK,SAAS,MAAM,yBAAyB,KAAK,YAAY;AAAA,SAC7D,KAAK,gBAAgB;AAAA,MACvB,KAAK,QAAmC,QAAQ;AAAA,IACnD;AAAA;AAAA,EAGM,4BAA4B,GAAuB;AAAA,IACzD,IAAI,KAAK;AAAA,MAAY,OAAO,KAAK;AAAA,IACjC,MAAM,OAAO,KAAK,aAAa,MAAM;AAAA,IACrC,IAAI,CAAC;AAAA,MAAM,OAAO;AAAA,IAClB,KAAK,aAAa,IAAI;AAAA,IACtB,OAAO;AAAA;AAAA,EAGD,iBAAiB,CAAC,MAAyB;AAAA,IACjD,IAAI,KAAK;AAAA,MAAS,aAAa,KAAK,OAAO;AAAA,IAC3C,IAAI,KAAK,eAAe,MAAM;AAAA,MAC5B,KAAK,aAAa;AAAA,MAClB;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,KAAK,aAAa,QAAQ,IAAI;AAAA,IAC5C,IAAI,UAAU;AAAA,MAAI,KAAK,aAAa,OAAO,OAAO,CAAC;AAAA;AAAA,EAG7C,QAAQ,CAAC,MAAmB,QAAsB;AAAA,IACxD,IAAI,KAAK,eAAe;AAAA,MAAM;AAAA,IAC9B,KAAK,QAAQ;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,IACf,CAAC;AAAA,IACD,KAAK,mBAAmB;AAAA,MACtB,SAAS,KAAK;AAAA,MACd,YAAY;AAAA,MACZ,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,MACvB,SAAS;AAAA,MACT;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA;AAAA,EAGK,kBAAkB,CAAC,MAA+B;AAAA,IACxD,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,IAAI,OAAO,SAAS;AAAA,MAClB,aAAa,OAAO,OAAO;AAAA,MAC3B,OAAO,UAAU;AAAA,IACnB;AAAA,IACA,KAAK,QAAQ,KAAK,eAAe,MAAM,MAAM,CAAC;AAAA,IAC9C,KAAK,aAAa;AAAA;AAAA,OAGN,0BAAyB,CACrC,OAC6B;AAAA,IAC7B,IAAI,MAAM,oBAAoB,WAAW;AAAA,MACvC,OAAO,6BAA6B,KAAK;AAAA,IAC3C;AAAA,IACA,IAAI,CAAC,KAAK,YAAY;AAAA,MACpB,MAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,IAEA,MAAM,UAAU,MAAM,KAAK,WAAW,WAAW;AAAA,IACjD,MAAM,OAAO,IAAI,IAAI,QAAQ,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AAAA,IACtE,MAAM,UAAU,QAAQ;AAAA,IAExB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,IAAI,MAAM,YAAY,WAAW;AAAA,MAC/B,YAAY,KAAK,IAAI,MAAM,OAAO;AAAA,MAClC,iBAAiB,MAAM;AAAA,MACvB,eAAe,WAAW,UAAU,kBAAkB,MAAM,aAAa,OAAO;AAAA,IAClF,EAAO,SAAI,MAAM,gBAAgB,WAAW;AAAA,MAC1C,iBAAiB,MAAM;AAAA,MACvB,eAAe,kBAAkB,MAAM,aAAa,OAAO;AAAA,IAC7D,EAAO,SAAI,MAAM,UAAU,WAAW;AAAA,MACpC,YAAY,KAAK,IAAI,MAAM,KAAK;AAAA,MAChC,IAAI,WAAW;AAAA,QACb,eAAe,UAAU;AAAA,MAC3B,EAAO;AAAA,QACL,iBAAiB,MAAM;AAAA,QACvB,eAAe,kBAAkB,MAAM,OAAO,OAAO;AAAA;AAAA,IAEzD,EAAO;AAAA,MACL,iBAAiB,KAAK,UAAU;AAAA,MAChC,eAAe,kBAAkB,KAAK,UAAU,WAAW,OAAO;AAAA;AAAA,IAGpE,IAAI,CAAC,cAAc;AAAA,MACjB,MAAM,IAAI,MAAM,iFAAiF;AAAA,IACnG;AAAA,IAEA,MAAM,aAAa,QAAQ,QAAQ,OACjC,CAAC,UAAU,MAAM,WAAW,gBAAgB,MAAM,WAAW,cAC/D;AAAA,IACA,IAAI,WAAW,WAAW,GAAG;AAAA,MAC3B,MAAM,IAAI,MACR,kFAAkF,eACpF;AAAA,IACF;AAAA,IAEA,MAAM,gBACJ,iBAAiB,WAAW,UAAU,KAAK,iBAAiB,KAAK,cAAc;AAAA,IACjF,MAAM,mBAAmB,sBAAsB,YAAY,aAAa;AAAA,IACxE,MAAM,gBACJ,iBAAiB,KAAK,CAAC,UAAU,mBAAmB,KAAK,MAAM,MAAM,eAAe,KACpF,WAAW,KAAK,CAAC,UAAU,mBAAmB,KAAK,MAAM,MAAM,eAAe;AAAA,IAEhF,IAAI,CAAC,eAAe;AAAA,MAClB,MAAM,IAAI,MACR,MAAM,MAAM,kDAAkD,eAChE;AAAA,IACF;AAAA,IAEA,MAAM,UAA8B,EAAE,UAAU,cAAc,GAAG;AAAA,IACjE,IAAI,mBAAmB,WAAW;AAAA,MAChC,QAAQ,eAAe;AAAA,IACzB;AAAA,IACA,OAAO;AAAA;AAAA,OAGO,2BAA0B,GAAkB;AAAA,IAC1D,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK;AAAA,MAAS;AAAA,IAEvC,MAAM,UAAU,KAAK,eAAe;AAAA,IAEpC,IAAI,KAAK,kBAAkB,OAAO,GAAG;AAAA,MACnC,MAAM,WAAW,MAAM,KAAK,WAAW,QACrC,gBACA,KAAK,gBAAgB,GACrB,EAAE,WAAW,CAAC,YAAY,QAAQ,SAAS,wBAAwB,CACrE;AAAA,MACA,cAAc,UAAU,wBAAwB;AAAA,IAClD;AAAA,IAEA,MAAM,mBAAmB,wBAAwB,QAAQ,QAAQ;AAAA,IACjE,IAAI,kBAAkB;AAAA,MACpB,MAAM,WAAW,MAAM,KAAK,WAAW,QACrC,2BACA;AAAA,QACE,SAAS,KAAK;AAAA,QACd,UAAU;AAAA,QACV,OAAO;AAAA,MACT,GACA,EAAE,WAAW,CAAC,YAAY,QAAQ,SAAS,mCAAmC,CAChF;AAAA,MACA,cAAc,UAAU,oCAAoC;AAAA,IAC9D;AAAA,IAEA,IAAI,KAAK,KAAK,SAAS;AAAA,MAAW;AAAA,IAElC,IACE,KAAK,KAAK,QAAQ,UAAU,aAC5B,KAAK,KAAK,QAAQ,oBAAoB,WACtC;AAAA,MACA,MAAM,KAAK,YAAY;AAAA,WACjB,KAAK,KAAK,QAAQ,UAAU,YAAY,EAAE,OAAO,KAAK,KAAK,QAAQ,MAAM,IAAI,CAAC;AAAA,WAC9E,KAAK,KAAK,QAAQ,oBAAoB,YACtC,EAAE,iBAAiB,KAAK,KAAK,QAAQ,gBAAgB,IACrD,CAAC;AAAA,MACP,CAAC;AAAA,IACH;AAAA;AAAA,EAOM,wBAAwB,CAAC,YAAmC;AAAA,IAClE,IAAI,CAAC,KAAK,WAAW,CAAC,aAAY,SAAS,KAAK,OAAO;AAAA,MAAG;AAAA,IAE1D,IAAI,QAAQ,SAAS,gBAAgB;AAAA,MACnC,MAAM,cAAoC;AAAA,QACxC,MAAM;AAAA,QACN,OAAO,WAAW,OAAO;AAAA,MAC3B;AAAA,MACA,KAAK,QAAQ,WAAU;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,SAAS,sBAAsB;AAAA,MACzC,KAAK,wBAAwB,OAAO;AAAA,MACpC;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,kBAAkB,OAAO;AAAA,IACvC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,SAAS,KAAK,6BAA6B;AAAA,IACjD,IAAI,QAAQ;AAAA,MACV,OAAO,uBAAuB;AAAA,MAC9B,MAAM,QAAQ,kBAAiB,KAAK;AAAA,MACpC,IAAI;AAAA,QAAO,OAAO,OAAO,IAAI,KAAK;AAAA,IACpC;AAAA,IAEA,MAAM,aAAa,KAAK,qBAAqB,KAAK;AAAA,IAClD,IAAI,YAAY;AAAA,MACd,KAAK,QAAQ,UAAU;AAAA,IACzB;AAAA,IAEA,KAAK,wBAAwB,OAAO,UAAU;AAAA;AAAA,EAGxC,uBAAuB,CAAC,SAAgC;AAAA,IAC9D,MAAM,SAAS,gBAAgB,OAAO;AAAA,IACtC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,eAAe,iBAAiB,OAAO;AAAA,IAC7C,MAAM,aAAmC;AAAA,MACvC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,IACA,KAAK,QAAQ,UAAU;AAAA,IAEvB,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,WAAW,SAAS;AAAA,MAAc,OAAO,OAAO,IAAI,KAAK;AAAA,IAEzD,MAAM,kBAAkB,OAAO,wBAAwB,OAAO;AAAA,IAC9D,IAAI,CAAC;AAAA,MAAiB;AAAA,IACtB,IAAI,WAAW,uBAAuB;AAAA,MACpC,KAAK,mBAAmB;AAAA,QACtB,SAAS,OAAO;AAAA,QAChB,YAAY;AAAA,QACZ,QAAQ,CAAC,GAAG,OAAO,MAAM;AAAA,MAC3B,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IACA,IAAI,WAAW,sBAAsB,OAAO,gBAAgB;AAAA,MAC1D,KAAK,mBAAmB;AAAA,QACtB,SAAS,OAAO;AAAA,QAChB,YAAY;AAAA,QACZ,QAAQ,CAAC,GAAG,OAAO,MAAM;AAAA,QACzB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IACA,IAAI,WAAW,sBAAsB,OAAO,sBAAsB;AAAA,MAChE,KAAK,mBAAmB;AAAA,QACtB,SAAS,OAAO;AAAA,QAChB,YAAY;AAAA,QACZ,QAAQ,CAAC,GAAG,OAAO,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA;AAAA,EAGM,uBAAuB,CAC7B,OACA,YACM;AAAA,IACN,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,cAAc,wBAAuB,KAAK;AAAA,IAChD,IAAI,gBAAgB,eAAe;AAAA,MACjC,MAAM,aAAa,uBAAsB,KAAK,KAAK;AAAA,MACnD,IAAI,eAAe,qBAAqB;AAAA,QACtC,OAAO,+BAA+B;AAAA,QACtC;AAAA,MACF;AAAA,MACA,KAAK,mBAAmB;AAAA,QACtB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ,CAAC,GAAG,OAAO,MAAM;AAAA,MAC3B,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,IAAI,YAAY,SAAS,SAAS;AAAA,MAChC,KAAK,mBAAmB;AAAA,QACtB,SAAS,OAAO;AAAA,QAChB,YAAY,WAAW;AAAA,QACvB,QAAQ,CAAC,GAAG,OAAO,MAAM;AAAA,QACzB,SAAS;AAAA,QACT,QAAQ,WAAW,eAAe,WAAW;AAAA,QAC7C,WAAW,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AAAA;AAAA,EAGM,oBAAoB,CAAC,OAAmD;AAAA,IAC9E,MAAM,cAAc,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe;AAAA,IAClF,MAAM,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,IAChE,MAAM,OAAO,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,GAAG,KAAK,SAAS,EAAE,KAAK;AAAA,IAE/E,IAAI,gBAAgB,qBAAqB;AAAA,MACvC,MAAM,UAAU,uBAAuB,MAAM,OAAO;AAAA,MACpD,IAAI,CAAC;AAAA,QAAS,OAAO;AAAA,MACrB,IAAI,KAAK;AAAA,QAAY,KAAK,WAAW,iBAAiB;AAAA,MACtD,OAAO,EAAE,MAAM,aAAa,SAAS,MAAM,MAAM;AAAA,IACnD;AAAA,IAEA,IAAI,gBAAgB,qBAAqB;AAAA,MACvC,MAAM,UAAU,OAAO,MAAM,cAAc,WACvC,MAAM,YACN,uBAAuB,MAAM,OAAO;AAAA,MACxC,IAAI,CAAC;AAAA,QAAS,OAAO;AAAA,MACrB,OAAO,EAAE,MAAM,aAAa,SAAS,MAAM,MAAM;AAAA,IACnD;AAAA,IAEA,IAAI,gBAAgB,uBAAuB,gBAAgB,4BAA4B;AAAA,MACrF,MAAM,WAAW,cAAc,KAAK;AAAA,MACpC,IAAI,CAAC;AAAA,QAAU,OAAO;AAAA,MACtB,MAAM,KAAK,SAAS,YAAY,OAAO,SAAS,aAAa,WACxD,SAAS,WACV;AAAA,MACJ,MAAM,cACH,OAAO,SAAS,iBAAiB,WAAW,SAAS,eAAe,eACpE,OAAO,SAAS,OAAO,WAAW,SAAS,KAAK;AAAA,MACnD,IAAI,CAAC,YAAY;AAAA,QACf,MAAM,SAAS,2BAA2B,qBAAqB;AAAA,QAC/D,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,WAAW;AAAA,UACX,YAAY;AAAA,UACZ;AAAA,UACA,aAAa;AAAA,UACb,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,MAAM,YACH,OAAO,SAAS,SAAS,WAAW,SAAS,OAAO,eACpD,OAAO,IAAI,SAAS,WAAW,GAAG,OAAO,cAC1C;AAAA,MACF,QAAQ,OAAO,QAAQ,uBAAuB,SAAS,aAAa,IAAI,SAAS;AAAA,MACjF,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,cAAc;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,gBAAgB,uBAAuB;AAAA,MACzC,MAAM,aAAa,gBAAgB,KAAK,KAAK;AAAA,MAC7C,MAAM,cACH,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe,eAC9D,OAAO,WAAW,iBAAiB,WAAW,WAAW,eAAe;AAAA,MAC3E,IAAI,CAAC;AAAA,QAAY,OAAO;AAAA,MACxB,MAAM,UACJ,uBAAuB,MAAM,eAAe,WAAW,eAAe,WAAW,OAAO,KAAK;AAAA,MAC/F,MAAM,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS,WAAW;AAAA,MAC5E,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,gBAAgB,mBAAmB,gBAAgB,cAAc;AAAA,MACnE,MAAM,UACH,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS,eAClD,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU,cACrD,GAAG,KAAK;AAAA,MACV,MAAM,cACH,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,eAC5D,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa,cAC3D;AAAA,MACF,MAAM,mBAAmB,0BAAyB;AAAA,QAChD;AAAA,QACA,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,QAC7D;AAAA,MACF,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,mBAAmB,sBAAsB,gBAAe,UAAU;AAAA,QAC7E,kBAAkB,oBAAoB;AAAA,QACtC,aAAa,mBAAmB,OAAO;AAAA,QACvC,aAAa;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,gBAAgB,SAAS;AAAA,MAC3B,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,QAC1D,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,QAC7D,aAAa,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe;AAAA,QAC3E,SAAS,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,gBAAgB,iBAAiB,gBAAgB,QAAQ;AAAA,MAC3D,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,IACF;AAAA;AAAA,EAGM,cAAc,CAAC,MAAyB,SAAyC;AAAA,IACvF,MAAM,aAAa,KAAK,eAAe,KAAK,YAAY,QAAQ,UAAU;AAAA,IAC1E,MAAM,mBAAmB,0BAAyB;AAAA,MAChD,QAAQ,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AAAA,IACD,MAAM,UAAU,KAAK,YAAY,YAC7B,KAAK,WAAW,CAAC,oBAAoB,CAAC,qBAAqB,IAAI,cAAc,EAAE,IAC/E,CAAC,oBAAoB,CAAC,qBAAqB,IAAI,cAAc,EAAE;AAAA,IACnE,MAAM,YAAY,mBACd,sBACC,KAAK,aAAa,gBAAe,UAAU;AAAA,IAEhD,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,UAAW,SAAS,iBAAiB,YAAa;AAAA,MAC1D,OAAO,UAAU,YAAa,aAAa,cAAc;AAAA,MACzD,WAAW,UAAU,YAAa,aAAa;AAAA,MAC/C,kBAAkB,oBAAoB;AAAA,MACtC,aAAa,mBAAmB,OAAO,UAAU,YAAY;AAAA,MAC7D,aAAa,UAAU,YAAY,KAAK;AAAA,MACxC;AAAA,MACA,YAAY,KAAK,IAAI,KAAK,SAAS,aAAa,KAAK;AAAA,MACrD,gBAAgB,KAAK,QAAQ;AAAA,MAC7B,QAAQ,KAAK,OAAO,SAAS,IAAI,KAAK,SAAS;AAAA,IACjD;AAAA;AAAA,EAGM,OAAO,CAAC,SAA2B;AAAA,IACzC,MAAM,WAAW,KAAK,gBAAgB,MAAM;AAAA,IAC5C,IAAI,UAAU;AAAA,MACZ,SAAS,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,IACA,KAAK,YAAY,KAAK,OAAO;AAAA;AAAA,EAGvB,WAAW,GAA+B;AAAA,IAChD,MAAM,OAAO,KAAK,YAAY,MAAM;AAAA,IACpC,IAAI;AAAA,MAAM,OAAO,QAAQ,QAAQ,IAAI;AAAA,IACrC,IAAI,KAAK;AAAA,MAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,IAC5C,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,gBAAgB,KAAK,OAAO;AAAA,KAClC;AAAA;AAAA,EAGK,UAAU,CAAC,OAAgC;AAAA,IACjD,WAAW,WAAW,KAAK,gBAAgB,OAAO,CAAC,GAAG;AAAA,MACpD,QAAQ,KAAK;AAAA,IACf;AAAA;AAEJ;;;AChuCO,SAAS,cAAc,CAC5B,OACsB;AAAA,EACtB,MAAM,QAAQ,OAAO;AAAA,EACrB,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,IAAG;AAAA,EAC3B,OAAO,MAAM,QAAQ,CAAC,SAAS;AAAA,IAC7B,IAAI,OAAO,SAAS,YAAY,KAAK,SAAS;AAAA,MAAG,OAAO,CAAC,IAAI;AAAA,IAC7D,IAAI,CAAC,QAAQ,OAAO,SAAS;AAAA,MAAU,OAAO,CAAC;AAAA,IAC/C,MAAM,OAAQ,KAA4B;AAAA,IAC1C,OAAO,OAAO,SAAS,YAAY,KAAK,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,GAChE;AAAA;AAyBH,IAAM,wBAAuB;AAE7B,SAAS,oBAAoB,CAAC,OAAwB;AAAA,EACpD,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,KAAK;AAAA;AAGlB,SAAS,yBAAwB,CAAC,MAAsC;AAAA,EACtE,MAAM,iBAA2B,CAAC;AAAA,EAClC,IAAI,eAAe;AAAA,EAEnB,WAAW,OAAO,QAAQ,CAAC,GAAG;AAAA,IAC5B,IAAI,QAAQ,uBAAsB;AAAA,MAChC,IAAI;AAAA,QAAc;AAAA,MAClB,eAAe;AAAA,IACjB;AAAA,IACA,eAAe,KAAK,GAAG;AAAA,EACzB;AAAA,EAEA,IAAI,CAAC,cAAc;AAAA,IACjB,eAAe,KAAK,qBAAoB;AAAA,EAC1C;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,uCAAuC,CAAC,SAAmC;AAAA,EAClF,IAAI,QAAQ,iBAAiB,aAAa,QAAQ,oBAAoB,WAAW;AAAA,IAC/E,MAAM,IAAI,MAAM,6EAA6E;AAAA,EAC/F;AAAA,EACA,IAAI,QAAQ,eAAe,WAAW;AAAA,IACpC,MAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AAAA,EACA,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,MAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AAAA,EACA,IAAI,QAAQ,uBAAuB,WAAW;AAAA,IAC5C,MAAM,IAAI,MAAM,6EAA6E;AAAA,EAC/F;AAAA,EACA,IAAI,QAAQ,UAAU,aAAa,WAAW;AAAA,IAC5C,MAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AAAA;AAGK,SAAS,mCAAmC,CACjD,QACA,SACM;AAAA,EACN,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,MAAM,IAAI,MAAM,cAAc,2EAA2E;AAAA,EAC3G;AAAA,EACA,IAAI,QAAQ,iBAAiB,aAAa,QAAQ,oBAAoB,WAAW;AAAA,IAC/E,MAAM,IAAI,MAAM,cAAc,6DAA6D;AAAA,EAC7F;AAAA,EACA,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,MAAM,IAAI,MAAM,cAAc,uDAAuD;AAAA,EACvF;AAAA,EACA,IAAI,QAAQ,uBAAuB,WAAW;AAAA,IAC5C,MAAM,IAAI,MAAM,cAAc,6DAA6D;AAAA,EAC7F;AAAA,EACA,IAAI,QAAQ,UAAU,aAAa,WAAW;AAAA,IAC5C,MAAM,IAAI,MAAM,cAAc,4DAA4D;AAAA,EAC5F;AAAA,EACA,IAAK,QAAuC,iBAAiB,WAAW;AAAA,IACtE,MAAM,IAAI,MAAM,cAAc,yCAAyC;AAAA,EACzE;AAAA,EACA,IAAI,QAAQ,2BAA2B,WAAW;AAAA,IAChD,MAAM,IAAI,MAAM,cAAc,0FAA0F;AAAA,EAC1H;AAAA;AAGF,SAAS,oBAAoB,CAAC,OAAyD;AAAA,EACrF,MAAM,aAAa,KAAK,MAAM;AAAA,EAC9B,IAAI,WAAW,UAAU,aAAa,OAAO,WAAW,YAAY,UAAU;AAAA,IAC5E,WAAW,QAAQ,WAAW;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,eAAe,CAC7B,SACA,WAA8C,CAAC,GACtB;AAAA,EACzB,wCAAwC,OAAO;AAAA,EAE/C,MAAM,mBAAmB,SAAS,uBAAuB;AAAA,EACzD,MAAM,OAAgC,CAAC;AAAA,EACvC,IAAI,oBAAoB,QAAQ,SAAS,WAAW;AAAA,IAClD,KAAK,OAAO,mBAAmB,0BAAyB,QAAQ,IAAI,IAAI,QAAQ;AAAA,EAClF;AAAA,EAEA,IAAI,QAAQ,UAAU;AAAA,IAAW,KAAK,QAAQ,QAAQ;AAAA,EACtD,IAAI,QAAQ,cAAc;AAAA,IAAW,KAAK,YAAY,QAAQ;AAAA,EAE9D,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,IAAI,OAAO,QAAQ,iBAAiB,UAAU;AAAA,MAC5C,IAAI,qBAAqB,QAAQ,YAAY,GAAG;AAAA,QAC9C,MAAM,IAAI,MAAM,4EAA4E;AAAA,MAC9F;AAAA,MACA,KAAK,SAAS,QAAQ;AAAA,IACxB,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,mFAAmF;AAAA;AAAA,EAEvG;AAAA,EAEA,MAAM,eAA+C,CAAC;AAAA,EACtD,MAAM,WAAqB,CAAC;AAAA,EAC5B,WAAW,QAAQ,QAAQ,UAAU,CAAC,GAAG;AAAA,IACvC,IAAI,OAAO,SAAS,UAAU;AAAA,MAC5B,MAAM,IAAI,MAAM,oEAAoE;AAAA,IACtF;AAAA,IACA,IAAI,aAAa,MAAM;AAAA,MACrB,SAAS,KAAK,KAAK,OAAO;AAAA,IAC5B,EAAO;AAAA,MACL,aAAa,KAAK,qBAAqB,IAA0C,CAAC;AAAA;AAAA,EAEtF;AAAA,EACA,IAAI,QAAQ,YAAY,WAAW;AAAA,IACjC,aAAa,KAAK,EAAE,OAAO,WAAW,OAAO,QAAQ,QAAQ,CAAC;AAAA,EAChE;AAAA,EACA,IAAI,QAAQ,UAAU,WAAW;AAAA,IAC/B,aAAa,KAAK,EAAE,OAAO,SAAS,OAAO,QAAQ,MAAM,CAAC;AAAA,EAC5D;AAAA,EACA,IAAI,aAAa,SAAS;AAAA,IAAG,KAAK,gBAAgB;AAAA,EAClD,IAAI,SAAS,SAAS;AAAA,IAAG,KAAK,YAAY;AAAA,EAE1C,OAAO;AAAA;AAGF,SAAS,kBAAkB,CAAC,OAA+E;AAAA,EAChH,IAAI,CAAC,SAAS,MAAM,WAAW;AAAA,IAAG;AAAA,EAClC,OAAO;AAAA,IACL;AAAA,MACE,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAC1B,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA;AAGK,SAAS,6BAA6B,CAC3C,eACkC;AAAA,EAClC,OAAO,OAAO,YAAY;AAAA,IACxB,MAAM,OAAO,cAAc,IAAI,QAAQ,SAAS;AAAA,IAChD,IAAI,CAAC,MAAM;AAAA,MACT,MAAM,IAAI,MAAM,0BAA0B,QAAQ,WAAW;AAAA,IAC/D;AAAA,IACA,MAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,cAAc,QAAQ,KAAK;AAAA,IACrE,OAAO;AAAA,MACL,SAAS,OAAO,QAAQ,IAAI,CAAC,UAAU;AAAA,QACrC,MAAM,KAAK;AAAA,WACP,KAAK,SAAS,YAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,WACjD,KAAK,SAAS,YAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,WACjD,KAAK,aAAa,YAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,MACnE,EAAE;AAAA,IACJ;AAAA;AAAA;AAkBJ,eAAsB,4BAA4B,CAChD,SACA,UACA,WAC6B;AAAA,EAC7B,MAAM,cAAc,OAAO,QAAQ,eAAe;AAAA,EAClD,MAAM,4BAA4B,yBAAyB,QAAQ;AAAA,EAEnE,IAAI,6BAA6B,CAAC,aAAa;AAAA,IAC7C,OAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ,mBAAmB,uBAAuB,CAAC,2BAA2B;AAAA,IAChF,OAAO,EAAE,UAAU,SAAS,cAAc,MAAM,oBAAoB,CAAC,EAAE;AAAA,EACzE;AAAA,EAEA,IAAI,aAAa;AAAA,IACf,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,QAAQ,WAAY,UAAU,SAAS;AAAA,MAC5D,IAAI,OAAO,aAAa,SAAS;AAAA,QAC/B,OAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS,OAAO;AAAA,UAChB,cAAc,OAAO,gBAAgB;AAAA,UACrC,oBAAoB,OAAO,sBAAsB,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS,OAAO,WAAW;AAAA,QAC3B,WAAW,OAAO,aAAa;AAAA,MACjC;AAAA,MACA,OAAO,OAAO;AAAA,MACd,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD,WAAW;AAAA,MACb;AAAA;AAAA,EAEJ;AAAA,EAEA,IAAI,wBAAwB,QAAQ,GAAG;AAAA,IACrC,OAAO,EAAE,UAAU,SAAS,cAAc,MAAM,oBAAoB,CAAC,EAAE;AAAA,EACzE;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA;AAGF,SAAS,sBAAsB,CAAC,OAA+B;AAAA,EAC7D,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,IAAI,CAAC,SAAS,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EAChD,MAAM,SAAS;AAAA,EACf,IAAI,OAAO,OAAO,OAAO;AAAA,IAAU,OAAO,OAAO;AAAA,EACjD,IAAI,OAAO,OAAO,kBAAkB;AAAA,IAAU,OAAO,OAAO;AAAA,EAC5D,IAAI,OAAO,OAAO,6BAA6B;AAAA,IAAU,OAAO,OAAO;AAAA,EACvE,OAAO;AAAA;AAGF,SAAS,2BAA2B,CACzC,UACmC;AAAA,EACnC,IAAI,SAAS,aAAa,QAAQ;AAAA,IAChC,OAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,SAAS;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,mCAAmC,SAAS,sBAAsB,CAAC,GACtE,IAAI,sBAAsB,EAC1B,OAAO,CAAC,OAAqB,OAAO,IAAI;AAAA,EAE3C,OAAO;AAAA,IACL,UAAU;AAAA,OACN,SAAS,YAAY,YAAY,EAAE,SAAS,SAAS,QAAQ,IAAI,CAAC;AAAA,IACtE,eAAe,SAAS,gBAAgB;AAAA,IACxC,oCAAoC;AAAA,EACtC;AAAA;AAGF,SAAS,YAAY,CAAC,OAAoD;AAAA,EACxE,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK;AAAA,IAAG;AAAA,EACjE,MAAM,SAAiC,CAAC;AAAA,EACxC,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAgC,GAAG;AAAA,IAC3E,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO,OAAO;AAAA,EAC/C;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,YAAY,CAAC,OAAqD;AAAA,EACzE,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK;AAAA,IAAG;AAAA,EACjE,OAAO,KAAM,MAAkC;AAAA;AAGjD,SAAS,2BAA2B,CAAC,UAAgD;AAAA,EACnF,IAAI,CAAC,SAAS,SAAS;AAAA,IACrB,MAAM,IAAI,MAAM,SAAS,SAAS,mBAAmB;AAAA,EACvD;AAAA,EAEA,MAAM,UAAU,MAAM,QAAQ,SAAS,OAAO,IAC1C,SAAS,QAAQ,QAAQ,CAAC,UAAU;AAAA,IAClC,IAAI,CAAC,SAAS,OAAO,UAAU;AAAA,MAAU,OAAO,CAAC;AAAA,IACjD,MAAM,SAAS;AAAA,IACf,IACE,OAAO,OAAO,OAAO,YACrB,OAAO,OAAO,WAAW,YACzB,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,gBAAgB,UAC9B;AAAA,MACA,OAAO,CAAC;AAAA,IACV;AAAA,IACA,MAAM,aAAa,aAAa,OAAO,UAAU;AAAA,IACjD,OAAO;AAAA,MACL;AAAA,QACE,IAAI,OAAO;AAAA,QACX,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,aAAa,OAAO;AAAA,WAChB,OAAO,OAAO,cAAc,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,WAC3E,OAAO,OAAO,eAAe,YAAY,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,WAC9E,OAAO,OAAO,SAAS,YAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,WAC5D,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACrC;AAAA,IACF;AAAA,GACD,IACD,CAAC;AAAA,EAEL,MAAM,SAA2B,EAAE,QAAQ;AAAA,EAC3C,IAAI,SAAS,sBAAsB,MAAM;AAAA,IACvC,OAAO,mBAAmB;AAAA,EAC5B,EAAO,SAAI,MAAM,QAAQ,SAAS,iBAAiB,GAAG;AAAA,IACpD,OAAO,mBAAmB,SAAS,kBAAkB,OACnD,CAAC,WAA6B,OAAO,WAAW,QAClD;AAAA,EACF;AAAA,EACA,MAAM,UAAU,aAAa,SAAS,qBAAqB;AAAA,EAC3D,IAAI;AAAA,IAAS,OAAO,sBAAsB;AAAA,EAC1C,OAAO;AAAA;AAGT,SAAS,4BAA4B,CAAC,UAAkD;AAAA,EACtF,IAAI,CAAC,SAAS,SAAS;AAAA,IACrB,MAAM,IAAI,MAAM,SAAS,SAAS,wBAAwB;AAAA,EAC5D;AAAA,EACA,MAAM,SAA4B,CAAC;AAAA,EACnC,IAAI,SAAS,eAAe,WAAW,SAAS,eAAe,gBAAgB;AAAA,IAC7E,OAAO,YAAY,SAAS;AAAA,EAC9B;AAAA,EACA,IAAI,OAAO,SAAS,aAAa;AAAA,IAAU,OAAO,UAAU,SAAS;AAAA,EACrE,IAAI,OAAO,SAAS,iBAAiB;AAAA,IAAU,OAAO,cAAc,SAAS;AAAA,EAC7E,IAAI,SAAS,mBAAmB,MAAM;AAAA,IACpC,OAAO,gBAAgB;AAAA,EACzB,EAAO,SAAI,SAAS,kBAAkB,OAAO,SAAS,mBAAmB,UAAU;AAAA,IACjF,OAAO,gBAAgB,KAAM,SAAS,eAA2C;AAAA,EACnF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,uBAAuB,CAAC,SAA+C;AAAA,EAC9E,IAAI,QAAQ;AAAA,IAAS,OAAO,QAAQ;AAAA,EACpC,MAAM,UAAU,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAAA,EAC1E,MAAM,iBAAiB,OAAO,QAAQ,oBAAoB,WAAW,QAAQ,kBAAkB;AAAA,EAC/F,IAAI,WAAW,gBAAgB;AAAA,IAC7B,OAAO,EAAE,UAAU,SAAS,iBAAiB,eAAe;AAAA,EAC9D;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,sCAAsC,CAAC,QAIxC;AAAA,EACb,OAAO,OAAO,OAAO,UAAU,CAAC,YAAY,YAAY;AAAA,IACtD,MAAM,UAAU;AAAA,IAChB,IAAI,YAAY,aAAa,QAAQ,SAAS;AAAA,MAAmB;AAAA,IAC5D,iCAAiC,QAAQ,OAAO,EAAE,MAAM,MAAM,EAElE;AAAA,GACF;AAAA;AAGH,eAAe,gCAAgC,CAC7C,QAKA,SACe;AAAA,EACf,MAAM,UAAU,wBAAwB,OAAO,KAAK,OAAO,WAAW;AAAA,EACtE,IAAI,CAAC;AAAA,IAAS;AAAA,EAEd,MAAM,YAAY,OAAO,QAAQ,eAAe,WAAW,QAAQ,aAAa;AAAA,EAChF,MAAM,UAAU,QAAQ;AAAA,EACxB,IAAI,CAAC,aAAa,CAAC,WAAW,OAAO,YAAY;AAAA,IAAU;AAAA,EAC3D,MAAM,gBAAgB;AAAA,EACtB,IAAI,cAAc,YAAY;AAAA,IAAgB;AAAA,EAE9C,MAAM,WAAW,OAAO,cAAc,cAAc,WAAW,cAAc,YAAY;AAAA,EACzF,MAAM,YACJ,cAAc,SAAS,OAAO,cAAc,UAAU,YAAY,CAAC,MAAM,QAAQ,cAAc,KAAK,IAC/F,cAAc,QACf,CAAC;AAAA,EACP,MAAM,WAAW,MAAM,6BAA6B,OAAO,WAAW,GAAG,UAAU,SAAS;AAAA,EAC5F,OAAO,OAAO,MAAM;AAAA,IAClB;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU,4BAA4B,QAAQ;AAAA,IAChD;AAAA,EACF,CAA4C;AAAA;AAAA;AAGvC,MAAM,2BAAoE;AAAA,EAE5D;AAAA,EACA;AAAA,EAFnB,WAAW,CACQ,QACA,SACjB;AAAA,IAFiB;AAAA,IACA;AAAA;AAAA,EAGnB,SAAS,CAAC,SAA2E;AAAA,IACnF,OAAO,KAAK,OAAO,UAAU,CAAC,SAAS,YAAY;AAAA,MACjD,QAAQ,SAAuC,OAAO;AAAA,KACvD;AAAA;AAAA,EAGH,IAAI,CAAC,SAAwC;AAAA,IAC3C,KAAK,OAAO,KAAK,OAA4D;AAAA;AAAA,EAG/E,eAAe,CACb,SACA,SACA,SACM;AAAA,IACN,MAAM,UAAmC;AAAA,MACvC,MAAM;AAAA,MACN,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS,qBAAqB,OAAO;AAAA,UACrC,mBAAmB,QAAQ;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,OAAO,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAA4C;AAAA;AAAA,OAGxC,MAAK,CAAC,SAAsC;AAAA,IAChD,MAAM,KAAK,OAAO,MAAM,EAAE,QAAQ,CAA4C;AAAA;AAAA,EAGhF,OAAO,CACL,MACA,MACA,UAAqF,CAAC,GAC5D;AAAA,IAC1B,MAAM,UAAU,KAAK,OAAO,QAAQ,KAAK,KAAK,MAAM;AAAA,IAQpD,OAAO,QAAQ,MAAM,MAAM,OAAO;AAAA;AAAA,OAG9B,WAAU,GAA8B;AAAA,IAC5C,MAAM,WAAY,MAAM,KAAK,QAC3B,eACA,CAAC,GACD,EAAE,WAAW,CAAC,YAAY,QAAQ,SAAS,uBAAuB,CACpE;AAAA,IACA,OAAO,4BAA4B,QAAQ;AAAA;AAAA,OAGvC,YAAW,CACf,SACA,SAC4B;AAAA,IAC5B,MAAM,WAAY,MAAM,KAAK,QAC3B,gBACA;AAAA,MACE;AAAA,MACA;AAAA,IACF,GACA,EAAE,WAAW,CAAC,YAAY,QAAQ,SAAS,wBAAwB,CACrE;AAAA,IACA,OAAO,6BAA6B,QAAQ;AAAA;AAAA,OAGxC,wBAAuB,CAC3B,SACA,UAA0C,CAAC,GACH;AAAA,IACxC,MAAM,WAAW,MAAM,KAAK,OAAO,KACjC;AAAA,MACE;AAAA,MACA,mBAAmB;AAAA,MACnB,qBAAqB;AAAA,IACvB,GACA,QAAQ,cAAc,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC,CACxE;AAAA,IAEA,IAAI,CAAC,SAAS,SAAS;AAAA,MACrB,OAAO;AAAA,QACL,WAAW;AAAA,QACX,aAAa;AAAA,QACb,QAAQ,SAAS,SAAS;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,OAAO,EAAE,WAAW,MAAM,aAAa,MAAM;AAAA;AAAA,OAGzC,aAAY,CAChB,gBACA,UAA+B,CAAC,GACH;AAAA,IAC7B,MAAM,QAAiC,CAAC;AAAA,IACxC,IAAI,QAAQ,WAAW;AAAA,MAAW,MAAM,SAAS,QAAQ;AAAA,IACzD,IAAI,QAAQ,UAAU;AAAA,MAAW,MAAM,QAAQ,QAAQ;AAAA,IACvD,IAAI,QAAQ,UAAU;AAAA,MAAW,MAAM,QAAQ,QAAQ;AAAA,IACvD,IAAI,QAAQ,UAAU;AAAA,MAAW,MAAM,QAAQ,QAAQ;AAAA,IAEvD,MAAM,WAAY,MAAM,KAAK,QAC3B,8BACA;AAAA,MACE,iBAAiB;AAAA,SACb,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IACnD,GACA,EAAE,WAAW,CAAC,YAAY,QAAQ,SAAS,sCAAsC,CACnF;AAAA,IAEA,IAAI,CAAC,SAAS,SAAS;AAAA,MACrB,MAAM,IAAI,MAAM,SAAS,SAAS,qBAAqB;AAAA,IACzD;AAAA,IAEA,MAAM,SAA6B;AAAA,MACjC,UAAU,SAAS,YAAY,CAAC;AAAA,IAClC;AAAA,IACA,MAAM,aACJ,OAAO,SAAS,eAAe,YAAY,SAAS,eAAe,OAC/D,SAAS,aACT,OAAO,SAAS,gBAAgB,YAAY,SAAS,gBAAgB,OACnE,SAAS,cACT;AAAA,IACR,IAAI,eAAe;AAAA,MAAW,OAAO,aAAa;AAAA,IAClD,MAAM,UACJ,OAAO,SAAS,YAAY,YACxB,SAAS,UACT,OAAO,SAAS,aAAa,YAC3B,SAAS,WACT;AAAA,IACR,IAAI,YAAY;AAAA,MAAW,OAAO,UAAU;AAAA,IAC5C,OAAO;AAAA;AAAA,EAGT,KAAK,GAAS;AAAA,IACZ,KAAK,OAAO,MAAM;AAAA;AAEtB;AAAA;AAEO,MAAM,yBAAyB,wBAAwB;AAAA,EAOzC;AAAA,EANX,iBAA8C;AAAA,EAC9C,gBAAgB,IAAI;AAAA,EACpB,4BAAiD;AAAA,EACjD,8BAAmD;AAAA,EAE3D,WAAW,CACQ,eACjB,MACA;AAAA,IACA,MAAM,MAAM;AAAA,MACV,OAAO;AAAA,MACP,kBAAkB,cAAc;AAAA,IAClC,CAAC;AAAA,IANgB;AAAA,IAOjB,MAAM,QAAQ,KAAK,QAAQ;AAAA,IAC3B,WAAW,QAAQ,SAAS,CAAC,GAAG;AAAA,MAC9B,KAAK,cAAc,IAAI,KAAK,MAAM,IAAI;AAAA,IACxC;AAAA;AAAA,EAGiB,iBAAiB,CAAC,SAAsE;AAAA,IAEzG,OAAO,KAAK,KAAK,SAAS;AAAA;AAAA,OAGH,4BAA2B,GAAgC;AAAA,IAClF,MAAM,MAAM,MAAM,KAAK,oBAAoB;AAAA,IAC3C,MAAM,SAAS,sBAAsB;AAAA,MACnC;AAAA,SACI,KAAK,cAAc,cAAc,YACjC,EAAE,WAAW,KAAK,cAAc,UAAU,IAC1C,CAAC;AAAA,SACD,KAAK,cAAc,YACnB,EAAE,WAAW,KAAK,cAAc,UAAwC,IACxE,CAAC;AAAA,SACD,KAAK,cAAc,qBAAqB,YACxC,EAAE,kBAAkB,KAAK,cAAc,iBAAiB,IACxD,CAAC;AAAA,IACP,CAAC;AAAA,IAED,KAAK,8BAA8B,uCAAuC;AAAA,MACxE;AAAA,MACA,YAAY,MAAM,KAAK;AAAA,MACvB,YAAY,MAAM,KAAK,eAAe;AAAA,IACxC,CAAC;AAAA,IAED,IAAI,KAAK,cAAc,OAAO,GAAG;AAAA,MAC/B,KAAK,4BAA4B,OAAO,mBACtC,8BAA8B,KAAK,aAAa,CAClD;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,OAAO,QAAQ;AAAA,MACrB,MAAM,WAAW,MAAM,KAAK,aAAa,MAAM;AAAA,MAC/C,IAAI,CAAC,SAAS,WAAW,CAAC,SAAS,SAAS;AAAA,QAC1C,MAAM,IAAI,MAAM,SAAS,SAAS,oCAAoC;AAAA,MACxE;AAAA,MAEA,MAAM,QAAQ,eAAe,SAAS,KAAK;AAAA,MAC3C,OAAO;AAAA,QACL,YAAY,IAAI,2BAA2B,QAAQ,KAAK,aAAa;AAAA,QACrE,SAAS,SAAS;AAAA,QAClB,OAAO,OAAO,SAAS,OAAO,UAAU,WAAW,SAAS,MAAM,QAAQ;AAAA,QAC1E,eAAe,SAAS,OAAO,kBAAkB;AAAA,WAC7C,UAAU,YAAY,EAAE,MAAM,IAAI,CAAC;AAAA,MACzC;AAAA,MACA,OAAO,OAAO;AAAA,MACd,KAAK,4BAA4B;AAAA,MACjC,KAAK,4BAA4B;AAAA,MACjC,KAAK,8BAA8B;AAAA,MACnC,KAAK,8BAA8B;AAAA,MACnC,OAAO,MAAM;AAAA,MACb,MAAM;AAAA;AAAA;AAAA,EAIS,WAAW,GAAS;AAAA,IACrC,KAAK,4BAA4B;AAAA,IACjC,KAAK,4BAA4B;AAAA,IACjC,KAAK,8BAA8B;AAAA,IACnC,KAAK,8BAA8B;AAAA,IACnC,KAAK,gBAAgB,MAAM;AAAA,IAC3B,KAAK,iBAAiB;AAAA;AAAA,OAGV,oBAAmB,GAAoB;AAAA,IACnD,IAAI,KAAK,cAAc,KAAK;AAAA,MAC1B,OAAO,KAAK,cAAc;AAAA,IAC5B;AAAA,IACA,IAAI,KAAK,cAAc,UAAU,MAAM;AAAA,MACrC,MAAM,IAAI,MAAM,gFAAgF;AAAA,IAClG;AAAA,IACA,KAAK,iBAAiB,MAAM,oBAAoB;AAAA,MAC9C,QAAQ,KAAK,cAAc;AAAA,MAC3B,SAAS,KAAK,cAAc;AAAA,MAC5B,kBAAkB,KAAK,cAAc;AAAA,MACrC,KAAK,KAAK,cAAc;AAAA,IAC1B,CAAC;AAAA,IACD,OAAO,KAAK,eAAe;AAAA;AAAA,OAGf,aAAY,CAAC,QAAwD;AAAA,IACjF,MAAM,UAAU,MAAM,KAAK,yBAAyB,MAAM;AAAA,IAC1D,MAAM,WAAY,MAAM,OAAO,aAAa,OAAO;AAAA,IACnD,OAAO;AAAA;AAAA,OAGK,yBAAwB,CAAC,QAAuD;AAAA,IAC5F,MAAM,UAAU,KAAK,KAAK;AAAA,IAC1B,MAAM,UAAmC;AAAA,MACvC,aAAa;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,mBAAmB;AAAA,MACnB,qBAAqB;AAAA,IACvB;AAAA,IAEA,MAAM,OAAO,kBAAkB,QAAQ,cAAc;AAAA,IACrD,IAAI;AAAA,MAAM,QAAQ,OAAO;AAAA,IACzB,IAAI,QAAQ,QAAQ;AAAA,MAAW,QAAQ,MAAM,QAAQ;AAAA,IACrD,MAAM,SAAS,mBAAmB,QAAQ,KAAK;AAAA,IAC/C,IAAI;AAAA,MAAQ,QAAQ,iBAAiB;AAAA,IAErC,IAAI,KAAK,KAAK,SAAS,gBAAgB;AAAA,MACrC,QAAQ,eAAe;AAAA,QACrB,MAAM,gBAAgB,KAAK,KAAK,SAAS;AAAA,UACvC,qBAAqB,KAAK,cAAc;AAAA,QAC1C,CAAC;AAAA,QACD,YAAY,KAAK,cAAc,kBAAkB;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,KAAK,KAAK,SAAS;AAAA,MACrB,QAAQ,WAAW,KAAK,KAAK;AAAA,MAC7B,IAAI,KAAK,KAAK,iBAAiB;AAAA,QAC7B,QAAQ,sBAAsB,EAAE,MAAM,CAAC,EAAE;AAAA,MAC3C,EAAO,SAAI,KAAK,KAAK,qBAAqB;AAAA,QACxC,QAAQ,kBAAkB;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,KAAK,KAAK,gBAAgB;AAAA,MAC5B,MAAM,UAAU,MAAM,KAAK,2BAA2B,QAAQ,KAAK,KAAK,cAAc;AAAA,MACtF,QAAQ,WAAW;AAAA,MACnB,QAAQ,kBAAkB,KAAK,KAAK;AAAA,MACpC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,IAAI,MACR,gGACF;AAAA;AAAA,OAGY,2BAA0B,CACtC,QACA,gBACiB;AAAA,IACjB,MAAM,UAAU,OAAO,QAAQ,KAAK,MAAM;AAAA,IAK1C,MAAM,WAAY,MAAM,QACtB,yBACA,EAAE,iBAAiB,eAAe,GAClC,EAAE,WAAW,CAAC,YAAY,QAAQ,SAAS,iCAAiC,CAC9E;AAAA,IACA,IAAI,CAAC,SAAS,WAAW,CAAC,SAAS,cAAc,UAAU;AAAA,MACzD,MAAM,IAAI,MAAM,SAAS,SAAS,mCAAmC,gBAAgB;AAAA,IACvF;AAAA,IACA,OAAO,SAAS,aAAa;AAAA;AAGjC;;;ACrzBA,SAAS,iBAAgB,GAAuB;AAAA,EAC9C,IAAI,OAAO,YAAY,aAAa;AAAA,IAClC;AAAA,EACF;AAAA,EACA,OAAO,QAAQ,IAAI;AAAA;AAGrB,SAAS,aAAa,CAAC,SAAiE;AAAA,EACtF,MAAM,SAAS,QAAQ,UAAU,kBAAiB;AAAA,EAClD,OAAO;AAAA,OACD,SAAS,EAAE,eAAe,UAAU,SAAS,IAAI,CAAC;AAAA,OAClD,QAAQ,WAAW,CAAC;AAAA,EAC1B;AAAA;AAGF,SAAS,SAAQ,CAAC,SAAsD;AAAA,EACtE,MAAM,YAAY,QAAQ,SAAS,WAAW;AAAA,EAC9C,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAAA,EACA,OAAO,UAAU,KAAK,UAAU;AAAA;AAGlC,SAAS,iBAAgB,CAAC,SAA0B;AAAA,EAClD,QAAQ,WAAW,yBAAyB,QAAQ,OAAO,EAAE;AAAA;AAG/D,SAAS,YAAY,CACnB,aACA,QAC2B;AAAA,EAC3B,IAAI,CAAC,YAAY,cAAc;AAAA,IAC7B,MAAM,QACJ,cAAc,SACV,OAAO,YACP,mBAAmB,UACjB,OAAO,iBACP,oBAAoB,UAClB,OAAO,iBACP,YAAY;AAAA,IACtB,MAAM,IAAI,MAAM,kCAAkC,OAAO;AAAA,EAC3D;AAAA,EAEA,OAAO;AAAA,IACL,cAAc,YAAY;AAAA,IAC1B;AAAA,IACA;AAAA,EACF;AAAA;AAGF,eAAe,kBAAoB,CAAC,UAAgC;AAAA,EAClE,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,EACjC,MAAM,OAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAEvC,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,UACJ,QAAQ,OAAO,SAAS,YAAY,aAAa,OAC7C,OAAQ,KAA8B,OAAO,IAC7C,SAAS;AAAA,IACf,MAAM,IAAI,MAAM,6BAA6B,SAAS,YAAY,SAAS;AAAA,EAC7E;AAAA,EAEA,OAAO;AAAA;AAAA;AAMF,MAAM,wBAAwB;AAAA,EAIN;AAAA,EAHZ;AAAA,EACA;AAAA,EAEjB,WAAW,CAAkB,UAA0C,CAAC,GAAG;AAAA,IAA9C;AAAA,IAC3B,KAAK,UAAU,kBAAiB,QAAQ,OAAO;AAAA,IAC/C,KAAK,YAAY,UAAS,OAAO;AAAA;AAAA,OAG7B,iBAAgB,GAAyC;AAAA,IAC7D,MAAM,MAAM,IAAI,IAAI,GAAG,KAAK,yBAAyB;AAAA,IACrD,MAAM,WAAW,MAAM,KAAK,UAAU,KAAK;AAAA,MACzC,SAAS,cAAc,KAAK,OAAO;AAAA,IACrC,CAAC;AAAA,IACD,OAAO,mBAA+C,QAAQ;AAAA;AAAA,OAG1D,yBAAwB,CAAC,UAAwD;AAAA,IACrF,MAAM,WAAW,MAAM,KAAK,UAC1B,GAAG,KAAK,2BAA2B,mBAAmB,QAAQ,KAC9D,EAAE,SAAS,cAAc,KAAK,OAAO,EAAE,CACzC;AAAA,IACA,OAAO,mBAA+C,QAAQ;AAAA;AAAA,OAG1D,mBAAkB,CAAC,QAAqE;AAAA,IAC5F,IAAI,kBAAkB,QAAQ;AAAA,MAC5B,OAAO,EAAE,cAAc,OAAO,cAAc,OAAO;AAAA,IACrD;AAAA,IAEA,IAAI,cAAc,QAAQ;AAAA,MACxB,OAAO,aAAa,MAAM,KAAK,yBAAyB,OAAO,QAAQ,GAAG,MAAM;AAAA,IAClF;AAAA,IAEA,QAAQ,gBAAgB,MAAM,KAAK,iBAAiB;AAAA,IACpD,IAAI,mBAAmB,QAAQ;AAAA,MAC7B,MAAM,SAAQ,YAAY,KAAK,CAAC,QAAQ,IAAI,OAAO,OAAO,aAAa;AAAA,MACvE,IAAI,CAAC,QAAO;AAAA,QACV,MAAM,IAAI,MAAM,iCAAiC,OAAO,eAAe;AAAA,MACzE;AAAA,MACA,OAAO,aAAa,QAAO,MAAM;AAAA,IACnC;AAAA,IAEA,MAAM,UAAU,YAAY,OAC1B,CAAC,QAAQ,IAAI,mBAAmB,OAAO,cACzC;AAAA,IACA,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,MAAM,IAAI,MAAM,iCAAiC,OAAO,gBAAgB;AAAA,IAC1E;AAAA,IACA,IAAI,QAAQ,SAAS,GAAG;AAAA,MACtB,MAAM,IAAI,MACR,yCAAyC,OAAO,gBAClD;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,QAAQ;AAAA,IACtB,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MAAM,iCAAiC,OAAO,gBAAgB;AAAA,IAC1E;AAAA,IACA,OAAO,aAAa,OAAO,MAAM;AAAA;AAGrC;;;ACxIA,IAAM,8BAA6B;AACnC,IAAM,0BAA0B;AAChC,IAAM,2BAA2B;AACjC,IAAM,8BAA8B;AACpC,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;AAChC,IAAM,mCAAmC;AACzC,IAAM,yCAAyC;AAC/C,IAAM,uCAAuC;AAC7C,IAAM,6CAA6C;AACnD,IAAM,mBAAmB;AAAA;AAoEzB,MAAM,0CAA0C,MAAM;AAAC;AAUvD,SAAS,iBAAgB,GAAuB;AAAA,EAC9C,MAAM,MAAO,WACV,SAAS;AAAA,EACZ,OAAO,KAAK,iBAAiB,KAAK;AAAA;AAGpC,SAAS,uBAAsB,CAAC,SAAiE;AAAA,EAC/F,MAAM,gBAAgB,SAAS,iBAAiB,SAAS;AAAA,EACzD,IAAI,CAAC;AAAA,IAAe;AAAA,EACpB,MAAM,QAAQ,mBAAmB,KAAK,aAAa;AAAA,EACnD,OAAO,QAAQ;AAAA;AAGjB,SAAS,eAAc,CAAC,SAA0D;AAAA,EAChF,OAAO,QAAQ,UAAU,wBAAuB,QAAQ,OAAO,KAAK,kBAAiB;AAAA;AAGvF,SAAS,SAAQ,CAAC,eAAsC;AAAA,EACtD,MAAM,WAAW,iBAAiB,WAAW;AAAA,EAC7C,IAAI,CAAC,UAAU;AAAA,IACb,MAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAAA,EACA,OAAO,SAAS,KAAK,UAAU;AAAA;AAGjC,SAAS,uBAAuB,CAC9B,mBAC4B;AAAA,EAC5B,MAAM,WACJ,qBACC,WAA0D;AAAA,EAC7D,IAAI,CAAC,UAAU;AAAA,IACb,MAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,yBAAwB,CAAC,KAAiC;AAAA,EACjE,MAAM,SAAS,IAAI,IAAI,OAAO,2BAA0B;AAAA,EACxD,OAAO,WAAW,OAAO,SAAS,QAAQ,QAAQ,EAAE;AAAA,EACpD,OAAO,SAAS;AAAA,EAChB,OAAO,OAAO;AAAA,EACd,OAAO,OAAO,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA;AAG5C,SAAS,aAAY,CAAC,SAA8D;AAAA,EAClF,MAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,OACZ,QAAQ,WAAW,CAAC;AAAA,EAC1B;AAAA,EACA,MAAM,SAAS,gBAAe,OAAO;AAAA,EACrC,IAAI,UAAU,CAAC,QAAQ,iBAAiB,CAAC,QAAQ,eAAe;AAAA,IAC9D,QAAQ,gBAAgB,UAAU;AAAA,EACpC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,qBAAqB,CAAC,SAA0E;AAAA,EACvG,MAAM,UAAU,KAAM,QAAQ,WAAW,CAAC,EAAG;AAAA,EAC7C,OAAO,QAAQ;AAAA,EACf,OAAO,QAAQ;AAAA,EACf,MAAM,SAAS,gBAAe,OAAO;AAAA,EACrC,IAAI;AAAA,IAAQ,QAAQ,gBAAgB,UAAU;AAAA,EAC9C,OAAO,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAAA;AAGrD,eAAe,kBAAiB,CAAC,UAAsC;AAAA,EACrE,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,EACjC,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,IAAI;AAAA,IACF,OAAO,KAAK,MAAM,IAAI;AAAA,IACtB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,qBAAoB,CAAC,MAAe,UAA0B;AAAA,EACrE,IAAI,QAAQ,OAAO,SAAS,UAAU;AAAA,IACpC,MAAM,SAAS;AAAA,IACf,MAAM,UAAU,OAAO,WAAW,OAAO,SAAS,OAAO;AAAA,IACzD,MAAM,aAAa,OAAO;AAAA,IAC1B,MAAM,SAAS,CAAC,SAAS,UAAU,EAChC,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC;AAAA,IACnF,IAAI,OAAO,SAAS;AAAA,MAAG,OAAO,OAAO,KAAK,IAAI;AAAA,EAChD;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAgB,CAAC,UAAoB,MAAe,QAAsB;AAAA,EACjF,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,IAAI,MACR,sBAAqB,MAAM,GAAG,2BAA2B,SAAS,QAAQ,CAC5E;AAAA,EACF;AAAA;AAGF,SAAS,uBAAuB,CAAC,OAA2B,MAAoB;AAAA,EAC9E,IAAI,UAAU,cAAc,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,IAAI;AAAA,IACnE,MAAM,IAAI,MAAM,WAAW,oCAAoC;AAAA,EACjE;AAAA;AAGF,SAAS,oBAAoB,CAC3B,OACA,MACA,KACA,KACM;AAAA,EACN,IAAI,UAAU;AAAA,IAAW;AAAA,EACzB,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,OAAO,QAAQ,KAAK;AAAA,IAC1D,MAAM,IAAI,MAAM,WAAW,qCAAqC,WAAW,MAAM;AAAA,EACnF;AAAA;AAGF,SAAS,2BAA2B,CAClC,SACA,MACM;AAAA,EACN,IAAI,YAAY;AAAA,IAAW;AAAA,EAC3B,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC7E,MAAM,IAAI,MAAM,WAAW,2BAA2B;AAAA,EACxD;AAAA,EACA,qBACE,QAAQ,YACR,GAAG,mBACH,yBACA,uBACF;AAAA,EACA,wBAAwB,QAAQ,gBAAgB,GAAG,qBAAqB;AAAA,EACxE,wBAAwB,QAAQ,qBAAqB,GAAG,0BAA0B;AAAA,EAClF,wBAAwB,QAAQ,mBAAmB,GAAG,wBAAwB;AAAA,EAC9E,IACE,QAAQ,qBAAqB,aAC7B,OAAO,QAAQ,qBAAqB,WACpC;AAAA,IACA,MAAM,IAAI,MAAM,WAAW,4CAA4C;AAAA,EACzE;AAAA;AAGK,SAAS,0BAA0B,CAAC,SAA4C;AAAA,EACrF,wBAAwB,QAAQ,kBAAkB,kBAAkB;AAAA,EACpE,wBAAwB,QAAQ,WAAW,kBAAkB,4BAA4B;AAAA,EACzF,wBAAwB,QAAQ,WAAW,kBAAkB,4BAA4B;AAAA,EACzF,4BAA4B,QAAQ,SAAS,SAAS;AAAA,EACtD,IAAI,QAAQ,gBAAgB,aAAa,QAAQ,YAAY,WAAW;AAAA,IACtE,MAAM,IAAI,MAAM,6EAA6E;AAAA,EAC/F;AAAA,EACA,IACE,QAAQ,kBAAkB,aAC1B,QAAQ,kBAAkB,YAC1B,QAAQ,kBAAkB,SAC1B;AAAA,IACA,MAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAAA;AAGF,SAAS,yBAAyB,CAChC,aACyB;AAAA,EACzB,IAAI,OAAO,gBAAgB,UAAU;AAAA,IACnC,OAAO,EAAE,gBAAgB,YAAY;AAAA,EACvC;AAAA,EACA,IAAI,UAAU,aAAa;AAAA,IACzB,OAAO,EAAE,gBAAgB,YAAY,KAAK;AAAA,EAC5C;AAAA,EACA,IAAI,QAAQ,aAAa;AAAA,IACvB,OAAO,EAAE,eAAe,YAAY,GAAG;AAAA,EACzC;AAAA,EACA,IAAI,kBAAkB,aAAa;AAAA,IACjC,OAAO,EAAE,cAAc,YAAY,aAAa;AAAA,EAClD;AAAA,EACA,IAAI,cAAc,aAAa;AAAA,IAC7B,OAAO,EAAE,UAAU,YAAY,SAAS;AAAA,EAC1C;AAAA,EACA,MAAM,IAAI,MAAM,qCAAqC;AAAA;AAGvD,SAAS,4BAA4B,CAAC,QAO3B;AAAA,EACT,MAAM,OAAO,IAAI,IAAI,0BAAyB,OAAO,UAAU,CAAC;AAAA,EAChE,IAAI,KAAK,aAAa,SAAS;AAAA,IAC7B,KAAK,WAAW;AAAA,EAClB,EAAO,SAAI,KAAK,aAAa,UAAU;AAAA,IACrC,KAAK,WAAW;AAAA,EAClB,EAAO,SAAI,KAAK,aAAa,SAAS,KAAK,aAAa,QAAQ;AAAA,IAC9D,MAAM,IAAI,MAAM,0CAA0C,KAAK,UAAU;AAAA,EAC3E;AAAA,EACA,KAAK,WAAW,oBAAoB,mBAAmB,OAAO,YAAY;AAAA,EAC1E,KAAK,aAAa,IAAI,WAAW,OAAO,OAAO;AAAA,EAC/C,KAAK,aAAa,IAAI,kBAAkB,OAAO,cAAc;AAAA,EAC7D,KAAK,aAAa,IAAI,WAAW,QAAQ;AAAA,EACzC,IAAI,OAAO,aAAa,WAAW,OAAO,QAAQ;AAAA,IAChD,KAAK,aAAa,IAAI,SAAS,OAAO,MAAM;AAAA,EAC9C;AAAA,EACA,OAAO,KAAK,SAAS;AAAA;AAGvB,SAAS,iBAAiB,CACxB,QACA,MACA,UACY;AAAA,EACZ,IAAI,OAAO,kBAAkB;AAAA,IAC3B,OAAO,iBAAiB,MAAM,QAAQ;AAAA,IACtC,OAAO,MAAM,OAAO,sBAAsB,MAAM,QAAQ;AAAA,EAC1D;AAAA,EACA,IAAI,OAAO,IAAI;AAAA,IACb,OAAO,GAAG,MAAM,QAAQ;AAAA,IACxB,OAAO,MAAM,OAAO,MAAM,MAAM,QAAQ;AAAA,EAC1C;AAAA,EACA,MAAM,IAAI,MAAM,4DAA4D;AAAA;AAG9E,SAAS,gBAAgB,CAAC,OAA+B;AAAA,EACvD,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,IACtC,MAAM,OAAQ,MAA6B;AAAA,IAC3C,IAAI,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IACrC,IAAI,gBAAgB,aAAa;AAAA,MAC/B,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,IACtC;AAAA,IACA,IAAI,gBAAgB,YAAY;AAAA,MAC9B,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,IACtC;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAeT,SAAS,qCAAqC,CAAC,QAGhB;AAAA,EAC7B,MAAM,gBAAgB,wBAAwB,OAAO,aAAa,SAAS;AAAA,EAC3E,MAAM,WAAW,OAAO,aAAa,iBAAiB;AAAA,EACtD,MAAM,gBAAe,aAAa,WAAW,sBAAsB,OAAO,YAAY,IAAI;AAAA,EAC1F,MAAM,iBAAiB,OAAO,aAAa,kBAAkB;AAAA,EAC7D,MAAM,QAAgC;AAAA,IACpC,SAAS,OAAO;AAAA,IAChB,qBAAqB,IAAI;AAAA,IACzB,sBAAsB,CAAC;AAAA,IACvB,cAAc;AAAA,IACd,eAAe;AAAA,EACjB;AAAA;AAAA,EAEA,MAAM,yBAAwD;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,mBAAmB,IAAI;AAAA,IAChC,YAAmD;AAAA,IACnD,sBAA2C;AAAA,IAEnD,WAAW,CAAC,KAAa,SAAkC;AAAA,MACzD,KAAK,UAAU,IAAI,IAAI,GAAG,EAAE,aAAa,IAAI,SAAS;AAAA,MACtD,MAAM,gBAAgB,aAAa,WAC/B;AAAA,WACM,SAAS,WAAW,CAAC;AAAA,WACrB,iBAAgB,CAAC;AAAA,MACvB,IACA;AAAA,MACJ,MAAM,gBAAgB,iBAAiB,OAAO,KAAK,aAAa,EAAE,SAAS,IACvE,EAAE,SAAS,cAAc,IACzB;AAAA,MACJ,KAAK,SAAS,IAAI,cAAc,KAAK,aAAa;AAAA,MAClD,IAAI,KAAK,YAAY,WAAW;AAAA,QAC9B,MAAM,gBAAgB;AAAA,MACxB;AAAA,MACA,KAAK,sBAAsB,kBAAkB,KAAK,QAAQ,SAAS,MAAM;AAAA,QACvE,KAAK,SAAS;AAAA,QACd,IAAI,MAAM,kBAAkB;AAAA,UAAM,MAAM,gBAAgB;AAAA,OACzD;AAAA,MACD,KAAK,UAAU,cAAc;AAAA;AAAA,QAG3B,UAAU,GAAW;AAAA,MACvB,OAAO,KAAK,OAAO;AAAA;AAAA,IAGrB,IAAI,CAAC,MAAoB;AAAA,MACvB,KAAK,OAAO,KAAK,IAAI;AAAA;AAAA,IAGvB,KAAK,GAAS;AAAA,MACZ,KAAK,SAAS;AAAA,MACd,KAAK,sBAAsB;AAAA,MAC3B,KAAK,sBAAsB;AAAA,MAC3B,IAAI,MAAM,kBAAkB;AAAA,QAAM,MAAM,gBAAgB;AAAA,MACxD,KAAK,OAAO,MAAM;AAAA;AAAA,IAGpB,gBAAgB,CAAC,MAAc,UAA0C;AAAA,MACvE,MAAM,UAAU,SAAS,YACrB,CAAC,UAAmB;AAAA,QAClB,IAAI,KAAK,sBAAsB,KAAK,GAAG;AAAA,UACrC,SAAS,KAAK;AAAA,QAChB;AAAA,UAEF;AAAA,MACJ,MAAM,SAAS,kBAAkB,KAAK,QAAQ,MAAM,OAAO;AAAA,MAC3D,IAAI,eAAe,KAAK,iBAAiB,IAAI,IAAI;AAAA,MACjD,IAAI,CAAC,cAAc;AAAA,QACjB,eAAe,IAAI;AAAA,QACnB,KAAK,iBAAiB,IAAI,MAAM,YAAY;AAAA,MAC9C;AAAA,MACA,aAAa,IAAI,UAAU,MAAM;AAAA;AAAA,IAGnC,mBAAmB,CAAC,MAAc,UAA0C;AAAA,MAC1E,MAAM,eAAe,KAAK,iBAAiB,IAAI,IAAI;AAAA,MACnD,MAAM,SAAS,cAAc,IAAI,QAAQ;AAAA,MACzC,IAAI,CAAC;AAAA,QAAQ;AAAA,MACb,OAAO;AAAA,MACP,cAAc,OAAO,QAAQ;AAAA,MAC7B,IAAI,cAAc,SAAS,GAAG;AAAA,QAC5B,KAAK,iBAAiB,OAAO,IAAI;AAAA,MACnC;AAAA;AAAA,IAGM,qBAAqB,CAAC,OAAyB;AAAA,MACrD,MAAM,OAAO,iBAAiB,KAAK;AAAA,MACnC,IAAI,CAAC;AAAA,QAAM,OAAO;AAAA,MAElB,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,UAAU,KAAK,MAAM,IAAI;AAAA,QACzB,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,MAGT,KAAK,eAAe,OAAO;AAAA,MAO3B,IAAI,KAAK,YAAY,aAAa,QAAQ,SAAS,gBAAgB;AAAA,QACjE,OAAO;AAAA,MACT;AAAA,MAEA,IAAI,KAAK,YAAY,OAAO;AAAA,QAAG,OAAO;AAAA,MACtC,KAAK,cAAc,OAAO;AAAA,MAC1B,OAAO;AAAA;AAAA,IAGD,cAAc,CAAC,SAAmC;AAAA,MACxD,IAAI,OAAO,QAAQ,QAAQ;AAAA,QAAU;AAAA,MACrC,KAAK,iBAAiB,EAAE,MAAM,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA;AAAA,IAGjD,WAAW,CAAC,SAAsC;AAAA,MACxD,MAAM,iBACJ,OAAO,QAAQ,oBAAoB,WAAW,QAAQ,kBAAkB;AAAA,MAC1E,IAAI,CAAC;AAAA,QAAgB,OAAO;AAAA,MAC5B,IAAI,MAAM,oBAAoB,IAAI,cAAc;AAAA,QAAG,OAAO;AAAA,MAC1D,MAAM,oBAAoB,IAAI,cAAc;AAAA,MAC5C,MAAM,qBAAqB,KAAK,cAAc;AAAA,MAC9C,OAAO,MAAM,qBAAqB,SAAS,MAAO;AAAA,QAChD,MAAM,SAAS,MAAM,qBAAqB,MAAM;AAAA,QAChD,IAAI;AAAA,UAAQ,MAAM,oBAAoB,OAAO,MAAM;AAAA,MACrD;AAAA,MACA,OAAO;AAAA;AAAA,IAGD,aAAa,CAAC,SAAmC;AAAA,MACvD,IAAI,OAAO,QAAQ,cAAc;AAAA,QAAU;AAAA,MAC3C,IAAI,MAAM,iBAAiB,QAAQ,QAAQ,YAAY,MAAM,eAAe,GAAG;AAAA,QAC7E,KAAK,SAAS,IAAI;AAAA,MACpB;AAAA,MACA,IAAI,MAAM,iBAAiB,QAAQ,QAAQ,YAAY,MAAM,cAAc;AAAA,QACzE,MAAM,eAAe,QAAQ;AAAA,MAC/B;AAAA;AAAA,IAGM,QAAQ,CAAC,kBAAiC;AAAA,MAChD,MAAM,SAAS,MAAM,eAAe,eAAe,IAAI,MAAM,gBAAgB;AAAA,MAC7E,OAAO,iBAAiB;AAAA,QACtB,MAAM;AAAA,QACN,SAAS,MAAM;AAAA,QACf,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,MACvB,CAAC;AAAA;AAAA,IAGH,gBAAgB,CAAC,SAAwC;AAAA,MACvD,IAAI,KAAK,eAAe;AAAA,QAAG;AAAA,MAC3B,IAAI;AAAA,QACF,KAAK,OAAO,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,QACxC,MAAM;AAAA;AAAA,IAKF,SAAS,CAAC,YAA0B;AAAA,MAC1C,IAAI,KAAK;AAAA,QAAW;AAAA,MACpB,KAAK,YAAY,YAAY,MAAM;AAAA,QACjC,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAAA,SACrC,UAAU;AAAA,MACZ,KAAK,UAAqC,QAAQ;AAAA;AAAA,IAG7C,QAAQ,GAAS;AAAA,MACvB,IAAI,CAAC,KAAK;AAAA,QAAW;AAAA,MACrB,cAAc,KAAK,SAAS;AAAA,MAC5B,KAAK,YAAY;AAAA;AAAA,EAErB;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,mBAAmB,CAAC,OAA6D;AAAA,EACxF,OAAO,QAAQ,SAAS,OAAO,UAAU,YAAY,OAAQ,MAA4B,OAAO,QAAQ;AAAA;AAG1G,SAAS,mBAAmB,CAC1B,OAC8F;AAAA,EAC9F,OAAO,QACL,SACE,OAAO,UAAU,YACjB,OAAQ,MAA4B,cAAc,YAClD,OAAQ,MAA4B,aAAa,YACjD,OAAQ,MAA4B,mBAAmB,QAC3D;AAAA;AAGF,SAAS,0BAA0B,CACjC,OACiG;AAAA,EACjG,OAAO,QACL,SACE,OAAO,UAAU,YACjB,OAAQ,MAAmC,YAAY,aACvD,OAAQ,MAAmC,cAAc,YACzD,OAAQ,MAAmC,eAAe,QAC9D;AAAA;AAGF,SAAS,qCAAqC,CAAC,OAAyB;AAAA,EACtE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EACrE,OACE,QAAQ,SAAS,+BAA+B,KAChD,QAAQ,YAAY,EAAE,SAAS,WAAW,KAC1C,QAAQ,SAAS,OAAO;AAAA;AAI5B,SAAS,KAAK,CAAC,IAA2B;AAAA,EACxC,OAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA;AAGzD,SAAS,mBAAmB,CAAC,OAA8D;AAAA,EACzF,MAAM,SAAS,IAAI;AAAA,EACnB,WAAW,QAAQ,SAAS,CAAC,GAAG;AAAA,IAC9B,OAAO,IAAI,KAAK,MAAM,IAAI;AAAA,EAC5B;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,4BAA4B,CACnC,eACyB;AAAA,EACzB,MAAM,YAAY,cAAc;AAAA,EAChC,MAAM,SAAS,gBAAe,aAAa;AAAA,EAC3C,MAAM,WAA+C;AAAA,OAC/C,SAAS,EAAE,eAAe,OAAO,IAAI,CAAC;AAAA,OACtC,cAAc,aACd,EAAE,gBAAgB,0BAAyB,cAAc,UAAU,EAAE,IACrE,CAAC;AAAA,EACP;AAAA,EACA,OAAO;AAAA,IACL,OAAO,WAAW,QAAQ;AAAA,IAC1B,cAAc;AAAA,OACV,WAAW,QAAQ,YAAY,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC;AAAA,OACzD,WAAW,cAAc,YAAY,EAAE,WAAW,UAAU,UAAU,IAAI,CAAC;AAAA,OAC3E,cAAc,qBAAqB,aAAa,WAAW,qBAAqB,YAChF,EAAE,kBAAkB,WAAW,oBAAoB,cAAc,iBAAiB,IAClF,CAAC;AAAA,OACD,WAAW,WAAW,YAAY,EAAE,aAAa,UAAU,OAAO,IAAI,CAAC;AAAA,OACvE,WAAW,qBAAqB,YAChC,EAAE,uBAAuB,UAAU,iBAAiB,IACpD,CAAC;AAAA,OACD,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,EACzD;AAAA;AAGF,eAAsB,gBAAgB,CACpC,eACA,cACiB;AAAA,EACjB,MAAM,UAAU,IAAI,iBAAiB,6BAA6B,aAAa,GAAG;AAAA,IAChF,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,EACzC,QAAQ,MAAM;AAAA,EACd,OAAO,QAAQ;AAAA;AAGV,SAAS,kCAAkC,CAChD,QACA,SACM;AAAA,EACN,4BAA4B,QAAQ,SAAS,SAAS;AAAA,EACtD,IAAI,QAAQ,gBAAgB,aAAa,QAAQ,YAAY,WAAW;AAAA,IACtE,MAAM,IAAI,MAAM,iBAAiB,+DAA+D;AAAA,EAClG;AAAA,EACA,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,MAAM,IAAI,MAAM,iBAAiB,oFAAoF;AAAA,EACvH;AAAA,EACA,IAAI,QAAQ,iBAAiB,aAAa,QAAQ,oBAAoB,WAAW;AAAA,IAC/E,MAAM,IAAI,MAAM,iBAAiB,wFAAwF;AAAA,EAC3H;AAAA,EACA,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,MAAM,IAAI,MAAM,iBAAiB,wEAAwE;AAAA,EAC3G;AAAA,EACA,IAAI,QAAQ,uBAAuB,WAAW;AAAA,IAC5C,MAAM,IAAI,MAAM,iBAAiB,8EAA8E;AAAA,EACjH;AAAA,EACA,IAAI,QAAQ,UAAU,aAAa,WAAW;AAAA,IAC5C,MAAM,IAAI,MAAM,iBAAiB,4DAA4D;AAAA,EAC/F;AAAA,EACA,IAAK,QAAuC,iBAAiB,WAAW;AAAA,IACtE,MAAM,IAAI,MAAM,iBAAiB,yCAAyC;AAAA,EAC5E;AAAA,EACA,IAAI,QAAQ,2BAA2B,WAAW;AAAA,IAChD,MAAM,IAAI,MAAM,iBAAiB,kGAAkG;AAAA,EACrI;AAAA;AAAA;AAGK,MAAM,gCAAgC,wBAAwB;AAAA,EAYhD;AAAA,EAXX,eAA8B;AAAA,EAC9B,4BAAiD;AAAA,EACjD,8BAAmD;AAAA,EACnD,gBAAgB,IAAI;AAAA,EACpB,iBAA6C;AAAA,EAC7C,sBAA6D;AAAA,EAC7D,yBAA+C;AAAA,EAC/C,wBAAwB,IAAI;AAAA,EACnB;AAAA,EAEjB,WAAW,CACQ,cACjB,MACA;AAAA,IACA,MAAM,MAAM;AAAA,MACV,OAAO;AAAA,MACP,kBAAkB,aAAa,oBAAoB;AAAA,IACrD,CAAC;AAAA,IANgB;AAAA,IAOjB,KAAK,YAAY;AAAA,IACjB,MAAM,QAAQ,KAAK,QAAQ;AAAA,IAC3B,KAAK,gBAAgB,oBAAoB,KAAK;AAAA;AAAA,OAGvB,4BAA2B,GAAgC;AAAA,IAClF,MAAM,WAAW,MAAM,KAAK,eAAe;AAAA,IAC3C,MAAM,aAAa,MAAM,KAAK,4BAA4B,SAAS,OAAO;AAAA,IAC1E,KAAK,eAAe,WAAW;AAAA,IAE/B,MAAM,SAAS,gBAAe,KAAK,YAAY;AAAA,IAC/C,MAAM,MAAM,6BAA6B;AAAA,MACvC,YAAY,KAAK,aAAa;AAAA,MAC9B,cAAc,WAAW;AAAA,MACzB,SAAS,SAAS,QAAQ;AAAA,MAC1B,gBAAgB,SAAS,QAAQ;AAAA,MACjC;AAAA,MACA,UAAU,KAAK,aAAa,iBAAiB;AAAA,IAC/C,CAAC;AAAA,IACD,MAAM,SAAS,sBAAsB;AAAA,MACnC;AAAA,MACA,WAAW,sCAAsC;AAAA,QAC/C,cAAc,KAAK;AAAA,QACnB,SAAS,SAAS;AAAA,MACpB,CAAC;AAAA,MACD,kBAAkB,KAAK,aAAa,oBAAoB;AAAA,IAC1D,CAAC;AAAA,IACD,KAAK,8BAA8B,uCAAuC;AAAA,MACxE;AAAA,MACA,YAAY,MAAM,KAAK;AAAA,MACvB,YAAY,MAAM,KAAK,eAAe;AAAA,IACxC,CAAC;AAAA,IACD,IAAI,KAAK,cAAc,OAAO,GAAG;AAAA,MAC/B,KAAK,4BAA4B,OAAO,mBACtC,8BAA8B,KAAK,aAAa,CAClD;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,OAAO,QAAQ;AAAA,MACrB,MAAM,WAAW,MAAM,KAAK,kBAAkB,QAAQ,SAAS,OAAO;AAAA,MACtE,IAAI,CAAC,SAAS,WAAW,CAAC,SAAS,SAAS;AAAA,QAC1C,MAAM,IAAI,MAAM,SAAS,SAAS,sCAAsC;AAAA,MAC1E;AAAA,MAEA,MAAM,QAAQ,eAAe,SAAS,KAAK;AAAA,MAC3C,OAAO;AAAA,QACL,YAAY,IAAI,2BAA2B,QAAQ;AAAA,UACjD,kBAAkB,KAAK,aAAa,oBAAoB;AAAA,QAC1D,CAAC;AAAA,QACD,SAAS,SAAS;AAAA,QAClB,OAAO,OAAO,SAAS,OAAO,UAAU,WAAW,SAAS,MAAM,QAAQ;AAAA,QAC1E,eAAe,SAAS,OAAO,kBAAkB;AAAA,WAC7C,UAAU,YAAY,EAAE,MAAM,IAAI,CAAC;AAAA,MACzC;AAAA,MACA,OAAO,OAAO;AAAA,MACd,KAAK,4BAA4B;AAAA,MACjC,KAAK,4BAA4B;AAAA,MACjC,KAAK,8BAA8B;AAAA,MACnC,KAAK,8BAA8B;AAAA,MACnC,OAAO,MAAM;AAAA,MACb,MAAM,KAAK,sBAAsB;AAAA,MACjC,MAAM,KAAK,2BAA2B,SAAS,QAAQ,QAAQ;AAAA,MAC/D,MAAM;AAAA;AAAA;AAAA,OAII,kBAAiB,CAC7B,QACA,SACoC;AAAA,IACpC,MAAM,UAAU,KAAK,eAAe;AAAA,IACpC,MAAM,UAAmC;AAAA,MACvC,aAAa;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB,iBAAiB,QAAQ;AAAA,MACzB,mBAAmB;AAAA,MACnB,qBAAqB;AAAA,IACvB;AAAA,IAEA,MAAM,OAAO,kBAAkB,QAAQ,cAAc;AAAA,IACrD,IAAI;AAAA,MAAM,QAAQ,OAAO;AAAA,IACzB,IAAI,QAAQ,QAAQ;AAAA,MAAW,QAAQ,MAAM,QAAQ;AAAA,IACrD,MAAM,SAAS,mBAAmB,QAAQ,KAAK;AAAA,IAC/C,IAAI;AAAA,MAAQ,QAAQ,iBAAiB;AAAA,IAErC,OAAQ,MAAM,OAAO,aACnB,OACF;AAAA;AAAA,OAGuB,wBAAuB,GAAkB;AAAA,IAChE,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK;AAAA,MAAS;AAAA,IACvC,KAAK,WAAW,KAAK;AAAA,MACnB,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd,mBAAmB;AAAA,MACnB,qBAAqB;AAAA,IACvB,CAAC;AAAA;AAAA,OAGsB,WAAU,GAAkB;AAAA,IACnD,MAAM,UAAU,KAAK;AAAA,IACrB,IAAI,CAAC;AAAA,MAAS;AAAA,IACd,MAAM,KAAK,sBAAsB,OAAO;AAAA;AAAA,EAGvB,WAAW,GAAS;AAAA,IACrC,KAAK,4BAA4B;AAAA,IACjC,KAAK,4BAA4B;AAAA,IACjC,KAAK,8BAA8B;AAAA,IACnC,KAAK,8BAA8B;AAAA,IAC9B,KAAK,sBAAsB;AAAA,IAChC,IAAI,KAAK,SAAS;AAAA,MAAe,KAAK,2BAA2B,KAAK,QAAQ,QAAQ;AAAA;AAAA,OAG1E,eAAc,GAAuC;AAAA,IACjE,IAAI,UAAU,KAAK,UAAU;AAAA,IAC7B,IAAI,iBAAiB,KAAK,UAAU;AAAA,IAEpC,IAAI,CAAC,WAAW,gBAAgB;AAAA,MAC9B,MAAM,eAAe,MAAM,KAAK,qBAAqB,cAAc;AAAA,MACnE,IAAI,CAAC,aAAa,UAAU;AAAA,QAC1B,MAAM,IAAI,MAAM,sBAAsB,6CAA6C;AAAA,MACrF;AAAA,MACA,UAAU,aAAa;AAAA,IACzB;AAAA,IAEA,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,IAAI,MACR,wFACF;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,0BAA0B,OAAO;AAAA,IAE5C,IAAI,KAAK,UAAU,iBAAiB;AAAA,MAClC,MAAM,eAAe,MAAM,KAAK,mBAAmB,OAAO;AAAA,MAC1D,iBAAiB,aAAa;AAAA,IAChC,EAAO,SAAI,KAAK,UAAU,qBAAqB;AAAA,MAC7C,iBAAiB;AAAA,IACnB;AAAA,IAEA,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MACR,wFACF;AAAA,IACF;AAAA,IAEA,OAAO,EAAE,SAAS,EAAE,UAAU,SAAS,iBAAiB,eAAe,EAAE;AAAA;AAAA,OAG7D,0BAAyB,CAAC,SAAgC;AAAA,IACtE,MAAM,YAAY,KAAK,oBAAoB;AAAA,IAC3C,IAAI,UAAU,WAAW;AAAA,MAAG;AAAA,IAE5B,MAAM,WAAW,MAAM,KAAK,sBAAsB,OAAO;AAAA,IACzD,MAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,eAAe,WAAW,EAAE,CAAC;AAAA,IAEvE,IAAI;AAAA,MACF,WAAW,YAAY,WAAW;AAAA,QAChC,IAAI,YAAY,IAAI,SAAS,YAAY,KAAK,KAAK,sBAAsB,IAAI,SAAS,YAAY,GAAG;AAAA,UACnG;AAAA,QACF;AAAA,QACA,MAAM,KAAK,oBAAoB,SAAS,SAAS,YAAY;AAAA,QAC7D,MAAM,KAAK,uBAAuB,SAAS,SAAS,YAAY;AAAA,QAChE,KAAK,sBAAsB,IAAI,SAAS,YAAY;AAAA,MACtD;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,KAAK,2BAA2B,OAAO;AAAA,MAC7C,MAAM;AAAA;AAAA;AAAA,OAII,2BAA0B,CAAC,SAAgC;AAAA,IACvE,MAAM,gBAAgB,CAAC,GAAG,KAAK,qBAAqB;AAAA,IACpD,KAAK,sBAAsB,MAAM;AAAA,IACjC,MAAM,QAAQ,IAAI,cAAc,IAAI,OAAO,iBAAiB;AAAA,MAC1D,IAAI;AAAA,QACF,MAAM,KAAK,sBAAsB,SAAS,YAAY;AAAA,QACtD,MAAM;AAAA,KAGT,CAAC;AAAA;AAAA,EAGI,mBAAmB,GAAyB;AAAA,IAClD,MAAM,YAAY,KAAK,UAAU,QAAQ,aAAa,CAAC;AAAA,IACvD,MAAM,OAAO,IAAI;AAAA,IACjB,MAAM,SAA+B,CAAC;AAAA,IACtC,WAAW,YAAY,WAAW;AAAA,MAChC,IAAI,SAAS,SAAS,cAAc;AAAA,QAClC,MAAM,IAAI,MAAM,4CAA4C,OAAO,SAAS,IAAI,GAAG;AAAA,MACrF;AAAA,MACA,IAAI,OAAO,SAAS,iBAAiB,YAAY,SAAS,aAAa,WAAW,GAAG;AAAA,QACnF,MAAM,IAAI,MAAM,0DAA0D;AAAA,MAC5E;AAAA,MACA,IAAI,KAAK,IAAI,SAAS,YAAY;AAAA,QAAG;AAAA,MACrC,KAAK,IAAI,SAAS,YAAY;AAAA,MAC9B,OAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,IACA,OAAO;AAAA;AAAA,OAGK,sBAAqB,CAAC,SAAkD;AAAA,IACpF,MAAM,YAAY,UAAS,KAAK,aAAa,KAAK;AAAA,IAClD,MAAM,UAAU,0BAAyB,KAAK,aAAa,UAAU;AAAA,IACrE,MAAM,WAAW,MAAM,UACrB,GAAG,qBAAqB,mBAAmB,OAAO,kBAClD,EAAE,SAAS,cAAa,KAAK,YAAY,EAAE,CAC7C;AAAA,IACA,MAAM,OAAO,MAAM,mBAAkB,QAAQ;AAAA,IAC7C,kBAAiB,UAAU,MAAM,+BAA+B;AAAA,IAChE,IAAI,CAAC,QAAQ,OAAO,SAAS;AAAA,MAAU,OAAO,CAAC;AAAA,IAC/C,MAAM,eAAgB,KAAiC;AAAA,IACvD,OAAO,MAAM,QAAQ,YAAY,IAC7B,aAAa,OAAO,CAAC,eACrB,eAAe,QACf,OAAO,eAAe,YACtB,OAAQ,WAAuC,OAAO,QACvD,IACC,CAAC;AAAA;AAAA,OAGO,uBAAsB,CAAC,SAAiB,cAAqC;AAAA,IACzF,MAAM,WAAW,KAAK,IAAI,IAAI;AAAA,IAC9B,OAAO,MAAM;AAAA,MACX,MAAM,eAAe,MAAM,KAAK,sBAAsB,OAAO;AAAA,MAC7D,IAAI,aAAa,KAAK,CAAC,eAAe,WAAW,OAAO,YAAY;AAAA,QAAG;AAAA,MACvE,IAAI,KAAK,IAAI,KAAK,UAAU;AAAA,QAC1B,MAAM,IAAI,MAAM,4DAA4D,YAAY,cAAc;AAAA,MACxG;AAAA,MACA,MAAM,MAAM,0CAA0C;AAAA,IACxD;AAAA;AAAA,OAGY,oBAAmB,CAAC,SAAiB,cAAqC;AAAA,IACtF,MAAM,YAAY,UAAS,KAAK,aAAa,KAAK;AAAA,IAClD,MAAM,UAAU,0BAAyB,KAAK,aAAa,UAAU;AAAA,IACrE,MAAM,WAAW,MAAM,UACrB,GAAG,qBAAqB,mBAAmB,OAAO,kBAClD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,cAAa,KAAK,YAAY;AAAA,MACvC,MAAM,KAAK,UAAU,EAAE,eAAe,aAAa,CAAC;AAAA,IACtD,CACF;AAAA,IACA,MAAM,OAAO,MAAM,mBAAkB,QAAQ;AAAA,IAC7C,kBAAiB,UAAU,MAAM,+BAA+B;AAAA;AAAA,OAGpD,sBAAqB,CAAC,SAAiB,cAAqC;AAAA,IACxF,MAAM,YAAY,UAAS,KAAK,aAAa,KAAK;AAAA,IAClD,MAAM,UAAU,0BAAyB,KAAK,aAAa,UAAU;AAAA,IACrE,MAAM,WAAW,MAAM,UACrB,GAAG,qBAAqB,mBAAmB,OAAO,kBAAkB,mBAAmB,YAAY,KACnG,EAAE,QAAQ,UAAU,SAAS,cAAa,KAAK,YAAY,EAAE,CAC/D;AAAA,IACA,MAAM,OAAO,MAAM,mBAAkB,QAAQ;AAAA,IAC7C,IAAI,SAAS,WAAW;AAAA,MAAK;AAAA,IAC7B,kBAAiB,UAAU,MAAM,+BAA+B;AAAA;AAAA,OAGpD,mBAAkB,CAAC,SAA6D;AAAA,IAC5F,MAAM,YAAY,UAAS,KAAK,aAAa,KAAK;AAAA,IAClD,MAAM,UAAU,0BAAyB,KAAK,aAAa,UAAU;AAAA,IACrE,MAAM,MAAM,IAAI,IAAI,GAAG,2BAA2B;AAAA,IAClD,IAAI,aAAa,IAAI,YAAY,OAAO;AAAA,IACxC,MAAM,WAAW,MAAM,UAAU,KAAK;AAAA,MACpC,QAAQ;AAAA,MACR,SAAS,cAAa,KAAK,YAAY;AAAA,MACvC,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,IACzB,CAAC;AAAA,IACD,MAAM,OAAO,MAAM,mBAAkB,QAAQ;AAAA,IAC7C,kBAAiB,UAAU,MAAM,uBAAuB;AAAA,IACxD,IAAI,CAAC,oBAAoB,IAAI,GAAG;AAAA,MAC9B,MAAM,IAAI,MAAM,mEAAmE;AAAA,IACrF;AAAA,IACA,OAAO,EAAE,IAAI,KAAK,IAAI,UAAU,KAAK,SAAS;AAAA;AAAA,OAGlC,qBAAoB,CAAC,gBAAoE;AAAA,IACrG,MAAM,YAAY,UAAS,KAAK,aAAa,KAAK;AAAA,IAClD,MAAM,UAAU,0BAAyB,KAAK,aAAa,UAAU;AAAA,IACrE,MAAM,WAAW,MAAM,UACrB,GAAG,4BAA4B,mBAAmB,cAAc,KAChE,EAAE,SAAS,cAAa,KAAK,YAAY,EAAE,CAC7C;AAAA,IACA,MAAM,OAAO,MAAM,mBAAkB,QAAQ;AAAA,IAC7C,kBAAiB,UAAU,MAAM,uBAAuB;AAAA,IACxD,IAAI,CAAC,oBAAoB,IAAI,GAAG;AAAA,MAC9B,MAAM,IAAI,MAAM,yDAAyD,iBAAiB;AAAA,IAC5F;AAAA,IACA,OAAO,EAAE,IAAI,KAAK,IAAI,UAAU,KAAK,SAAS;AAAA;AAAA,OAGlC,4BAA2B,CACvC,SACkC;AAAA,IAClC,MAAM,cAAc,KAAK,qBAAqB;AAAA,IAC9C,MAAM,iBAAiB,KAAK,wBAAwB;AAAA,IACpD,IAAI,gBAAgB,WAAW;AAAA,MAC7B,IAAI,mBAAmB,WAAW;AAAA,QAChC,MAAM,IAAI,MAAM,6EAA6E;AAAA,MAC/F;AAAA,MACA,OAAO,KAAK,0BAA0B,WAAW;AAAA,IACnD;AAAA,IACA,OAAO,KAAK,+BAA+B,OAAO;AAAA;AAAA,OAGtC,0BAAyB,CACrC,aACmC;AAAA,IACnC,MAAM,SAAS,0BAA0B,WAAW;AAAA,IACpD,MAAM,WAAW,MAAM,KAAK,wBAAwB,EAAE,mBAAmB,MAAM;AAAA,IAC/E,OAAO,EAAE,cAAc,SAAS,aAAa;AAAA;AAAA,OAGjC,+BAA8B,CAC1C,SACkC;AAAA,IAClC,MAAM,UAAU,MAAM,KAAK,qBAAqB,QAAQ,QAAQ;AAAA,IAChE,KAAK,iBAAiB;AAAA,IAEtB,IAAI;AAAA,MACF,MAAM,KAAK,sBAAsB,OAAO;AAAA,MACxC,MAAM,aAAa,MAAM,KAAK,gCAAgC,OAAO;AAAA,MACrE,KAAK,2BAA2B,OAAO;AAAA,MACvC,OAAO,EAAE,cAAc,WAAW,aAAa;AAAA,MAC/C,OAAO,OAAO;AAAA,MACd,MAAM,KAAK,sBAAsB;AAAA,MACjC,MAAM;AAAA;AAAA;AAAA,OAII,qBAAoB,CAAC,SAA+C;AAAA,IAChF,MAAM,YAAY,UAAS,KAAK,aAAa,KAAK;AAAA,IAClD,MAAM,UAAU,0BAAyB,KAAK,aAAa,UAAU;AAAA,IACrE,MAAM,WAAW,MAAM,UACrB,GAAG,qBAAqB,mBAAmB,OAAO,eAClD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,cAAa,KAAK,YAAY;AAAA,MACvC,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,IACzB,CACF;AAAA,IACA,MAAM,OAAO,MAAM,mBAAkB,QAAQ;AAAA,IAC7C,kBAAiB,UAAU,MAAM,8BAA8B;AAAA,IAC/D,IAAI,CAAC,oBAAoB,IAAI,GAAG;AAAA,MAC9B,MAAM,IAAI,MAAM,mFAAmF;AAAA,IACrG;AAAA,IAEA,MAAM,iBAAiB,KAAK,uBAAuB;AAAA,IACnD,MAAM,aAAa,eAAe,cAAc;AAAA,IAChD,MAAM,iBAAiB,eAAe,kBACjC;AAAA,IACL,MAAM,sBAAsB,eAAe,uBACtC;AAAA,IACL,MAAM,2BAA2B,KAAK,IACpC,MACA,KAAK,MAAM,aAAa,QAAS,GAAG,CACtC;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB,eAAe,qBAAqB;AAAA,MACvD,kBAAkB,eAAe,oBAAoB;AAAA,IACvD;AAAA;AAAA,OAGY,sBAAqB,CAAC,SAA6C;AAAA,IAC/E,IAAI,KAAK,wBAAwB;AAAA,MAC/B,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,IAEA,KAAK,yBAAyB,KAAK,0BAA0B,OAAO;AAAA,IACpE,IAAI;AAAA,MACF,MAAM,KAAK;AAAA,cACX;AAAA,MACA,KAAK,yBAAyB;AAAA;AAAA;AAAA,OAIpB,0BAAyB,CAAC,SAA6C;AAAA,IACnF,MAAM,YAAY,UAAS,KAAK,aAAa,KAAK;AAAA,IAClD,MAAM,UAAU,0BAAyB,KAAK,aAAa,UAAU;AAAA,IACrE,MAAM,WAAW,MAAM,UACrB,GAAG,qBAAqB,mBAAmB,QAAQ,OAAO,uBAC1D;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,cAAa,KAAK,YAAY;AAAA,MACvC,MAAM,KAAK,UAAU,EAAE,YAAY,QAAQ,WAAW,CAAC;AAAA,IACzD,CACF;AAAA,IACA,MAAM,OAAO,MAAM,mBAAkB,QAAQ;AAAA,IAC7C,kBAAiB,UAAU,MAAM,+BAA+B;AAAA,IAChE,IAAI,CAAC,2BAA2B,IAAI,KAAK,CAAC,KAAK,SAAS;AAAA,MACtD,MAAM,IAAI,MAAM,iEAAiE;AAAA,IACnF;AAAA,IACA,IAAI,KAAK,cAAc,QAAQ,WAAW;AAAA,MACxC,MAAM,IAAI,kCACR,qDAAqD,QAAQ,qBAAqB,QAAQ,kBAAkB,KAAK,YACnH;AAAA,IACF;AAAA;AAAA,OAGY,wBAAuB,CAAC,SAA6C;AAAA,IACjF,MAAM,KAAK,sBAAsB,OAAO;AAAA,IAExC,MAAM,YAAY,UAAS,KAAK,aAAa,KAAK;AAAA,IAClD,MAAM,UAAU,0BAAyB,KAAK,aAAa,UAAU;AAAA,IACrE,MAAM,WAAW,MAAM,UACrB,GAAG,qBAAqB,mBAAmB,QAAQ,OAAO,eAC1D;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,cAAa,KAAK,YAAY;AAAA,IACzC,CACF;AAAA,IACA,MAAM,OAAO,MAAM,mBAAkB,QAAQ;AAAA,IAC7C,IAAI,SAAS,WAAW;AAAA,MAAK;AAAA,IAC7B,kBAAiB,UAAU,MAAM,iCAAiC;AAAA;AAAA,OAGtD,gCAA+B,CAC3C,SACmC;AAAA,IACnC,MAAM,WAAW,KAAK,IAAI,IAAI,QAAQ;AAAA,IACtC,IAAI;AAAA,IAEJ,OAAO,MAAM;AAAA,MACX,IAAI;AAAA,QACF,MAAM,WAAW,MAAM,KAAK,wBAAwB,EAAE,mBAAmB;AAAA,UACvE,UAAU,QAAQ;AAAA,QACpB,CAAC;AAAA,QACD,OAAO,EAAE,cAAc,SAAS,aAAa;AAAA,QAC7C,OAAO,OAAO;AAAA,QACd,YAAY;AAAA,QACZ,IAAI,CAAC,sCAAsC,KAAK,KAAK,KAAK,IAAI,KAAK,UAAU;AAAA,UAC3E;AAAA,QACF;AAAA,QACA,MAAM,cAAc,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC;AAAA,QACrD,MAAM,MAAM,KAAK,IAAI,QAAQ,qBAAqB,WAAW,CAAC;AAAA;AAAA,IAElE;AAAA,IAEA,MAAM,SAAS,qBAAqB,QAAQ,UAAU,UAAU,OAAO,SAAS;AAAA,IAChF,MAAM,IAAI,MACR,yBAAyB,QAAQ,wCAAwC,QAAQ,qBAAqB,QACxG;AAAA;AAAA,EAGM,0BAA0B,CAAC,SAAoC;AAAA,IACrE,KAAK,0BAA0B;AAAA,IAC/B,KAAK,sBAAsB,YAAY,MAAM;AAAA,MACtC,KAAK,sBAAsB,OAAO,EAAE,MAAM,CAAC,UAAU;AAAA,QACxD,IAAI,iBAAiB,mCAAmC;AAAA,UACtD,KAAK,0BAA0B;AAAA,QACjC;AAAA,OACD;AAAA,OACA,QAAQ,iBAAiB;AAAA,IAC3B,KAAK,oBAA+C,QAAQ;AAAA;AAAA,EAGvD,yBAAyB,GAAS;AAAA,IACxC,IAAI,CAAC,KAAK;AAAA,MAAqB;AAAA,IAC/B,cAAc,KAAK,mBAAmB;AAAA,IACtC,KAAK,sBAAsB;AAAA;AAAA,OAGf,sBAAqB,GAAkB;AAAA,IACnD,KAAK,0BAA0B;AAAA,IAC/B,MAAM,UAAU,KAAK;AAAA,IACrB,KAAK,iBAAiB;AAAA,IACtB,IAAI,CAAC,WAAW,CAAC,QAAQ;AAAA,MAAkB;AAAA,IAC3C,IAAI;AAAA,MACF,MAAM,KAAK,wBAAwB,OAAO;AAAA,MAC1C,MAAM;AAAA;AAAA,EAKF,uBAAuB,GAA4B;AAAA,IACzD,OAAO,IAAI,wBAAwB;AAAA,MACjC,SAAS,KAAK,aAAa;AAAA,MAC3B,QAAQ,gBAAe,KAAK,YAAY;AAAA,MACxC,SAAS,KAAK,aAAa;AAAA,MAC3B,OAAO,KAAK,aAAa;AAAA,IAC3B,CAAC;AAAA;AAAA,EAGK,oBAAoB,GAAqC;AAAA,IAC/D,MAAM,kBAAkB,KAAK,KAAK,SAAS,YACvC,KAAK,KAAK,QAAQ,cAClB;AAAA,IACJ,OAAO,mBAAmB,KAAK,aAAa;AAAA;AAAA,EAGtC,uBAAuB,GAA6C;AAAA,IAC1E,MAAM,cAAc,KAAK,KAAK,SAAS,YACnC,KAAK,KAAK,QAAQ,UAClB;AAAA,IACJ,OAAO,eAAe,KAAK,aAAa;AAAA;AAAA,EAGlC,sBAAsB,GAAiC;AAAA,IAC7D,OAAO,KAAK,wBAAwB,KAAK,CAAC;AAAA;AAE9C;;;AC5qCA,IAAM,sBAAqC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAAS,cAAc,CAAC,QAAgC;AAAA,EACtD,OAAO,OACJ,IAAI,CAAC,SAAS;AAAA,IACb,IAAI,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IACrC,IAAI,WAAW;AAAA,MAAM,OAAQ,KAAqB;AAAA,IAClD,OAAO;AAAA,GACR,EACA,OAAO,CAAC,UAA2B,UAAU,IAAI;AAAA;AAGtD,SAAS,+BAA+B,CAAC,SAAqC;AAAA,EAC5E,IACE,QAAQ,gCAAgC,cACvC,CAAC,OAAO,UAAU,QAAQ,2BAA2B,KACpD,QAAQ,8BAA8B,IACxC;AAAA,IACA,MAAM,IAAI,MACR,uEACF;AAAA,EACF;AAAA,EAEA,IACE,QAAQ,8BAA8B,cACrC,CAAC,OAAO,UAAU,QAAQ,yBAAyB,KAClD,QAAQ,6BAA6B,IACvC;AAAA,IACA,MAAM,IAAI,MACR,iEACF;AAAA,EACF;AAAA;AAGF,SAAS,6BAA6B,CAAC,SAAqC;AAAA,EAC1E,IAAK,QAAuC,iBAAiB,WAAW;AAAA,IACtE,MAAM,IAAI,MACR,2CACF;AAAA,EACF;AAAA;AAMF,SAAS,0BAA0B,CAAC,QAAsB;AAAA,EACxD,MAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,IAAI,CAAC,aAAa,SAAS,MAAM,GAAG;AAAA,IAClC,MAAM,IAAI,MACR,iCAAiC,cAC/B,kBAAkB,aAAa,KAAK,IAAI,GAC5C;AAAA,EACF;AAAA;AAGF,SAAS,oBAAoB,CAAC,SAA0C;AAAA,EACtE,IAAI,YAAY,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,CAAC,oBAAoB,SAAS,MAAM,GAAG;AAAA,MACzC,MAAM,IAAI,MACR,yBAAyB,0BAA0B,oBAAoB,KAAK,IAAI,GAClF;AAAA,IACF;AAAA,EACF;AAAA;AAGF,SAAS,uBAAuB,CAAC,UAA6C;AAAA,EAC5E,IAAI,aAAa,WAAW;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IACE,SAAS,YAAY,aACrB,CAAC,CAAC,OAAO,cAAc,kBAAkB,EAAE,SAAS,SAAS,OAAO,GACpE;AAAA,IACA,MAAM,IAAI,MACR,6BAA6B,OAAO,SAAS,OAAO,qDACtD;AAAA,EACF;AAAA,EAEA,IACE,SAAS,aAAa,aACtB,CAAC,CAAC,YAAY,aAAa,EAAE,SAAS,SAAS,QAAQ,GACvD;AAAA,IACA,MAAM,IAAI,MACR,8BAA8B,OAAO,SAAS,QAAQ,yCACxD;AAAA,EACF;AAAA,EAEA,IACE,SAAS,cAAc,cACtB,CAAC,OAAO,UAAU,SAAS,SAAS,KAAK,SAAS,aAAa,IAChE;AAAA,IACA,MAAM,IAAI,MACR,0DACF;AAAA,EACF;AAAA;AAGF,SAAS,uBAAuB,CAAC,OAAsB;AAAA,EACrD,IAAI,UAAU;AAAA,IAAW;AAAA,EACzB,IACE,OAAO,UAAU,YACjB,CAAC,wBAAwB,SAAS,KAAiD,GACnF;AAAA,IACA,MAAM,IAAI,MACR,4BAA4B,OAAO,KAAK,qBAAqB,wBAAwB,KAAK,IAAI,GAChG;AAAA,EACF;AAAA;AAMK,SAAS,4BAA4B,CAAC,SAAqC;AAAA,EAEhF,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,2BAA2B,QAAQ,YAAY;AAAA,EACjD;AAAA,EAEA,qBAAqB,QAAQ,YAAY;AAAA,EACzC,wBAAwB,QAAQ,eAAe;AAAA,EAC/C,wBAAwB,QAAQ,QAAQ;AAAA,EACxC,gCAAgC,OAAO;AAAA,EACvC,8BAA8B,OAAO;AAAA;AAMhC,SAAS,0BAA0B,CAAC,SAAmC;AAAA,EAE5E,IAAI,QAAQ,WAAW,WAAW;AAAA,IAChC,MAAM,cAAc,eAAe,QAAQ,MAAM;AAAA,IAEjD,IAAI,QAAQ,YAAY,aAAa,CAAC,YAAY,SAAS,SAAS,GAAG;AAAA,MACrE,MAAM,IAAI,MACR,kEACE,oEACJ;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,UAAU,aAAa,CAAC,YAAY,SAAS,OAAO,GAAG;AAAA,MACjE,MAAM,IAAI,MACR,gEACE,gEACJ;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IACE,QAAQ,iBAAiB,aACzB,OAAO,QAAQ,iBAAiB,UAChC;AAAA,IACA,2BAA2B,QAAQ,aAAa,MAAM;AAAA,EACxD,EAAO,SACL,QAAQ,iBAAiB,aACzB,OAAO,QAAQ,iBAAiB,UAChC;AAAA,IAEA,MAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,aAAa,SAAS,QAAQ,YAAkC,GAAG;AAAA,MACrE,2BAA2B,QAAQ,YAAY;AAAA,IACjD;AAAA,EAEF;AAAA,EAEA,qBAAqB,QAAQ,YAAY;AAAA,EACzC,wBAAwB,QAAQ,QAAQ;AAAA;;;AC9L1C,IAAM,iBAAiB,IAAI,IAAsB;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,OAA0C;AAAA,EACpE,OAAO,eAAe,IAAI,KAAyB;AAAA;AAGrD,SAAS,qBAAqB,CAC5B,SACkC;AAAA,EAClC,IAAI,iBAAiB,SAAS;AAAA,IAC5B,OAAO,QAAQ;AAAA,EACjB;AAAA,EACA;AAAA;AAGF,SAAS,0BAA0B,CACjC,SACsB;AAAA,EACtB,MAAM,iBAAiB,KAAK,QAAQ;AAAA,EACpC,OAAO,eAAe;AAAA,EACtB,OAAO,eAAe;AAAA,EACtB,OAAO;AAAA;AAGT,SAAS,sBAAsB,CAAC,SAAiD;AAAA,EAC/E,OAAO,QAAQ,cAAc,aAAa,QAAQ,UAAU,SAAS;AAAA;AAGvE,SAAS,yBAAyB,CAAC,SAAsC;AAAA,EACvE,OAAO,iBAAkB;AAAA;AAG3B,SAAS,2BAA2B,CAAC,SAAsC;AAAA,EACzE,OAAO,OAAO,QAAQ,UAAU,YAAY,QAAQ,MAAM,KAAK,EAAE,SAAS;AAAA;AAG5E,SAAS,uBAAuB,CAAC,IAAqB;AAAA,EACpD,OAAO,GAAG,WAAW,OAAO,KAAK,GAAG,WAAW,aAAa;AAAA;AAAA;AAiBvD,MAAM,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,EACQ;AAAA,EACT,qBAAgD;AAAA,EAExD,WAAW,CAAC,UAAkC,CAAC,GAAG;AAAA,IAChD,MAAM,UAAU,QAAQ,WAAW;AAAA,IACnC,IAAI,CAAC,mBAAmB,OAAO,GAAG;AAAA,MAChC,MAAM,IAAI,MACR,+BAA+B,OAAO,OAAO,yCAC/C;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AAAA,IACf,KAAK,cAAc,sBAAsB,OAAO;AAAA,IAChD,KAAK,UAAU;AAAA,IAEf,IAAI,KAAK,YAAY,WAAW,KAAK,gBAAgB,WAAW;AAAA,MAC9D,MAAM,IAAI,MACR,mEACF;AAAA,IACF;AAAA,IACA,IAAI,KAAK,YAAY,YAAY,KAAK,gBAAgB,WAAW;AAAA,MAC/D,MAAM,IAAI,MACR,8GACF;AAAA,IACF;AAAA,IACA,IAAI,KAAK,YAAY,WAAY,QAAkC,YAAY,WAAW;AAAA,MACxF,MAAM,IAAI,MAAM,wEAAwE;AAAA,IAC1F;AAAA,IAEA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,MAAM,eAAe;AAAA,MACrB,IACE,aAAa,cAAc,aAC3B,aAAa,cAAc,gBAC3B,aAAa,cAAc,SAC3B;AAAA,QACA,MAAM,IAAI,MAAM,2DAA2D;AAAA,MAC7E;AAAA,MACA,MAAM,mBAAmB,aAAa,WAAW;AAAA,MACjD,IACE,qBAAqB,cACpB,CAAC,OAAO,UAAU,gBAAgB,KAAK,oBAAoB,IAC5D;AAAA,QACA,MAAM,IAAI,MAAM,kEAAkE;AAAA,MACpF;AAAA,MACA,MAAM,mBAAmB,aAAa,WAAW;AAAA,MACjD,IACE,qBAAqB,cACpB,CAAC,OAAO,UAAU,gBAAgB,KAAK,oBAAoB,IAC5D;AAAA,QACA,MAAM,IAAI,MAAM,kEAAkE;AAAA,MACpF;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,YAAY,UAAU;AAAA,MAC7B,IAAI,EAAE,SAAS,YAAY,OAAO,QAAQ,QAAQ,YAAY,QAAQ,IAAI,WAAW,GAAG;AAAA,QACtF,MAAM,IAAI,MAAM,2DAA2D;AAAA,MAC7E;AAAA,MACA,IACE,QAAQ,qBAAqB,cAC5B,CAAC,OAAO,UAAU,QAAQ,gBAAgB,KAAK,QAAQ,oBAAoB,IAC5E;AAAA,QACA,MAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,2BAA2B,OAAsC;AAAA,IACnE;AAAA;AAAA,MASE,YAAY,GAAuB;AAAA,IACrC,OAAO,KAAK,sBAAsB;AAAA;AAAA,OAG9B,YAAW,CAAC,UAA8B,CAAC,GAAoB;AAAA,IACnE,IAAI,0BAA0B,OAAO,GAAG;AAAA,MACtC,MAAM,IAAI,MACR,yHACF;AAAA,IACF;AAAA,IAEA,2BAA2B,OAAO;AAAA,IAElC,IAAI,KAAK,YAAY,UAAU;AAAA,MAC7B,MAAM,WAAU,IAAI,iBAAiB,KAAK,cAAc,GAAG;AAAA,QACzD,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,MACD,MAAM,WAAU,MAAM,SAAQ,WAAW;AAAA,MACzC,SAAQ,MAAM;AAAA,MACd,OAAO,SAAQ;AAAA,IACjB;AAAA,IACA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,IAAI,CAAC,4BAA4B,OAAO,GAAG;AAAA,QACzC,MAAM,IAAI,MACR,iHACF;AAAA,MACF;AAAA,MACA,OAAO,iBAAiB,KAAK,aAAa,GAAG,OAAO;AAAA,IACtD;AAAA,IACA,KAAK,mBAAmB,aAAa;AAAA,IACrC,IAAI,CAAC,KAAK,oBAAoB,GAAG;AAAA,MAC/B,MAAM,WAAU,IAAI,iBAAiB,KAAK,sBAAsB,GAAG;AAAA,QACjE,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,MACD,MAAM,WAAU,MAAM,SAAQ,WAAW;AAAA,MACzC,SAAQ,MAAM;AAAA,MACd,OAAO,SAAQ;AAAA,IACjB;AAAA,IACA,MAAM,UAAU,IAAI,QAAQ,KAAK,SAAS,YAAY,KAAK,CAAC;AAAA,IAC5D,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,IACzC,QAAQ,MAAM;AAAA,IACd,OAAO,QAAQ;AAAA;AAAA,EASjB,aAAa,CACX,kBACA,UAAyC,CAAC,GACxB;AAAA,IAClB,MAAM,UACJ,OAAO,qBAAqB,WAAW,mBAAmB;AAAA,IAC5D,MAAM,kBACJ,OAAO,qBAAqB,WAAW,UAAW,oBAAoB,CAAC;AAAA,IAEzE,KAAK,qBAAqB,iBAAiB,eAAe;AAAA,IAC1D,MAAM,iBAAiB,2BAA2B,eAAe;AAAA,IACjE,6BAA6B,cAAc;AAAA,IAE3C,IAAI,KAAK,YAAY,UAAU;AAAA,MAC7B,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,IAAI,MACR,gGACF;AAAA,MACF;AAAA,MACA,OAAO,IAAI,iBAAiB,KAAK,cAAc,GAAG;AAAA,QAChD,MAAM;AAAA,QACN;AAAA,QACA,iBAAiB;AAAA,QACjB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,IAAI,MACR,mGACF;AAAA,MACF;AAAA,MACA,OAAO,IAAI,wBAAwB,KAAK,aAAa,GAAG;AAAA,QACtD,MAAM;AAAA,QACN;AAAA,QACA,iBAAiB;AAAA,QACjB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,IAAI,CAAC,KAAK,oBAAoB,KAAK,SAAS;AAAA,MAC1C,OAAO,IAAI,iBAAiB,KAAK,sBAAsB,GAAG;AAAA,QACxD,MAAM;AAAA,QACN;AAAA,QACA,iBAAiB;AAAA,QACjB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,IAAI,SAAS;AAAA,MACX,OAAO,IAAI,QAAQ,KAAK,gBAAgB,SAAS,iBAAiB,KAAK,CAAC;AAAA,IAC1E;AAAA,IACA,OAAO,IAAI,QAAQ,KAAK,gBAAgB,iBAAiB,KAAK,CAAC;AAAA;AAAA,EASjE,aAAa,CACX,IACA,UAAyC,CAAC,GACxB;AAAA,IAClB,KAAK,qBAAqB,iBAAiB,OAAO;AAAA,IAClD,MAAM,iBAAiB,2BAA2B,OAAO;AAAA,IACzD,6BAA6B,cAAc;AAAA,IAE3C,IAAI,KAAK,YAAY,UAAU;AAAA,MAC7B,IAAI,wBAAwB,EAAE,GAAG;AAAA,QAC/B,OAAO,IAAI,iBAAiB,KAAK,cAAc,GAAG;AAAA,UAChD,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,OAAO,IAAI,iBAAiB,KAAK,cAAc,GAAG;AAAA,QAChD,MAAM;AAAA,QACN,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,IAAI,wBAAwB,EAAE,GAAG;AAAA,QAC/B,OAAO,IAAI,wBAAwB,KAAK,aAAa,GAAG;AAAA,UACtD,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,OAAO,IAAI,wBAAwB,KAAK,aAAa,GAAG;AAAA,QACtD,MAAM;AAAA,QACN,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,IAAI,CAAC,KAAK,oBAAoB,GAAG;AAAA,MAC/B,IAAI,wBAAwB,EAAE,GAAG;AAAA,QAC/B,OAAO,IAAI,iBAAiB,KAAK,sBAAsB,GAAG;AAAA,UACxD,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,OAAO,IAAI,iBAAiB,KAAK,sBAAsB,GAAG;AAAA,QACxD,MAAM;AAAA,QACN,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,IAAI,wBAAwB,EAAE,GAAG;AAAA,MAC/B,OAAO,IAAI,QAAQ,KAAK,gBAAgB,gBAAgB,GAAG,CAAC;AAAA,IAC9D;AAAA,IACA,OAAO,IAAI,QAAQ;AAAA,SACd;AAAA,MACH,SAAS;AAAA,MACT,qBAAqB;AAAA,IACvB,CAAC;AAAA;AAAA,OAIG,OAAM,CACV,SACA,SACA,UAAyC,CAAC,GACf;AAAA,IAC3B,MAAM,UAAU,UACZ,KAAK,cAAc,SAAS,OAAO,IACnC,KAAK,cAAc,OAAO;AAAA,IAE9B,IAAI;AAAA,MACF,OAAO,MAAO,QAAwB,QAAQ,OAAO;AAAA,cACrD;AAAA,MACA,QAAQ,MAAM;AAAA;AAAA;AAAA,EAIV,kBAAkB,CAAC,QAAsB;AAAA,IAC/C,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,MACR,6BAA6B,KAAK,oCAAoC,iDACxE;AAAA;AAAA,EAGM,oBAAoB,CAC1B,QACA,SACM;AAAA,IACN,MAAM,uBAAuB,QAAQ,eAAe,KAAK;AAAA,IACzD,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,IAAI,yBAAyB,WAAW;AAAA,QACtC,MAAM,IAAI,MACR,GAAG,sEACL;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,YAAY,WAAW;AAAA,QACjC,MAAM,IAAI,MAAM,GAAG,gEAAgE;AAAA,MACrF;AAAA,MACA,IAAI,uBAAuB,OAAO,GAAG;AAAA,QACnC,MAAM,IAAI,MAAM,GAAG,qEAAqE;AAAA,MAC1F;AAAA,MACA,IAAI,CAAC,KAAK,oBAAoB,GAAG;AAAA,QAC/B,oCAAoC,QAAQ,OAAO;AAAA,MACrD;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,YAAY,UAAU;AAAA,MAC7B,IAAI,QAAQ,gBAAgB,WAAW;AAAA,QACrC,MAAM,IAAI,MACR,GAAG,iHACL;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,YAAY,WAAW;AAAA,QACjC,MAAM,IAAI,MAAM,GAAG,2GAA2G;AAAA,MAChI;AAAA,MACA,IAAI,uBAAuB,OAAO,GAAG;AAAA,QACnC,MAAM,IAAI,MAAM,GAAG,qEAAqE;AAAA,MAC1F;AAAA,MACA,oCAAoC,QAAQ,OAAO;AAAA,MACnD;AAAA,IACF;AAAA,IACA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,MAAM,eAAe,KAAK,aAAa;AAAA,MACvC,IAAI,aAAa,gBAAgB,aAAa,QAAQ,YAAY,WAAW;AAAA,QAC3E,MAAM,IAAI,MAAM,iBAAiB,oFAAoF;AAAA,MACvH;AAAA,MACA,IAAI,aAAa,YAAY,aAAa,QAAQ,gBAAgB,WAAW;AAAA,QAC3E,MAAM,IAAI,MAAM,iBAAiB,qFAAqF;AAAA,MACxH;AAAA,MACA,mCAAmC,QAAQ,OAAO;AAAA,MAClD;AAAA,IACF;AAAA,IACA,MAAM,IAAI,MACR,6BAA6B,KAAK,oCAAoC,iDACxE;AAAA;AAAA,EAGM,mBAAmB,GAAY;AAAA,IACrC,OAAQ,KAAK,QAAwC,cAAc;AAAA;AAAA,EAG7D,qBAAqB,GAAG;AAAA,IAC9B,MAAM,eAAe,KAAK;AAAA,IAC1B,MAAM,YAAY,aAAa;AAAA,IAC/B,OAAO;AAAA,MACL,OAAO,WAAW,QAAQ;AAAA,MAC1B,cAAc;AAAA,SACV,WAAW,QAAQ,YAAY,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC;AAAA,SACzD,WAAW,cAAc,YAAY,EAAE,WAAW,UAAU,UAAU,IAAI,CAAC;AAAA,SAC3E,WAAW,qBAAqB,YAChC,EAAE,kBAAkB,UAAU,iBAAiB,IAC/C,CAAC;AAAA,SACD,WAAW,WAAW,YAAY,EAAE,aAAa,UAAU,OAAO,IAAI,CAAC;AAAA,SACvE,WAAW,qBAAqB,YAChC,EAAE,uBAAuB,UAAU,iBAAiB,IACpD,CAAC;AAAA,IACP;AAAA;AAAA,EAGM,aAAa,GAAiC;AAAA,IACpD,IAAI,KAAK,YAAY,UAAU;AAAA,MAC7B,MAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AAAA,IACA,OAAO,KAAK;AAAA;AAAA,EAGN,qBAAqB,GAAuB;AAAA,IAClD,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,MAAM,IAAI,MAAM,8DAA8D;AAAA,IAChF;AAAA,IACA,KAAK,uBAAuB,IAAI,mBAAmB,KAAK,aAAa,CAAC;AAAA,IACtE,OAAO,KAAK;AAAA;AAAA,EAGN,YAAY,GAAgC;AAAA,IAClD,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,MAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AAAA,IACA,OAAO,KAAK;AAAA;AAEhB;;AC1cA,SAAS,uBAAsB,CAAC,SAAiC;AAAA,EAC/D,IAAI,OAAO,YAAY,UAAU;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC1B,MAAM,SAAmB,CAAC;AAAA,IAC1B,WAAW,QAAQ,SAAS;AAAA,MAC1B,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,OAAO,KAAK,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,MACA,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,QACrC;AAAA,MACF;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,IAAI,OAAO,IAAI,SAAS,UAAU;AAAA,QAChC,OAAO,KAAK,IAAI,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,SAAS,OAAO,KAAK,EAAE;AAAA,IAC7B,OAAO,OAAO,SAAS,IAAI,SAAS;AAAA,EACtC;AAAA,EAEA,IAAI,WAAW,OAAO,YAAY,UAAU;AAAA,IAC1C,MAAM,MAAM;AAAA,IACZ,IAAI,OAAO,IAAI,SAAS,UAAU;AAAA,MAChC,OAAO,IAAI;AAAA,IACb;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAUF,SAAS,sBAAsB,CAAC,OAAsD;AAAA,EAC3F,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM;AAAA,EAEZ,MAAM,aAAa,IAAI;AAAA,EACvB,IAAI,cAAc,OAAO,eAAe,UAAU;AAAA,IAChD,MAAM,QAAQ;AAAA,IAEd,IAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,GAAG;AAAA,MACrE,OAAO,EAAE,MAAM,aAAa,MAAM,MAAM,UAAU;AAAA,IACpD;AAAA,IAEA,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,SAAS,GAAG;AAAA,MAC3D,OAAO,EAAE,MAAM,aAAa,MAAM,MAAM,KAAK;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,IAAI;AAAA,EACxB,IAAI,gBAAgB,qBAAqB;AAAA,IACvC,MAAM,gBACJ,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY,wBAAuB,IAAI,OAAO;AAAA,IACxF,IAAI,iBAAiB,cAAc,SAAS,GAAG;AAAA,MAC7C,OAAO,EAAE,MAAM,aAAa,MAAM,cAAc;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,IAAI,gBAAgB,qBAAqB;AAAA,IACvC,MAAM,gBAAgB,wBAAuB,IAAI,OAAO;AAAA,IACxD,IAAI,iBAAiB,cAAc,SAAS,GAAG;AAAA,MAC7C,OAAO,EAAE,MAAM,aAAa,MAAM,cAAc;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;;AC1EF,SAAS,UAAU,CAAC,SAA4C;AAAA,EACrE,OAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AAAA;AA0BK,SAAS,eAAe,CAC7B,QACA,KACA,UAA8B,CAAC,GACX;AAAA,EACpB,QAAQ,WAAW,OAAO,OAAO,MAAM,QAAQ,KAAK,aAAa,UAAU;AAAA,EAC3E,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI,OAAO,QAAQ,UAAU;AAAA,IAC3B,IAAI;AAAA,MAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,IACjD;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,OAAO,IAAI,KAAK,IAAI;AAAA,EAClC,IAAI,CAAC,SAAS,CAAC,YAAY;AAAA,IACzB,IAAI;AAAA,MAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,IACjD;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,eAAe,CAC7B,QACA,KACA,UAAqE,CAAC,GAClD;AAAA,EACpB,QAAQ,WAAW,OAAO,QAAQ,KAAK,UAAU,UAAU;AAAA,EAC3D,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG,GAAG;AAAA,IACnD,QAAQ;AAAA,EACV,EAAO,SAAI,OAAO,QAAQ,UAAU;AAAA,IAClC,MAAM,UAAU,IAAI,KAAK;AAAA,IACzB,IAAI,SAAS;AAAA,MACX,MAAM,SAAS,OAAO,WAAW,OAAO;AAAA,MACxC,IAAI,OAAO,SAAS,MAAM;AAAA,QAAG,QAAQ;AAAA,IACvC;AAAA,EACF;AAAA,EACA,IAAI,UAAU,WAAW;AAAA,IACvB,IAAI;AAAA,MAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,IACjD;AAAA,EACF;AAAA,EACA,OAAO,UAAU,KAAK,MAAM,KAAK,IAAI;AAAA;AAMhC,SAAS,gBAAgB,CAC9B,QACA,KACA,UAAkD,CAAC,GAC9B;AAAA,EACrB,QAAQ,WAAW,OAAO,QAAQ,QAAQ;AAAA,EAC1C,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,QAAQ,UAAU;AAAA,IAC3B,MAAM,QAAQ,IAAI,YAAY,EAAE,KAAK;AAAA,IACrC,IAAI,UAAU,UAAU,UAAU,OAAO,UAAU;AAAA,MAAO,OAAO;AAAA,IACjE,IAAI,UAAU,WAAW,UAAU,OAAO,UAAU;AAAA,MAAM,OAAO;AAAA,EACnE;AAAA,EACA,IAAI;AAAA,IAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,EACjD;AAAA;AAMK,SAAS,oBAAoB,CAClC,QACA,KACA,UAA8B,CAAC,GACT;AAAA,EACtB,QAAQ,WAAW,OAAO,QAAQ,QAAQ;AAAA,EAC1C,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI,MAAM,QAAQ,GAAG,GAAG;AAAA,IACtB,MAAM,SAAS,IACZ,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAC5D,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AAAA,IACjB,IAAI,OAAO,WAAW,GAAG;AAAA,MACvB,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,MACjD;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,QAAQ,UAAU;AAAA,IAC3B,MAAM,QAAQ,IAAI,KAAK;AAAA,IACvB,IAAI,CAAC,OAAO;AAAA,MACV,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,MACjD;AAAA,IACF;AAAA,IACA,OAAO,CAAC,KAAK;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,EACjD;AAAA;;;ACiLF;AAtJA,eAAsB,WAAW,CAAC,UAA8B,CAAC,GAAoB;AAAA,EACnF,2BAA2B,OAAO;AAAA,EAClC,OAAO,IAAI,iBAAiB,EAAE,YAAY,OAAO;AAAA;AAkB5C,SAAS,aAAa,CAC3B,SACA,UAAgC,CAAC,GACf;AAAA,EAClB,6BAA6B,OAAO;AAAA,EACpC,IAAI,SAAS;AAAA,IACX,OAAO,IAAI,iBAAiB,EAAE,cAAc,SAAS,OAAO;AAAA,EAC9D;AAAA,EAGA,OAAO,IAAI,iBAAiB,EAAE,SAAS,SAAS,WAAW,QAAQ,CAAC,EAAE,cAAc,OAAO;AAAA;AAqBtF,SAAS,aAAa,CAC3B,IACA,UAAgC,CAAC,GACf;AAAA,EAClB,6BAA6B,OAAO;AAAA,EACpC,OAAO,IAAI,iBAAiB,EAAE,cAAc,IAAI,OAAO;AAAA;AAwBzD,eAAsB,MAAM,CAC1B,SACA,SAC2B;AAAA,EAE3B,MAAM,UAAU,UACZ,cAAc,OAAO,IACrB,cAAc;AAAA,EAElB,IAAI;AAAA,IACF,OAAO,MAAO,QAAwB,QAAQ,OAAO;AAAA,YACrD;AAAA,IACA,QAAQ,MAAM;AAAA;AAAA;AAqClB,eAAsB,kBAAkB,CACtC,SACA,UAA+B,CAAC,GACH;AAAA,EAG7B,MAAM,UAAU,IAAI,iBAAiB,EAAE,cAAc,SAAS;AAAA,IAC5D,gBAAgB;AAAA,EAClB,CAAC;AAAA,EACD,MAAO,QAAiC,WAAW;AAAA,EACnD,IAAI;AAAA,IACF,OAAO,MAAM,QAAQ,aAAa,OAAO;AAAA,YACzC;AAAA,IACA,QAAQ,MAAM;AAAA;AAAA;AAsBX,SAAS,aAAa,CAAC,UAAgC;AAAA,EAC5D,MAAM,OAAO,aAAa,QAAQ,EAAE,SAAS,QAAQ;AAAA,EACrD,MAAM,MAAM,SAAS,YAAY;AAAA,EACjC,MAAM,aACJ,IAAI,SAAS,MAAM,IAAI,cACrB,IAAI,SAAS,MAAM,IAAI,cACvB,IAAI,SAAS,OAAO,IAAI,eACxB;AAAA,EAEJ,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,YAAY,KAAK;AAAA,EAC7C;AAAA;AAeK,SAAS,eAAe,CAC7B,MACA,aAAmD,aACrC;AAAA,EACd,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,YAAY,KAAK;AAAA,EAC7C;AAAA;AAgBF,eAAsB,YAAY,CAAC,KAAoC;AAAA,EACrE,MAAM,WAAW,MAAM,MAAM,GAAG;AAAA,EAChC,MAAM,SAAS,MAAM,SAAS,YAAY;AAAA,EAC1C,MAAM,OAAO,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ;AAAA,EAGlD,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAAA,EACvD,IAAI,aAAmD;AAAA,EAEvD,IAAI,aAAa,SAAS,MAAM,KAAK,aAAa,SAAS,KAAK,KAAK,IAAI,MAAM,WAAW,GAAG;AAAA,IAC3F,aAAa;AAAA,EACf,EAAO,SAAI,aAAa,SAAS,KAAK,KAAK,IAAI,SAAS,MAAM,GAAG;AAAA,IAC/D,aAAa;AAAA,EACf,EAAO,SAAI,aAAa,SAAS,MAAM,KAAK,IAAI,SAAS,OAAO,GAAG;AAAA,IACjE,aAAa;AAAA,EACf;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,YAAY,KAAK;AAAA,EAC7C;AAAA;",
23
- "debugId": "7B3400A69740F48F64756E2164756E21",
46
+ "mappings": "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",
47
+ "debugId": "C709C7C965B8180B64756E2164756E21",
24
48
  "names": []
25
49
  }