@letta-ai/letta-agent-sdk 0.2.1

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 (39) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +240 -0
  3. package/dist/app-server-session.d.ts +86 -0
  4. package/dist/app-server-session.d.ts.map +1 -0
  5. package/dist/cli-resolver.d.ts +9 -0
  6. package/dist/cli-resolver.d.ts.map +1 -0
  7. package/dist/client.d.ts +47 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/cloud-session.d.ts +45 -0
  10. package/dist/cloud-session.d.ts.map +1 -0
  11. package/dist/index.d.ts +167 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +4994 -0
  14. package/dist/index.js.map +24 -0
  15. package/dist/interactiveToolPolicy.d.ts +4 -0
  16. package/dist/interactiveToolPolicy.d.ts.map +1 -0
  17. package/dist/local-app-server.d.ts +17 -0
  18. package/dist/local-app-server.d.ts.map +1 -0
  19. package/dist/protocol.d.ts +205 -0
  20. package/dist/protocol.d.ts.map +1 -0
  21. package/dist/remote-client-session-core.d.ts +140 -0
  22. package/dist/remote-client-session-core.d.ts.map +1 -0
  23. package/dist/remote.d.ts +57 -0
  24. package/dist/remote.d.ts.map +1 -0
  25. package/dist/session.d.ts +142 -0
  26. package/dist/session.d.ts.map +1 -0
  27. package/dist/stream-events.d.ts +15 -0
  28. package/dist/stream-events.d.ts.map +1 -0
  29. package/dist/tests/advanced-session.d.ts +10 -0
  30. package/dist/tests/advanced-session.d.ts.map +1 -0
  31. package/dist/tool-helpers.d.ts +47 -0
  32. package/dist/tool-helpers.d.ts.map +1 -0
  33. package/dist/transport.d.ts +53 -0
  34. package/dist/transport.d.ts.map +1 -0
  35. package/dist/types.d.ts +759 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/validation.d.ts +15 -0
  38. package/dist/validation.d.ts.map +1 -0
  39. package/package.json +45 -0
@@ -0,0 +1,24 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/transport.ts", "../src/interactiveToolPolicy.ts", "../src/session.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"],
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",
6
+ "// 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
+ "// 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",
9
+ "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",
10
+ "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",
11
+ "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",
12
+ "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(\"App-server createAgent() does not yet support system prompt presets.\");\n }\n body.system = options.systemPrompt;\n } else {\n throw new Error(\"App-server createAgent() does not yet support system prompt preset objects.\");\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
+ "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",
14
+ "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} 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 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\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 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 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 }\n\n private async resolveRuntime(): Promise<{ runtime: RuntimeScope }> {\n let agentId = this.cloudMode.agentId;\n let conversationId = this.cloudMode.conversationId;\n\n if (agentId && this.cloudMode.newConversation) {\n const conversation = await this.createConversation(agentId);\n conversationId = conversation.id;\n } else if (agentId && this.cloudMode.defaultConversation) {\n conversationId = \"default\";\n }\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 || !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 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
+ "/**\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",
16
+ "import { Session } from \"./session.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 hasCreateAgentEnvironment(options: CreateAgentOptions): boolean {\n return \"environment\" in (options as Record<string, unknown>);\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 LettaCodeClient {\n readonly backend: LettaCodeBackend;\n readonly environment: LettaCodeEnvironment | undefined;\n private readonly options: LettaCodeClientOptions;\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 'LettaCodeClient environment is only valid with backend: \"cloud\".',\n );\n }\n if (this.backend === \"remote\" && this.environment !== undefined) {\n throw new Error(\n 'LettaCodeClient 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('LettaCodeClient 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(\"LettaCodeClient 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 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 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 `LettaCodeClient 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 (!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 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 `LettaCodeClient 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 ...(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 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 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",
18
+ "/**\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",
19
+ "/**\n * Letta Agent SDK\n *\n * Programmatic control of Letta Code CLI with persistent agent memory.\n *\n * @example\n * ```typescript\n * import { LettaCodeClient, createAgent, createSession, resumeSession, prompt } from '@letta-ai/letta-agent-sdk';\n *\n * const client = new LettaCodeClient({ 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 { LettaCodeClient } 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 // 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 { LettaCodeClient } 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 LettaCodeClient().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 LettaCodeClient().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 LettaCodeClient({ 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 LettaCodeClient().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 LettaCodeClient().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
+ ],
21
+ "mappings": "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",
22
+ "debugId": "386FEEB02928954D64756E2164756E21",
23
+ "names": []
24
+ }