@threadplane/langgraph 0.0.58 → 0.0.60
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threadplane-langgraph.mjs","sources":["../../../../libs/langgraph/src/lib/agent-lifecycle-registry.ts","../../../../libs/langgraph/src/lib/agent.types.ts","../../../../libs/langgraph/src/lib/client/create-langgraph-client.ts","../../../../libs/langgraph/src/lib/transport/fetch-stream.transport.ts","../../../../libs/langgraph/src/lib/internals/subagent-tracker.ts","../../../../libs/langgraph/src/lib/internals/stream-manager.bridge.ts","../../../../libs/langgraph/src/lib/client/client-options.ts","../../../../libs/langgraph/src/lib/internals/branch-tree.ts","../../../../libs/langgraph/src/lib/internals/extract-citations.ts","../../../../libs/langgraph/src/lib/client-tools.ts","../../../../libs/langgraph/src/lib/agent.fn.ts","../../../../libs/langgraph/src/lib/agent.provider.ts","../../../../libs/langgraph/src/lib/inject-agent.ts","../../../../libs/langgraph/src/lib/lifecycle.ts","../../../../libs/langgraph/src/lib/transport/mock-stream.transport.ts","../../../../libs/langgraph/src/lib/testing/mock-langgraph-agent.ts","../../../../libs/langgraph/src/lib/testing/fake-stream.transport.ts","../../../../libs/langgraph/src/lib/testing/provide-fake-agent.ts","../../../../libs/langgraph/src/lib/threads/threads-adapter.ts","../../../../libs/langgraph/src/lib/threads/refresh-on.ts","../../../../libs/langgraph/src/public-api.ts","../../../../libs/langgraph/src/threadplane-langgraph.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\nimport { Injectable, signal, type Signal } from '@angular/core';\nimport type { AgentLifecycle } from './lifecycle';\n\n/**\n * Optional registry that collects per-instance agent lifecycles within\n * an Angular injection context. External instrumentation packages\n * (e.g. cockpit-telemetry) provide this token and read from it.\n *\n * `@threadplane/langgraph` does NOT provide this itself — the configured agent\n * instance writes to the registry only when an external consumer has provided it.\n */\n@Injectable()\nexport class AgentLifecycleRegistry {\n private readonly _lifecycles = signal<readonly AgentLifecycle[]>([]);\n\n /** Reactive list of registered lifecycles. */\n readonly lifecycles: Signal<readonly AgentLifecycle[]> = this._lifecycles.asReadonly();\n\n register(lifecycle: AgentLifecycle): void {\n this._lifecycles.update((curr) => [...curr, lifecycle]);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Signal } from '@angular/core';\nimport type { ResourceStatus as NgResourceStatus } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport type {\n BagTemplate,\n Checkpoint,\n Command,\n Config,\n InferBag,\n Interrupt,\n Metadata,\n ThreadState,\n ToolProgress,\n ToolCallWithResult,\n StreamMode,\n} from '@langchain/langgraph-sdk';\nimport type {\n MessageMetadata,\n SubmitOptions,\n} from '@langchain/langgraph-sdk/ui';\nimport type { BaseMessage, AIMessage as CoreAIMessage } from '@langchain/core/messages';\nimport type {\n AgentRuntimeTelemetrySink,\n AgentSubmitInput,\n AgentSubmitOptions,\n AgentWithHistory,\n ClientToolsCapability,\n} from '@threadplane/chat';\nimport type { AgentLifecycle } from './lifecycle';\n\n// Re-export SDK types so consumers don't need to import from langgraph-sdk directly\nexport type { BagTemplate, InferBag, Interrupt, ThreadState, SubmitOptions };\n\n/**\n * Runtime constant mirroring Angular's ResourceStatus string-union type.\n * Angular 21 ships ResourceStatus as a pure string-union type (no runtime value),\n * so we provide a const-object shim for code that needs runtime comparisons.\n */\nexport const ResourceStatus = {\n Idle: 'idle',\n Loading: 'loading',\n Reloading: 'reloading',\n Resolved: 'resolved',\n Error: 'error',\n Local: 'local',\n} as const satisfies Record<string, NgResourceStatus>;\n\nexport type ResourceStatus = NgResourceStatus;\n\n// ── Transport interface ──────────────────────────────────────────────────────\n\n/** An event emitted by a LangGraph stream. */\nexport interface StreamEvent {\n /** Event type identifier (e.g., 'values', 'messages', 'error', 'interrupt'). */\n type:\n | 'values'\n | `values|${string}`\n | 'messages'\n | `messages|${string}`\n | `messages/${string}`\n | `messages/${string}|${string}`\n | 'updates'\n | `updates|${string}`\n | 'tools'\n | `tools|${string}`\n | 'custom'\n | `custom|${string}`\n | 'error'\n | `error|${string}`\n | 'metadata'\n | 'checkpoints'\n | `checkpoints|${string}`\n | 'tasks'\n | `tasks|${string}`\n | 'debug'\n | `debug|${string}`\n | 'events'\n | `events|${string}`\n | 'interrupt'\n | 'interrupts';\n namespace?: string[];\n messages?: unknown[];\n messageMetadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/** Strategy for handling concurrent LangGraph runs on the same thread. */\nexport type LangGraphMultitaskStrategy = 'reject' | 'interrupt' | 'rollback' | 'enqueue';\n\nexport type LangGraphDurability = 'exit' | 'async' | 'sync';\nexport type LangGraphOnCompletion = 'complete' | 'continue';\nexport type LangGraphOnDisconnect = 'cancel' | 'continue';\n\n/** Options accepted by LangGraph-backed submit calls. */\nexport interface LangGraphSubmitOptions {\n signal?: AbortSignal;\n config?: Config;\n context?: unknown;\n checkpoint?: Omit<Checkpoint, 'thread_id'> | null;\n checkpointId?: string;\n command?: Command;\n metadata?: Metadata;\n checkpointDuring?: boolean;\n durability?: LangGraphDurability;\n interruptBefore?: '*' | string[];\n interruptAfter?: '*' | string[];\n onCompletion?: LangGraphOnCompletion;\n webhook?: string;\n onDisconnect?: LangGraphOnDisconnect;\n afterSeconds?: number;\n ifNotExists?: 'create' | 'reject';\n onRunCreated?: (params: { run_id: string; thread_id?: string }) => void;\n streamMode?: StreamMode[];\n streamSubgraphs?: boolean;\n streamResumable?: boolean;\n feedbackKeys?: string[];\n /** Convenience alias normalized to `command.resume` before invoking LangGraph. */\n resume?: unknown;\n /** Strategy for handling concurrent runs on the same thread. */\n multitaskStrategy?: LangGraphMultitaskStrategy;\n}\n\n/** A queued server-side LangGraph run. */\nexport interface AgentQueueEntry<T = unknown> {\n /** Server-side run ID. */\n id: string;\n /** Thread that owns the queued run. */\n threadId: string;\n /** Values submitted for the queued run. */\n values: T | null | undefined;\n /** Submit options used when the queued run was created. */\n options?: LangGraphSubmitOptions;\n /** Timestamp when the queued run was registered locally. */\n createdAt: Date;\n}\n\n/** Public queue surface for pending server-side LangGraph runs. */\nexport interface AgentQueue<T = unknown> {\n /** Read-only pending queue entries. */\n readonly entries: ReadonlyArray<AgentQueueEntry<T>>;\n /** Number of pending queue entries. */\n readonly size: number;\n /** Cancel a specific pending run by server run ID. */\n cancel: (id: string) => Promise<boolean>;\n /** Cancel all pending runs and clear the queue. */\n clear: () => Promise<void>;\n}\n\n/** A checkpoint entry in the experimental branch tree. */\nexport interface AgentBranchTreeNode<T = unknown> {\n type: 'node';\n value: ThreadState<T>;\n path: string[];\n}\n\n/** A branch fork where each item is an alternate checkpoint sequence. */\nexport interface AgentBranchTreeFork<T = unknown> {\n type: 'fork';\n items: AgentBranchTree<T>[];\n}\n\n/** Tree representation of LangGraph checkpoint history for time-travel UIs. */\nexport interface AgentBranchTree<T = unknown> {\n type: 'sequence';\n items: Array<AgentBranchTreeNode<T> | AgentBranchTreeFork<T>>;\n}\n\n/** A custom event emitted by the LangGraph backend via adispatch_custom_event(). */\nexport interface CustomStreamEvent {\n /** Event name set by the backend (e.g., 'state_update'). */\n name: string;\n /** Arbitrary payload from the backend. */\n data: unknown;\n}\n\n/** Transport interface for connecting to a LangGraph agent. */\nexport interface AgentTransport {\n /** Open a streaming connection to an agent and yield events. */\n stream(\n assistantId: string,\n threadId: string | null,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): AsyncIterable<StreamEvent>;\n\n /** Optional: join an already-started run without creating a new one. */\n joinStream?(\n threadId: string,\n runId: string,\n lastEventId: string | undefined,\n signal: AbortSignal,\n ): AsyncIterable<StreamEvent>;\n\n /** Optional: create a server-side queued run without joining it immediately. */\n createQueuedRun?(\n assistantId: string,\n threadId: string,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): Promise<AgentQueueEntry>;\n\n /** Optional: cancel a server-side run. */\n cancelRun?(\n threadId: string,\n runId: string,\n signal: AbortSignal,\n ): Promise<void>;\n\n /** Optional: load persisted checkpoint history for a thread. */\n getHistory?(\n threadId: string,\n signal: AbortSignal,\n ): Promise<ThreadState[]>;\n\n /**\n * Optional: update server-side thread state (e.g. to emit RemoveMessage\n * entries for regenerate rollback). Forwards to the LangGraph\n * `threads.updateState` API.\n *\n * `options.asNode` corresponds to LangGraph's `as_node` parameter — the\n * server treats the update as if that node had just produced the values,\n * which determines what the next pull resumes. `regenerate()` passes\n * `asNode: '__start__'` so the next `submit(null)` resumes at the entry\n * node and re-runs `generate` against the rolled-back state.\n */\n updateState?(\n threadId: string,\n values: Record<string, unknown>,\n signal: AbortSignal,\n options?: { asNode?: string },\n ): Promise<void>;\n}\n\n// ── Options ──────────────────────────────────────────────────────────────────\n\n/** Options for creating a LangGraph-backed agent via {@link agent}. */\n// The second generic is retained for source compatibility with existing typed\n// AgentOptions references even though the options shape no longer depends on it.\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n/**\n * Tuning options for the underlying LangGraph SDK `Client` constructed by the\n * default {@link FetchStreamTransport}. Ignored when a custom `transport` is\n * supplied (the transport owns its own client).\n */\nexport interface LangGraphClientOptions {\n /**\n * How many times a failed request — including the initial stream connect —\n * is retried with exponential backoff before the error surfaces. Maps to the\n * SDK's `callerOptions.maxRetries`. Omitted → the SDK default (currently 4).\n *\n * Set `0` to fail fast: useful for e2e tests that force a connection failure\n * and assert the error surfaces promptly, rather than after the full\n * multi-second backoff window.\n */\n maxRetries?: number;\n}\n\nexport interface AgentOptions<T, _ResolvedBag extends BagTemplate> {\n /** Base URL of the LangGraph Platform API. Defaults to `provideAgent({ apiUrl })` when omitted. */\n apiUrl?: string;\n /** Agent or graph identifier on the LangGraph platform. */\n assistantId: string;\n /** Thread ID to connect to. Pass a Signal for reactive thread switching. */\n threadId?: Signal<string | null> | string | null;\n /** Called when a new thread is auto-created by the transport. */\n onThreadId?: (id: string) => void;\n /** Initial state values before the first stream response arrives. */\n initialValues?: Partial<T>;\n /** Throttle signal updates in milliseconds. `false` to disable. */\n throttle?: number | false;\n /** Custom message deserializer for non-standard message formats. */\n toMessage?: (msg: unknown) => BaseMessage;\n /** Custom transport. Defaults to FetchStreamTransport. */\n transport?: AgentTransport;\n /** Tuning options for the default transport's LangGraph SDK client (e.g. retry budget). */\n clientOptions?: LangGraphClientOptions;\n /** Optional app-owned telemetry sink. No telemetry is emitted unless this is provided. */\n telemetry?: AgentRuntimeTelemetrySink | false;\n /** When true, subagent messages are filtered from the main messages signal. */\n filterSubagentMessages?: boolean;\n /** Tool names that indicate a subagent invocation. */\n subagentToolNames?: string[];\n /**\n * A2UI client capabilities (catalog negotiation) to advertise to the graph.\n * When set, every plain-object run payload carries them under the\n * `a2ui_client_capabilities` state key — mirroring how `client_tools`\n * rides the payload. Read server-side via threadplane-middleware's\n * `a2ui_client_capabilities(state)`. Use `@threadplane/chat`'s\n * `a2uiClientCapabilities()` for the renderer's standard value.\n */\n a2uiClientCapabilities?: { supportedCatalogIds: string[]; inlineCatalogs?: unknown[] };\n /**\n * LangGraph node names whose `messages-tuple` LLM chunks should be projected\n * into the main chat transcript. Omit to accept all top-level message chunks.\n *\n * Use this when a graph has side-effect LLM nodes, such as title generation,\n * whose streamed model output should not render as assistant chat content.\n */\n transcriptNodeNames?: string[];\n}\n\n// ── SubagentStreamRef ────────────────────────────────────────────────────────\n\n/** Reference to a subagent's streaming state. */\nexport interface SubagentStreamRef {\n /** The tool call ID that spawned this subagent. */\n toolCallId: string;\n /** Optional human-readable subagent type/name. */\n name?: string;\n /** Current execution status of the subagent. */\n status: Signal<'pending' | 'running' | 'complete' | 'error'>;\n /** Current state values from the subagent. */\n values: Signal<Record<string, unknown>>;\n /** Messages from the subagent conversation. */\n messages: Signal<BaseMessage[]>;\n}\n\n// ── LangGraphAgent ────────────────────────────────────────────────────────────\n\n/**\n * Unified LangGraph agent surface returned by `injectAgent()`.\n *\n * Extends the runtime-neutral `AgentWithHistory` contract (chat-consumable)\n * with the full LangGraph-specific API. One object drives both `<chat>` and\n * any LangGraph-specific demo. Raw LangGraph signals are prefixed with\n * `langGraph` to avoid collision with the runtime-neutral names.\n */\nexport interface LangGraphAgent<T = unknown, ResolvedBag extends BagTemplate = BagTemplate>\n extends AgentWithHistory<T> {\n // ── Raw LangGraph signals ────────────────────────────────────────────────\n\n /** Raw LangChain BaseMessage list. Use `messages` for chat rendering. */\n langGraphMessages: Signal<BaseMessage[]>;\n\n /** All interrupts received during the current run (raw LangGraph shape). */\n langGraphInterrupts: Signal<Interrupt<ResolvedBag['InterruptType']>[]>;\n\n /** Raw LangGraph tool calls (with run-state). Use `toolCalls` for chat rendering. */\n langGraphToolCalls: Signal<ToolCallWithResult[]>;\n\n /** Raw LangGraph history (ThreadState[]). Use `history` for AgentCheckpoint[]. */\n langGraphHistory: Signal<ThreadState<T>[]>;\n\n /** Experimental branch tree derived from LangGraph checkpoint history. */\n experimentalBranchTree: Signal<AgentBranchTree<T>>;\n\n /** Submit input, resume commands, checkpoint forks, or other LangGraph run options. */\n submit: (\n input: AgentSubmitInput | null | undefined,\n opts?: AgentSubmitOptions & LangGraphSubmitOptions,\n ) => Promise<void>;\n\n /**\n * Client-declared, client-executed tools. Call setCatalog() to register\n * tool specs; the catalog is automatically shipped with every run via\n * `input.client_tools`. Pending tool calls appear in pending() after\n * the run ends; resolve() returns a result and continues the run.\n */\n clientTools: ClientToolsCapability;\n\n // ── LangGraph-specific fields preserved on the unified surface ───────────\n\n /** Current agent state values (raw, typed per the type parameter T). */\n value: Signal<T>;\n\n /** True once at least one value or message has been received. */\n hasValue: Signal<boolean>;\n\n /** Re-submit the last input to restart the stream. */\n reload: () => void;\n\n /**\n * Discards the assistant message at the given index AND all messages after\n * it, then re-runs the agent against the trimmed conversation tail. The\n * preceding user message (at index - 1) is preserved and re-submitted as\n * the agent's input. No new user message is added to the history.\n *\n * Throws if the message at `index` is not 'assistant' role, or if the\n * agent is currently loading another response.\n */\n regenerate: (assistantMessageIndex: number) => Promise<void>;\n\n /** Progress updates for currently executing tools. */\n toolProgress: Signal<ToolProgress[]>;\n\n /** Pending server-side runs created via `multitaskStrategy: 'enqueue'`. */\n queue: Signal<AgentQueue>;\n\n /** Filtered list of subagents with status 'running'. */\n activeSubagents: Signal<SubagentStreamRef[]>;\n\n /** Get a subagent stream by the tool call ID that spawned it. */\n getSubagent: (toolCallId: string) => SubagentStreamRef | undefined;\n\n /** Get subagent streams by their configured subagent type/name. */\n getSubagentsByType: (type: string) => SubagentStreamRef[];\n\n /** Get subagent streams spawned by the tool calls on a specific AI message. */\n getSubagentsByMessage: (msg: CoreAIMessage) => SubagentStreamRef[];\n\n /** Raw custom events stream (signal of array). The runtime-neutral\n * `events$` Observable is derived from this. */\n customEvents: Signal<CustomStreamEvent[]>;\n\n /** Current branch identifier for time-travel navigation. */\n branch: Signal<string>;\n\n /** Set the active branch for time-travel navigation. */\n setBranch: (branch: string) => void;\n\n /** True while a thread switch is loading state from the server. */\n isThreadLoading: Signal<boolean>;\n\n /** Switch to a different thread, resetting derived state. */\n switchThread: (threadId: string | null) => void;\n\n /** Join an already-running stream by run ID. */\n joinStream: (runId: string, lastEventId?: string) => Promise<void>;\n\n /** Get metadata for a specific message by index. */\n getMessagesMetadata: (msg: BaseMessage, idx?: number) => MessageMetadata<Record<string, unknown>> | undefined;\n\n /** Get tool call results associated with an AI message (LangGraph types). */\n getToolCalls: (msg: CoreAIMessage) => ToolCallWithResult[];\n\n /**\n * Lifecycle signals for observability/telemetry. Eight read-only signals\n * capture key transitions (first stream chunk, first interrupt, tool\n * call start/complete, thread create/persist, errors). All reset on\n * `switchThread()`. See {@link AgentLifecycle}.\n */\n lifecycle: AgentLifecycle;\n}\n\n// ── Internal: StreamSubjects ─────────────────────────────────────────────────\n// Not exported from public-api.ts\n\nexport interface StreamSubjects<T, ResolvedBag extends BagTemplate = BagTemplate> {\n status$: BehaviorSubject<ResourceStatus>;\n values$: BehaviorSubject<T>;\n messages$: BehaviorSubject<BaseMessage[]>;\n error$: BehaviorSubject<unknown>;\n interrupt$: BehaviorSubject<Interrupt<ResolvedBag['InterruptType']> | undefined>;\n interrupts$: BehaviorSubject<Interrupt<ResolvedBag['InterruptType']>[]>;\n branch$: BehaviorSubject<string>;\n history$: BehaviorSubject<ThreadState<T>[]>;\n isThreadLoading$: BehaviorSubject<boolean>;\n toolProgress$: BehaviorSubject<ToolProgress[]>;\n toolCalls$: BehaviorSubject<ToolCallWithResult[]>;\n messageMetadata$: BehaviorSubject<Map<string, MessageMetadata<Record<string, unknown>>>>;\n subagents$: BehaviorSubject<Map<string, SubagentStreamRef>>;\n queue$: BehaviorSubject<AgentQueue>;\n custom$: BehaviorSubject<CustomStreamEvent[]>;\n}\n","// SPDX-License-Identifier: MIT\nimport { Client } from '@langchain/langgraph-sdk';\nimport type { LangGraphClientOptions } from '../agent.types';\n\n/**\n * Construct a LangGraph SDK Client that accepts both absolute URLs\n * (`http://localhost:2024`) and relative `/api`-style paths that get\n * proxied by middleware in production. The SDK itself rejects\n * relative URLs, so this helper rewrites them against\n * `window.location.origin` when running in the browser.\n *\n * Single source of truth for the absolute-URL rewrite — the streaming\n * transport (`fetch-stream.transport.ts`) and the threads adapter\n * (`LangGraphThreadsAdapter`) both go through here.\n *\n * `clientOptions.maxRetries` maps to the SDK's `callerOptions.maxRetries`,\n * which governs how many times a failed request (including the initial\n * stream connect) is retried with exponential backoff before the error\n * surfaces. Omitted → the SDK default (currently 4). Apps under test set\n * `0` so a forced connection failure surfaces immediately instead of after\n * the full backoff window.\n *\n * @example\n * ```ts\n * const client = createLangGraphClient(environment.langGraphApiUrl);\n * const threads = await client.threads.search({ limit: 50 });\n * ```\n */\nexport function createLangGraphClient(\n apiUrl: string,\n clientOptions?: LangGraphClientOptions,\n): Client {\n return new Client({\n apiUrl: toAbsoluteApiUrl(apiUrl),\n ...(clientOptions?.maxRetries !== undefined\n ? { callerOptions: { maxRetries: clientOptions.maxRetries } }\n : {}),\n });\n}\n\n/** Exported separately so non-Client callers (e.g. raw fetch) can\n * share the same normalization logic. */\nexport function toAbsoluteApiUrl(apiUrl: string): string {\n if (apiUrl.startsWith('http://') || apiUrl.startsWith('https://')) return apiUrl;\n return typeof window !== 'undefined' ? `${window.location.origin}${apiUrl}` : apiUrl;\n}\n","// SPDX-License-Identifier: MIT\nimport type { Client, StreamMode, ThreadState } from '@langchain/langgraph-sdk';\nimport type { AgentQueueEntry, AgentTransport, LangGraphClientOptions, LangGraphSubmitOptions, StreamEvent } from '../agent.types';\nimport { createLangGraphClient } from '../client/create-langgraph-client';\n\n/**\n * Production transport that connects to a LangGraph Platform API via HTTP and SSE.\n *\n * Creates threads automatically if no threadId is provided, and streams events\n * using the LangGraph SDK client.\n *\n * @example\n * ```typescript\n * const transport = new FetchStreamTransport(\n * 'http://localhost:2024',\n * (id) => console.log('New thread:', id),\n * );\n * ```\n */\nexport class FetchStreamTransport implements AgentTransport {\n private client: Client;\n private onThreadId?: (id: string) => void;\n\n /**\n * @param apiUrl - Base URL of the LangGraph Platform API\n * @param onThreadId - Optional callback invoked when a new thread is created\n * @param clientOptions - Optional SDK client tuning (e.g. `maxRetries`)\n */\n constructor(apiUrl: string, onThreadId?: (id: string) => void, clientOptions?: LangGraphClientOptions) {\n // createLangGraphClient handles the absolute-URL normalization\n // required by the SDK when `apiUrl` is a relative `/api`-style\n // path proxied by middleware in production.\n this.client = createLangGraphClient(apiUrl, clientOptions);\n this.onThreadId = onThreadId;\n }\n\n /** Open a streaming connection, creating a thread if needed. */\n async *stream(\n assistantId: string,\n threadId: string | null,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): AsyncIterable<StreamEvent> {\n let thread = threadId;\n if (!thread) {\n const t = await this.client.threads.create();\n thread = t.thread_id;\n this.onThreadId?.(thread);\n }\n\n const run = this.client.runs.stream(\n thread,\n assistantId,\n buildRunPayload(payload, signal, options),\n );\n\n for await (const event of run) {\n yield normalizeSdkEvent(event.event as StreamEvent['type'], event.data);\n }\n }\n\n /** Join an already-started run without creating a new thread. */\n async *joinStream(\n threadId: string,\n runId: string,\n lastEventId: string | undefined,\n signal: AbortSignal,\n ): AsyncIterable<StreamEvent> {\n // SDK joinStream: joins an already-started run without creating a new one.\n const run = this.client.runs.joinStream(threadId, runId, {\n signal,\n ...(lastEventId !== undefined ? { lastEventId } : {}),\n });\n\n for await (const event of run) {\n yield normalizeSdkEvent(event.event as StreamEvent['type'], event.data);\n }\n }\n\n /** Create a pending server-side run using LangGraph's enqueue strategy. */\n async createQueuedRun(\n assistantId: string,\n threadId: string,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): Promise<AgentQueueEntry> {\n const run = await this.client.runs.create(threadId, assistantId, {\n ...buildRunPayload(payload, signal, options),\n multitaskStrategy: 'enqueue',\n });\n\n return {\n id: run.run_id,\n threadId: run.thread_id ?? threadId,\n values: payload,\n options: { multitaskStrategy: 'enqueue', signal },\n createdAt: run.created_at ? new Date(run.created_at) : new Date(),\n };\n }\n\n /** Cancel a server-side run. */\n async cancelRun(threadId: string, runId: string, signal: AbortSignal): Promise<void> {\n await this.client.runs.cancel(threadId, runId, false, 'interrupt', { signal });\n }\n\n /** Load persisted checkpoint history for a thread. */\n async getHistory(threadId: string, signal: AbortSignal): Promise<ThreadState[]> {\n return this.client.threads.getHistory(threadId, { signal });\n }\n\n /** Update server-side thread state, e.g. to remove messages for regenerate rollback. */\n async updateState(\n threadId: string,\n values: Record<string, unknown>,\n _signal: AbortSignal,\n options?: { asNode?: string },\n ): Promise<void> {\n const body: { values: Record<string, unknown>; asNode?: string } = { values };\n if (options?.asNode !== undefined) {\n body.asNode = options.asNode;\n }\n await this.client.threads.updateState(threadId, body);\n }\n}\n\nfunction buildRunPayload(\n input: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n): {\n input: Record<string, unknown> | null;\n streamMode: StreamMode[];\n streamSubgraphs: boolean;\n signal: AbortSignal;\n} & Omit<LangGraphSubmitOptions, 'signal' | 'resume' | 'checkpoint' | 'streamMode' | 'streamSubgraphs'> {\n const runOptions = { ...(options ?? {}) };\n const hasCheckpoint = Object.prototype.hasOwnProperty.call(runOptions, 'checkpoint');\n const checkpoint = runOptions.checkpoint;\n const streamMode = runOptions.streamMode;\n const streamSubgraphs = runOptions.streamSubgraphs;\n delete runOptions.signal;\n delete runOptions.resume;\n delete runOptions.checkpoint;\n delete runOptions.streamMode;\n delete runOptions.streamSubgraphs;\n\n return {\n ...runOptions,\n ...(hasCheckpoint ? { checkpoint } : {}),\n input: input as Record<string, unknown> | null,\n streamMode: streamMode ?? defaultStreamMode(),\n streamSubgraphs: streamSubgraphs ?? true,\n signal,\n };\n}\n\nfunction defaultStreamMode(): StreamMode[] {\n // 'tools' is intentionally omitted: not supported by langgraph_api < 0.9.x\n // Servers reject the entire request with HTTP 422 if any stream_mode in\n // the array is unknown to them. Tool-call data is still derivable from\n // the messages stream.\n return ['values', 'messages-tuple', 'updates', 'custom'];\n}\n\nfunction normalizeSdkEvent(type: StreamEvent['type'], data: unknown): StreamEvent {\n const namespace = extractNamespace(type);\n const baseType = getBaseEventType(type);\n\n if (baseType === 'messages' && Array.isArray(data) && data.length === 2 && isRecord(data[1])) {\n return { type, ...(namespace ? { namespace } : {}), messages: [data[0]], messageMetadata: data[1], data };\n }\n\n if (isMessagesEvent(type) && Array.isArray(data)) {\n return { type, ...(namespace ? { namespace } : {}), messages: data, data };\n }\n\n if (isRecord(data)) {\n return { type, ...(namespace ? { namespace } : {}), ...data, data };\n }\n\n return { type, ...(namespace ? { namespace } : {}), data };\n}\n\nfunction isMessagesEvent(type: StreamEvent['type']): boolean {\n const baseType = getBaseEventType(type);\n return baseType === 'messages' || baseType.startsWith('messages/');\n}\n\nfunction getBaseEventType(type: StreamEvent['type']): string {\n return String(type).split('|')[0];\n}\n\nfunction extractNamespace(type: StreamEvent['type']): string[] | undefined {\n const parts = String(type).split('|');\n return parts.length > 1 ? parts.slice(1) : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","// SPDX-License-Identifier: MIT\nimport type { BaseMessage } from '@langchain/core/messages';\nimport {\n completeDelivery,\n staticDelivery,\n streamingDelivery,\n type MessageDelivery,\n} from '@threadplane/chat';\n\nexport interface TrackedToolCall {\n id?: string;\n name: string;\n args: Record<string, unknown> | string;\n}\n\nexport interface TrackedSubagent {\n id: string;\n generation: string;\n status: 'pending' | 'running' | 'complete' | 'error';\n toolCall: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n };\n values: Record<string, unknown>;\n messages: BaseMessage[];\n}\n\nexport interface SubagentTrackerOptions {\n subagentToolNames?: string[];\n onSubagentChange?: () => void;\n}\n\nconst DEFAULT_SUBAGENT_TOOL_NAMES = ['task'];\nlet subagentGenerationSequence = 0;\n\nfunction createSubagentGeneration(): string {\n subagentGenerationSequence += 1;\n return `subagent-${subagentGenerationSequence}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Lightweight Angular adapter for LangGraph subagent stream state.\n *\n * This intentionally mirrors only the SDK behavior this package exposes. Using\n * the SDK UI barrel at runtime pulls StreamManager/client utilities into every\n * Angular bundle, which breaks cockpit production budgets.\n */\nexport class SubagentTracker {\n private readonly subagentToolNames: Set<string>;\n private readonly onSubagentChange?: () => void;\n private readonly subagents = new Map<string, TrackedSubagent>();\n private readonly namespaceToToolCallId = new Map<string, string>();\n private readonly pendingMatches = new Map<string, string>();\n\n constructor(options: SubagentTrackerOptions = {}) {\n this.subagentToolNames = new Set(options.subagentToolNames ?? DEFAULT_SUBAGENT_TOOL_NAMES);\n this.onSubagentChange = options.onSubagentChange;\n }\n\n clear(): void {\n this.subagents.clear();\n this.namespaceToToolCallId.clear();\n this.pendingMatches.clear();\n this.onSubagentChange?.();\n }\n\n getSubagents(): Map<string, TrackedSubagent> {\n const visible = new Map<string, TrackedSubagent>();\n for (const [id, subagent] of this.subagents) {\n if (subagent.status !== 'pending') {\n visible.set(id, subagent);\n }\n }\n return visible;\n }\n\n registerFromToolCalls(toolCalls: TrackedToolCall[], aiMessageId?: string | null): void {\n let changed = false;\n for (const toolCall of toolCalls) {\n if (!this.subagentToolNames.has(toolCall.name)) continue;\n\n const id = toolCall.id;\n if (!id) continue;\n\n const args = parseToolCallArgs(toolCall.args);\n if (!isValidSubagentType(args['subagent_type'])) continue;\n\n const existing = this.subagents.get(id);\n this.subagents.set(id, {\n id,\n generation: existing?.generation ?? createSubagentGeneration(),\n status: existing?.status ?? 'pending',\n toolCall: {\n id,\n name: toolCall.name,\n args: {\n ...args,\n ...(aiMessageId ? { _aiMessageId: aiMessageId } : {}),\n },\n },\n values: existing?.values ?? {},\n messages: existing?.messages ?? [],\n });\n changed = true;\n }\n\n if (changed) {\n this.retryPendingMatches();\n this.onSubagentChange?.();\n }\n }\n\n reconstructFromMessages(messages: BaseMessage[], options: { skipIfPopulated?: boolean } = {}): void {\n if (options.skipIfPopulated && this.subagents.size > 0) return;\n\n for (const message of messages) {\n const raw = message as unknown as Record<string, unknown>;\n if (isAiMessageWithToolCalls(raw)) {\n this.registerFromToolCalls(\n raw['tool_calls'] as TrackedToolCall[],\n typeof raw['id'] === 'string' ? raw['id'] : null,\n );\n } else if (isToolMessage(raw)) {\n this.processToolMessage(raw['tool_call_id'], raw['content'], raw['status'] === 'error' ? 'error' : 'success');\n }\n }\n }\n\n matchSubgraphToSubagent(namespaceId: string, description: string): string | undefined {\n if (this.namespaceToToolCallId.has(namespaceId)) {\n return this.namespaceToToolCallId.get(namespaceId);\n }\n\n const mapped = new Set(this.namespaceToToolCallId.values());\n const establish = (toolCallId: string): string => {\n this.namespaceToToolCallId.set(namespaceId, toolCallId);\n const subagent = this.subagents.get(toolCallId);\n if (subagent) {\n this.subagents.set(toolCallId, {\n ...subagent,\n status: subagent.status === 'complete' || subagent.status === 'error' ? subagent.status : 'running',\n });\n }\n this.onSubagentChange?.();\n return toolCallId;\n };\n\n for (const [toolCallId, subagent] of this.subagents) {\n if (mapped.has(toolCallId)) continue;\n if (subagent.toolCall.args['description'] === description) {\n return establish(toolCallId);\n }\n }\n\n for (const [toolCallId, subagent] of this.subagents) {\n if (mapped.has(toolCallId)) continue;\n const subagentDescription = subagent.toolCall.args['description'];\n if (typeof subagentDescription !== 'string' || !subagentDescription) continue;\n if (description.includes(subagentDescription) || subagentDescription.includes(description)) {\n return establish(toolCallId);\n }\n }\n\n for (const [toolCallId, subagent] of this.subagents) {\n if (!mapped.has(toolCallId) && (subagent.status === 'pending' || subagent.status === 'running')) {\n return establish(toolCallId);\n }\n }\n\n if (description) {\n this.pendingMatches.set(namespaceId, description);\n }\n return undefined;\n }\n\n markRunningFromNamespace(namespaceId: string, namespace?: string[]): void {\n const toolCallId = this.resolveToolCallId(namespaceId);\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return;\n\n if (!this.namespaceToToolCallId.has(namespaceId)) {\n this.namespaceToToolCallId.set(namespaceId, toolCallId);\n }\n this.subagents.set(toolCallId, {\n ...subagent,\n status: subagent.status === 'complete' || subagent.status === 'error' ? subagent.status : 'running',\n values: {\n ...subagent.values,\n ...(namespace ? { namespace } : {}),\n },\n });\n this.onSubagentChange?.();\n }\n\n updateSubagentValues(namespaceId: string, values: Record<string, unknown>): void {\n const toolCallId = this.resolveToolCallId(namespaceId);\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return;\n\n this.subagents.set(toolCallId, {\n ...subagent,\n status: subagent.status === 'complete' || subagent.status === 'error' ? subagent.status : 'running',\n values,\n });\n this.onSubagentChange?.();\n }\n\n addMessageToSubagent(namespaceId: string, message: BaseMessage): void {\n const toolCallId = this.resolveToolCallId(namespaceId);\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return;\n\n this.subagents.set(toolCallId, {\n ...subagent,\n status: subagent.status === 'complete' || subagent.status === 'error' ? subagent.status : 'running',\n messages: mergeMessages(subagent.messages, [message]),\n });\n this.onSubagentChange?.();\n }\n\n processToolMessage(toolCallId: string, content: unknown, status: 'success' | 'error'): void {\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return;\n\n this.subagents.set(toolCallId, {\n ...subagent,\n status: status === 'error' ? 'error' : 'complete',\n values: {\n ...subagent.values,\n result: content,\n },\n });\n this.onSubagentChange?.();\n }\n\n getMessageDelivery(toolCallId: string, message: BaseMessage): MessageDelivery {\n const id = getMessageId(message) ?? toolCallId;\n const raw = message as unknown as Record<string, unknown>;\n const type = typeof message._getType === 'function' ? message._getType() : raw['type'];\n if (type !== 'ai' && type !== 'assistant' && type !== 'AIMessage' && type !== 'AIMessageChunk') {\n return staticDelivery(id);\n }\n\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return staticDelivery(id);\n if (subagent.status === 'error') return completeDelivery(subagent.generation, 'error');\n if (subagent.status === 'complete') return completeDelivery(subagent.generation, 'success');\n return streamingDelivery(subagent.generation);\n }\n\n private retryPendingMatches(): void {\n for (const [namespaceId, description] of this.pendingMatches) {\n if (this.matchSubgraphToSubagent(namespaceId, description)) {\n this.pendingMatches.delete(namespaceId);\n }\n }\n }\n\n private resolveToolCallId(namespaceId: string): string {\n return this.namespaceToToolCallId.get(namespaceId) ?? namespaceId;\n }\n}\n\nexport function isSubagentNamespace(namespace: string[] | string | undefined): boolean {\n if (!namespace) return false;\n if (typeof namespace === 'string') return namespace.includes('tools:');\n return namespace.some(segment => segment.startsWith('tools:'));\n}\n\nexport function extractToolCallIdFromNamespace(namespace: string[] | undefined): string | undefined {\n if (!namespace) return undefined;\n for (const segment of namespace) {\n if (segment.startsWith('tools:')) return segment.slice(6);\n }\n return undefined;\n}\n\nfunction parseToolCallArgs(args: Record<string, unknown> | string): Record<string, unknown> {\n if (typeof args !== 'string') return args;\n try {\n const parsed = JSON.parse(args) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nfunction isValidSubagentType(value: unknown): value is string {\n return typeof value === 'string'\n && value.length >= 3\n && value.length <= 50\n && /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(value);\n}\n\nfunction isAiMessageWithToolCalls(value: Record<string, unknown>): boolean {\n return (value['type'] === 'ai' || value['type'] === 'assistant')\n && Array.isArray(value['tool_calls']);\n}\n\nfunction isToolMessage(value: Record<string, unknown>): value is Record<string, unknown> & { tool_call_id: string } {\n return value['type'] === 'tool' && typeof value['tool_call_id'] === 'string';\n}\n\nfunction mergeMessages(existing: BaseMessage[], incoming: BaseMessage[]): BaseMessage[] {\n const merged = [...existing];\n for (const msg of incoming) {\n const id = getMessageId(msg);\n const idx = id ? merged.findIndex(m => getMessageId(m) === id) : -1;\n if (idx >= 0) {\n merged[idx] = msg;\n } else {\n merged.push(msg);\n }\n }\n return merged;\n}\n\nfunction getMessageId(message: BaseMessage): string | undefined {\n return (message as unknown as { id?: string }).id;\n}\n","// SPDX-License-Identifier: MIT\nimport { signal, type Signal } from '@angular/core';\nimport { Observable, takeUntil } from 'rxjs';\nimport {\n ResourceStatus,\n AgentOptions,\n StreamSubjects,\n StreamEvent,\n AgentTransport,\n SubagentStreamRef,\n AgentQueue,\n AgentQueueEntry,\n LangGraphSubmitOptions,\n} from '../agent.types';\nimport { FetchStreamTransport } from '../transport/fetch-stream.transport';\nimport { BagTemplate } from '@langchain/langgraph-sdk';\nimport { getToolCallsWithResults } from '@langchain/langgraph-sdk/utils';\nimport type {\n AgentRuntimeTelemetryEvent,\n AgentRuntimeTelemetryProperties,\n AgentRuntimeTelemetrySink,\n} from '@threadplane/chat';\nimport {\n AgentError,\n AGENT_ERROR_MESSAGES,\n completeDelivery,\n isAbortError,\n staticDelivery,\n streamingDelivery,\n toAgentError,\n type CompleteOutcome,\n type MessageDelivery,\n} from '@threadplane/chat';\nimport {\n SubagentTracker,\n TrackedSubagent,\n extractToolCallIdFromNamespace,\n isSubagentNamespace,\n} from './subagent-tracker';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { Interrupt, Message as LangGraphMessage, ThreadState, ToolCallWithResult, ToolProgress } from '@langchain/langgraph-sdk';\n\n// Local copy of the trace harness — same gating as @threadplane/chat's trace.ts.\n// Duplicated here to avoid an @threadplane/chat dep on the langgraph internals path.\nfunction isLgTraceEnabled(): boolean {\n if (typeof globalThis === 'undefined') return false;\n const win = (globalThis as { window?: { __threadplaneChatTrace?: boolean; localStorage?: Storage } }).window;\n if (!win) return false;\n if (win.__threadplaneChatTrace === true) return true;\n try { return win.localStorage?.getItem('THREADPLANE_CHAT_STREAM_TRACE') === '1'; } catch { return false; }\n}\nfunction lgTrace(...args: unknown[]): void {\n if (isLgTraceEnabled()) {\n // eslint-disable-next-line no-console\n console.debug('[tplane-chat-stream]', ...args);\n }\n}\n\nfunction captureAgentRuntimeTelemetry(\n sink: AgentRuntimeTelemetrySink | false | undefined,\n event: AgentRuntimeTelemetryEvent,\n properties: AgentRuntimeTelemetryProperties,\n): void {\n if (!sink) return;\n try {\n void Promise.resolve(sink({ event, properties })).catch(() => undefined);\n } catch {\n // Keep telemetry side effects isolated from stream control flow.\n }\n}\n\nfunction agentRuntimeTelemetryErrorClass(error: unknown): string {\n if (error instanceof Error) return error.name || error.constructor.name || 'Error';\n if (\n error\n && typeof error === 'object'\n && 'name' in error\n && typeof error.name === 'string'\n && error.name.length > 0\n ) {\n return error.name;\n }\n return 'UnknownError';\n}\n\nexport interface StreamManagerBridgeOptions<T, ResolvedBag extends BagTemplate = BagTemplate> {\n options: AgentOptions<T, ResolvedBag> & { apiUrl: string };\n subjects: StreamSubjects<T, ResolvedBag>;\n threadId$: Observable<string | null>;\n destroy$: Observable<void>;\n}\n\ntype ResubmitOutcome = CompleteOutcome | 'not-started';\n\nexport interface StreamManagerBridge {\n submit: (values: unknown, opts?: LangGraphSubmitOptions) => Promise<CompleteOutcome>;\n stop: () => Promise<void>;\n switchThread: (id: string | null) => void;\n joinStream: (runId: string, lastEventId?: string) => Promise<void>;\n resubmitLast: () => Promise<ResubmitOutcome>;\n getReasoningDurationMs:(id: string) => number | undefined;\n getMessageDelivery: (id: string) => MessageDelivery;\n getSubagentMessageDelivery: (toolCallId: string, message: BaseMessage) => MessageDelivery;\n deliveryRevision: Signal<number>;\n /** Update server-side thread state (e.g. RemoveMessage for regenerate rollback). */\n updateState: (values: Record<string, unknown>, opts?: { asNode?: string }) => Promise<void>;\n /** The current thread ID tracked by the bridge (null if not yet known). */\n readonly currentThreadId: string | null;\n}\n\nexport function createStreamManagerBridge<T, ResolvedBag extends BagTemplate = BagTemplate>(\n { options, subjects, threadId$, destroy$ }: StreamManagerBridgeOptions<T, ResolvedBag>\n): StreamManagerBridge {\n // Intercept onThreadId to update currentThreadId when the transport\n // auto-creates a thread. Without this, each submit() creates a new thread\n // because currentThreadId stays null.\n const userOnThreadId = options.onThreadId;\n const wrappedOnThreadId = (id: string) => {\n currentThreadId = id;\n userOnThreadId?.(id);\n };\n const transport: AgentTransport =\n options.transport ?? new FetchStreamTransport(options.apiUrl, wrappedOnThreadId, options.clientOptions);\n\n let currentThreadId: string | null = null;\n let lastPayload: unknown = null;\n let lastOptions: LangGraphSubmitOptions | undefined;\n let abortController: AbortController | null = null;\n let historyAbortController: AbortController | null = null;\n let hasSeenThreadId = false;\n const userAbortedControllers = new WeakSet<AbortController>();\n const toolProgressMap = new Map<string, ToolProgress>();\n // Message ids whose content is known-final (installed by a canonical\n // replacement). Late streamed deltas for these ids are stale stragglers and\n // are ignored — decided by identity, never by comparing text to text.\n const canonicalMessageIds = new Set<string>();\n const queuedRuns: AgentQueueEntry[] = [];\n let queueDrainEpoch = 0;\n let activeQueueDrainEpoch: number | null = null;\n let attemptSequence = 0;\n const messageDeliveries = new Map<string, MessageDelivery>();\n const deliveryRevision = signal(0);\n type DeliveryAttempt = {\n generation: string;\n messageIds: Set<string>;\n finalizedMessageIds: Set<string>;\n baselineMessageIds: Set<string>;\n eligibleBaselineAssistantId?: string;\n currentAssistantMessageId?: string;\n sawAssistantChunk: boolean;\n currentStepHasTerminalEvidence: boolean;\n awaitingFinalSync: boolean;\n terminalOutcome?: CompleteOutcome;\n };\n let activeAttempt: DeliveryAttempt | null = null;\n const subagentManager = new SubagentTracker({\n subagentToolNames: options.subagentToolNames,\n onSubagentChange: publishSubagents,\n });\n const telemetryProperties = { transport: 'langgraph' as const, surface: 'agent' };\n captureAgentRuntimeTelemetry(\n options.telemetry,\n 'tplane:runtime_instance_created',\n telemetryProperties,\n );\n\n function captureRuntimeRequestTelemetry(requestType: string): void {\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:runtime_request_created', {\n ...telemetryProperties,\n requestType,\n });\n }\n\n /**\n * Tracks reasoning timing per message id. Keys are message ids; values\n * record when reasoning content first arrived and when response text\n * first appeared (or the canonical message arrived). Cleared on\n * resetThreadState() and on bridge teardown.\n */\n const reasoningTimingMap = new Map<string, { startedAt: number; endedAt?: number }>();\n\n function notifyDeliveryChange(): void {\n deliveryRevision.update(revision => revision + 1);\n }\n\n function beginAttempt(allowBaselineTail = false): DeliveryAttempt {\n if (activeAttempt?.awaitingFinalSync) {\n historyAbortController?.abort();\n }\n if (activeAttempt && !activeAttempt.terminalOutcome) {\n finalizeAttempt(activeAttempt, 'interrupted');\n }\n const baselineMessageIds = new Set<string>();\n for (const message of subjects.messages$.value) {\n const id = (message as unknown as Record<string, unknown>)['id'];\n if (typeof id === 'string') baselineMessageIds.add(id);\n }\n attemptSequence += 1;\n const attempt: DeliveryAttempt = {\n generation: `attempt-${attemptSequence}-${Math.random().toString(36).slice(2, 10)}`,\n messageIds: new Set(),\n finalizedMessageIds: new Set(),\n baselineMessageIds,\n eligibleBaselineAssistantId: allowBaselineTail\n ? getTailAssistantMessageId(subjects.messages$.value)\n : undefined,\n sawAssistantChunk: false,\n currentStepHasTerminalEvidence: false,\n awaitingFinalSync: false,\n };\n activeAttempt = attempt;\n return attempt;\n }\n\n function isCurrentExecution(controller: AbortController, attempt: DeliveryAttempt): boolean {\n return abortController === controller && activeAttempt === attempt;\n }\n\n function setDelivery(id: string, delivery: MessageDelivery): void {\n const previous = messageDeliveries.get(id);\n if (\n previous?.generation === delivery.generation\n && previous.phase === delivery.phase\n && (previous.phase !== 'complete' || delivery.phase !== 'complete' || previous.outcome === delivery.outcome)\n ) {\n return;\n }\n messageDeliveries.set(id, delivery);\n notifyDeliveryChange();\n }\n\n function finalizeMessage(attempt: DeliveryAttempt, id: string, outcome: CompleteOutcome): void {\n setDelivery(id, completeDelivery(attempt.generation, outcome));\n attempt.finalizedMessageIds.add(id);\n }\n\n function finalizeAttempt(attempt: DeliveryAttempt, outcome: CompleteOutcome): void {\n if (attempt.terminalOutcome) return;\n attempt.terminalOutcome = outcome;\n for (const id of attempt.messageIds) {\n if (attempt.finalizedMessageIds.has(id)) continue;\n finalizeMessage(attempt, id, outcome);\n }\n }\n\n function finishOutcome(attempt: DeliveryAttempt): CompleteOutcome {\n return attempt.terminalOutcome\n ?? (attempt.currentStepHasTerminalEvidence || !attempt.sawAssistantChunk ? 'success' : 'interrupted');\n }\n\n async function finalizeClosedAttempt(\n controller: AbortController,\n attempt: DeliveryAttempt,\n ): Promise<CompleteOutcome | null> {\n if (attempt.terminalOutcome) return attempt.terminalOutcome;\n\n const outcome = finishOutcome(attempt);\n attempt.awaitingFinalSync = true;\n try {\n await refreshHistory(\n true,\n () => isCurrentExecution(controller, attempt) && !attempt.terminalOutcome,\n );\n } finally {\n attempt.awaitingFinalSync = false;\n }\n\n if (!isCurrentExecution(controller, attempt)) return null;\n if (!attempt.terminalOutcome) finalizeAttempt(attempt, outcome);\n return attempt.terminalOutcome ?? outcome;\n }\n\n function trackAssistantMessages(messages: BaseMessage[]): void {\n const attempt = activeAttempt;\n if (!attempt || attempt.terminalOutcome) return;\n\n const assistantMessages = messages.filter(message => {\n const raw = message as unknown as Record<string, unknown>;\n const type = normalizeMessageType(\n typeof message._getType === 'function' ? message._getType() : raw['type'] as string | undefined,\n );\n const id = typeof raw['id'] === 'string' ? raw['id'] : undefined;\n return type === 'ai' && id && !attempt.finalizedMessageIds.has(id);\n });\n const newAssistantMessages = assistantMessages.filter(message => {\n const id = (message as unknown as Record<string, unknown>)['id'];\n return typeof id === 'string' && !attempt.baselineMessageIds.has(id);\n });\n const currentStepMessages = newAssistantMessages.length > 0\n ? newAssistantMessages\n : assistantMessages.filter(message =>\n (message as unknown as Record<string, unknown>)['id'] === attempt.eligibleBaselineAssistantId\n );\n\n for (const message of currentStepMessages) {\n const id = (message as unknown as Record<string, unknown>)['id'] as string;\n\n if (attempt.currentAssistantMessageId && attempt.currentAssistantMessageId !== id) {\n finalizeMessage(attempt, attempt.currentAssistantMessageId, 'success');\n attempt.currentStepHasTerminalEvidence = false;\n }\n attempt.currentAssistantMessageId = id;\n attempt.messageIds.add(id);\n attempt.sawAssistantChunk = true;\n setDelivery(id, streamingDelivery(attempt.generation));\n }\n }\n\n function invalidateQueueDrain(): void {\n queueDrainEpoch += 1;\n activeQueueDrainEpoch = null;\n }\n\n function markNormalTerminal(event: StreamEvent): void {\n const attempt = activeAttempt;\n if (\n !attempt\n || attempt.terminalOutcome\n || !attempt.sawAssistantChunk\n || (getEventNamespace(event)?.length ?? 0) > 0\n ) return;\n const baseType = getBaseEventType(event.type);\n // These are the canonical state/snapshot signals available in the current\n // transport contract. Iterator close alone is deliberately not terminal\n // evidence: after assistant chunks, a close without one of these markers\n // is classified as interrupted.\n if (baseType === 'values' || baseType === 'messages/complete' || baseType === 'checkpoints') {\n attempt.currentStepHasTerminalEvidence = true;\n }\n }\n\n function resetThreadState(): void {\n historyAbortController?.abort();\n subjects.values$.next({} as T);\n subjects.messages$.next([]);\n subjects.history$.next([]);\n subjects.interrupt$.next(undefined);\n subjects.interrupts$.next([]);\n subjects.toolProgress$.next([]);\n subjects.toolCalls$.next([]);\n subjects.messageMetadata$.next(new Map());\n subjects.subagents$.next(new Map());\n void cancelQueueEntries(takeQueuedRuns()).catch(err => subjects.error$.next(toAgentError(err)));\n publishQueue();\n subjects.custom$.next([]);\n subjects.isThreadLoading$.next(false);\n toolProgressMap.clear();\n subagentManager.clear();\n reasoningTimingMap.clear();\n canonicalMessageIds.clear();\n if (activeAttempt && !activeAttempt.terminalOutcome) {\n finalizeAttempt(activeAttempt, 'interrupted');\n }\n messageDeliveries.clear();\n activeAttempt = null;\n notifyDeliveryChange();\n }\n\n function setThreadId(id: string | null, resetState: boolean): void {\n if (resetState) {\n invalidateQueueDrain();\n abortController?.abort();\n lastPayload = null;\n lastOptions = undefined;\n }\n currentThreadId = id;\n if (resetState) {\n resetThreadState();\n }\n void refreshHistory();\n }\n\n // Track threadId changes\n threadId$.pipe(takeUntil(destroy$)).subscribe(id => {\n const shouldReset = hasSeenThreadId && currentThreadId !== id;\n hasSeenThreadId = true;\n setThreadId(id, shouldReset);\n });\n\n destroy$.subscribe(() => {\n invalidateQueueDrain();\n abortController?.abort();\n historyAbortController?.abort();\n reasoningTimingMap.clear();\n if (activeAttempt && !activeAttempt.terminalOutcome) {\n finalizeAttempt(activeAttempt, 'interrupted');\n }\n messageDeliveries.clear();\n activeAttempt = null;\n notifyDeliveryChange();\n });\n\n async function refreshHistory(force = false, isRelevant: () => boolean = () => true): Promise<void> {\n const getHistory = transport.getHistory?.bind(transport);\n if (!currentThreadId || !getHistory) return;\n\n historyAbortController?.abort();\n const controller = new AbortController();\n historyAbortController = controller;\n const threadId = currentThreadId;\n subjects.isThreadLoading$.next(true);\n\n try {\n const history = await waitForHistory(getHistory(threadId, controller.signal), controller.signal);\n if (!controller.signal.aborted && currentThreadId === threadId && isRelevant()) {\n subjects.history$.next(history as ThreadState<T>[]);\n\n // Project the latest checkpoint into messages$ + values$:\n // - On first connect (`force=false`): only when messages$ is\n // empty, so optimistic local state isn't clobbered.\n // - At run completion (`force=true`): always — server state is\n // authoritative for node-level mutations (e.g. RemoveMessage\n // or id-match content replacement performed by post-process\n // nodes), and the streaming SDK doesn't always restream those.\n const latest = history[0] as\n | { values?: { messages?: BaseMessage[] } & T }\n | undefined;\n const shouldProject = latest?.values\n && (force || subjects.messages$.value.length === 0);\n if (shouldProject) {\n const restoredMessages = latest.values?.messages ?? [];\n const restoredValues = { ...(latest.values as T) };\n // Strip the `messages` field from values — messages$ is the\n // canonical surface for them; keeping a duplicate in values$\n // would confuse downstream consumers reading both subjects.\n delete (restoredValues as { messages?: unknown }).messages;\n subjects.messages$.next(preserveIds(subjects.messages$.value, restoredMessages));\n subjects.values$.next(restoredValues);\n // Rebuild derived subjects from the new authoritative messages$.\n // Tool-call results displayed by chat-tool-calls come from\n // toolCalls$, which is built from messages$; without this, the\n // panel keeps showing the streamed pre-mutation content.\n syncToolCallsFromMessages();\n }\n\n // Hydrate pending interrupts from the latest checkpoint. When a\n // thread is reloaded mid-pause (paused at an interrupt), the\n // streaming events won't replay — interrupts live on the\n // checkpoint's tasks[i].interrupts and must be projected manually\n // so the interrupt panel re-renders on page reload.\n hydrateInterruptsFromHistory(history as ThreadState<T>[], subjects);\n }\n } catch (err) {\n if (!controller.signal.aborted && isRelevant() && (err as Error)?.name !== 'AbortError') {\n subjects.error$.next(toAgentError(err));\n }\n } finally {\n if (historyAbortController === controller) {\n historyAbortController = null;\n subjects.isThreadLoading$.next(false);\n }\n }\n }\n\n function waitForHistory<R>(history: Promise<R>, signal: AbortSignal): Promise<R> {\n if (signal.aborted) return Promise.reject(createHistoryAbortError());\n\n return new Promise<R>((resolve, reject) => {\n const onAbort = () => {\n cleanup();\n reject(createHistoryAbortError());\n };\n const cleanup = () => signal.removeEventListener('abort', onAbort);\n signal.addEventListener('abort', onAbort, { once: true });\n history.then(\n value => {\n cleanup();\n resolve(value);\n },\n error => {\n cleanup();\n reject(error);\n },\n );\n });\n }\n\n function createHistoryAbortError(): Error {\n const error = new Error('History refresh aborted.');\n error.name = 'AbortError';\n return error;\n }\n\n function publishQueue(): void {\n subjects.queue$.next(createQueueSnapshot());\n }\n\n function createQueueSnapshot(): AgentQueue {\n return {\n entries: [...queuedRuns],\n size: queuedRuns.length,\n cancel: cancelQueuedRun,\n clear: clearQueue,\n };\n }\n\n async function enqueueRun(payload: unknown, opts?: LangGraphSubmitOptions): Promise<void> {\n if (!currentThreadId) {\n throw new Error('Cannot enqueue a run before a LangGraph thread exists.');\n }\n if (!transport.createQueuedRun) {\n throw new Error('The configured LangGraph transport does not support server-side queueing.');\n }\n\n captureRuntimeRequestTelemetry('enqueue');\n const controller = new AbortController();\n const entry = await transport.createQueuedRun(\n options.assistantId,\n currentThreadId,\n payload,\n opts?.signal ?? controller.signal,\n opts,\n );\n queuedRuns.push({\n ...entry,\n values: payload,\n options: { ...opts, multitaskStrategy: 'enqueue' },\n createdAt: entry.createdAt ?? new Date(),\n });\n publishQueue();\n }\n\n async function cancelQueuedRun(id: string): Promise<boolean> {\n const index = queuedRuns.findIndex(entry => entry.id === id);\n if (index === -1) return false;\n\n const [entry] = queuedRuns.splice(index, 1);\n publishQueue();\n if (!entry || !transport.cancelRun) return false;\n await cancelQueueEntries([entry]);\n return true;\n }\n\n async function clearQueue(): Promise<void> {\n const entries = takeQueuedRuns();\n publishQueue();\n await cancelQueueEntries(entries);\n }\n\n function takeQueuedRuns(): AgentQueueEntry[] {\n return queuedRuns.splice(0, queuedRuns.length);\n }\n\n async function cancelQueueEntries(entries: AgentQueueEntry[]): Promise<void> {\n const cancelRun = transport.cancelRun?.bind(transport);\n if (!cancelRun) return;\n await Promise.all(entries.map(entry =>\n cancelRun(entry.threadId, entry.id, new AbortController().signal)\n ));\n }\n\n async function drainQueue(): Promise<void> {\n if (activeQueueDrainEpoch !== null || queuedRuns.length === 0) return;\n queueDrainEpoch += 1;\n const drainEpoch = queueDrainEpoch;\n activeQueueDrainEpoch = drainEpoch;\n try {\n while (queuedRuns.length > 0) {\n if (activeQueueDrainEpoch !== drainEpoch) return;\n const entry = queuedRuns.shift();\n publishQueue();\n if (!entry || !transport.joinStream) continue;\n await joinQueuedRun(entry, drainEpoch);\n }\n } finally {\n if (activeQueueDrainEpoch === drainEpoch) activeQueueDrainEpoch = null;\n }\n }\n\n async function joinQueuedRun(entry: AgentQueueEntry, drainEpoch: number): Promise<void> {\n if (activeQueueDrainEpoch !== drainEpoch) return;\n const controller = new AbortController();\n abortController = controller;\n const attempt = beginAttempt(true);\n const startedAt = Date.now();\n captureRuntimeRequestTelemetry('join_queued');\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);\n subjects.custom$.next([]);\n subjects.toolProgress$.next([]);\n toolProgressMap.clear();\n subjects.status$.next(ResourceStatus.Loading);\n\n try {\n const iter = transport.joinStream\n ? transport.joinStream(entry.threadId, entry.id, undefined, controller.signal)\n : [];\n for await (const event of iter) {\n if (controller.signal.aborted || !isCurrentExecution(controller, attempt)) break;\n processEvent(event);\n }\n if (!isCurrentExecution(controller, attempt)) return;\n const outcome = await finalizeClosedAttempt(controller, attempt);\n if (outcome === null) return;\n if (!controller.signal.aborted) {\n if (outcome !== 'error') {\n subjects.status$.next(ResourceStatus.Resolved);\n }\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n });\n }\n } catch (err) {\n if (!isCurrentExecution(controller, attempt)) return;\n if (attempt.terminalOutcome) return;\n if (isAbortError(err) && userAbortedControllers.has(controller)) {\n finalizeAttempt(attempt, 'aborted');\n subjects.error$.next(undefined);\n subjects.status$.next(ResourceStatus.Idle);\n } else {\n finalizeAttempt(attempt, attempt.sawAssistantChunk ? 'interrupted' : 'error');\n subjects.error$.next(toAgentError(err));\n subjects.status$.next(ResourceStatus.Error);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(err),\n });\n }\n } finally {\n if (abortController === controller) abortController = null;\n }\n }\n\n async function runStream(\n payload: unknown,\n opts?: LangGraphSubmitOptions,\n requestType = 'submit',\n ): Promise<CompleteOutcome> {\n invalidateQueueDrain();\n abortController?.abort();\n const controller = new AbortController();\n abortController = controller;\n const attempt = beginAttempt(\n requestType === 'resubmit' || (isRecord(opts?.command) && 'resume' in opts.command),\n );\n const startedAt = Date.now();\n captureRuntimeRequestTelemetry(requestType);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);\n\n subjects.status$.next(ResourceStatus.Loading);\n subjects.error$.next(undefined);\n subjects.custom$.next([]);\n subjects.toolProgress$.next([]);\n toolProgressMap.clear();\n canonicalMessageIds.clear();\n lastPayload = payload ?? null;\n lastOptions = opts;\n\n // Tracks whether at least one stream event has been processed this run.\n // Used to distinguish a mid-stream network interruption (kind:'interrupted')\n // from a fresh connect failure (falls through to toAgentError classification).\n let streamingStarted = false;\n\n // Optimistically inject human messages so they appear immediately\n // without waiting for the server to echo them back. Assign a stable id\n // when missing — track-by-id in the chat-message-list relies on stable\n // ids across re-emissions, otherwise the optimistic message gets torn\n // down + recreated on every messages$.next() during streaming, which\n // restarts caret/typing animations and causes visible flicker.\n const inputMessages = (payload as Record<string, unknown>)?.['messages'];\n if (Array.isArray(inputMessages) && inputMessages.length > 0) {\n const stamped = (inputMessages as BaseMessage[]).map((m) => {\n const raw = m as unknown as Record<string, unknown>;\n if (typeof raw['id'] === 'string' && raw['id']) return m;\n const id = `optimistic-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n return { ...m, id } as BaseMessage;\n });\n const existing = subjects.messages$.value;\n subjects.messages$.next([...existing, ...stamped]);\n }\n\n try {\n const iter = transport.stream(\n options.assistantId,\n currentThreadId,\n payload,\n opts?.signal ?? controller.signal,\n opts,\n );\n\n for await (const event of iter) {\n if (controller.signal.aborted || !isCurrentExecution(controller, attempt)) break;\n streamingStarted = true;\n processEvent(event);\n }\n\n if (!isCurrentExecution(controller, attempt)) return finishOutcome(attempt);\n const outcome = await finalizeClosedAttempt(controller, attempt);\n if (outcome === null) return finishOutcome(attempt);\n\n if (!controller.signal.aborted) {\n if (outcome !== 'error') {\n subjects.status$.next(ResourceStatus.Resolved);\n }\n await drainQueue();\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n });\n }\n return outcome;\n } catch (err) {\n if (!isCurrentExecution(controller, attempt)) return finishOutcome(attempt);\n if (attempt.terminalOutcome) return attempt.terminalOutcome;\n if (isAbortError(err) && userAbortedControllers.has(controller)) {\n finalizeAttempt(attempt, 'aborted');\n // User explicitly called stop() — treat as graceful idle, not an error.\n subjects.error$.next(undefined);\n subjects.status$.next(ResourceStatus.Idle);\n } else if (isAbortError(err)) {\n finalizeAttempt(attempt, attempt.sawAssistantChunk ? 'interrupted' : 'error');\n // A non-user-requested abort: interrupted if a stream had started, else a\n // connect-phase failure. Never \"aborted\" (that's reserved for user stop).\n const e = streamingStarted\n ? new AgentError({ kind: 'interrupted', message: AGENT_ERROR_MESSAGES.interrupted, retryable: true, cause: err })\n : new AgentError({ kind: 'connection', message: AGENT_ERROR_MESSAGES.connection, retryable: true, cause: err });\n subjects.error$.next(e);\n subjects.status$.next(ResourceStatus.Error);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(err),\n });\n } else {\n finalizeAttempt(attempt, attempt.sawAssistantChunk ? 'interrupted' : 'error');\n subjects.error$.next(toAgentError(err));\n subjects.status$.next(ResourceStatus.Error);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(err),\n });\n }\n return finishOutcome(attempt);\n } finally {\n if (abortController === controller) abortController = null;\n }\n }\n\n function processEvent(event: StreamEvent): void {\n const baseType = getBaseEventType(event.type);\n const namespace = getEventNamespace(event);\n\n if (baseType === 'checkpoints' || baseType === 'messages/complete') {\n markNormalTerminal(event);\n }\n\n if (isMessagesEvent(event.type)) {\n const msgs = normalizeMessages(event);\n if (!msgs) return;\n\n const normalized = options.toMessage\n ? msgs.map(options.toMessage)\n : msgs as BaseMessage[];\n\n if (isSubagentNamespace(namespace)) {\n const namespaceId = namespace ? extractToolCallIdFromNamespace(namespace) : undefined;\n if (namespaceId) {\n for (const msg of normalized) {\n subagentManager.addMessageToSubagent(namespaceId, msg);\n }\n publishSubagents();\n }\n\n if (options.filterSubagentMessages) {\n return;\n }\n }\n\n // Partial and message-tuple events are incremental. Merge them by id\n // so optimistic human messages and earlier tool messages are preserved.\n if (event.type === 'messages/partial' || event.messageMetadata) {\n if (!isTranscriptMessageEvent(event, options.transcriptNodeNames)) {\n storeMessageMetadata(normalized, event);\n syncSubagentsFromMessages(normalized);\n return;\n }\n const mode: MergeMode = event.messageMetadata ? 'delta' : 'snapshot';\n const affectedMessageIds = new Set<string>();\n const merged = mergeMessages(\n subjects.messages$.value,\n normalized,\n reasoningTimingMap,\n mode,\n canonicalMessageIds,\n affectedMessageIds,\n activeAttempt?.currentAssistantMessageId !== undefined\n && activeAttempt.currentStepHasTerminalEvidence !== true,\n );\n subjects.messages$.next(merged);\n if (!isSubagentNamespace(namespace)) {\n trackAssistantMessages(merged.filter(message => {\n const id = (message as unknown as Record<string, unknown>)['id'];\n return typeof id === 'string' && affectedMessageIds.has(id);\n }));\n }\n if (isLgTraceEnabled()) {\n const msgs = subjects.messages$.value;\n const last = msgs[msgs.length - 1];\n lgTrace('bridge.messages-tuple', { id: (last as unknown as Record<string, unknown> | undefined)?.['id'], count: msgs.length });\n }\n } else if (normalized.length === 0) {\n // Defensive: skip empty replacements during streaming. An empty\n // batch shouldn't tear down the entire UI (causes message DOM\n // teardown + streaming renderer reset = visible jank).\n } else {\n // Preserve existing ids by content so the final-id swap doesn't\n // tear down the chat-message DOM (and its streaming-md renderer).\n const affectedMessageIds = new Set<string>();\n const preserved = preserveIds(subjects.messages$.value, normalized, affectedMessageIds);\n subjects.messages$.next(preserved);\n if (!isSubagentNamespace(namespace)) {\n trackAssistantMessages(preserved.filter(message => {\n const id = (message as unknown as Record<string, unknown>)['id'];\n return typeof id === 'string' && affectedMessageIds.has(id);\n }));\n }\n }\n markNormalTerminal(event);\n storeMessageMetadata(normalized, event);\n syncSubagentsFromMessages(normalized);\n syncToolCallsFromMessages();\n return;\n }\n\n // normalizeSdkEvent spreads event data directly into the event object,\n // so the values/updates payload is at event['data'] (the original data object),\n // NOT at event['values'] or event['updates'].\n switch (baseType) {\n case 'values': {\n const vals = extractEventData(event);\n if (isSubagentNamespace(namespace) && isRecord(vals)) {\n updateSubagentValues(namespace, vals);\n break;\n }\n if ((namespace?.length ?? 0) === 0) {\n if (hasInterrupts(vals)) {\n if (activeAttempt) finalizeAttempt(activeAttempt, 'paused');\n } else {\n markNormalTerminal(event);\n }\n }\n if (vals != null) {\n extractInterrupts(vals, subjects);\n subjects.values$.next(vals as T);\n // Also sync messages$ from the values state so the full message\n // history (including human messages) is available to consumers.\n const stateMessages = (vals as Record<string, unknown>)['messages'];\n if (Array.isArray(stateMessages) && stateMessages.length > 0) {\n // Defensive: only sync when state carries messages. An empty\n // values payload shouldn't wipe the UI mid-stream.\n const projected = options.toMessage\n ? stateMessages.map(options.toMessage)\n : (stateMessages as BaseMessage[]);\n // Drop empty-content AI placeholders before merging. LangGraph\n // emits intermediate `values` events whose `state.messages`\n // includes an unfilled assistant turn at the tail. Keeping it\n // would create a phantom slot that competes with the chunk-\n // streamed AIMessageChunk arriving via messages-tuple — they'd\n // never merge (different ids; non-overlapping content fragments)\n // and the user sees two assistant bubbles.\n const filtered = projected.filter((m, i) => {\n if (i !== projected.length - 1) return true;\n const t = normalizeMessageType(\n typeof m._getType === 'function' ? m._getType() : (m as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n if (t !== 'ai') return true;\n const text = extractText(m.content);\n return text.length > 0;\n });\n // Preserve existing ids by content match (server echo / final-id swap).\n const remapped = preserveIds(subjects.messages$.value, filtered);\n // ALWAYS merge values-derived messages into existing rather\n // than replacing. LangGraph emits intermediate values events\n // during streaming where state.messages can lag behind what\n // we've already seen via messages-tuple — replacing would\n // drop the partial AI (or even the optimistic human) and\n // tear down their DOM mid-stream. Merge by id keeps both,\n // updates content where ids match, preserves the rest.\n subjects.messages$.next(mergeMessages(subjects.messages$.value, remapped, reasoningTimingMap, 'snapshot', canonicalMessageIds));\n if (isLgTraceEnabled()) {\n lgTrace('bridge.values-sync', {\n incomingLength: stateMessages.length,\n mergedLength: subjects.messages$.value.length,\n });\n }\n syncSubagentsFromMessages(stateMessages as BaseMessage[]);\n subagentManager.reconstructFromMessages(\n stateMessages as BaseMessage[],\n { skipIfPopulated: true },\n );\n publishSubagents();\n syncToolCallsFromMessages();\n }\n }\n break;\n }\n case 'updates': {\n const upd = extractEventData(event);\n if (isSubagentNamespace(namespace)) {\n markSubagentRunning(namespace);\n break;\n }\n if (upd != null) {\n extractInterrupts(upd, subjects);\n subjects.values$.next({\n ...subjects.values$.value,\n ...(upd as object),\n } as T);\n }\n break;\n }\n case 'error':\n if (activeAttempt) finalizeAttempt(activeAttempt, 'error');\n subjects.error$.next(toAgentError(event['error']));\n subjects.status$.next(ResourceStatus.Error);\n break;\n case 'interrupt':\n if (activeAttempt) finalizeAttempt(activeAttempt, 'paused');\n subjects.interrupt$.next(event['interrupt'] as Interrupt);\n break;\n case 'interrupts':\n if (activeAttempt) finalizeAttempt(activeAttempt, 'paused');\n subjects.interrupts$.next(event['interrupts'] as Interrupt[]);\n break;\n case 'custom': {\n const eventData = event['data'] as Record<string, unknown> | undefined;\n const name = (event['name'] ?? eventData?.['name'] ?? '') as string;\n const data = eventData?.['data'] ?? eventData;\n const current = subjects.custom$.value;\n subjects.custom$.next([...current, { name, data }]);\n break;\n }\n case 'tools':\n updateToolProgress(event);\n break;\n }\n }\n\n function syncToolCallsFromMessages(): void {\n const toolCalls = getToolCallsWithResults(\n subjects.messages$.value as unknown as LangGraphMessage[],\n ) as ToolCallWithResult[];\n subjects.toolCalls$.next(toolCalls);\n }\n\n function syncSubagentsFromMessages(messages: BaseMessage[]): void {\n for (const message of messages) {\n const raw = message as unknown as Record<string, unknown>;\n if (isAiMessageWithToolCalls(raw)) {\n subagentManager.registerFromToolCalls(\n raw['tool_calls'] as Array<{ id?: string; name: string; args: Record<string, unknown> | string }>,\n typeof raw['id'] === 'string' ? raw['id'] : null,\n );\n }\n if (isToolMessage(raw)) {\n const content = typeof raw['content'] === 'string'\n ? raw['content']\n : JSON.stringify(raw['content']);\n const status = raw['status'] === 'error' ? 'error' : 'success';\n subagentManager.processToolMessage(raw['tool_call_id'], content, status);\n }\n }\n publishSubagents();\n }\n\n function updateSubagentValues(namespace: string[] | undefined, values: Record<string, unknown>): void {\n const namespaceId = namespace ? extractToolCallIdFromNamespace(namespace) : undefined;\n if (!namespaceId) return;\n\n const messages = values['messages'];\n if (Array.isArray(messages) && messages.length > 0) {\n const first = messages[0];\n if (isRecord(first) && (first['type'] === 'human' || first['type'] === 'user') && typeof first['content'] === 'string') {\n subagentManager.matchSubgraphToSubagent(namespaceId, first['content']);\n }\n }\n subagentManager.updateSubagentValues(namespaceId, values);\n publishSubagents();\n }\n\n function markSubagentRunning(namespace: string[] | undefined): void {\n const namespaceId = namespace ? extractToolCallIdFromNamespace(namespace) : undefined;\n if (!namespaceId) return;\n subagentManager.markRunningFromNamespace(namespaceId, namespace);\n publishSubagents();\n }\n\n function publishSubagents(): void {\n subjects.subagents$.next(toSubagentRefs(subagentManager.getSubagents()));\n }\n\n function storeMessageMetadata(messages: BaseMessage[], event: StreamEvent): void {\n if (!event.messageMetadata) return;\n const next = new Map(subjects.messageMetadata$.value);\n messages.forEach((message, index) => {\n const id = (message as unknown as Record<string, unknown>)['id'];\n const messageId = String(id ?? index);\n next.set(messageId, {\n messageId,\n firstSeenState: undefined,\n branch: undefined,\n branchOptions: undefined,\n streamMetadata: event.messageMetadata,\n });\n });\n subjects.messageMetadata$.next(next);\n }\n\n function updateToolProgress(event: StreamEvent): void {\n const data = extractEventData(event);\n if (!isRecord(data)) return;\n\n const toolEvent = data['event'];\n const name = data['name'];\n if (typeof toolEvent !== 'string' || typeof name !== 'string') return;\n\n const toolCallId = typeof data['toolCallId'] === 'string' ? data['toolCallId'] : undefined;\n const key = toolCallId ?? name;\n const existing = toolProgressMap.get(key);\n\n switch (toolEvent) {\n case 'on_tool_start':\n toolProgressMap.set(key, {\n toolCallId,\n name,\n state: 'starting',\n input: data['input'],\n });\n break;\n case 'on_tool_event':\n toolProgressMap.set(key, {\n toolCallId,\n name,\n ...existing,\n state: 'running',\n data: data['data'],\n });\n break;\n case 'on_tool_end':\n toolProgressMap.set(key, {\n toolCallId,\n name,\n ...existing,\n state: 'completed',\n result: data['output'],\n });\n break;\n case 'on_tool_error':\n toolProgressMap.set(key, {\n toolCallId,\n name,\n ...existing,\n state: 'error',\n error: data['error'],\n });\n break;\n default:\n return;\n }\n\n subjects.toolProgress$.next([...toolProgressMap.values()]);\n }\n\n return {\n submit: async (payload, opts) => {\n if (opts?.multitaskStrategy === 'enqueue' && subjects.status$.value === ResourceStatus.Loading) {\n await enqueueRun(payload, opts);\n return 'success';\n }\n return runStream(payload, opts);\n },\n\n stop: async () => {\n invalidateQueueDrain();\n const shouldAbortAttempt = Boolean(\n abortController && activeAttempt && !activeAttempt.terminalOutcome\n );\n if (shouldAbortAttempt && abortController) userAbortedControllers.add(abortController);\n if (shouldAbortAttempt && activeAttempt) finalizeAttempt(activeAttempt, 'aborted');\n abortController?.abort();\n if (activeAttempt?.awaitingFinalSync) historyAbortController?.abort();\n await clearQueue();\n // Set Idle synchronously for an active user cancellation. Attempts that\n // already reached a terminal outcome retain their existing status.\n if (shouldAbortAttempt && subjects.status$.value !== ResourceStatus.Idle) {\n subjects.status$.next(ResourceStatus.Idle);\n }\n },\n\n switchThread: (id) => {\n setThreadId(id, true);\n },\n\n joinStream: async (runId, lastEventId) => {\n if (!currentThreadId) return;\n invalidateQueueDrain();\n abortController?.abort();\n const controller = new AbortController();\n abortController = controller;\n const attempt = beginAttempt(true);\n const threadId = currentThreadId;\n const startedAt = Date.now();\n captureRuntimeRequestTelemetry('join');\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);\n subjects.custom$.next([]);\n subjects.toolProgress$.next([]);\n toolProgressMap.clear();\n subjects.status$.next(ResourceStatus.Loading);\n subjects.error$.next(undefined);\n try {\n const iter = transport.joinStream\n ? transport.joinStream(threadId, runId, lastEventId, controller.signal)\n : [];\n for await (const event of iter) {\n if (controller.signal.aborted || !isCurrentExecution(controller, attempt)) break;\n processEvent(event);\n }\n if (!isCurrentExecution(controller, attempt)) return;\n const outcome = await finalizeClosedAttempt(controller, attempt);\n if (outcome === null) return;\n if (!controller.signal.aborted) {\n if (outcome !== 'error') {\n subjects.status$.next(ResourceStatus.Resolved);\n }\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n });\n }\n } catch (err) {\n if (!isCurrentExecution(controller, attempt)) return;\n if (attempt.terminalOutcome) return;\n if (isAbortError(err) && userAbortedControllers.has(controller)) {\n finalizeAttempt(attempt, 'aborted');\n subjects.error$.next(undefined);\n subjects.status$.next(ResourceStatus.Idle);\n } else {\n finalizeAttempt(attempt, attempt.sawAssistantChunk ? 'interrupted' : 'error');\n subjects.error$.next(toAgentError(err));\n subjects.status$.next(ResourceStatus.Error);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(err),\n });\n }\n } finally {\n if (abortController === controller) abortController = null;\n }\n },\n\n resubmitLast: async () => {\n if (lastPayload === null) return 'not-started';\n return runStream(lastPayload, lastOptions, 'resubmit');\n },\n\n getReasoningDurationMs: (id: string): number | undefined => {\n const entry = reasoningTimingMap.get(id);\n if (!entry) return undefined;\n if (entry.endedAt === undefined) return undefined;\n return entry.endedAt - entry.startedAt;\n },\n\n getMessageDelivery: (id: string): MessageDelivery =>\n messageDeliveries.get(id) ?? staticDelivery(id),\n\n getSubagentMessageDelivery: (toolCallId: string, message: BaseMessage): MessageDelivery =>\n subagentManager.getMessageDelivery(toolCallId, message),\n\n deliveryRevision,\n\n updateState: async (\n values: Record<string, unknown>,\n opts?: { asNode?: string },\n ): Promise<void> => {\n // No-op when there is no thread yet or the transport doesn't support\n // updateState (e.g. MockAgentTransport in unit tests without a threadId).\n if (!currentThreadId || !transport.updateState) {\n return;\n }\n await transport.updateState(\n currentThreadId,\n values,\n new AbortController().signal,\n opts,\n );\n },\n\n get currentThreadId(): string | null {\n return currentThreadId;\n },\n };\n}\n\nfunction isTranscriptMessageEvent(\n event: StreamEvent,\n transcriptNodeNames: readonly string[] | undefined,\n): boolean {\n if (!transcriptNodeNames || transcriptNodeNames.length === 0) return true;\n const node = event.messageMetadata?.['langgraph_node'];\n if (typeof node !== 'string') return true;\n return transcriptNodeNames.includes(node);\n}\n\n/**\n * Extracts the payload data from a normalized SDK event.\n *\n * Handles two formats:\n * 1. SDK events (via normalizeSdkEvent): data at event['data'] (record) + spread into event\n * 2. Mock/test events: data at event[event.type] (e.g., event['values'], event['updates'])\n */\n/**\n * LangGraph emits interrupts as part of `updates`/`values` events under the\n * special `__interrupt__` key, not as standalone events. When such a payload\n * appears, mirror it onto `interrupt$` (latest) and `interrupts$` (full list)\n * so consumers can react via `agent.interrupt()` / `agent.interrupts()`.\n */\nfunction extractInterrupts<T, B extends BagTemplate>(\n payload: unknown,\n subjects: StreamSubjects<T, B>,\n): void {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return;\n const raw = (payload as Record<string, unknown>)['__interrupt__'];\n // Cast through unknown — Interrupt$ is parameterized over Bag's InterruptType,\n // and the SDK delivers raw Interrupt payloads here.\n if (Array.isArray(raw) && raw.length > 0) {\n const list = raw as Interrupt[];\n subjects.interrupts$.next(list as unknown as Parameters<typeof subjects.interrupts$.next>[0]);\n subjects.interrupt$.next(list[list.length - 1] as unknown as Parameters<typeof subjects.interrupt$.next>[0]);\n return;\n }\n // Payload has no `__interrupt__` key. Clear any stale interrupt so the UI\n // dismisses the panel after a resume completes (LangGraph does not emit a\n // separate \"cleared\" event — the absence of `__interrupt__` in subsequent\n // values/updates is the signal). No-op if interrupt$ was already empty.\n if (subjects.interrupt$.value !== undefined) {\n subjects.interrupt$.next(undefined);\n subjects.interrupts$.next([]);\n }\n}\n\nfunction hasInterrupts(payload: unknown): boolean {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return false;\n const raw = (payload as Record<string, unknown>)['__interrupt__'];\n return Array.isArray(raw) && raw.length > 0;\n}\n\n/**\n * Projects pending interrupts from the latest history checkpoint onto the\n * interrupt$ / interrupts$ subjects. ThreadState exposes interrupts under\n * `tasks[i].interrupts` (per the LangGraph SDK schema). When the latest\n * checkpoint contains any pending interrupts, mirror them so consumers can\n * react via `agent.interrupt()` on thread reload without needing a fresh\n * stream event.\n *\n * If no interrupts are present, this is a no-op so existing streamed state\n * (mid-run) isn't clobbered by a stale history refresh.\n */\nfunction hydrateInterruptsFromHistory<T, B extends BagTemplate>(\n history: ThreadState<T>[],\n subjects: StreamSubjects<T, B>,\n): void {\n const latest = history[0];\n if (!latest || !Array.isArray(latest.tasks)) return;\n const collected: Interrupt[] = [];\n for (const task of latest.tasks) {\n if (task && Array.isArray(task.interrupts) && task.interrupts.length > 0) {\n for (const ix of task.interrupts as Interrupt[]) {\n collected.push(ix);\n }\n }\n }\n if (collected.length > 0) {\n subjects.interrupts$.next(\n collected as unknown as Parameters<typeof subjects.interrupts$.next>[0],\n );\n subjects.interrupt$.next(\n collected[collected.length - 1] as unknown as Parameters<\n typeof subjects.interrupt$.next\n >[0],\n );\n }\n}\n\nfunction extractEventData(event: StreamEvent): unknown {\n // Try event['data'] first (SDK format from normalizeSdkEvent)\n const d = event['data'];\n if (d != null && typeof d === 'object' && !Array.isArray(d)) {\n return d;\n }\n // Try event[event.type] (mock/test format: { type: 'values', values: {...} })\n const named = event[event.type];\n if (named != null && typeof named === 'object' && !Array.isArray(named)) {\n return named;\n }\n // Fallback: reconstruct from remaining keys\n const rest = Object.fromEntries(\n Object.entries(event).filter(([key]) => key !== 'type' && key !== 'data'),\n );\n return Object.keys(rest).length > 0 ? rest : d;\n}\n\nfunction isMessagesEvent(type: StreamEvent['type']): boolean {\n const baseType = getBaseEventType(type);\n return baseType === 'messages' || baseType.startsWith('messages/');\n}\n\nfunction getBaseEventType(type: StreamEvent['type']): string {\n return String(type).split('|')[0];\n}\n\nfunction getEventNamespace(event: StreamEvent): string[] | undefined {\n if (Array.isArray(event.namespace)) return event.namespace;\n const parts = String(event.type).split('|');\n return parts.length > 1 ? parts.slice(1) : undefined;\n}\n\nfunction normalizeMessages(event: StreamEvent): unknown[] | null {\n const directMessages = event['messages'];\n if (Array.isArray(directMessages)) {\n // Filter out non-message metadata objects (e.g. { langgraph_node, langgraph_triggers })\n // that the LangGraph SDK includes alongside real messages in messages/* events.\n const filtered = directMessages.filter(isMessageLike);\n return filtered.length > 0 ? filtered : null;\n }\n\n const data = event['data'];\n if (Array.isArray(data)) {\n if (data.every(isMessageLike)) {\n return data;\n }\n if (isMessageLike(data[0])) {\n return [data[0]];\n }\n }\n\n const indexedValues = Object.keys(event)\n .filter(key => /^\\d+$/.test(key))\n .sort((left, right) => Number(left) - Number(right))\n .map(key => event[key]);\n\n if (indexedValues.every(isMessageLike)) {\n return indexedValues;\n }\n if (isMessageLike(indexedValues[0])) {\n return [indexedValues[0]];\n }\n\n return null;\n}\n\n/**\n * Collapse adjacent AI messages where one's text is a prefix of the other.\n *\n * When complex-content streaming is in play, the same conceptual assistant\n * message can land in two slots: the canonical AI from values-sync (id\n * `resp_…` or run id) and the chunk-streamed AIMessageChunk from\n * messages-tuple (id `lc_run--…`). Both slots fill in parallel; once both\n * carry the full text we collapse them, keeping the older slot's id so\n * track-by-id stays stable in the chat list.\n */\nfunction collapseAdjacentAi(\n messages: BaseMessage[],\n affectedMessageIds?: Set<string>,\n allowCrossIdAiMerge = true,\n): BaseMessage[] {\n if (messages.length < 2) return messages;\n const out: BaseMessage[] = [];\n for (const msg of messages) {\n const last = out[out.length - 1];\n if (!last) { out.push(msg); continue; }\n const lastType = normalizeMessageType(\n typeof last._getType === 'function' ? last._getType() : (last as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n const msgType = normalizeMessageType(\n typeof msg._getType === 'function' ? msg._getType() : (msg as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n if (lastType === 'ai' && msgType === 'ai') {\n const lastText = extractText(last.content);\n const msgText = extractText(msg.content);\n const lastRaw = last as unknown as Record<string, unknown>;\n const msgRaw = msg as unknown as Record<string, unknown>;\n const differentIds = lastRaw['id'] !== msgRaw['id'];\n if (!(differentIds && !allowCrossIdAiMerge) && (lastText.length === 0\n || msgText.length === 0\n || lastText === msgText\n || lastText.startsWith(msgText)\n || msgText.startsWith(lastText))) {\n // Keep the longer content; preserve last (older) id and metadata.\n const longerText = msgText.length >= lastText.length ? msgText : lastText;\n const lastId = (last as unknown as Record<string, unknown>)['id'];\n const msgId = (msg as unknown as Record<string, unknown>)['id'];\n if (typeof msgId === 'string' && affectedMessageIds?.delete(msgId) && typeof lastId === 'string') {\n affectedMessageIds.add(lastId);\n }\n out[out.length - 1] = { ...(last as object), content: longerText } as BaseMessage;\n continue;\n }\n }\n out.push(msg);\n }\n return out;\n}\n\ntype MergeMode = 'delta' | 'snapshot';\n\nfunction mergeMessages(\n existing: BaseMessage[],\n incoming: BaseMessage[],\n reasoningTimingMap?: Map<string, { startedAt: number; endedAt?: number }>,\n mode: MergeMode = 'snapshot',\n canonicalMessageIds?: Set<string>,\n affectedMessageIds?: Set<string>,\n allowCrossIdAiMerge = true,\n): BaseMessage[] {\n const merged = [...existing];\n for (const msg of incoming) {\n const rawIn = msg as unknown as Record<string, unknown>;\n const id = rawIn['id'];\n let idx = id ? merged.findIndex(m => (m as unknown as Record<string, unknown>)['id'] === id) : -1;\n // Fallback: match by (role, content) when ids differ. This is the path\n // that fires when the server echoes back our optimistic human message\n // with a server-assigned id, or when partial AI tokens carry a chunk\n // id but the final canonical message has a run id. Preserving the\n // existing id here keeps track-by-id stable in the chat list and\n // prevents DOM teardown + animation restarts mid-stream.\n if (idx < 0) {\n idx = findContentMatch(merged, msg);\n if (idx >= 0 && !canMergeCrossIdAi(merged[idx], msg, allowCrossIdAiMerge)) {\n idx = -1;\n }\n }\n // When an AIMessageChunk arrives without an id-match or content-prefix\n // match, treat the trailing AI message as its accumulator. The\n // OpenAI Responses API emits per-chunk events whose ids identify the\n // *event*, not the message, so consecutive chunks land here. Without\n // this we'd append every chunk as a separate bubble.\n if (idx < 0) {\n const inType = normalizeMessageType(rawIn['type'] as string | undefined);\n if (inType === 'ai') {\n for (let i = merged.length - 1; i >= 0; i--) {\n const t = normalizeMessageType(\n typeof (merged[i] as BaseMessage)._getType === 'function'\n ? (merged[i] as BaseMessage)._getType()\n : (merged[i] as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n if (t === 'ai') {\n if (!canMergeCrossIdAi(merged[i], msg, allowCrossIdAiMerge)) break;\n idx = i;\n break;\n }\n if (t === 'human' || t === 'tool' || t === 'system') break;\n }\n }\n }\n if (idx >= 0) {\n const existing = merged[idx];\n const existingId = (existing as unknown as Record<string, unknown>)['id'];\n const incomingRaw = msg as unknown as Record<string, unknown>;\n const targetId = (existingId ?? incomingRaw['id']) as string | undefined;\n // Identity backstop: once a message's content is known-final, late\n // streamed deltas for it are stale stragglers — ignore them outright.\n if (mode === 'delta' && targetId && canonicalMessageIds?.has(targetId)\n && !isFinalCanonicalReasoningContent(incomingRaw['content'])) {\n continue;\n }\n // Keep the *existing* id so downstream track-by-id sees stable identity.\n // For complex-content streaming (OpenAI gpt-5/o-series, Anthropic) the\n // SDK emits per-chunk *delta* arrays — not accumulated arrays — so a\n // straight replacement collapses the rendered bubble to just the\n // latest token. Accumulate text-bearing content across chunks here\n // and hand a string to consumers; downstream code already handles\n // string content uniformly.\n const accumulatedContent = accumulateContent(\n existing.content as unknown,\n incomingRaw['content'],\n mode,\n );\n if (targetId && isFinalCanonicalReasoningContent(incomingRaw['content'])) {\n canonicalMessageIds?.add(targetId);\n }\n // Only accumulate reasoning when the incoming message explicitly carries\n // a `reasoning` field or complex-content array blocks with\n // type='reasoning'/'thinking'. Never use a plain string content value\n // as reasoning source — that would wrongly treat every assistant\n // message text as reasoning content.\n const incomingReasoningSource = 'reasoning' in incomingRaw\n ? incomingRaw['reasoning']\n : (Array.isArray(incomingRaw['content']) ? incomingRaw['content'] : undefined);\n const accumulatedReasoning = accumulateReasoning(\n (existing as unknown as Record<string, unknown>)['reasoning'],\n incomingReasoningSource,\n );\n const idForTiming = (existingId as string | undefined) ?? (incomingRaw['id'] as string | undefined);\n if (idForTiming && reasoningTimingMap) {\n const hasReasoning = accumulatedReasoning.length > 0;\n const hasText = (typeof accumulatedContent === 'string' ? accumulatedContent : '').length > 0;\n if (hasReasoning) {\n const entry = reasoningTimingMap.get(idForTiming) ?? { startedAt: Date.now() };\n if (hasText && entry.endedAt === undefined) entry.endedAt = Date.now();\n reasoningTimingMap.set(idForTiming, entry);\n }\n }\n const next = { ...(msg as object), content: accumulatedContent } as BaseMessage;\n (next as unknown as Record<string, unknown>)['reasoning'] = accumulatedReasoning;\n if (existingId) {\n (next as unknown as Record<string, unknown>)['id'] = existingId;\n }\n const changed = mode === 'delta' || messageChangedForDelivery(existing, next);\n merged[idx] = next;\n if (targetId && changed) affectedMessageIds?.add(targetId);\n } else {\n const incomingRaw = msg as unknown as Record<string, unknown>;\n const initialReasoningSource = 'reasoning' in incomingRaw\n ? incomingRaw['reasoning']\n : (Array.isArray(incomingRaw['content']) ? incomingRaw['content'] : undefined);\n const initialReasoning = accumulateReasoning(undefined, initialReasoningSource);\n if (initialReasoning.length > 0 && reasoningTimingMap) {\n const msgId = incomingRaw['id'] as string | undefined;\n if (msgId && !reasoningTimingMap.has(msgId)) {\n reasoningTimingMap.set(msgId, { startedAt: Date.now() });\n }\n }\n const next = { ...(msg as object) } as BaseMessage;\n (next as unknown as Record<string, unknown>)['reasoning'] = initialReasoning;\n merged.push(next);\n const nextId = (next as unknown as Record<string, unknown>)['id'];\n if (typeof nextId === 'string') affectedMessageIds?.add(nextId);\n }\n }\n return collapseAdjacentAi(merged, affectedMessageIds, allowCrossIdAiMerge);\n}\n\nfunction canMergeCrossIdAi(\n candidate: BaseMessage,\n incoming: BaseMessage,\n allowCrossIdAiMerge: boolean,\n): boolean {\n const candidateRaw = candidate as unknown as Record<string, unknown>;\n const incomingRaw = incoming as unknown as Record<string, unknown>;\n if (candidateRaw['id'] === incomingRaw['id']) return true;\n return allowCrossIdAiMerge;\n}\n\n/**\n * Merge an incoming chunk's content into prior accumulated content for the\n * same message id. Behavior is governed by `mode`, which reflects the\n * DECLARED kind of the source event rather than a guess from comparing text:\n *\n * - mode 'delta' (messages-tuple / `event.messageMetadata` truthy): the\n * payload is a genuine per-chunk delta. Append unconditionally — a\n * prefix-comparison \"dedupe\" here would silently drop legitimate tokens\n * that coincide with the message-so-far (e.g. every bare \"|\" while\n * streaming a markdown table). Staleness after the message goes canonical\n * is instead handled by identity in `mergeMessages` (canonicalMessageIds).\n * - mode 'snapshot' (messages/partial, values-sync): the payload carries the\n * message-so-far, not a delta, so mutual prefix comparison picks the\n * longer state and ignores stale shorter snapshots.\n *\n * In both modes, a \"final canonical\" reasoning+text array (see\n * `isFinalCanonicalReasoningContent`) always replaces whatever was\n * accumulated — it's the authoritative final message, not another chunk.\n *\n * We deliberately collapse complex content arrays to a string at this layer.\n * The langgraph-sdk client does not accumulate complex-content arrays the\n * way it accumulates strings, and per-chunk arrays carry only the latest\n * delta. Concatenating extracted text gives consumers the same uniform\n * string they get for non-reasoning models.\n */\n/**\n * Heuristic: does this content look like a \"final canonical\" array\n * carrying both reasoning and visible text blocks? OpenAI's Responses\n * API ships the final assistant message in this shape after the\n * streaming token chunks complete. Detection is narrow (requires BOTH\n * a reasoning-shape block AND a text-shape block in the same array)\n * so it doesn't trip on routine streaming chunks.\n */\nfunction isFinalCanonicalReasoningContent(content: unknown): boolean {\n if (!Array.isArray(content)) return false;\n let hasReasoning = false;\n let hasText = false;\n for (const block of content) {\n if (block == null || typeof block !== 'object') continue;\n const t = (block as Record<string, unknown>)['type'];\n if (t === 'reasoning' || t === 'thinking') hasReasoning = true;\n else if (t === 'text' || t === 'output_text') hasText = true;\n }\n return hasReasoning && hasText;\n}\n\nfunction accumulateContent(existing: unknown, incoming: unknown, mode: MergeMode = 'snapshot'): string {\n const existingText = extractText(existing);\n const incomingText = extractText(incoming);\n\n // Always return a string. We never want array content escaping the bridge:\n // (a) downstream consumers expect string content, and (b) findContentMatch\n // stringifies arrays, which would prevent the canonical-message id-swap\n // dedupe from matching the streamed-chunk message after a partial chunk.\n if (existingText.length === 0) return incomingText;\n if (incomingText.length === 0) return existingText;\n // Final-canonical detection applies in both modes: the authoritative\n // \"reasoning + text\" array replaces whatever was accumulated.\n if (isFinalCanonicalReasoningContent(incoming)) return incomingText;\n if (mode === 'delta') {\n // Tuple chunks are declared deltas. Append unconditionally — any\n // text-comparison \"dedupe\" here can silently drop legitimate tokens\n // that coincide with the message prefix (e.g. every bare \"|\" in a\n // markdown table). Staleness is handled by identity in mergeMessages.\n return existingText + incomingText;\n }\n // Snapshot mode (messages/partial, values-sync): payloads carry the\n // message-so-far, so mutual prefix comparison picks the longer state and\n // ignores stale shorter snapshots.\n if (incomingText.startsWith(existingText)) return incomingText;\n if (existingText.startsWith(incomingText)) return existingText;\n return existingText + incomingText;\n}\n\nfunction extractText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (typeof block === 'string') { out += block; continue; }\n if (block == null || typeof block !== 'object') continue;\n const rec = block as Record<string, unknown>;\n const t = rec['type'];\n if (t === 'text' || t === 'output_text' || t === undefined) {\n const text = rec['text'];\n if (typeof text === 'string') out += text;\n }\n }\n return out;\n}\n\nfunction extractReasoning(content: unknown): string {\n if (typeof content === 'string') return '';\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (block == null || typeof block !== 'object') continue;\n const rec = block as Record<string, unknown>;\n const t = rec['type'];\n if (t === 'reasoning' || t === 'thinking') {\n // Direct text field — Anthropic-style \"thinking\" blocks and\n // some LangChain-shaped reasoning blocks land here.\n const text = rec['text'];\n if (typeof text === 'string') out += text;\n // OpenAI Responses API: when `reasoning.summary='auto'` was\n // requested, reasoning blocks carry a `summary` array of\n // `{type: 'summary_text', text: '...'}` items. Concatenate\n // their texts in order.\n const summary = rec['summary'];\n if (Array.isArray(summary)) {\n for (const item of summary) {\n if (item == null || typeof item !== 'object') continue;\n const itemText = (item as Record<string, unknown>)['text'];\n if (typeof itemText === 'string') out += itemText;\n }\n }\n }\n }\n return out;\n}\n\nfunction accumulateReasoning(existing: unknown, incoming: unknown): string {\n const existingText = typeof existing === 'string' ? existing : extractReasoning(existing);\n const incomingText = typeof incoming === 'string' ? incoming : extractReasoning(incoming);\n if (existingText.length === 0) return incomingText;\n if (incomingText.length === 0) return existingText;\n if (incomingText.startsWith(existingText)) return incomingText;\n if (existingText.startsWith(incomingText)) return existingText;\n return existingText + incomingText;\n}\n\n/**\n * Replace the incoming messages' ids with the existing array's ids whenever\n * (role, content) matches positionally and the existing id differs. Keeps\n * track-by-id stable across server echoes and final-id swaps.\n */\nfunction preserveIds(\n existing: BaseMessage[],\n incoming: BaseMessage[],\n affectedMessageIds?: Set<string>,\n): BaseMessage[] {\n if (existing.length === 0) {\n for (const message of incoming) {\n const id = (message as unknown as Record<string, unknown>)['id'];\n if (typeof id === 'string') affectedMessageIds?.add(id);\n }\n return collapseAdjacentAi(incoming, affectedMessageIds);\n }\n const usedExisting = new Set<number>();\n const remapped = incoming.map((msg, i) => {\n const inRaw = msg as unknown as Record<string, unknown>;\n const inId = inRaw['id'];\n // First try same-position match (the dominant case).\n let matchIdx = -1;\n if (i < existing.length && !usedExisting.has(i) && sameRoleAndContent(existing[i], msg)) {\n matchIdx = i;\n } else {\n // Fallback: any unused existing message with matching role+content.\n matchIdx = existing.findIndex((m, j) => !usedExisting.has(j) && sameRoleAndContent(m, msg));\n }\n if (matchIdx < 0) {\n if (typeof inId === 'string') affectedMessageIds?.add(inId);\n return msg;\n }\n usedExisting.add(matchIdx);\n const existingId = (existing[matchIdx] as unknown as Record<string, unknown>)['id'];\n const remappedMessage = !existingId || existingId === inId\n ? msg\n : { ...(msg as object), id: existingId } as BaseMessage;\n if (typeof existingId === 'string' && messageChangedForDelivery(existing[matchIdx], remappedMessage)) {\n affectedMessageIds?.add(existingId);\n }\n return remappedMessage;\n });\n return collapseAdjacentAi(remapped, affectedMessageIds);\n}\n\nfunction messageChangedForDelivery(existing: BaseMessage, incoming: BaseMessage): boolean {\n const existingRaw = existing as unknown as Record<string, unknown>;\n const incomingRaw = incoming as unknown as Record<string, unknown>;\n const existingType = normalizeMessageType(\n typeof existing._getType === 'function' ? existing._getType() : existingRaw['type'] as string | undefined,\n );\n const incomingType = normalizeMessageType(\n typeof incoming._getType === 'function' ? incoming._getType() : incomingRaw['type'] as string | undefined,\n );\n if (existingType !== incomingType || extractText(existing.content) !== extractText(incoming.content)) {\n return true;\n }\n const existingReasoning = typeof existingRaw['reasoning'] === 'string'\n ? existingRaw['reasoning']\n : extractReasoning(existingRaw['reasoning']);\n const incomingReasoning = typeof incomingRaw['reasoning'] === 'string'\n ? incomingRaw['reasoning']\n : extractReasoning(incomingRaw['reasoning']);\n if (existingReasoning !== incomingReasoning) return true;\n return JSON.stringify(existingRaw['tool_calls'] ?? null) !== JSON.stringify(incomingRaw['tool_calls'] ?? null);\n}\n\nfunction sameRoleAndContent(a: BaseMessage, b: BaseMessage): boolean {\n const aType = normalizeMessageType(\n typeof a._getType === 'function' ? a._getType() : (a as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n const bType = normalizeMessageType(\n typeof b._getType === 'function' ? b._getType() : (b as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n if (aType !== bType) return false;\n const aContent = typeof a.content === 'string' ? a.content : JSON.stringify(a.content);\n const bContent = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n if (aContent === bContent) return true;\n // For AI messages we accept prefix relationships (streaming → final).\n if (aType === 'ai' && typeof aContent === 'string' && typeof bContent === 'string') {\n return aContent.length > 0 && (bContent.startsWith(aContent) || aContent.startsWith(bContent));\n }\n return false;\n}\n\nfunction findContentMatch(merged: BaseMessage[], incoming: BaseMessage): number {\n const inRaw = incoming as unknown as Record<string, unknown>;\n const inType = normalizeMessageType(\n typeof incoming._getType === 'function' ? incoming._getType() : (inRaw['type'] as string | undefined),\n );\n const inContent = typeof incoming.content === 'string' ? incoming.content : JSON.stringify(incoming.content);\n // Only worth matching for human messages (where the optimistic→echo\n // mismatch happens) and for AI messages where content is a strict prefix\n // of the existing (token-streaming + final-id swap pattern).\n for (let i = merged.length - 1; i >= 0; i--) {\n const m = merged[i] as unknown as Record<string, unknown>;\n const mType = normalizeMessageType(\n typeof (merged[i] as BaseMessage)._getType === 'function'\n ? (merged[i] as BaseMessage)._getType()\n : (m['type'] as string | undefined),\n );\n if (mType !== inType) continue;\n const mContent = typeof (merged[i] as BaseMessage).content === 'string'\n ? (merged[i] as BaseMessage).content as string\n : JSON.stringify((merged[i] as BaseMessage).content);\n if (inType === 'human' && mContent === inContent) return i;\n if (inType === 'ai') {\n // Skip empty placeholders. We don't want a pre-existing empty AI\n // (created by an early values-sync emission with `state.messages`\n // including an unfilled assistant turn) to absorb the first chunk\n // arriving via messages-tuple — that strands subsequent chunks in a\n // separate slot whose content no longer prefix-matches the canonical.\n const aSafe = typeof mContent === 'string' ? mContent : '';\n const bSafe = typeof inContent === 'string' ? inContent : '';\n if (aSafe.length === 0 || bSafe.length === 0) continue;\n if (mContent === inContent || aSafe.startsWith(bSafe) || bSafe.startsWith(aSafe)) return i;\n }\n }\n return -1;\n}\n\n/**\n * Normalize message type so AIMessage and AIMessageChunk compare equal.\n * The LangGraph SDK emits type='AIMessageChunk' on the messages-tuple\n * streaming path and type='ai' on the values-sync path for the same\n * canonical assistant message — distinguishing them prevents the\n * content-prefix dedupe from collapsing the duplicate bubbles.\n */\nfunction normalizeMessageType(t: string | undefined): string | undefined {\n if (!t) return t;\n if (t === 'AIMessageChunk' || t === 'AIMessage' || t === 'assistant') return 'ai';\n if (t === 'HumanMessage' || t === 'HumanMessageChunk' || t === 'user') return 'human';\n if (t === 'ToolMessage') return 'tool';\n if (t === 'SystemMessage') return 'system';\n return t;\n}\n\nfunction getTailAssistantMessageId(messages: BaseMessage[]): string | undefined {\n const tail = messages[messages.length - 1];\n if (!tail) return undefined;\n const raw = tail as unknown as Record<string, unknown>;\n const type = normalizeMessageType(\n typeof tail._getType === 'function' ? tail._getType() : raw['type'] as string | undefined,\n );\n return type === 'ai' && typeof raw['id'] === 'string' ? raw['id'] : undefined;\n}\n\nfunction toSubagentRefs(\n subagents: Map<string, TrackedSubagent>,\n): Map<string, SubagentStreamRef> {\n const refs = new Map<string, SubagentStreamRef>();\n subagents.forEach((subagent, key) => {\n refs.set(key, {\n toolCallId: subagent.id,\n name: typeof subagent.toolCall.args['subagent_type'] === 'string'\n ? subagent.toolCall.args['subagent_type']\n : undefined,\n status: signal(subagent.status),\n values: signal(subagent.values),\n messages: signal(subagent.messages as unknown as BaseMessage[]),\n });\n });\n return refs;\n}\n\nfunction isAiMessageWithToolCalls(value: Record<string, unknown>): boolean {\n return (value['type'] === 'ai' || value['type'] === 'assistant')\n && Array.isArray(value['tool_calls']);\n}\n\nfunction isToolMessage(value: Record<string, unknown>): value is Record<string, unknown> & { tool_call_id: string } {\n return value['type'] === 'tool' && typeof value['tool_call_id'] === 'string';\n}\n\nfunction isMessageLike(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object'\n && value !== null\n && (\n 'content' in value\n || 'type' in value\n || 'id' in value\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const _internalsForTesting = {\n extractText,\n extractReasoning,\n accumulateContent,\n accumulateReasoning,\n collapseAdjacentAi,\n mergeMessages,\n preserveIds,\n normalizeMessageType,\n isFinalCanonicalReasoningContent,\n};\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken } from '@angular/core';\nimport type { LangGraphClientOptions } from '../agent.types';\n\n/**\n * App-wide LangGraph SDK client tuning (e.g. `maxRetries`). Provide once at the\n * app root; both the agent's default {@link FetchStreamTransport} and the\n * {@link LangGraphThreadsAdapter} read it so the retry budget is configured in\n * one place. A call-site `agent({ clientOptions })` or per-agent\n * `provideAgent({ clientOptions })` overrides it for that agent.\n * Absent → the SDK default.\n */\nexport const LANGGRAPH_CLIENT_OPTIONS = new InjectionToken<LangGraphClientOptions>(\n 'LANGGRAPH_CLIENT_OPTIONS',\n);\n\n/**\n * First-defined-wins resolution across precedence layers (highest first).\n * Whole-object semantics — no per-field merge — so the winning layer is the\n * single source for every option. Returns undefined when all layers are absent.\n */\nexport function resolveClientOptions(\n ...layers: Array<LangGraphClientOptions | undefined | null>\n): LangGraphClientOptions | undefined {\n for (const layer of layers) {\n if (layer) return layer;\n }\n return undefined;\n}\n","// SPDX-License-Identifier: MIT\nimport type { ThreadState } from '@langchain/langgraph-sdk';\nimport type { AgentBranchTree, AgentBranchTreeFork } from '../agent.types';\n\nconst ROOT_ID = '$';\n\n/**\n * Builds a branch-aware checkpoint tree from LangGraph thread history.\n *\n * This mirrors the small SDK UI branching data shape without importing the\n * SDK UI runtime helper, keeping Angular bundles independent of React UI code.\n */\nexport function buildBranchTree<T>(history: ThreadState<T>[] = []): AgentBranchTree<T> {\n if (history.length <= 1) {\n return {\n type: 'sequence',\n items: history.map(value => ({ type: 'node', value, path: [] })),\n };\n }\n\n const nodeIds = new Set<string>();\n const childrenMap: Record<string, ThreadState<T>[]> = {};\n\n for (const state of history) {\n const parentId = state.parent_checkpoint?.checkpoint_id ?? ROOT_ID;\n childrenMap[parentId] ??= [];\n childrenMap[parentId].push(state);\n\n const checkpointId = state.checkpoint?.checkpoint_id;\n if (checkpointId != null) {\n nodeIds.add(checkpointId);\n }\n }\n\n const orphanRoot = findLatestOrphanRoot(childrenMap, nodeIds);\n if (orphanRoot != null) {\n childrenMap[ROOT_ID] = childrenMap[orphanRoot];\n }\n\n const rootSequence: AgentBranchTree<T> = { type: 'sequence', items: [] };\n const queue: Array<{ id: string; sequence: AgentBranchTree<T>; path: string[] }> = [\n { id: ROOT_ID, sequence: rootSequence, path: [] },\n ];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const task = queue.shift();\n if (!task || visited.has(task.id)) continue;\n visited.add(task.id);\n\n const children = childrenMap[task.id];\n if (!children?.length) continue;\n\n let fork: AgentBranchTreeFork<T> | undefined;\n if (children.length > 1) {\n fork = { type: 'fork', items: [] };\n task.sequence.items.push(fork);\n }\n\n for (const value of children) {\n const id = value.checkpoint?.checkpoint_id;\n if (id == null) continue;\n\n let sequence = task.sequence;\n let path = task.path;\n if (fork != null) {\n sequence = { type: 'sequence', items: [] };\n fork.items.unshift(sequence);\n path = [...task.path, id];\n }\n\n sequence.items.push({ type: 'node', value, path });\n queue.push({ id, sequence, path });\n }\n }\n\n return rootSequence;\n}\n\nfunction findLatestOrphanRoot<T>(\n childrenMap: Record<string, ThreadState<T>[]>,\n nodeIds: Set<string>,\n): string | undefined {\n if (childrenMap[ROOT_ID] != null) return undefined;\n\n return Object.keys(childrenMap)\n .filter(parentId => !nodeIds.has(parentId))\n .map(parentId => ({\n parentId,\n lastId: findLatestDescendantId(parentId, childrenMap),\n }))\n .sort((left, right) => left.lastId.localeCompare(right.lastId))\n .at(-1)?.parentId;\n}\n\nfunction findLatestDescendantId<T>(\n parentId: string,\n childrenMap: Record<string, ThreadState<T>[]>,\n): string {\n const queue = [parentId];\n const seen = new Set<string>();\n let latestId = parentId;\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current || seen.has(current)) continue;\n seen.add(current);\n\n for (const child of childrenMap[current] ?? []) {\n const childId = child.checkpoint?.checkpoint_id;\n if (childId == null) continue;\n if (childId.localeCompare(latestId) > 0) {\n latestId = childId;\n }\n queue.push(childId);\n }\n }\n\n return latestId;\n}\n","// libs/langgraph/src/lib/internals/extract-citations.ts\n// SPDX-License-Identifier: MIT\nimport type { Citation } from '@threadplane/chat';\n\ninterface KwargsLike {\n additional_kwargs?: Record<string, unknown> | undefined;\n}\n\n/**\n * Normalize {@link Citation}s out of a message's `additional_kwargs` (reading\n * `citations` or `sources`). Exposed for advanced consumers building custom\n * adapters or bridging non-LangGraph message shapes into the neutral\n * `Citation[]` form.\n *\n * @param msg Any object with an `additional_kwargs` bag (e.g. a LangChain message).\n * @returns The normalized citations, or `undefined` when none are present.\n * @example\n * ```ts\n * const citations = extractCitations(lcMessage);\n * ```\n */\nexport function extractCitations(msg: KwargsLike): Citation[] | undefined {\n const raw = msg.additional_kwargs?.['citations'] ?? msg.additional_kwargs?.['sources'];\n if (!Array.isArray(raw) || raw.length === 0) return undefined;\n return raw.map((entry, i) => normalizeCitation(entry, i + 1));\n}\n\nfunction normalizeCitation(entry: unknown, fallbackIndex: number): Citation {\n if (typeof entry === 'string') {\n return { id: `c${fallbackIndex}`, index: fallbackIndex, url: entry };\n }\n const e = (entry ?? {}) as Record<string, unknown>;\n const str = (key: string): string | undefined =>\n typeof e[key] === 'string' ? (e[key] as string) : undefined;\n const firstStr = (...keys: string[]): string | undefined => {\n for (const k of keys) {\n const v = str(k);\n if (v !== undefined) return v;\n }\n return undefined;\n };\n const publishedAt = e['publishedAt'];\n const normalizedPublishedAt =\n typeof publishedAt === 'string' || typeof publishedAt === 'number' || publishedAt instanceof Date\n ? publishedAt\n : undefined;\n return {\n id: str('id') ?? str('refId') ?? `c${fallbackIndex}`,\n index: typeof e['index'] === 'number' ? (e['index'] as number) : fallbackIndex,\n title: firstStr('title', 'name'),\n url: firstStr('url', 'href', 'source'),\n snippet: firstStr('snippet', 'content', 'excerpt'),\n sourceType: str('sourceType'),\n iconUrl: str('iconUrl'),\n publishedAt: normalizedPublishedAt,\n extra:\n typeof e['extra'] === 'object' && e['extra'] !== null\n ? (e['extra'] as Record<string, unknown>)\n : undefined,\n };\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal } from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport {\n selectPendingClientToolCalls,\n type CompleteOutcome,\n type ClientToolsCapability,\n type ClientToolResult,\n type ClientToolSpec,\n} from '@threadplane/chat';\nimport type { ToolCall } from '@threadplane/chat';\nimport type { LangGraphSubmitOptions } from './agent.types';\n\n/**\n * A patch written onto a local ToolCall when a client tool resolves.\n * Mirrors the fields the ag-ui adapter writes directly onto its WritableSignal.\n */\nexport interface ClientToolResultPatch {\n result: unknown;\n error?: unknown;\n status?: ToolCall['status'];\n}\n\n/**\n * Minimal store surface consumed by createClientToolsCapability.\n * Typed narrowly so the factory is easy to fake in tests.\n */\nexport interface ClientToolsStore {\n toolCalls: Signal<readonly ToolCall[]>;\n isLoading: Signal<boolean>;\n /**\n * Write a client-tool outcome onto the local ToolCall with the given id.\n * The LangGraph `toolCalls` signal is a read-only projection of the SDK's\n * stream, so the adapter layers these patches over the projection rather\n * than mutating it in place. This freezes the transcript card: toToolViewSpec\n * spreads the result into the mounted ask component's props on the next\n * render, letting it branch to a resolved/frozen state.\n */\n applyClientResult(id: string, patch: ClientToolResultPatch): void;\n}\n\n/**\n * The run-issuing function used by createClientToolsCapability.\n * Accepts a payload (input) and optional LangGraph submit options.\n * Corresponds to StreamManagerBridge.submit.\n */\nexport type SubmitFn = (\n payload: unknown,\n opts?: LangGraphSubmitOptions,\n batch?: StagedToolMessageBatch,\n) => Promise<CompleteOutcome>;\n\n/** Serialize a tool result value to a string for the ToolMessage content. */\nfunction safeStringify(v: unknown): string {\n return typeof v === 'string' ? v : JSON.stringify(v);\n}\n\n/**\n * Merge client_tools into a run payload.\n *\n * If payload is null we keep it null — a null payload signals a no-input\n * resume (used by regenerate and command resumes) and the server must\n * receive null, not an object. The catalog can only be injected when the\n * payload is a plain object that the graph's add_messages reducer can\n * process; it cannot be injected into a command-resume (null payload) or\n * into an already-typed non-record payload.\n *\n * Returns a new object; never mutates the original.\n */\nexport function mergeClientTools(\n payload: unknown,\n catalog: readonly ClientToolSpec[],\n): unknown {\n if (catalog.length === 0) return payload;\n if (payload === null || payload === undefined) return payload;\n if (typeof payload !== 'object' || Array.isArray(payload)) return payload;\n return { ...(payload as Record<string, unknown>), client_tools: catalog };\n}\n\n/**\n * Merge A2UI client capabilities into a run payload under the\n * `a2ui_client_capabilities` state key. Same payload semantics as\n * {@link mergeClientTools}: null/undefined payloads (command resumes,\n * regenerates) and non-record payloads pass through untouched, and the\n * original object is never mutated. Because LangGraph thread state\n * persists across runs, the capabilities stamped by any run remain\n * readable by later runs on the same thread.\n */\nexport function mergeA2uiClientCapabilities(\n payload: unknown,\n capabilities: { supportedCatalogIds: string[]; inlineCatalogs?: unknown[] } | undefined,\n): unknown {\n if (!capabilities) return payload;\n if (payload === null || payload === undefined) return payload;\n if (typeof payload !== 'object' || Array.isArray(payload)) return payload;\n return { ...(payload as Record<string, unknown>), a2ui_client_capabilities: capabilities };\n}\n\n/**\n * Wire shape for a settled client-tool result awaiting durability. `id` is\n * deterministic for the tool-call ID so overlapping handoffs and retries\n * update the same logical ToolMessage.\n */\nexport interface BufferedToolMessage {\n readonly id: string;\n readonly type: 'tool';\n readonly role: 'tool';\n readonly tool_call_id: string;\n readonly content: string;\n}\n\n/**\n * Non-destructive snapshot of staged messages. Callers acknowledge only after\n * the exact handoff succeeds; acknowledgment removes only captured entries and\n * becomes a no-op after a thread-reset generation change.\n */\nexport interface StagedToolMessageBatch {\n readonly generation: number;\n readonly messages: readonly BufferedToolMessage[];\n acknowledge(): void;\n}\n\nexport interface LangGraphClientToolsCapability extends ClientToolsCapability {\n readonly catalog: Signal<readonly ClientToolSpec[]>;\n snapshotToolMessages(): StagedToolMessageBatch;\n clearStagedToolMessages(): void;\n}\n\n/** Writes settled tool messages into server thread state without starting a run. */\nexport type PersistToolMessagesFn = (\n messages: readonly BufferedToolMessage[],\n) => Promise<void>;\n\n/** Reads the thread a write would currently land on. */\nexport type CurrentThreadIdFn = () => string | null;\n\n/**\n * A buffered tool message plus the thread it was settled on. The stamp is\n * internal bookkeeping and never reaches the wire — only `message` is sent.\n */\ninterface StagedToolMessage {\n readonly threadId: string | null;\n readonly message: BufferedToolMessage;\n}\n\n/**\n * Prepend staged tool messages to a run payload's message list.\n *\n * Mirrors mergeClientTools: a null payload signals a no-input resume and must\n * stay null, so staged messages cannot ride along and are left buffered.\n */\nexport function mergeStagedToolMessages(\n payload: unknown,\n staged: readonly BufferedToolMessage[],\n): unknown {\n if (staged.length === 0) return payload;\n if (payload === null || payload === undefined) return payload;\n if (typeof payload !== 'object' || Array.isArray(payload)) return payload;\n const record = payload as Record<string, unknown>;\n const existing = Array.isArray(record['messages']) ? record['messages'] : [];\n return { ...record, messages: [...staged, ...existing] };\n}\n\n/**\n * Creates a ClientToolsCapability backed by a LangGraph submit function and\n * a store of tool-call signals. Extracted into a factory so it can be\n * unit-tested in isolation without standing up a full Angular DI environment.\n *\n * The capability:\n * - Maintains a catalog of client tool specs (setCatalog). The caller\n * is responsible for threading the catalog into every run payload via\n * mergeClientTools() before calling manager.submit — see agent.fn.ts.\n * - Exposes a `pending` computed signal: tool calls whose name is in the\n * catalog, have no backend result, and haven't been resolved client-side\n * yet — but ONLY when the run is not in progress (isLoading===false).\n * The backend ends the run without emitting a ToolMessage result for\n * client tools, so `result` stays undefined on those entries.\n * - settle(id, result): marks the call as resolved, writes the local result,\n * and stages a ToolMessage with a deterministic ID without issuing a run.\n * - flush(): snapshots the whole staged group into ONE persistFn call without\n * starting a run — the settlement path for tool groups that never continue.\n * Successful persistence acknowledges the captured entries; failed writes\n * retain them. When persistFn is absent, a non-empty flush rejects without\n * changing the staged results. Flushes are chained so entries settled after\n * one snapshot receive their own write. Concurrent persistence,\n * continuation, and ordinary submits may safely carry the same stable IDs.\n * - clearStagedToolMessages(): discards staged results on a thread switch and\n * advances the generation so late acknowledgments cannot affect new state.\n * - resolve(id, result): settles the result, then issues a NEW run on the SAME\n * thread by calling submitFn with a non-destructive ToolMessage snapshot:\n * input: {\n * messages: [{ type: 'tool', role: 'tool', tool_call_id: id, content }],\n * client_tools: catalog(),\n * }\n * The snapshot remains staged unless that continuation reports success.\n * LangGraph's `add_messages` reducer reuses each stable message ID on safe\n * overlap or replay. Including `client_tools` ensures the model sees the\n * full tool catalog on the continuation run.\n *\n * Catalog shipping: the catalog is NOT injected by this factory's\n * submitFn call in resolve() — the resolved-tool run builds the payload\n * directly. For normal submit/regenerate runs, the agent.fn.ts wrapper\n * uses mergeClientTools() to inject `client_tools` into the payload\n * before forwarding to manager.submit. This keeps injection concerns\n * co-located with the run-issuing call sites.\n */\nexport function createClientToolsCapability(\n submitFn: SubmitFn,\n store: ClientToolsStore,\n persistFn?: PersistToolMessagesFn,\n currentThreadIdFn?: CurrentThreadIdFn,\n): LangGraphClientToolsCapability {\n const catalog = signal<readonly ClientToolSpec[]>([]);\n const resolvedIds = signal<ReadonlySet<string>>(new Set());\n const toolMessageBuffer: StagedToolMessage[] = [];\n let flushInFlight: Promise<void> | undefined;\n // Bumped whenever a thread reset discards staged state. Every snapshot keeps\n // its generation, making acknowledgments from the prior thread no-ops.\n let bufferGeneration = 0;\n // Tool calls belonging to threads we have left. A handler still running when\n // the user switches threads settles AFTER the switch, by which point both the\n // store and the current thread id already describe the NEW thread — the id is\n // the only durable way left to recognise the result as stale.\n const retiredToolCallIds = new Set<string>();\n\n const pending = computed<readonly ToolCall[]>(() => {\n // Client tools are only actionable after the run ends (the backend\n // signals this by ending the run WITHOUT emitting a ToolMessage result\n // for client tools).\n return selectPendingClientToolCalls({\n isLoading: store.isLoading(),\n toolCalls: store.toolCalls(),\n catalogNames: new Set(catalog().map((s) => s.name)),\n resolvedIds: resolvedIds(),\n });\n });\n\n function settleResult(id: string, result: ClientToolResult): void {\n // Mark as resolved first so pending() drops it immediately.\n resolvedIds.update((s) => new Set(s).add(id));\n\n // Cast rather than rely on discriminant narrowing: consumer apps that\n // compile this source with `strictNullChecks: false` don't narrow the\n // ClientToolResult union in a ternary.\n const ok = result.ok;\n const value = (result as { value: unknown }).value;\n const error = (result as { error: string }).error;\n\n // Write the outcome onto the LOCAL ToolCall (via the adapter's override\n // layer). The client tool DID produce a result client-side, so this is\n // semantically correct — and it freezes the transcript card: the mounted\n // ask component re-renders with its own emitted value as props and can\n // branch to a resolved/frozen state. Without this, the LOCAL tool call\n // never gets a result (only the backend ToolMessage does) so the card\n // stays interactive forever.\n store.applyClientResult(id, {\n result: ok ? value : { error },\n ...(ok ? {} : { error, status: 'error' as const }),\n });\n\n const content = ok\n ? safeStringify(value)\n : `Error: ${error}`;\n\n // The tool call belongs to a thread the user has already left, so there is\n // nowhere valid to send this result: the current thread has no matching\n // tool call, and the old thread is no longer the write target.\n if (retiredToolCallIds.has(id)) {\n console.warn(\n `Discarding client tool result for ${id}: its thread is no longer active.`,\n );\n return;\n }\n\n // Message shape: both `type` and `role` are set for compatibility —\n // the LangGraph server's add_messages coercion reads `role` (Python\n // side), while the bridge's local optimistic-message path reads `type`\n // (via toMessage's normalizeMessageType). This mirrors the human-message\n // shape used in buildSubmitUpdate (agent.fn.ts line 732).\n toolMessageBuffer.push({\n threadId: currentThreadIdFn?.() ?? null,\n message: {\n id: `client-tool-result-${id}`,\n type: 'tool',\n role: 'tool',\n tool_call_id: id,\n content,\n },\n });\n }\n\n /**\n * Returns a non-destructive snapshot of entries still valid for the thread a\n * write would land on right now. Captured entries remain staged, so\n * overlapping operations may carry the same deterministic message IDs.\n * Acknowledgment removes only the exact captured entries while the snapshot\n * generation is current. An entry stamped for another thread is dropped\n * rather than misdelivered.\n *\n * A null on either side means \"thread not tracked yet\" (no threadId option\n * and no run has reported one); those are kept, since there is no evidence of\n * a switch and dropping them would lose results on untracked transports.\n */\n function snapshotToolMessages(): StagedToolMessageBatch {\n const current = currentThreadIdFn?.() ?? null;\n for (let index = toolMessageBuffer.length - 1; index >= 0; index -= 1) {\n const entry = toolMessageBuffer[index];\n const stale =\n entry.threadId !== null && current !== null && entry.threadId !== current;\n if (stale) {\n console.warn(\n `Discarding a client tool result staged for thread ${entry.threadId}; ` +\n `the active thread is now ${current}.`,\n );\n toolMessageBuffer.splice(index, 1);\n }\n }\n\n const generation = bufferGeneration;\n const entries = [...toolMessageBuffer];\n const messages = entries.map(({ message }) => ({ ...message }));\n let acknowledged = false;\n\n return {\n generation,\n messages,\n acknowledge(): void {\n if (acknowledged || generation !== bufferGeneration) return;\n acknowledged = true;\n for (const entry of entries) {\n const index = toolMessageBuffer.indexOf(entry);\n if (index !== -1) toolMessageBuffer.splice(index, 1);\n }\n },\n };\n }\n\n /**\n * Persist one snapshot. Only that snapshot is acknowledged after persistence\n * succeeds; failure leaves its exact entries staged for retry or submit.\n */\n function runFlush(): Promise<void> {\n const batch = snapshotToolMessages();\n if (batch.messages.length === 0) return Promise.resolve();\n if (!persistFn) {\n return Promise.reject(\n new Error(\n 'Cannot flush staged client tool results. ' +\n 'Custom LangGraph transports using terminal client tools must implement updateState().',\n ),\n );\n }\n return persistFn(batch.messages)\n .then(() => {\n batch.acknowledge();\n })\n .catch((err: unknown) => {\n console.warn(\n `Client tool flush failed; ${batch.messages.length} result(s) remain staged for the next run.`,\n err,\n );\n });\n }\n\n const capability: LangGraphClientToolsCapability = {\n catalog,\n\n setCatalog(specs: readonly ClientToolSpec[]): void {\n catalog.set([...specs]);\n },\n\n pending,\n\n settle(id: string, result: ClientToolResult): void {\n settleResult(id, result);\n },\n\n snapshotToolMessages(): StagedToolMessageBatch {\n return snapshotToolMessages();\n },\n\n /**\n * Discard everything staged. Called when the active thread changes: a\n * ToolMessage only makes sense against the thread whose AIMessage produced\n * its tool_call_id, so carrying it over would poison the new thread.\n */\n clearStagedToolMessages(): void {\n // Retire the outgoing thread's tool calls so a handler that settles after\n // the switch is recognised as stale. Read the store BEFORE it resets —\n // agent.fn.ts calls this ahead of manager.switchThread for that reason.\n for (const toolCall of store.toolCalls()) retiredToolCallIds.add(toolCall.id);\n toolMessageBuffer.length = 0;\n // Invalidate every outstanding snapshot acknowledgment from the old thread.\n bufferGeneration += 1;\n },\n\n flush(): Promise<void> {\n // Only this method owns the queue tail. Results settled after an active\n // snapshot need their own write, and every caller must remain behind all\n // callers already queued. The chain terminates when a fresh snapshot is\n // empty.\n const queued = flushInFlight\n ? flushInFlight.then(() => runFlush(), () => runFlush())\n : runFlush();\n flushInFlight = queued;\n\n const clearTail = (): void => {\n if (flushInFlight === queued) flushInFlight = undefined;\n };\n // Both handlers return normally, so this bookkeeping branch cannot\n // create an unhandled rejection when the caller observes `queued`.\n void queued.then(clearTail, clearTail);\n return queued;\n },\n\n resolve(id: string, result: ClientToolResult): void {\n settleResult(id, result);\n // Issue a new run with a non-destructive snapshot. The exact batch is\n // acknowledged only when that continuation succeeds; failures retain it\n // for retry. Stable IDs make overlap with flush or submit safe under\n // LangGraph's add_messages reducer. `client_tools` keeps the full catalog\n // visible to the continuation.\n const batch = snapshotToolMessages();\n const toolPayload = {\n messages: batch.messages,\n client_tools: catalog(),\n };\n\n void submitFn(toolPayload, undefined, batch).then((outcome) => {\n if (outcome === 'success') batch.acknowledge();\n });\n },\n };\n\n return capability;\n}\n","// SPDX-License-Identifier: MIT\nimport {\n inject, DestroyRef, computed, effect,\n isSignal, signal, Signal,\n} from '@angular/core';\nimport { AGENT_CONFIG } from './agent.provider';\nimport type { AgentLifecycle } from './lifecycle';\nimport { AgentLifecycleRegistry } from './agent-lifecycle-registry';\nimport { toSignal, toObservable } from '@angular/core/rxjs-interop';\nimport {\n BehaviorSubject, Subject, of,\n throttleTime, asyncScheduler,\n} from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport type { Observable } from 'rxjs';\nimport type { BaseMessage, AIMessage as CoreAIMessage } from '@langchain/core/messages';\n\n/**\n * Wire-shape of a `RemoveMessage` instruction. LangGraph's `add_messages`\n * reducer (Python side) coerces incoming dicts via a strict check that\n * expects `role` + `content` keys; without them, the dict-to-Message\n * conversion throws and the whole `updateState` request 400s. Construct\n * the shape directly with the required keys so we get correct semantics\n * without importing the `RemoveMessage` class from `@langchain/core/messages`\n * (the class import pulls in the full BaseMessage hierarchy, ~30-50 kB,\n * which Cockpit's example-app bundle budget rejects).\n */\ntype RemoveMessageInstruction = {\n type: 'remove';\n role: 'remove';\n id: string;\n content: '';\n};\nimport type { Command, Interrupt, ToolCallWithResult } from '@langchain/langgraph-sdk';\nimport type { BagTemplate, InferBag } from '@langchain/langgraph-sdk';\nimport type {\n AgentEvent,\n AgentCheckpoint,\n AgentError,\n AgentInterrupt,\n AgentStatus,\n Message,\n Role,\n Subagent,\n ToolCall,\n ToolCallStatus,\n ContentBlock,\n AgentSubmitInput,\n AgentSubmitOptions,\n MessageDelivery,\n} from '@threadplane/chat';\nimport { staticDelivery } from '@threadplane/chat';\n\nimport {\n AgentOptions,\n LangGraphAgent,\n CustomStreamEvent,\n StreamSubjects,\n SubagentStreamRef,\n ResourceStatus,\n AgentQueue,\n LangGraphSubmitOptions,\n} from './agent.types';\nimport type { ThreadState, ToolProgress } from '@langchain/langgraph-sdk';\nimport type { MessageMetadata } from '@langchain/langgraph-sdk/ui';\nimport { createStreamManagerBridge } from './internals/stream-manager.bridge';\nimport { LANGGRAPH_CLIENT_OPTIONS, resolveClientOptions } from './client/client-options';\nimport { buildBranchTree } from './internals/branch-tree';\nimport { extractCitations } from './internals/extract-citations';\nimport {\n createClientToolsCapability,\n mergeA2uiClientCapabilities,\n mergeClientTools,\n mergeStagedToolMessages,\n} from './client-tools';\nimport type { ClientToolResultPatch, StagedToolMessageBatch } from './client-tools';\n\n/**\n * Walk LangGraph history (newest-first) and pair each AIMessage id with\n * the most recent checkpoint that contains it as the tail message in\n * `values.messages`.\n *\n * Implementation: iterate oldest → newest (i.e. reverse the input array)\n * so later writes overwrite earlier ones; the final map has each\n * AIMessage paired with the newest containing checkpoint where it is\n * still the tail. Checkpoints with no AIMessage in scope are skipped.\n * Checkpoints with no checkpoint_id are skipped.\n */\nexport function computeMessageCheckpoints(\n history: ReadonlyArray<ThreadState<unknown>>,\n): ReadonlyMap<string, string> {\n const out = new Map<string, string>();\n for (let i = history.length - 1; i >= 0; i--) {\n const state = history[i];\n const cpId = state.checkpoint?.checkpoint_id;\n if (typeof cpId !== 'string' || cpId.length === 0) continue;\n const values = state.values as { messages?: unknown[] } | undefined;\n const msgs = Array.isArray(values?.messages) ? values.messages : [];\n for (let j = msgs.length - 1; j >= 0; j--) {\n const m = msgs[j] as { id?: string; _getType?: () => string; type?: string };\n const type = typeof m._getType === 'function' ? m._getType() : m.type;\n if (type === 'ai' && typeof m.id === 'string') {\n out.set(m.id, cpId);\n break;\n }\n }\n }\n return out;\n}\n\n/**\n * Internal factory that constructs a LangGraph-backed Angular agent.\n *\n * @internal Consumers do not call this directly. Configure the adapter with\n * `provideAgent({...})` in `app.config.ts` (or a component's `providers`), then\n * retrieve the agent with `injectAgent()`. This factory is the construction\n * logic invoked by `provideAgent`'s DI factory.\n *\n * Must run within an Angular injection context. Returns a unified\n * {@link LangGraphAgent} whose properties are Angular Signals that update\n * in real time as LangGraph streams messages, values, tool calls, interrupts,\n * subagent state, and checkpoint history.\n *\n * @typeParam T - The state shape returned by the agent\n * @typeParam Bag - Optional bag template for typed interrupts and submit payloads\n * @param options - Configuration for the LangGraph agent\n * @returns A {@link LangGraphAgent} with reactive signals and action methods\n *\n * @example\n * ```typescript\n * // app.config.ts — configure once\n * providers: [\n * provideAgent({\n * assistantId: 'chat',\n * apiUrl: 'http://localhost:2024',\n * threadId: signal(savedThreadId),\n * onThreadId: (id) => localStorage.setItem('threadId', id),\n * }),\n * ];\n *\n * // component — retrieve from DI\n * const chat = injectAgent();\n *\n * // Access signals in template\n * // chat.messages(), chat.status(), chat.error()\n * ```\n */\nexport function agent<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: AgentOptions<T, InferBag<T, Bag>>,\n): LangGraphAgent<T, InferBag<T, Bag>> {\n // Injection context required\n const destroyRef = inject(DestroyRef);\n const globalConfig = inject(AGENT_CONFIG, { optional: true });\n const sharedClientOptions = inject(LANGGRAPH_CLIENT_OPTIONS, { optional: true });\n const destroy$ = new Subject<void>();\n destroyRef.onDestroy(() => { destroy$.next(); destroy$.complete(); });\n\n // Merge: call-site options take precedence over global provider config\n const apiUrl = options.apiUrl ?? globalConfig?.apiUrl ?? '';\n const transport = options.transport ?? globalConfig?.transport;\n // clientOptions precedence: agent({...}) call-site → provideAgent config →\n // app-wide LANGGRAPH_CLIENT_OPTIONS token → SDK default.\n const clientOptions = resolveClientOptions(\n options.clientOptions,\n globalConfig?.clientOptions,\n sharedClientOptions,\n );\n\n const init = (options.initialValues ?? {}) as T;\n\n // All subjects created before the bridge\n const status$ = new BehaviorSubject<ResourceStatus>(ResourceStatus.Idle);\n const values$ = new BehaviorSubject<T>(init);\n const messages$ = new BehaviorSubject<BaseMessage[]>([]);\n const error$ = new BehaviorSubject<unknown>(undefined);\n const interrupt$ = new BehaviorSubject<Interrupt<InferBag<T, Bag>['InterruptType']> | undefined>(undefined);\n const interrupts$ = new BehaviorSubject<Interrupt<InferBag<T, Bag>['InterruptType']>[]>([]);\n const branch$ = new BehaviorSubject<string>('');\n const history$ = new BehaviorSubject<ThreadState<T>[]>([]);\n const isThreadLoading$ = new BehaviorSubject<boolean>(false);\n const toolProgress$ = new BehaviorSubject<ToolProgress[]>([]);\n const toolCalls$ = new BehaviorSubject<ToolCallWithResult[]>([]);\n const messageMetadata$ = new BehaviorSubject<Map<string, MessageMetadata<Record<string, unknown>>>>(new Map());\n const subagents$ = new BehaviorSubject<Map<string, SubagentStreamRef>>(new Map());\n const queue$ = new BehaviorSubject<AgentQueue>({\n entries: [],\n size: 0,\n cancel: async () => false,\n clear: async () => undefined,\n });\n const custom$ = new BehaviorSubject<CustomStreamEvent[]>([]);\n const hasValue$ = new BehaviorSubject<boolean>(false);\n\n // Forward reference. The client-tools capability is built much further down\n // (it needs `manager`, which needs these subjects), but the thread-change\n // seam lives here. A holder keeps the binding itself a `const` while its\n // member is filled in later.\n const clientToolStaging: { clear?: () => void } = {};\n let retryableToolMessageBatch: StagedToolMessageBatch | undefined;\n\n function resetDerivedThreadState(): void {\n status$.next(ResourceStatus.Idle);\n error$.next(undefined);\n hasValue$.next(false);\n // Staged client-tool results belong to the thread whose AIMessage produced\n // their tool_call_ids. Carrying them into a different thread would prepend\n // a ToolMessage that matches no tool call there — a 400 on that turn.\n // Runs BEFORE manager.switchThread resets the store, so the capability can\n // still read the outgoing thread's tool calls.\n clientToolStaging.clear?.();\n }\n\n // Track hasValue — becomes true once values or messages arrive\n values$.pipe(takeUntil(destroy$)).subscribe(v => {\n if (v != null && Object.keys(v as object).length > 0) hasValue$.next(true);\n });\n messages$.pipe(takeUntil(destroy$)).subscribe(m => { if (m.length > 0) hasValue$.next(true); });\n\n const subjects: StreamSubjects<T, InferBag<T, Bag>> = {\n status$, values$, messages$, error$,\n interrupt$, interrupts$, branch$, history$,\n isThreadLoading$, toolProgress$, toolCalls$, messageMetadata$, subagents$, queue$, custom$,\n };\n\n // threadId$ — resolved before bridge creation (injection context required for toObservable)\n const threadId$ = isSignal(options.threadId)\n ? toObservable(options.threadId as Signal<string | null>)\n : of((options.threadId as string | null | undefined) ?? null);\n\n let hasSeenThreadId = false;\n let lastThreadId: string | null = null;\n threadId$.pipe(takeUntil(destroy$)).subscribe((id) => {\n if (hasSeenThreadId && lastThreadId !== id) {\n resetDerivedThreadState();\n }\n hasSeenThreadId = true;\n lastThreadId = id;\n });\n\n // ── Lifecycle instrumentation ─────────────────────────────────────────────\n // Eight signals tracking key transitions for telemetry/observability.\n // All reset together via resetLifecycle(); see switchThread() below.\n const lcStreamStartedAt = signal<number | null>(null);\n const lcStreamErrorAt = signal<{ at: number; classification: string } | null>(null);\n const lcInterruptReceivedAt = signal<number | null>(null);\n const lcInterruptResolvedAt = signal<number | null>(null);\n const lcThreadCreatedAt = signal<number | null>(null);\n const lcThreadPersistedAt = signal<number | null>(null);\n const lcToolCallStartedAt = signal<number | null>(null);\n const lcToolCallCompletedAt = signal<number | null>(null);\n\n const lifecycle: AgentLifecycle = {\n streamStartedAt: lcStreamStartedAt,\n streamErrorAt: lcStreamErrorAt,\n interruptReceivedAt: lcInterruptReceivedAt,\n interruptResolvedAt: lcInterruptResolvedAt,\n threadCreatedAt: lcThreadCreatedAt,\n threadPersistedAt: lcThreadPersistedAt,\n toolCallStartedAt: lcToolCallStartedAt,\n toolCallCompletedAt: lcToolCallCompletedAt,\n };\n\n // Register with optional lifecycle registry. External instrumentation\n // (e.g. cockpit-telemetry) provides AgentLifecycleRegistry to receive\n // per-agent lifecycles created within this injection context.\n const lifecycleRegistry = inject(AgentLifecycleRegistry, { optional: true });\n lifecycleRegistry?.register(lifecycle);\n\n function resetLifecycle(): void {\n lcStreamStartedAt.set(null);\n lcStreamErrorAt.set(null);\n lcInterruptReceivedAt.set(null);\n lcInterruptResolvedAt.set(null);\n lcThreadCreatedAt.set(null);\n lcThreadPersistedAt.set(null);\n lcToolCallStartedAt.set(null);\n lcToolCallCompletedAt.set(null);\n }\n\n // First chunk: first values$ or messages$ emission with content.\n values$.pipe(takeUntil(destroy$)).subscribe(v => {\n if (lcStreamStartedAt() === null && v != null && Object.keys(v as object).length > 0) {\n lcStreamStartedAt.set(Date.now());\n }\n });\n messages$.pipe(takeUntil(destroy$)).subscribe(m => {\n if (lcStreamStartedAt() === null && m.length > 0) lcStreamStartedAt.set(Date.now());\n });\n // Stream error: capture timestamp + classification (Error name or 'unknown').\n error$.pipe(takeUntil(destroy$)).subscribe(e => {\n if (e == null) return;\n const classification = e instanceof Error ? e.name : typeof e === 'string' ? 'string' : 'unknown';\n lcStreamErrorAt.set({ at: Date.now(), classification });\n });\n // First non-null interrupt within this thread.\n interrupt$.pipe(takeUntil(destroy$)).subscribe(ix => {\n if (ix != null && lcInterruptReceivedAt() === null) lcInterruptReceivedAt.set(Date.now());\n });\n // First tool call append; first completed/error result transition.\n const seenToolCallStates = new Map<string, string>();\n toolCalls$.pipe(takeUntil(destroy$)).subscribe(tcs => {\n if (tcs.length > 0 && lcToolCallStartedAt() === null) lcToolCallStartedAt.set(Date.now());\n if (lcToolCallCompletedAt() !== null) return;\n for (const tc of tcs) {\n const prev = seenToolCallStates.get(tc.id);\n if (prev !== tc.state && (tc.state === 'completed' || tc.state === 'error')) {\n lcToolCallCompletedAt.set(Date.now());\n seenToolCallStates.set(tc.id, tc.state);\n break;\n }\n seenToolCallStates.set(tc.id, tc.state);\n }\n });\n // Thread restored from server: history$ populates with content for a\n // pre-existing threadId.\n history$.pipe(takeUntil(destroy$)).subscribe(h => {\n if (h.length > 0 && lcThreadPersistedAt() === null) lcThreadPersistedAt.set(Date.now());\n });\n\n const manager = createStreamManagerBridge({\n options: { ...options, apiUrl, transport, clientOptions },\n subjects,\n threadId$,\n destroy$: destroy$.asObservable(),\n });\n\n // Throttle helper — default 16ms (~60fps) to batch SSE token updates into\n // at most one signal update per frame, preventing change detection storms.\n const ms = typeof options.throttle === 'number' ? options.throttle : 16;\n const maybeThrottle = <V>(obs: BehaviorSubject<V>) =>\n ms > 0\n ? obs.pipe(throttleTime(ms, asyncScheduler, { leading: true, trailing: true }))\n : obs.asObservable();\n\n // Convert to Angular Signals (must happen in injection context)\n const value = toSignal(maybeThrottle(values$), { initialValue: init });\n // No throttle on messages$: we need every token emission to propagate to\n // Angular so streaming markdown actually streams. The bridge already\n // batches per-tuple at the SDK level; further throttling at the signal\n // boundary collapses tokens together and breaks visible token-by-token\n // rendering. Same-frame multiple emissions are coalesced by Angular's\n // CD anyway.\n const rawMessages = toSignal(messages$, { initialValue: [] as BaseMessage[] });\n const statusSig = toSignal(status$, { initialValue: ResourceStatus.Idle });\n // Cast justified: error$ accepts only AgentError | undefined (bridge catch normalizes all errors via\n // toAgentError before calling next(); resetDerivedThreadState passes undefined). The BehaviorSubject\n // is typed unknown to satisfy StreamSubjects<unknown> invariance at the subjects-bag assignment.\n const errorSig = toSignal(error$, { initialValue: undefined }) as Signal<AgentError | undefined>;\n const hasValueSig = toSignal(hasValue$, { initialValue: false });\n const interruptSig = toSignal(interrupt$, { initialValue: undefined });\n const interruptsSig= toSignal(interrupts$, { initialValue: [] });\n const branchSig = toSignal(branch$, { initialValue: '' });\n const historySig = toSignal(history$, { initialValue: [] });\n const threadLoadSig= toSignal(isThreadLoading$, { initialValue: false });\n const toolProgSig = toSignal(toolProgress$, { initialValue: [] });\n const rawToolCalls = toSignal(toolCalls$, { initialValue: [] });\n const subagentsSig = toSignal(subagents$, { initialValue: new Map<string, SubagentStreamRef>() });\n const queueSig = toSignal(queue$, { initialValue: queue$.value });\n const customSig = toSignal(custom$, { initialValue: [] as CustomStreamEvent[] });\n\n const isLoading = computed(() => statusSig() === ResourceStatus.Loading);\n const activeSubagents = computed(() =>\n [...subagentsSig().values()].filter(s => s.status() === 'running')\n );\n\n // ── Runtime-neutral projections ───────────────────────────────────────────\n\n // Project BaseMessage → Message on every recompute. We deliberately do\n // NOT cache: the LangGraph SDK mutates the same AIMessage instance in\n // place during token streaming (appends content to the same object), so\n // any identity-based cache returns stale projections and Angular's\n // `@let content = messageContent(message)` short-circuits — DOM never\n // updates per token. DOM stability is provided by `track message.id`\n // in chat-message-list, not by Message identity.\n const messagesNeutral = computed<Message[]>(() => {\n manager.deliveryRevision();\n return rawMessages().map((m) =>\n toMessage(m, manager.getReasoningDurationMs, manager.getMessageDelivery)\n );\n });\n\n // Client-tool resolutions written client-side. The raw `toolCalls$` stream\n // (and thus `rawToolCalls`) only ever carries backend results — a resolved\n // client tool (`ask`/`view`) never receives a backend ToolMessage on its\n // LOCAL call. These overrides layer the client-side outcome over the raw\n // projection so the transcript card can freeze (see chat-tool-views\n // toToolViewSpec, which spreads `result` into the mounted component's props).\n const clientResultOverrides = signal<ReadonlyMap<string, ClientToolResultPatch>>(new Map());\n\n const toolCallsNeutral = computed<ToolCall[]>(() => {\n const overrides = clientResultOverrides();\n return rawToolCalls().map((tc) => {\n const neutral = toToolCall(tc);\n const patch = overrides.get(neutral.id);\n return patch ? { ...neutral, ...patch } : neutral;\n });\n });\n\n const statusNeutral = computed<AgentStatus>(() => mapStatus(statusSig()));\n\n const stateNeutral = computed<Record<string, unknown>>(() => {\n const v = value();\n return v && typeof v === 'object' ? (v as Record<string, unknown>) : {};\n });\n\n const interruptNeutral = computed<AgentInterrupt | undefined>(() => {\n const ix = interruptSig();\n return ix ? toInterrupt(ix) : undefined;\n });\n\n const subagentsNeutral = computed<Map<string, Subagent>>(() => {\n const out = new Map<string, Subagent>();\n subagentsSig().forEach((sa, key) => out.set(key, toSubagent(sa, manager)));\n return out;\n });\n\n const historyNeutral = computed<AgentCheckpoint[]>(() =>\n historySig().map(toCheckpoint),\n );\n const messageCheckpointsSig = computed<ReadonlyMap<string, string>>(() =>\n computeMessageCheckpoints(historySig() as ThreadState<unknown>[]),\n );\n const experimentalBranchTree = computed(() =>\n buildBranchTree(historySig() as ThreadState<T>[]),\n );\n\n const events$ = buildEvents$(customSig);\n\n // ── Client tools capability ──────────────────────────────────────────────\n // The capability takes a direct reference to manager.submit so it can issue\n // follow-up runs (resolve) without going through the full submit() wrapper.\n // The catalog is injected into every outbound payload via mergeClientTools()\n // in the submit wrapper below and in the resolve path inside the capability.\n //\n // flush() needs a durable write that does NOT start a run. The bridge's\n // updateState() silently no-ops when the transport has no updateState, so\n // only supply a persist function when the effective transport supports it —\n // an omitted transport means the bridge builds a FetchStreamTransport, which\n // does. When persistFn is undefined, a non-empty flush() rejects while the\n // results stay staged; an ordinary non-null submit remains their in-memory\n // fallback path.\n const canPersistToolMessages = !transport || typeof transport.updateState === 'function';\n const clientToolsCap = createClientToolsCapability(\n (payload, opts, batch) => {\n retryableToolMessageBatch = batch;\n return manager.submit(payload, opts);\n },\n {\n toolCalls: toolCallsNeutral,\n isLoading,\n applyClientResult: (id, patch) =>\n clientResultOverrides.update((m) => new Map(m).set(id, patch)),\n },\n canPersistToolMessages\n ? async (messages) => {\n // Throw rather than let the bridge no-op: without a thread there is\n // nothing to write to, and flush() must keep the buffer staged.\n if (!manager.currentThreadId) {\n throw new Error('no threadId for client tool flush');\n }\n // No asNode: add_messages appends the ToolMessages and the graph's\n // resume point is left untouched, so no run is started.\n await manager.updateState({ messages: [...messages] });\n }\n : undefined,\n // Stamps each staged result with the thread it was settled on, so a write\n // can never land on a thread the user has since moved to.\n () => manager.currentThreadId,\n );\n clientToolStaging.clear = () => {\n retryableToolMessageBatch = undefined;\n clientToolsCap.clearStagedToolMessages();\n };\n\n async function resubmitWithToolRecovery(): Promise<void> {\n const batch = retryableToolMessageBatch;\n const outcome = await manager.resubmitLast();\n if (outcome === 'success') batch?.acknowledge();\n }\n\n return {\n // ── Runtime-neutral surface (AgentWithHistory) ────────────────────────\n messages: messagesNeutral,\n status: statusNeutral,\n isLoading,\n error: errorSig,\n toolCalls: toolCallsNeutral,\n state: stateNeutral as Signal<T>,\n interrupt: interruptNeutral,\n subagents: subagentsNeutral,\n events$,\n history: historyNeutral,\n messageCheckpoints: messageCheckpointsSig,\n submit: async (input: AgentSubmitInput | null | undefined, opts?: AgentSubmitOptions & LangGraphSubmitOptions) => {\n // Lifecycle: first submit with no existing threadId → thread create.\n if (lcThreadCreatedAt() === null && lastThreadId == null) {\n lcThreadCreatedAt.set(Date.now());\n }\n // Lifecycle: any resume submit marks an interrupt resolution.\n if (input?.resume !== undefined || opts?.resume !== undefined) {\n lcInterruptResolvedAt.set(Date.now());\n }\n const request = buildSubmitRequest(input, opts);\n // Thread the client-tools catalog into every outbound payload so the\n // backend middleware can merge them into the model's tool list. Null\n // payloads (regenerate re-runs, command resumes) are left unchanged.\n //\n // Snapshot results settled but not yet durable (flush unavailable or a\n // prior flush failed) so they ride along without being forgotten. The\n // exact snapshot is acknowledged only when this operation succeeds;\n // overlaps may safely carry the same deterministic message IDs. A null\n // payload cannot carry results, so it leaves staging unchanged.\n const batch = request.payload === null || request.payload === undefined\n ? undefined\n : clientToolsCap.snapshotToolMessages();\n const staged = batch?.messages ?? [];\n const withStaged = staged.length > 0\n ? mergeStagedToolMessages(request.payload, staged)\n : request.payload;\n const payload = mergeA2uiClientCapabilities(\n mergeClientTools(withStaged, clientToolsCap.catalog()),\n options.a2uiClientCapabilities,\n );\n const createsQueuedRun =\n request.options?.multitaskStrategy === 'enqueue' && isLoading();\n if (!createsQueuedRun) {\n retryableToolMessageBatch = batch;\n }\n const outcome = await manager.submit(payload, request.options);\n if (outcome === 'success') batch?.acknowledge();\n },\n stop: () => manager.stop(),\n\n retry: async () => {\n if (isLoading()) return; // no-op while a run is in flight\n error$.next(undefined); // clear the error before re-running\n await resubmitWithToolRecovery();\n },\n\n clientTools: clientToolsCap,\n\n regenerate: async (assistantMessageIndex: number): Promise<void> => {\n if (isLoading()) {\n throw new Error('Cannot regenerate while agent is loading another response');\n }\n const msgs = messagesNeutral();\n const target = msgs[assistantMessageIndex];\n if (!target || target.role !== 'assistant') {\n throw new Error(`Message at index ${assistantMessageIndex} is not an assistant message`);\n }\n\n // Find the user message immediately preceding the target assistant message.\n const userIdx = msgs\n .slice(0, assistantMessageIndex)\n .map((m, i) => ({ m, i }))\n .reverse()\n .find(({ m }) => m.role === 'user')?.i;\n if (userIdx === undefined) {\n throw new Error('No user message found before the target assistant message');\n }\n\n // Snapshot the raw BaseMessages that will be REMOVED (everything after userIdx).\n const rawToRemove = messages$.value.slice(userIdx + 1);\n\n // Truncate local buffer INCLUSIVE of the user message. The computed\n // messagesNeutral signal immediately reflects this — user message is\n // preserved in the UI while the new response streams in.\n messages$.next(messages$.value.slice(0, userIdx + 1));\n\n // Build RemoveMessage wire-shape instructions for server-side rollback.\n // LangGraph's add_messages reducer recognises `{ type: 'remove', id }`\n // and removes those entries from the thread state — ensuring the\n // runtime re-runs against the same trimmed state rather than appending\n // new messages on top.\n const removeList: RemoveMessageInstruction[] = rawToRemove\n .map(m => {\n const raw = m as unknown as Record<string, unknown>;\n const id = typeof raw['id'] === 'string' ? raw['id'] : undefined;\n return id\n ? { type: 'remove' as const, role: 'remove' as const, id, content: '' as const }\n : null;\n })\n .filter((rm): rm is RemoveMessageInstruction => rm !== null);\n\n // RemoveMessage rollback + reposition the graph to the entry node\n // via `as_node: '__start__'`. After the original run, the thread is\n // at `__end__` with `next: []` — submitting `null` would be a no-op\n // because there is nothing pending to execute. Setting `asNode` to\n // the start node tells LangGraph to treat the update as if `__start__`\n // had just produced the values, so the next pull resumes at the entry\n // node and runs `generate` against the rolled-back state.\n //\n // We always pass `asNode` even when removeList is empty (rare, but\n // possible if the assistant message had no id) so the regenerate\n // submit below still runs the graph.\n await manager.updateState(\n { messages: removeList },\n { asNode: '__start__' },\n );\n\n // Re-run the graph with no new input. With the thread now repositioned\n // at `__start__`, this resumes at the entry node and produces a fresh\n // assistant message — the trailing user message becomes the active\n // prompt without being re-appended.\n retryableToolMessageBatch = undefined;\n await manager.submit(null, undefined);\n },\n\n // ── Raw LangGraph signals ─────────────────────────────────────────────\n langGraphMessages: rawMessages as Signal<BaseMessage[]>,\n langGraphInterrupts: interruptsSig,\n langGraphToolCalls: rawToolCalls,\n langGraphHistory: historySig,\n experimentalBranchTree,\n\n // ── Other LangGraph-specific fields ──────────────────────────────────\n value: value as Signal<T>,\n hasValue: hasValueSig,\n reload: () => {\n void resubmitWithToolRecovery();\n },\n toolProgress: toolProgSig,\n queue: queueSig,\n activeSubagents,\n getSubagent: (toolCallId) => subagentsSig().get(toolCallId),\n getSubagentsByType: (type) =>\n [...subagentsSig().values()].filter(sa => sa.name === type),\n getSubagentsByMessage: (msg) => {\n const ids = getToolCallIds(msg);\n const subagents = subagentsSig();\n return ids\n .map(id => subagents.get(id))\n .filter((subagent): subagent is SubagentStreamRef => subagent != null);\n },\n customEvents: customSig,\n branch: branchSig,\n setBranch: (b) => branch$.next(b),\n isThreadLoading: threadLoadSig,\n switchThread: (id) => {\n resetDerivedThreadState();\n resetLifecycle();\n seenToolCallStates.clear();\n manager.switchThread(id);\n },\n lifecycle,\n joinStream: (id, last) => manager.joinStream(id, last),\n getMessagesMetadata: (msg, idx) => {\n const id = (msg as unknown as Record<string, unknown>)['id'];\n const key = id != null ? String(id) : idx != null ? String(idx) : undefined;\n return key ? messageMetadata$.value.get(key) : undefined;\n },\n getToolCalls: (msg) => {\n const id = (msg as unknown as Record<string, unknown>)['id'];\n return id == null\n ? []\n : toolCalls$.value.filter(tc => (tc.aiMessage as unknown as Record<string, unknown>)['id'] === id);\n },\n };\n}\n\n// ── Private translation helpers (moved from to-agent.ts) ─────────────────────\n\n/**\n * Build an Observable<AgentEvent> that bridges LangGraph's\n * `Signal<CustomStreamEvent[]>` (append-only array) into a stream of newly\n * emitted events. Each effect firing compares against a cursor tracking the\n * previously-seen length and emits only the tail slice.\n */\nfunction buildEvents$(customSig: Signal<CustomStreamEvent[]>): Observable<AgentEvent> {\n const subject = new Subject<AgentEvent>();\n let seen = 0;\n effect(() => {\n const all = customSig();\n if (all.length < seen) {\n // Stream reset (new session, thread switch, etc.). Rewind cursor.\n seen = 0;\n }\n for (let i = seen; i < all.length; i++) {\n subject.next(toAgentEvent(all[i]));\n }\n seen = all.length;\n });\n return subject.asObservable();\n}\n\nfunction toAgentEvent(e: CustomStreamEvent): AgentEvent {\n if (e.name === 'state_update' && isRecord(e.data)) {\n return { type: 'state_update', data: e.data };\n }\n return { type: 'custom', name: e.name, data: e.data };\n}\n\nfunction mapStatus(s: ResourceStatus): AgentStatus {\n switch (s) {\n case ResourceStatus.Error: return 'error';\n case ResourceStatus.Loading:\n case ResourceStatus.Reloading:\n return 'running';\n default:\n return 'idle';\n }\n}\n\nfunction toMessage(\n m: BaseMessage,\n getReasoningDurationMs?: (id: string) => number | undefined,\n getDelivery?: (id: string) => MessageDelivery,\n): Message {\n const raw = m as unknown as Record<string, unknown>;\n const typeVal = typeof m._getType === 'function'\n ? m._getType()\n : (raw['type'] as string | undefined) ?? 'ai';\n const role: Role =\n typeVal === 'human' ? 'user' :\n typeVal === 'tool' ? 'tool' :\n typeVal === 'system' ? 'system' :\n 'assistant';\n const id = (m.id as string | undefined) ?? (raw['id'] as string | undefined) ?? randomId();\n const reasoning = typeof raw['reasoning'] === 'string' && (raw['reasoning'] as string).length > 0\n ? (raw['reasoning'] as string)\n : undefined;\n const reasoningDurationMs = reasoning && getReasoningDurationMs\n ? getReasoningDurationMs(id)\n : undefined;\n const result: Message = {\n id,\n role,\n delivery: getDelivery?.(id) ?? staticDelivery(id),\n content: extractTextContent(m.content),\n toolCallId: raw['tool_call_id'] as string | undefined,\n name: raw['name'] as string | undefined,\n reasoning,\n reasoningDurationMs,\n extra: raw,\n };\n const citations = extractCitations(raw as { additional_kwargs?: Record<string, unknown> });\n if (citations) result.citations = citations;\n if (role === 'assistant') {\n const tcIds = getToolCallIds(m as CoreAIMessage);\n if (tcIds.length > 0) result.toolCallIds = tcIds;\n }\n return result;\n}\n\n/**\n * Extract user-visible text from a `BaseMessage.content` value.\n *\n * LangChain's `BaseMessage.content` is `string | MessageContentComplex[]`.\n * Reasoning-capable models (OpenAI gpt-5/o-series, Anthropic) emit complex\n * arrays of typed blocks: `{type: 'text', text}`, `{type: 'reasoning', ...}`,\n * tool-use blocks, etc. We render only the visible text portions and skip\n * anything else. JSON-stringifying the whole array (the previous behaviour)\n * would dump raw `[{\"type\":\"text\",...}]` into the chat bubble.\n */\nfunction extractTextContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (typeof block === 'string') {\n out += block;\n continue;\n }\n if (!isRecord(block)) continue;\n const t = block['type'];\n // Common text-bearing block shapes across providers.\n if (t === 'text' || t === 'output_text' || t === undefined) {\n const text = block['text'];\n if (typeof text === 'string') out += text;\n }\n // Skip reasoning, tool_use, image, etc. — not chat-bubble content.\n }\n return out;\n}\n\nfunction toToolCall(tc: ToolCallWithResult): ToolCall {\n const stateMap: Record<string, ToolCallStatus> = {\n pending: 'pending',\n completed: 'complete',\n error: 'error',\n };\n const status: ToolCallStatus = stateMap[tc.state] ?? 'running';\n const result = tc.result as (Record<string, unknown> | undefined);\n return {\n id: tc.id,\n name: tc.call.name,\n args: tc.call.args,\n status,\n result: result?.['content'],\n error: tc.state === 'error' ? result?.['content'] : undefined,\n };\n}\n\nfunction toInterrupt(ix: Interrupt<unknown>): AgentInterrupt {\n const raw = ix as unknown as Record<string, unknown>;\n return {\n id: (raw['id'] as string | undefined) ?? randomId(),\n value: raw['value'] ?? ix,\n resumable: true,\n };\n}\n\nfunction toSubagent(\n sa: SubagentStreamRef,\n manager: ReturnType<typeof createStreamManagerBridge>,\n): Subagent {\n return {\n toolCallId: sa.toolCallId,\n name: sa.name,\n status: sa.status,\n messages: computed(() => {\n manager.deliveryRevision();\n return sa.messages().map((m) =>\n toMessage(\n m,\n undefined,\n () => manager.getSubagentMessageDelivery(sa.toolCallId, m),\n )\n );\n }) as Signal<Message[]>,\n state: sa.values as Signal<Record<string, unknown>>,\n };\n}\n\nfunction getToolCallIds(msg: CoreAIMessage): string[] {\n const raw = msg as unknown as Record<string, unknown>;\n const toolCalls = raw['tool_calls'];\n if (!Array.isArray(toolCalls)) return [];\n return toolCalls\n .map(toolCall => isRecord(toolCall) && typeof toolCall['id'] === 'string' ? toolCall['id'] : undefined)\n .filter((id): id is string => id != null);\n}\n\nfunction buildSubmitRequest(\n input: AgentSubmitInput | null | undefined,\n opts?: AgentSubmitOptions & LangGraphSubmitOptions,\n): { payload: unknown; options?: AgentSubmitOptions & LangGraphSubmitOptions } {\n return {\n payload: buildSubmitPayload(input),\n options: normalizeSubmitOptions(input, opts),\n };\n}\n\nfunction buildSubmitPayload(input: AgentSubmitInput | null | undefined): unknown {\n if (input == null) return null;\n if (input.resume !== undefined) return null;\n return buildSubmitUpdate(input) ?? {};\n}\n\nfunction normalizeSubmitOptions(\n input: AgentSubmitInput | null | undefined,\n opts?: AgentSubmitOptions & LangGraphSubmitOptions,\n): (AgentSubmitOptions & LangGraphSubmitOptions) | undefined {\n const inputResume = input?.resume;\n const optionResume = opts?.resume;\n const resume = inputResume !== undefined ? inputResume : optionResume;\n if (resume === undefined) return opts;\n\n const next = { ...(opts ?? {}) };\n delete next.resume;\n const command = next.command;\n const update = buildSubmitUpdate(input);\n const commandUpdate = mergeCommandUpdate(command?.update, update);\n return {\n ...next,\n command: {\n ...command,\n resume,\n ...(commandUpdate === undefined ? {} : { update: commandUpdate }),\n },\n };\n}\n\nfunction buildSubmitUpdate(input: AgentSubmitInput | null | undefined): Record<string, unknown> | undefined {\n if (input == null) return undefined;\n if (input.message !== undefined) {\n const content = typeof input.message === 'string'\n ? input.message\n : input.message.map((b: ContentBlock) => (b.type === 'text' ? b.text : JSON.stringify(b))).join('');\n // `type: 'human'` is what `toMessage()` reads via `_getType` || raw['type'];\n // `role: 'human'` is what the LangGraph server expects in submit payloads.\n // Include both so the optimistic local copy projects as a 'user' bubble\n // (otherwise toMessage falls through to the 'ai' default and renders the\n // user's question as an assistant message).\n return { messages: [{ type: 'human', role: 'human', content }], ...(input.state ?? {}) };\n }\n return input.state;\n}\n\nfunction mergeCommandUpdate(\n existing: Command['update'] | undefined,\n update: Record<string, unknown> | undefined,\n): Command['update'] | undefined {\n if (update === undefined) return existing;\n if (existing == null) return update;\n if (isRecord(existing)) return { ...existing, ...update };\n if (Array.isArray(existing)) return [...existing, ...Object.entries(update)];\n return update;\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2);\n}\n\nfunction toCheckpoint(state: ThreadState<unknown>): AgentCheckpoint {\n return {\n id: state.checkpoint?.checkpoint_id ?? undefined,\n label: state.next?.[0] ?? undefined,\n values: isRecord(state.values) ? state.values : {},\n };\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken, inject, type Provider, type Signal } from '@angular/core';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { BagTemplate } from '@langchain/langgraph-sdk';\nimport type { AgentRef, AgentRuntimeTelemetrySink } from '@threadplane/chat';\nimport { agent } from './agent.fn';\nimport type {\n AgentTransport,\n LangGraphAgent,\n LangGraphClientOptions,\n} from './agent.types';\n\n/**\n * Configuration for an agent instance.\n * Combines connection defaults with per-component options so the\n * agent can be constructed once at provider time and injected\n * everywhere it is needed.\n */\n// The second generic mirrors AgentOptions so consumers can pin a Bag\n// template; it is currently unused inside this shape.\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface AgentConfig<\n T = Record<string, unknown>,\n _Bag extends BagTemplate = BagTemplate,\n> {\n /** Base URL of the LangGraph Platform API (e.g., `'http://localhost:2024'`). */\n apiUrl?: string;\n /** Agent or graph identifier on the LangGraph platform. */\n assistantId?: string;\n /** Thread ID to connect to. Pass a Signal for reactive thread switching. */\n threadId?: Signal<string | null> | string | null;\n /** Called when a new thread is auto-created by the transport. */\n onThreadId?: (id: string) => void;\n /** Initial state values before the first stream response arrives. */\n initialValues?: Partial<T>;\n /** Throttle signal updates in milliseconds. `false` to disable. */\n throttle?: number | false;\n /** Custom message deserializer for non-standard message formats. */\n toMessage?: (msg: unknown) => BaseMessage;\n /** Custom transport. Defaults to {@link FetchStreamTransport}. */\n transport?: AgentTransport;\n /** Tuning options for the default transport's LangGraph SDK client (e.g. retry budget). */\n clientOptions?: LangGraphClientOptions;\n /** Optional app-owned telemetry sink. No telemetry is emitted unless this is provided. */\n telemetry?: AgentRuntimeTelemetrySink | false;\n /** When true, subagent messages are filtered from the main messages signal. */\n filterSubagentMessages?: boolean;\n /** Tool names that indicate a subagent invocation. */\n subagentToolNames?: string[];\n /**\n * LangGraph node names whose `messages-tuple` LLM chunks should be projected\n * into the main chat transcript. Omit to accept all top-level message chunks.\n */\n transcriptNodeNames?: string[];\n}\n\n/**\n * @internal — exported only so the legacy in-tree `agent({...})` factory (and\n * its tests) can read provider-supplied defaults. Not part of the public API;\n * consumers should construct config inline at `provideAgent({...})`.\n */\nexport const AGENT_CONFIG = new InjectionToken<AgentConfig>('AGENT_CONFIG');\n\n/**\n * @internal — exported for spec access only. Consumers must use `injectAgent()`.\n */\nexport const AGENT = new InjectionToken<LangGraphAgent>('AGENT');\n\n/** @internal — shared factory that reads AGENT_CONFIG and constructs the singleton. */\nfunction agentFactory<T>(): LangGraphAgent<T> {\n // useFactory runs in an injection context, so the legacy `agent()`\n // factory's `inject(DestroyRef)` calls work.\n const config = inject(AGENT_CONFIG) as AgentConfig<T>;\n if (config.assistantId === undefined) {\n throw new Error(\n 'provideAgent: `assistantId` is required to construct the AGENT singleton.',\n );\n }\n return agent<T>({\n assistantId: config.assistantId,\n ...(config.apiUrl !== undefined ? { apiUrl: config.apiUrl } : {}),\n ...(config.threadId !== undefined ? { threadId: config.threadId } : {}),\n ...(config.onThreadId !== undefined ? { onThreadId: config.onThreadId } : {}),\n ...(config.initialValues !== undefined ? { initialValues: config.initialValues } : {}),\n ...(config.throttle !== undefined ? { throttle: config.throttle } : {}),\n ...(config.toMessage !== undefined ? { toMessage: config.toMessage } : {}),\n ...(config.transport !== undefined ? { transport: config.transport } : {}),\n ...(config.clientOptions !== undefined ? { clientOptions: config.clientOptions } : {}),\n ...(config.telemetry !== undefined ? { telemetry: config.telemetry } : {}),\n ...(config.filterSubagentMessages !== undefined ? { filterSubagentMessages: config.filterSubagentMessages } : {}),\n ...(config.subagentToolNames !== undefined ? { subagentToolNames: config.subagentToolNames } : {}),\n ...(config.transcriptNodeNames !== undefined ? { transcriptNodeNames: config.transcriptNodeNames } : {}),\n });\n}\n\nfunction isAgentRef<T>(x: unknown): x is AgentRef<T> {\n return typeof x === 'object' && x !== null && 'token' in x;\n}\n\n/**\n * Wire the LangGraph adapter into Angular's dependency injection.\n *\n * Registers a singleton `LangGraphAgent` constructed from `config`. Retrieve it\n * in any component with `injectAgent()`. Provide this at the application root\n * (`app.config.ts`) for an app-wide agent.\n *\n * To use a different agent in a component subtree, re-provide\n * `provideAgent({...})` in that component's `providers: []` array —\n * Angular's hierarchical DI scopes the singleton accordingly.\n *\n * **Static vs factory config.** Pass a plain `AgentConfig` object when the\n * config is known up front. Pass a `() => AgentConfig` factory when the config\n * depends on runtime/DI state — the factory runs inside an Angular injection\n * context, so it may call `inject()` to read services, route params, or\n * component-scoped signals.\n *\n * **Typed state via AgentRef.** Pass a typed ref as the first argument to flow\n * the state shape from `provideAgent` to `injectAgent` without repeating the\n * generic at every call site.\n *\n * @example Factory config reading route params\n * ```ts\n * providers: [\n * provideAgent(() => {\n * const route = inject(ActivatedRoute);\n * return { assistantId: 'chat', threadId: toSignal(route.paramMap) };\n * }),\n * ];\n * ```\n * @example Typed state via AgentRef\n * ```ts\n * export const TRIP = createAgentRef<TripState>('trip');\n * // app.config.ts:\n * providers: [provideAgent(TRIP, { assistantId: 'trip-graph' })]\n * // component:\n * const agent = injectAgent(TRIP); // LangGraphAgent<TripState>\n * ```\n */\nexport function provideAgent<T = Record<string, unknown>>(\n ref: AgentRef<T>,\n configOrFactory: AgentConfig<T> | (() => AgentConfig<T>),\n): Provider[];\nexport function provideAgent<T = Record<string, unknown>>(\n configOrFactory: AgentConfig<T> | (() => AgentConfig<T>),\n): Provider[];\nexport function provideAgent<T = Record<string, unknown>>(\n refOrConfig: AgentRef<T> | AgentConfig<T> | (() => AgentConfig<T>),\n maybeConfig?: AgentConfig<T> | (() => AgentConfig<T>),\n): Provider[] {\n const ref = isAgentRef<T>(refOrConfig) ? refOrConfig : undefined;\n const configOrFactory = (ref ? maybeConfig : refOrConfig) as\n | AgentConfig<T>\n | (() => AgentConfig<T>);\n\n // Resolve the factory (if any) lazily, inside the injection context of the\n // AGENT_CONFIG useFactory below — never at decoration time.\n const resolveConfig = (): AgentConfig<T> =>\n typeof configOrFactory === 'function' ? (configOrFactory as () => AgentConfig<T>)() : configOrFactory;\n\n const providers: Provider[] = [\n // AGENT_CONFIG resolves the config once (running the factory in an\n // injection context if a factory was passed). AGENT reads the resolved\n // config from here, so the factory is invoked exactly once.\n { provide: AGENT_CONFIG, useFactory: resolveConfig },\n { provide: AGENT, useFactory: agentFactory<T> },\n ];\n if (ref) providers.push({ provide: ref.token, useExisting: AGENT });\n return providers;\n}\n","// SPDX-License-Identifier: MIT\nimport { inject } from '@angular/core';\nimport type { BagTemplate } from '@langchain/langgraph-sdk';\nimport type { AgentRef } from '@threadplane/chat';\nimport { AGENT } from './agent.provider';\nimport type { LangGraphAgent } from './agent.types';\n\n/**\n * Retrieve the LangGraph-backed Agent from the current Angular injection context.\n *\n * Mirrors `@threadplane/ag-ui`'s `injectAgent()` so consumer code is identical\n * regardless of which adapter is wired in `app.config.ts`. The agent is a\n * singleton scoped to the injector that called `provideAgent()` — re-provide\n * in a child component's `providers: []` to scope a different agent to that\n * subtree (Angular's hierarchical DI handles the rest).\n *\n * **Typed state via AgentRef.** Pass the same ref that was supplied to\n * `provideAgent(ref, …)` to carry the state type through DI without repeating\n * the generic at every call site. The no-arg form defaults to\n * `LangGraphAgent<Record<string, unknown>>`.\n *\n * @example Typed state via AgentRef\n * ```ts\n * const agent = injectAgent(TRIP); // LangGraphAgent<TripState>\n * ```\n */\nexport function injectAgent(): LangGraphAgent<Record<string, unknown>>;\nexport function injectAgent<T, ResolvedBag extends BagTemplate = BagTemplate>(\n ref: AgentRef<T>,\n): LangGraphAgent<T, ResolvedBag>;\nexport function injectAgent<T = Record<string, unknown>, ResolvedBag extends BagTemplate = BagTemplate>(\n ref?: AgentRef<T>,\n): LangGraphAgent<T, ResolvedBag> {\n return inject(ref ? ref.token : AGENT) as LangGraphAgent<T, ResolvedBag>;\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken, Signal } from '@angular/core';\n\nexport interface AgentLifecycle {\n /** Epoch ms of the first stream chunk arrival. Resets on switchThread(). */\n readonly streamStartedAt: Signal<number | null>;\n /** Epoch ms + classification of the most recent stream error. Resets on switchThread(). */\n readonly streamErrorAt: Signal<{ at: number; classification: string } | null>;\n /** Epoch ms of the first interrupt$ non-null in this stream. Resets on switchThread(). */\n readonly interruptReceivedAt: Signal<number | null>;\n /** Epoch ms of the most recent submit({ resume }) call. Resets on switchThread(). */\n readonly interruptResolvedAt: Signal<number | null>;\n /** Epoch ms when the agent's \"create new thread\" branch fired. Resets on switchThread(). */\n readonly threadCreatedAt: Signal<number | null>;\n /** Epoch ms when an existing thread was restored from server (proves persistence). Resets on switchThread(). */\n readonly threadPersistedAt: Signal<number | null>;\n /** Epoch ms of the first tool call append. Resets on switchThread(). */\n readonly toolCallStartedAt: Signal<number | null>;\n /** Epoch ms of the first tool call result transition. Resets on switchThread(). */\n readonly toolCallCompletedAt: Signal<number | null>;\n}\n\nexport const AGENT_LIFECYCLE = new InjectionToken<AgentLifecycle>('AGENT_LIFECYCLE');\n","// SPDX-License-Identifier: MIT\nimport type { AgentQueueEntry, AgentTransport, LangGraphSubmitOptions, StreamEvent } from '../agent.types';\nimport type { ThreadState } from '@langchain/langgraph-sdk';\n\n/**\n * Test transport for deterministic agent testing without a real LangGraph server.\n *\n * Script event batches upfront, then emit them manually or step through them\n * in your test specs. Supports error injection and close control.\n *\n * @example\n * ```typescript\n * const transport = new MockAgentTransport([\n * [{ type: 'values', messages: [aiMsg('Hello')] }],\n * [{ type: 'values', messages: [aiMsg('Done')] }],\n * ]);\n * ```\n */\nexport class MockAgentTransport implements AgentTransport {\n history: ThreadState[] = [];\n readonly historyCalls: string[] = [];\n readonly streams: Array<{ threadId: string | null; payload: unknown; options?: LangGraphSubmitOptions }> = [];\n readonly createdQueuedRuns: AgentQueueEntry[] = [];\n readonly cancelledRuns: Array<{ threadId: string; runId: string }> = [];\n readonly joinedRuns: Array<{ threadId: string; runId: string }> = [];\n private script: StreamEvent[][];\n private scriptIndex = 0;\n private streaming = false;\n private eventQueue: StreamEvent[] = [];\n // Each resolver simply wakes the stream loop to re-check state.\n private resolvers: Array<() => void> = [];\n private closed = false;\n private pendingError: Error | null = null;\n\n /** @param script - Array of event batches. Each batch is emitted as a group. */\n constructor(script: StreamEvent[][] = []) {\n this.script = script;\n }\n\n /** Advance to the next scripted batch. Pass the returned events to `emit()`. */\n nextBatch(): StreamEvent[] {\n if (this.scriptIndex >= this.script.length) return [];\n return this.script[this.scriptIndex++];\n }\n\n /** Manually emit events into the stream. */\n emit(events: StreamEvent[]): void {\n this.eventQueue.push(...events);\n this.flush();\n }\n\n /** Inject an error into the stream. */\n emitError(err: Error): void {\n this.pendingError = err;\n this.flush();\n }\n\n /** Close the stream. Remaining queued events are drained before completion. */\n close(): void {\n this.closed = true;\n this.flush();\n }\n\n /** Returns true if a stream is currently active. */\n isStreaming(): boolean {\n return this.streaming;\n }\n\n async *stream(\n _assistantId: string,\n _threadId: string | null,\n _payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): AsyncIterable<StreamEvent> {\n this.streams.push({ threadId: _threadId, payload: _payload, options });\n this.streaming = true;\n try {\n while (!this.closed && !signal.aborted) {\n if (this.pendingError) throw this.pendingError;\n if (this.eventQueue.length > 0) {\n const event = this.eventQueue.shift();\n if (event) yield event;\n } else {\n // Wait until flush() wakes us, then loop again to check state.\n await new Promise<void>((resolve) => {\n if (signal.aborted) { resolve(); return; }\n this.resolvers.push(resolve);\n });\n }\n }\n if (signal.aborted) return;\n // Drain remaining events after close()\n while (this.eventQueue.length > 0) {\n const event = this.eventQueue.shift();\n if (event) yield event;\n }\n } finally {\n this.streaming = false;\n }\n }\n\n async createQueuedRun(\n _assistantId: string,\n threadId: string,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): Promise<AgentQueueEntry> {\n void signal;\n const entry: AgentQueueEntry = {\n id: `queued-run-${this.createdQueuedRuns.length + 1}`,\n threadId,\n values: payload,\n options: { ...options, multitaskStrategy: 'enqueue' },\n createdAt: new Date(),\n };\n this.createdQueuedRuns.push(entry);\n return entry;\n }\n\n async cancelRun(threadId: string, runId: string, signal: AbortSignal): Promise<void> {\n void signal;\n this.cancelledRuns.push({ threadId, runId });\n }\n\n async getHistory(threadId: string, signal: AbortSignal): Promise<ThreadState[]> {\n void signal;\n this.historyCalls.push(threadId);\n return this.history;\n }\n\n async *joinStream(\n threadId: string,\n runId: string,\n lastEventId: string | undefined,\n signal: AbortSignal,\n ): AsyncIterable<StreamEvent> {\n void lastEventId;\n void signal;\n this.joinedRuns.push({ threadId, runId });\n yield { type: 'values', values: { queued: true } };\n }\n\n private flush(): void {\n const resolve = this.resolvers.shift();\n if (resolve) resolve();\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal, WritableSignal } from '@angular/core';\nimport type {\n LangGraphAgent,\n SubagentStreamRef,\n AgentQueue,\n Interrupt,\n ThreadState,\n CustomStreamEvent,\n AgentBranchTree,\n} from '../agent.types';\nimport type { ToolProgress, ToolCallWithResult } from '@langchain/langgraph-sdk';\nimport type { BaseMessage, AIMessage as CoreAIMessage } from '@langchain/core/messages';\nimport type { MessageMetadata } from '@langchain/langgraph-sdk/ui';\nimport { mockAgent } from '@threadplane/chat';\nimport type {\n MockAgent,\n MockAgentOptions,\n AgentError,\n AgentInterrupt,\n AgentCheckpoint,\n AgentStatus,\n Message,\n Subagent,\n ToolCall,\n} from '@threadplane/chat';\n\n/**\n * A LangGraphAgent mock with writable signals for easy test control.\n *\n * Builds on the runtime-neutral {@link MockAgent} from `@threadplane/chat`\n * (which supplies the neutral `Agent`-contract writable signals plus\n * `submit`/`stop`/`regenerate` call tracking) and layers the LangGraph-specific\n * writable signals on top.\n *\n * Cast the result of `mockLangGraphAgent()` to this type to access\n * writable signals without unsafe casts in test files.\n */\nexport interface MockLangGraphAgent extends LangGraphAgent<any, any> {\n // Neutral writable signals — re-declared writable. (Dual-extends of MockAgent\n // and LangGraphAgent is impossible because they declare incompatible\n // `lifecycle` shapes, so we extend LangGraphAgent and layer the MockAgent\n // call-tracking surface explicitly below.)\n messages: WritableSignal<Message[]>;\n status: WritableSignal<AgentStatus>;\n isLoading: WritableSignal<boolean>;\n error: WritableSignal<AgentError | undefined>;\n toolCalls: WritableSignal<ToolCall[]>;\n interrupt: WritableSignal<AgentInterrupt | undefined>;\n subagents: WritableSignal<Map<string, Subagent>>;\n history: WritableSignal<AgentCheckpoint[]>;\n\n // MockAgent call-tracking surface (delegated to mockAgent at runtime).\n submitCalls: MockAgent['submitCalls'];\n stopCount: MockAgent['stopCount'];\n _internal: MockAgent['_internal'];\n\n // LangGraph-specific writable signals.\n langGraphMessages: WritableSignal<BaseMessage[]>;\n hasValue: WritableSignal<boolean>;\n value: WritableSignal<any>;\n langGraphInterrupts: WritableSignal<Interrupt<any>[]>;\n langGraphToolCalls: WritableSignal<ToolCallWithResult[]>;\n toolProgress: WritableSignal<ToolProgress[]>;\n queue: WritableSignal<AgentQueue>;\n branch: WritableSignal<string>;\n langGraphHistory: WritableSignal<ThreadState<any>[]>;\n experimentalBranchTree: WritableSignal<AgentBranchTree<any>>;\n isThreadLoading: WritableSignal<boolean>;\n activeSubagents: WritableSignal<SubagentStreamRef[]>;\n customEvents: WritableSignal<CustomStreamEvent[]>;\n}\n\n/**\n * Creates a mock LangGraphAgent with writable signals for testing.\n * Control state by writing to the returned writable signals directly.\n *\n * Neutral `Agent`-contract signals come from {@link mockAgent}; LangGraph-specific\n * signals are declared here and layered on top.\n *\n * @example\n * ```ts\n * const agent = mockLangGraphAgent({ isThreadLoading: true });\n * agent.messages.set([{ id: '1', role: 'assistant', content: 'Hi' }]);\n * ```\n */\nexport function mockLangGraphAgent(\n initial: MockAgentOptions & {\n langGraphMessages?: BaseMessage[];\n hasValue?: boolean;\n isThreadLoading?: boolean;\n } = {}\n): MockLangGraphAgent {\n const base = mockAgent({\n ...initial,\n withInterrupt: true,\n withSubagents: true,\n history: initial.history ?? [],\n });\n\n // ── LangGraph-specific writable signals (defaults copied verbatim) ────────\n const langGraphMessages$ = signal<BaseMessage[]>(initial.langGraphMessages ?? []);\n const hasValue$ = signal<boolean>(initial.hasValue ?? false);\n const value$ = signal<any>(null);\n const langGraphInterrupts$ = signal<Interrupt<any>[]>([]);\n const langGraphToolCalls$ = signal<ToolCallWithResult[]>([]);\n const toolProgress$ = signal<ToolProgress[]>([]);\n const queue$ = signal<AgentQueue>({\n entries: [],\n size: 0,\n cancel: async () => false,\n clear: async () => undefined,\n });\n const branch$ = signal<string>('');\n const langGraphHistory$ = signal<ThreadState<any>[]>([]);\n const experimentalBranchTree$ = signal<AgentBranchTree<any>>({ type: 'sequence', items: [] });\n const isThreadLoading$ = signal<boolean>(initial.isThreadLoading ?? false);\n const activeSubagents$ = signal<SubagentStreamRef[]>([]);\n const customEvents$ = signal<CustomStreamEvent[]>([]);\n\n // `state` derives from the raw LangGraph value (preserves current behavior).\n const state$ = computed<Record<string, unknown>>(() => {\n const v = value$();\n return v && typeof v === 'object' ? (v as Record<string, unknown>) : {};\n });\n\n const mock: MockLangGraphAgent = {\n ...base,\n\n // ── Neutral surface: override `state` to derive from the LangGraph value ─\n state: state$ as never,\n\n // ── Raw LangGraph signals ─────────────────────────────────────────────\n langGraphMessages: langGraphMessages$,\n langGraphInterrupts: langGraphInterrupts$,\n langGraphToolCalls: langGraphToolCalls$,\n langGraphHistory: langGraphHistory$,\n experimentalBranchTree: experimentalBranchTree$,\n\n // ── Other AgentRef fields preserved ──────────────────────────────────\n value: value$,\n hasValue: hasValue$,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n reload: () => {},\n toolProgress: toolProgress$,\n queue: queue$,\n activeSubagents: activeSubagents$,\n getSubagent: (toolCallId: string) =>\n activeSubagents$().find(subagent => subagent.toolCallId === toolCallId),\n getSubagentsByType: (type: string) =>\n activeSubagents$().filter(subagent => subagent.name === type),\n getSubagentsByMessage: (msg: CoreAIMessage) => {\n const toolCalls = (msg as unknown as Record<string, unknown>)['tool_calls'];\n if (!Array.isArray(toolCalls)) return [];\n const ids = toolCalls\n .map(toolCall => {\n if (toolCall == null || typeof toolCall !== 'object' || Array.isArray(toolCall)) return undefined;\n const id = (toolCall as Record<string, unknown>)['id'];\n return typeof id === 'string' ? id : undefined;\n })\n .filter((id): id is string => id != null);\n return activeSubagents$().filter(subagent => ids.includes(subagent.toolCallId));\n },\n customEvents: customEvents$,\n branch: branch$,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n setBranch: (_branch: string) => {},\n isThreadLoading: isThreadLoading$,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n switchThread: (_threadId: string | null) => {},\n joinStream: (_runId: string, _lastEventId?: string) => Promise.resolve(),\n getMessagesMetadata: (_msg: BaseMessage, _idx?: number): MessageMetadata<Record<string, unknown>> | undefined => undefined,\n getToolCalls: (_msg: CoreAIMessage): ToolCallWithResult[] => [],\n lifecycle: {\n streamStartedAt: signal<number | null>(null),\n streamErrorAt: signal<{ at: number; classification: string } | null>(null),\n interruptReceivedAt: signal<number | null>(null),\n interruptResolvedAt: signal<number | null>(null),\n threadCreatedAt: signal<number | null>(null),\n threadPersistedAt: signal<number | null>(null),\n toolCallStartedAt: signal<number | null>(null),\n toolCallCompletedAt: signal<number | null>(null),\n },\n } as MockLangGraphAgent;\n\n return mock;\n}\n","// SPDX-License-Identifier: MIT\nimport type {\n AgentQueueEntry,\n AgentTransport,\n LangGraphSubmitOptions,\n StreamEvent,\n} from '../agent.types';\nimport type { ThreadState } from '@langchain/langgraph-sdk';\nimport type { FakeAgentConfig } from '@threadplane/chat/testing';\n\nconst DEFAULT_TOKENS = ['Hello', ' from', ' the', ' fake', ' LangGraph', ' agent.'];\n\n/**\n * In-process AgentTransport that auto-streams a canned assistant reply.\n *\n * Backs `provideFakeAgent()`. Unlike `MockAgentTransport` (passive, driven\n * manually from specs), this transport emits its tokens automatically on\n * `stream()`, then completes — suitable for offline demos and integration tests.\n *\n * NOT for production use.\n */\nexport class FakeStreamTransport implements AgentTransport {\n private readonly tokens: string[];\n private readonly reasoningTokens: string[];\n private readonly delayMs: number;\n\n constructor(config: FakeAgentConfig = {}) {\n this.tokens = config.tokens ?? DEFAULT_TOKENS;\n this.reasoningTokens = config.reasoningTokens ?? [];\n // Default 60ms matches @threadplane/ag-ui's FakeAgent so both adapters'\n // provideFakeAgent() stream at the same cadence for the same config.\n this.delayMs = config.delayMs ?? 60;\n }\n\n async *stream(\n _assistantId: string,\n _threadId: string | null,\n _payload: unknown,\n signal: AbortSignal,\n _options?: LangGraphSubmitOptions,\n ): AsyncIterable<StreamEvent> {\n const id = 'fake-ai-1';\n\n let reasoning = '';\n for (const chunk of this.reasoningTokens) {\n if (signal.aborted) return;\n reasoning += chunk;\n yield {\n type: 'messages',\n messages: [\n { id, type: 'ai', content: '', additional_kwargs: { reasoning_content: reasoning } },\n ],\n } as unknown as StreamEvent;\n if (this.delayMs > 0) await delay(this.delayMs);\n }\n\n let content = '';\n for (const tok of this.tokens) {\n if (signal.aborted) return;\n content += tok;\n yield {\n type: 'messages',\n messages: [{ id, type: 'ai', content }],\n } as unknown as StreamEvent;\n if (this.delayMs > 0) await delay(this.delayMs);\n }\n }\n\n async createQueuedRun(\n _assistantId: string,\n threadId: string,\n payload: unknown,\n _signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): Promise<AgentQueueEntry> {\n return {\n id: 'fake-queued-run',\n threadId,\n values: payload,\n options: { ...options, multitaskStrategy: 'enqueue' },\n createdAt: new Date(),\n };\n }\n\n async cancelRun(_threadId: string, _runId: string, _signal: AbortSignal): Promise<void> {\n // No-op: the fake has no real runs to cancel.\n return;\n }\n\n async getHistory(_threadId: string, _signal: AbortSignal): Promise<ThreadState[]> {\n return [];\n }\n\n async *joinStream(): AsyncIterable<StreamEvent> {\n // No queued-run replay in the fake; yields nothing.\n yield* [];\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// SPDX-License-Identifier: MIT\nimport { type Provider } from '@angular/core';\nimport type { FakeAgentConfig } from '@threadplane/chat/testing';\nimport { provideAgent } from '../agent.provider';\nimport { FakeStreamTransport } from './fake-stream.transport';\n\n/**\n * Wire an in-process fake LangGraph agent into Angular DI.\n *\n * Streams a canned assistant reply (see FakeAgentConfig) with no backend —\n * the symmetric counterpart to @threadplane/ag-ui's provideFakeAgent(). For\n * advanced manual scripting (tool calls, interrupts, multi-batch), provide\n * the agent yourself with\n * `provideAgent({ assistantId, transport: new MockAgentTransport(...) })`.\n *\n * @example\n * ```ts\n * TestBed.configureTestingModule({\n * providers: [provideFakeAgent({ tokens: ['Hi from the fake LangGraph agent'] })],\n * });\n * ```\n */\nexport function provideFakeAgent(config: FakeAgentConfig = {}): Provider[] {\n return provideAgent({\n assistantId: 'fake',\n transport: new FakeStreamTransport(config),\n });\n}\n","// SPDX-License-Identifier: MIT\nimport { Injectable, InjectionToken, inject, signal, type Signal, type WritableSignal } from '@angular/core';\nimport type { Client, Thread as SdkThread } from '@langchain/langgraph-sdk';\nimport type { Thread } from '@threadplane/chat';\nimport { createLangGraphClient } from '../client/create-langgraph-client';\nimport { LANGGRAPH_CLIENT_OPTIONS } from '../client/client-options';\n\n/**\n * Configuration consumed by {@link LangGraphThreadsAdapter}. Provide\n * via {@link LANGGRAPH_THREADS_CONFIG} (typically in app.config.ts):\n *\n * ```ts\n * providers: [\n * { provide: LANGGRAPH_THREADS_CONFIG, useValue: {\n * apiUrl: environment.langGraphApiUrl,\n * }},\n * ],\n * ```\n *\n * The adapter expects backends to write the thread title to\n * `metadata.title`. Spec 2026-05-19-llm-generated-labels-design.md\n * originally proposed `metadata.thread_title` for cockpit caps but\n * we converged on `title` to match the canonical demo and avoid a\n * per-cap configuration knob.\n */\nexport interface LangGraphThreadsConfig {\n /** Base URL for the LangGraph Platform API. Accepts both absolute\n * URLs and relative `/api`-style paths. */\n apiUrl: string;\n /** Fallback label for threads whose title hasn't been written yet\n * (e.g. created but never sent). Defaults to `'Untitled'`. */\n titleFallback?: string;\n}\n\nexport const LANGGRAPH_THREADS_CONFIG = new InjectionToken<LangGraphThreadsConfig>(\n 'LANGGRAPH_THREADS_CONFIG',\n);\n\n/** Optional adapter clients can pass an explicit Client (e.g. for\n * testing). When omitted, the adapter constructs one via\n * {@link createLangGraphClient}. */\nexport const LANGGRAPH_CLIENT = new InjectionToken<Client>('LANGGRAPH_CLIENT');\n\n/**\n * SDK-backed thread store. Wraps `client.threads.*` and maps SDK\n * threads to the framework's {@link Thread} type for direct use with\n * `<chat-thread-list>` / `<chat-sidenav>`.\n *\n * Consumers wire the framework's `ThreadActionAdapter` to instance\n * methods (rename/delete/archive/pin/...) so the right-click menu\n * round-trips through the LangGraph SDK without per-app boilerplate.\n *\n * @example\n * ```ts\n * const svc = inject(LangGraphThreadsAdapter);\n * const actions: ThreadActionAdapter = {\n * rename: (id, t) => svc.rename(id, t),\n * delete: (id) => svc.delete(id),\n * };\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class LangGraphThreadsAdapter {\n private readonly config = inject(LANGGRAPH_THREADS_CONFIG);\n private readonly sharedClientOptions = inject(LANGGRAPH_CLIENT_OPTIONS, { optional: true }) ?? undefined;\n private readonly client: Client = inject(LANGGRAPH_CLIENT, { optional: true })\n ?? createLangGraphClient(this.config.apiUrl, this.sharedClientOptions);\n\n private readonly fallback: string = this.config.titleFallback ?? 'Untitled';\n\n private readonly _threads: WritableSignal<Thread[]> = signal<Thread[]>([]);\n private readonly _archived: WritableSignal<Thread[]> = signal<Thread[]>([]);\n\n /** Active (non-archived) threads, sorted with pinned first. */\n readonly threads: Signal<Thread[]> = this._threads.asReadonly();\n /** Threads whose `metadata.archived === true`. */\n readonly archivedThreads: Signal<Thread[]> = this._archived.asReadonly();\n\n /** Fetch the latest thread list from the server. Failures are\n * logged via `console.error` (not swallowed silently — silent\n * catches have masked prod issues in the past).\n *\n * Invocation and resolution are logged at `console.debug` so prod\n * inspection can distinguish \"never called\" from \"called but\n * resolved empty\" from \"called and threw.\" This was prompted by a\n * demo.threadplane.ai cold-load bug where the sidenav stayed empty\n * with no visible signal. Tighten the log volume if it becomes\n * noisy. */\n async refresh(): Promise<void> {\n console.debug('[LangGraphThreadsAdapter.refresh] invoked');\n try {\n const list = await this.client.threads.search({ limit: 50 });\n console.debug('[LangGraphThreadsAdapter.refresh] resolved', list.length);\n const mapped = list.map((t) => this.toThread(t));\n this._threads.set(\n mapped\n .filter((t) => t.status !== 'archived')\n .sort((a, b) => {\n const aP = a.pinned === true;\n const bP = b.pinned === true;\n if (aP !== bP) return Number(bP) - Number(aP);\n if (aP && bP) {\n const aO = typeof a['pinnedOrder'] === 'number' ? (a['pinnedOrder'] as number) : Infinity;\n const bO = typeof b['pinnedOrder'] === 'number' ? (b['pinnedOrder'] as number) : Infinity;\n return aO - bO;\n }\n return 0;\n }),\n );\n this._archived.set(mapped.filter((t) => t.status === 'archived'));\n } catch (e) {\n console.error('[LangGraphThreadsAdapter.refresh] failed:', e);\n }\n }\n\n /** Fetch a single thread by id. Returns `null` when the server\n * returns 404 (thread doesn't exist) so callers can distinguish\n * \"missing\" from \"couldn't reach the server\" — genuine network\n * errors rethrow. Used by URL-based thread routing to validate a\n * pasted/shared thread id before activating it. */\n async getThread(threadId: string): Promise<Thread | null> {\n try {\n const t = await this.client.threads.get(threadId);\n return this.toThread(t);\n } catch (e) {\n // SDK throws HTTPError-like objects without a typed error class;\n // sniff status on the error or its nested response. Treat both\n // 404 (server says \"no such thread\") and 422 (server says \"id\n // isn't even a valid UUID\") as \"missing\" — both warrant the\n // same caller behavior (redirect to a fresh chat).\n const status =\n (e as { status?: number }).status ??\n (e as { response?: { status?: number } }).response?.status;\n if (status === 404 || status === 422) return null;\n throw e;\n }\n }\n\n async create(metadata: Record<string, unknown> = {}): Promise<string | null> {\n try {\n const t = await this.client.threads.create({ metadata });\n await this.refresh();\n return t.thread_id;\n } catch (e) {\n console.error('[LangGraphThreadsAdapter.create] failed:', e);\n return null;\n }\n }\n\n async delete(threadId: string): Promise<void> {\n await this.client.threads.delete(threadId);\n await this.refresh();\n }\n\n async rename(threadId: string, newTitle: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { title: newTitle } });\n await this.refresh();\n }\n\n async archive(threadId: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { archived: true } });\n await this.refresh();\n }\n\n async unarchive(threadId: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { archived: false } });\n await this.refresh();\n }\n\n async pin(threadId: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { pinned: true } });\n await this.refresh();\n }\n\n async unpin(threadId: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { pinned: false } });\n await this.refresh();\n }\n\n async moveToProject(threadId: string, projectId: string | null): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { projectId } });\n await this.refresh();\n }\n\n /** Re-stamp `metadata.pinnedOrder = 0,1,2,...` for the pinned slice\n * to reflect the new ordering. */\n async reorderPinned(threadId: string, beforeId: string | null): Promise<void> {\n const current = this._threads().filter((t) => t.pinned === true);\n const moved = current.find((t) => t.id === threadId);\n if (!moved) return;\n const rest = current.filter((t) => t.id !== threadId);\n const next: Thread[] = [];\n for (const t of rest) {\n if (t.id === beforeId) next.push(moved);\n next.push(t);\n }\n if (beforeId === null) next.push(moved);\n\n await Promise.all(\n next.map((t, idx) =>\n this.client.threads.update(t.id, { metadata: { pinnedOrder: idx } }),\n ),\n );\n await this.refresh();\n }\n\n private toThread(t: SdkThread): Thread {\n const meta = (t.metadata ?? {}) as Record<string, unknown>;\n const rawTitle = meta['title'];\n const archived = meta['archived'] === true;\n const pinned = meta['pinned'] === true;\n const projectId = typeof meta['projectId'] === 'string' && (meta['projectId'] as string).length > 0\n ? (meta['projectId'] as string)\n : null;\n const pinnedOrder = typeof meta['pinnedOrder'] === 'number' ? (meta['pinnedOrder'] as number) : undefined;\n return {\n id: t.thread_id,\n title: typeof rawTitle === 'string' && rawTitle.length > 0 ? rawTitle : this.fallback,\n status: archived ? 'archived' : 'active',\n pinned,\n projectId,\n pinnedOrder,\n updatedAt: t.updated_at ? Date.parse(t.updated_at) : undefined,\n };\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { effect, type Signal } from '@angular/core';\nimport type { LangGraphAgent } from '../agent.types';\n\n/**\n * Call `fn` whenever the agent's status transitions out of `'running'`\n * (i.e. when a run completes — success, error, or interrupt). Useful\n * for refreshing thread lists, telemetry, or any other state that\n * lags the agent.\n *\n * Must be called within an injection context (constructor or\n * `runInInjectionContext`) — uses Angular's `effect` under the hood.\n *\n * @example\n * ```ts\n * constructor() {\n * refreshOnRunEnd(this.agent, () => this.threads.refresh());\n * }\n * ```\n */\nexport function refreshOnRunEnd(agent: LangGraphAgent, fn: () => void | Promise<void>): void {\n let lastStatus = agent.status();\n effect(() => {\n const status = agent.status();\n if (lastStatus === 'running' && status !== 'running') {\n void fn();\n }\n lastStatus = status;\n });\n}\n\n/**\n * Call `fn` whenever any of the watched signals transitions from a\n * truthy \"active\" value to a non-active value. Generic version of\n * {@link refreshOnRunEnd} for callers tracking custom state machines.\n *\n * Must be called within an injection context.\n */\nexport function refreshOnTransition<T>(\n watch: Signal<T>,\n isActive: (v: T) => boolean,\n fn: () => void | Promise<void>,\n): void {\n let lastActive = isActive(watch());\n effect(() => {\n const active = isActive(watch());\n if (lastActive && !active) void fn();\n lastActive = active;\n });\n}\n","// SPDX-License-Identifier: MIT\n// Provider\nexport { provideAgent } from './lib/agent.provider';\nexport type { AgentConfig } from './lib/agent.provider';\n\n// Symmetric inject helper — matches @threadplane/ag-ui's injectAgent()\nexport { injectAgent } from './lib/inject-agent';\n\n// Lifecycle monitoring\nexport { AGENT_LIFECYCLE } from './lib/lifecycle';\nexport type { AgentLifecycle } from './lib/lifecycle';\nexport { AgentLifecycleRegistry } from './lib/agent-lifecycle-registry';\n\n// Public types\nexport type {\n AgentOptions,\n LangGraphClientOptions,\n AgentBranchTree,\n AgentBranchTreeFork,\n AgentBranchTreeNode,\n AgentQueue,\n AgentQueueEntry,\n LangGraphAgent,\n LangGraphMultitaskStrategy,\n LangGraphSubmitOptions,\n AgentTransport,\n CustomStreamEvent,\n StreamEvent,\n SubagentStreamRef,\n} from './lib/agent.types';\n\n// Re-export from SDK (consumers import from angular, not langgraph-sdk)\nexport type { BagTemplate, InferBag, Interrupt, ThreadState, SubmitOptions }\n from './lib/agent.types';\n\n// Re-export ResourceStatus shim for convenience\nexport { ResourceStatus } from './lib/agent.types';\n\n// Test utilities (always exported — tree-shaken in prod builds)\nexport { MockAgentTransport } from './lib/transport/mock-stream.transport';\nexport { FetchStreamTransport } from './lib/transport/fetch-stream.transport';\n\n// Mock test utility for LangGraph agent\nexport { mockLangGraphAgent } from './lib/testing/mock-langgraph-agent';\nexport type { MockLangGraphAgent } from './lib/testing/mock-langgraph-agent';\nexport { provideFakeAgent } from './lib/testing/provide-fake-agent';\n// Low-level auto-emitting fake transport backing provideFakeAgent — exported\n// for advanced manual wiring (parity with @threadplane/ag-ui's FakeAgent).\nexport { FakeStreamTransport } from './lib/testing/fake-stream.transport';\n\n// Citation normalizer — useful for advanced consumers building custom adapters\n// or bridging non-LangGraph message shapes into tplane Citation[].\nexport { extractCitations } from './lib/internals/extract-citations';\n\n// SDK Client helper — handles the SDK's absolute-URL requirement so\n// `/api`-style relative paths work in browser contexts.\nexport { createLangGraphClient, toAbsoluteApiUrl } from './lib/client/create-langgraph-client';\nexport { LANGGRAPH_CLIENT_OPTIONS } from './lib/client/client-options';\n\n// SDK-backed thread store — drop-in replacement for the\n// hand-rolled ThreadsService that consumers used to duplicate.\nexport {\n LangGraphThreadsAdapter,\n LANGGRAPH_THREADS_CONFIG,\n LANGGRAPH_CLIENT,\n} from './lib/threads/threads-adapter';\nexport type { LangGraphThreadsConfig } from './lib/threads/threads-adapter';\n\n// Lifecycle helper for hooking refreshes onto agent state transitions.\nexport { refreshOnRunEnd, refreshOnTransition } from './lib/threads/refresh-on';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["getBaseEventType","isRecord","isMessagesEvent","isAiMessageWithToolCalls","isToolMessage","mergeMessages","takeUntil"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"threadplane-langgraph.mjs","sources":["../../../../libs/langgraph/src/lib/agent-lifecycle-registry.ts","../../../../libs/langgraph/src/lib/agent.types.ts","../../../../libs/langgraph/src/lib/client/create-langgraph-client.ts","../../../../libs/langgraph/src/lib/transport/fetch-stream.transport.ts","../../../../libs/langgraph/src/lib/internals/subagent-tracker.ts","../../../../libs/langgraph/src/lib/internals/stream-manager.bridge.ts","../../../../libs/langgraph/src/lib/client/client-options.ts","../../../../libs/langgraph/src/lib/internals/branch-tree.ts","../../../../libs/langgraph/src/lib/internals/extract-citations.ts","../../../../libs/langgraph/src/lib/client-tools.ts","../../../../libs/langgraph/src/lib/agent.fn.ts","../../../../libs/langgraph/src/lib/agent.provider.ts","../../../../libs/langgraph/src/lib/inject-agent.ts","../../../../libs/langgraph/src/lib/lifecycle.ts","../../../../libs/langgraph/src/lib/transport/mock-stream.transport.ts","../../../../libs/langgraph/src/lib/testing/mock-langgraph-agent.ts","../../../../libs/langgraph/src/lib/testing/fake-stream.transport.ts","../../../../libs/langgraph/src/lib/testing/provide-fake-agent.ts","../../../../libs/langgraph/src/lib/threads/threads-adapter.ts","../../../../libs/langgraph/src/lib/threads/refresh-on.ts","../../../../libs/langgraph/src/public-api.ts","../../../../libs/langgraph/src/threadplane-langgraph.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\nimport { Injectable, signal, type Signal } from '@angular/core';\nimport type { AgentLifecycle } from './lifecycle';\n\n/**\n * Optional registry that collects per-instance agent lifecycles within\n * an Angular injection context. External instrumentation packages\n * (e.g. cockpit-telemetry) provide this token and read from it.\n *\n * `@threadplane/langgraph` does NOT provide this itself — the configured agent\n * instance writes to the registry only when an external consumer has provided it.\n */\n@Injectable()\nexport class AgentLifecycleRegistry {\n private readonly _lifecycles = signal<readonly AgentLifecycle[]>([]);\n\n /** Reactive list of registered lifecycles. */\n readonly lifecycles: Signal<readonly AgentLifecycle[]> = this._lifecycles.asReadonly();\n\n register(lifecycle: AgentLifecycle): void {\n this._lifecycles.update((curr) => [...curr, lifecycle]);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Signal } from '@angular/core';\nimport type { ResourceStatus as NgResourceStatus } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport type {\n BagTemplate,\n Checkpoint,\n Command,\n Config,\n InferBag,\n Interrupt,\n Metadata,\n ThreadState,\n ToolProgress,\n ToolCallWithResult,\n StreamMode,\n} from '@langchain/langgraph-sdk';\nimport type {\n MessageMetadata,\n SubmitOptions,\n} from '@langchain/langgraph-sdk/ui';\nimport type { BaseMessage, AIMessage as CoreAIMessage } from '@langchain/core/messages';\nimport type {\n AgentRuntimeTelemetrySink,\n AgentSubmitInput,\n AgentSubmitOptions,\n AgentWithHistory,\n ClientToolsCapability,\n} from '@threadplane/chat';\nimport type { AgentLifecycle } from './lifecycle';\n\n// Re-export SDK types so consumers don't need to import from langgraph-sdk directly\nexport type { BagTemplate, InferBag, Interrupt, ThreadState, SubmitOptions };\n\n/**\n * Runtime constant mirroring Angular's ResourceStatus string-union type.\n * Angular 21 ships ResourceStatus as a pure string-union type (no runtime value),\n * so we provide a const-object shim for code that needs runtime comparisons.\n */\nexport const ResourceStatus = {\n Idle: 'idle',\n Loading: 'loading',\n Reloading: 'reloading',\n Resolved: 'resolved',\n Error: 'error',\n Local: 'local',\n} as const satisfies Record<string, NgResourceStatus>;\n\nexport type ResourceStatus = NgResourceStatus;\n\n// ── Transport interface ──────────────────────────────────────────────────────\n\n/** An event emitted by a LangGraph stream. */\nexport interface StreamEvent {\n /** Event type identifier (e.g., 'values', 'messages', 'error', 'interrupt'). */\n type:\n | 'values'\n | `values|${string}`\n | 'messages'\n | `messages|${string}`\n | `messages/${string}`\n | `messages/${string}|${string}`\n | 'updates'\n | `updates|${string}`\n | 'tools'\n | `tools|${string}`\n | 'custom'\n | `custom|${string}`\n | 'error'\n | `error|${string}`\n | 'metadata'\n | 'checkpoints'\n | `checkpoints|${string}`\n | 'tasks'\n | `tasks|${string}`\n | 'debug'\n | `debug|${string}`\n | 'events'\n | `events|${string}`\n | 'interrupt'\n | 'interrupts';\n namespace?: string[];\n messages?: unknown[];\n messageMetadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/** Strategy for handling concurrent LangGraph runs on the same thread. */\nexport type LangGraphMultitaskStrategy = 'reject' | 'interrupt' | 'rollback' | 'enqueue';\n\nexport type LangGraphDurability = 'exit' | 'async' | 'sync';\nexport type LangGraphOnCompletion = 'complete' | 'continue';\nexport type LangGraphOnDisconnect = 'cancel' | 'continue';\n\n/** Options accepted by LangGraph-backed submit calls. */\nexport interface LangGraphSubmitOptions {\n signal?: AbortSignal;\n config?: Config;\n context?: unknown;\n checkpoint?: Omit<Checkpoint, 'thread_id'> | null;\n checkpointId?: string;\n command?: Command;\n metadata?: Metadata;\n checkpointDuring?: boolean;\n durability?: LangGraphDurability;\n interruptBefore?: '*' | string[];\n interruptAfter?: '*' | string[];\n onCompletion?: LangGraphOnCompletion;\n webhook?: string;\n onDisconnect?: LangGraphOnDisconnect;\n afterSeconds?: number;\n ifNotExists?: 'create' | 'reject';\n onRunCreated?: (params: { run_id: string; thread_id?: string }) => void;\n streamMode?: StreamMode[];\n streamSubgraphs?: boolean;\n streamResumable?: boolean;\n feedbackKeys?: string[];\n /** Convenience alias normalized to `command.resume` before invoking LangGraph. */\n resume?: unknown;\n /** Strategy for handling concurrent runs on the same thread. */\n multitaskStrategy?: LangGraphMultitaskStrategy;\n}\n\n/** A queued server-side LangGraph run. */\nexport interface AgentQueueEntry<T = unknown> {\n /** Server-side run ID. */\n id: string;\n /** Thread that owns the queued run. */\n threadId: string;\n /** Values submitted for the queued run. */\n values: T | null | undefined;\n /** Submit options used when the queued run was created. */\n options?: LangGraphSubmitOptions;\n /** Timestamp when the queued run was registered locally. */\n createdAt: Date;\n}\n\n/** Public queue surface for pending server-side LangGraph runs. */\nexport interface AgentQueue<T = unknown> {\n /** Read-only pending queue entries. */\n readonly entries: ReadonlyArray<AgentQueueEntry<T>>;\n /** Number of pending queue entries. */\n readonly size: number;\n /** Cancel a specific pending run by server run ID. */\n cancel: (id: string) => Promise<boolean>;\n /** Cancel all pending runs and clear the queue. */\n clear: () => Promise<void>;\n}\n\n/** A checkpoint entry in the experimental branch tree. */\nexport interface AgentBranchTreeNode<T = unknown> {\n type: 'node';\n value: ThreadState<T>;\n path: string[];\n}\n\n/** A branch fork where each item is an alternate checkpoint sequence. */\nexport interface AgentBranchTreeFork<T = unknown> {\n type: 'fork';\n items: AgentBranchTree<T>[];\n}\n\n/** Tree representation of LangGraph checkpoint history for time-travel UIs. */\nexport interface AgentBranchTree<T = unknown> {\n type: 'sequence';\n items: Array<AgentBranchTreeNode<T> | AgentBranchTreeFork<T>>;\n}\n\n/** A custom event emitted by the LangGraph backend via adispatch_custom_event(). */\nexport interface CustomStreamEvent {\n /** Event name set by the backend (e.g., 'state_update'). */\n name: string;\n /** Arbitrary payload from the backend. */\n data: unknown;\n}\n\n/** Transport interface for connecting to a LangGraph agent. */\nexport interface AgentTransport {\n /** Open a streaming connection to an agent and yield events. */\n stream(\n assistantId: string,\n threadId: string | null,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): AsyncIterable<StreamEvent>;\n\n /** Optional: join an already-started run without creating a new one. */\n joinStream?(\n threadId: string,\n runId: string,\n lastEventId: string | undefined,\n signal: AbortSignal,\n ): AsyncIterable<StreamEvent>;\n\n /** Optional: create a server-side queued run without joining it immediately. */\n createQueuedRun?(\n assistantId: string,\n threadId: string,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): Promise<AgentQueueEntry>;\n\n /** Optional: cancel a server-side run. */\n cancelRun?(\n threadId: string,\n runId: string,\n signal: AbortSignal,\n ): Promise<void>;\n\n /** Optional: load persisted checkpoint history for a thread. */\n getHistory?(\n threadId: string,\n signal: AbortSignal,\n ): Promise<ThreadState[]>;\n\n /**\n * Optional: update server-side thread state (e.g. to emit RemoveMessage\n * entries for regenerate rollback). Forwards to the LangGraph\n * `threads.updateState` API.\n *\n * `options.asNode` corresponds to LangGraph's `as_node` parameter — the\n * server treats the update as if that node had just produced the values,\n * which determines what the next pull resumes. `regenerate()` passes\n * `asNode: '__start__'` so the next `submit(null)` resumes at the entry\n * node and re-runs `generate` against the rolled-back state.\n */\n updateState?(\n threadId: string,\n values: Record<string, unknown>,\n signal: AbortSignal,\n options?: { asNode?: string },\n ): Promise<void>;\n}\n\n// ── Options ──────────────────────────────────────────────────────────────────\n\n/** Options for creating a LangGraph-backed agent via {@link agent}. */\n// The second generic is retained for source compatibility with existing typed\n// AgentOptions references even though the options shape no longer depends on it.\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n/**\n * Tuning options for the underlying LangGraph SDK `Client` constructed by the\n * default {@link FetchStreamTransport}. Ignored when a custom `transport` is\n * supplied (the transport owns its own client).\n */\nexport interface LangGraphClientOptions {\n /**\n * How many times a failed request — including the initial stream connect —\n * is retried with exponential backoff before the error surfaces. Maps to the\n * SDK's `callerOptions.maxRetries`. Omitted → the SDK default (currently 4).\n *\n * Set `0` to fail fast: useful for e2e tests that force a connection failure\n * and assert the error surfaces promptly, rather than after the full\n * multi-second backoff window.\n */\n maxRetries?: number;\n}\n\nexport interface AgentOptions<T, _ResolvedBag extends BagTemplate> {\n /** Base URL of the LangGraph Platform API. Defaults to `provideAgent({ apiUrl })` when omitted. */\n apiUrl?: string;\n /** Agent or graph identifier on the LangGraph platform. */\n assistantId: string;\n /** Thread ID to connect to. Pass a Signal for reactive thread switching. */\n threadId?: Signal<string | null> | string | null;\n /** Called when a new thread is auto-created by the transport. */\n onThreadId?: (id: string) => void;\n /** Initial state values before the first stream response arrives. */\n initialValues?: Partial<T>;\n /** Throttle signal updates in milliseconds. `false` to disable. */\n throttle?: number | false;\n /** Custom message deserializer for non-standard message formats. */\n toMessage?: (msg: unknown) => BaseMessage;\n /** Custom transport. Defaults to FetchStreamTransport. */\n transport?: AgentTransport;\n /** Tuning options for the default transport's LangGraph SDK client (e.g. retry budget). */\n clientOptions?: LangGraphClientOptions;\n /** Optional app-owned telemetry sink. No telemetry is emitted unless this is provided. */\n telemetry?: AgentRuntimeTelemetrySink | false;\n /** Tool names that indicate a subagent invocation. */\n subagentToolNames?: string[];\n /**\n * A2UI client capabilities (catalog negotiation) to advertise to the graph.\n * When set, every plain-object run payload carries them under the\n * `a2ui_client_capabilities` state key — mirroring how `client_tools`\n * rides the payload. Read server-side via threadplane-middleware's\n * `a2ui_client_capabilities(state)`. Use `@threadplane/chat`'s\n * `a2uiClientCapabilities()` for the renderer's standard value.\n */\n a2uiClientCapabilities?: { supportedCatalogIds: string[]; inlineCatalogs?: unknown[] };\n /**\n * LangGraph node names whose `messages-tuple` LLM chunks should be projected\n * into the main chat transcript. Omit to accept all top-level message chunks.\n * Child-graph (namespaced) chunks never reach the transcript regardless of\n * this option — they belong to their child stream in `subagents()`.\n *\n * Use this when a graph has side-effect LLM nodes, such as title generation,\n * whose streamed model output should not render as assistant chat content.\n */\n transcriptNodeNames?: string[];\n}\n\n// ── SubagentStreamRef ────────────────────────────────────────────────────────\n\n/** Reference to a subagent's streaming state. */\nexport interface SubagentStreamRef {\n /** The tool call ID that spawned this subagent. */\n toolCallId: string;\n /** Optional human-readable subagent type/name. */\n name?: string;\n /** Current execution status of the subagent. */\n status: Signal<'pending' | 'running' | 'complete' | 'error'>;\n /** Current state values from the subagent. */\n values: Signal<Record<string, unknown>>;\n /** Messages from the subagent conversation. */\n messages: Signal<BaseMessage[]>;\n}\n\n// ── LangGraphAgent ────────────────────────────────────────────────────────────\n\n/**\n * Unified LangGraph agent surface returned by `injectAgent()`.\n *\n * Extends the runtime-neutral `AgentWithHistory` contract (chat-consumable)\n * with the full LangGraph-specific API. One object drives both `<chat>` and\n * any LangGraph-specific demo. Raw LangGraph signals are prefixed with\n * `langGraph` to avoid collision with the runtime-neutral names.\n */\nexport interface LangGraphAgent<T = unknown, ResolvedBag extends BagTemplate = BagTemplate>\n extends AgentWithHistory<T> {\n // ── Raw LangGraph signals ────────────────────────────────────────────────\n\n /** Raw LangChain BaseMessage list. Use `messages` for chat rendering. */\n langGraphMessages: Signal<BaseMessage[]>;\n\n /** All interrupts received during the current run (raw LangGraph shape). */\n langGraphInterrupts: Signal<Interrupt<ResolvedBag['InterruptType']>[]>;\n\n /** Raw LangGraph tool calls (with run-state). Use `toolCalls` for chat rendering. */\n langGraphToolCalls: Signal<ToolCallWithResult[]>;\n\n /** Raw LangGraph history (ThreadState[]). Use `history` for AgentCheckpoint[]. */\n langGraphHistory: Signal<ThreadState<T>[]>;\n\n /** Experimental branch tree derived from LangGraph checkpoint history. */\n experimentalBranchTree: Signal<AgentBranchTree<T>>;\n\n /** Submit input, resume commands, checkpoint forks, or other LangGraph run options. */\n submit: (\n input: AgentSubmitInput | null | undefined,\n opts?: AgentSubmitOptions & LangGraphSubmitOptions,\n ) => Promise<void>;\n\n /**\n * Client-declared, client-executed tools. Call setCatalog() to register\n * tool specs; the catalog is automatically shipped with every run via\n * `input.client_tools`. Pending tool calls appear in pending() after\n * the run ends; resolve() returns a result and continues the run.\n */\n clientTools: ClientToolsCapability;\n\n // ── LangGraph-specific fields preserved on the unified surface ───────────\n\n /** Current agent state values (raw, typed per the type parameter T). */\n value: Signal<T>;\n\n /** True once at least one value or message has been received. */\n hasValue: Signal<boolean>;\n\n /** Re-submit the last input to restart the stream. */\n reload: () => void;\n\n /**\n * Discards the assistant message at the given index AND all messages after\n * it, then re-runs the agent against the trimmed conversation tail. The\n * preceding user message (at index - 1) is preserved and re-submitted as\n * the agent's input. No new user message is added to the history.\n *\n * Throws if the message at `index` is not 'assistant' role, or if the\n * agent is currently loading another response.\n */\n regenerate: (assistantMessageIndex: number) => Promise<void>;\n\n /** Progress updates for currently executing tools. */\n toolProgress: Signal<ToolProgress[]>;\n\n /** Pending server-side runs created via `multitaskStrategy: 'enqueue'`. */\n queue: Signal<AgentQueue>;\n\n /** Filtered list of subagents with status 'running'. */\n activeSubagents: Signal<SubagentStreamRef[]>;\n\n /** Get a subagent stream by the tool call ID that spawned it. */\n getSubagent: (toolCallId: string) => SubagentStreamRef | undefined;\n\n /** Get subagent streams by their configured subagent type/name. */\n getSubagentsByType: (type: string) => SubagentStreamRef[];\n\n /** Get subagent streams spawned by the tool calls on a specific AI message. */\n getSubagentsByMessage: (msg: CoreAIMessage) => SubagentStreamRef[];\n\n /** Raw custom events stream (signal of array). The runtime-neutral\n * `events$` Observable is derived from this. */\n customEvents: Signal<CustomStreamEvent[]>;\n\n /** Current branch identifier for time-travel navigation. */\n branch: Signal<string>;\n\n /** Set the active branch for time-travel navigation. */\n setBranch: (branch: string) => void;\n\n /** True while a thread switch is loading state from the server. */\n isThreadLoading: Signal<boolean>;\n\n /** Switch to a different thread, resetting derived state. */\n switchThread: (threadId: string | null) => void;\n\n /** Join an already-running stream by run ID. */\n joinStream: (runId: string, lastEventId?: string) => Promise<void>;\n\n /** Get metadata for a specific message by index. */\n getMessagesMetadata: (msg: BaseMessage, idx?: number) => MessageMetadata<Record<string, unknown>> | undefined;\n\n /** Get tool call results associated with an AI message (LangGraph types). */\n getToolCalls: (msg: CoreAIMessage) => ToolCallWithResult[];\n\n /**\n * Lifecycle signals for observability/telemetry. Eight read-only signals\n * capture key transitions (first stream chunk, first interrupt, tool\n * call start/complete, thread create/persist, errors). All reset on\n * `switchThread()`. See {@link AgentLifecycle}.\n */\n lifecycle: AgentLifecycle;\n}\n\n// ── Internal: StreamSubjects ─────────────────────────────────────────────────\n// Not exported from public-api.ts\n\nexport interface StreamSubjects<T, ResolvedBag extends BagTemplate = BagTemplate> {\n status$: BehaviorSubject<ResourceStatus>;\n values$: BehaviorSubject<T>;\n messages$: BehaviorSubject<BaseMessage[]>;\n error$: BehaviorSubject<unknown>;\n interrupt$: BehaviorSubject<Interrupt<ResolvedBag['InterruptType']> | undefined>;\n interrupts$: BehaviorSubject<Interrupt<ResolvedBag['InterruptType']>[]>;\n branch$: BehaviorSubject<string>;\n history$: BehaviorSubject<ThreadState<T>[]>;\n isThreadLoading$: BehaviorSubject<boolean>;\n toolProgress$: BehaviorSubject<ToolProgress[]>;\n toolCalls$: BehaviorSubject<ToolCallWithResult[]>;\n messageMetadata$: BehaviorSubject<Map<string, MessageMetadata<Record<string, unknown>>>>;\n subagents$: BehaviorSubject<Map<string, SubagentStreamRef>>;\n queue$: BehaviorSubject<AgentQueue>;\n custom$: BehaviorSubject<CustomStreamEvent[]>;\n}\n","// SPDX-License-Identifier: MIT\nimport { Client } from '@langchain/langgraph-sdk';\nimport type { LangGraphClientOptions } from '../agent.types';\n\n/**\n * Construct a LangGraph SDK Client that accepts both absolute URLs\n * (`http://localhost:2024`) and relative `/api`-style paths that get\n * proxied by middleware in production. The SDK itself rejects\n * relative URLs, so this helper rewrites them against\n * `window.location.origin` when running in the browser.\n *\n * Single source of truth for the absolute-URL rewrite — the streaming\n * transport (`fetch-stream.transport.ts`) and the threads adapter\n * (`LangGraphThreadsAdapter`) both go through here.\n *\n * `clientOptions.maxRetries` maps to the SDK's `callerOptions.maxRetries`,\n * which governs how many times a failed request (including the initial\n * stream connect) is retried with exponential backoff before the error\n * surfaces. Omitted → the SDK default (currently 4). Apps under test set\n * `0` so a forced connection failure surfaces immediately instead of after\n * the full backoff window.\n *\n * @example\n * ```ts\n * const client = createLangGraphClient(environment.langGraphApiUrl);\n * const threads = await client.threads.search({ limit: 50 });\n * ```\n */\nexport function createLangGraphClient(\n apiUrl: string,\n clientOptions?: LangGraphClientOptions,\n): Client {\n return new Client({\n apiUrl: toAbsoluteApiUrl(apiUrl),\n ...(clientOptions?.maxRetries !== undefined\n ? { callerOptions: { maxRetries: clientOptions.maxRetries } }\n : {}),\n });\n}\n\n/** Exported separately so non-Client callers (e.g. raw fetch) can\n * share the same normalization logic. */\nexport function toAbsoluteApiUrl(apiUrl: string): string {\n if (apiUrl.startsWith('http://') || apiUrl.startsWith('https://')) return apiUrl;\n return typeof window !== 'undefined' ? `${window.location.origin}${apiUrl}` : apiUrl;\n}\n","// SPDX-License-Identifier: MIT\nimport type { Client, StreamMode, ThreadState } from '@langchain/langgraph-sdk';\nimport type { AgentQueueEntry, AgentTransport, LangGraphClientOptions, LangGraphSubmitOptions, StreamEvent } from '../agent.types';\nimport { createLangGraphClient } from '../client/create-langgraph-client';\n\n/**\n * Production transport that connects to a LangGraph Platform API via HTTP and SSE.\n *\n * Creates threads automatically if no threadId is provided, and streams events\n * using the LangGraph SDK client.\n *\n * @example\n * ```typescript\n * const transport = new FetchStreamTransport(\n * 'http://localhost:2024',\n * (id) => console.log('New thread:', id),\n * );\n * ```\n */\nexport class FetchStreamTransport implements AgentTransport {\n private client: Client;\n private onThreadId?: (id: string) => void;\n\n /**\n * @param apiUrl - Base URL of the LangGraph Platform API\n * @param onThreadId - Optional callback invoked when a new thread is created\n * @param clientOptions - Optional SDK client tuning (e.g. `maxRetries`)\n */\n constructor(apiUrl: string, onThreadId?: (id: string) => void, clientOptions?: LangGraphClientOptions) {\n // createLangGraphClient handles the absolute-URL normalization\n // required by the SDK when `apiUrl` is a relative `/api`-style\n // path proxied by middleware in production.\n this.client = createLangGraphClient(apiUrl, clientOptions);\n this.onThreadId = onThreadId;\n }\n\n /** Open a streaming connection, creating a thread if needed. */\n async *stream(\n assistantId: string,\n threadId: string | null,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): AsyncIterable<StreamEvent> {\n let thread = threadId;\n if (!thread) {\n const t = await this.client.threads.create();\n thread = t.thread_id;\n this.onThreadId?.(thread);\n }\n\n const run = this.client.runs.stream(\n thread,\n assistantId,\n buildRunPayload(payload, signal, options),\n );\n\n for await (const event of run) {\n yield normalizeSdkEvent(event.event as StreamEvent['type'], event.data);\n }\n }\n\n /** Join an already-started run without creating a new thread. */\n async *joinStream(\n threadId: string,\n runId: string,\n lastEventId: string | undefined,\n signal: AbortSignal,\n ): AsyncIterable<StreamEvent> {\n // SDK joinStream: joins an already-started run without creating a new one.\n const run = this.client.runs.joinStream(threadId, runId, {\n signal,\n ...(lastEventId !== undefined ? { lastEventId } : {}),\n });\n\n for await (const event of run) {\n yield normalizeSdkEvent(event.event as StreamEvent['type'], event.data);\n }\n }\n\n /** Create a pending server-side run using LangGraph's enqueue strategy. */\n async createQueuedRun(\n assistantId: string,\n threadId: string,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): Promise<AgentQueueEntry> {\n const run = await this.client.runs.create(threadId, assistantId, {\n ...buildRunPayload(payload, signal, options),\n multitaskStrategy: 'enqueue',\n });\n\n return {\n id: run.run_id,\n threadId: run.thread_id ?? threadId,\n values: payload,\n options: { multitaskStrategy: 'enqueue', signal },\n createdAt: run.created_at ? new Date(run.created_at) : new Date(),\n };\n }\n\n /** Cancel a server-side run. */\n async cancelRun(threadId: string, runId: string, signal: AbortSignal): Promise<void> {\n await this.client.runs.cancel(threadId, runId, false, 'interrupt', { signal });\n }\n\n /** Load persisted checkpoint history for a thread. */\n async getHistory(threadId: string, signal: AbortSignal): Promise<ThreadState[]> {\n return this.client.threads.getHistory(threadId, { signal });\n }\n\n /** Update server-side thread state, e.g. to remove messages for regenerate rollback. */\n async updateState(\n threadId: string,\n values: Record<string, unknown>,\n _signal: AbortSignal,\n options?: { asNode?: string },\n ): Promise<void> {\n const body: { values: Record<string, unknown>; asNode?: string } = { values };\n if (options?.asNode !== undefined) {\n body.asNode = options.asNode;\n }\n await this.client.threads.updateState(threadId, body);\n }\n}\n\nfunction buildRunPayload(\n input: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n): {\n input: Record<string, unknown> | null;\n streamMode: StreamMode[];\n streamSubgraphs: boolean;\n signal: AbortSignal;\n} & Omit<LangGraphSubmitOptions, 'signal' | 'resume' | 'checkpoint' | 'streamMode' | 'streamSubgraphs'> {\n const runOptions = { ...(options ?? {}) };\n const hasCheckpoint = Object.prototype.hasOwnProperty.call(runOptions, 'checkpoint');\n const checkpoint = runOptions.checkpoint;\n const streamMode = runOptions.streamMode;\n const streamSubgraphs = runOptions.streamSubgraphs;\n delete runOptions.signal;\n delete runOptions.resume;\n delete runOptions.checkpoint;\n delete runOptions.streamMode;\n delete runOptions.streamSubgraphs;\n\n return {\n ...runOptions,\n ...(hasCheckpoint ? { checkpoint } : {}),\n input: input as Record<string, unknown> | null,\n streamMode: streamMode ?? defaultStreamMode(),\n streamSubgraphs: streamSubgraphs ?? true,\n signal,\n };\n}\n\nfunction defaultStreamMode(): StreamMode[] {\n // 'tools' is intentionally omitted: not supported by langgraph_api < 0.9.x\n // Servers reject the entire request with HTTP 422 if any stream_mode in\n // the array is unknown to them. Tool-call data is still derivable from\n // the messages stream.\n return ['values', 'messages-tuple', 'updates', 'custom'];\n}\n\nfunction normalizeSdkEvent(type: StreamEvent['type'], data: unknown): StreamEvent {\n const namespace = extractNamespace(type);\n const baseType = getBaseEventType(type);\n\n if (baseType === 'messages' && Array.isArray(data) && data.length === 2 && isRecord(data[1])) {\n return { type, ...(namespace ? { namespace } : {}), messages: [data[0]], messageMetadata: data[1], data };\n }\n\n if (isMessagesEvent(type) && Array.isArray(data)) {\n return { type, ...(namespace ? { namespace } : {}), messages: data, data };\n }\n\n if (isRecord(data)) {\n return { type, ...(namespace ? { namespace } : {}), ...data, data };\n }\n\n return { type, ...(namespace ? { namespace } : {}), data };\n}\n\nfunction isMessagesEvent(type: StreamEvent['type']): boolean {\n const baseType = getBaseEventType(type);\n return baseType === 'messages' || baseType.startsWith('messages/');\n}\n\nfunction getBaseEventType(type: StreamEvent['type']): string {\n return String(type).split('|')[0];\n}\n\nfunction extractNamespace(type: StreamEvent['type']): string[] | undefined {\n const parts = String(type).split('|');\n return parts.length > 1 ? parts.slice(1) : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","// SPDX-License-Identifier: MIT\nimport type { BaseMessage } from '@langchain/core/messages';\nimport {\n completeDelivery,\n staticDelivery,\n streamingDelivery,\n type MessageDelivery,\n} from '@threadplane/chat';\n\nexport interface TrackedToolCall {\n id?: string;\n name: string;\n args: Record<string, unknown> | string;\n}\n\nexport interface TrackedSubagent {\n id: string;\n generation: string;\n /**\n * How this child stream came to exist. 'tool' children are delegation tool\n * calls (registered from the parent's AI message, keyed by tool-call id);\n * 'subgraph' children are plain compiled-graph nodes (registered from their\n * first namespaced stream event, keyed by the namespace segment itself).\n */\n kind: 'tool' | 'subgraph';\n status: 'pending' | 'running' | 'complete' | 'error';\n toolCall: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n };\n values: Record<string, unknown>;\n messages: BaseMessage[];\n}\n\nexport interface SubagentTrackerOptions {\n subagentToolNames?: string[];\n onSubagentChange?: () => void;\n}\n\nconst DEFAULT_SUBAGENT_TOOL_NAMES = ['task'];\nlet subagentGenerationSequence = 0;\n\nfunction createSubagentGeneration(): string {\n subagentGenerationSequence += 1;\n return `subagent-${subagentGenerationSequence}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Lightweight Angular adapter for LangGraph subagent stream state.\n *\n * This intentionally mirrors only the SDK behavior this package exposes. Using\n * the SDK UI barrel at runtime pulls StreamManager/client utilities into every\n * Angular bundle, which breaks cockpit production budgets.\n */\nexport class SubagentTracker {\n private readonly subagentToolNames: Set<string>;\n private readonly onSubagentChange?: () => void;\n private readonly subagents = new Map<string, TrackedSubagent>();\n private readonly namespaceToToolCallId = new Map<string, string>();\n /**\n * Child messages received under a namespace that is not yet attributed to a\n * registered subagent. LangGraph's `tools:<id>` namespace carries an internal\n * run UUID, not the parent's tool-call id, and the two are only reconciled\n * once a `values` event arrives carrying the child's first human message. Any\n * chunk streamed before that point would otherwise be dropped — which is what\n * made subagent cards render \"0 message(s)\" despite a full child transcript.\n *\n * Merged by id like a real transcript, so this stays bounded by the child's\n * distinct message count rather than by chunk volume.\n */\n private readonly unattributedMessages = new Map<string, BaseMessage[]>();\n private readonly pendingMatches = new Map<string, string>();\n\n constructor(options: SubagentTrackerOptions = {}) {\n this.subagentToolNames = new Set(options.subagentToolNames ?? DEFAULT_SUBAGENT_TOOL_NAMES);\n this.onSubagentChange = options.onSubagentChange;\n }\n\n clear(): void {\n this.subagents.clear();\n this.namespaceToToolCallId.clear();\n this.pendingMatches.clear();\n this.unattributedMessages.clear();\n this.onSubagentChange?.();\n }\n\n getSubagents(): Map<string, TrackedSubagent> {\n const visible = new Map<string, TrackedSubagent>();\n for (const [id, subagent] of this.subagents) {\n if (subagent.status !== 'pending') {\n visible.set(id, subagent);\n }\n }\n return visible;\n }\n\n registerFromToolCalls(toolCalls: TrackedToolCall[], aiMessageId?: string | null): void {\n let changed = false;\n for (const toolCall of toolCalls) {\n if (!this.subagentToolNames.has(toolCall.name)) continue;\n\n const id = toolCall.id;\n if (!id) continue;\n\n const args = parseToolCallArgs(toolCall.args);\n if (!isValidSubagentType(args['subagent_type'])) continue;\n\n const existing = this.subagents.get(id);\n this.subagents.set(id, {\n id,\n generation: existing?.generation ?? createSubagentGeneration(),\n kind: 'tool',\n status: existing?.status ?? 'pending',\n toolCall: {\n id,\n name: toolCall.name,\n args: {\n ...args,\n ...(aiMessageId ? { _aiMessageId: aiMessageId } : {}),\n },\n },\n values: existing?.values ?? {},\n messages: existing?.messages ?? [],\n });\n changed = true;\n }\n\n if (changed) {\n this.retryPendingMatches();\n this.onSubagentChange?.();\n }\n }\n\n reconstructFromMessages(messages: BaseMessage[], options: { skipIfPopulated?: boolean } = {}): void {\n if (options.skipIfPopulated && this.subagents.size > 0) return;\n\n for (const message of messages) {\n const raw = message as unknown as Record<string, unknown>;\n if (isAiMessageWithToolCalls(raw)) {\n this.registerFromToolCalls(\n raw['tool_calls'] as TrackedToolCall[],\n typeof raw['id'] === 'string' ? raw['id'] : null,\n );\n } else if (isToolMessage(raw)) {\n this.processToolMessage(raw['tool_call_id'], raw['content'], raw['status'] === 'error' ? 'error' : 'success');\n }\n }\n }\n\n matchSubgraphToSubagent(namespaceId: string, description: string): string | undefined {\n if (this.namespaceToToolCallId.has(namespaceId)) {\n return this.namespaceToToolCallId.get(namespaceId);\n }\n\n const mapped = new Set(this.namespaceToToolCallId.values());\n const establish = (toolCallId: string): string => {\n this.namespaceToToolCallId.set(namespaceId, toolCallId);\n const subagent = this.subagents.get(toolCallId);\n if (subagent) {\n const buffered = this.unattributedMessages.get(namespaceId);\n this.subagents.set(toolCallId, {\n ...subagent,\n status: subagent.status === 'complete' || subagent.status === 'error' ? subagent.status : 'running',\n messages: buffered ? mergeMessages(subagent.messages, buffered) : subagent.messages,\n });\n this.unattributedMessages.delete(namespaceId);\n }\n this.onSubagentChange?.();\n return toolCallId;\n };\n\n for (const [toolCallId, subagent] of this.subagents) {\n if (subagent.kind !== 'tool' || mapped.has(toolCallId)) continue;\n if (subagent.toolCall.args['description'] === description) {\n return establish(toolCallId);\n }\n }\n\n for (const [toolCallId, subagent] of this.subagents) {\n if (subagent.kind !== 'tool' || mapped.has(toolCallId)) continue;\n const subagentDescription = subagent.toolCall.args['description'];\n if (typeof subagentDescription !== 'string' || !subagentDescription) continue;\n if (description.includes(subagentDescription) || subagentDescription.includes(description)) {\n return establish(toolCallId);\n }\n }\n\n // Last-resort fallback — tool children only. A subgraph child is keyed by\n // its own namespace and must never absorb an unrelated child's events.\n for (const [toolCallId, subagent] of this.subagents) {\n if (subagent.kind !== 'tool') continue;\n if (!mapped.has(toolCallId) && (subagent.status === 'pending' || subagent.status === 'running')) {\n return establish(toolCallId);\n }\n }\n\n if (description) {\n this.pendingMatches.set(namespaceId, description);\n }\n return undefined;\n }\n\n markRunningFromNamespace(namespaceId: string, namespace?: string[]): void {\n const toolCallId = this.resolveToolCallId(namespaceId);\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return;\n\n if (!this.namespaceToToolCallId.has(namespaceId)) {\n this.namespaceToToolCallId.set(namespaceId, toolCallId);\n }\n this.subagents.set(toolCallId, {\n ...subagent,\n status: subagent.status === 'complete' || subagent.status === 'error' ? subagent.status : 'running',\n values: {\n ...subagent.values,\n ...(namespace ? { namespace } : {}),\n },\n });\n this.onSubagentChange?.();\n }\n\n /**\n * Attribute a `tools:` child stream to its parent tool call as soon as the\n * child is seen, without requiring a description to match on.\n *\n * The description ladder needs two things this repo's own graphs don't\n * reliably provide: a delegation tool that names its argument `description`,\n * and a child whose first message is the human task. `cockpit/chat/subagents`\n * has neither — it uses `task_description`, and its child's messages begin\n * with the AI reply. Attribution therefore never ran, so the child's\n * transcript was never claimed and every card rendered \"0 message(s)\".\n *\n * Calling the ladder with no description skips both description rungs and\n * lands on the positional fallback (first unmapped pending/running tool\n * child), which is correct for sequential dispatch and is the same heuristic\n * the ladder already relied on in practice.\n */\n ensureToolStreamAttribution(namespaceId: string): void {\n if (this.namespaceToToolCallId.has(namespaceId)) return;\n this.matchSubgraphToSubagent(namespaceId, '');\n }\n\n /**\n * Register a plain-subgraph child stream on its first namespaced event.\n *\n * Unlike tool children — announced ahead of time by the parent's tool call —\n * a compiled child added as a plain node has no announcement: its existence\n * is learned from the first event carrying its namespace. It starts\n * 'running' because by the time we see an event, it is.\n */\n ensureSubgraphStream(key: string, name: string): void {\n if (this.subagents.has(key)) return;\n this.subagents.set(key, {\n id: key,\n generation: createSubagentGeneration(),\n kind: 'subgraph',\n status: 'running',\n toolCall: { id: key, name, args: {} },\n values: {},\n messages: [],\n });\n this.onSubagentChange?.();\n }\n\n /**\n * Settle still-running subgraph children when the run reaches a terminal\n * outcome. Tool children settle through their tool result\n * (`processToolMessage`); subgraph children have no result message, so the\n * run's own settle is their completion signal. Paused/interrupted runs must\n * NOT call this — a child can resume with the thread.\n */\n settleRunningSubgraphs(outcome: 'complete' | 'error'): void {\n let changed = false;\n for (const [key, subagent] of this.subagents) {\n if (subagent.kind !== 'subgraph' || subagent.status !== 'running') continue;\n this.subagents.set(key, { ...subagent, status: outcome });\n changed = true;\n }\n if (changed) this.onSubagentChange?.();\n }\n\n updateSubagentValues(namespaceId: string, values: Record<string, unknown>): void {\n const toolCallId = this.resolveToolCallId(namespaceId);\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return;\n\n this.subagents.set(toolCallId, {\n ...subagent,\n status: subagent.status === 'complete' || subagent.status === 'error' ? subagent.status : 'running',\n values,\n });\n this.onSubagentChange?.();\n }\n\n addMessageToSubagent(namespaceId: string, message: BaseMessage): void {\n const toolCallId = this.resolveToolCallId(namespaceId);\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) {\n // Not attributed yet — hold it rather than drop it. `establish()` will\n // replay the buffer the moment this namespace is matched to a tool call.\n this.unattributedMessages.set(\n namespaceId,\n mergeMessages(this.unattributedMessages.get(namespaceId) ?? [], [message]),\n );\n return;\n }\n\n this.subagents.set(toolCallId, {\n ...subagent,\n status: subagent.status === 'complete' || subagent.status === 'error' ? subagent.status : 'running',\n messages: mergeMessages(subagent.messages, [message]),\n });\n this.onSubagentChange?.();\n }\n\n processToolMessage(toolCallId: string, content: unknown, status: 'success' | 'error'): void {\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return;\n\n this.subagents.set(toolCallId, {\n ...subagent,\n status: status === 'error' ? 'error' : 'complete',\n values: {\n ...subagent.values,\n result: content,\n },\n });\n this.onSubagentChange?.();\n }\n\n getMessageDelivery(toolCallId: string, message: BaseMessage): MessageDelivery {\n const id = getMessageId(message) ?? toolCallId;\n const raw = message as unknown as Record<string, unknown>;\n const type = typeof message._getType === 'function' ? message._getType() : raw['type'];\n if (type !== 'ai' && type !== 'assistant' && type !== 'AIMessage' && type !== 'AIMessageChunk') {\n return staticDelivery(id);\n }\n\n const subagent = this.subagents.get(toolCallId);\n if (!subagent) return staticDelivery(id);\n if (subagent.status === 'error') return completeDelivery(subagent.generation, 'error');\n if (subagent.status === 'complete') return completeDelivery(subagent.generation, 'success');\n return streamingDelivery(subagent.generation);\n }\n\n private retryPendingMatches(): void {\n for (const [namespaceId, description] of this.pendingMatches) {\n if (this.matchSubgraphToSubagent(namespaceId, description)) {\n this.pendingMatches.delete(namespaceId);\n }\n }\n }\n\n private resolveToolCallId(namespaceId: string): string {\n return this.namespaceToToolCallId.get(namespaceId) ?? namespaceId;\n }\n}\n\n/**\n * True when a stream event belongs to a child graph rather than the parent —\n * i.e. it carries any namespace at all. This is the single classification\n * question; which child owns the event is a separate (attribution) question.\n *\n * Kept consistent with the terminal-evidence guard, which has always refused\n * ANY namespaced event as proof the parent run finished.\n */\nexport function isChildNamespace(namespace: string[] | string | undefined): boolean {\n if (!namespace) return false;\n if (typeof namespace === 'string') return namespace.length > 0;\n return namespace.length > 0;\n}\n\n/** Resolved identity of a child stream, derived from its event namespace. */\nexport interface ChildStreamRef {\n /** Map key: the tool-call id for `tools:` namespaces, else the namespace segment itself. */\n key: string;\n /** Display name; for subgraph nodes, the node name. Unused on the tool path. */\n name: string;\n kind: 'tool' | 'subgraph';\n}\n\n/**\n * Derive a child stream's identity from an event namespace.\n *\n * `tools:<id>` segments identify a tool-dispatched child by its tool-call id.\n * Any other segment (e.g. `research:<uuid>` from a compiled graph added with\n * `add_node`) identifies a plain subgraph child: the full segment is the key\n * (unique per invocation) and the part before the first ':' is the node name.\n */\nexport function childStreamRefFromNamespace(namespace: string[]): ChildStreamRef | undefined {\n for (const segment of namespace) {\n if (segment.startsWith('tools:')) {\n return { key: segment.slice(6), name: '', kind: 'tool' };\n }\n }\n const first = namespace[0];\n if (!first) return undefined;\n const colon = first.indexOf(':');\n return { key: first, name: colon > 0 ? first.slice(0, colon) : first, kind: 'subgraph' };\n}\n\nexport function extractToolCallIdFromNamespace(namespace: string[] | undefined): string | undefined {\n if (!namespace) return undefined;\n for (const segment of namespace) {\n if (segment.startsWith('tools:')) return segment.slice(6);\n }\n return undefined;\n}\n\nfunction parseToolCallArgs(args: Record<string, unknown> | string): Record<string, unknown> {\n if (typeof args !== 'string') return args;\n try {\n const parsed = JSON.parse(args) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nfunction isValidSubagentType(value: unknown): value is string {\n return typeof value === 'string'\n && value.length >= 3\n && value.length <= 50\n && /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(value);\n}\n\nfunction isAiMessageWithToolCalls(value: Record<string, unknown>): boolean {\n return (value['type'] === 'ai' || value['type'] === 'assistant')\n && Array.isArray(value['tool_calls']);\n}\n\nfunction isToolMessage(value: Record<string, unknown>): value is Record<string, unknown> & { tool_call_id: string } {\n return value['type'] === 'tool' && typeof value['tool_call_id'] === 'string';\n}\n\nfunction mergeMessages(existing: BaseMessage[], incoming: BaseMessage[]): BaseMessage[] {\n const merged = [...existing];\n for (const msg of incoming) {\n const id = getMessageId(msg);\n const idx = id ? merged.findIndex(m => getMessageId(m) === id) : -1;\n if (idx >= 0) {\n merged[idx] = accumulateChunk(merged[idx], msg);\n } else {\n merged.push(msg);\n }\n }\n return merged;\n}\n\n/**\n * Fold a streamed chunk into the message it belongs to.\n *\n * A child graph streams `AIMessageChunk`s that are *deltas* — a handful of\n * characters each, hundreds per message. Replacing by id (the previous\n * behavior) therefore kept only the final delta, so a fully attributed\n * subagent still rendered a near-empty message. Snapshots, which carry the\n * message-so-far, still replace.\n *\n * This mirrors the parent transcript's delta handling: append unconditionally\n * rather than comparing text, because a prefix-style \"dedupe\" silently eats\n * legitimate tokens that happen to repeat the accumulated prefix.\n */\nfunction accumulateChunk(existing: BaseMessage, incoming: BaseMessage): BaseMessage {\n if (!isChunkMessage(incoming)) return incoming;\n const previousText = extractText((existing as unknown as Record<string, unknown>)['content']);\n const incomingText = extractText((incoming as unknown as Record<string, unknown>)['content']);\n if (!incomingText) return existing;\n if (!previousText) return incoming;\n return { ...(incoming as object), content: previousText + incomingText } as BaseMessage;\n}\n\nfunction isChunkMessage(message: BaseMessage): boolean {\n const type = (message as unknown as Record<string, unknown>)['type'];\n return typeof type === 'string' && type.endsWith('Chunk');\n}\n\nfunction extractText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (typeof block === 'string') { out += block; continue; }\n if (block == null || typeof block !== 'object') continue;\n const record = block as Record<string, unknown>;\n const blockType = record['type'];\n if (blockType === 'text' || blockType === 'output_text' || blockType === undefined) {\n const text = record['text'];\n if (typeof text === 'string') out += text;\n }\n }\n return out;\n}\n\nfunction getMessageId(message: BaseMessage): string | undefined {\n return (message as unknown as { id?: string }).id;\n}\n","// SPDX-License-Identifier: MIT\nimport { signal, type Signal } from '@angular/core';\nimport { Observable, takeUntil } from 'rxjs';\nimport {\n ResourceStatus,\n AgentOptions,\n StreamSubjects,\n StreamEvent,\n AgentTransport,\n SubagentStreamRef,\n AgentQueue,\n AgentQueueEntry,\n LangGraphSubmitOptions,\n} from '../agent.types';\nimport { FetchStreamTransport } from '../transport/fetch-stream.transport';\nimport { BagTemplate } from '@langchain/langgraph-sdk';\nimport { getToolCallsWithResults } from '@langchain/langgraph-sdk/utils';\nimport type {\n AgentRuntimeTelemetryEvent,\n AgentRuntimeTelemetryProperties,\n AgentRuntimeTelemetrySink,\n} from '@threadplane/chat';\nimport {\n AgentError,\n AGENT_ERROR_MESSAGES,\n completeDelivery,\n isAbortError,\n staticDelivery,\n streamingDelivery,\n toAgentError,\n type CompleteOutcome,\n type MessageDelivery,\n} from '@threadplane/chat';\nimport {\n SubagentTracker,\n TrackedSubagent,\n childStreamRefFromNamespace,\n isChildNamespace,\n} from './subagent-tracker';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { Interrupt, Message as LangGraphMessage, ThreadState, ToolCallWithResult, ToolProgress } from '@langchain/langgraph-sdk';\n\n// Local copy of the trace harness — same gating as @threadplane/chat's trace.ts.\n// Duplicated here to avoid an @threadplane/chat dep on the langgraph internals path.\nfunction isLgTraceEnabled(): boolean {\n if (typeof globalThis === 'undefined') return false;\n const win = (globalThis as { window?: { __threadplaneChatTrace?: boolean; localStorage?: Storage } }).window;\n if (!win) return false;\n if (win.__threadplaneChatTrace === true) return true;\n try { return win.localStorage?.getItem('THREADPLANE_CHAT_STREAM_TRACE') === '1'; } catch { return false; }\n}\nfunction lgTrace(...args: unknown[]): void {\n if (isLgTraceEnabled()) {\n // eslint-disable-next-line no-console\n console.debug('[tplane-chat-stream]', ...args);\n }\n}\n\nfunction captureAgentRuntimeTelemetry(\n sink: AgentRuntimeTelemetrySink | false | undefined,\n event: AgentRuntimeTelemetryEvent,\n properties: AgentRuntimeTelemetryProperties,\n): void {\n if (!sink) return;\n try {\n void Promise.resolve(sink({ event, properties })).catch(() => undefined);\n } catch {\n // Keep telemetry side effects isolated from stream control flow.\n }\n}\n\nfunction agentRuntimeTelemetryErrorClass(error: unknown): string {\n if (error instanceof Error) return error.name || error.constructor.name || 'Error';\n if (\n error\n && typeof error === 'object'\n && 'name' in error\n && typeof error.name === 'string'\n && error.name.length > 0\n ) {\n return error.name;\n }\n return 'UnknownError';\n}\n\nexport interface StreamManagerBridgeOptions<T, ResolvedBag extends BagTemplate = BagTemplate> {\n options: AgentOptions<T, ResolvedBag> & { apiUrl: string };\n subjects: StreamSubjects<T, ResolvedBag>;\n threadId$: Observable<string | null>;\n destroy$: Observable<void>;\n}\n\ntype ResubmitOutcome = CompleteOutcome | 'not-started';\n\nexport interface StreamManagerBridge {\n submit: (values: unknown, opts?: LangGraphSubmitOptions) => Promise<CompleteOutcome>;\n stop: () => Promise<void>;\n switchThread: (id: string | null) => void;\n joinStream: (runId: string, lastEventId?: string) => Promise<void>;\n resubmitLast: () => Promise<ResubmitOutcome>;\n getReasoningDurationMs:(id: string) => number | undefined;\n getMessageDelivery: (id: string) => MessageDelivery;\n getSubagentMessageDelivery: (toolCallId: string, message: BaseMessage) => MessageDelivery;\n deliveryRevision: Signal<number>;\n /** Update server-side thread state (e.g. RemoveMessage for regenerate rollback). */\n updateState: (values: Record<string, unknown>, opts?: { asNode?: string }) => Promise<void>;\n /** The current thread ID tracked by the bridge (null if not yet known). */\n readonly currentThreadId: string | null;\n}\n\nexport function createStreamManagerBridge<T, ResolvedBag extends BagTemplate = BagTemplate>(\n { options, subjects, threadId$, destroy$ }: StreamManagerBridgeOptions<T, ResolvedBag>\n): StreamManagerBridge {\n // Intercept onThreadId to update currentThreadId when the transport\n // auto-creates a thread. Without this, each submit() creates a new thread\n // because currentThreadId stays null.\n const userOnThreadId = options.onThreadId;\n const wrappedOnThreadId = (id: string) => {\n currentThreadId = id;\n userOnThreadId?.(id);\n };\n const transport: AgentTransport =\n options.transport ?? new FetchStreamTransport(options.apiUrl, wrappedOnThreadId, options.clientOptions);\n\n let currentThreadId: string | null = null;\n let lastPayload: unknown = null;\n let lastOptions: LangGraphSubmitOptions | undefined;\n let abortController: AbortController | null = null;\n let historyAbortController: AbortController | null = null;\n let hasSeenThreadId = false;\n const userAbortedControllers = new WeakSet<AbortController>();\n const toolProgressMap = new Map<string, ToolProgress>();\n // Message ids whose content is known-final (installed by a canonical\n // replacement). Late streamed deltas for these ids are stale stragglers and\n // are ignored — decided by identity, never by comparing text to text.\n const canonicalMessageIds = new Set<string>();\n const queuedRuns: AgentQueueEntry[] = [];\n let queueDrainEpoch = 0;\n let activeQueueDrainEpoch: number | null = null;\n let attemptSequence = 0;\n const messageDeliveries = new Map<string, MessageDelivery>();\n const deliveryRevision = signal(0);\n type DeliveryAttempt = {\n generation: string;\n messageIds: Set<string>;\n finalizedMessageIds: Set<string>;\n baselineMessageIds: Set<string>;\n eligibleBaselineAssistantId?: string;\n currentAssistantMessageId?: string;\n sawAssistantChunk: boolean;\n currentStepHasTerminalEvidence: boolean;\n awaitingFinalSync: boolean;\n terminalOutcome?: CompleteOutcome;\n };\n let activeAttempt: DeliveryAttempt | null = null;\n const subagentManager = new SubagentTracker({\n subagentToolNames: options.subagentToolNames,\n onSubagentChange: publishSubagents,\n });\n const telemetryProperties = { transport: 'langgraph' as const, surface: 'agent' };\n captureAgentRuntimeTelemetry(\n options.telemetry,\n 'tplane:runtime_instance_created',\n telemetryProperties,\n );\n\n function captureRuntimeRequestTelemetry(requestType: string): void {\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:runtime_request_created', {\n ...telemetryProperties,\n requestType,\n });\n }\n\n /**\n * Tracks reasoning timing per message id. Keys are message ids; values\n * record when reasoning content first arrived and when response text\n * first appeared (or the canonical message arrived). Cleared on\n * resetThreadState() and on bridge teardown.\n */\n const reasoningTimingMap = new Map<string, { startedAt: number; endedAt?: number }>();\n\n function notifyDeliveryChange(): void {\n deliveryRevision.update(revision => revision + 1);\n }\n\n function beginAttempt(allowBaselineTail = false): DeliveryAttempt {\n if (activeAttempt?.awaitingFinalSync) {\n historyAbortController?.abort();\n }\n if (activeAttempt && !activeAttempt.terminalOutcome) {\n finalizeAttempt(activeAttempt, 'interrupted');\n }\n const baselineMessageIds = new Set<string>();\n for (const message of subjects.messages$.value) {\n const id = (message as unknown as Record<string, unknown>)['id'];\n if (typeof id === 'string') baselineMessageIds.add(id);\n }\n attemptSequence += 1;\n const attempt: DeliveryAttempt = {\n generation: `attempt-${attemptSequence}-${Math.random().toString(36).slice(2, 10)}`,\n messageIds: new Set(),\n finalizedMessageIds: new Set(),\n baselineMessageIds,\n eligibleBaselineAssistantId: allowBaselineTail\n ? getTailAssistantMessageId(subjects.messages$.value)\n : undefined,\n sawAssistantChunk: false,\n currentStepHasTerminalEvidence: false,\n awaitingFinalSync: false,\n };\n activeAttempt = attempt;\n return attempt;\n }\n\n function isCurrentExecution(controller: AbortController, attempt: DeliveryAttempt): boolean {\n return abortController === controller && activeAttempt === attempt;\n }\n\n function setDelivery(id: string, delivery: MessageDelivery): void {\n const previous = messageDeliveries.get(id);\n if (\n previous?.generation === delivery.generation\n && previous.phase === delivery.phase\n && (previous.phase !== 'complete' || delivery.phase !== 'complete' || previous.outcome === delivery.outcome)\n ) {\n return;\n }\n messageDeliveries.set(id, delivery);\n notifyDeliveryChange();\n }\n\n function finalizeMessage(attempt: DeliveryAttempt, id: string, outcome: CompleteOutcome): void {\n setDelivery(id, completeDelivery(attempt.generation, outcome));\n attempt.finalizedMessageIds.add(id);\n }\n\n function finalizeAttempt(attempt: DeliveryAttempt, outcome: CompleteOutcome): void {\n if (attempt.terminalOutcome) return;\n attempt.terminalOutcome = outcome;\n for (const id of attempt.messageIds) {\n if (attempt.finalizedMessageIds.has(id)) continue;\n finalizeMessage(attempt, id, outcome);\n }\n // Subgraph children have no tool result to settle them; the run's own\n // terminal outcome is their completion signal. Paused/interrupted runs\n // are excluded — a child can resume with the thread.\n if (outcome === 'success' || outcome === 'error' || outcome === 'aborted') {\n subagentManager.settleRunningSubgraphs(outcome === 'success' ? 'complete' : 'error');\n publishSubagents();\n }\n }\n\n function finishOutcome(attempt: DeliveryAttempt): CompleteOutcome {\n return attempt.terminalOutcome\n ?? (attempt.currentStepHasTerminalEvidence || !attempt.sawAssistantChunk ? 'success' : 'interrupted');\n }\n\n async function finalizeClosedAttempt(\n controller: AbortController,\n attempt: DeliveryAttempt,\n ): Promise<CompleteOutcome | null> {\n if (attempt.terminalOutcome) return attempt.terminalOutcome;\n\n const outcome = finishOutcome(attempt);\n attempt.awaitingFinalSync = true;\n try {\n await refreshHistory(\n true,\n () => isCurrentExecution(controller, attempt) && !attempt.terminalOutcome,\n );\n } finally {\n attempt.awaitingFinalSync = false;\n }\n\n if (!isCurrentExecution(controller, attempt)) return null;\n if (!attempt.terminalOutcome) finalizeAttempt(attempt, outcome);\n return attempt.terminalOutcome ?? outcome;\n }\n\n function trackAssistantMessages(messages: BaseMessage[]): void {\n const attempt = activeAttempt;\n if (!attempt || attempt.terminalOutcome) return;\n\n const assistantMessages = messages.filter(message => {\n const raw = message as unknown as Record<string, unknown>;\n const type = normalizeMessageType(\n typeof message._getType === 'function' ? message._getType() : raw['type'] as string | undefined,\n );\n const id = typeof raw['id'] === 'string' ? raw['id'] : undefined;\n return type === 'ai' && id && !attempt.finalizedMessageIds.has(id);\n });\n const newAssistantMessages = assistantMessages.filter(message => {\n const id = (message as unknown as Record<string, unknown>)['id'];\n return typeof id === 'string' && !attempt.baselineMessageIds.has(id);\n });\n const currentStepMessages = newAssistantMessages.length > 0\n ? newAssistantMessages\n : assistantMessages.filter(message =>\n (message as unknown as Record<string, unknown>)['id'] === attempt.eligibleBaselineAssistantId\n );\n\n for (const message of currentStepMessages) {\n const id = (message as unknown as Record<string, unknown>)['id'] as string;\n\n if (attempt.currentAssistantMessageId && attempt.currentAssistantMessageId !== id) {\n finalizeMessage(attempt, attempt.currentAssistantMessageId, 'success');\n attempt.currentStepHasTerminalEvidence = false;\n }\n attempt.currentAssistantMessageId = id;\n attempt.messageIds.add(id);\n attempt.sawAssistantChunk = true;\n setDelivery(id, streamingDelivery(attempt.generation));\n }\n }\n\n function invalidateQueueDrain(): void {\n queueDrainEpoch += 1;\n activeQueueDrainEpoch = null;\n }\n\n function markNormalTerminal(event: StreamEvent): void {\n const attempt = activeAttempt;\n if (\n !attempt\n || attempt.terminalOutcome\n || !attempt.sawAssistantChunk\n || (getEventNamespace(event)?.length ?? 0) > 0\n ) return;\n const baseType = getBaseEventType(event.type);\n // These are the canonical state/snapshot signals available in the current\n // transport contract. Iterator close alone is deliberately not terminal\n // evidence: after assistant chunks, a close without one of these markers\n // is classified as interrupted.\n if (baseType === 'values' || baseType === 'messages/complete' || baseType === 'checkpoints') {\n attempt.currentStepHasTerminalEvidence = true;\n }\n }\n\n function resetThreadState(): void {\n historyAbortController?.abort();\n subjects.values$.next({} as T);\n subjects.messages$.next([]);\n subjects.history$.next([]);\n subjects.interrupt$.next(undefined);\n subjects.interrupts$.next([]);\n subjects.toolProgress$.next([]);\n subjects.toolCalls$.next([]);\n subjects.messageMetadata$.next(new Map());\n subjects.subagents$.next(new Map());\n void cancelQueueEntries(takeQueuedRuns()).catch(err => subjects.error$.next(toAgentError(err)));\n publishQueue();\n subjects.custom$.next([]);\n subjects.isThreadLoading$.next(false);\n toolProgressMap.clear();\n subagentManager.clear();\n reasoningTimingMap.clear();\n canonicalMessageIds.clear();\n if (activeAttempt && !activeAttempt.terminalOutcome) {\n finalizeAttempt(activeAttempt, 'interrupted');\n }\n messageDeliveries.clear();\n activeAttempt = null;\n notifyDeliveryChange();\n }\n\n function setThreadId(id: string | null, resetState: boolean): void {\n if (resetState) {\n invalidateQueueDrain();\n abortController?.abort();\n lastPayload = null;\n lastOptions = undefined;\n }\n currentThreadId = id;\n if (resetState) {\n resetThreadState();\n }\n void refreshHistory();\n }\n\n // Track threadId changes\n threadId$.pipe(takeUntil(destroy$)).subscribe(id => {\n const shouldReset = hasSeenThreadId && currentThreadId !== id;\n hasSeenThreadId = true;\n setThreadId(id, shouldReset);\n });\n\n destroy$.subscribe(() => {\n invalidateQueueDrain();\n abortController?.abort();\n historyAbortController?.abort();\n reasoningTimingMap.clear();\n if (activeAttempt && !activeAttempt.terminalOutcome) {\n finalizeAttempt(activeAttempt, 'interrupted');\n }\n messageDeliveries.clear();\n activeAttempt = null;\n notifyDeliveryChange();\n });\n\n async function refreshHistory(force = false, isRelevant: () => boolean = () => true): Promise<void> {\n const getHistory = transport.getHistory?.bind(transport);\n if (!currentThreadId || !getHistory) return;\n\n historyAbortController?.abort();\n const controller = new AbortController();\n historyAbortController = controller;\n const threadId = currentThreadId;\n subjects.isThreadLoading$.next(true);\n\n try {\n const history = await waitForHistory(getHistory(threadId, controller.signal), controller.signal);\n if (!controller.signal.aborted && currentThreadId === threadId && isRelevant()) {\n subjects.history$.next(history as ThreadState<T>[]);\n\n // Project the latest checkpoint into messages$ + values$:\n // - On first connect (`force=false`): only when messages$ is\n // empty, so optimistic local state isn't clobbered.\n // - At run completion (`force=true`): always — server state is\n // authoritative for node-level mutations (e.g. RemoveMessage\n // or id-match content replacement performed by post-process\n // nodes), and the streaming SDK doesn't always restream those.\n const latest = history[0] as\n | { values?: { messages?: BaseMessage[] } & T }\n | undefined;\n const shouldProject = latest?.values\n && (force || subjects.messages$.value.length === 0);\n if (shouldProject) {\n const restoredMessages = latest.values?.messages ?? [];\n const restoredValues = { ...(latest.values as T) };\n // Strip the `messages` field from values — messages$ is the\n // canonical surface for them; keeping a duplicate in values$\n // would confuse downstream consumers reading both subjects.\n delete (restoredValues as { messages?: unknown }).messages;\n subjects.messages$.next(preserveIds(subjects.messages$.value, restoredMessages));\n subjects.values$.next(restoredValues);\n // Rebuild derived subjects from the new authoritative messages$.\n // Tool-call results displayed by chat-tool-calls come from\n // toolCalls$, which is built from messages$; without this, the\n // panel keeps showing the streamed pre-mutation content.\n syncToolCallsFromMessages();\n }\n\n // Hydrate pending interrupts from the latest checkpoint. When a\n // thread is reloaded mid-pause (paused at an interrupt), the\n // streaming events won't replay — interrupts live on the\n // checkpoint's tasks[i].interrupts and must be projected manually\n // so the interrupt panel re-renders on page reload.\n hydrateInterruptsFromHistory(history as ThreadState<T>[], subjects);\n }\n } catch (err) {\n if (!controller.signal.aborted && isRelevant() && (err as Error)?.name !== 'AbortError') {\n subjects.error$.next(toAgentError(err));\n }\n } finally {\n if (historyAbortController === controller) {\n historyAbortController = null;\n subjects.isThreadLoading$.next(false);\n }\n }\n }\n\n function waitForHistory<R>(history: Promise<R>, signal: AbortSignal): Promise<R> {\n if (signal.aborted) return Promise.reject(createHistoryAbortError());\n\n return new Promise<R>((resolve, reject) => {\n const onAbort = () => {\n cleanup();\n reject(createHistoryAbortError());\n };\n const cleanup = () => signal.removeEventListener('abort', onAbort);\n signal.addEventListener('abort', onAbort, { once: true });\n history.then(\n value => {\n cleanup();\n resolve(value);\n },\n error => {\n cleanup();\n reject(error);\n },\n );\n });\n }\n\n function createHistoryAbortError(): Error {\n const error = new Error('History refresh aborted.');\n error.name = 'AbortError';\n return error;\n }\n\n function publishQueue(): void {\n subjects.queue$.next(createQueueSnapshot());\n }\n\n function createQueueSnapshot(): AgentQueue {\n return {\n entries: [...queuedRuns],\n size: queuedRuns.length,\n cancel: cancelQueuedRun,\n clear: clearQueue,\n };\n }\n\n async function enqueueRun(payload: unknown, opts?: LangGraphSubmitOptions): Promise<void> {\n if (!currentThreadId) {\n throw new Error('Cannot enqueue a run before a LangGraph thread exists.');\n }\n if (!transport.createQueuedRun) {\n throw new Error('The configured LangGraph transport does not support server-side queueing.');\n }\n\n captureRuntimeRequestTelemetry('enqueue');\n const controller = new AbortController();\n const entry = await transport.createQueuedRun(\n options.assistantId,\n currentThreadId,\n payload,\n opts?.signal ?? controller.signal,\n opts,\n );\n queuedRuns.push({\n ...entry,\n values: payload,\n options: { ...opts, multitaskStrategy: 'enqueue' },\n createdAt: entry.createdAt ?? new Date(),\n });\n publishQueue();\n }\n\n async function cancelQueuedRun(id: string): Promise<boolean> {\n const index = queuedRuns.findIndex(entry => entry.id === id);\n if (index === -1) return false;\n\n const [entry] = queuedRuns.splice(index, 1);\n publishQueue();\n if (!entry || !transport.cancelRun) return false;\n await cancelQueueEntries([entry]);\n return true;\n }\n\n async function clearQueue(): Promise<void> {\n const entries = takeQueuedRuns();\n publishQueue();\n await cancelQueueEntries(entries);\n }\n\n function takeQueuedRuns(): AgentQueueEntry[] {\n return queuedRuns.splice(0, queuedRuns.length);\n }\n\n async function cancelQueueEntries(entries: AgentQueueEntry[]): Promise<void> {\n const cancelRun = transport.cancelRun?.bind(transport);\n if (!cancelRun) return;\n await Promise.all(entries.map(entry =>\n cancelRun(entry.threadId, entry.id, new AbortController().signal)\n ));\n }\n\n async function drainQueue(): Promise<void> {\n if (activeQueueDrainEpoch !== null || queuedRuns.length === 0) return;\n queueDrainEpoch += 1;\n const drainEpoch = queueDrainEpoch;\n activeQueueDrainEpoch = drainEpoch;\n try {\n while (queuedRuns.length > 0) {\n if (activeQueueDrainEpoch !== drainEpoch) return;\n const entry = queuedRuns.shift();\n publishQueue();\n if (!entry || !transport.joinStream) continue;\n await joinQueuedRun(entry, drainEpoch);\n }\n } finally {\n if (activeQueueDrainEpoch === drainEpoch) activeQueueDrainEpoch = null;\n }\n }\n\n async function joinQueuedRun(entry: AgentQueueEntry, drainEpoch: number): Promise<void> {\n if (activeQueueDrainEpoch !== drainEpoch) return;\n const controller = new AbortController();\n abortController = controller;\n const attempt = beginAttempt(true);\n const startedAt = Date.now();\n captureRuntimeRequestTelemetry('join_queued');\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);\n subjects.custom$.next([]);\n subjects.toolProgress$.next([]);\n toolProgressMap.clear();\n subjects.status$.next(ResourceStatus.Loading);\n\n try {\n const iter = transport.joinStream\n ? transport.joinStream(entry.threadId, entry.id, undefined, controller.signal)\n : [];\n for await (const event of iter) {\n if (controller.signal.aborted || !isCurrentExecution(controller, attempt)) break;\n processEvent(event);\n }\n if (!isCurrentExecution(controller, attempt)) return;\n const outcome = await finalizeClosedAttempt(controller, attempt);\n if (outcome === null) return;\n if (!controller.signal.aborted) {\n if (outcome !== 'error') {\n subjects.status$.next(ResourceStatus.Resolved);\n }\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n });\n }\n } catch (err) {\n if (!isCurrentExecution(controller, attempt)) return;\n if (attempt.terminalOutcome) return;\n if (isAbortError(err) && userAbortedControllers.has(controller)) {\n finalizeAttempt(attempt, 'aborted');\n subjects.error$.next(undefined);\n subjects.status$.next(ResourceStatus.Idle);\n } else {\n finalizeAttempt(attempt, attempt.sawAssistantChunk ? 'interrupted' : 'error');\n subjects.error$.next(toAgentError(err));\n subjects.status$.next(ResourceStatus.Error);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(err),\n });\n }\n } finally {\n if (abortController === controller) abortController = null;\n }\n }\n\n async function runStream(\n payload: unknown,\n opts?: LangGraphSubmitOptions,\n requestType = 'submit',\n ): Promise<CompleteOutcome> {\n invalidateQueueDrain();\n abortController?.abort();\n const controller = new AbortController();\n abortController = controller;\n const attempt = beginAttempt(\n requestType === 'resubmit' || (isRecord(opts?.command) && 'resume' in opts.command),\n );\n const startedAt = Date.now();\n captureRuntimeRequestTelemetry(requestType);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);\n\n subjects.status$.next(ResourceStatus.Loading);\n subjects.error$.next(undefined);\n subjects.custom$.next([]);\n subjects.toolProgress$.next([]);\n toolProgressMap.clear();\n canonicalMessageIds.clear();\n lastPayload = payload ?? null;\n lastOptions = opts;\n\n // Tracks whether at least one stream event has been processed this run.\n // Used to distinguish a mid-stream network interruption (kind:'interrupted')\n // from a fresh connect failure (falls through to toAgentError classification).\n let streamingStarted = false;\n\n // Optimistically inject human messages so they appear immediately\n // without waiting for the server to echo them back. Assign a stable id\n // when missing — track-by-id in the chat-message-list relies on stable\n // ids across re-emissions, otherwise the optimistic message gets torn\n // down + recreated on every messages$.next() during streaming, which\n // restarts caret/typing animations and causes visible flicker.\n const inputMessages = (payload as Record<string, unknown>)?.['messages'];\n if (Array.isArray(inputMessages) && inputMessages.length > 0) {\n const stamped = (inputMessages as BaseMessage[]).map((m) => {\n const raw = m as unknown as Record<string, unknown>;\n if (typeof raw['id'] === 'string' && raw['id']) return m;\n const id = `optimistic-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n return { ...m, id } as BaseMessage;\n });\n const existing = subjects.messages$.value;\n subjects.messages$.next([...existing, ...stamped]);\n }\n\n try {\n const iter = transport.stream(\n options.assistantId,\n currentThreadId,\n payload,\n opts?.signal ?? controller.signal,\n opts,\n );\n\n for await (const event of iter) {\n if (controller.signal.aborted || !isCurrentExecution(controller, attempt)) break;\n streamingStarted = true;\n processEvent(event);\n }\n\n if (!isCurrentExecution(controller, attempt)) return finishOutcome(attempt);\n const outcome = await finalizeClosedAttempt(controller, attempt);\n if (outcome === null) return finishOutcome(attempt);\n\n if (!controller.signal.aborted) {\n if (outcome !== 'error') {\n subjects.status$.next(ResourceStatus.Resolved);\n }\n await drainQueue();\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n });\n }\n return outcome;\n } catch (err) {\n if (!isCurrentExecution(controller, attempt)) return finishOutcome(attempt);\n if (attempt.terminalOutcome) return attempt.terminalOutcome;\n if (isAbortError(err) && userAbortedControllers.has(controller)) {\n finalizeAttempt(attempt, 'aborted');\n // User explicitly called stop() — treat as graceful idle, not an error.\n subjects.error$.next(undefined);\n subjects.status$.next(ResourceStatus.Idle);\n } else if (isAbortError(err)) {\n finalizeAttempt(attempt, attempt.sawAssistantChunk ? 'interrupted' : 'error');\n // A non-user-requested abort: interrupted if a stream had started, else a\n // connect-phase failure. Never \"aborted\" (that's reserved for user stop).\n const e = streamingStarted\n ? new AgentError({ kind: 'interrupted', message: AGENT_ERROR_MESSAGES.interrupted, retryable: true, cause: err })\n : new AgentError({ kind: 'connection', message: AGENT_ERROR_MESSAGES.connection, retryable: true, cause: err });\n subjects.error$.next(e);\n subjects.status$.next(ResourceStatus.Error);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(err),\n });\n } else {\n finalizeAttempt(attempt, attempt.sawAssistantChunk ? 'interrupted' : 'error');\n subjects.error$.next(toAgentError(err));\n subjects.status$.next(ResourceStatus.Error);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(err),\n });\n }\n return finishOutcome(attempt);\n } finally {\n if (abortController === controller) abortController = null;\n }\n }\n\n function processEvent(event: StreamEvent): void {\n const baseType = getBaseEventType(event.type);\n const namespace = getEventNamespace(event);\n\n if (baseType === 'checkpoints' || baseType === 'messages/complete') {\n markNormalTerminal(event);\n }\n\n if (isMessagesEvent(event.type)) {\n const msgs = normalizeMessages(event);\n if (!msgs) return;\n\n const normalized = options.toMessage\n ? msgs.map(options.toMessage)\n : msgs as BaseMessage[];\n\n // Any namespaced message event is child content. It feeds the child's\n // stream and never merges into the parent transcript — the parent\n // transcript is what the parent graph says. Shared-state children still\n // surface at settle through the authoritative top-level `values` sync.\n if (isChildNamespace(namespace)) {\n const child = namespace ? childStreamRefFromNamespace(namespace) : undefined;\n if (child) {\n if (child.kind === 'subgraph') {\n subagentManager.ensureSubgraphStream(child.key, child.name);\n } else {\n // Claim the stream for its tool call before its tokens arrive.\n subagentManager.ensureToolStreamAttribution(child.key);\n }\n for (const msg of normalized) {\n subagentManager.addMessageToSubagent(child.key, msg);\n }\n publishSubagents();\n }\n storeMessageMetadata(normalized, event);\n return;\n }\n\n // Partial and message-tuple events are incremental. Merge them by id\n // so optimistic human messages and earlier tool messages are preserved.\n if (event.type === 'messages/partial' || event.messageMetadata) {\n if (!isTranscriptMessageEvent(event, options.transcriptNodeNames)) {\n storeMessageMetadata(normalized, event);\n syncSubagentsFromMessages(normalized);\n return;\n }\n const mode: MergeMode = event.messageMetadata ? 'delta' : 'snapshot';\n const affectedMessageIds = new Set<string>();\n const merged = mergeMessages(\n subjects.messages$.value,\n normalized,\n reasoningTimingMap,\n mode,\n canonicalMessageIds,\n affectedMessageIds,\n activeAttempt?.currentAssistantMessageId !== undefined\n && activeAttempt.currentStepHasTerminalEvidence !== true,\n );\n subjects.messages$.next(merged);\n {\n trackAssistantMessages(merged.filter(message => {\n const id = (message as unknown as Record<string, unknown>)['id'];\n return typeof id === 'string' && affectedMessageIds.has(id);\n }));\n }\n if (isLgTraceEnabled()) {\n const msgs = subjects.messages$.value;\n const last = msgs[msgs.length - 1];\n lgTrace('bridge.messages-tuple', { id: (last as unknown as Record<string, unknown> | undefined)?.['id'], count: msgs.length });\n }\n } else if (normalized.length === 0) {\n // Defensive: skip empty replacements during streaming. An empty\n // batch shouldn't tear down the entire UI (causes message DOM\n // teardown + streaming renderer reset = visible jank).\n } else {\n // Preserve existing ids by content so the final-id swap doesn't\n // tear down the chat-message DOM (and its streaming-md renderer).\n const affectedMessageIds = new Set<string>();\n const preserved = preserveIds(subjects.messages$.value, normalized, affectedMessageIds);\n subjects.messages$.next(preserved);\n {\n trackAssistantMessages(preserved.filter(message => {\n const id = (message as unknown as Record<string, unknown>)['id'];\n return typeof id === 'string' && affectedMessageIds.has(id);\n }));\n }\n }\n markNormalTerminal(event);\n storeMessageMetadata(normalized, event);\n syncSubagentsFromMessages(normalized);\n syncToolCallsFromMessages();\n return;\n }\n\n // normalizeSdkEvent spreads event data directly into the event object,\n // so the values/updates payload is at event['data'] (the original data object),\n // NOT at event['values'] or event['updates'].\n switch (baseType) {\n case 'values': {\n const vals = extractEventData(event);\n if (isChildNamespace(namespace)) {\n // A child's state must not clobber the parent's `values$` — route it\n // to the child stream and stop.\n if (isRecord(vals)) updateSubagentValues(namespace, vals);\n break;\n }\n if ((namespace?.length ?? 0) === 0) {\n if (hasInterrupts(vals)) {\n if (activeAttempt) finalizeAttempt(activeAttempt, 'paused');\n } else {\n markNormalTerminal(event);\n }\n }\n if (vals != null) {\n extractInterrupts(vals, subjects);\n subjects.values$.next(vals as T);\n // Also sync messages$ from the values state so the full message\n // history (including human messages) is available to consumers.\n const stateMessages = (vals as Record<string, unknown>)['messages'];\n if (Array.isArray(stateMessages) && stateMessages.length > 0) {\n // Defensive: only sync when state carries messages. An empty\n // values payload shouldn't wipe the UI mid-stream.\n const projected = options.toMessage\n ? stateMessages.map(options.toMessage)\n : (stateMessages as BaseMessage[]);\n // Drop empty-content AI placeholders before merging. LangGraph\n // emits intermediate `values` events whose `state.messages`\n // includes an unfilled assistant turn at the tail. Keeping it\n // would create a phantom slot that competes with the chunk-\n // streamed AIMessageChunk arriving via messages-tuple — they'd\n // never merge (different ids; non-overlapping content fragments)\n // and the user sees two assistant bubbles.\n const filtered = projected.filter((m, i) => {\n if (i !== projected.length - 1) return true;\n const t = normalizeMessageType(\n typeof m._getType === 'function' ? m._getType() : (m as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n if (t !== 'ai') return true;\n const text = extractText(m.content);\n return text.length > 0;\n });\n // Preserve existing ids by content match (server echo / final-id swap).\n const remapped = preserveIds(subjects.messages$.value, filtered);\n // ALWAYS merge values-derived messages into existing rather\n // than replacing. LangGraph emits intermediate values events\n // during streaming where state.messages can lag behind what\n // we've already seen via messages-tuple — replacing would\n // drop the partial AI (or even the optimistic human) and\n // tear down their DOM mid-stream. Merge by id keeps both,\n // updates content where ids match, preserves the rest.\n subjects.messages$.next(mergeMessages(subjects.messages$.value, remapped, reasoningTimingMap, 'snapshot', canonicalMessageIds));\n if (isLgTraceEnabled()) {\n lgTrace('bridge.values-sync', {\n incomingLength: stateMessages.length,\n mergedLength: subjects.messages$.value.length,\n });\n }\n syncSubagentsFromMessages(stateMessages as BaseMessage[]);\n subagentManager.reconstructFromMessages(\n stateMessages as BaseMessage[],\n { skipIfPopulated: true },\n );\n publishSubagents();\n syncToolCallsFromMessages();\n }\n }\n break;\n }\n case 'updates': {\n const upd = extractEventData(event);\n if (isChildNamespace(namespace)) {\n // A child's updates must not spread-merge into the parent's\n // `values$` — they only mark the child stream running.\n markSubagentRunning(namespace);\n break;\n }\n if (upd != null) {\n extractInterrupts(upd, subjects);\n subjects.values$.next({\n ...subjects.values$.value,\n ...(upd as object),\n } as T);\n }\n break;\n }\n case 'error':\n if (activeAttempt) finalizeAttempt(activeAttempt, 'error');\n subjects.error$.next(toAgentError(event['error']));\n subjects.status$.next(ResourceStatus.Error);\n break;\n case 'interrupt':\n if (activeAttempt) finalizeAttempt(activeAttempt, 'paused');\n subjects.interrupt$.next(event['interrupt'] as Interrupt);\n break;\n case 'interrupts':\n if (activeAttempt) finalizeAttempt(activeAttempt, 'paused');\n subjects.interrupts$.next(event['interrupts'] as Interrupt[]);\n break;\n case 'custom': {\n const eventData = event['data'] as Record<string, unknown> | undefined;\n const name = (event['name'] ?? eventData?.['name'] ?? '') as string;\n const data = eventData?.['data'] ?? eventData;\n const current = subjects.custom$.value;\n subjects.custom$.next([...current, { name, data }]);\n break;\n }\n case 'tools':\n updateToolProgress(event);\n break;\n }\n }\n\n function syncToolCallsFromMessages(): void {\n const toolCalls = getToolCallsWithResults(\n subjects.messages$.value as unknown as LangGraphMessage[],\n ) as ToolCallWithResult[];\n subjects.toolCalls$.next(toolCalls);\n }\n\n function syncSubagentsFromMessages(messages: BaseMessage[]): void {\n for (const message of messages) {\n const raw = message as unknown as Record<string, unknown>;\n if (isAiMessageWithToolCalls(raw)) {\n subagentManager.registerFromToolCalls(\n raw['tool_calls'] as Array<{ id?: string; name: string; args: Record<string, unknown> | string }>,\n typeof raw['id'] === 'string' ? raw['id'] : null,\n );\n }\n if (isToolMessage(raw)) {\n const content = typeof raw['content'] === 'string'\n ? raw['content']\n : JSON.stringify(raw['content']);\n const status = raw['status'] === 'error' ? 'error' : 'success';\n subagentManager.processToolMessage(raw['tool_call_id'], content, status);\n }\n }\n publishSubagents();\n }\n\n function updateSubagentValues(namespace: string[] | undefined, values: Record<string, unknown>): void {\n const child = namespace ? childStreamRefFromNamespace(namespace) : undefined;\n if (!child) return;\n\n if (child.kind === 'tool') {\n // Prefer the precise description match when the child's first message is\n // the human task; otherwise claim the stream positionally so a graph that\n // doesn't fit that shape still gets attributed.\n const messages = values['messages'];\n const first = Array.isArray(messages) && messages.length > 0 ? messages[0] : undefined;\n if (isRecord(first) && (first['type'] === 'human' || first['type'] === 'user') && typeof first['content'] === 'string') {\n subagentManager.matchSubgraphToSubagent(child.key, first['content']);\n } else {\n subagentManager.ensureToolStreamAttribution(child.key);\n }\n } else {\n subagentManager.ensureSubgraphStream(child.key, child.name);\n }\n subagentManager.updateSubagentValues(child.key, values);\n publishSubagents();\n }\n\n function markSubagentRunning(namespace: string[] | undefined): void {\n const child = namespace ? childStreamRefFromNamespace(namespace) : undefined;\n if (!child) return;\n if (child.kind === 'subgraph') {\n subagentManager.ensureSubgraphStream(child.key, child.name);\n }\n subagentManager.markRunningFromNamespace(child.key, namespace);\n publishSubagents();\n }\n\n function publishSubagents(): void {\n subjects.subagents$.next(toSubagentRefs(subagentManager.getSubagents()));\n }\n\n function storeMessageMetadata(messages: BaseMessage[], event: StreamEvent): void {\n if (!event.messageMetadata) return;\n const next = new Map(subjects.messageMetadata$.value);\n messages.forEach((message, index) => {\n const id = (message as unknown as Record<string, unknown>)['id'];\n const messageId = String(id ?? index);\n next.set(messageId, {\n messageId,\n firstSeenState: undefined,\n branch: undefined,\n branchOptions: undefined,\n streamMetadata: event.messageMetadata,\n });\n });\n subjects.messageMetadata$.next(next);\n }\n\n function updateToolProgress(event: StreamEvent): void {\n const data = extractEventData(event);\n if (!isRecord(data)) return;\n\n const toolEvent = data['event'];\n const name = data['name'];\n if (typeof toolEvent !== 'string' || typeof name !== 'string') return;\n\n const toolCallId = typeof data['toolCallId'] === 'string' ? data['toolCallId'] : undefined;\n const key = toolCallId ?? name;\n const existing = toolProgressMap.get(key);\n\n switch (toolEvent) {\n case 'on_tool_start':\n toolProgressMap.set(key, {\n toolCallId,\n name,\n state: 'starting',\n input: data['input'],\n });\n break;\n case 'on_tool_event':\n toolProgressMap.set(key, {\n toolCallId,\n name,\n ...existing,\n state: 'running',\n data: data['data'],\n });\n break;\n case 'on_tool_end':\n toolProgressMap.set(key, {\n toolCallId,\n name,\n ...existing,\n state: 'completed',\n result: data['output'],\n });\n break;\n case 'on_tool_error':\n toolProgressMap.set(key, {\n toolCallId,\n name,\n ...existing,\n state: 'error',\n error: data['error'],\n });\n break;\n default:\n return;\n }\n\n subjects.toolProgress$.next([...toolProgressMap.values()]);\n }\n\n return {\n submit: async (payload, opts) => {\n if (opts?.multitaskStrategy === 'enqueue' && subjects.status$.value === ResourceStatus.Loading) {\n await enqueueRun(payload, opts);\n return 'success';\n }\n return runStream(payload, opts);\n },\n\n stop: async () => {\n invalidateQueueDrain();\n const shouldAbortAttempt = Boolean(\n abortController && activeAttempt && !activeAttempt.terminalOutcome\n );\n if (shouldAbortAttempt && abortController) userAbortedControllers.add(abortController);\n if (shouldAbortAttempt && activeAttempt) finalizeAttempt(activeAttempt, 'aborted');\n abortController?.abort();\n if (activeAttempt?.awaitingFinalSync) historyAbortController?.abort();\n await clearQueue();\n // Set Idle synchronously for an active user cancellation. Attempts that\n // already reached a terminal outcome retain their existing status.\n if (shouldAbortAttempt && subjects.status$.value !== ResourceStatus.Idle) {\n subjects.status$.next(ResourceStatus.Idle);\n }\n },\n\n switchThread: (id) => {\n setThreadId(id, true);\n },\n\n joinStream: async (runId, lastEventId) => {\n if (!currentThreadId) return;\n invalidateQueueDrain();\n abortController?.abort();\n const controller = new AbortController();\n abortController = controller;\n const attempt = beginAttempt(true);\n const threadId = currentThreadId;\n const startedAt = Date.now();\n captureRuntimeRequestTelemetry('join');\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);\n subjects.custom$.next([]);\n subjects.toolProgress$.next([]);\n toolProgressMap.clear();\n subjects.status$.next(ResourceStatus.Loading);\n subjects.error$.next(undefined);\n try {\n const iter = transport.joinStream\n ? transport.joinStream(threadId, runId, lastEventId, controller.signal)\n : [];\n for await (const event of iter) {\n if (controller.signal.aborted || !isCurrentExecution(controller, attempt)) break;\n processEvent(event);\n }\n if (!isCurrentExecution(controller, attempt)) return;\n const outcome = await finalizeClosedAttempt(controller, attempt);\n if (outcome === null) return;\n if (!controller.signal.aborted) {\n if (outcome !== 'error') {\n subjects.status$.next(ResourceStatus.Resolved);\n }\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n });\n }\n } catch (err) {\n if (!isCurrentExecution(controller, attempt)) return;\n if (attempt.terminalOutcome) return;\n if (isAbortError(err) && userAbortedControllers.has(controller)) {\n finalizeAttempt(attempt, 'aborted');\n subjects.error$.next(undefined);\n subjects.status$.next(ResourceStatus.Idle);\n } else {\n finalizeAttempt(attempt, attempt.sawAssistantChunk ? 'interrupted' : 'error');\n subjects.error$.next(toAgentError(err));\n subjects.status$.next(ResourceStatus.Error);\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(err),\n });\n }\n } finally {\n if (abortController === controller) abortController = null;\n }\n },\n\n resubmitLast: async () => {\n if (lastPayload === null) return 'not-started';\n return runStream(lastPayload, lastOptions, 'resubmit');\n },\n\n getReasoningDurationMs: (id: string): number | undefined => {\n const entry = reasoningTimingMap.get(id);\n if (!entry) return undefined;\n if (entry.endedAt === undefined) return undefined;\n return entry.endedAt - entry.startedAt;\n },\n\n getMessageDelivery: (id: string): MessageDelivery =>\n messageDeliveries.get(id) ?? staticDelivery(id),\n\n getSubagentMessageDelivery: (toolCallId: string, message: BaseMessage): MessageDelivery =>\n subagentManager.getMessageDelivery(toolCallId, message),\n\n deliveryRevision,\n\n updateState: async (\n values: Record<string, unknown>,\n opts?: { asNode?: string },\n ): Promise<void> => {\n // No-op when there is no thread yet or the transport doesn't support\n // updateState (e.g. MockAgentTransport in unit tests without a threadId).\n if (!currentThreadId || !transport.updateState) {\n return;\n }\n await transport.updateState(\n currentThreadId,\n values,\n new AbortController().signal,\n opts,\n );\n },\n\n get currentThreadId(): string | null {\n return currentThreadId;\n },\n };\n}\n\nfunction isTranscriptMessageEvent(\n event: StreamEvent,\n transcriptNodeNames: readonly string[] | undefined,\n): boolean {\n if (!transcriptNodeNames || transcriptNodeNames.length === 0) return true;\n const node = event.messageMetadata?.['langgraph_node'];\n if (typeof node !== 'string') return true;\n return transcriptNodeNames.includes(node);\n}\n\n/**\n * Extracts the payload data from a normalized SDK event.\n *\n * Handles two formats:\n * 1. SDK events (via normalizeSdkEvent): data at event['data'] (record) + spread into event\n * 2. Mock/test events: data at event[event.type] (e.g., event['values'], event['updates'])\n */\n/**\n * LangGraph emits interrupts as part of `updates`/`values` events under the\n * special `__interrupt__` key, not as standalone events. When such a payload\n * appears, mirror it onto `interrupt$` (latest) and `interrupts$` (full list)\n * so consumers can react via `agent.interrupt()` / `agent.interrupts()`.\n */\nfunction extractInterrupts<T, B extends BagTemplate>(\n payload: unknown,\n subjects: StreamSubjects<T, B>,\n): void {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return;\n const raw = (payload as Record<string, unknown>)['__interrupt__'];\n // Cast through unknown — Interrupt$ is parameterized over Bag's InterruptType,\n // and the SDK delivers raw Interrupt payloads here.\n if (Array.isArray(raw) && raw.length > 0) {\n const list = raw as Interrupt[];\n subjects.interrupts$.next(list as unknown as Parameters<typeof subjects.interrupts$.next>[0]);\n subjects.interrupt$.next(list[list.length - 1] as unknown as Parameters<typeof subjects.interrupt$.next>[0]);\n return;\n }\n // Payload has no `__interrupt__` key. Clear any stale interrupt so the UI\n // dismisses the panel after a resume completes (LangGraph does not emit a\n // separate \"cleared\" event — the absence of `__interrupt__` in subsequent\n // values/updates is the signal). No-op if interrupt$ was already empty.\n if (subjects.interrupt$.value !== undefined) {\n subjects.interrupt$.next(undefined);\n subjects.interrupts$.next([]);\n }\n}\n\nfunction hasInterrupts(payload: unknown): boolean {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return false;\n const raw = (payload as Record<string, unknown>)['__interrupt__'];\n return Array.isArray(raw) && raw.length > 0;\n}\n\n/**\n * Projects pending interrupts from the latest history checkpoint onto the\n * interrupt$ / interrupts$ subjects. ThreadState exposes interrupts under\n * `tasks[i].interrupts` (per the LangGraph SDK schema). When the latest\n * checkpoint contains any pending interrupts, mirror them so consumers can\n * react via `agent.interrupt()` on thread reload without needing a fresh\n * stream event.\n *\n * If no interrupts are present, this is a no-op so existing streamed state\n * (mid-run) isn't clobbered by a stale history refresh.\n */\nfunction hydrateInterruptsFromHistory<T, B extends BagTemplate>(\n history: ThreadState<T>[],\n subjects: StreamSubjects<T, B>,\n): void {\n const latest = history[0];\n if (!latest || !Array.isArray(latest.tasks)) return;\n const collected: Interrupt[] = [];\n for (const task of latest.tasks) {\n if (task && Array.isArray(task.interrupts) && task.interrupts.length > 0) {\n for (const ix of task.interrupts as Interrupt[]) {\n collected.push(ix);\n }\n }\n }\n if (collected.length > 0) {\n subjects.interrupts$.next(\n collected as unknown as Parameters<typeof subjects.interrupts$.next>[0],\n );\n subjects.interrupt$.next(\n collected[collected.length - 1] as unknown as Parameters<\n typeof subjects.interrupt$.next\n >[0],\n );\n }\n}\n\nfunction extractEventData(event: StreamEvent): unknown {\n // Try event['data'] first (SDK format from normalizeSdkEvent)\n const d = event['data'];\n if (d != null && typeof d === 'object' && !Array.isArray(d)) {\n return d;\n }\n // Try event[event.type] (mock/test format: { type: 'values', values: {...} })\n const named = event[event.type];\n if (named != null && typeof named === 'object' && !Array.isArray(named)) {\n return named;\n }\n // Fallback: reconstruct from remaining keys\n const rest = Object.fromEntries(\n Object.entries(event).filter(([key]) => key !== 'type' && key !== 'data'),\n );\n return Object.keys(rest).length > 0 ? rest : d;\n}\n\nfunction isMessagesEvent(type: StreamEvent['type']): boolean {\n const baseType = getBaseEventType(type);\n return baseType === 'messages' || baseType.startsWith('messages/');\n}\n\nfunction getBaseEventType(type: StreamEvent['type']): string {\n return String(type).split('|')[0];\n}\n\nfunction getEventNamespace(event: StreamEvent): string[] | undefined {\n if (Array.isArray(event.namespace)) return event.namespace;\n const parts = String(event.type).split('|');\n return parts.length > 1 ? parts.slice(1) : undefined;\n}\n\nfunction normalizeMessages(event: StreamEvent): unknown[] | null {\n const directMessages = event['messages'];\n if (Array.isArray(directMessages)) {\n // Filter out non-message metadata objects (e.g. { langgraph_node, langgraph_triggers })\n // that the LangGraph SDK includes alongside real messages in messages/* events.\n const filtered = directMessages.filter(isMessageLike);\n return filtered.length > 0 ? filtered : null;\n }\n\n const data = event['data'];\n if (Array.isArray(data)) {\n if (data.every(isMessageLike)) {\n return data;\n }\n if (isMessageLike(data[0])) {\n return [data[0]];\n }\n }\n\n const indexedValues = Object.keys(event)\n .filter(key => /^\\d+$/.test(key))\n .sort((left, right) => Number(left) - Number(right))\n .map(key => event[key]);\n\n if (indexedValues.every(isMessageLike)) {\n return indexedValues;\n }\n if (isMessageLike(indexedValues[0])) {\n return [indexedValues[0]];\n }\n\n return null;\n}\n\n/**\n * Collapse adjacent AI messages where one's text is a prefix of the other.\n *\n * When complex-content streaming is in play, the same conceptual assistant\n * message can land in two slots: the canonical AI from values-sync (id\n * `resp_…` or run id) and the chunk-streamed AIMessageChunk from\n * messages-tuple (id `lc_run--…`). Both slots fill in parallel; once both\n * carry the full text we collapse them, keeping the older slot's id so\n * track-by-id stays stable in the chat list.\n */\nfunction collapseAdjacentAi(\n messages: BaseMessage[],\n affectedMessageIds?: Set<string>,\n allowCrossIdAiMerge = true,\n): BaseMessage[] {\n if (messages.length < 2) return messages;\n const out: BaseMessage[] = [];\n for (const msg of messages) {\n const last = out[out.length - 1];\n if (!last) { out.push(msg); continue; }\n const lastType = normalizeMessageType(\n typeof last._getType === 'function' ? last._getType() : (last as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n const msgType = normalizeMessageType(\n typeof msg._getType === 'function' ? msg._getType() : (msg as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n if (lastType === 'ai' && msgType === 'ai') {\n const lastText = extractText(last.content);\n const msgText = extractText(msg.content);\n const lastRaw = last as unknown as Record<string, unknown>;\n const msgRaw = msg as unknown as Record<string, unknown>;\n const differentIds = lastRaw['id'] !== msgRaw['id'];\n if (!(differentIds && !allowCrossIdAiMerge) && (lastText.length === 0\n || msgText.length === 0\n || lastText === msgText\n || lastText.startsWith(msgText)\n || msgText.startsWith(lastText))) {\n // Keep the longer content; preserve last (older) id and metadata.\n const longerText = msgText.length >= lastText.length ? msgText : lastText;\n const lastId = (last as unknown as Record<string, unknown>)['id'];\n const msgId = (msg as unknown as Record<string, unknown>)['id'];\n if (typeof msgId === 'string' && affectedMessageIds?.delete(msgId) && typeof lastId === 'string') {\n affectedMessageIds.add(lastId);\n }\n out[out.length - 1] = { ...(last as object), content: longerText } as BaseMessage;\n continue;\n }\n }\n out.push(msg);\n }\n return out;\n}\n\ntype MergeMode = 'delta' | 'snapshot';\n\nfunction mergeMessages(\n existing: BaseMessage[],\n incoming: BaseMessage[],\n reasoningTimingMap?: Map<string, { startedAt: number; endedAt?: number }>,\n mode: MergeMode = 'snapshot',\n canonicalMessageIds?: Set<string>,\n affectedMessageIds?: Set<string>,\n allowCrossIdAiMerge = true,\n): BaseMessage[] {\n const merged = [...existing];\n for (const msg of incoming) {\n const rawIn = msg as unknown as Record<string, unknown>;\n const id = rawIn['id'];\n let idx = id ? merged.findIndex(m => (m as unknown as Record<string, unknown>)['id'] === id) : -1;\n // Fallback: match by (role, content) when ids differ. This is the path\n // that fires when the server echoes back our optimistic human message\n // with a server-assigned id, or when partial AI tokens carry a chunk\n // id but the final canonical message has a run id. Preserving the\n // existing id here keeps track-by-id stable in the chat list and\n // prevents DOM teardown + animation restarts mid-stream.\n if (idx < 0) {\n idx = findContentMatch(merged, msg);\n if (idx >= 0 && !canMergeCrossIdAi(merged[idx], msg, allowCrossIdAiMerge)) {\n idx = -1;\n }\n }\n // When an AIMessageChunk arrives without an id-match or content-prefix\n // match, treat the trailing AI message as its accumulator. The\n // OpenAI Responses API emits per-chunk events whose ids identify the\n // *event*, not the message, so consecutive chunks land here. Without\n // this we'd append every chunk as a separate bubble.\n if (idx < 0) {\n const inType = normalizeMessageType(rawIn['type'] as string | undefined);\n if (inType === 'ai') {\n for (let i = merged.length - 1; i >= 0; i--) {\n const t = normalizeMessageType(\n typeof (merged[i] as BaseMessage)._getType === 'function'\n ? (merged[i] as BaseMessage)._getType()\n : (merged[i] as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n if (t === 'ai') {\n if (!canMergeCrossIdAi(merged[i], msg, allowCrossIdAiMerge)) break;\n idx = i;\n break;\n }\n if (t === 'human' || t === 'tool' || t === 'system') break;\n }\n }\n }\n if (idx >= 0) {\n const existing = merged[idx];\n const existingId = (existing as unknown as Record<string, unknown>)['id'];\n const incomingRaw = msg as unknown as Record<string, unknown>;\n const targetId = (existingId ?? incomingRaw['id']) as string | undefined;\n // Identity backstop: once a message's content is known-final, late\n // streamed deltas for it are stale stragglers — ignore them outright.\n if (mode === 'delta' && targetId && canonicalMessageIds?.has(targetId)\n && !isFinalCanonicalReasoningContent(incomingRaw['content'])) {\n continue;\n }\n // Keep the *existing* id so downstream track-by-id sees stable identity.\n // For complex-content streaming (OpenAI gpt-5/o-series, Anthropic) the\n // SDK emits per-chunk *delta* arrays — not accumulated arrays — so a\n // straight replacement collapses the rendered bubble to just the\n // latest token. Accumulate text-bearing content across chunks here\n // and hand a string to consumers; downstream code already handles\n // string content uniformly.\n const accumulatedContent = accumulateContent(\n existing.content as unknown,\n incomingRaw['content'],\n mode,\n );\n if (targetId && isFinalCanonicalReasoningContent(incomingRaw['content'])) {\n canonicalMessageIds?.add(targetId);\n }\n // Only accumulate reasoning when the incoming message explicitly carries\n // a `reasoning` field or complex-content array blocks with\n // type='reasoning'/'thinking'. Never use a plain string content value\n // as reasoning source — that would wrongly treat every assistant\n // message text as reasoning content.\n const incomingReasoningSource = 'reasoning' in incomingRaw\n ? incomingRaw['reasoning']\n : (Array.isArray(incomingRaw['content']) ? incomingRaw['content'] : undefined);\n const accumulatedReasoning = accumulateReasoning(\n (existing as unknown as Record<string, unknown>)['reasoning'],\n incomingReasoningSource,\n );\n const idForTiming = (existingId as string | undefined) ?? (incomingRaw['id'] as string | undefined);\n if (idForTiming && reasoningTimingMap) {\n const hasReasoning = accumulatedReasoning.length > 0;\n const hasText = (typeof accumulatedContent === 'string' ? accumulatedContent : '').length > 0;\n if (hasReasoning) {\n const entry = reasoningTimingMap.get(idForTiming) ?? { startedAt: Date.now() };\n if (hasText && entry.endedAt === undefined) entry.endedAt = Date.now();\n reasoningTimingMap.set(idForTiming, entry);\n }\n }\n const next = { ...(msg as object), content: accumulatedContent } as BaseMessage;\n (next as unknown as Record<string, unknown>)['reasoning'] = accumulatedReasoning;\n if (existingId) {\n (next as unknown as Record<string, unknown>)['id'] = existingId;\n }\n const changed = mode === 'delta' || messageChangedForDelivery(existing, next);\n merged[idx] = next;\n if (targetId && changed) affectedMessageIds?.add(targetId);\n } else {\n const incomingRaw = msg as unknown as Record<string, unknown>;\n const initialReasoningSource = 'reasoning' in incomingRaw\n ? incomingRaw['reasoning']\n : (Array.isArray(incomingRaw['content']) ? incomingRaw['content'] : undefined);\n const initialReasoning = accumulateReasoning(undefined, initialReasoningSource);\n if (initialReasoning.length > 0 && reasoningTimingMap) {\n const msgId = incomingRaw['id'] as string | undefined;\n if (msgId && !reasoningTimingMap.has(msgId)) {\n reasoningTimingMap.set(msgId, { startedAt: Date.now() });\n }\n }\n const next = { ...(msg as object) } as BaseMessage;\n (next as unknown as Record<string, unknown>)['reasoning'] = initialReasoning;\n merged.push(next);\n const nextId = (next as unknown as Record<string, unknown>)['id'];\n if (typeof nextId === 'string') affectedMessageIds?.add(nextId);\n }\n }\n return collapseAdjacentAi(merged, affectedMessageIds, allowCrossIdAiMerge);\n}\n\nfunction canMergeCrossIdAi(\n candidate: BaseMessage,\n incoming: BaseMessage,\n allowCrossIdAiMerge: boolean,\n): boolean {\n const candidateRaw = candidate as unknown as Record<string, unknown>;\n const incomingRaw = incoming as unknown as Record<string, unknown>;\n if (candidateRaw['id'] === incomingRaw['id']) return true;\n return allowCrossIdAiMerge;\n}\n\n/**\n * Merge an incoming chunk's content into prior accumulated content for the\n * same message id. Behavior is governed by `mode`, which reflects the\n * DECLARED kind of the source event rather than a guess from comparing text:\n *\n * - mode 'delta' (messages-tuple / `event.messageMetadata` truthy): the\n * payload is a genuine per-chunk delta. Append unconditionally — a\n * prefix-comparison \"dedupe\" here would silently drop legitimate tokens\n * that coincide with the message-so-far (e.g. every bare \"|\" while\n * streaming a markdown table). Staleness after the message goes canonical\n * is instead handled by identity in `mergeMessages` (canonicalMessageIds).\n * - mode 'snapshot' (messages/partial, values-sync): the payload carries the\n * message-so-far, not a delta, so mutual prefix comparison picks the\n * longer state and ignores stale shorter snapshots.\n *\n * In both modes, a \"final canonical\" reasoning+text array (see\n * `isFinalCanonicalReasoningContent`) always replaces whatever was\n * accumulated — it's the authoritative final message, not another chunk.\n *\n * We deliberately collapse complex content arrays to a string at this layer.\n * The langgraph-sdk client does not accumulate complex-content arrays the\n * way it accumulates strings, and per-chunk arrays carry only the latest\n * delta. Concatenating extracted text gives consumers the same uniform\n * string they get for non-reasoning models.\n */\n/**\n * Heuristic: does this content look like a \"final canonical\" array\n * carrying both reasoning and visible text blocks? OpenAI's Responses\n * API ships the final assistant message in this shape after the\n * streaming token chunks complete. Detection is narrow (requires BOTH\n * a reasoning-shape block AND a text-shape block in the same array)\n * so it doesn't trip on routine streaming chunks.\n */\nfunction isFinalCanonicalReasoningContent(content: unknown): boolean {\n if (!Array.isArray(content)) return false;\n let hasReasoning = false;\n let hasText = false;\n for (const block of content) {\n if (block == null || typeof block !== 'object') continue;\n const t = (block as Record<string, unknown>)['type'];\n if (t === 'reasoning' || t === 'thinking') hasReasoning = true;\n else if (t === 'text' || t === 'output_text') hasText = true;\n }\n return hasReasoning && hasText;\n}\n\nfunction accumulateContent(existing: unknown, incoming: unknown, mode: MergeMode = 'snapshot'): string {\n const existingText = extractText(existing);\n const incomingText = extractText(incoming);\n\n // Always return a string. We never want array content escaping the bridge:\n // (a) downstream consumers expect string content, and (b) findContentMatch\n // stringifies arrays, which would prevent the canonical-message id-swap\n // dedupe from matching the streamed-chunk message after a partial chunk.\n if (existingText.length === 0) return incomingText;\n if (incomingText.length === 0) return existingText;\n // Final-canonical detection applies in both modes: the authoritative\n // \"reasoning + text\" array replaces whatever was accumulated.\n if (isFinalCanonicalReasoningContent(incoming)) return incomingText;\n if (mode === 'delta') {\n // Tuple chunks are declared deltas. Append unconditionally — any\n // text-comparison \"dedupe\" here can silently drop legitimate tokens\n // that coincide with the message prefix (e.g. every bare \"|\" in a\n // markdown table). Staleness is handled by identity in mergeMessages.\n return existingText + incomingText;\n }\n // Snapshot mode (messages/partial, values-sync): payloads carry the\n // message-so-far, so mutual prefix comparison picks the longer state and\n // ignores stale shorter snapshots.\n if (incomingText.startsWith(existingText)) return incomingText;\n if (existingText.startsWith(incomingText)) return existingText;\n return existingText + incomingText;\n}\n\nfunction extractText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (typeof block === 'string') { out += block; continue; }\n if (block == null || typeof block !== 'object') continue;\n const rec = block as Record<string, unknown>;\n const t = rec['type'];\n if (t === 'text' || t === 'output_text' || t === undefined) {\n const text = rec['text'];\n if (typeof text === 'string') out += text;\n }\n }\n return out;\n}\n\nfunction extractReasoning(content: unknown): string {\n if (typeof content === 'string') return '';\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (block == null || typeof block !== 'object') continue;\n const rec = block as Record<string, unknown>;\n const t = rec['type'];\n if (t === 'reasoning' || t === 'thinking') {\n // Direct text field — Anthropic-style \"thinking\" blocks and\n // some LangChain-shaped reasoning blocks land here.\n const text = rec['text'];\n if (typeof text === 'string') out += text;\n // OpenAI Responses API: when `reasoning.summary='auto'` was\n // requested, reasoning blocks carry a `summary` array of\n // `{type: 'summary_text', text: '...'}` items. Concatenate\n // their texts in order.\n const summary = rec['summary'];\n if (Array.isArray(summary)) {\n for (const item of summary) {\n if (item == null || typeof item !== 'object') continue;\n const itemText = (item as Record<string, unknown>)['text'];\n if (typeof itemText === 'string') out += itemText;\n }\n }\n }\n }\n return out;\n}\n\nfunction accumulateReasoning(existing: unknown, incoming: unknown): string {\n const existingText = typeof existing === 'string' ? existing : extractReasoning(existing);\n const incomingText = typeof incoming === 'string' ? incoming : extractReasoning(incoming);\n if (existingText.length === 0) return incomingText;\n if (incomingText.length === 0) return existingText;\n if (incomingText.startsWith(existingText)) return incomingText;\n if (existingText.startsWith(incomingText)) return existingText;\n return existingText + incomingText;\n}\n\n/**\n * Replace the incoming messages' ids with the existing array's ids whenever\n * (role, content) matches positionally and the existing id differs. Keeps\n * track-by-id stable across server echoes and final-id swaps.\n */\nfunction preserveIds(\n existing: BaseMessage[],\n incoming: BaseMessage[],\n affectedMessageIds?: Set<string>,\n): BaseMessage[] {\n if (existing.length === 0) {\n for (const message of incoming) {\n const id = (message as unknown as Record<string, unknown>)['id'];\n if (typeof id === 'string') affectedMessageIds?.add(id);\n }\n return collapseAdjacentAi(incoming, affectedMessageIds);\n }\n const usedExisting = new Set<number>();\n const remapped = incoming.map((msg, i) => {\n const inRaw = msg as unknown as Record<string, unknown>;\n const inId = inRaw['id'];\n // First try same-position match (the dominant case).\n let matchIdx = -1;\n if (i < existing.length && !usedExisting.has(i) && sameRoleAndContent(existing[i], msg)) {\n matchIdx = i;\n } else {\n // Fallback: any unused existing message with matching role+content.\n matchIdx = existing.findIndex((m, j) => !usedExisting.has(j) && sameRoleAndContent(m, msg));\n }\n if (matchIdx < 0) {\n if (typeof inId === 'string') affectedMessageIds?.add(inId);\n return msg;\n }\n usedExisting.add(matchIdx);\n const existingId = (existing[matchIdx] as unknown as Record<string, unknown>)['id'];\n const remappedMessage = !existingId || existingId === inId\n ? msg\n : { ...(msg as object), id: existingId } as BaseMessage;\n if (typeof existingId === 'string' && messageChangedForDelivery(existing[matchIdx], remappedMessage)) {\n affectedMessageIds?.add(existingId);\n }\n return remappedMessage;\n });\n return collapseAdjacentAi(remapped, affectedMessageIds);\n}\n\nfunction messageChangedForDelivery(existing: BaseMessage, incoming: BaseMessage): boolean {\n const existingRaw = existing as unknown as Record<string, unknown>;\n const incomingRaw = incoming as unknown as Record<string, unknown>;\n const existingType = normalizeMessageType(\n typeof existing._getType === 'function' ? existing._getType() : existingRaw['type'] as string | undefined,\n );\n const incomingType = normalizeMessageType(\n typeof incoming._getType === 'function' ? incoming._getType() : incomingRaw['type'] as string | undefined,\n );\n if (existingType !== incomingType || extractText(existing.content) !== extractText(incoming.content)) {\n return true;\n }\n const existingReasoning = typeof existingRaw['reasoning'] === 'string'\n ? existingRaw['reasoning']\n : extractReasoning(existingRaw['reasoning']);\n const incomingReasoning = typeof incomingRaw['reasoning'] === 'string'\n ? incomingRaw['reasoning']\n : extractReasoning(incomingRaw['reasoning']);\n if (existingReasoning !== incomingReasoning) return true;\n return JSON.stringify(existingRaw['tool_calls'] ?? null) !== JSON.stringify(incomingRaw['tool_calls'] ?? null);\n}\n\nfunction sameRoleAndContent(a: BaseMessage, b: BaseMessage): boolean {\n const aType = normalizeMessageType(\n typeof a._getType === 'function' ? a._getType() : (a as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n const bType = normalizeMessageType(\n typeof b._getType === 'function' ? b._getType() : (b as unknown as Record<string, unknown>)['type'] as string | undefined,\n );\n if (aType !== bType) return false;\n const aContent = typeof a.content === 'string' ? a.content : JSON.stringify(a.content);\n const bContent = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n if (aContent === bContent) return true;\n // For AI messages we accept prefix relationships (streaming → final).\n if (aType === 'ai' && typeof aContent === 'string' && typeof bContent === 'string') {\n return aContent.length > 0 && (bContent.startsWith(aContent) || aContent.startsWith(bContent));\n }\n return false;\n}\n\nfunction findContentMatch(merged: BaseMessage[], incoming: BaseMessage): number {\n const inRaw = incoming as unknown as Record<string, unknown>;\n const inType = normalizeMessageType(\n typeof incoming._getType === 'function' ? incoming._getType() : (inRaw['type'] as string | undefined),\n );\n const inContent = typeof incoming.content === 'string' ? incoming.content : JSON.stringify(incoming.content);\n // Only worth matching for human messages (where the optimistic→echo\n // mismatch happens) and for AI messages where content is a strict prefix\n // of the existing (token-streaming + final-id swap pattern).\n for (let i = merged.length - 1; i >= 0; i--) {\n const m = merged[i] as unknown as Record<string, unknown>;\n const mType = normalizeMessageType(\n typeof (merged[i] as BaseMessage)._getType === 'function'\n ? (merged[i] as BaseMessage)._getType()\n : (m['type'] as string | undefined),\n );\n if (mType !== inType) continue;\n const mContent = typeof (merged[i] as BaseMessage).content === 'string'\n ? (merged[i] as BaseMessage).content as string\n : JSON.stringify((merged[i] as BaseMessage).content);\n if (inType === 'human' && mContent === inContent) return i;\n if (inType === 'ai') {\n // Skip empty placeholders. We don't want a pre-existing empty AI\n // (created by an early values-sync emission with `state.messages`\n // including an unfilled assistant turn) to absorb the first chunk\n // arriving via messages-tuple — that strands subsequent chunks in a\n // separate slot whose content no longer prefix-matches the canonical.\n const aSafe = typeof mContent === 'string' ? mContent : '';\n const bSafe = typeof inContent === 'string' ? inContent : '';\n if (aSafe.length === 0 || bSafe.length === 0) continue;\n if (mContent === inContent || aSafe.startsWith(bSafe) || bSafe.startsWith(aSafe)) return i;\n }\n }\n return -1;\n}\n\n/**\n * Normalize message type so AIMessage and AIMessageChunk compare equal.\n * The LangGraph SDK emits type='AIMessageChunk' on the messages-tuple\n * streaming path and type='ai' on the values-sync path for the same\n * canonical assistant message — distinguishing them prevents the\n * content-prefix dedupe from collapsing the duplicate bubbles.\n */\nfunction normalizeMessageType(t: string | undefined): string | undefined {\n if (!t) return t;\n if (t === 'AIMessageChunk' || t === 'AIMessage' || t === 'assistant') return 'ai';\n if (t === 'HumanMessage' || t === 'HumanMessageChunk' || t === 'user') return 'human';\n if (t === 'ToolMessage') return 'tool';\n if (t === 'SystemMessage') return 'system';\n return t;\n}\n\nfunction getTailAssistantMessageId(messages: BaseMessage[]): string | undefined {\n const tail = messages[messages.length - 1];\n if (!tail) return undefined;\n const raw = tail as unknown as Record<string, unknown>;\n const type = normalizeMessageType(\n typeof tail._getType === 'function' ? tail._getType() : raw['type'] as string | undefined,\n );\n return type === 'ai' && typeof raw['id'] === 'string' ? raw['id'] : undefined;\n}\n\nfunction toSubagentRefs(\n subagents: Map<string, TrackedSubagent>,\n): Map<string, SubagentStreamRef> {\n const refs = new Map<string, SubagentStreamRef>();\n subagents.forEach((subagent, key) => {\n refs.set(key, {\n toolCallId: subagent.id,\n // Tool children are named by their `subagent_type` arg; subgraph\n // children by their node name (stored as the synthetic toolCall name).\n name: typeof subagent.toolCall.args['subagent_type'] === 'string'\n ? subagent.toolCall.args['subagent_type']\n : subagent.kind === 'subgraph'\n ? subagent.toolCall.name\n : undefined,\n status: signal(subagent.status),\n values: signal(subagent.values),\n messages: signal(subagent.messages as unknown as BaseMessage[]),\n });\n });\n return refs;\n}\n\nfunction isAiMessageWithToolCalls(value: Record<string, unknown>): boolean {\n return (value['type'] === 'ai' || value['type'] === 'assistant')\n && Array.isArray(value['tool_calls']);\n}\n\nfunction isToolMessage(value: Record<string, unknown>): value is Record<string, unknown> & { tool_call_id: string } {\n return value['type'] === 'tool' && typeof value['tool_call_id'] === 'string';\n}\n\nfunction isMessageLike(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object'\n && value !== null\n && (\n 'content' in value\n || 'type' in value\n || 'id' in value\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const _internalsForTesting = {\n extractText,\n extractReasoning,\n accumulateContent,\n accumulateReasoning,\n collapseAdjacentAi,\n mergeMessages,\n preserveIds,\n normalizeMessageType,\n isFinalCanonicalReasoningContent,\n};\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken } from '@angular/core';\nimport type { LangGraphClientOptions } from '../agent.types';\n\n/**\n * App-wide LangGraph SDK client tuning (e.g. `maxRetries`). Provide once at the\n * app root; both the agent's default {@link FetchStreamTransport} and the\n * {@link LangGraphThreadsAdapter} read it so the retry budget is configured in\n * one place. A call-site `agent({ clientOptions })` or per-agent\n * `provideAgent({ clientOptions })` overrides it for that agent.\n * Absent → the SDK default.\n */\nexport const LANGGRAPH_CLIENT_OPTIONS = new InjectionToken<LangGraphClientOptions>(\n 'LANGGRAPH_CLIENT_OPTIONS',\n);\n\n/**\n * First-defined-wins resolution across precedence layers (highest first).\n * Whole-object semantics — no per-field merge — so the winning layer is the\n * single source for every option. Returns undefined when all layers are absent.\n */\nexport function resolveClientOptions(\n ...layers: Array<LangGraphClientOptions | undefined | null>\n): LangGraphClientOptions | undefined {\n for (const layer of layers) {\n if (layer) return layer;\n }\n return undefined;\n}\n","// SPDX-License-Identifier: MIT\nimport type { ThreadState } from '@langchain/langgraph-sdk';\nimport type { AgentBranchTree, AgentBranchTreeFork } from '../agent.types';\n\nconst ROOT_ID = '$';\n\n/**\n * Builds a branch-aware checkpoint tree from LangGraph thread history.\n *\n * This mirrors the small SDK UI branching data shape without importing the\n * SDK UI runtime helper, keeping Angular bundles independent of React UI code.\n */\nexport function buildBranchTree<T>(history: ThreadState<T>[] = []): AgentBranchTree<T> {\n if (history.length <= 1) {\n return {\n type: 'sequence',\n items: history.map(value => ({ type: 'node', value, path: [] })),\n };\n }\n\n const nodeIds = new Set<string>();\n const childrenMap: Record<string, ThreadState<T>[]> = {};\n\n for (const state of history) {\n const parentId = state.parent_checkpoint?.checkpoint_id ?? ROOT_ID;\n childrenMap[parentId] ??= [];\n childrenMap[parentId].push(state);\n\n const checkpointId = state.checkpoint?.checkpoint_id;\n if (checkpointId != null) {\n nodeIds.add(checkpointId);\n }\n }\n\n const orphanRoot = findLatestOrphanRoot(childrenMap, nodeIds);\n if (orphanRoot != null) {\n childrenMap[ROOT_ID] = childrenMap[orphanRoot];\n }\n\n const rootSequence: AgentBranchTree<T> = { type: 'sequence', items: [] };\n const queue: Array<{ id: string; sequence: AgentBranchTree<T>; path: string[] }> = [\n { id: ROOT_ID, sequence: rootSequence, path: [] },\n ];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const task = queue.shift();\n if (!task || visited.has(task.id)) continue;\n visited.add(task.id);\n\n const children = childrenMap[task.id];\n if (!children?.length) continue;\n\n let fork: AgentBranchTreeFork<T> | undefined;\n if (children.length > 1) {\n fork = { type: 'fork', items: [] };\n task.sequence.items.push(fork);\n }\n\n for (const value of children) {\n const id = value.checkpoint?.checkpoint_id;\n if (id == null) continue;\n\n let sequence = task.sequence;\n let path = task.path;\n if (fork != null) {\n sequence = { type: 'sequence', items: [] };\n fork.items.unshift(sequence);\n path = [...task.path, id];\n }\n\n sequence.items.push({ type: 'node', value, path });\n queue.push({ id, sequence, path });\n }\n }\n\n return rootSequence;\n}\n\nfunction findLatestOrphanRoot<T>(\n childrenMap: Record<string, ThreadState<T>[]>,\n nodeIds: Set<string>,\n): string | undefined {\n if (childrenMap[ROOT_ID] != null) return undefined;\n\n return Object.keys(childrenMap)\n .filter(parentId => !nodeIds.has(parentId))\n .map(parentId => ({\n parentId,\n lastId: findLatestDescendantId(parentId, childrenMap),\n }))\n .sort((left, right) => left.lastId.localeCompare(right.lastId))\n .at(-1)?.parentId;\n}\n\nfunction findLatestDescendantId<T>(\n parentId: string,\n childrenMap: Record<string, ThreadState<T>[]>,\n): string {\n const queue = [parentId];\n const seen = new Set<string>();\n let latestId = parentId;\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current || seen.has(current)) continue;\n seen.add(current);\n\n for (const child of childrenMap[current] ?? []) {\n const childId = child.checkpoint?.checkpoint_id;\n if (childId == null) continue;\n if (childId.localeCompare(latestId) > 0) {\n latestId = childId;\n }\n queue.push(childId);\n }\n }\n\n return latestId;\n}\n","// libs/langgraph/src/lib/internals/extract-citations.ts\n// SPDX-License-Identifier: MIT\nimport type { Citation } from '@threadplane/chat';\n\ninterface KwargsLike {\n additional_kwargs?: Record<string, unknown> | undefined;\n}\n\n/**\n * Normalize {@link Citation}s out of a message's `additional_kwargs` (reading\n * `citations` or `sources`). Exposed for advanced consumers building custom\n * adapters or bridging non-LangGraph message shapes into the neutral\n * `Citation[]` form.\n *\n * @param msg Any object with an `additional_kwargs` bag (e.g. a LangChain message).\n * @returns The normalized citations, or `undefined` when none are present.\n * @example\n * ```ts\n * const citations = extractCitations(lcMessage);\n * ```\n */\nexport function extractCitations(msg: KwargsLike): Citation[] | undefined {\n const raw = msg.additional_kwargs?.['citations'] ?? msg.additional_kwargs?.['sources'];\n if (!Array.isArray(raw) || raw.length === 0) return undefined;\n return raw.map((entry, i) => normalizeCitation(entry, i + 1));\n}\n\nfunction normalizeCitation(entry: unknown, fallbackIndex: number): Citation {\n if (typeof entry === 'string') {\n return { id: `c${fallbackIndex}`, index: fallbackIndex, url: entry };\n }\n const e = (entry ?? {}) as Record<string, unknown>;\n const str = (key: string): string | undefined =>\n typeof e[key] === 'string' ? (e[key] as string) : undefined;\n const firstStr = (...keys: string[]): string | undefined => {\n for (const k of keys) {\n const v = str(k);\n if (v !== undefined) return v;\n }\n return undefined;\n };\n const publishedAt = e['publishedAt'];\n const normalizedPublishedAt =\n typeof publishedAt === 'string' || typeof publishedAt === 'number' || publishedAt instanceof Date\n ? publishedAt\n : undefined;\n return {\n id: str('id') ?? str('refId') ?? `c${fallbackIndex}`,\n index: typeof e['index'] === 'number' ? (e['index'] as number) : fallbackIndex,\n title: firstStr('title', 'name'),\n url: firstStr('url', 'href', 'source'),\n snippet: firstStr('snippet', 'content', 'excerpt'),\n sourceType: str('sourceType'),\n iconUrl: str('iconUrl'),\n publishedAt: normalizedPublishedAt,\n extra:\n typeof e['extra'] === 'object' && e['extra'] !== null\n ? (e['extra'] as Record<string, unknown>)\n : undefined,\n };\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal } from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport {\n selectPendingClientToolCalls,\n type CompleteOutcome,\n type ClientToolsCapability,\n type ClientToolResult,\n type ClientToolSpec,\n} from '@threadplane/chat';\nimport type { ToolCall } from '@threadplane/chat';\nimport type { LangGraphSubmitOptions } from './agent.types';\n\n/**\n * A patch written onto a local ToolCall when a client tool resolves.\n * Mirrors the fields the ag-ui adapter writes directly onto its WritableSignal.\n */\nexport interface ClientToolResultPatch {\n result: unknown;\n error?: unknown;\n status?: ToolCall['status'];\n}\n\n/**\n * Minimal store surface consumed by createClientToolsCapability.\n * Typed narrowly so the factory is easy to fake in tests.\n */\nexport interface ClientToolsStore {\n toolCalls: Signal<readonly ToolCall[]>;\n isLoading: Signal<boolean>;\n /**\n * Write a client-tool outcome onto the local ToolCall with the given id.\n * The LangGraph `toolCalls` signal is a read-only projection of the SDK's\n * stream, so the adapter layers these patches over the projection rather\n * than mutating it in place. This freezes the transcript card: toToolViewSpec\n * spreads the result into the mounted ask component's props on the next\n * render, letting it branch to a resolved/frozen state.\n */\n applyClientResult(id: string, patch: ClientToolResultPatch): void;\n}\n\n/**\n * The run-issuing function used by createClientToolsCapability.\n * Accepts a payload (input) and optional LangGraph submit options.\n * Corresponds to StreamManagerBridge.submit.\n */\nexport type SubmitFn = (\n payload: unknown,\n opts?: LangGraphSubmitOptions,\n batch?: StagedToolMessageBatch,\n) => Promise<CompleteOutcome>;\n\n/** Serialize a tool result value to a string for the ToolMessage content. */\nfunction safeStringify(v: unknown): string {\n return typeof v === 'string' ? v : JSON.stringify(v);\n}\n\n/**\n * Merge client_tools into a run payload.\n *\n * If payload is null we keep it null — a null payload signals a no-input\n * resume (used by regenerate and command resumes) and the server must\n * receive null, not an object. The catalog can only be injected when the\n * payload is a plain object that the graph's add_messages reducer can\n * process; it cannot be injected into a command-resume (null payload) or\n * into an already-typed non-record payload.\n *\n * Returns a new object; never mutates the original.\n */\nexport function mergeClientTools(\n payload: unknown,\n catalog: readonly ClientToolSpec[],\n): unknown {\n if (catalog.length === 0) return payload;\n if (payload === null || payload === undefined) return payload;\n if (typeof payload !== 'object' || Array.isArray(payload)) return payload;\n return { ...(payload as Record<string, unknown>), client_tools: catalog };\n}\n\n/**\n * Merge A2UI client capabilities into a run payload under the\n * `a2ui_client_capabilities` state key. Same payload semantics as\n * {@link mergeClientTools}: null/undefined payloads (command resumes,\n * regenerates) and non-record payloads pass through untouched, and the\n * original object is never mutated. Because LangGraph thread state\n * persists across runs, the capabilities stamped by any run remain\n * readable by later runs on the same thread.\n */\nexport function mergeA2uiClientCapabilities(\n payload: unknown,\n capabilities: { supportedCatalogIds: string[]; inlineCatalogs?: unknown[] } | undefined,\n): unknown {\n if (!capabilities) return payload;\n if (payload === null || payload === undefined) return payload;\n if (typeof payload !== 'object' || Array.isArray(payload)) return payload;\n return { ...(payload as Record<string, unknown>), a2ui_client_capabilities: capabilities };\n}\n\n/**\n * Wire shape for a settled client-tool result awaiting durability. `id` is\n * deterministic for the tool-call ID so overlapping handoffs and retries\n * update the same logical ToolMessage.\n */\nexport interface BufferedToolMessage {\n readonly id: string;\n readonly type: 'tool';\n readonly role: 'tool';\n readonly tool_call_id: string;\n readonly content: string;\n}\n\n/**\n * Non-destructive snapshot of staged messages. Callers acknowledge only after\n * the exact handoff succeeds; acknowledgment removes only captured entries and\n * becomes a no-op after a thread-reset generation change.\n */\nexport interface StagedToolMessageBatch {\n readonly generation: number;\n readonly messages: readonly BufferedToolMessage[];\n acknowledge(): void;\n}\n\nexport interface LangGraphClientToolsCapability extends ClientToolsCapability {\n readonly catalog: Signal<readonly ClientToolSpec[]>;\n snapshotToolMessages(): StagedToolMessageBatch;\n clearStagedToolMessages(): void;\n}\n\n/** Writes settled tool messages into server thread state without starting a run. */\nexport type PersistToolMessagesFn = (\n messages: readonly BufferedToolMessage[],\n) => Promise<void>;\n\n/** Reads the thread a write would currently land on. */\nexport type CurrentThreadIdFn = () => string | null;\n\n/**\n * A buffered tool message plus the thread it was settled on. The stamp is\n * internal bookkeeping and never reaches the wire — only `message` is sent.\n */\ninterface StagedToolMessage {\n readonly threadId: string | null;\n readonly message: BufferedToolMessage;\n}\n\n/**\n * Prepend staged tool messages to a run payload's message list.\n *\n * Mirrors mergeClientTools: a null payload signals a no-input resume and must\n * stay null, so staged messages cannot ride along and are left buffered.\n */\nexport function mergeStagedToolMessages(\n payload: unknown,\n staged: readonly BufferedToolMessage[],\n): unknown {\n if (staged.length === 0) return payload;\n if (payload === null || payload === undefined) return payload;\n if (typeof payload !== 'object' || Array.isArray(payload)) return payload;\n const record = payload as Record<string, unknown>;\n const existing = Array.isArray(record['messages']) ? record['messages'] : [];\n return { ...record, messages: [...staged, ...existing] };\n}\n\n/**\n * Creates a ClientToolsCapability backed by a LangGraph submit function and\n * a store of tool-call signals. Extracted into a factory so it can be\n * unit-tested in isolation without standing up a full Angular DI environment.\n *\n * The capability:\n * - Maintains a catalog of client tool specs (setCatalog). The caller\n * is responsible for threading the catalog into every run payload via\n * mergeClientTools() before calling manager.submit — see agent.fn.ts.\n * - Exposes a `pending` computed signal: tool calls whose name is in the\n * catalog, have no backend result, and haven't been resolved client-side\n * yet — but ONLY when the run is not in progress (isLoading===false).\n * The backend ends the run without emitting a ToolMessage result for\n * client tools, so `result` stays undefined on those entries.\n * - settle(id, result): marks the call as resolved, writes the local result,\n * and stages a ToolMessage with a deterministic ID without issuing a run.\n * - flush(): snapshots the whole staged group into ONE persistFn call without\n * starting a run — the settlement path for tool groups that never continue.\n * Successful persistence acknowledges the captured entries; failed writes\n * retain them. When persistFn is absent, a non-empty flush rejects without\n * changing the staged results. Flushes are chained so entries settled after\n * one snapshot receive their own write. Concurrent persistence,\n * continuation, and ordinary submits may safely carry the same stable IDs.\n * - clearStagedToolMessages(): discards staged results on a thread switch and\n * advances the generation so late acknowledgments cannot affect new state.\n * - resolve(id, result): settles the result, then issues a NEW run on the SAME\n * thread by calling submitFn with a non-destructive ToolMessage snapshot:\n * input: {\n * messages: [{ type: 'tool', role: 'tool', tool_call_id: id, content }],\n * client_tools: catalog(),\n * }\n * The snapshot remains staged unless that continuation reports success.\n * LangGraph's `add_messages` reducer reuses each stable message ID on safe\n * overlap or replay. Including `client_tools` ensures the model sees the\n * full tool catalog on the continuation run.\n *\n * Catalog shipping: the catalog is NOT injected by this factory's\n * submitFn call in resolve() — the resolved-tool run builds the payload\n * directly. For normal submit/regenerate runs, the agent.fn.ts wrapper\n * uses mergeClientTools() to inject `client_tools` into the payload\n * before forwarding to manager.submit. This keeps injection concerns\n * co-located with the run-issuing call sites.\n */\nexport function createClientToolsCapability(\n submitFn: SubmitFn,\n store: ClientToolsStore,\n persistFn?: PersistToolMessagesFn,\n currentThreadIdFn?: CurrentThreadIdFn,\n): LangGraphClientToolsCapability {\n const catalog = signal<readonly ClientToolSpec[]>([]);\n const resolvedIds = signal<ReadonlySet<string>>(new Set());\n const toolMessageBuffer: StagedToolMessage[] = [];\n let flushInFlight: Promise<void> | undefined;\n // Bumped whenever a thread reset discards staged state. Every snapshot keeps\n // its generation, making acknowledgments from the prior thread no-ops.\n let bufferGeneration = 0;\n // Tool calls belonging to threads we have left. A handler still running when\n // the user switches threads settles AFTER the switch, by which point both the\n // store and the current thread id already describe the NEW thread — the id is\n // the only durable way left to recognise the result as stale.\n const retiredToolCallIds = new Set<string>();\n\n const pending = computed<readonly ToolCall[]>(() => {\n // Client tools are only actionable after the run ends (the backend\n // signals this by ending the run WITHOUT emitting a ToolMessage result\n // for client tools).\n return selectPendingClientToolCalls({\n isLoading: store.isLoading(),\n toolCalls: store.toolCalls(),\n catalogNames: new Set(catalog().map((s) => s.name)),\n resolvedIds: resolvedIds(),\n });\n });\n\n function settleResult(id: string, result: ClientToolResult): void {\n // Mark as resolved first so pending() drops it immediately.\n resolvedIds.update((s) => new Set(s).add(id));\n\n // Cast rather than rely on discriminant narrowing: consumer apps that\n // compile this source with `strictNullChecks: false` don't narrow the\n // ClientToolResult union in a ternary.\n const ok = result.ok;\n const value = (result as { value: unknown }).value;\n const error = (result as { error: string }).error;\n\n // Write the outcome onto the LOCAL ToolCall (via the adapter's override\n // layer). The client tool DID produce a result client-side, so this is\n // semantically correct — and it freezes the transcript card: the mounted\n // ask component re-renders with its own emitted value as props and can\n // branch to a resolved/frozen state. Without this, the LOCAL tool call\n // never gets a result (only the backend ToolMessage does) so the card\n // stays interactive forever.\n store.applyClientResult(id, {\n result: ok ? value : { error },\n ...(ok ? {} : { error, status: 'error' as const }),\n });\n\n const content = ok\n ? safeStringify(value)\n : `Error: ${error}`;\n\n // The tool call belongs to a thread the user has already left, so there is\n // nowhere valid to send this result: the current thread has no matching\n // tool call, and the old thread is no longer the write target.\n if (retiredToolCallIds.has(id)) {\n console.warn(\n `Discarding client tool result for ${id}: its thread is no longer active.`,\n );\n return;\n }\n\n // Message shape: both `type` and `role` are set for compatibility —\n // the LangGraph server's add_messages coercion reads `role` (Python\n // side), while the bridge's local optimistic-message path reads `type`\n // (via toMessage's normalizeMessageType). This mirrors the human-message\n // shape used in buildSubmitUpdate (agent.fn.ts line 732).\n toolMessageBuffer.push({\n threadId: currentThreadIdFn?.() ?? null,\n message: {\n id: `client-tool-result-${id}`,\n type: 'tool',\n role: 'tool',\n tool_call_id: id,\n content,\n },\n });\n }\n\n /**\n * Returns a non-destructive snapshot of entries still valid for the thread a\n * write would land on right now. Captured entries remain staged, so\n * overlapping operations may carry the same deterministic message IDs.\n * Acknowledgment removes only the exact captured entries while the snapshot\n * generation is current. An entry stamped for another thread is dropped\n * rather than misdelivered.\n *\n * A null on either side means \"thread not tracked yet\" (no threadId option\n * and no run has reported one); those are kept, since there is no evidence of\n * a switch and dropping them would lose results on untracked transports.\n */\n function snapshotToolMessages(): StagedToolMessageBatch {\n const current = currentThreadIdFn?.() ?? null;\n for (let index = toolMessageBuffer.length - 1; index >= 0; index -= 1) {\n const entry = toolMessageBuffer[index];\n const stale =\n entry.threadId !== null && current !== null && entry.threadId !== current;\n if (stale) {\n console.warn(\n `Discarding a client tool result staged for thread ${entry.threadId}; ` +\n `the active thread is now ${current}.`,\n );\n toolMessageBuffer.splice(index, 1);\n }\n }\n\n const generation = bufferGeneration;\n const entries = [...toolMessageBuffer];\n const messages = entries.map(({ message }) => ({ ...message }));\n let acknowledged = false;\n\n return {\n generation,\n messages,\n acknowledge(): void {\n if (acknowledged || generation !== bufferGeneration) return;\n acknowledged = true;\n for (const entry of entries) {\n const index = toolMessageBuffer.indexOf(entry);\n if (index !== -1) toolMessageBuffer.splice(index, 1);\n }\n },\n };\n }\n\n /**\n * Persist one snapshot. Only that snapshot is acknowledged after persistence\n * succeeds; failure leaves its exact entries staged for retry or submit.\n */\n function runFlush(): Promise<void> {\n const batch = snapshotToolMessages();\n if (batch.messages.length === 0) return Promise.resolve();\n if (!persistFn) {\n return Promise.reject(\n new Error(\n 'Cannot flush staged client tool results. ' +\n 'Custom LangGraph transports using terminal client tools must implement updateState().',\n ),\n );\n }\n return persistFn(batch.messages)\n .then(() => {\n batch.acknowledge();\n })\n .catch((err: unknown) => {\n console.warn(\n `Client tool flush failed; ${batch.messages.length} result(s) remain staged for the next run.`,\n err,\n );\n });\n }\n\n const capability: LangGraphClientToolsCapability = {\n catalog,\n\n setCatalog(specs: readonly ClientToolSpec[]): void {\n catalog.set([...specs]);\n },\n\n pending,\n\n settle(id: string, result: ClientToolResult): void {\n settleResult(id, result);\n },\n\n snapshotToolMessages(): StagedToolMessageBatch {\n return snapshotToolMessages();\n },\n\n /**\n * Discard everything staged. Called when the active thread changes: a\n * ToolMessage only makes sense against the thread whose AIMessage produced\n * its tool_call_id, so carrying it over would poison the new thread.\n */\n clearStagedToolMessages(): void {\n // Retire the outgoing thread's tool calls so a handler that settles after\n // the switch is recognised as stale. Read the store BEFORE it resets —\n // agent.fn.ts calls this ahead of manager.switchThread for that reason.\n for (const toolCall of store.toolCalls()) retiredToolCallIds.add(toolCall.id);\n toolMessageBuffer.length = 0;\n // Invalidate every outstanding snapshot acknowledgment from the old thread.\n bufferGeneration += 1;\n },\n\n flush(): Promise<void> {\n // Only this method owns the queue tail. Results settled after an active\n // snapshot need their own write, and every caller must remain behind all\n // callers already queued. The chain terminates when a fresh snapshot is\n // empty.\n const queued = flushInFlight\n ? flushInFlight.then(() => runFlush(), () => runFlush())\n : runFlush();\n flushInFlight = queued;\n\n const clearTail = (): void => {\n if (flushInFlight === queued) flushInFlight = undefined;\n };\n // Both handlers return normally, so this bookkeeping branch cannot\n // create an unhandled rejection when the caller observes `queued`.\n void queued.then(clearTail, clearTail);\n return queued;\n },\n\n resolve(id: string, result: ClientToolResult): void {\n settleResult(id, result);\n // Issue a new run with a non-destructive snapshot. The exact batch is\n // acknowledged only when that continuation succeeds; failures retain it\n // for retry. Stable IDs make overlap with flush or submit safe under\n // LangGraph's add_messages reducer. `client_tools` keeps the full catalog\n // visible to the continuation.\n const batch = snapshotToolMessages();\n const toolPayload = {\n messages: batch.messages,\n client_tools: catalog(),\n };\n\n void submitFn(toolPayload, undefined, batch).then((outcome) => {\n if (outcome === 'success') batch.acknowledge();\n });\n },\n };\n\n return capability;\n}\n","// SPDX-License-Identifier: MIT\nimport {\n inject, DestroyRef, computed, effect,\n isSignal, signal, Signal,\n} from '@angular/core';\nimport { AGENT_CONFIG } from './agent.provider';\nimport type { AgentLifecycle } from './lifecycle';\nimport { AgentLifecycleRegistry } from './agent-lifecycle-registry';\nimport { toSignal, toObservable } from '@angular/core/rxjs-interop';\nimport {\n BehaviorSubject, Subject, of,\n throttleTime, asyncScheduler,\n} from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport type { Observable } from 'rxjs';\nimport type { BaseMessage, AIMessage as CoreAIMessage } from '@langchain/core/messages';\n\n/**\n * Wire-shape of a `RemoveMessage` instruction. LangGraph's `add_messages`\n * reducer (Python side) coerces incoming dicts via a strict check that\n * expects `role` + `content` keys; without them, the dict-to-Message\n * conversion throws and the whole `updateState` request 400s. Construct\n * the shape directly with the required keys so we get correct semantics\n * without importing the `RemoveMessage` class from `@langchain/core/messages`\n * (the class import pulls in the full BaseMessage hierarchy, ~30-50 kB,\n * which Cockpit's example-app bundle budget rejects).\n */\ntype RemoveMessageInstruction = {\n type: 'remove';\n role: 'remove';\n id: string;\n content: '';\n};\nimport type { Command, Interrupt, ToolCallWithResult } from '@langchain/langgraph-sdk';\nimport type { BagTemplate, InferBag } from '@langchain/langgraph-sdk';\nimport type {\n AgentEvent,\n AgentCheckpoint,\n AgentError,\n AgentInterrupt,\n AgentStatus,\n Message,\n Role,\n Subagent,\n ToolCall,\n ToolCallStatus,\n ContentBlock,\n AgentSubmitInput,\n AgentSubmitOptions,\n MessageDelivery,\n} from '@threadplane/chat';\nimport { staticDelivery } from '@threadplane/chat';\n\nimport {\n AgentOptions,\n LangGraphAgent,\n CustomStreamEvent,\n StreamSubjects,\n SubagentStreamRef,\n ResourceStatus,\n AgentQueue,\n LangGraphSubmitOptions,\n} from './agent.types';\nimport type { ThreadState, ToolProgress } from '@langchain/langgraph-sdk';\nimport type { MessageMetadata } from '@langchain/langgraph-sdk/ui';\nimport { createStreamManagerBridge } from './internals/stream-manager.bridge';\nimport { LANGGRAPH_CLIENT_OPTIONS, resolveClientOptions } from './client/client-options';\nimport { buildBranchTree } from './internals/branch-tree';\nimport { extractCitations } from './internals/extract-citations';\nimport {\n createClientToolsCapability,\n mergeA2uiClientCapabilities,\n mergeClientTools,\n mergeStagedToolMessages,\n} from './client-tools';\nimport type { ClientToolResultPatch, StagedToolMessageBatch } from './client-tools';\n\n/**\n * Walk LangGraph history (newest-first) and pair each AIMessage id with\n * the most recent checkpoint that contains it as the tail message in\n * `values.messages`.\n *\n * Implementation: iterate oldest → newest (i.e. reverse the input array)\n * so later writes overwrite earlier ones; the final map has each\n * AIMessage paired with the newest containing checkpoint where it is\n * still the tail. Checkpoints with no AIMessage in scope are skipped.\n * Checkpoints with no checkpoint_id are skipped.\n */\nexport function computeMessageCheckpoints(\n history: ReadonlyArray<ThreadState<unknown>>,\n): ReadonlyMap<string, string> {\n const out = new Map<string, string>();\n for (let i = history.length - 1; i >= 0; i--) {\n const state = history[i];\n const cpId = state.checkpoint?.checkpoint_id;\n if (typeof cpId !== 'string' || cpId.length === 0) continue;\n const values = state.values as { messages?: unknown[] } | undefined;\n const msgs = Array.isArray(values?.messages) ? values.messages : [];\n for (let j = msgs.length - 1; j >= 0; j--) {\n const m = msgs[j] as { id?: string; _getType?: () => string; type?: string };\n const type = typeof m._getType === 'function' ? m._getType() : m.type;\n if (type === 'ai' && typeof m.id === 'string') {\n out.set(m.id, cpId);\n break;\n }\n }\n }\n return out;\n}\n\n/**\n * Internal factory that constructs a LangGraph-backed Angular agent.\n *\n * @internal Consumers do not call this directly. Configure the adapter with\n * `provideAgent({...})` in `app.config.ts` (or a component's `providers`), then\n * retrieve the agent with `injectAgent()`. This factory is the construction\n * logic invoked by `provideAgent`'s DI factory.\n *\n * Must run within an Angular injection context. Returns a unified\n * {@link LangGraphAgent} whose properties are Angular Signals that update\n * in real time as LangGraph streams messages, values, tool calls, interrupts,\n * subagent state, and checkpoint history.\n *\n * @typeParam T - The state shape returned by the agent\n * @typeParam Bag - Optional bag template for typed interrupts and submit payloads\n * @param options - Configuration for the LangGraph agent\n * @returns A {@link LangGraphAgent} with reactive signals and action methods\n *\n * @example\n * ```typescript\n * // app.config.ts — configure once\n * providers: [\n * provideAgent({\n * assistantId: 'chat',\n * apiUrl: 'http://localhost:2024',\n * threadId: signal(savedThreadId),\n * onThreadId: (id) => localStorage.setItem('threadId', id),\n * }),\n * ];\n *\n * // component — retrieve from DI\n * const chat = injectAgent();\n *\n * // Access signals in template\n * // chat.messages(), chat.status(), chat.error()\n * ```\n */\nexport function agent<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: AgentOptions<T, InferBag<T, Bag>>,\n): LangGraphAgent<T, InferBag<T, Bag>> {\n // Injection context required\n const destroyRef = inject(DestroyRef);\n const globalConfig = inject(AGENT_CONFIG, { optional: true });\n const sharedClientOptions = inject(LANGGRAPH_CLIENT_OPTIONS, { optional: true });\n const destroy$ = new Subject<void>();\n destroyRef.onDestroy(() => { destroy$.next(); destroy$.complete(); });\n\n // Merge: call-site options take precedence over global provider config\n const apiUrl = options.apiUrl ?? globalConfig?.apiUrl ?? '';\n const transport = options.transport ?? globalConfig?.transport;\n // clientOptions precedence: agent({...}) call-site → provideAgent config →\n // app-wide LANGGRAPH_CLIENT_OPTIONS token → SDK default.\n const clientOptions = resolveClientOptions(\n options.clientOptions,\n globalConfig?.clientOptions,\n sharedClientOptions,\n );\n\n const init = (options.initialValues ?? {}) as T;\n\n // All subjects created before the bridge\n const status$ = new BehaviorSubject<ResourceStatus>(ResourceStatus.Idle);\n const values$ = new BehaviorSubject<T>(init);\n const messages$ = new BehaviorSubject<BaseMessage[]>([]);\n const error$ = new BehaviorSubject<unknown>(undefined);\n const interrupt$ = new BehaviorSubject<Interrupt<InferBag<T, Bag>['InterruptType']> | undefined>(undefined);\n const interrupts$ = new BehaviorSubject<Interrupt<InferBag<T, Bag>['InterruptType']>[]>([]);\n const branch$ = new BehaviorSubject<string>('');\n const history$ = new BehaviorSubject<ThreadState<T>[]>([]);\n const isThreadLoading$ = new BehaviorSubject<boolean>(false);\n const toolProgress$ = new BehaviorSubject<ToolProgress[]>([]);\n const toolCalls$ = new BehaviorSubject<ToolCallWithResult[]>([]);\n const messageMetadata$ = new BehaviorSubject<Map<string, MessageMetadata<Record<string, unknown>>>>(new Map());\n const subagents$ = new BehaviorSubject<Map<string, SubagentStreamRef>>(new Map());\n const queue$ = new BehaviorSubject<AgentQueue>({\n entries: [],\n size: 0,\n cancel: async () => false,\n clear: async () => undefined,\n });\n const custom$ = new BehaviorSubject<CustomStreamEvent[]>([]);\n const hasValue$ = new BehaviorSubject<boolean>(false);\n\n // Forward reference. The client-tools capability is built much further down\n // (it needs `manager`, which needs these subjects), but the thread-change\n // seam lives here. A holder keeps the binding itself a `const` while its\n // member is filled in later.\n const clientToolStaging: { clear?: () => void } = {};\n let retryableToolMessageBatch: StagedToolMessageBatch | undefined;\n\n function resetDerivedThreadState(): void {\n status$.next(ResourceStatus.Idle);\n error$.next(undefined);\n hasValue$.next(false);\n // Staged client-tool results belong to the thread whose AIMessage produced\n // their tool_call_ids. Carrying them into a different thread would prepend\n // a ToolMessage that matches no tool call there — a 400 on that turn.\n // Runs BEFORE manager.switchThread resets the store, so the capability can\n // still read the outgoing thread's tool calls.\n clientToolStaging.clear?.();\n }\n\n // Track hasValue — becomes true once values or messages arrive\n values$.pipe(takeUntil(destroy$)).subscribe(v => {\n if (v != null && Object.keys(v as object).length > 0) hasValue$.next(true);\n });\n messages$.pipe(takeUntil(destroy$)).subscribe(m => { if (m.length > 0) hasValue$.next(true); });\n\n const subjects: StreamSubjects<T, InferBag<T, Bag>> = {\n status$, values$, messages$, error$,\n interrupt$, interrupts$, branch$, history$,\n isThreadLoading$, toolProgress$, toolCalls$, messageMetadata$, subagents$, queue$, custom$,\n };\n\n // threadId$ — resolved before bridge creation (injection context required for toObservable)\n const threadId$ = isSignal(options.threadId)\n ? toObservable(options.threadId as Signal<string | null>)\n : of((options.threadId as string | null | undefined) ?? null);\n\n let hasSeenThreadId = false;\n let lastThreadId: string | null = null;\n threadId$.pipe(takeUntil(destroy$)).subscribe((id) => {\n if (hasSeenThreadId && lastThreadId !== id) {\n resetDerivedThreadState();\n }\n hasSeenThreadId = true;\n lastThreadId = id;\n });\n\n // ── Lifecycle instrumentation ─────────────────────────────────────────────\n // Eight signals tracking key transitions for telemetry/observability.\n // All reset together via resetLifecycle(); see switchThread() below.\n const lcStreamStartedAt = signal<number | null>(null);\n const lcStreamErrorAt = signal<{ at: number; classification: string } | null>(null);\n const lcInterruptReceivedAt = signal<number | null>(null);\n const lcInterruptResolvedAt = signal<number | null>(null);\n const lcThreadCreatedAt = signal<number | null>(null);\n const lcThreadPersistedAt = signal<number | null>(null);\n const lcToolCallStartedAt = signal<number | null>(null);\n const lcToolCallCompletedAt = signal<number | null>(null);\n\n const lifecycle: AgentLifecycle = {\n streamStartedAt: lcStreamStartedAt,\n streamErrorAt: lcStreamErrorAt,\n interruptReceivedAt: lcInterruptReceivedAt,\n interruptResolvedAt: lcInterruptResolvedAt,\n threadCreatedAt: lcThreadCreatedAt,\n threadPersistedAt: lcThreadPersistedAt,\n toolCallStartedAt: lcToolCallStartedAt,\n toolCallCompletedAt: lcToolCallCompletedAt,\n };\n\n // Register with optional lifecycle registry. External instrumentation\n // (e.g. cockpit-telemetry) provides AgentLifecycleRegistry to receive\n // per-agent lifecycles created within this injection context.\n const lifecycleRegistry = inject(AgentLifecycleRegistry, { optional: true });\n lifecycleRegistry?.register(lifecycle);\n\n function resetLifecycle(): void {\n lcStreamStartedAt.set(null);\n lcStreamErrorAt.set(null);\n lcInterruptReceivedAt.set(null);\n lcInterruptResolvedAt.set(null);\n lcThreadCreatedAt.set(null);\n lcThreadPersistedAt.set(null);\n lcToolCallStartedAt.set(null);\n lcToolCallCompletedAt.set(null);\n }\n\n // First chunk: first values$ or messages$ emission with content.\n values$.pipe(takeUntil(destroy$)).subscribe(v => {\n if (lcStreamStartedAt() === null && v != null && Object.keys(v as object).length > 0) {\n lcStreamStartedAt.set(Date.now());\n }\n });\n messages$.pipe(takeUntil(destroy$)).subscribe(m => {\n if (lcStreamStartedAt() === null && m.length > 0) lcStreamStartedAt.set(Date.now());\n });\n // Stream error: capture timestamp + classification (Error name or 'unknown').\n error$.pipe(takeUntil(destroy$)).subscribe(e => {\n if (e == null) return;\n const classification = e instanceof Error ? e.name : typeof e === 'string' ? 'string' : 'unknown';\n lcStreamErrorAt.set({ at: Date.now(), classification });\n });\n // First non-null interrupt within this thread.\n interrupt$.pipe(takeUntil(destroy$)).subscribe(ix => {\n if (ix != null && lcInterruptReceivedAt() === null) lcInterruptReceivedAt.set(Date.now());\n });\n // First tool call append; first completed/error result transition.\n const seenToolCallStates = new Map<string, string>();\n toolCalls$.pipe(takeUntil(destroy$)).subscribe(tcs => {\n if (tcs.length > 0 && lcToolCallStartedAt() === null) lcToolCallStartedAt.set(Date.now());\n if (lcToolCallCompletedAt() !== null) return;\n for (const tc of tcs) {\n const prev = seenToolCallStates.get(tc.id);\n if (prev !== tc.state && (tc.state === 'completed' || tc.state === 'error')) {\n lcToolCallCompletedAt.set(Date.now());\n seenToolCallStates.set(tc.id, tc.state);\n break;\n }\n seenToolCallStates.set(tc.id, tc.state);\n }\n });\n // Thread restored from server: history$ populates with content for a\n // pre-existing threadId.\n history$.pipe(takeUntil(destroy$)).subscribe(h => {\n if (h.length > 0 && lcThreadPersistedAt() === null) lcThreadPersistedAt.set(Date.now());\n });\n\n const manager = createStreamManagerBridge({\n options: { ...options, apiUrl, transport, clientOptions },\n subjects,\n threadId$,\n destroy$: destroy$.asObservable(),\n });\n\n // Throttle helper — default 16ms (~60fps) to batch SSE token updates into\n // at most one signal update per frame, preventing change detection storms.\n const ms = typeof options.throttle === 'number' ? options.throttle : 16;\n const maybeThrottle = <V>(obs: BehaviorSubject<V>) =>\n ms > 0\n ? obs.pipe(throttleTime(ms, asyncScheduler, { leading: true, trailing: true }))\n : obs.asObservable();\n\n // Convert to Angular Signals (must happen in injection context)\n const value = toSignal(maybeThrottle(values$), { initialValue: init });\n // No throttle on messages$: we need every token emission to propagate to\n // Angular so streaming markdown actually streams. The bridge already\n // batches per-tuple at the SDK level; further throttling at the signal\n // boundary collapses tokens together and breaks visible token-by-token\n // rendering. Same-frame multiple emissions are coalesced by Angular's\n // CD anyway.\n const rawMessages = toSignal(messages$, { initialValue: [] as BaseMessage[] });\n const statusSig = toSignal(status$, { initialValue: ResourceStatus.Idle });\n // Cast justified: error$ accepts only AgentError | undefined (bridge catch normalizes all errors via\n // toAgentError before calling next(); resetDerivedThreadState passes undefined). The BehaviorSubject\n // is typed unknown to satisfy StreamSubjects<unknown> invariance at the subjects-bag assignment.\n const errorSig = toSignal(error$, { initialValue: undefined }) as Signal<AgentError | undefined>;\n const hasValueSig = toSignal(hasValue$, { initialValue: false });\n const interruptSig = toSignal(interrupt$, { initialValue: undefined });\n const interruptsSig= toSignal(interrupts$, { initialValue: [] });\n const branchSig = toSignal(branch$, { initialValue: '' });\n const historySig = toSignal(history$, { initialValue: [] });\n const threadLoadSig= toSignal(isThreadLoading$, { initialValue: false });\n const toolProgSig = toSignal(toolProgress$, { initialValue: [] });\n const rawToolCalls = toSignal(toolCalls$, { initialValue: [] });\n const subagentsSig = toSignal(subagents$, { initialValue: new Map<string, SubagentStreamRef>() });\n const queueSig = toSignal(queue$, { initialValue: queue$.value });\n const customSig = toSignal(custom$, { initialValue: [] as CustomStreamEvent[] });\n\n const isLoading = computed(() => statusSig() === ResourceStatus.Loading);\n const activeSubagents = computed(() =>\n [...subagentsSig().values()].filter(s => s.status() === 'running')\n );\n\n // ── Runtime-neutral projections ───────────────────────────────────────────\n\n // Project BaseMessage → Message on every recompute. We deliberately do\n // NOT cache: the LangGraph SDK mutates the same AIMessage instance in\n // place during token streaming (appends content to the same object), so\n // any identity-based cache returns stale projections and Angular's\n // `@let content = messageContent(message)` short-circuits — DOM never\n // updates per token. DOM stability is provided by `track message.id`\n // in chat-message-list, not by Message identity.\n const messagesNeutral = computed<Message[]>(() => {\n manager.deliveryRevision();\n return rawMessages().map((m) =>\n toMessage(m, manager.getReasoningDurationMs, manager.getMessageDelivery)\n );\n });\n\n // Client-tool resolutions written client-side. The raw `toolCalls$` stream\n // (and thus `rawToolCalls`) only ever carries backend results — a resolved\n // client tool (`ask`/`view`) never receives a backend ToolMessage on its\n // LOCAL call. These overrides layer the client-side outcome over the raw\n // projection so the transcript card can freeze (see chat-tool-views\n // toToolViewSpec, which spreads `result` into the mounted component's props).\n const clientResultOverrides = signal<ReadonlyMap<string, ClientToolResultPatch>>(new Map());\n\n const toolCallsNeutral = computed<ToolCall[]>(() => {\n const overrides = clientResultOverrides();\n return rawToolCalls().map((tc) => {\n const neutral = toToolCall(tc);\n const patch = overrides.get(neutral.id);\n return patch ? { ...neutral, ...patch } : neutral;\n });\n });\n\n const statusNeutral = computed<AgentStatus>(() => mapStatus(statusSig()));\n\n const stateNeutral = computed<Record<string, unknown>>(() => {\n const v = value();\n return v && typeof v === 'object' ? (v as Record<string, unknown>) : {};\n });\n\n const interruptNeutral = computed<AgentInterrupt | undefined>(() => {\n const ix = interruptSig();\n return ix ? toInterrupt(ix) : undefined;\n });\n\n const subagentsNeutral = computed<Map<string, Subagent>>(() => {\n const out = new Map<string, Subagent>();\n subagentsSig().forEach((sa, key) => out.set(key, toSubagent(sa, manager)));\n return out;\n });\n\n const historyNeutral = computed<AgentCheckpoint[]>(() =>\n historySig().map(toCheckpoint),\n );\n const messageCheckpointsSig = computed<ReadonlyMap<string, string>>(() =>\n computeMessageCheckpoints(historySig() as ThreadState<unknown>[]),\n );\n const experimentalBranchTree = computed(() =>\n buildBranchTree(historySig() as ThreadState<T>[]),\n );\n\n const events$ = buildEvents$(customSig);\n\n // ── Client tools capability ──────────────────────────────────────────────\n // The capability takes a direct reference to manager.submit so it can issue\n // follow-up runs (resolve) without going through the full submit() wrapper.\n // The catalog is injected into every outbound payload via mergeClientTools()\n // in the submit wrapper below and in the resolve path inside the capability.\n //\n // flush() needs a durable write that does NOT start a run. The bridge's\n // updateState() silently no-ops when the transport has no updateState, so\n // only supply a persist function when the effective transport supports it —\n // an omitted transport means the bridge builds a FetchStreamTransport, which\n // does. When persistFn is undefined, a non-empty flush() rejects while the\n // results stay staged; an ordinary non-null submit remains their in-memory\n // fallback path.\n const canPersistToolMessages = !transport || typeof transport.updateState === 'function';\n const clientToolsCap = createClientToolsCapability(\n (payload, opts, batch) => {\n retryableToolMessageBatch = batch;\n return manager.submit(payload, opts);\n },\n {\n toolCalls: toolCallsNeutral,\n isLoading,\n applyClientResult: (id, patch) =>\n clientResultOverrides.update((m) => new Map(m).set(id, patch)),\n },\n canPersistToolMessages\n ? async (messages) => {\n // Throw rather than let the bridge no-op: without a thread there is\n // nothing to write to, and flush() must keep the buffer staged.\n if (!manager.currentThreadId) {\n throw new Error('no threadId for client tool flush');\n }\n // No asNode: add_messages appends the ToolMessages and the graph's\n // resume point is left untouched, so no run is started.\n await manager.updateState({ messages: [...messages] });\n }\n : undefined,\n // Stamps each staged result with the thread it was settled on, so a write\n // can never land on a thread the user has since moved to.\n () => manager.currentThreadId,\n );\n clientToolStaging.clear = () => {\n retryableToolMessageBatch = undefined;\n clientToolsCap.clearStagedToolMessages();\n };\n\n async function resubmitWithToolRecovery(): Promise<void> {\n const batch = retryableToolMessageBatch;\n const outcome = await manager.resubmitLast();\n if (outcome === 'success') batch?.acknowledge();\n }\n\n return {\n // ── Runtime-neutral surface (AgentWithHistory) ────────────────────────\n messages: messagesNeutral,\n status: statusNeutral,\n isLoading,\n error: errorSig,\n toolCalls: toolCallsNeutral,\n state: stateNeutral as Signal<T>,\n interrupt: interruptNeutral,\n subagents: subagentsNeutral,\n events$,\n history: historyNeutral,\n messageCheckpoints: messageCheckpointsSig,\n submit: async (input: AgentSubmitInput | null | undefined, opts?: AgentSubmitOptions & LangGraphSubmitOptions) => {\n // Lifecycle: first submit with no existing threadId → thread create.\n if (lcThreadCreatedAt() === null && lastThreadId == null) {\n lcThreadCreatedAt.set(Date.now());\n }\n // Lifecycle: any resume submit marks an interrupt resolution.\n if (input?.resume !== undefined || opts?.resume !== undefined) {\n lcInterruptResolvedAt.set(Date.now());\n }\n const request = buildSubmitRequest(input, opts);\n // Thread the client-tools catalog into every outbound payload so the\n // backend middleware can merge them into the model's tool list. Null\n // payloads (regenerate re-runs, command resumes) are left unchanged.\n //\n // Snapshot results settled but not yet durable (flush unavailable or a\n // prior flush failed) so they ride along without being forgotten. The\n // exact snapshot is acknowledged only when this operation succeeds;\n // overlaps may safely carry the same deterministic message IDs. A null\n // payload cannot carry results, so it leaves staging unchanged.\n const batch = request.payload === null || request.payload === undefined\n ? undefined\n : clientToolsCap.snapshotToolMessages();\n const staged = batch?.messages ?? [];\n const withStaged = staged.length > 0\n ? mergeStagedToolMessages(request.payload, staged)\n : request.payload;\n const payload = mergeA2uiClientCapabilities(\n mergeClientTools(withStaged, clientToolsCap.catalog()),\n options.a2uiClientCapabilities,\n );\n const createsQueuedRun =\n request.options?.multitaskStrategy === 'enqueue' && isLoading();\n if (!createsQueuedRun) {\n retryableToolMessageBatch = batch;\n }\n const outcome = await manager.submit(payload, request.options);\n if (outcome === 'success') batch?.acknowledge();\n },\n stop: () => manager.stop(),\n\n retry: async () => {\n if (isLoading()) return; // no-op while a run is in flight\n error$.next(undefined); // clear the error before re-running\n await resubmitWithToolRecovery();\n },\n\n clientTools: clientToolsCap,\n\n regenerate: async (assistantMessageIndex: number): Promise<void> => {\n if (isLoading()) {\n throw new Error('Cannot regenerate while agent is loading another response');\n }\n const msgs = messagesNeutral();\n const target = msgs[assistantMessageIndex];\n if (!target || target.role !== 'assistant') {\n throw new Error(`Message at index ${assistantMessageIndex} is not an assistant message`);\n }\n\n // Find the user message immediately preceding the target assistant message.\n const userIdx = msgs\n .slice(0, assistantMessageIndex)\n .map((m, i) => ({ m, i }))\n .reverse()\n .find(({ m }) => m.role === 'user')?.i;\n if (userIdx === undefined) {\n throw new Error('No user message found before the target assistant message');\n }\n\n // Snapshot the raw BaseMessages that will be REMOVED (everything after userIdx).\n const rawToRemove = messages$.value.slice(userIdx + 1);\n\n // Truncate local buffer INCLUSIVE of the user message. The computed\n // messagesNeutral signal immediately reflects this — user message is\n // preserved in the UI while the new response streams in.\n messages$.next(messages$.value.slice(0, userIdx + 1));\n\n // Build RemoveMessage wire-shape instructions for server-side rollback.\n // LangGraph's add_messages reducer recognises `{ type: 'remove', id }`\n // and removes those entries from the thread state — ensuring the\n // runtime re-runs against the same trimmed state rather than appending\n // new messages on top.\n const removeList: RemoveMessageInstruction[] = rawToRemove\n .map(m => {\n const raw = m as unknown as Record<string, unknown>;\n const id = typeof raw['id'] === 'string' ? raw['id'] : undefined;\n return id\n ? { type: 'remove' as const, role: 'remove' as const, id, content: '' as const }\n : null;\n })\n .filter((rm): rm is RemoveMessageInstruction => rm !== null);\n\n // RemoveMessage rollback + reposition the graph to the entry node\n // via `as_node: '__start__'`. After the original run, the thread is\n // at `__end__` with `next: []` — submitting `null` would be a no-op\n // because there is nothing pending to execute. Setting `asNode` to\n // the start node tells LangGraph to treat the update as if `__start__`\n // had just produced the values, so the next pull resumes at the entry\n // node and runs `generate` against the rolled-back state.\n //\n // We always pass `asNode` even when removeList is empty (rare, but\n // possible if the assistant message had no id) so the regenerate\n // submit below still runs the graph.\n await manager.updateState(\n { messages: removeList },\n { asNode: '__start__' },\n );\n\n // Re-run the graph with no new input. With the thread now repositioned\n // at `__start__`, this resumes at the entry node and produces a fresh\n // assistant message — the trailing user message becomes the active\n // prompt without being re-appended.\n retryableToolMessageBatch = undefined;\n await manager.submit(null, undefined);\n },\n\n // ── Raw LangGraph signals ─────────────────────────────────────────────\n langGraphMessages: rawMessages as Signal<BaseMessage[]>,\n langGraphInterrupts: interruptsSig,\n langGraphToolCalls: rawToolCalls,\n langGraphHistory: historySig,\n experimentalBranchTree,\n\n // ── Other LangGraph-specific fields ──────────────────────────────────\n value: value as Signal<T>,\n hasValue: hasValueSig,\n reload: () => {\n void resubmitWithToolRecovery();\n },\n toolProgress: toolProgSig,\n queue: queueSig,\n activeSubagents,\n getSubagent: (toolCallId) => subagentsSig().get(toolCallId),\n getSubagentsByType: (type) =>\n [...subagentsSig().values()].filter(sa => sa.name === type),\n getSubagentsByMessage: (msg) => {\n const ids = getToolCallIds(msg);\n const subagents = subagentsSig();\n return ids\n .map(id => subagents.get(id))\n .filter((subagent): subagent is SubagentStreamRef => subagent != null);\n },\n customEvents: customSig,\n branch: branchSig,\n setBranch: (b) => branch$.next(b),\n isThreadLoading: threadLoadSig,\n switchThread: (id) => {\n resetDerivedThreadState();\n resetLifecycle();\n seenToolCallStates.clear();\n manager.switchThread(id);\n },\n lifecycle,\n joinStream: (id, last) => manager.joinStream(id, last),\n getMessagesMetadata: (msg, idx) => {\n const id = (msg as unknown as Record<string, unknown>)['id'];\n const key = id != null ? String(id) : idx != null ? String(idx) : undefined;\n return key ? messageMetadata$.value.get(key) : undefined;\n },\n getToolCalls: (msg) => {\n const id = (msg as unknown as Record<string, unknown>)['id'];\n return id == null\n ? []\n : toolCalls$.value.filter(tc => (tc.aiMessage as unknown as Record<string, unknown>)['id'] === id);\n },\n };\n}\n\n// ── Private translation helpers (moved from to-agent.ts) ─────────────────────\n\n/**\n * Build an Observable<AgentEvent> that bridges LangGraph's\n * `Signal<CustomStreamEvent[]>` (append-only array) into a stream of newly\n * emitted events. Each effect firing compares against a cursor tracking the\n * previously-seen length and emits only the tail slice.\n */\nfunction buildEvents$(customSig: Signal<CustomStreamEvent[]>): Observable<AgentEvent> {\n const subject = new Subject<AgentEvent>();\n let seen = 0;\n effect(() => {\n const all = customSig();\n if (all.length < seen) {\n // Stream reset (new session, thread switch, etc.). Rewind cursor.\n seen = 0;\n }\n for (let i = seen; i < all.length; i++) {\n subject.next(toAgentEvent(all[i]));\n }\n seen = all.length;\n });\n return subject.asObservable();\n}\n\nfunction toAgentEvent(e: CustomStreamEvent): AgentEvent {\n if (e.name === 'state_update' && isRecord(e.data)) {\n return { type: 'state_update', data: e.data };\n }\n return { type: 'custom', name: e.name, data: e.data };\n}\n\nfunction mapStatus(s: ResourceStatus): AgentStatus {\n switch (s) {\n case ResourceStatus.Error: return 'error';\n case ResourceStatus.Loading:\n case ResourceStatus.Reloading:\n return 'running';\n default:\n return 'idle';\n }\n}\n\nfunction toMessage(\n m: BaseMessage,\n getReasoningDurationMs?: (id: string) => number | undefined,\n getDelivery?: (id: string) => MessageDelivery,\n): Message {\n const raw = m as unknown as Record<string, unknown>;\n const typeVal = typeof m._getType === 'function'\n ? m._getType()\n : (raw['type'] as string | undefined) ?? 'ai';\n const role: Role =\n typeVal === 'human' ? 'user' :\n typeVal === 'tool' ? 'tool' :\n typeVal === 'system' ? 'system' :\n 'assistant';\n const id = (m.id as string | undefined) ?? (raw['id'] as string | undefined) ?? randomId();\n const reasoning = typeof raw['reasoning'] === 'string' && (raw['reasoning'] as string).length > 0\n ? (raw['reasoning'] as string)\n : undefined;\n const reasoningDurationMs = reasoning && getReasoningDurationMs\n ? getReasoningDurationMs(id)\n : undefined;\n const result: Message = {\n id,\n role,\n delivery: getDelivery?.(id) ?? staticDelivery(id),\n content: extractTextContent(m.content),\n toolCallId: raw['tool_call_id'] as string | undefined,\n name: raw['name'] as string | undefined,\n reasoning,\n reasoningDurationMs,\n extra: raw,\n };\n const citations = extractCitations(raw as { additional_kwargs?: Record<string, unknown> });\n if (citations) result.citations = citations;\n if (role === 'assistant') {\n const tcIds = getToolCallIds(m as CoreAIMessage);\n if (tcIds.length > 0) result.toolCallIds = tcIds;\n }\n return result;\n}\n\n/**\n * Extract user-visible text from a `BaseMessage.content` value.\n *\n * LangChain's `BaseMessage.content` is `string | MessageContentComplex[]`.\n * Reasoning-capable models (OpenAI gpt-5/o-series, Anthropic) emit complex\n * arrays of typed blocks: `{type: 'text', text}`, `{type: 'reasoning', ...}`,\n * tool-use blocks, etc. We render only the visible text portions and skip\n * anything else. JSON-stringifying the whole array (the previous behaviour)\n * would dump raw `[{\"type\":\"text\",...}]` into the chat bubble.\n */\nfunction extractTextContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (typeof block === 'string') {\n out += block;\n continue;\n }\n if (!isRecord(block)) continue;\n const t = block['type'];\n // Common text-bearing block shapes across providers.\n if (t === 'text' || t === 'output_text' || t === undefined) {\n const text = block['text'];\n if (typeof text === 'string') out += text;\n }\n // Skip reasoning, tool_use, image, etc. — not chat-bubble content.\n }\n return out;\n}\n\nfunction toToolCall(tc: ToolCallWithResult): ToolCall {\n const stateMap: Record<string, ToolCallStatus> = {\n pending: 'pending',\n completed: 'complete',\n error: 'error',\n };\n const status: ToolCallStatus = stateMap[tc.state] ?? 'running';\n const result = tc.result as (Record<string, unknown> | undefined);\n return {\n id: tc.id,\n name: tc.call.name,\n args: tc.call.args,\n status,\n result: result?.['content'],\n error: tc.state === 'error' ? result?.['content'] : undefined,\n };\n}\n\nfunction toInterrupt(ix: Interrupt<unknown>): AgentInterrupt {\n const raw = ix as unknown as Record<string, unknown>;\n return {\n id: (raw['id'] as string | undefined) ?? randomId(),\n value: raw['value'] ?? ix,\n resumable: true,\n };\n}\n\nfunction toSubagent(\n sa: SubagentStreamRef,\n manager: ReturnType<typeof createStreamManagerBridge>,\n): Subagent {\n return {\n toolCallId: sa.toolCallId,\n name: sa.name,\n status: sa.status,\n messages: computed(() => {\n manager.deliveryRevision();\n return sa.messages().map((m) =>\n toMessage(\n m,\n undefined,\n () => manager.getSubagentMessageDelivery(sa.toolCallId, m),\n )\n );\n }) as Signal<Message[]>,\n state: sa.values as Signal<Record<string, unknown>>,\n };\n}\n\nfunction getToolCallIds(msg: CoreAIMessage): string[] {\n const raw = msg as unknown as Record<string, unknown>;\n const toolCalls = raw['tool_calls'];\n if (!Array.isArray(toolCalls)) return [];\n return toolCalls\n .map(toolCall => isRecord(toolCall) && typeof toolCall['id'] === 'string' ? toolCall['id'] : undefined)\n .filter((id): id is string => id != null);\n}\n\nfunction buildSubmitRequest(\n input: AgentSubmitInput | null | undefined,\n opts?: AgentSubmitOptions & LangGraphSubmitOptions,\n): { payload: unknown; options?: AgentSubmitOptions & LangGraphSubmitOptions } {\n return {\n payload: buildSubmitPayload(input),\n options: normalizeSubmitOptions(input, opts),\n };\n}\n\nfunction buildSubmitPayload(input: AgentSubmitInput | null | undefined): unknown {\n if (input == null) return null;\n if (input.resume !== undefined) return null;\n return buildSubmitUpdate(input) ?? {};\n}\n\nfunction normalizeSubmitOptions(\n input: AgentSubmitInput | null | undefined,\n opts?: AgentSubmitOptions & LangGraphSubmitOptions,\n): (AgentSubmitOptions & LangGraphSubmitOptions) | undefined {\n const inputResume = input?.resume;\n const optionResume = opts?.resume;\n const resume = inputResume !== undefined ? inputResume : optionResume;\n if (resume === undefined) return opts;\n\n const next = { ...(opts ?? {}) };\n delete next.resume;\n const command = next.command;\n const update = buildSubmitUpdate(input);\n const commandUpdate = mergeCommandUpdate(command?.update, update);\n return {\n ...next,\n command: {\n ...command,\n resume,\n ...(commandUpdate === undefined ? {} : { update: commandUpdate }),\n },\n };\n}\n\nfunction buildSubmitUpdate(input: AgentSubmitInput | null | undefined): Record<string, unknown> | undefined {\n if (input == null) return undefined;\n if (input.message !== undefined) {\n const content = typeof input.message === 'string'\n ? input.message\n : input.message.map((b: ContentBlock) => (b.type === 'text' ? b.text : JSON.stringify(b))).join('');\n // `type: 'human'` is what `toMessage()` reads via `_getType` || raw['type'];\n // `role: 'human'` is what the LangGraph server expects in submit payloads.\n // Include both so the optimistic local copy projects as a 'user' bubble\n // (otherwise toMessage falls through to the 'ai' default and renders the\n // user's question as an assistant message).\n return { messages: [{ type: 'human', role: 'human', content }], ...(input.state ?? {}) };\n }\n return input.state;\n}\n\nfunction mergeCommandUpdate(\n existing: Command['update'] | undefined,\n update: Record<string, unknown> | undefined,\n): Command['update'] | undefined {\n if (update === undefined) return existing;\n if (existing == null) return update;\n if (isRecord(existing)) return { ...existing, ...update };\n if (Array.isArray(existing)) return [...existing, ...Object.entries(update)];\n return update;\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2);\n}\n\nfunction toCheckpoint(state: ThreadState<unknown>): AgentCheckpoint {\n return {\n id: state.checkpoint?.checkpoint_id ?? undefined,\n label: state.next?.[0] ?? undefined,\n values: isRecord(state.values) ? state.values : {},\n };\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken, inject, type Provider, type Signal } from '@angular/core';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { BagTemplate } from '@langchain/langgraph-sdk';\nimport type { AgentRef, AgentRuntimeTelemetrySink } from '@threadplane/chat';\nimport { agent } from './agent.fn';\nimport type {\n AgentTransport,\n LangGraphAgent,\n LangGraphClientOptions,\n} from './agent.types';\n\n/**\n * Configuration for an agent instance.\n * Combines connection defaults with per-component options so the\n * agent can be constructed once at provider time and injected\n * everywhere it is needed.\n */\n// The second generic mirrors AgentOptions so consumers can pin a Bag\n// template; it is currently unused inside this shape.\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface AgentConfig<\n T = Record<string, unknown>,\n _Bag extends BagTemplate = BagTemplate,\n> {\n /** Base URL of the LangGraph Platform API (e.g., `'http://localhost:2024'`). */\n apiUrl?: string;\n /** Agent or graph identifier on the LangGraph platform. */\n assistantId?: string;\n /** Thread ID to connect to. Pass a Signal for reactive thread switching. */\n threadId?: Signal<string | null> | string | null;\n /** Called when a new thread is auto-created by the transport. */\n onThreadId?: (id: string) => void;\n /** Initial state values before the first stream response arrives. */\n initialValues?: Partial<T>;\n /** Throttle signal updates in milliseconds. `false` to disable. */\n throttle?: number | false;\n /** Custom message deserializer for non-standard message formats. */\n toMessage?: (msg: unknown) => BaseMessage;\n /** Custom transport. Defaults to {@link FetchStreamTransport}. */\n transport?: AgentTransport;\n /** Tuning options for the default transport's LangGraph SDK client (e.g. retry budget). */\n clientOptions?: LangGraphClientOptions;\n /** Optional app-owned telemetry sink. No telemetry is emitted unless this is provided. */\n telemetry?: AgentRuntimeTelemetrySink | false;\n /** Tool names that indicate a subagent invocation. */\n subagentToolNames?: string[];\n /**\n * LangGraph node names whose `messages-tuple` LLM chunks should be projected\n * into the main chat transcript. Omit to accept all top-level message chunks.\n * Child-graph (namespaced) chunks never reach the transcript regardless of\n * this option — they belong to their child stream in `subagents()`.\n */\n transcriptNodeNames?: string[];\n}\n\n/**\n * @internal — exported only so the legacy in-tree `agent({...})` factory (and\n * its tests) can read provider-supplied defaults. Not part of the public API;\n * consumers should construct config inline at `provideAgent({...})`.\n */\nexport const AGENT_CONFIG = new InjectionToken<AgentConfig>('AGENT_CONFIG');\n\n/**\n * @internal — exported for spec access only. Consumers must use `injectAgent()`.\n */\nexport const AGENT = new InjectionToken<LangGraphAgent>('AGENT');\n\n/** @internal — shared factory that reads AGENT_CONFIG and constructs the singleton. */\nfunction agentFactory<T>(): LangGraphAgent<T> {\n // useFactory runs in an injection context, so the legacy `agent()`\n // factory's `inject(DestroyRef)` calls work.\n const config = inject(AGENT_CONFIG) as AgentConfig<T>;\n if (config.assistantId === undefined) {\n throw new Error(\n 'provideAgent: `assistantId` is required to construct the AGENT singleton.',\n );\n }\n return agent<T>({\n assistantId: config.assistantId,\n ...(config.apiUrl !== undefined ? { apiUrl: config.apiUrl } : {}),\n ...(config.threadId !== undefined ? { threadId: config.threadId } : {}),\n ...(config.onThreadId !== undefined ? { onThreadId: config.onThreadId } : {}),\n ...(config.initialValues !== undefined ? { initialValues: config.initialValues } : {}),\n ...(config.throttle !== undefined ? { throttle: config.throttle } : {}),\n ...(config.toMessage !== undefined ? { toMessage: config.toMessage } : {}),\n ...(config.transport !== undefined ? { transport: config.transport } : {}),\n ...(config.clientOptions !== undefined ? { clientOptions: config.clientOptions } : {}),\n ...(config.telemetry !== undefined ? { telemetry: config.telemetry } : {}),\n ...(config.subagentToolNames !== undefined ? { subagentToolNames: config.subagentToolNames } : {}),\n ...(config.transcriptNodeNames !== undefined ? { transcriptNodeNames: config.transcriptNodeNames } : {}),\n });\n}\n\nfunction isAgentRef<T>(x: unknown): x is AgentRef<T> {\n return typeof x === 'object' && x !== null && 'token' in x;\n}\n\n/**\n * Wire the LangGraph adapter into Angular's dependency injection.\n *\n * Registers a singleton `LangGraphAgent` constructed from `config`. Retrieve it\n * in any component with `injectAgent()`. Provide this at the application root\n * (`app.config.ts`) for an app-wide agent.\n *\n * To use a different agent in a component subtree, re-provide\n * `provideAgent({...})` in that component's `providers: []` array —\n * Angular's hierarchical DI scopes the singleton accordingly.\n *\n * **Static vs factory config.** Pass a plain `AgentConfig` object when the\n * config is known up front. Pass a `() => AgentConfig` factory when the config\n * depends on runtime/DI state — the factory runs inside an Angular injection\n * context, so it may call `inject()` to read services, route params, or\n * component-scoped signals.\n *\n * **Typed state via AgentRef.** Pass a typed ref as the first argument to flow\n * the state shape from `provideAgent` to `injectAgent` without repeating the\n * generic at every call site.\n *\n * @example Factory config reading route params\n * ```ts\n * providers: [\n * provideAgent(() => {\n * const route = inject(ActivatedRoute);\n * return { assistantId: 'chat', threadId: toSignal(route.paramMap) };\n * }),\n * ];\n * ```\n * @example Typed state via AgentRef\n * ```ts\n * export const TRIP = createAgentRef<TripState>('trip');\n * // app.config.ts:\n * providers: [provideAgent(TRIP, { assistantId: 'trip-graph' })]\n * // component:\n * const agent = injectAgent(TRIP); // LangGraphAgent<TripState>\n * ```\n */\nexport function provideAgent<T = Record<string, unknown>>(\n ref: AgentRef<T>,\n configOrFactory: AgentConfig<T> | (() => AgentConfig<T>),\n): Provider[];\nexport function provideAgent<T = Record<string, unknown>>(\n configOrFactory: AgentConfig<T> | (() => AgentConfig<T>),\n): Provider[];\nexport function provideAgent<T = Record<string, unknown>>(\n refOrConfig: AgentRef<T> | AgentConfig<T> | (() => AgentConfig<T>),\n maybeConfig?: AgentConfig<T> | (() => AgentConfig<T>),\n): Provider[] {\n const ref = isAgentRef<T>(refOrConfig) ? refOrConfig : undefined;\n const configOrFactory = (ref ? maybeConfig : refOrConfig) as\n | AgentConfig<T>\n | (() => AgentConfig<T>);\n\n // Resolve the factory (if any) lazily, inside the injection context of the\n // AGENT_CONFIG useFactory below — never at decoration time.\n const resolveConfig = (): AgentConfig<T> =>\n typeof configOrFactory === 'function' ? (configOrFactory as () => AgentConfig<T>)() : configOrFactory;\n\n const providers: Provider[] = [\n // AGENT_CONFIG resolves the config once (running the factory in an\n // injection context if a factory was passed). AGENT reads the resolved\n // config from here, so the factory is invoked exactly once.\n { provide: AGENT_CONFIG, useFactory: resolveConfig },\n { provide: AGENT, useFactory: agentFactory<T> },\n ];\n if (ref) providers.push({ provide: ref.token, useExisting: AGENT });\n return providers;\n}\n","// SPDX-License-Identifier: MIT\nimport { inject } from '@angular/core';\nimport type { BagTemplate } from '@langchain/langgraph-sdk';\nimport type { AgentRef } from '@threadplane/chat';\nimport { AGENT } from './agent.provider';\nimport type { LangGraphAgent } from './agent.types';\n\n/**\n * Retrieve the LangGraph-backed Agent from the current Angular injection context.\n *\n * Mirrors `@threadplane/ag-ui`'s `injectAgent()` so consumer code is identical\n * regardless of which adapter is wired in `app.config.ts`. The agent is a\n * singleton scoped to the injector that called `provideAgent()` — re-provide\n * in a child component's `providers: []` to scope a different agent to that\n * subtree (Angular's hierarchical DI handles the rest).\n *\n * **Typed state via AgentRef.** Pass the same ref that was supplied to\n * `provideAgent(ref, …)` to carry the state type through DI without repeating\n * the generic at every call site. The no-arg form defaults to\n * `LangGraphAgent<Record<string, unknown>>`.\n *\n * @example Typed state via AgentRef\n * ```ts\n * const agent = injectAgent(TRIP); // LangGraphAgent<TripState>\n * ```\n */\nexport function injectAgent(): LangGraphAgent<Record<string, unknown>>;\nexport function injectAgent<T, ResolvedBag extends BagTemplate = BagTemplate>(\n ref: AgentRef<T>,\n): LangGraphAgent<T, ResolvedBag>;\nexport function injectAgent<T = Record<string, unknown>, ResolvedBag extends BagTemplate = BagTemplate>(\n ref?: AgentRef<T>,\n): LangGraphAgent<T, ResolvedBag> {\n return inject(ref ? ref.token : AGENT) as LangGraphAgent<T, ResolvedBag>;\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken, Signal } from '@angular/core';\n\nexport interface AgentLifecycle {\n /** Epoch ms of the first stream chunk arrival. Resets on switchThread(). */\n readonly streamStartedAt: Signal<number | null>;\n /** Epoch ms + classification of the most recent stream error. Resets on switchThread(). */\n readonly streamErrorAt: Signal<{ at: number; classification: string } | null>;\n /** Epoch ms of the first interrupt$ non-null in this stream. Resets on switchThread(). */\n readonly interruptReceivedAt: Signal<number | null>;\n /** Epoch ms of the most recent submit({ resume }) call. Resets on switchThread(). */\n readonly interruptResolvedAt: Signal<number | null>;\n /** Epoch ms when the agent's \"create new thread\" branch fired. Resets on switchThread(). */\n readonly threadCreatedAt: Signal<number | null>;\n /** Epoch ms when an existing thread was restored from server (proves persistence). Resets on switchThread(). */\n readonly threadPersistedAt: Signal<number | null>;\n /** Epoch ms of the first tool call append. Resets on switchThread(). */\n readonly toolCallStartedAt: Signal<number | null>;\n /** Epoch ms of the first tool call result transition. Resets on switchThread(). */\n readonly toolCallCompletedAt: Signal<number | null>;\n}\n\nexport const AGENT_LIFECYCLE = new InjectionToken<AgentLifecycle>('AGENT_LIFECYCLE');\n","// SPDX-License-Identifier: MIT\nimport type { AgentQueueEntry, AgentTransport, LangGraphSubmitOptions, StreamEvent } from '../agent.types';\nimport type { ThreadState } from '@langchain/langgraph-sdk';\n\n/**\n * Test transport for deterministic agent testing without a real LangGraph server.\n *\n * Script event batches upfront, then emit them manually or step through them\n * in your test specs. Supports error injection and close control.\n *\n * @example\n * ```typescript\n * const transport = new MockAgentTransport([\n * [{ type: 'values', messages: [aiMsg('Hello')] }],\n * [{ type: 'values', messages: [aiMsg('Done')] }],\n * ]);\n * ```\n */\nexport class MockAgentTransport implements AgentTransport {\n history: ThreadState[] = [];\n readonly historyCalls: string[] = [];\n readonly streams: Array<{ threadId: string | null; payload: unknown; options?: LangGraphSubmitOptions }> = [];\n readonly createdQueuedRuns: AgentQueueEntry[] = [];\n readonly cancelledRuns: Array<{ threadId: string; runId: string }> = [];\n readonly joinedRuns: Array<{ threadId: string; runId: string }> = [];\n private script: StreamEvent[][];\n private scriptIndex = 0;\n private streaming = false;\n private eventQueue: StreamEvent[] = [];\n // Each resolver simply wakes the stream loop to re-check state.\n private resolvers: Array<() => void> = [];\n private closed = false;\n private pendingError: Error | null = null;\n\n /** @param script - Array of event batches. Each batch is emitted as a group. */\n constructor(script: StreamEvent[][] = []) {\n this.script = script;\n }\n\n /** Advance to the next scripted batch. Pass the returned events to `emit()`. */\n nextBatch(): StreamEvent[] {\n if (this.scriptIndex >= this.script.length) return [];\n return this.script[this.scriptIndex++];\n }\n\n /** Manually emit events into the stream. */\n emit(events: StreamEvent[]): void {\n this.eventQueue.push(...events);\n this.flush();\n }\n\n /** Inject an error into the stream. */\n emitError(err: Error): void {\n this.pendingError = err;\n this.flush();\n }\n\n /** Close the stream. Remaining queued events are drained before completion. */\n close(): void {\n this.closed = true;\n this.flush();\n }\n\n /** Returns true if a stream is currently active. */\n isStreaming(): boolean {\n return this.streaming;\n }\n\n async *stream(\n _assistantId: string,\n _threadId: string | null,\n _payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): AsyncIterable<StreamEvent> {\n this.streams.push({ threadId: _threadId, payload: _payload, options });\n this.streaming = true;\n try {\n while (!this.closed && !signal.aborted) {\n if (this.pendingError) throw this.pendingError;\n if (this.eventQueue.length > 0) {\n const event = this.eventQueue.shift();\n if (event) yield event;\n } else {\n // Wait until flush() wakes us, then loop again to check state.\n await new Promise<void>((resolve) => {\n if (signal.aborted) { resolve(); return; }\n this.resolvers.push(resolve);\n });\n }\n }\n if (signal.aborted) return;\n // Drain remaining events after close()\n while (this.eventQueue.length > 0) {\n const event = this.eventQueue.shift();\n if (event) yield event;\n }\n } finally {\n this.streaming = false;\n }\n }\n\n async createQueuedRun(\n _assistantId: string,\n threadId: string,\n payload: unknown,\n signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): Promise<AgentQueueEntry> {\n void signal;\n const entry: AgentQueueEntry = {\n id: `queued-run-${this.createdQueuedRuns.length + 1}`,\n threadId,\n values: payload,\n options: { ...options, multitaskStrategy: 'enqueue' },\n createdAt: new Date(),\n };\n this.createdQueuedRuns.push(entry);\n return entry;\n }\n\n async cancelRun(threadId: string, runId: string, signal: AbortSignal): Promise<void> {\n void signal;\n this.cancelledRuns.push({ threadId, runId });\n }\n\n async getHistory(threadId: string, signal: AbortSignal): Promise<ThreadState[]> {\n void signal;\n this.historyCalls.push(threadId);\n return this.history;\n }\n\n async *joinStream(\n threadId: string,\n runId: string,\n lastEventId: string | undefined,\n signal: AbortSignal,\n ): AsyncIterable<StreamEvent> {\n void lastEventId;\n void signal;\n this.joinedRuns.push({ threadId, runId });\n yield { type: 'values', values: { queued: true } };\n }\n\n private flush(): void {\n const resolve = this.resolvers.shift();\n if (resolve) resolve();\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal, WritableSignal } from '@angular/core';\nimport type {\n LangGraphAgent,\n SubagentStreamRef,\n AgentQueue,\n Interrupt,\n ThreadState,\n CustomStreamEvent,\n AgentBranchTree,\n} from '../agent.types';\nimport type { ToolProgress, ToolCallWithResult } from '@langchain/langgraph-sdk';\nimport type { BaseMessage, AIMessage as CoreAIMessage } from '@langchain/core/messages';\nimport type { MessageMetadata } from '@langchain/langgraph-sdk/ui';\nimport { mockAgent } from '@threadplane/chat';\nimport type {\n MockAgent,\n MockAgentOptions,\n AgentError,\n AgentInterrupt,\n AgentCheckpoint,\n AgentStatus,\n Message,\n Subagent,\n ToolCall,\n} from '@threadplane/chat';\n\n/**\n * A LangGraphAgent mock with writable signals for easy test control.\n *\n * Builds on the runtime-neutral {@link MockAgent} from `@threadplane/chat`\n * (which supplies the neutral `Agent`-contract writable signals plus\n * `submit`/`stop`/`regenerate` call tracking) and layers the LangGraph-specific\n * writable signals on top.\n *\n * Cast the result of `mockLangGraphAgent()` to this type to access\n * writable signals without unsafe casts in test files.\n */\nexport interface MockLangGraphAgent extends LangGraphAgent<any, any> {\n // Neutral writable signals — re-declared writable. (Dual-extends of MockAgent\n // and LangGraphAgent is impossible because they declare incompatible\n // `lifecycle` shapes, so we extend LangGraphAgent and layer the MockAgent\n // call-tracking surface explicitly below.)\n messages: WritableSignal<Message[]>;\n status: WritableSignal<AgentStatus>;\n isLoading: WritableSignal<boolean>;\n error: WritableSignal<AgentError | undefined>;\n toolCalls: WritableSignal<ToolCall[]>;\n interrupt: WritableSignal<AgentInterrupt | undefined>;\n subagents: WritableSignal<Map<string, Subagent>>;\n history: WritableSignal<AgentCheckpoint[]>;\n\n // MockAgent call-tracking surface (delegated to mockAgent at runtime).\n submitCalls: MockAgent['submitCalls'];\n stopCount: MockAgent['stopCount'];\n _internal: MockAgent['_internal'];\n\n // LangGraph-specific writable signals.\n langGraphMessages: WritableSignal<BaseMessage[]>;\n hasValue: WritableSignal<boolean>;\n value: WritableSignal<any>;\n langGraphInterrupts: WritableSignal<Interrupt<any>[]>;\n langGraphToolCalls: WritableSignal<ToolCallWithResult[]>;\n toolProgress: WritableSignal<ToolProgress[]>;\n queue: WritableSignal<AgentQueue>;\n branch: WritableSignal<string>;\n langGraphHistory: WritableSignal<ThreadState<any>[]>;\n experimentalBranchTree: WritableSignal<AgentBranchTree<any>>;\n isThreadLoading: WritableSignal<boolean>;\n activeSubagents: WritableSignal<SubagentStreamRef[]>;\n customEvents: WritableSignal<CustomStreamEvent[]>;\n}\n\n/**\n * Creates a mock LangGraphAgent with writable signals for testing.\n * Control state by writing to the returned writable signals directly.\n *\n * Neutral `Agent`-contract signals come from {@link mockAgent}; LangGraph-specific\n * signals are declared here and layered on top.\n *\n * @example\n * ```ts\n * const agent = mockLangGraphAgent({ isThreadLoading: true });\n * agent.messages.set([{ id: '1', role: 'assistant', content: 'Hi' }]);\n * ```\n */\nexport function mockLangGraphAgent(\n initial: MockAgentOptions & {\n langGraphMessages?: BaseMessage[];\n hasValue?: boolean;\n isThreadLoading?: boolean;\n } = {}\n): MockLangGraphAgent {\n const base = mockAgent({\n ...initial,\n withInterrupt: true,\n withSubagents: true,\n history: initial.history ?? [],\n });\n\n // ── LangGraph-specific writable signals (defaults copied verbatim) ────────\n const langGraphMessages$ = signal<BaseMessage[]>(initial.langGraphMessages ?? []);\n const hasValue$ = signal<boolean>(initial.hasValue ?? false);\n const value$ = signal<any>(null);\n const langGraphInterrupts$ = signal<Interrupt<any>[]>([]);\n const langGraphToolCalls$ = signal<ToolCallWithResult[]>([]);\n const toolProgress$ = signal<ToolProgress[]>([]);\n const queue$ = signal<AgentQueue>({\n entries: [],\n size: 0,\n cancel: async () => false,\n clear: async () => undefined,\n });\n const branch$ = signal<string>('');\n const langGraphHistory$ = signal<ThreadState<any>[]>([]);\n const experimentalBranchTree$ = signal<AgentBranchTree<any>>({ type: 'sequence', items: [] });\n const isThreadLoading$ = signal<boolean>(initial.isThreadLoading ?? false);\n const activeSubagents$ = signal<SubagentStreamRef[]>([]);\n const customEvents$ = signal<CustomStreamEvent[]>([]);\n\n // `state` derives from the raw LangGraph value (preserves current behavior).\n const state$ = computed<Record<string, unknown>>(() => {\n const v = value$();\n return v && typeof v === 'object' ? (v as Record<string, unknown>) : {};\n });\n\n const mock: MockLangGraphAgent = {\n ...base,\n\n // ── Neutral surface: override `state` to derive from the LangGraph value ─\n state: state$ as never,\n\n // ── Raw LangGraph signals ─────────────────────────────────────────────\n langGraphMessages: langGraphMessages$,\n langGraphInterrupts: langGraphInterrupts$,\n langGraphToolCalls: langGraphToolCalls$,\n langGraphHistory: langGraphHistory$,\n experimentalBranchTree: experimentalBranchTree$,\n\n // ── Other AgentRef fields preserved ──────────────────────────────────\n value: value$,\n hasValue: hasValue$,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n reload: () => {},\n toolProgress: toolProgress$,\n queue: queue$,\n activeSubagents: activeSubagents$,\n getSubagent: (toolCallId: string) =>\n activeSubagents$().find(subagent => subagent.toolCallId === toolCallId),\n getSubagentsByType: (type: string) =>\n activeSubagents$().filter(subagent => subagent.name === type),\n getSubagentsByMessage: (msg: CoreAIMessage) => {\n const toolCalls = (msg as unknown as Record<string, unknown>)['tool_calls'];\n if (!Array.isArray(toolCalls)) return [];\n const ids = toolCalls\n .map(toolCall => {\n if (toolCall == null || typeof toolCall !== 'object' || Array.isArray(toolCall)) return undefined;\n const id = (toolCall as Record<string, unknown>)['id'];\n return typeof id === 'string' ? id : undefined;\n })\n .filter((id): id is string => id != null);\n return activeSubagents$().filter(subagent => ids.includes(subagent.toolCallId));\n },\n customEvents: customEvents$,\n branch: branch$,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n setBranch: (_branch: string) => {},\n isThreadLoading: isThreadLoading$,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n switchThread: (_threadId: string | null) => {},\n joinStream: (_runId: string, _lastEventId?: string) => Promise.resolve(),\n getMessagesMetadata: (_msg: BaseMessage, _idx?: number): MessageMetadata<Record<string, unknown>> | undefined => undefined,\n getToolCalls: (_msg: CoreAIMessage): ToolCallWithResult[] => [],\n lifecycle: {\n streamStartedAt: signal<number | null>(null),\n streamErrorAt: signal<{ at: number; classification: string } | null>(null),\n interruptReceivedAt: signal<number | null>(null),\n interruptResolvedAt: signal<number | null>(null),\n threadCreatedAt: signal<number | null>(null),\n threadPersistedAt: signal<number | null>(null),\n toolCallStartedAt: signal<number | null>(null),\n toolCallCompletedAt: signal<number | null>(null),\n },\n } as MockLangGraphAgent;\n\n return mock;\n}\n","// SPDX-License-Identifier: MIT\nimport type {\n AgentQueueEntry,\n AgentTransport,\n LangGraphSubmitOptions,\n StreamEvent,\n} from '../agent.types';\nimport type { ThreadState } from '@langchain/langgraph-sdk';\nimport type { FakeAgentConfig } from '@threadplane/chat/testing';\n\nconst DEFAULT_TOKENS = ['Hello', ' from', ' the', ' fake', ' LangGraph', ' agent.'];\n\n/**\n * In-process AgentTransport that auto-streams a canned assistant reply.\n *\n * Backs `provideFakeAgent()`. Unlike `MockAgentTransport` (passive, driven\n * manually from specs), this transport emits its tokens automatically on\n * `stream()`, then completes — suitable for offline demos and integration tests.\n *\n * NOT for production use.\n */\nexport class FakeStreamTransport implements AgentTransport {\n private readonly tokens: string[];\n private readonly reasoningTokens: string[];\n private readonly delayMs: number;\n\n constructor(config: FakeAgentConfig = {}) {\n this.tokens = config.tokens ?? DEFAULT_TOKENS;\n this.reasoningTokens = config.reasoningTokens ?? [];\n // Default 60ms matches @threadplane/ag-ui's FakeAgent so both adapters'\n // provideFakeAgent() stream at the same cadence for the same config.\n this.delayMs = config.delayMs ?? 60;\n }\n\n async *stream(\n _assistantId: string,\n _threadId: string | null,\n _payload: unknown,\n signal: AbortSignal,\n _options?: LangGraphSubmitOptions,\n ): AsyncIterable<StreamEvent> {\n const id = 'fake-ai-1';\n\n let reasoning = '';\n for (const chunk of this.reasoningTokens) {\n if (signal.aborted) return;\n reasoning += chunk;\n yield {\n type: 'messages',\n messages: [\n { id, type: 'ai', content: '', additional_kwargs: { reasoning_content: reasoning } },\n ],\n } as unknown as StreamEvent;\n if (this.delayMs > 0) await delay(this.delayMs);\n }\n\n let content = '';\n for (const tok of this.tokens) {\n if (signal.aborted) return;\n content += tok;\n yield {\n type: 'messages',\n messages: [{ id, type: 'ai', content }],\n } as unknown as StreamEvent;\n if (this.delayMs > 0) await delay(this.delayMs);\n }\n }\n\n async createQueuedRun(\n _assistantId: string,\n threadId: string,\n payload: unknown,\n _signal: AbortSignal,\n options?: LangGraphSubmitOptions,\n ): Promise<AgentQueueEntry> {\n return {\n id: 'fake-queued-run',\n threadId,\n values: payload,\n options: { ...options, multitaskStrategy: 'enqueue' },\n createdAt: new Date(),\n };\n }\n\n async cancelRun(_threadId: string, _runId: string, _signal: AbortSignal): Promise<void> {\n // No-op: the fake has no real runs to cancel.\n return;\n }\n\n async getHistory(_threadId: string, _signal: AbortSignal): Promise<ThreadState[]> {\n return [];\n }\n\n async *joinStream(): AsyncIterable<StreamEvent> {\n // No queued-run replay in the fake; yields nothing.\n yield* [];\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// SPDX-License-Identifier: MIT\nimport { type Provider } from '@angular/core';\nimport type { FakeAgentConfig } from '@threadplane/chat/testing';\nimport { provideAgent } from '../agent.provider';\nimport { FakeStreamTransport } from './fake-stream.transport';\n\n/**\n * Wire an in-process fake LangGraph agent into Angular DI.\n *\n * Streams a canned assistant reply (see FakeAgentConfig) with no backend —\n * the symmetric counterpart to @threadplane/ag-ui's provideFakeAgent(). For\n * advanced manual scripting (tool calls, interrupts, multi-batch), provide\n * the agent yourself with\n * `provideAgent({ assistantId, transport: new MockAgentTransport(...) })`.\n *\n * @example\n * ```ts\n * TestBed.configureTestingModule({\n * providers: [provideFakeAgent({ tokens: ['Hi from the fake LangGraph agent'] })],\n * });\n * ```\n */\nexport function provideFakeAgent(config: FakeAgentConfig = {}): Provider[] {\n return provideAgent({\n assistantId: 'fake',\n transport: new FakeStreamTransport(config),\n });\n}\n","// SPDX-License-Identifier: MIT\nimport { Injectable, InjectionToken, inject, signal, type Signal, type WritableSignal } from '@angular/core';\nimport type { Client, Thread as SdkThread } from '@langchain/langgraph-sdk';\nimport type { Thread } from '@threadplane/chat';\nimport { createLangGraphClient } from '../client/create-langgraph-client';\nimport { LANGGRAPH_CLIENT_OPTIONS } from '../client/client-options';\n\n/**\n * Configuration consumed by {@link LangGraphThreadsAdapter}. Provide\n * via {@link LANGGRAPH_THREADS_CONFIG} (typically in app.config.ts):\n *\n * ```ts\n * providers: [\n * { provide: LANGGRAPH_THREADS_CONFIG, useValue: {\n * apiUrl: environment.langGraphApiUrl,\n * }},\n * ],\n * ```\n *\n * The adapter expects backends to write the thread title to\n * `metadata.title`. Spec 2026-05-19-llm-generated-labels-design.md\n * originally proposed `metadata.thread_title` for cockpit caps but\n * we converged on `title` to match the canonical demo and avoid a\n * per-cap configuration knob.\n */\nexport interface LangGraphThreadsConfig {\n /** Base URL for the LangGraph Platform API. Accepts both absolute\n * URLs and relative `/api`-style paths. */\n apiUrl: string;\n /** Fallback label for threads whose title hasn't been written yet\n * (e.g. created but never sent). Defaults to `'Untitled'`. */\n titleFallback?: string;\n}\n\nexport const LANGGRAPH_THREADS_CONFIG = new InjectionToken<LangGraphThreadsConfig>(\n 'LANGGRAPH_THREADS_CONFIG',\n);\n\n/** Optional adapter clients can pass an explicit Client (e.g. for\n * testing). When omitted, the adapter constructs one via\n * {@link createLangGraphClient}. */\nexport const LANGGRAPH_CLIENT = new InjectionToken<Client>('LANGGRAPH_CLIENT');\n\n/**\n * SDK-backed thread store. Wraps `client.threads.*` and maps SDK\n * threads to the framework's {@link Thread} type for direct use with\n * `<chat-thread-list>` / `<chat-sidenav>`.\n *\n * Consumers wire the framework's `ThreadActionAdapter` to instance\n * methods (rename/delete/archive/pin/...) so the right-click menu\n * round-trips through the LangGraph SDK without per-app boilerplate.\n *\n * @example\n * ```ts\n * const svc = inject(LangGraphThreadsAdapter);\n * const actions: ThreadActionAdapter = {\n * rename: (id, t) => svc.rename(id, t),\n * delete: (id) => svc.delete(id),\n * };\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class LangGraphThreadsAdapter {\n private readonly config = inject(LANGGRAPH_THREADS_CONFIG);\n private readonly sharedClientOptions = inject(LANGGRAPH_CLIENT_OPTIONS, { optional: true }) ?? undefined;\n private readonly client: Client = inject(LANGGRAPH_CLIENT, { optional: true })\n ?? createLangGraphClient(this.config.apiUrl, this.sharedClientOptions);\n\n private readonly fallback: string = this.config.titleFallback ?? 'Untitled';\n\n private readonly _threads: WritableSignal<Thread[]> = signal<Thread[]>([]);\n private readonly _archived: WritableSignal<Thread[]> = signal<Thread[]>([]);\n\n /** Active (non-archived) threads, sorted with pinned first. */\n readonly threads: Signal<Thread[]> = this._threads.asReadonly();\n /** Threads whose `metadata.archived === true`. */\n readonly archivedThreads: Signal<Thread[]> = this._archived.asReadonly();\n\n /** Fetch the latest thread list from the server. Failures are\n * logged via `console.error` (not swallowed silently — silent\n * catches have masked prod issues in the past).\n *\n * Invocation and resolution are logged at `console.debug` so prod\n * inspection can distinguish \"never called\" from \"called but\n * resolved empty\" from \"called and threw.\" This was prompted by a\n * demo.threadplane.ai cold-load bug where the sidenav stayed empty\n * with no visible signal. Tighten the log volume if it becomes\n * noisy. */\n async refresh(): Promise<void> {\n console.debug('[LangGraphThreadsAdapter.refresh] invoked');\n try {\n const list = await this.client.threads.search({ limit: 50 });\n console.debug('[LangGraphThreadsAdapter.refresh] resolved', list.length);\n const mapped = list.map((t) => this.toThread(t));\n this._threads.set(\n mapped\n .filter((t) => t.status !== 'archived')\n .sort((a, b) => {\n const aP = a.pinned === true;\n const bP = b.pinned === true;\n if (aP !== bP) return Number(bP) - Number(aP);\n if (aP && bP) {\n const aO = typeof a['pinnedOrder'] === 'number' ? (a['pinnedOrder'] as number) : Infinity;\n const bO = typeof b['pinnedOrder'] === 'number' ? (b['pinnedOrder'] as number) : Infinity;\n return aO - bO;\n }\n return 0;\n }),\n );\n this._archived.set(mapped.filter((t) => t.status === 'archived'));\n } catch (e) {\n console.error('[LangGraphThreadsAdapter.refresh] failed:', e);\n }\n }\n\n /** Fetch a single thread by id. Returns `null` when the server\n * returns 404 (thread doesn't exist) so callers can distinguish\n * \"missing\" from \"couldn't reach the server\" — genuine network\n * errors rethrow. Used by URL-based thread routing to validate a\n * pasted/shared thread id before activating it. */\n async getThread(threadId: string): Promise<Thread | null> {\n try {\n const t = await this.client.threads.get(threadId);\n return this.toThread(t);\n } catch (e) {\n // SDK throws HTTPError-like objects without a typed error class;\n // sniff status on the error or its nested response. Treat both\n // 404 (server says \"no such thread\") and 422 (server says \"id\n // isn't even a valid UUID\") as \"missing\" — both warrant the\n // same caller behavior (redirect to a fresh chat).\n const status =\n (e as { status?: number }).status ??\n (e as { response?: { status?: number } }).response?.status;\n if (status === 404 || status === 422) return null;\n throw e;\n }\n }\n\n async create(metadata: Record<string, unknown> = {}): Promise<string | null> {\n try {\n const t = await this.client.threads.create({ metadata });\n await this.refresh();\n return t.thread_id;\n } catch (e) {\n console.error('[LangGraphThreadsAdapter.create] failed:', e);\n return null;\n }\n }\n\n async delete(threadId: string): Promise<void> {\n await this.client.threads.delete(threadId);\n await this.refresh();\n }\n\n async rename(threadId: string, newTitle: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { title: newTitle } });\n await this.refresh();\n }\n\n async archive(threadId: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { archived: true } });\n await this.refresh();\n }\n\n async unarchive(threadId: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { archived: false } });\n await this.refresh();\n }\n\n async pin(threadId: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { pinned: true } });\n await this.refresh();\n }\n\n async unpin(threadId: string): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { pinned: false } });\n await this.refresh();\n }\n\n async moveToProject(threadId: string, projectId: string | null): Promise<void> {\n await this.client.threads.update(threadId, { metadata: { projectId } });\n await this.refresh();\n }\n\n /** Re-stamp `metadata.pinnedOrder = 0,1,2,...` for the pinned slice\n * to reflect the new ordering. */\n async reorderPinned(threadId: string, beforeId: string | null): Promise<void> {\n const current = this._threads().filter((t) => t.pinned === true);\n const moved = current.find((t) => t.id === threadId);\n if (!moved) return;\n const rest = current.filter((t) => t.id !== threadId);\n const next: Thread[] = [];\n for (const t of rest) {\n if (t.id === beforeId) next.push(moved);\n next.push(t);\n }\n if (beforeId === null) next.push(moved);\n\n await Promise.all(\n next.map((t, idx) =>\n this.client.threads.update(t.id, { metadata: { pinnedOrder: idx } }),\n ),\n );\n await this.refresh();\n }\n\n private toThread(t: SdkThread): Thread {\n const meta = (t.metadata ?? {}) as Record<string, unknown>;\n const rawTitle = meta['title'];\n const archived = meta['archived'] === true;\n const pinned = meta['pinned'] === true;\n const projectId = typeof meta['projectId'] === 'string' && (meta['projectId'] as string).length > 0\n ? (meta['projectId'] as string)\n : null;\n const pinnedOrder = typeof meta['pinnedOrder'] === 'number' ? (meta['pinnedOrder'] as number) : undefined;\n return {\n id: t.thread_id,\n title: typeof rawTitle === 'string' && rawTitle.length > 0 ? rawTitle : this.fallback,\n status: archived ? 'archived' : 'active',\n pinned,\n projectId,\n pinnedOrder,\n updatedAt: t.updated_at ? Date.parse(t.updated_at) : undefined,\n };\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { effect, type Signal } from '@angular/core';\nimport type { LangGraphAgent } from '../agent.types';\n\n/**\n * Call `fn` whenever the agent's status transitions out of `'running'`\n * (i.e. when a run completes — success, error, or interrupt). Useful\n * for refreshing thread lists, telemetry, or any other state that\n * lags the agent.\n *\n * Must be called within an injection context (constructor or\n * `runInInjectionContext`) — uses Angular's `effect` under the hood.\n *\n * @example\n * ```ts\n * constructor() {\n * refreshOnRunEnd(this.agent, () => this.threads.refresh());\n * }\n * ```\n */\nexport function refreshOnRunEnd(agent: LangGraphAgent, fn: () => void | Promise<void>): void {\n let lastStatus = agent.status();\n effect(() => {\n const status = agent.status();\n if (lastStatus === 'running' && status !== 'running') {\n void fn();\n }\n lastStatus = status;\n });\n}\n\n/**\n * Call `fn` whenever any of the watched signals transitions from a\n * truthy \"active\" value to a non-active value. Generic version of\n * {@link refreshOnRunEnd} for callers tracking custom state machines.\n *\n * Must be called within an injection context.\n */\nexport function refreshOnTransition<T>(\n watch: Signal<T>,\n isActive: (v: T) => boolean,\n fn: () => void | Promise<void>,\n): void {\n let lastActive = isActive(watch());\n effect(() => {\n const active = isActive(watch());\n if (lastActive && !active) void fn();\n lastActive = active;\n });\n}\n","// SPDX-License-Identifier: MIT\n// Provider\nexport { provideAgent } from './lib/agent.provider';\nexport type { AgentConfig } from './lib/agent.provider';\n\n// Symmetric inject helper — matches @threadplane/ag-ui's injectAgent()\nexport { injectAgent } from './lib/inject-agent';\n\n// Lifecycle monitoring\nexport { AGENT_LIFECYCLE } from './lib/lifecycle';\nexport type { AgentLifecycle } from './lib/lifecycle';\nexport { AgentLifecycleRegistry } from './lib/agent-lifecycle-registry';\n\n// Public types\nexport type {\n AgentOptions,\n LangGraphClientOptions,\n AgentBranchTree,\n AgentBranchTreeFork,\n AgentBranchTreeNode,\n AgentQueue,\n AgentQueueEntry,\n LangGraphAgent,\n LangGraphMultitaskStrategy,\n LangGraphSubmitOptions,\n AgentTransport,\n CustomStreamEvent,\n StreamEvent,\n SubagentStreamRef,\n} from './lib/agent.types';\n\n// Re-export from SDK (consumers import from angular, not langgraph-sdk)\nexport type { BagTemplate, InferBag, Interrupt, ThreadState, SubmitOptions }\n from './lib/agent.types';\n\n// Re-export ResourceStatus shim for convenience\nexport { ResourceStatus } from './lib/agent.types';\n\n// Test utilities (always exported — tree-shaken in prod builds)\nexport { MockAgentTransport } from './lib/transport/mock-stream.transport';\nexport { FetchStreamTransport } from './lib/transport/fetch-stream.transport';\n\n// Mock test utility for LangGraph agent\nexport { mockLangGraphAgent } from './lib/testing/mock-langgraph-agent';\nexport type { MockLangGraphAgent } from './lib/testing/mock-langgraph-agent';\nexport { provideFakeAgent } from './lib/testing/provide-fake-agent';\n// Low-level auto-emitting fake transport backing provideFakeAgent — exported\n// for advanced manual wiring (parity with @threadplane/ag-ui's FakeAgent).\nexport { FakeStreamTransport } from './lib/testing/fake-stream.transport';\n\n// Citation normalizer — useful for advanced consumers building custom adapters\n// or bridging non-LangGraph message shapes into tplane Citation[].\nexport { extractCitations } from './lib/internals/extract-citations';\n\n// SDK Client helper — handles the SDK's absolute-URL requirement so\n// `/api`-style relative paths work in browser contexts.\nexport { createLangGraphClient, toAbsoluteApiUrl } from './lib/client/create-langgraph-client';\nexport { LANGGRAPH_CLIENT_OPTIONS } from './lib/client/client-options';\n\n// SDK-backed thread store — drop-in replacement for the\n// hand-rolled ThreadsService that consumers used to duplicate.\nexport {\n LangGraphThreadsAdapter,\n LANGGRAPH_THREADS_CONFIG,\n LANGGRAPH_CLIENT,\n} from './lib/threads/threads-adapter';\nexport type { LangGraphThreadsConfig } from './lib/threads/threads-adapter';\n\n// Lifecycle helper for hooking refreshes onto agent state transitions.\nexport { refreshOnRunEnd, refreshOnTransition } from './lib/threads/refresh-on';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["getBaseEventType","isRecord","isMessagesEvent","isAiMessageWithToolCalls","isToolMessage","mergeMessages","extractText","takeUntil"],"mappings":"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"}
|