@threadplane/ag-ui 0.0.56 → 0.0.57

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-ag-ui.mjs","sources":["../../../../libs/ag-ui/src/lib/internal/apply-patch.ts","../../../../libs/ag-ui/src/lib/bridge-citations-state.ts","../../../../libs/ag-ui/src/lib/reducer.ts","../../../../libs/ag-ui/src/lib/client-tools.ts","../../../../libs/ag-ui/src/lib/to-agent.ts","../../../../libs/ag-ui/src/lib/provide-agent.ts","../../../../libs/ag-ui/src/lib/testing/fake-agent.ts","../../../../libs/ag-ui/src/lib/testing/provide-fake-agent.ts","../../../../libs/ag-ui/src/public-api.ts","../../../../libs/ag-ui/src/threadplane-ag-ui.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n// Minimal RFC-6902 JSON Patch implementation, scoped to the ops the ag-ui\n// reducer actually receives via STATE_DELTA events: add, replace, remove,\n// move, copy, test. Pure ESM, zero deps. Replaces a CommonJS-only third-party\n// dependency that broke ESM-strict consumers (Vitest, Vite test envs).\n\nexport interface JsonPatchOp {\n readonly op: 'add' | 'replace' | 'remove' | 'move' | 'copy' | 'test';\n readonly path: string;\n readonly value?: unknown;\n readonly from?: string;\n}\n\n/**\n * Apply a sequence of JSON Patch (RFC-6902) operations to `target`. Returns a\n * new document. The input is not mutated.\n *\n * Operations apply in order; if any operation fails (invalid path, failed\n * test, etc.) the whole patch throws — matching `fast-json-patch`'s\n * `validate: false` behavior used by the reducer.\n */\nexport function applyPatch<T>(target: T, ops: readonly JsonPatchOp[]): T {\n let current: unknown = target;\n for (const op of ops) {\n current = applyOne(current, op);\n }\n return current as T;\n}\n\nfunction applyOne(doc: unknown, op: JsonPatchOp): unknown {\n switch (op.op) {\n case 'add': return setAt(doc, parsePointer(op.path), op.value, /*replaceArrayDash*/ true);\n case 'replace': return setAt(doc, parsePointer(op.path), op.value, /*replaceArrayDash*/ false);\n case 'remove': return removeAt(doc, parsePointer(op.path));\n case 'move': {\n if (op.from == null) throw new Error(\"'move' op requires 'from'\");\n const fromTokens = parsePointer(op.from);\n const value = getAt(doc, fromTokens);\n const removed = removeAt(doc, fromTokens);\n return setAt(removed, parsePointer(op.path), value, true);\n }\n case 'copy': {\n if (op.from == null) throw new Error(\"'copy' op requires 'from'\");\n const value = getAt(doc, parsePointer(op.from));\n return setAt(doc, parsePointer(op.path), structuredCloneSafe(value), true);\n }\n case 'test': {\n const actual = getAt(doc, parsePointer(op.path));\n if (!deepEqual(actual, op.value)) {\n throw new Error(`'test' op failed at path ${op.path}`);\n }\n return doc;\n }\n default: {\n const o: { op: string } = op as never;\n throw new Error(`Unsupported JSON Patch op: ${o.op}`);\n }\n }\n}\n\n/**\n * Parse an RFC-6901 JSON Pointer string into its tokens.\n * \"\" → []\n * \"/foo/0\" → [\"foo\", \"0\"]\n * \"/a~1b\" → [\"a/b\"] (~1 → /)\n * \"/a~0b\" → [\"a~b\"] (~0 → ~)\n */\nexport function parsePointer(pointer: string): string[] {\n if (pointer === '') return [];\n if (!pointer.startsWith('/')) {\n throw new Error(`Invalid JSON Pointer: ${pointer}`);\n }\n return pointer\n .slice(1)\n .split('/')\n .map(token => token.replace(/~1/g, '/').replace(/~0/g, '~'));\n}\n\nfunction getAt(doc: unknown, tokens: readonly string[]): unknown {\n let cur: unknown = doc;\n for (const token of tokens) {\n cur = stepInto(cur, token);\n }\n return cur;\n}\n\nfunction stepInto(node: unknown, token: string): unknown {\n if (Array.isArray(node)) {\n const i = parseArrayIndex(token, node.length);\n return node[i];\n }\n if (node !== null && typeof node === 'object') {\n return (node as Record<string, unknown>)[token];\n }\n throw new Error(`Cannot traverse non-container at token \"${token}\"`);\n}\n\nfunction setAt(\n doc: unknown,\n tokens: readonly string[],\n value: unknown,\n allowArrayAppend: boolean,\n): unknown {\n if (tokens.length === 0) {\n // Replace root.\n return structuredCloneSafe(value);\n }\n const [head, ...rest] = tokens;\n if (Array.isArray(doc)) {\n const arr = doc.slice();\n const i = head === '-' && allowArrayAppend ? arr.length : parseArrayIndex(head!, arr.length + (allowArrayAppend ? 1 : 0));\n if (rest.length === 0) {\n if (allowArrayAppend) {\n // RFC-6902 add: insert at index, shifting elements right\n arr.splice(i, 0, structuredCloneSafe(value));\n } else {\n // replace: overwrite at index\n if (i >= arr.length) throw new Error(`Cannot replace beyond array length at \"/${tokens.join('/')}\"`);\n arr[i] = structuredCloneSafe(value);\n }\n } else {\n if (i >= arr.length) throw new Error(`Cannot descend into non-existent array index ${i}`);\n arr[i] = setAt(arr[i], rest, value, allowArrayAppend);\n }\n return arr;\n }\n if (doc === null || typeof doc !== 'object') {\n throw new Error(`Cannot descend into non-container at \"/${tokens.join('/')}\"`);\n }\n const obj = { ...(doc as Record<string, unknown>) };\n if (rest.length === 0) {\n obj[head!] = structuredCloneSafe(value);\n } else {\n if (!(head! in obj)) {\n throw new Error(`Cannot descend into missing path \"/${tokens.join('/')}\"`);\n }\n obj[head!] = setAt(obj[head!], rest, value, allowArrayAppend);\n }\n return obj;\n}\n\nfunction removeAt(doc: unknown, tokens: readonly string[]): unknown {\n if (tokens.length === 0) {\n throw new Error('Cannot remove root');\n }\n const [head, ...rest] = tokens;\n if (Array.isArray(doc)) {\n const arr = doc.slice();\n const i = parseArrayIndex(head!, arr.length);\n if (i >= arr.length) throw new Error(`Cannot remove non-existent array index ${i}`);\n if (rest.length === 0) {\n arr.splice(i, 1);\n } else {\n arr[i] = removeAt(arr[i], rest);\n }\n return arr;\n }\n if (doc === null || typeof doc !== 'object') {\n throw new Error(`Cannot remove from non-container at token \"${head}\"`);\n }\n const obj = { ...(doc as Record<string, unknown>) };\n if (rest.length === 0) {\n if (!(head! in obj)) throw new Error(`Cannot remove non-existent key \"${head}\"`);\n delete obj[head!];\n } else {\n if (!(head! in obj)) throw new Error(`Cannot descend into missing path \"${head}\"`);\n obj[head!] = removeAt(obj[head!], rest);\n }\n return obj;\n}\n\nfunction parseArrayIndex(token: string, lengthBound: number): number {\n if (token === '-') {\n // \"-\" is the \"after-last\" sentinel; only valid for `add` (handled by caller)\n throw new Error(`Array end marker \"-\" not valid in this position`);\n }\n if (!/^(0|[1-9]\\d*)$/.test(token)) {\n throw new Error(`Invalid array index: \"${token}\"`);\n }\n const i = Number.parseInt(token, 10);\n if (i > lengthBound) {\n throw new Error(`Array index ${i} exceeds bound ${lengthBound}`);\n }\n return i;\n}\n\nfunction structuredCloneSafe<T>(v: T): T {\n // Cheap deep clone for JSON-like values (no functions, no cycles) — matches\n // the deep-clone the reducer was already doing pre-applyPatch with the prior\n // dependency.\n if (v === null || typeof v !== 'object') return v;\n return JSON.parse(JSON.stringify(v)) as T;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n const ao = a as Record<string, unknown>;\n const bo = b as Record<string, unknown>;\n const aKeys = Object.keys(ao);\n const bKeys = Object.keys(bo);\n if (aKeys.length !== bKeys.length) return false;\n for (const k of aKeys) {\n if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;\n if (!deepEqual(ao[k], bo[k])) return false;\n }\n return true;\n}\n","// libs/ag-ui/src/lib/bridge-citations-state.ts\n// SPDX-License-Identifier: MIT\nimport type { Citation, Message } from '@threadplane/chat';\n\ninterface ThreadStateLike {\n state?: Record<string, unknown>;\n}\n\n/**\n * Attach per-message {@link Citation}s carried in an AG-UI thread's `state`\n * (`state.citations`, keyed by message id) onto the corresponding assistant\n * {@link Message}s — for advanced consumers wiring citations from STATE events\n * into the neutral chat contract.\n *\n * @param thread The thread-state container holding `state.citations`.\n * @param messages The messages to enrich.\n * @returns A new array where matching messages gain their `citations`; messages\n * without citations are returned unchanged.\n * @example\n * ```ts\n * const enriched = bridgeCitationsState(threadState, agent.messages());\n * ```\n */\nexport function bridgeCitationsState(thread: ThreadStateLike, messages: Message[]): Message[] {\n const citationsByMsg = (thread.state as { citations?: unknown })?.citations;\n if (!citationsByMsg || typeof citationsByMsg !== 'object') return messages;\n const map = citationsByMsg as Record<string, unknown>;\n return messages.map(msg => {\n const raw = map[msg.id];\n if (!Array.isArray(raw) || raw.length === 0) return msg;\n return { ...msg, citations: raw.map((entry, i) => normalizeCitation(entry, i + 1)) };\n });\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 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 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\n// @ag-ui/client@0.0.52 — EventType is a string enum with uppercase values.\n// Discriminator strings (e.g. 'RUN_STARTED') match EventType enum members\n// verbatim; the switch cases below use the string literals directly so this\n// file has no runtime dependency on the EventType enum import.\nimport { signal, type WritableSignal } from '@angular/core';\nimport type { Subject } from 'rxjs';\nimport { toAgentError, type AgentError } from '@threadplane/chat';\nimport type {\n Message, AgentStatus, ToolCall, AgentEvent, AgentInterrupt,\n} from '@threadplane/chat';\nimport type { BaseEvent } from '@ag-ui/client';\nimport { applyPatch, type JsonPatchOp } from './internal/apply-patch';\nimport { bridgeCitationsState } from './bridge-citations-state';\n\n/**\n * AG-UI AssistantMessage shape as it arrives on the wire in a MESSAGES_SNAPSHOT.\n * The `toolCalls` field carries full ToolCall objects (id + function { name, arguments }).\n * This is distinct from the chat lib's `Message.toolCallIds` which is a plain string[].\n */\ninterface AgUiSnapshotToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\ninterface AgUiSnapshotMessage {\n id: string;\n role: string;\n content?: string;\n toolCalls?: AgUiSnapshotToolCall[];\n [key: string]: unknown;\n}\n\n/**\n * A custom event surfaced to consumers via the agent's `customEvents` signal.\n * Mirrors the LangGraph adapter's CustomStreamEvent shape so the chat\n * a2ui partial-args bridge consumes both transports identically.\n */\nexport interface CustomStreamEvent {\n /** Event name set by the backend (e.g. 'a2ui-partial', 'state_update'). */\n name: string;\n /** Arbitrary payload from the backend (JSON-string values are parsed). */\n data: unknown;\n}\n\n/** A native AG-UI ACTIVITY (typed, identified, incrementally-streamed sub-process).\n * Generic — keyed by messageId, grouped by activityType. toAgent projects\n * activityType==='subagent' to the neutral Subagent contract. */\nexport interface ActivityEntry {\n messageId: string;\n activityType: string;\n content: WritableSignal<Record<string, unknown>>;\n}\n\nexport interface ReducerStore {\n messages: WritableSignal<Message[]>;\n status: WritableSignal<AgentStatus>;\n isLoading: WritableSignal<boolean>;\n error: WritableSignal<AgentError | undefined>;\n toolCalls: WritableSignal<ToolCall[]>;\n state: WritableSignal<Record<string, unknown>>;\n interrupt: WritableSignal<AgentInterrupt | undefined>;\n events$: Subject<AgentEvent>;\n customEvents: WritableSignal<CustomStreamEvent[]>;\n activities: WritableSignal<Map<string, ActivityEntry>>;\n /** Accumulated raw TOOL_CALL_ARGS text per toolCallId. A live model streams\n * args as many partial-JSON fragments, so each delta must be appended here\n * and the ACCUMULATED buffer parsed — parsing a lone delta only succeeds\n * when the whole payload happens to arrive in one chunk (e.g. test\n * fixtures). Lazily created by the reducer; entries dropped on\n * TOOL_CALL_END. */\n argsBuffers?: Map<string, string>;\n}\n\n/**\n * Per-message reasoning timing. Populated by REASONING_MESSAGE_START /\n * REASONING_MESSAGE_END handlers. The map lives on the module — same\n * scope as the reducer function. ReducerStore stays free of timing\n * state; consumers read it via `Message.reasoningDurationMs` on\n * messages that completed reasoning.\n *\n * Keyed by messageId. We do not need cross-thread isolation here:\n * AG-UI's source agent recreates the reducer pipeline per session, and\n * messageIds are unique within a session.\n */\nconst reasoningTimingMap = new Map<string, { startedAt: number; endedAt?: number }>();\n\nfunction resolveReasoningDurationMs(messageId: string): number | undefined {\n const entry = reasoningTimingMap.get(messageId);\n if (!entry || entry.endedAt === undefined) return undefined;\n return entry.endedAt - entry.startedAt;\n}\n\n/**\n * Pure function: applies a single AG-UI BaseEvent to the store. Caller\n * subscribes to source.agent() and forwards each event here. Designed\n * for testability — no side effects beyond the supplied store.\n */\nexport function reduceEvent(event: BaseEvent, store: ReducerStore): void {\n switch (event.type) {\n case 'RUN_STARTED': {\n store.status.set('running');\n store.isLoading.set(true);\n store.error.set(undefined);\n store.interrupt.set(undefined);\n store.customEvents.set([]);\n store.activities.set(new Map());\n return;\n }\n case 'RUN_FINISHED': {\n store.status.set('idle');\n store.isLoading.set(false);\n return;\n }\n case 'RUN_ERROR': {\n store.status.set('error');\n store.isLoading.set(false);\n const runErrorMsg = (event as { message?: unknown }).message;\n store.error.set(toAgentError(\n typeof runErrorMsg === 'string' ? new Error(runErrorMsg) : (runErrorMsg ?? event),\n ));\n return;\n }\n case 'TEXT_MESSAGE_START': {\n const id = messageIdFrom(event);\n store.messages.update((prev) =>\n prev.some((m) => m.id === id)\n ? prev.map((m) => m.id === id ? { ...m, content: m.content ?? '' } : m)\n : [...prev, { id, role: 'assistant', content: '' }],\n );\n return;\n }\n case 'REASONING_MESSAGE_START': {\n const id = messageIdFrom(event);\n reasoningTimingMap.set(id, { startedAt: Date.now() });\n // Initialize an assistant slot with empty reasoning if it doesn't already exist.\n store.messages.update((prev) =>\n prev.some((m) => m.id === id)\n ? prev.map((m) => m.id === id\n ? { ...m, reasoning: m.reasoning ?? '' }\n : m)\n : [...prev, { id, role: 'assistant', content: '', reasoning: '' }],\n );\n return;\n }\n case 'REASONING_MESSAGE_CONTENT':\n case 'REASONING_MESSAGE_CHUNK': {\n const id = messageIdFrom(event);\n const delta = (event as { delta?: string }).delta ?? '';\n store.messages.update((prev) =>\n prev.map((m) => m.id === id\n ? { ...m, reasoning: (m.reasoning ?? '') + delta }\n : m),\n );\n return;\n }\n case 'REASONING_MESSAGE_END': {\n const id = messageIdFrom(event);\n const entry = reasoningTimingMap.get(id);\n if (entry) {\n entry.endedAt = Date.now();\n reasoningTimingMap.set(id, entry);\n const duration = resolveReasoningDurationMs(id);\n if (duration !== undefined) {\n store.messages.update((prev) =>\n prev.map((m) => m.id === id ? { ...m, reasoningDurationMs: duration } : m),\n );\n }\n }\n return;\n }\n case 'TEXT_MESSAGE_CONTENT': {\n const id = messageIdFrom(event);\n const delta = (event as { delta?: string }).delta ?? '';\n store.messages.update((prev) =>\n prev.map((m) => m.id === id ? { ...m, content: m.content + delta } : m),\n );\n return;\n }\n case 'TEXT_MESSAGE_END': {\n // No-op — message is finalized by virtue of TEXT_MESSAGE_CONTENT\n // having been applied. Reserved for future hooks.\n return;\n }\n case 'TOOL_CALL_START': {\n const e = event as unknown as { toolCallId: string; toolCallName: string; parentMessageId?: string };\n store.toolCalls.update((prev) => [\n ...prev,\n { id: e.toolCallId, name: e.toolCallName, args: {}, status: 'running' },\n ]);\n // Link the tool call to its parent assistant message so the chat lib's\n // per-message tool-call resolution (chat-tool-calls / chat-tool-views)\n // can scope it. ag-ui-langgraph emits parentMessageId for every tool\n // call. If the parent assistant message hasn't been created yet (a\n // tool-call-only turn emits no TEXT_MESSAGE_START), create a slot.\n const parentId = e.parentMessageId;\n if (parentId) {\n store.messages.update((prev) => {\n const existing = prev.find((m) => m.id === parentId);\n if (existing) {\n return prev.map((m) =>\n m.id === parentId\n ? { ...m, toolCallIds: [...(m.toolCallIds ?? []), e.toolCallId] }\n : m,\n );\n }\n return [...prev, { id: parentId, role: 'assistant', content: '', toolCallIds: [e.toolCallId] }];\n });\n }\n return;\n }\n case 'TOOL_CALL_ARGS': {\n const e = event as unknown as { toolCallId: string; delta: string };\n // Deltas are FRAGMENTS of a JSON document, not standalone JSON: a live\n // model streams args token-by-token (`{\"loca`, `tion\":\"Pa`, …), so we\n // accumulate the raw text and parse the accumulated buffer. Until the\n // buffer parses, keep the last-good args (initially {}).\n const buffers = (store.argsBuffers ??= new Map<string, string>());\n const buffer = (buffers.get(e.toolCallId) ?? '') + e.delta;\n buffers.set(e.toolCallId, buffer);\n const args = tryParseArgs(buffer);\n if (args !== undefined) {\n store.toolCalls.update((prev) =>\n prev.map((t) => t.id === e.toolCallId ? { ...t, args } : t),\n );\n }\n return;\n }\n case 'TOOL_CALL_END': {\n const e = event as unknown as { toolCallId: string };\n // Belt and braces: apply the final accumulated args (in case the last\n // ARGS delta arrived but an intermediate state was left unparsed), then\n // drop the buffer.\n const finalBuffer = store.argsBuffers?.get(e.toolCallId);\n store.argsBuffers?.delete(e.toolCallId);\n const finalArgs = finalBuffer !== undefined ? tryParseArgs(finalBuffer) : undefined;\n store.toolCalls.update((prev) =>\n prev.map((t) =>\n t.id === e.toolCallId\n ? { ...t, status: 'complete', ...(finalArgs !== undefined ? { args: finalArgs } : {}) }\n : t,\n ),\n );\n return;\n }\n case 'TOOL_CALL_RESULT': {\n const e = event as unknown as { toolCallId: string; content: unknown };\n // ag_ui_langgraph serialises tool results via normalize_tool_content()\n // which always returns a string. Parse it so downstream consumers\n // (chat-tool-views / toToolViewSpec) can spread the object into props.\n const result = typeof e.content === 'string' ? safeParseJson(e.content) : e.content;\n store.toolCalls.update((prev) =>\n prev.map((t) => t.id === e.toolCallId ? { ...t, result } : t),\n );\n return;\n }\n case 'STATE_SNAPSHOT': {\n const e = event as unknown as { snapshot: Record<string, unknown> };\n const snapshot = e.snapshot ?? {};\n store.state.set(snapshot);\n store.messages.update(msgs => bridgeCitationsState({ state: snapshot }, msgs));\n return;\n }\n case 'STATE_DELTA': {\n const e = event as unknown as { delta: JsonPatchOp[] };\n const next = applyPatch(deepClone(store.state()), e.delta);\n store.state.set(next);\n store.messages.update(msgs => bridgeCitationsState({ state: next }, msgs));\n return;\n }\n case 'MESSAGES_SNAPSHOT': {\n const e = event as unknown as { messages: AgUiSnapshotMessage[] };\n const raw = e.messages ?? [];\n // AG-UI AssistantMessage carries `toolCalls` (ToolCall objects) on the\n // snapshot wire. Bridge them to `toolCallIds` so that the chat lib's\n // per-message tool-call resolution (resolveMessageToolCalls) can scope\n // correctly. Also merge any snapshot-only tool calls into store.toolCalls\n // so the data is visible to <chat-tool-views>.\n const snapshotToolCalls: ToolCall[] = [];\n const messages: Message[] = raw.map((m) => {\n if (m.role !== 'assistant' || !m.toolCalls || m.toolCalls.length === 0) {\n return m as unknown as Message;\n }\n const ids: string[] = [];\n for (const tc of m.toolCalls) {\n ids.push(tc.id);\n snapshotToolCalls.push({\n id: tc.id,\n name: tc.function.name,\n args: safeParseArgs(tc.function.arguments),\n status: 'complete',\n });\n }\n const { toolCalls: _dropped, ...rest } = m;\n return { ...rest, toolCallIds: ids } as unknown as Message;\n });\n // Re-apply per-message citations from the already-received STATE. A\n // MESSAGES_SNAPSHOT replaces the streamed messages wholesale — and the\n // final snapshot message id (str(AIMessage.id), e.g. \"resp-…\") differs\n // from the streaming chunk id the earlier STATE_SNAPSHOT bridged against,\n // so without re-bridging here the citations (keyed by the final id) would\n // be dropped on the message swap.\n store.messages.set(bridgeCitationsState({ state: store.state() }, messages));\n if (snapshotToolCalls.length > 0) {\n store.toolCalls.update((prev) => {\n // Merge: keep existing entries (they may carry richer state from\n // streaming) and only insert entries not already present by id.\n const existingIds = new Set(prev.map((tc) => tc.id));\n const toAdd = snapshotToolCalls.filter((tc) => !existingIds.has(tc.id));\n return toAdd.length > 0 ? [...prev, ...toAdd] : prev;\n });\n }\n return;\n }\n case 'CUSTOM': {\n const e = event as unknown as { name: string; value: unknown };\n // ag_ui_langgraph serializes interrupt payloads as JSON strings.\n // Parse the value if it arrives as a string so downstream consumers\n // (e.g. ChatApprovalCardComponent) receive a plain object, not a string.\n const parsedValue = typeof e.value === 'string' ? safeParseJson(e.value) : e.value;\n if (e.name === 'on_interrupt') {\n store.interrupt.set({ id: randomId(), value: parsedValue, resumable: true });\n return;\n }\n // Surface every other custom event on the customEvents signal so the\n // chat a2ui partial-args bridge (which reads agent.customEvents()) lights\n // up live/progressive a2ui rendering — parity with the LangGraph adapter.\n store.customEvents.update((prev) => [...prev, { name: e.name, data: parsedValue }]);\n if (e.name === 'state_update' && isRecord(parsedValue)) {\n store.events$.next({ type: 'state_update', data: parsedValue });\n } else {\n store.events$.next({ type: 'custom', name: e.name, data: parsedValue });\n }\n return;\n }\n case 'ACTIVITY_SNAPSHOT': {\n const e = event as unknown as {\n messageId: string; activityType: string;\n content: Record<string, unknown>; replace?: boolean;\n };\n const map = new Map(store.activities());\n const existing = map.get(e.messageId);\n if (existing && existing.activityType === e.activityType && !e.replace) {\n existing.content.update((c) => ({ ...c, ...e.content }));\n } else {\n map.set(e.messageId, {\n messageId: e.messageId,\n activityType: e.activityType,\n content: signal<Record<string, unknown>>(e.content ?? {}),\n });\n }\n store.activities.set(map); // new ref → projection picks up membership change\n return;\n }\n case 'ACTIVITY_DELTA': {\n const e = event as unknown as {\n messageId: string; patch: readonly JsonPatchOp[];\n };\n const entry = store.activities().get(e.messageId);\n if (!entry) return; // unknown activity — ignore\n entry.content.update((c) => {\n try {\n return applyPatch(c, e.patch);\n } catch (err) {\n // A malformed/out-of-order ACTIVITY_DELTA must not break the stream — drop it.\n if (typeof console !== 'undefined') console.warn('[ag-ui] dropping malformed ACTIVITY_DELTA patch', err);\n return c;\n }\n }); // inner signal → live, no map churn\n return;\n }\n default: {\n // Unknown event types are ignored; AG-UI may add new ones in\n // future protocol versions. We surface them as no-ops rather\n // than throwing, so a partial-version mismatch doesn't crash.\n return;\n }\n }\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2);\n}\n\nfunction messageIdFrom(event: BaseEvent): string {\n return (event as { messageId?: string }).messageId ?? 'unknown';\n}\n\nfunction safeParseArgs(delta: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(delta);\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\n/** Parse an (accumulated) args buffer; `undefined` when it isn't valid JSON\n * yet — callers keep the previous args rather than clobbering them with {}. */\nfunction tryParseArgs(buffer: string): Record<string, unknown> | undefined {\n try {\n const parsed = JSON.parse(buffer);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Parse a JSON string to its value; return the original string on failure. */\nfunction safeParseJson(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return s;\n }\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction deepClone<T>(v: T): T {\n return JSON.parse(JSON.stringify(v));\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal } from '@angular/core';\nimport type { AbstractAgent } from '@ag-ui/client';\nimport type { Tool, Message } from '@ag-ui/core';\nimport type { ClientToolsCapability, ClientToolResult, ClientToolSpec } from '@threadplane/chat';\nimport type { ReducerStore } from './reducer';\n\n/**\n * Minimal subset of AbstractAgent used by createClientToolsCapability.\n * Typed narrowly so the factory is easy to fake in tests.\n */\nexport interface ClientToolsSource {\n addMessage(message: Parameters<AbstractAgent['addMessage']>[0]): void;\n runAgent(parameters?: { tools?: Tool[] }): Promise<unknown>;\n}\n\n/** Convert a ClientToolSpec to the AG-UI Tool wire shape. */\nfunction toAgUiTool(spec: ClientToolSpec): Tool {\n return { name: spec.name, description: spec.description, parameters: spec.parameters };\n}\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 * Creates a ClientToolsCapability backed by an AG-UI source agent and a\n * ReducerStore. Extracted into a factory so it can be unit-tested in isolation\n * without standing up a full Angular DI environment.\n *\n * The capability:\n * - Maintains a catalog of client tool specs (setCatalog).\n * - Exposes a `pending` computed signal: tool calls whose name is in the catalog,\n * have no backend result, and haven't been resolved client-side yet — but ONLY\n * when the run is not in progress (isLoading===false). The backend ends the run\n * without emitting TOOL_CALL_RESULT for client tools, so result stays undefined.\n * - resolve(id, result): marks the call as resolved, writes the outcome onto\n * the local ToolCall in the store (so the transcript freezes: the mounted\n * ask component re-renders with its emitted value as props and can branch to\n * a frozen state), adds a ToolMessage via source.addMessage, then re-runs\n * the agent with the catalog tools attached.\n *\n * Call catalogAsAgUiTools() to get the current catalog as AG-UI Tool[] for\n * threading into runAgent().\n */\nexport function createClientToolsCapability(\n source: ClientToolsSource,\n store: ReducerStore,\n): ClientToolsCapability & { catalogAsAgUiTools(): Tool[] } {\n const catalog = signal<readonly ClientToolSpec[]>([]);\n const resolvedIds = signal<ReadonlySet<string>>(new Set());\n\n function catalogAsAgUiTools(): Tool[] {\n return catalog().map(toAgUiTool);\n }\n\n const clientTools: ClientToolsCapability & { catalogAsAgUiTools(): Tool[] } = {\n setCatalog(specs: readonly ClientToolSpec[]): void {\n catalog.set([...specs]);\n },\n\n pending: computed(() => {\n // Client tools are only actionable after the run ends (backend signals it\n // by ending the run WITHOUT emitting TOOL_CALL_RESULT for client tools).\n if (store.isLoading()) return [];\n const names = new Set(catalog().map((s) => s.name));\n const done = resolvedIds();\n return store.toolCalls().filter(\n (tc) => names.has(tc.name) && tc.result === undefined && !done.has(tc.id),\n );\n }),\n\n resolve(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 // Write the outcome onto the LOCAL ToolCall in the store. The client tool\n // DID produce a result client-side, so this is semantically correct — and\n // it freezes the transcript card: toToolViewSpec spreads `{...args,\n // ...result, status}` into the mounted ask component, so the component\n // re-renders with its own emitted value as props and can branch to a\n // resolved/frozen state. The backend ToolMessage never reaches this local\n // ToolCall, so without this write the card stays interactive forever.\n const ok = result.ok;\n const value = (result as { value: unknown }).value;\n const error = (result as { error: string }).error;\n store.toolCalls.update((calls) =>\n calls.map((tc) =>\n tc.id === id\n ? {\n ...tc,\n result: ok ? value : { error },\n ...(ok ? {} : { error, status: 'error' as const }),\n }\n : tc,\n ),\n );\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 content = ok\n ? safeStringify(value)\n : `Error: ${error}`;\n\n source.addMessage({\n id: `tool-${id}`,\n role: 'tool',\n toolCallId: id,\n content,\n } as Message);\n\n void source.runAgent({ tools: catalogAsAgUiTools() });\n },\n\n catalogAsAgUiTools,\n };\n\n return clientTools;\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal, type Signal } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport type { AbstractAgent } from '@ag-ui/client';\nimport { toAgentError, isAbortError, type AgentError } from '@threadplane/chat';\nimport type {\n Agent, Message, AgentStatus, ToolCall, AgentEvent,\n AgentInterrupt,\n AgentRuntimeTelemetryEvent,\n AgentRuntimeTelemetryProperties,\n AgentRuntimeTelemetrySink,\n AgentSubmitInput, AgentSubmitOptions,\n ClientToolsCapability,\n Subagent, SubagentStatus,\n} from '@threadplane/chat';\nimport { reduceEvent, type ReducerStore, type CustomStreamEvent, type ActivityEntry } from './reducer';\nimport { createClientToolsCapability } from './client-tools';\n\nexport interface ToAgentOptions {\n /** Optional app-owned telemetry sink. No telemetry is emitted unless this is provided. */\n telemetry?: AgentRuntimeTelemetrySink | false;\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 adapter 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\n/**\n * The neutral Agent contract, widened with the AG-UI adapter's\n * `customEvents` signal (the chat composition feature-detects it to enable\n * live a2ui streaming), the browser client-tools capability, and concrete\n * ACTIVITY-backed `subagents`.\n * Mirrors langgraph's LangGraphAgent extension where the protocol surfaces\n * overlap.\n */\nexport interface AgUiAgent<TState = Record<string, unknown>> extends Agent<TState> {\n customEvents: Signal<CustomStreamEvent[]>;\n clientTools: ClientToolsCapability;\n /** Subagent activities (activityType==='subagent') projected to the neutral\n * Subagent contract, keyed by messageId. Narrows the base Agent's optional\n * `subagents?` to a concrete signal for AG-UI consumers. */\n subagents: Signal<Map<string, Subagent>>;\n}\n\n/**\n * Wraps an AG-UI AbstractAgent into the runtime-neutral Agent contract.\n *\n * The adapter subscribes to source.subscribe({ onEvent }) and reduces every\n * event into the produced Agent's signals. submit() optimistically appends the\n * user message to both our signals and the source agent's internal message\n * list, then calls source.runAgent(). stop() calls source.abortRun().\n *\n * Subscription cleanup: the returned Agent does NOT manage its own lifetime.\n * Callers using DI should rely on the provider's destroy hook; direct callers\n * of toAgent() should treat the returned object's lifecycle as tied to the\n * agent instance they constructed. The subscriber registered via\n * source.subscribe() will fire for the lifetime of source.\n *\n * @example\n * ```ts\n * import { HttpAgent } from '@ag-ui/client';\n * import { toAgent } from '@threadplane/ag-ui';\n *\n * const agent = toAgent(new HttpAgent({ url: '/api/agent' }));\n * ```\n */\nexport function toAgent(source: AbstractAgent, options: ToAgentOptions = {}): AgUiAgent {\n const store: ReducerStore = {\n messages: signal<Message[]>([]),\n status: signal<AgentStatus>('idle'),\n isLoading: signal<boolean>(false),\n error: signal<AgentError | undefined>(undefined),\n toolCalls: signal<ToolCall[]>([]),\n state: signal<Record<string, unknown>>({}),\n interrupt: signal<AgentInterrupt | undefined>(undefined),\n events$: new Subject<AgentEvent>(),\n customEvents: signal<CustomStreamEvent[]>([]),\n activities: signal<Map<string, ActivityEntry>>(new Map()),\n };\n const telemetryProperties = { transport: 'ag-ui' as const, surface: 'to_agent' };\n let activeRun: { startedAt: number; errored: boolean } | null = null;\n\n // Set by stop(); lets run-failure handlers distinguish a user-initiated\n // abort (graceful cancel) from a genuine stream failure.\n let abortRequested = false;\n\n // Set to true the first time settleIfAborted() handles an abort error for the\n // current run. The AG-UI client can surface the same abort via both the event\n // stream (RUN_ERROR event) AND onRunFailed — abortSettled lets the second\n // delivery see through as a no-op rather than re-writing store state or\n // triggering a real error path. Both flags are reset together at the top of\n // submit() so the next run starts clean.\n let abortSettled = false;\n\n // Tracks the last AgentSubmitInput so retry() can re-run it without\n // duplicating the user message. Set at the top of submit()'s message path.\n let lastInput: AgentSubmitInput | undefined;\n\n /** Settles the store as idle for stop()-induced failures; returns true if handled. */\n function settleIfAborted(error: unknown): boolean {\n // If we already settled this abort (duplicate delivery — e.g. RUN_ERROR\n // event THEN onRunFailed), defensively re-apply the idle settle so any\n // state written between the two deliveries (e.g. RUN_STARTED from a new\n // run that started before flags were reset) is corrected. Telemetry is\n // not re-emitted — the guard returns true to suppress further processing.\n if (abortSettled && isAbortError(error)) {\n store.status.set('idle');\n store.isLoading.set(false);\n return true;\n }\n\n if (!abortRequested || !isAbortError(error)) return false;\n abortRequested = false;\n abortSettled = true;\n store.status.set('idle');\n store.isLoading.set(false);\n // Not a failure: leave store.error null and close out telemetry as a\n // normal finish so the aborted run doesn't count as errored.\n const run = activeRun;\n if (run) {\n finishRunTelemetry(run);\n // Mark errored so any subsequent finishRunTelemetry/failRunTelemetry\n // call on the same run object (e.g. from submit's try block resolving\n // after the abort) is a no-op — telemetry fires at most once per run.\n run.errored = true;\n }\n return true;\n }\n\n // Build the client-tools capability. catalogAsAgUiTools() is used below to\n // thread the catalog into every runAgent() call.\n const clientToolsCap = createClientToolsCapability(source, store);\n\n /** Forward a neutral-contract state patch onto the AG-UI run input.\n * Mirrors the canonical demo's `input.state` mechanism: the patch is\n * merged into the source agent's client state (carried on\n * RunAgentInput.state) and reflected optimistically in the local\n * state signal — the server's next STATE_SNAPSHOT stays authoritative. */\n const applyStatePatch = (patch: Record<string, unknown> | undefined): void => {\n if (!patch || Object.keys(patch).length === 0) return;\n source.state = { ...((source.state as Record<string, unknown>) ?? {}), ...patch };\n store.state.update((prev) => ({ ...prev, ...patch }));\n };\n\n captureAgentRuntimeTelemetry(\n options.telemetry,\n 'tplane:runtime_instance_created',\n telemetryProperties,\n );\n\n function startRunTelemetry(requestType: string): { startedAt: number; errored: boolean } {\n const run = { startedAt: Date.now(), errored: false };\n activeRun = run;\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:runtime_request_created', {\n ...telemetryProperties,\n requestType,\n });\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);\n return run;\n }\n\n function finishRunTelemetry(run: { startedAt: number; errored: boolean }): void {\n if (run.errored) return;\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {\n ...telemetryProperties,\n durationMs: Date.now() - run.startedAt,\n });\n if (activeRun === run) activeRun = null;\n }\n\n function failRunTelemetry(error: unknown, run = activeRun): void {\n if (!run || run.errored) return;\n run.errored = true;\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - run.startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(error),\n });\n if (activeRun === run) activeRun = null;\n }\n\n /**\n * Fires the current message list against the source agent (no append).\n * Both submit() and retry() share this path; submit() appends the user\n * message first, retry() skips the append and calls this directly.\n */\n async function runCurrentMessages(): Promise<void> {\n const run = startRunTelemetry('submit');\n const tools = clientToolsCap.catalogAsAgUiTools();\n try {\n await source.runAgent(tools.length > 0 ? { tools } : undefined);\n finishRunTelemetry(run);\n } catch (err) {\n if (!settleIfAborted(err)) {\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(toAgentError(err));\n failRunTelemetry(err, run);\n }\n }\n }\n\n // Tap all events from the source agent via the AgentSubscriber API.\n // This subscription lives for the lifetime of `source`.\n source.subscribe({\n onEvent({ event }) {\n // The AG-UI client surfaces a user-initiated abort both as a\n // RUN_ERROR event (here) and via onRunFailed; guard the event path too\n // so the reducer never marks a deliberate stop as an error.\n if (event.type === 'RUN_ERROR') {\n const message = (event as { message?: string }).message ?? '';\n if (settleIfAborted(new Error(message))) return;\n }\n reduceEvent(event, store);\n },\n onRunFailed({ error }) {\n if (settleIfAborted(error)) return;\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(toAgentError(error));\n failRunTelemetry(error);\n },\n });\n\n // Stable Subagent wrappers per messageId so chat-subagents (tracks by\n // toolCallId) doesn't churn as activity content streams.\n const subagentWrappers = new Map<string, Subagent>();\n function subagentFor(id: string, entry: ActivityEntry): Subagent {\n let w = subagentWrappers.get(id);\n if (!w) {\n w = {\n toolCallId: (entry.content()['toolCallId'] as string) ?? id,\n name: entry.content()['name'] as string | undefined,\n status: computed(() => (entry.content()['status'] as SubagentStatus) ?? 'running'),\n messages: computed<Message[]>(() => {\n const c = entry.content();\n const raw = c['messages'];\n if (Array.isArray(raw)) {\n return (raw as Array<Record<string, unknown>>).map((m, i) => ({\n id: (m['id'] as string) ?? `${id}-${i}`,\n role: 'assistant' as Message['role'],\n content: typeof m['content'] === 'string' ? (m['content'] as string) : (m['content'] as Message['content']) ?? '',\n ...(Array.isArray(m['toolCallIds']) ? { toolCallIds: m['toolCallIds'] as string[] } : {}),\n ...(typeof m['reasoning'] === 'string' ? { reasoning: m['reasoning'] as string } : {}),\n }));\n }\n return [{ id, role: 'assistant', content: String(c['text'] ?? '') }];\n }),\n toolCalls: computed<ToolCall[]>(() => {\n const raw = entry.content()['toolCalls'];\n return Array.isArray(raw) ? (raw as ToolCall[]) : [];\n }),\n state: computed(() => (entry.content()['state'] as Record<string, unknown>) ?? {}),\n };\n subagentWrappers.set(id, w);\n }\n return w;\n }\n\n return {\n messages: store.messages,\n status: store.status,\n isLoading: store.isLoading,\n error: store.error,\n toolCalls: store.toolCalls,\n state: store.state,\n interrupt: store.interrupt,\n events$: store.events$.asObservable(),\n customEvents: store.customEvents,\n subagents: computed<Map<string, Subagent>>(() => {\n const out = new Map<string, Subagent>();\n for (const [id, entry] of store.activities()) {\n if (entry.activityType !== 'subagent') continue;\n out.set(id, subagentFor(id, entry));\n }\n // Prune stale wrappers: keeps the cache bounded and prevents a reused\n // tool-call-id from binding to an orphaned (pre-RUN_STARTED) content signal.\n for (const id of subagentWrappers.keys()) {\n if (!out.has(id)) subagentWrappers.delete(id);\n }\n return out;\n }),\n clientTools: clientToolsCap,\n\n submit: async (input: AgentSubmitInput, _opts?: AgentSubmitOptions) => {\n // Reset both abort flags so a new submit starts clean and genuine\n // failures after a previous stop are never swallowed.\n abortRequested = false;\n abortSettled = false;\n\n if (input.resume !== undefined) {\n // Resume path: clear the pending interrupt and replay the run with the\n // resume payload forwarded to the LangGraph backend via AG-UI's\n // forwardedProps.command.resume mechanism.\n applyStatePatch(input.state);\n store.interrupt.set(undefined);\n const run = startRunTelemetry('resume');\n const tools = clientToolsCap.catalogAsAgUiTools();\n try {\n await source.runAgent({\n forwardedProps: { command: { resume: input.resume } },\n ...(tools.length > 0 ? { tools } : {}),\n });\n finishRunTelemetry(run);\n } catch (err) {\n if (!settleIfAborted(err)) {\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(toAgentError(err));\n failRunTelemetry(err, run);\n }\n }\n return;\n }\n\n applyStatePatch(input.state);\n\n // Optimistic append of user message to our signals and to the source\n // agent's own message list so runAgent() sees the new message.\n const userMsg = buildUserMessage(input);\n if (userMsg) {\n store.messages.update((prev) => [...prev, userMsg]);\n // Sync to AG-UI source so it's included in the next run's input.\n source.addMessage(userMsg as Parameters<typeof source.addMessage>[0]);\n }\n\n // Record the input so retry() can re-run it without re-appending the\n // user message (the message is already in the list by this point).\n lastInput = input;\n\n await runCurrentMessages();\n },\n\n retry: async () => {\n if (store.isLoading()) return; // no-op while a run is in flight\n if (lastInput === undefined) return; // nothing to retry\n store.error.set(undefined);\n // Re-run the same message list against the source without appending a\n // duplicate user message — the message is already in store.messages and\n // source's internal list from the original submit().\n await runCurrentMessages();\n },\n\n stop: async () => {\n abortRequested = true;\n source.abortRun();\n },\n\n regenerate: async (assistantMessageIndex: number): Promise<void> => {\n if (store.isLoading()) {\n throw new Error('Cannot regenerate while agent is loading another response');\n }\n // Reset abort flags so a regenerate starts clean, exactly like submit().\n // Without this, flags left over from a prior stop() would cause the\n // duplicate-delivery guard in settleIfAborted() to silently swallow the\n // abort error without settling, wedging the store in streaming/running.\n abortRequested = false;\n abortSettled = false;\n const msgs = store.messages();\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 // Truncate local message buffer INCLUSIVE of the user message. This\n // preserves the user message in the UI (replace-semantics) while the\n // new assistant response streams in. The trailing user message becomes\n // the active prompt for the next run — we must NOT re-add it.\n const trimmed = msgs.slice(0, userIdx + 1);\n store.messages.set(trimmed);\n\n // Sync the trimmed list back to the source agent so its internal state\n // matches what we're about to re-run. source.setMessages() replaces the\n // agent's internal message list without appending — the trailing user\n // message in `trimmed` becomes the active prompt for the next run.\n source.setMessages(trimmed as Parameters<typeof source.setMessages>[0]);\n\n const run = startRunTelemetry('regenerate');\n const regenTools = clientToolsCap.catalogAsAgUiTools();\n try {\n await source.runAgent(regenTools.length > 0 ? { tools: regenTools } : undefined);\n finishRunTelemetry(run);\n } catch (err) {\n if (!settleIfAborted(err)) {\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(toAgentError(err));\n failRunTelemetry(err, run);\n }\n }\n },\n };\n}\n\nfunction buildUserMessage(input: AgentSubmitInput): Message | undefined {\n if (input.message === undefined) return undefined;\n const content = typeof input.message === 'string'\n ? input.message\n : input.message.map((b) => b.type === 'text' ? b.text : JSON.stringify(b)).join('');\n return { id: randomId(), role: 'user', content };\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2);\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken, inject, type Provider } from '@angular/core';\nimport { HttpAgent } from '@ag-ui/client';\nimport type { AgentRef, AgentRuntimeTelemetrySink } from '@threadplane/chat';\nimport { toAgent, type AgUiAgent } from './to-agent';\n\n/**\n * Connection options for the AG-UI agent provider, passed to {@link provideAgent}.\n * Mirrors the underlying `HttpAgent` config (`@ag-ui/client`) plus an optional\n * telemetry sink.\n */\nexport interface AgentConfig {\n /** Endpoint URL of the AG-UI HTTP agent (e.g. `'http://localhost:8000/agent'`). Required. */\n url: string;\n /** Agent identifier, when the endpoint serves more than one agent. */\n agentId?: string;\n /** Thread to connect to on start; omit to begin a fresh conversation. */\n threadId?: string;\n /** Extra HTTP headers sent with every request (e.g. auth tokens). */\n headers?: Record<string, string>;\n /** Optional app-owned telemetry sink. No telemetry is emitted unless this is provided. */\n telemetry?: AgentRuntimeTelemetrySink | false;\n}\n\n/**\n * @internal — exported for spec access only. Consumers must use injectAgent().\n * Both `provideAgent` and `provideFakeAgent` register the result of `toAgent()`,\n * which is always an `AgUiAgent`, so the token is typed accordingly.\n */\nexport const AGENT = new InjectionToken<AgUiAgent>('AGENT');\n\n/** @internal — shared factory for building an AgUiAgent from an AgentConfig or factory. */\nfunction buildAgUiAgent(configOrFactory: AgentConfig | (() => AgentConfig)): AgUiAgent {\n // useFactory runs in an injection context, so a config factory may\n // call inject() to read runtime/DI state.\n const config =\n typeof configOrFactory === 'function' ? configOrFactory() : configOrFactory;\n const source = new HttpAgent({\n url: config.url,\n ...(config.agentId !== undefined ? { agentId: config.agentId } : {}),\n ...(config.threadId !== undefined ? { threadId: config.threadId } : {}),\n ...(config.headers !== undefined ? { headers: config.headers } : {}),\n });\n return toAgent(source, { telemetry: config.telemetry });\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 * Provides an Agent instance wired through HttpAgent and toAgent.\n * Constructs an HttpAgent from config and wraps it in the runtime-neutral\n * Agent contract via toAgent(). Returns a provider array suitable for\n * bootstrapApplication or TestBed.configureTestingModule().\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 or route params.\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 Typed state via AgentRef\n * ```ts\n * interface TripState { day: number; places: string[]; }\n * export const TRIP = createAgentRef<TripState>('trip');\n * // app.config.ts:\n * providers: [provideAgent(TRIP, { url: 'http://localhost:8000/agent' })]\n * // component:\n * const agent = injectAgent(TRIP); // AgUiAgent<TripState>\n * ```\n */\nexport function provideAgent<T = Record<string, unknown>>(\n ref: AgentRef<T>,\n configOrFactory: AgentConfig | (() => AgentConfig),\n): Provider[];\nexport function provideAgent(\n configOrFactory: AgentConfig | (() => AgentConfig),\n): Provider[];\nexport function provideAgent<T = Record<string, unknown>>(\n refOrConfig: AgentRef<T> | AgentConfig | (() => AgentConfig),\n maybeConfig?: AgentConfig | (() => AgentConfig),\n): Provider[] {\n const ref = isAgentRef<T>(refOrConfig) ? refOrConfig : undefined;\n const configOrFactory = (ref ? maybeConfig : refOrConfig) as AgentConfig | (() => AgentConfig);\n const providers: Provider[] = [\n { provide: AGENT, useFactory: () => buildAgUiAgent(configOrFactory) },\n ];\n if (ref) providers.push({ provide: ref.token, useExisting: AGENT });\n return providers;\n}\n\n/**\n * Injects the AG-UI agent from Angular's dependency injection container.\n * Use this in components or services provided via `provideAgent()` (or\n * `provideFakeAgent()`).\n *\n * Returns an `AgUiAgent` — the runtime-neutral `Agent` contract plus the\n * AG-UI-specific `customEvents` signal — so `customEvents` is reachable\n * directly, without casting.\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 * `AgUiAgent<Record<string, unknown>>`.\n *\n * @example Typed state via AgentRef\n * ```ts\n * const agent = injectAgent(TRIP); // AgUiAgent<TripState>\n * ```\n */\nexport function injectAgent(): AgUiAgent;\nexport function injectAgent<T>(ref: AgentRef<T>): AgUiAgent<T>;\nexport function injectAgent<T>(ref?: AgentRef<T>): AgUiAgent<T> {\n return inject(ref ? ref.token : AGENT) as AgUiAgent<T>;\n}\n","// libs/ag-ui/src/lib/testing/fake-agent.ts\n// SPDX-License-Identifier: MIT\nimport {\n AbstractAgent,\n EventType,\n type BaseEvent,\n type RunAgentInput,\n} from '@ag-ui/client';\nimport { Observable } from 'rxjs';\n\n/**\n * In-process AG-UI agent that emits a canned streaming response.\n *\n * Use for offline demos and tests where a real backend isn't available.\n * Echoes a fixed assistant reply token-by-token with realistic timing.\n *\n * NOT for production use.\n */\nexport class FakeAgent extends AbstractAgent {\n /**\n * Tokens streamed back as the assistant reply. Override with custom\n * tokens via the constructor for varied demo content.\n */\n private readonly tokens: string[];\n\n /** Optional reasoning chunks emitted before the text reply. */\n private readonly reasoningTokens: string[];\n\n /** Milliseconds between successive token emissions. */\n private readonly delayMs: number;\n\n constructor(opts: {\n tokens?: string[];\n /** Optional reasoning chunks emitted before the text reply. */\n reasoningTokens?: string[];\n delayMs?: number;\n } = {}) {\n super();\n this.tokens = opts.tokens ?? [\n 'Hello', ' from', ' the', ' fake', ' AG-UI', ' agent.',\n ' This', ' is', ' a', ' canned', ' streaming', ' reply.',\n ];\n this.reasoningTokens = opts.reasoningTokens ?? [];\n this.delayMs = opts.delayMs ?? 60;\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n const tokens = this.tokens;\n const reasoningTokens = this.reasoningTokens;\n const delayMs = this.delayMs;\n const messageId = `fake-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n const sequence: BaseEvent[] = [\n { type: EventType.RUN_STARTED, threadId: input.threadId, runId: input.runId } as BaseEvent,\n ];\n\n if (reasoningTokens.length > 0) {\n sequence.push({ type: EventType.REASONING_MESSAGE_START, messageId, role: 'assistant' } as BaseEvent);\n for (const delta of reasoningTokens) {\n sequence.push({ type: EventType.REASONING_MESSAGE_CONTENT, messageId, delta } as BaseEvent);\n }\n sequence.push({ type: EventType.REASONING_MESSAGE_END, messageId } as BaseEvent);\n }\n\n sequence.push({ type: EventType.TEXT_MESSAGE_START, messageId, role: 'assistant' } as BaseEvent);\n for (const delta of tokens) {\n sequence.push({ type: EventType.TEXT_MESSAGE_CONTENT, messageId, delta } as BaseEvent);\n }\n sequence.push({ type: EventType.TEXT_MESSAGE_END, messageId } as BaseEvent);\n sequence.push({ type: EventType.RUN_FINISHED, threadId: input.threadId, runId: input.runId } as BaseEvent);\n\n return new Observable<BaseEvent>((observer) => {\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let i = 0;\n\n const emitNext = () => {\n if (cancelled) return;\n if (i >= sequence.length) {\n observer.complete();\n return;\n }\n observer.next(sequence[i]);\n i++;\n // Steady cadence except a tiny initial delay before RUN_STARTED.\n timer = setTimeout(emitNext, delayMs);\n };\n\n timer = setTimeout(emitNext, 30);\n\n return () => {\n cancelled = true;\n if (timer !== undefined) clearTimeout(timer);\n };\n });\n }\n}\n","// libs/ag-ui/src/lib/testing/provide-fake-agent.ts\n// SPDX-License-Identifier: MIT\nimport { type Provider } from '@angular/core';\nimport type { FakeAgentConfig } from '@threadplane/chat/testing';\nimport { AGENT } from '../provide-agent';\nimport { toAgent } from '../to-agent';\nimport { FakeAgent } from './fake-agent';\n\n/**\n * Registers an in-process FakeAgent under AGENT.\n *\n * Use for offline demos and development. Drop-in replacement for\n * provideAgent({ url }) when no real backend is available.\n *\n * @example\n * ```ts\n * TestBed.configureTestingModule({\n * providers: [provideFakeAgent({ tokens: ['Hello from the fake agent'] })],\n * });\n * ```\n */\nexport function provideFakeAgent(config: FakeAgentConfig = {}): Provider[] {\n return [\n {\n provide: AGENT,\n useFactory: () => toAgent(new FakeAgent(config)),\n },\n ];\n}\n","// SPDX-License-Identifier: MIT\nexport { toAgent } from './lib/to-agent';\nexport type { ToAgentOptions, AgUiAgent } from './lib/to-agent';\nexport type { CustomStreamEvent } from './lib/reducer';\nexport { provideAgent, injectAgent } from './lib/provide-agent';\nexport type { AgentConfig } from './lib/provide-agent';\nexport { FakeAgent } from './lib/testing/fake-agent';\nexport { provideFakeAgent } from './lib/testing/provide-fake-agent';\n\n// Citation state bridge\nexport { bridgeCitationsState } from './lib/bridge-citations-state';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["randomId"],"mappings":"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"}
1
+ {"version":3,"file":"threadplane-ag-ui.mjs","sources":["../../../../libs/ag-ui/src/lib/internal/apply-patch.ts","../../../../libs/ag-ui/src/lib/bridge-citations-state.ts","../../../../libs/ag-ui/src/lib/reducer.ts","../../../../libs/ag-ui/src/lib/client-tools.ts","../../../../libs/ag-ui/src/lib/to-agent.ts","../../../../libs/ag-ui/src/lib/provide-agent.ts","../../../../libs/ag-ui/src/lib/testing/fake-agent.ts","../../../../libs/ag-ui/src/lib/testing/provide-fake-agent.ts","../../../../libs/ag-ui/src/public-api.ts","../../../../libs/ag-ui/src/threadplane-ag-ui.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n// Minimal RFC-6902 JSON Patch implementation, scoped to the ops the ag-ui\n// reducer actually receives via STATE_DELTA events: add, replace, remove,\n// move, copy, test. Pure ESM, zero deps. Replaces a CommonJS-only third-party\n// dependency that broke ESM-strict consumers (Vitest, Vite test envs).\n\nexport interface JsonPatchOp {\n readonly op: 'add' | 'replace' | 'remove' | 'move' | 'copy' | 'test';\n readonly path: string;\n readonly value?: unknown;\n readonly from?: string;\n}\n\n/**\n * Apply a sequence of JSON Patch (RFC-6902) operations to `target`. Returns a\n * new document. The input is not mutated.\n *\n * Operations apply in order; if any operation fails (invalid path, failed\n * test, etc.) the whole patch throws — matching `fast-json-patch`'s\n * `validate: false` behavior used by the reducer.\n */\nexport function applyPatch<T>(target: T, ops: readonly JsonPatchOp[]): T {\n let current: unknown = target;\n for (const op of ops) {\n current = applyOne(current, op);\n }\n return current as T;\n}\n\nfunction applyOne(doc: unknown, op: JsonPatchOp): unknown {\n switch (op.op) {\n case 'add': return setAt(doc, parsePointer(op.path), op.value, /*replaceArrayDash*/ true);\n case 'replace': return setAt(doc, parsePointer(op.path), op.value, /*replaceArrayDash*/ false);\n case 'remove': return removeAt(doc, parsePointer(op.path));\n case 'move': {\n if (op.from == null) throw new Error(\"'move' op requires 'from'\");\n const fromTokens = parsePointer(op.from);\n const value = getAt(doc, fromTokens);\n const removed = removeAt(doc, fromTokens);\n return setAt(removed, parsePointer(op.path), value, true);\n }\n case 'copy': {\n if (op.from == null) throw new Error(\"'copy' op requires 'from'\");\n const value = getAt(doc, parsePointer(op.from));\n return setAt(doc, parsePointer(op.path), structuredCloneSafe(value), true);\n }\n case 'test': {\n const actual = getAt(doc, parsePointer(op.path));\n if (!deepEqual(actual, op.value)) {\n throw new Error(`'test' op failed at path ${op.path}`);\n }\n return doc;\n }\n default: {\n const o: { op: string } = op as never;\n throw new Error(`Unsupported JSON Patch op: ${o.op}`);\n }\n }\n}\n\n/**\n * Parse an RFC-6901 JSON Pointer string into its tokens.\n * \"\" → []\n * \"/foo/0\" → [\"foo\", \"0\"]\n * \"/a~1b\" → [\"a/b\"] (~1 → /)\n * \"/a~0b\" → [\"a~b\"] (~0 → ~)\n */\nexport function parsePointer(pointer: string): string[] {\n if (pointer === '') return [];\n if (!pointer.startsWith('/')) {\n throw new Error(`Invalid JSON Pointer: ${pointer}`);\n }\n return pointer\n .slice(1)\n .split('/')\n .map(token => token.replace(/~1/g, '/').replace(/~0/g, '~'));\n}\n\nfunction getAt(doc: unknown, tokens: readonly string[]): unknown {\n let cur: unknown = doc;\n for (const token of tokens) {\n cur = stepInto(cur, token);\n }\n return cur;\n}\n\nfunction stepInto(node: unknown, token: string): unknown {\n if (Array.isArray(node)) {\n const i = parseArrayIndex(token, node.length);\n return node[i];\n }\n if (node !== null && typeof node === 'object') {\n return (node as Record<string, unknown>)[token];\n }\n throw new Error(`Cannot traverse non-container at token \"${token}\"`);\n}\n\nfunction setAt(\n doc: unknown,\n tokens: readonly string[],\n value: unknown,\n allowArrayAppend: boolean,\n): unknown {\n if (tokens.length === 0) {\n // Replace root.\n return structuredCloneSafe(value);\n }\n const [head, ...rest] = tokens;\n if (Array.isArray(doc)) {\n const arr = doc.slice();\n const i = head === '-' && allowArrayAppend ? arr.length : parseArrayIndex(head!, arr.length + (allowArrayAppend ? 1 : 0));\n if (rest.length === 0) {\n if (allowArrayAppend) {\n // RFC-6902 add: insert at index, shifting elements right\n arr.splice(i, 0, structuredCloneSafe(value));\n } else {\n // replace: overwrite at index\n if (i >= arr.length) throw new Error(`Cannot replace beyond array length at \"/${tokens.join('/')}\"`);\n arr[i] = structuredCloneSafe(value);\n }\n } else {\n if (i >= arr.length) throw new Error(`Cannot descend into non-existent array index ${i}`);\n arr[i] = setAt(arr[i], rest, value, allowArrayAppend);\n }\n return arr;\n }\n if (doc === null || typeof doc !== 'object') {\n throw new Error(`Cannot descend into non-container at \"/${tokens.join('/')}\"`);\n }\n const obj = { ...(doc as Record<string, unknown>) };\n if (rest.length === 0) {\n obj[head!] = structuredCloneSafe(value);\n } else {\n if (!(head! in obj)) {\n throw new Error(`Cannot descend into missing path \"/${tokens.join('/')}\"`);\n }\n obj[head!] = setAt(obj[head!], rest, value, allowArrayAppend);\n }\n return obj;\n}\n\nfunction removeAt(doc: unknown, tokens: readonly string[]): unknown {\n if (tokens.length === 0) {\n throw new Error('Cannot remove root');\n }\n const [head, ...rest] = tokens;\n if (Array.isArray(doc)) {\n const arr = doc.slice();\n const i = parseArrayIndex(head!, arr.length);\n if (i >= arr.length) throw new Error(`Cannot remove non-existent array index ${i}`);\n if (rest.length === 0) {\n arr.splice(i, 1);\n } else {\n arr[i] = removeAt(arr[i], rest);\n }\n return arr;\n }\n if (doc === null || typeof doc !== 'object') {\n throw new Error(`Cannot remove from non-container at token \"${head}\"`);\n }\n const obj = { ...(doc as Record<string, unknown>) };\n if (rest.length === 0) {\n if (!(head! in obj)) throw new Error(`Cannot remove non-existent key \"${head}\"`);\n delete obj[head!];\n } else {\n if (!(head! in obj)) throw new Error(`Cannot descend into missing path \"${head}\"`);\n obj[head!] = removeAt(obj[head!], rest);\n }\n return obj;\n}\n\nfunction parseArrayIndex(token: string, lengthBound: number): number {\n if (token === '-') {\n // \"-\" is the \"after-last\" sentinel; only valid for `add` (handled by caller)\n throw new Error(`Array end marker \"-\" not valid in this position`);\n }\n if (!/^(0|[1-9]\\d*)$/.test(token)) {\n throw new Error(`Invalid array index: \"${token}\"`);\n }\n const i = Number.parseInt(token, 10);\n if (i > lengthBound) {\n throw new Error(`Array index ${i} exceeds bound ${lengthBound}`);\n }\n return i;\n}\n\nfunction structuredCloneSafe<T>(v: T): T {\n // Cheap deep clone for JSON-like values (no functions, no cycles) — matches\n // the deep-clone the reducer was already doing pre-applyPatch with the prior\n // dependency.\n if (v === null || typeof v !== 'object') return v;\n return JSON.parse(JSON.stringify(v)) as T;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n const ao = a as Record<string, unknown>;\n const bo = b as Record<string, unknown>;\n const aKeys = Object.keys(ao);\n const bKeys = Object.keys(bo);\n if (aKeys.length !== bKeys.length) return false;\n for (const k of aKeys) {\n if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;\n if (!deepEqual(ao[k], bo[k])) return false;\n }\n return true;\n}\n","// libs/ag-ui/src/lib/bridge-citations-state.ts\n// SPDX-License-Identifier: MIT\nimport type { Citation, Message } from '@threadplane/chat';\n\ninterface ThreadStateLike {\n state?: Record<string, unknown>;\n}\n\n/**\n * Attach per-message {@link Citation}s carried in an AG-UI thread's `state`\n * (`state.citations`, keyed by message id) onto the corresponding assistant\n * {@link Message}s — for advanced consumers wiring citations from STATE events\n * into the neutral chat contract.\n *\n * @param thread The thread-state container holding `state.citations`.\n * @param messages The messages to enrich.\n * @returns A new array where matching messages gain their `citations`; messages\n * without citations are returned unchanged.\n * @example\n * ```ts\n * const enriched = bridgeCitationsState(threadState, agent.messages());\n * ```\n */\nexport function bridgeCitationsState(thread: ThreadStateLike, messages: Message[]): Message[] {\n const citationsByMsg = (thread.state as { citations?: unknown })?.citations;\n if (!citationsByMsg || typeof citationsByMsg !== 'object') return messages;\n const map = citationsByMsg as Record<string, unknown>;\n return messages.map(msg => {\n const raw = map[msg.id];\n if (!Array.isArray(raw) || raw.length === 0) return msg;\n return { ...msg, citations: raw.map((entry, i) => normalizeCitation(entry, i + 1)) };\n });\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\n// @ag-ui/client@0.0.52 — EventType is a string enum with uppercase values.\n// Discriminator strings (e.g. 'RUN_STARTED') match EventType enum members\n// verbatim; the switch cases below use the string literals directly so this\n// file has no runtime dependency on the EventType enum import.\nimport { signal, type WritableSignal } from '@angular/core';\nimport type { Subject } from 'rxjs';\nimport {\n completeDelivery,\n staticDelivery,\n streamingDelivery,\n toAgentError,\n type AgentError,\n type CompleteOutcome,\n} from '@threadplane/chat';\nimport type {\n Message, AgentStatus, ToolCall, AgentEvent, AgentInterrupt,\n} from '@threadplane/chat';\nimport type { BaseEvent } from '@ag-ui/client';\nimport { applyPatch, type JsonPatchOp } from './internal/apply-patch';\nimport { bridgeCitationsState } from './bridge-citations-state';\n\n/**\n * AG-UI AssistantMessage shape as it arrives on the wire in a MESSAGES_SNAPSHOT.\n * The `toolCalls` field carries full ToolCall objects (id + function { name, arguments }).\n * This is distinct from the chat lib's `Message.toolCallIds` which is a plain string[].\n */\ninterface AgUiSnapshotToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\ninterface AgUiSnapshotMessage {\n id: string;\n role: string;\n content?: string;\n toolCalls?: AgUiSnapshotToolCall[];\n [key: string]: unknown;\n}\n\n/**\n * A custom event surfaced to consumers via the agent's `customEvents` signal.\n * Mirrors the LangGraph adapter's CustomStreamEvent shape so the chat\n * a2ui partial-args bridge consumes both transports identically.\n */\nexport interface CustomStreamEvent {\n /** Event name set by the backend (e.g. 'a2ui-partial', 'state_update'). */\n name: string;\n /** Arbitrary payload from the backend (JSON-string values are parsed). */\n data: unknown;\n}\n\n/** A native AG-UI ACTIVITY (typed, identified, incrementally-streamed sub-process).\n * Generic — keyed by messageId, grouped by activityType. toAgent projects\n * activityType==='subagent' to the neutral Subagent contract. */\nexport interface ActivityEntry {\n messageId: string;\n activityType: string;\n generation: string;\n content: WritableSignal<Record<string, unknown>>;\n}\n\nexport interface ReducerDeliveryRun {\n generation: string;\n baselineMessageIds: Set<string>;\n ownedMessageIds: Set<string>;\n snapshotReplacementIds: Set<string>;\n eligibleBaselineAssistantId?: string;\n currentAssistantMessageId?: string;\n protocolRunId?: string;\n outcome?: CompleteOutcome;\n}\n\nexport interface ReducerStore {\n messages: WritableSignal<Message[]>;\n status: WritableSignal<AgentStatus>;\n isLoading: WritableSignal<boolean>;\n error: WritableSignal<AgentError | undefined>;\n toolCalls: WritableSignal<ToolCall[]>;\n state: WritableSignal<Record<string, unknown>>;\n interrupt: WritableSignal<AgentInterrupt | undefined>;\n events$: Subject<AgentEvent>;\n customEvents: WritableSignal<CustomStreamEvent[]>;\n activities: WritableSignal<Map<string, ActivityEntry>>;\n deliveryRun: ReducerDeliveryRun | null;\n allocateDeliveryGeneration(scope: string): string;\n /** Accumulated raw TOOL_CALL_ARGS text per toolCallId. A live model streams\n * args as many partial-JSON fragments, so each delta must be appended here\n * and the ACCUMULATED buffer parsed — parsing a lone delta only succeeds\n * when the whole payload happens to arrive in one chunk (e.g. test\n * fixtures). Lazily created by the reducer; entries dropped on\n * TOOL_CALL_END. */\n argsBuffers?: Map<string, string>;\n}\n\n/** Finalize one run without touching messages owned by another generation. */\nexport function finalizeDeliveryRun(\n store: ReducerStore,\n run: ReducerDeliveryRun,\n outcome: CompleteOutcome,\n): boolean {\n if (run.outcome !== undefined) return false;\n run.outcome = outcome;\n store.messages.update(messages => messages.map(message =>\n message.delivery.generation === run.generation\n ? { ...message, delivery: completeDelivery(run.generation, outcome) }\n : message,\n ));\n return true;\n}\n\n/**\n * Per-message reasoning timing. Populated by REASONING_MESSAGE_START /\n * REASONING_MESSAGE_END handlers. The map lives on the module — same\n * scope as the reducer function. ReducerStore stays free of timing\n * state; consumers read it via `Message.reasoningDurationMs` on\n * messages that completed reasoning.\n *\n * Keyed by messageId. We do not need cross-thread isolation here:\n * AG-UI's source agent recreates the reducer pipeline per session, and\n * messageIds are unique within a session.\n */\nconst reasoningTimingMap = new Map<string, { startedAt: number; endedAt?: number }>();\n\nfunction resolveReasoningDurationMs(messageId: string): number | undefined {\n const entry = reasoningTimingMap.get(messageId);\n if (!entry || entry.endedAt === undefined) return undefined;\n return entry.endedAt - entry.startedAt;\n}\n\n/**\n * Pure function: applies a single AG-UI BaseEvent to the store. Caller\n * subscribes to source.agent() and forwards each event here. Designed\n * for testability — no side effects beyond the supplied store.\n */\nexport function reduceEvent(event: BaseEvent, store: ReducerStore): void {\n switch (event.type) {\n case 'RUN_STARTED': {\n const run = store.deliveryRun;\n if (!run || run.outcome !== undefined || !bindRunId(event, run)) return;\n store.status.set('running');\n store.isLoading.set(true);\n store.error.set(undefined);\n store.interrupt.set(undefined);\n store.customEvents.set([]);\n store.activities.set(new Map());\n return;\n }\n case 'RUN_FINISHED': {\n const run = currentRunForEvent(event, store);\n if (!run || !finalizeDeliveryRun(store, run, 'success')) return;\n store.status.set('idle');\n store.isLoading.set(false);\n return;\n }\n case 'RUN_ERROR': {\n const run = currentRunForEvent(event, store);\n if (!run || !finalizeDeliveryRun(store, run, 'error')) return;\n store.status.set('error');\n store.isLoading.set(false);\n const runErrorMsg = (event as { message?: unknown }).message;\n store.error.set(toAgentError(\n typeof runErrorMsg === 'string' ? new Error(runErrorMsg) : (runErrorMsg ?? event),\n ));\n return;\n }\n case 'TEXT_MESSAGE_START': {\n const id = messageIdFrom(event);\n const delivery = ownAssistantMessage(store, id);\n if (!delivery) return;\n store.messages.update((prev) =>\n prev.some((m) => m.id === id)\n ? prev.map((m) => m.id === id ? { ...m, content: m.content ?? '', delivery } : m)\n : [...prev, { id, role: 'assistant', content: '', delivery }],\n );\n return;\n }\n case 'REASONING_MESSAGE_START': {\n const id = messageIdFrom(event);\n const delivery = ownAssistantMessage(store, id);\n if (!delivery) return;\n reasoningTimingMap.set(id, { startedAt: Date.now() });\n // Initialize an assistant slot with empty reasoning if it doesn't already exist.\n store.messages.update((prev) =>\n prev.some((m) => m.id === id)\n ? prev.map((m) => m.id === id\n ? { ...m, reasoning: m.reasoning ?? '', delivery }\n : m)\n : [...prev, { id, role: 'assistant', content: '', reasoning: '', delivery }],\n );\n return;\n }\n case 'REASONING_MESSAGE_CONTENT':\n case 'REASONING_MESSAGE_CHUNK': {\n const id = messageIdFrom(event);\n const delivery = ownAssistantMessage(store, id);\n if (!delivery) return;\n const delta = (event as { delta?: string }).delta ?? '';\n store.messages.update((prev) =>\n prev.map((m) => m.id === id\n ? { ...m, reasoning: (m.reasoning ?? '') + delta, delivery }\n : m),\n );\n return;\n }\n case 'REASONING_MESSAGE_END': {\n const id = messageIdFrom(event);\n const entry = reasoningTimingMap.get(id);\n if (entry) {\n entry.endedAt = Date.now();\n reasoningTimingMap.set(id, entry);\n const duration = resolveReasoningDurationMs(id);\n if (duration !== undefined) {\n store.messages.update((prev) =>\n prev.map((m) => m.id === id ? { ...m, reasoningDurationMs: duration } : m),\n );\n }\n }\n return;\n }\n case 'TEXT_MESSAGE_CONTENT': {\n const id = messageIdFrom(event);\n const delivery = ownAssistantMessage(store, id);\n if (!delivery) return;\n const delta = (event as { delta?: string }).delta ?? '';\n store.messages.update((prev) =>\n prev.map((m) => m.id === id ? { ...m, content: m.content + delta, delivery } : m),\n );\n return;\n }\n case 'TEXT_MESSAGE_END': {\n // No-op — message is finalized by virtue of TEXT_MESSAGE_CONTENT\n // having been applied. Reserved for future hooks.\n return;\n }\n case 'TOOL_CALL_START': {\n const e = event as unknown as { toolCallId: string; toolCallName: string; parentMessageId?: string };\n store.toolCalls.update((prev) => [\n ...prev,\n { id: e.toolCallId, name: e.toolCallName, args: {}, status: 'running' },\n ]);\n // Link the tool call to its parent assistant message so the chat lib's\n // per-message tool-call resolution (chat-tool-calls / chat-tool-views)\n // can scope it. ag-ui-langgraph emits parentMessageId for every tool\n // call. If the parent assistant message hasn't been created yet (a\n // tool-call-only turn emits no TEXT_MESSAGE_START), create a slot.\n const parentId = e.parentMessageId;\n if (parentId) {\n const delivery = ownAssistantMessage(store, parentId);\n if (!delivery) return;\n store.messages.update((prev) => {\n const existing = prev.find((m) => m.id === parentId);\n if (existing) {\n return prev.map((m) =>\n m.id === parentId\n ? { ...m, toolCallIds: [...(m.toolCallIds ?? []), e.toolCallId], delivery }\n : m,\n );\n }\n return [...prev, { id: parentId, role: 'assistant', content: '', toolCallIds: [e.toolCallId], delivery }];\n });\n }\n return;\n }\n case 'TOOL_CALL_ARGS': {\n const e = event as unknown as { toolCallId: string; delta: string };\n // Deltas are FRAGMENTS of a JSON document, not standalone JSON: a live\n // model streams args token-by-token (`{\"loca`, `tion\":\"Pa`, …), so we\n // accumulate the raw text and parse the accumulated buffer. Until the\n // buffer parses, keep the last-good args (initially {}).\n const buffers = (store.argsBuffers ??= new Map<string, string>());\n const buffer = (buffers.get(e.toolCallId) ?? '') + e.delta;\n buffers.set(e.toolCallId, buffer);\n const args = tryParseArgs(buffer);\n if (args !== undefined) {\n store.toolCalls.update((prev) =>\n prev.map((t) => t.id === e.toolCallId ? { ...t, args } : t),\n );\n }\n return;\n }\n case 'TOOL_CALL_END': {\n const e = event as unknown as { toolCallId: string };\n // Belt and braces: apply the final accumulated args (in case the last\n // ARGS delta arrived but an intermediate state was left unparsed), then\n // drop the buffer.\n const finalBuffer = store.argsBuffers?.get(e.toolCallId);\n store.argsBuffers?.delete(e.toolCallId);\n const finalArgs = finalBuffer !== undefined ? tryParseArgs(finalBuffer) : undefined;\n store.toolCalls.update((prev) =>\n prev.map((t) =>\n t.id === e.toolCallId\n ? { ...t, status: 'complete', ...(finalArgs !== undefined ? { args: finalArgs } : {}) }\n : t,\n ),\n );\n return;\n }\n case 'TOOL_CALL_RESULT': {\n const e = event as unknown as { toolCallId: string; content: unknown };\n // ag_ui_langgraph serialises tool results via normalize_tool_content()\n // which always returns a string. Parse it so downstream consumers\n // (chat-tool-views / toToolViewSpec) can spread the object into props.\n const result = typeof e.content === 'string' ? safeParseJson(e.content) : e.content;\n store.toolCalls.update((prev) =>\n prev.map((t) => t.id === e.toolCallId ? { ...t, result } : t),\n );\n return;\n }\n case 'STATE_SNAPSHOT': {\n const e = event as unknown as { snapshot: Record<string, unknown> };\n const snapshot = e.snapshot ?? {};\n store.state.set(snapshot);\n store.messages.update(msgs => bridgeCitationsState({ state: snapshot }, msgs));\n return;\n }\n case 'STATE_DELTA': {\n const e = event as unknown as { delta: JsonPatchOp[] };\n const next = applyPatch(deepClone(store.state()), e.delta);\n store.state.set(next);\n store.messages.update(msgs => bridgeCitationsState({ state: next }, msgs));\n return;\n }\n case 'MESSAGES_SNAPSHOT': {\n const e = event as unknown as { messages: AgUiSnapshotMessage[] };\n const raw = e.messages ?? [];\n const run = store.deliveryRun?.outcome === undefined ? store.deliveryRun : null;\n const canonicalAssistantId = resolveCanonicalAssistantId(raw, run);\n const activeCanonicalAssistantId = canonicalAssistantId\n && ownAssistantMessage(store, canonicalAssistantId)\n ? canonicalAssistantId\n : undefined;\n const previousById = new Map(store.messages().map(message => [message.id, message]));\n // AG-UI AssistantMessage carries `toolCalls` (ToolCall objects) on the\n // snapshot wire. Bridge them to `toolCallIds` so that the chat lib's\n // per-message tool-call resolution (resolveMessageToolCalls) can scope\n // correctly. Also merge any snapshot-only tool calls into store.toolCalls\n // so the data is visible to <chat-tool-views>.\n const snapshotToolCalls: ToolCall[] = [];\n const messages: Message[] = raw.map((m) => {\n const previous = previousById.get(m.id);\n const completedMessage = m.id !== activeCanonicalAssistantId\n && previous?.delivery.phase === 'complete'\n && (\n !run\n || run.ownedMessageIds.has(m.id)\n || run.snapshotReplacementIds.has(m.id)\n )\n ? previous\n : undefined;\n let delivery = previous?.delivery ?? staticDelivery(m.id);\n let snapshotMessage: Omit<Message, 'delivery'>;\n if (m.role !== 'assistant' || !m.toolCalls || m.toolCalls.length === 0) {\n snapshotMessage = m as unknown as Omit<Message, 'delivery'>;\n } else {\n const ids: string[] = [];\n for (const tc of m.toolCalls) {\n ids.push(tc.id);\n snapshotToolCalls.push({\n id: tc.id,\n name: tc.function.name,\n args: safeParseArgs(tc.function.arguments),\n status: 'complete',\n });\n }\n const { toolCalls: _dropped, ...rest } = m;\n snapshotMessage = { ...rest, toolCallIds: ids } as unknown as Omit<Message, 'delivery'>;\n }\n if (completedMessage) {\n const snapshotChanged = completedMessage.content !== snapshotMessage.content\n || !sameStringArray(completedMessage.toolCallIds, snapshotMessage.toolCallIds);\n if (!snapshotChanged) return completedMessage;\n\n run?.snapshotReplacementIds.add(m.id);\n return {\n ...completedMessage,\n ...snapshotMessage,\n delivery: completeDelivery(\n store.allocateDeliveryGeneration(`snapshot:${m.id}`),\n 'success',\n ),\n } as Message;\n }\n if (run && (run.ownedMessageIds.has(m.id) || m.id === canonicalAssistantId)) {\n delivery = delivery.generation === run.generation && delivery.phase === 'complete'\n ? delivery\n : streamingDelivery(run.generation);\n run.ownedMessageIds.add(m.id);\n if (m.id === activeCanonicalAssistantId) run.currentAssistantMessageId = m.id;\n }\n return { ...snapshotMessage, delivery } as Message;\n });\n const currentAssistant = run?.currentAssistantMessageId\n ? previousById.get(run.currentAssistantMessageId)\n : undefined;\n if (\n run\n && currentAssistant?.delivery.generation === run.generation\n && currentAssistant.delivery.phase === 'streaming'\n && !messages.some(message => message.id === currentAssistant.id)\n ) {\n messages.push(currentAssistant);\n }\n // Re-apply per-message citations from the already-received STATE. A\n // MESSAGES_SNAPSHOT replaces the streamed messages wholesale — and the\n // final snapshot message id (str(AIMessage.id), e.g. \"resp-…\") differs\n // from the streaming chunk id the earlier STATE_SNAPSHOT bridged against,\n // so without re-bridging here the citations (keyed by the final id) would\n // be dropped on the message swap.\n store.messages.set(bridgeCitationsState({ state: store.state() }, messages));\n if (snapshotToolCalls.length > 0) {\n store.toolCalls.update((prev) => {\n // Merge: keep existing entries (they may carry richer state from\n // streaming) and only insert entries not already present by id.\n const existingIds = new Set(prev.map((tc) => tc.id));\n const toAdd = snapshotToolCalls.filter((tc) => !existingIds.has(tc.id));\n return toAdd.length > 0 ? [...prev, ...toAdd] : prev;\n });\n }\n return;\n }\n case 'CUSTOM': {\n const e = event as unknown as { name: string; value: unknown };\n // ag_ui_langgraph serializes interrupt payloads as JSON strings.\n // Parse the value if it arrives as a string so downstream consumers\n // (e.g. ChatApprovalCardComponent) receive a plain object, not a string.\n const parsedValue = typeof e.value === 'string' ? safeParseJson(e.value) : e.value;\n if (e.name === 'on_interrupt') {\n const run = currentRunForEvent(event, store);\n if (store.deliveryRun && !run) return;\n store.interrupt.set({ id: randomId(), value: parsedValue, resumable: true });\n if (run && finalizeDeliveryRun(store, run, 'paused')) {\n store.status.set('idle');\n store.isLoading.set(false);\n }\n return;\n }\n // Surface every other custom event on the customEvents signal so the\n // chat a2ui partial-args bridge (which reads agent.customEvents()) lights\n // up live/progressive a2ui rendering — parity with the LangGraph adapter.\n store.customEvents.update((prev) => [...prev, { name: e.name, data: parsedValue }]);\n if (e.name === 'state_update' && isRecord(parsedValue)) {\n store.events$.next({ type: 'state_update', data: parsedValue });\n } else {\n store.events$.next({ type: 'custom', name: e.name, data: parsedValue });\n }\n return;\n }\n case 'ACTIVITY_SNAPSHOT': {\n const e = event as unknown as {\n messageId: string; activityType: string;\n content: Record<string, unknown>; replace?: boolean;\n };\n const map = new Map(store.activities());\n const existing = map.get(e.messageId);\n if (existing && existing.activityType === e.activityType) {\n if (e.replace) existing.content.set(e.content ?? {});\n else existing.content.update((c) => ({ ...c, ...e.content }));\n } else {\n map.set(e.messageId, {\n messageId: e.messageId,\n activityType: e.activityType,\n generation: store.allocateDeliveryGeneration(`activity:${e.messageId}`),\n content: signal<Record<string, unknown>>(e.content ?? {}),\n });\n }\n store.activities.set(map); // new ref → projection picks up membership change\n return;\n }\n case 'ACTIVITY_DELTA': {\n const e = event as unknown as {\n messageId: string; patch: readonly JsonPatchOp[];\n };\n const entry = store.activities().get(e.messageId);\n if (!entry) return; // unknown activity — ignore\n entry.content.update((c) => {\n try {\n return applyPatch(c, e.patch);\n } catch (err) {\n // A malformed/out-of-order ACTIVITY_DELTA must not break the stream — drop it.\n if (typeof console !== 'undefined') console.warn('[ag-ui] dropping malformed ACTIVITY_DELTA patch', err);\n return c;\n }\n }); // inner signal → live, no map churn\n return;\n }\n default: {\n // Unknown event types are ignored; AG-UI may add new ones in\n // future protocol versions. We surface them as no-ops rather\n // than throwing, so a partial-version mismatch doesn't crash.\n return;\n }\n }\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2);\n}\n\nfunction eventRunId(event: BaseEvent): string | undefined {\n const runId = (event as { runId?: unknown }).runId;\n return typeof runId === 'string' ? runId : undefined;\n}\n\nfunction bindRunId(event: BaseEvent, run: ReducerDeliveryRun): boolean {\n const runId = eventRunId(event);\n if (!runId) return true;\n if (run.protocolRunId && run.protocolRunId !== runId) return false;\n run.protocolRunId = runId;\n return true;\n}\n\nfunction currentRunForEvent(event: BaseEvent, store: ReducerStore): ReducerDeliveryRun | null {\n const run = store.deliveryRun;\n if (!run || !bindRunId(event, run)) return null;\n return run;\n}\n\nfunction ownAssistantMessage(store: ReducerStore, id: string) {\n const run = store.deliveryRun;\n if (!run || run.outcome !== undefined) return undefined;\n const currentId = run.currentAssistantMessageId;\n if (currentId && currentId !== id) {\n if (run.ownedMessageIds.has(id)) return undefined;\n store.messages.update(messages => messages.map(message =>\n message.id === currentId\n && message.delivery.generation === run.generation\n && message.delivery.phase === 'streaming'\n ? { ...message, delivery: completeDelivery(run.generation, 'success') }\n : message,\n ));\n }\n run.ownedMessageIds.add(id);\n run.currentAssistantMessageId = id;\n return streamingDelivery(run.generation);\n}\n\nfunction sameStringArray(left?: string[], right?: string[]): boolean {\n if (left === right) return true;\n if (!left || !right || left.length !== right.length) return false;\n return left.every((value, index) => value === right[index]);\n}\n\nfunction resolveCanonicalAssistantId(\n messages: readonly AgUiSnapshotMessage[],\n run: ReducerDeliveryRun | null,\n): string | undefined {\n if (!run) return undefined;\n if (\n run.currentAssistantMessageId\n && messages.some(message => message.id === run.currentAssistantMessageId)\n ) {\n return run.currentAssistantMessageId;\n }\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role === 'assistant' && !run.baselineMessageIds.has(message.id)) {\n return message.id;\n }\n }\n return run.eligibleBaselineAssistantId\n && messages.some(message =>\n message.role === 'assistant' && message.id === run.eligibleBaselineAssistantId\n )\n ? run.eligibleBaselineAssistantId\n : undefined;\n}\n\nfunction messageIdFrom(event: BaseEvent): string {\n return (event as { messageId?: string }).messageId ?? 'unknown';\n}\n\nfunction safeParseArgs(delta: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(delta);\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\n/** Parse an (accumulated) args buffer; `undefined` when it isn't valid JSON\n * yet — callers keep the previous args rather than clobbering them with {}. */\nfunction tryParseArgs(buffer: string): Record<string, unknown> | undefined {\n try {\n const parsed = JSON.parse(buffer);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Parse a JSON string to its value; return the original string on failure. */\nfunction safeParseJson(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return s;\n }\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction deepClone<T>(v: T): T {\n return JSON.parse(JSON.stringify(v));\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal } from '@angular/core';\nimport type { AbstractAgent } from '@ag-ui/client';\nimport type { Tool, Message } from '@ag-ui/core';\nimport {\n selectPendingClientToolCalls,\n type ClientToolsCapability,\n type ClientToolResult,\n type ClientToolSpec,\n} from '@threadplane/chat';\nimport type { ReducerStore } from './reducer';\n\n/**\n * Minimal subset of AbstractAgent used by createClientToolsCapability.\n * Typed narrowly so the factory is easy to fake in tests.\n */\nexport interface ClientToolsSource {\n addMessage(message: Parameters<AbstractAgent['addMessage']>[0]): void;\n}\n\nexport type ContinueClientToolRun = () => Promise<void>;\n\n/** Convert a ClientToolSpec to the AG-UI Tool wire shape. */\nfunction toAgUiTool(spec: ClientToolSpec): Tool {\n return { name: spec.name, description: spec.description, parameters: spec.parameters };\n}\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 * Creates a ClientToolsCapability backed by an AG-UI source agent and a\n * ReducerStore. Extracted into a factory so it can be unit-tested in isolation\n * without standing up a full Angular DI environment.\n *\n * The capability:\n * - Maintains a catalog of client tool specs (setCatalog).\n * - Exposes a `pending` computed signal: tool calls whose name is in the catalog,\n * have no backend result, and haven't been resolved client-side yet — but ONLY\n * when the run is not in progress (isLoading===false). The backend ends the run\n * without emitting TOOL_CALL_RESULT for client tools, so result stays undefined.\n * - settle(id, result): marks the call as resolved, writes the outcome onto\n * the local ToolCall in the store (so the transcript freezes: the mounted\n * ask component re-renders with its emitted value as props and can branch to\n * a frozen state), and adds a ToolMessage via source.addMessage without\n * starting a run.\n * - flush(): no-op. settle() already made the result durable by adding it to\n * the source's message list, so there is nothing left to write.\n * - resolve(id, result): settles the result, then requests a continuation\n * through the adapter-owned run gateway. Any ToolMessages previously\n * settled into the source are flushed by that single run.\n *\n * Call catalogAsAgUiTools() to get the current catalog as AG-UI Tool[] for\n * attaching to each adapter-owned run.\n */\nexport function createClientToolsCapability(\n source: ClientToolsSource,\n store: ReducerStore,\n continueRun: ContinueClientToolRun,\n): ClientToolsCapability & { catalogAsAgUiTools(): Tool[] } {\n const catalog = signal<readonly ClientToolSpec[]>([]);\n const resolvedIds = signal<ReadonlySet<string>>(new Set());\n\n function catalogAsAgUiTools(): Tool[] {\n return catalog().map(toAgUiTool);\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 // Write the outcome onto the LOCAL ToolCall in the store. The client tool\n // DID produce a result client-side, so this is semantically correct — and\n // it freezes the transcript card: toToolViewSpec spreads `{...args,\n // ...result, status}` into the mounted ask component, so the component\n // re-renders with its own emitted value as props and can branch to a\n // resolved/frozen state. The backend ToolMessage never reaches this local\n // ToolCall, so without this write the card stays interactive forever.\n const ok = result.ok;\n const value = (result as { value: unknown }).value;\n const error = (result as { error: string }).error;\n store.toolCalls.update((calls) =>\n calls.map((tc) =>\n tc.id === id\n ? {\n ...tc,\n result: ok ? value : { error },\n ...(ok ? {} : { error, status: 'error' as const }),\n }\n : tc,\n ),\n );\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 content = ok\n ? safeStringify(value)\n : `Error: ${error}`;\n\n source.addMessage({\n id: `tool-${id}`,\n role: 'tool',\n toolCallId: id,\n content,\n } as Message);\n }\n\n const clientTools: ClientToolsCapability & { catalogAsAgUiTools(): Tool[] } = {\n setCatalog(specs: readonly ClientToolSpec[]): void {\n catalog.set([...specs]);\n },\n\n pending: computed(() => {\n // Client tools are only actionable after the run ends (backend signals it\n // by ending the run WITHOUT emitting TOOL_CALL_RESULT 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 settle(id: string, result: ClientToolResult): void {\n settleResult(id, result);\n },\n\n // AG-UI's settle() already calls source.addMessage(), which places the\n // ToolMessage in the outgoing message list. Nothing further is needed to\n // make it durable — the next run carries it.\n flush(): void {\n /* no-op: settle() is already durable */\n },\n\n resolve(id: string, result: ClientToolResult): void {\n settleResult(id, result);\n void continueRun();\n },\n\n catalogAsAgUiTools,\n };\n\n return clientTools;\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal, type Signal } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport type { AbstractAgent } from '@ag-ui/client';\nimport {\n completeDelivery,\n staticDelivery,\n streamingDelivery,\n toAgentError,\n isAbortError,\n type AgentError,\n} from '@threadplane/chat';\nimport type {\n Agent, Message, AgentStatus, ToolCall, AgentEvent,\n AgentInterrupt,\n AgentRuntimeTelemetryEvent,\n AgentRuntimeTelemetryProperties,\n AgentRuntimeTelemetrySink,\n AgentSubmitInput, AgentSubmitOptions,\n ClientToolsCapability,\n Subagent, SubagentStatus,\n} from '@threadplane/chat';\nimport {\n finalizeDeliveryRun,\n reduceEvent,\n type ReducerDeliveryRun,\n type ReducerStore,\n type CustomStreamEvent,\n type ActivityEntry,\n} from './reducer';\nimport { createClientToolsCapability } from './client-tools';\n\nexport interface ToAgentOptions {\n /** Optional app-owned telemetry sink. No telemetry is emitted unless this is provided. */\n telemetry?: AgentRuntimeTelemetrySink | false;\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 adapter 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\n/**\n * The neutral Agent contract, widened with the AG-UI adapter's\n * `customEvents` signal (the chat composition feature-detects it to enable\n * live a2ui streaming), the browser client-tools capability, and concrete\n * ACTIVITY-backed `subagents`.\n * Mirrors langgraph's LangGraphAgent extension where the protocol surfaces\n * overlap.\n */\nexport interface AgUiAgent<TState = Record<string, unknown>> extends Agent<TState> {\n customEvents: Signal<CustomStreamEvent[]>;\n clientTools: ClientToolsCapability;\n /** Subagent activities (activityType==='subagent') projected to the neutral\n * Subagent contract, keyed by messageId. Narrows the base Agent's optional\n * `subagents?` to a concrete signal for AG-UI consumers. */\n subagents: Signal<Map<string, Subagent>>;\n}\n\n/**\n * Wraps an AG-UI AbstractAgent into the runtime-neutral Agent contract.\n *\n * The adapter subscribes to source.subscribe({ onEvent }) and reduces every\n * event into the produced Agent's signals. submit() optimistically appends the\n * user message to both our signals and the source agent's internal message\n * list, then calls source.runAgent(). stop() calls source.abortRun().\n *\n * Subscription cleanup: the returned Agent does NOT manage its own lifetime.\n * Callers using DI should rely on the provider's destroy hook; direct callers\n * of toAgent() should treat the returned object's lifecycle as tied to the\n * agent instance they constructed. The subscriber registered via\n * source.subscribe() will fire for the lifetime of source.\n *\n * @example\n * ```ts\n * import { HttpAgent } from '@ag-ui/client';\n * import { toAgent } from '@threadplane/ag-ui';\n *\n * const agent = toAgent(new HttpAgent({ url: '/api/agent' }));\n * ```\n */\nexport function toAgent(source: AbstractAgent, options: ToAgentOptions = {}): AgUiAgent {\n let generationSequence = 0;\n const allocateDeliveryGeneration = (scope: string): string =>\n `${scope}-${++generationSequence}-${Math.random().toString(36).slice(2, 10)}`;\n const store: ReducerStore = {\n messages: signal<Message[]>([]),\n status: signal<AgentStatus>('idle'),\n isLoading: signal<boolean>(false),\n error: signal<AgentError | undefined>(undefined),\n toolCalls: signal<ToolCall[]>([]),\n state: signal<Record<string, unknown>>({}),\n interrupt: signal<AgentInterrupt | undefined>(undefined),\n events$: new Subject<AgentEvent>(),\n customEvents: signal<CustomStreamEvent[]>([]),\n activities: signal<Map<string, ActivityEntry>>(new Map()),\n deliveryRun: null,\n allocateDeliveryGeneration,\n };\n const telemetryProperties = { transport: 'ag-ui' as const, surface: 'to_agent' };\n interface AdapterRun extends ReducerDeliveryRun {\n startedAt: number;\n telemetrySettled: boolean;\n }\n let activeRun: AdapterRun | null = null;\n const runsByProtocolId = new Map<string, AdapterRun>();\n\n // Tracks the last AgentSubmitInput so retry() can re-run it without\n // duplicating the user message. Set at the top of submit()'s message path.\n let lastInput: AgentSubmitInput | undefined;\n\n function resolveCallbackRun(protocolRunId: string | undefined): AdapterRun | null {\n if (!protocolRunId) return activeRun;\n const known = runsByProtocolId.get(protocolRunId);\n if (known) return known;\n if (!activeRun || activeRun.protocolRunId) return null;\n activeRun.protocolRunId = protocolRunId;\n runsByProtocolId.set(protocolRunId, activeRun);\n while (runsByProtocolId.size > 16) {\n const oldestId = runsByProtocolId.keys().next().value as string | undefined;\n if (!oldestId) break;\n if (runsByProtocolId.get(oldestId) === activeRun) {\n const current = runsByProtocolId.get(oldestId)!;\n runsByProtocolId.delete(oldestId);\n runsByProtocolId.set(oldestId, current);\n continue;\n }\n runsByProtocolId.delete(oldestId);\n }\n return activeRun;\n }\n\n /** Forward a neutral-contract state patch onto the AG-UI run input.\n * Mirrors the canonical demo's `input.state` mechanism: the patch is\n * merged into the source agent's client state (carried on\n * RunAgentInput.state) and reflected optimistically in the local\n * state signal — the server's next STATE_SNAPSHOT stays authoritative. */\n const applyStatePatch = (patch: Record<string, unknown> | undefined): void => {\n if (!patch || Object.keys(patch).length === 0) return;\n source.state = { ...((source.state as Record<string, unknown>) ?? {}), ...patch };\n store.state.update((prev) => ({ ...prev, ...patch }));\n };\n\n captureAgentRuntimeTelemetry(\n options.telemetry,\n 'tplane:runtime_instance_created',\n telemetryProperties,\n );\n\n function beginRun(requestType: string, allowBaselineTail = false): AdapterRun {\n if (activeRun && activeRun.outcome === undefined) {\n const supersededRun = activeRun;\n finalizeDeliveryRun(store, supersededRun, 'interrupted');\n const interruption = new Error('Run superseded by a newer request');\n interruption.name = 'InterruptedError';\n failRunTelemetry(interruption, supersededRun);\n }\n const run: AdapterRun = {\n generation: allocateDeliveryGeneration('run'),\n baselineMessageIds: new Set(store.messages().map(message => message.id)),\n ownedMessageIds: new Set(),\n snapshotReplacementIds: new Set(),\n eligibleBaselineAssistantId: allowBaselineTail\n ? getTailAssistantMessageId(store.messages())\n : undefined,\n startedAt: Date.now(),\n telemetrySettled: false,\n };\n activeRun = run;\n store.deliveryRun = run;\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:runtime_request_created', {\n ...telemetryProperties,\n requestType,\n });\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);\n return run;\n }\n\n function finishRunTelemetry(run: AdapterRun): void {\n if (run.telemetrySettled) return;\n run.telemetrySettled = true;\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {\n ...telemetryProperties,\n durationMs: Date.now() - run.startedAt,\n });\n }\n\n function failRunTelemetry(error: unknown, run: AdapterRun | null = activeRun): void {\n if (!run || run.telemetrySettled) return;\n run.telemetrySettled = true;\n captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {\n ...telemetryProperties,\n durationMs: Date.now() - run.startedAt,\n errorClass: agentRuntimeTelemetryErrorClass(error),\n });\n }\n\n function failRun(run: AdapterRun, error: unknown): void {\n if (run.outcome !== undefined) return;\n finalizeDeliveryRun(store, run, 'error');\n if (activeRun === run) {\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(toAgentError(error));\n }\n failRunTelemetry(error, run);\n }\n\n function settleTransportClose(run: AdapterRun): void {\n if (run.outcome === undefined) {\n finalizeDeliveryRun(store, run, run.ownedMessageIds.size > 0 ? 'interrupted' : 'success');\n if (activeRun === run) {\n store.status.set('idle');\n store.isLoading.set(false);\n store.error.set(undefined);\n }\n }\n finishRunTelemetry(run);\n }\n\n type RunParameters = Parameters<AbstractAgent['runAgent']>[0];\n\n async function executeRun(\n requestType: string,\n parameters?: RunParameters,\n allowBaselineTail = false,\n ): Promise<void> {\n const run = beginRun(requestType, allowBaselineTail);\n const tools = clientToolsCap.catalogAsAgUiTools();\n const runParameters = parameters === undefined && tools.length === 0\n ? undefined\n : { ...parameters, ...(tools.length > 0 ? { tools } : {}) };\n try {\n await source.runAgent(runParameters);\n settleTransportClose(run);\n } catch (err) {\n if (run.outcome === 'aborted' && isAbortError(err)) return;\n failRun(run, err);\n }\n }\n\n const clientToolsCap = createClientToolsCapability(\n source,\n store,\n () => executeRun('client-tool-continuation', undefined, true),\n );\n\n // Tap all events from the source agent via the AgentSubscriber API.\n // This subscription lives for the lifetime of `source`.\n source.subscribe({\n onRunInitialized({ input }) {\n resolveCallbackRun(input.runId);\n },\n onEvent({ event, input }) {\n const callbackRunId = input?.runId ?? (event as { runId?: string }).runId;\n const run = resolveCallbackRun(callbackRunId);\n if (!run) {\n if (!callbackRunId) reduceEvent(event, store);\n return;\n }\n if (run !== activeRun) {\n if (event.type === 'RUN_FINISHED') finalizeDeliveryRun(store, run, 'success');\n else if (event.type === 'RUN_ERROR') finalizeDeliveryRun(store, run, 'error');\n return;\n }\n if (event.type === 'RUN_ERROR' && run.outcome === 'aborted') return;\n reduceEvent(event, store);\n if (run && event.type === 'RUN_FINISHED' && run.outcome === 'success') {\n finishRunTelemetry(run);\n } else if (run && event.type === 'RUN_ERROR' && run.outcome === 'error') {\n failRunTelemetry((event as { message?: unknown }).message ?? event, run);\n }\n },\n onRunFailed({ error, input }) {\n const run = resolveCallbackRun(input?.runId);\n if (run) {\n if (run.outcome === 'aborted' && isAbortError(error)) return;\n failRun(run, error);\n return;\n }\n if (input?.runId) return;\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(toAgentError(error));\n },\n });\n\n // Stable Subagent wrappers per messageId so chat-subagents (tracks by\n // toolCallId) doesn't churn as activity content streams.\n const subagentWrappers = new Map<string, { generation: string; wrapper: Subagent }>();\n function subagentFor(id: string, entry: ActivityEntry): Subagent {\n const cached = subagentWrappers.get(id);\n let w = cached?.generation === entry.generation ? cached.wrapper : undefined;\n if (!w) {\n w = {\n toolCallId: (entry.content()['toolCallId'] as string) ?? id,\n name: entry.content()['name'] as string | undefined,\n status: computed(() => (entry.content()['status'] as SubagentStatus) ?? 'running'),\n messages: computed<Message[]>(() => {\n const c = entry.content();\n const status = (c['status'] as SubagentStatus) ?? 'running';\n const assistantDelivery = status === 'error'\n ? completeDelivery(entry.generation, 'error')\n : status === 'complete'\n ? completeDelivery(entry.generation, 'success')\n : streamingDelivery(entry.generation);\n const raw = c['messages'];\n if (Array.isArray(raw)) {\n return (raw as Array<Record<string, unknown>>).map((m, i) => {\n const messageId = (m['id'] as string) ?? `${id}-${i}`;\n return {\n id: messageId,\n role: 'assistant' as Message['role'],\n content: typeof m['content'] === 'string' ? (m['content'] as string) : (m['content'] as Message['content']) ?? '',\n delivery: m['role'] === 'assistant' ? assistantDelivery : staticDelivery(messageId),\n ...(Array.isArray(m['toolCallIds']) ? { toolCallIds: m['toolCallIds'] as string[] } : {}),\n ...(typeof m['reasoning'] === 'string' ? { reasoning: m['reasoning'] as string } : {}),\n };\n });\n }\n return [{ id, role: 'assistant', content: String(c['text'] ?? ''), delivery: assistantDelivery }];\n }),\n toolCalls: computed<ToolCall[]>(() => {\n const raw = entry.content()['toolCalls'];\n return Array.isArray(raw) ? (raw as ToolCall[]) : [];\n }),\n state: computed(() => (entry.content()['state'] as Record<string, unknown>) ?? {}),\n };\n subagentWrappers.set(id, { generation: entry.generation, wrapper: w });\n }\n return w;\n }\n\n return {\n messages: store.messages,\n status: store.status,\n isLoading: store.isLoading,\n error: store.error,\n toolCalls: store.toolCalls,\n state: store.state,\n interrupt: store.interrupt,\n events$: store.events$.asObservable(),\n customEvents: store.customEvents,\n subagents: computed<Map<string, Subagent>>(() => {\n const out = new Map<string, Subagent>();\n for (const [id, entry] of store.activities()) {\n if (entry.activityType !== 'subagent') continue;\n out.set(id, subagentFor(id, entry));\n }\n // Prune stale wrappers: keeps the cache bounded and prevents a reused\n // tool-call-id from binding to an orphaned (pre-RUN_STARTED) content signal.\n for (const id of subagentWrappers.keys()) {\n if (!out.has(id)) subagentWrappers.delete(id);\n }\n return out;\n }),\n clientTools: clientToolsCap,\n\n submit: async (input: AgentSubmitInput, _opts?: AgentSubmitOptions) => {\n if (input.resume !== undefined) {\n // Resume path: clear the pending interrupt and replay the run with the\n // resume payload forwarded to the LangGraph backend via AG-UI's\n // forwardedProps.command.resume mechanism.\n applyStatePatch(input.state);\n store.interrupt.set(undefined);\n await executeRun(\n 'resume',\n { forwardedProps: { command: { resume: input.resume } } },\n true,\n );\n return;\n }\n\n applyStatePatch(input.state);\n\n // Optimistic append of user message to our signals and to the source\n // agent's own message list so runAgent() sees the new message.\n const userMsg = buildUserMessage(input);\n if (userMsg) {\n store.messages.update((prev) => [...prev, userMsg]);\n // Sync to AG-UI source so it's included in the next run's input.\n source.addMessage(userMsg as Parameters<typeof source.addMessage>[0]);\n }\n\n // Record the input so retry() can re-run it without re-appending the\n // user message (the message is already in the list by this point).\n lastInput = input;\n\n await executeRun('submit');\n },\n\n retry: async () => {\n if (store.isLoading()) return; // no-op while a run is in flight\n if (lastInput === undefined) return; // nothing to retry\n store.error.set(undefined);\n // Re-run the same message list against the source without appending a\n // duplicate user message — the message is already in store.messages and\n // source's internal list from the original submit().\n await executeRun('retry', undefined, true);\n },\n\n stop: async () => {\n const run = activeRun;\n if (run && run.outcome === undefined) {\n finalizeDeliveryRun(store, run, 'aborted');\n store.status.set('idle');\n store.isLoading.set(false);\n store.error.set(undefined);\n finishRunTelemetry(run);\n }\n source.abortRun();\n },\n\n regenerate: async (assistantMessageIndex: number): Promise<void> => {\n if (store.isLoading()) {\n throw new Error('Cannot regenerate while agent is loading another response');\n }\n const msgs = store.messages();\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 // Truncate local message buffer INCLUSIVE of the user message. This\n // preserves the user message in the UI (replace-semantics) while the\n // new assistant response streams in. The trailing user message becomes\n // the active prompt for the next run — we must NOT re-add it.\n const trimmed = msgs.slice(0, userIdx + 1);\n store.messages.set(trimmed);\n\n // Sync the trimmed list back to the source agent so its internal state\n // matches what we're about to re-run. source.setMessages() replaces the\n // agent's internal message list without appending — the trailing user\n // message in `trimmed` becomes the active prompt for the next run.\n source.setMessages(trimmed as Parameters<typeof source.setMessages>[0]);\n\n await executeRun('regenerate');\n },\n };\n}\n\nfunction buildUserMessage(input: AgentSubmitInput): Message | undefined {\n if (input.message === undefined) return undefined;\n const content = typeof input.message === 'string'\n ? input.message\n : input.message.map((b) => b.type === 'text' ? b.text : JSON.stringify(b)).join('');\n const id = randomId();\n return { id, role: 'user', content, delivery: staticDelivery(id) };\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2);\n}\n\nfunction getTailAssistantMessageId(messages: readonly Message[]): string | undefined {\n const tail = messages[messages.length - 1];\n return tail?.role === 'assistant' ? tail.id : undefined;\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken, inject, type Provider } from '@angular/core';\nimport { HttpAgent } from '@ag-ui/client';\nimport type { AgentRef, AgentRuntimeTelemetrySink } from '@threadplane/chat';\nimport { toAgent, type AgUiAgent } from './to-agent';\n\n/**\n * Connection options for the AG-UI agent provider, passed to {@link provideAgent}.\n * Mirrors the underlying `HttpAgent` config (`@ag-ui/client`) plus an optional\n * telemetry sink.\n */\nexport interface AgentConfig {\n /** Endpoint URL of the AG-UI HTTP agent (e.g. `'http://localhost:8000/agent'`). Required. */\n url: string;\n /** Agent identifier, when the endpoint serves more than one agent. */\n agentId?: string;\n /** Thread to connect to on start; omit to begin a fresh conversation. */\n threadId?: string;\n /** Extra HTTP headers sent with every request (e.g. auth tokens). */\n headers?: Record<string, string>;\n /** Optional app-owned telemetry sink. No telemetry is emitted unless this is provided. */\n telemetry?: AgentRuntimeTelemetrySink | false;\n}\n\n/**\n * @internal — exported for spec access only. Consumers must use injectAgent().\n * Both `provideAgent` and `provideFakeAgent` register the result of `toAgent()`,\n * which is always an `AgUiAgent`, so the token is typed accordingly.\n */\nexport const AGENT = new InjectionToken<AgUiAgent>('AGENT');\n\n/** @internal — shared factory for building an AgUiAgent from an AgentConfig or factory. */\nfunction buildAgUiAgent(configOrFactory: AgentConfig | (() => AgentConfig)): AgUiAgent {\n // useFactory runs in an injection context, so a config factory may\n // call inject() to read runtime/DI state.\n const config =\n typeof configOrFactory === 'function' ? configOrFactory() : configOrFactory;\n const source = new HttpAgent({\n url: config.url,\n ...(config.agentId !== undefined ? { agentId: config.agentId } : {}),\n ...(config.threadId !== undefined ? { threadId: config.threadId } : {}),\n ...(config.headers !== undefined ? { headers: config.headers } : {}),\n });\n return toAgent(source, { telemetry: config.telemetry });\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 * Provides an Agent instance wired through HttpAgent and toAgent.\n * Constructs an HttpAgent from config and wraps it in the runtime-neutral\n * Agent contract via toAgent(). Returns a provider array suitable for\n * bootstrapApplication or TestBed.configureTestingModule().\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 or route params.\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 Typed state via AgentRef\n * ```ts\n * interface TripState { day: number; places: string[]; }\n * export const TRIP = createAgentRef<TripState>('trip');\n * // app.config.ts:\n * providers: [provideAgent(TRIP, { url: 'http://localhost:8000/agent' })]\n * // component:\n * const agent = injectAgent(TRIP); // AgUiAgent<TripState>\n * ```\n */\nexport function provideAgent<T = Record<string, unknown>>(\n ref: AgentRef<T>,\n configOrFactory: AgentConfig | (() => AgentConfig),\n): Provider[];\nexport function provideAgent(\n configOrFactory: AgentConfig | (() => AgentConfig),\n): Provider[];\nexport function provideAgent<T = Record<string, unknown>>(\n refOrConfig: AgentRef<T> | AgentConfig | (() => AgentConfig),\n maybeConfig?: AgentConfig | (() => AgentConfig),\n): Provider[] {\n const ref = isAgentRef<T>(refOrConfig) ? refOrConfig : undefined;\n const configOrFactory = (ref ? maybeConfig : refOrConfig) as AgentConfig | (() => AgentConfig);\n const providers: Provider[] = [\n { provide: AGENT, useFactory: () => buildAgUiAgent(configOrFactory) },\n ];\n if (ref) providers.push({ provide: ref.token, useExisting: AGENT });\n return providers;\n}\n\n/**\n * Injects the AG-UI agent from Angular's dependency injection container.\n * Use this in components or services provided via `provideAgent()` (or\n * `provideFakeAgent()`).\n *\n * Returns an `AgUiAgent` — the runtime-neutral `Agent` contract plus the\n * AG-UI-specific `customEvents` signal — so `customEvents` is reachable\n * directly, without casting.\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 * `AgUiAgent<Record<string, unknown>>`.\n *\n * @example Typed state via AgentRef\n * ```ts\n * const agent = injectAgent(TRIP); // AgUiAgent<TripState>\n * ```\n */\nexport function injectAgent(): AgUiAgent;\nexport function injectAgent<T>(ref: AgentRef<T>): AgUiAgent<T>;\nexport function injectAgent<T>(ref?: AgentRef<T>): AgUiAgent<T> {\n return inject(ref ? ref.token : AGENT) as AgUiAgent<T>;\n}\n","// libs/ag-ui/src/lib/testing/fake-agent.ts\n// SPDX-License-Identifier: MIT\nimport {\n AbstractAgent,\n EventType,\n type BaseEvent,\n type RunAgentInput,\n} from '@ag-ui/client';\nimport { Observable } from 'rxjs';\n\ntype FakeAgentScriptWhen =\n | 'initial'\n | { toolMessageFor: string };\n\ninterface FakeAgentScriptBranch {\n when: FakeAgentScriptWhen;\n events: readonly BaseEvent[];\n}\n\n/**\n * In-process AG-UI agent that emits a canned streaming response.\n *\n * Use for offline demos and tests where a real backend isn't available.\n * Echoes a fixed assistant reply token-by-token with realistic timing.\n *\n * NOT for production use.\n */\nexport class FakeAgent extends AbstractAgent {\n /**\n * Tokens streamed back as the assistant reply. Override with custom\n * tokens via the constructor for varied demo content.\n */\n private readonly tokens: string[];\n\n /** Optional reasoning chunks emitted before the text reply. */\n private readonly reasoningTokens: string[];\n\n /** Milliseconds between successive token emissions. */\n private readonly delayMs: number;\n\n /** Optional deterministic event branches for tests that need exact streams. */\n private readonly script: readonly FakeAgentScriptBranch[];\n\n constructor(opts: {\n tokens?: string[];\n /** Optional reasoning chunks emitted before the text reply. */\n reasoningTokens?: string[];\n delayMs?: number;\n script?: readonly FakeAgentScriptBranch[];\n } = {}) {\n super();\n this.tokens = opts.tokens ?? [\n 'Hello', ' from', ' the', ' fake', ' AG-UI', ' agent.',\n ' This', ' is', ' a', ' canned', ' streaming', ' reply.',\n ];\n this.reasoningTokens = opts.reasoningTokens ?? [];\n this.delayMs = opts.delayMs ?? 60;\n this.script = opts.script ?? [];\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n const scripted = this.scriptedSequence(input);\n if (scripted) return this.emitSequence(scripted, 30);\n\n const tokens = this.tokens;\n const reasoningTokens = this.reasoningTokens;\n const messageId = `fake-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n const sequence: BaseEvent[] = [\n { type: EventType.RUN_STARTED, threadId: input.threadId, runId: input.runId } as BaseEvent,\n ];\n\n if (reasoningTokens.length > 0) {\n sequence.push({ type: EventType.REASONING_MESSAGE_START, messageId, role: 'assistant' } as BaseEvent);\n for (const delta of reasoningTokens) {\n sequence.push({ type: EventType.REASONING_MESSAGE_CONTENT, messageId, delta } as BaseEvent);\n }\n sequence.push({ type: EventType.REASONING_MESSAGE_END, messageId } as BaseEvent);\n }\n\n sequence.push({ type: EventType.TEXT_MESSAGE_START, messageId, role: 'assistant' } as BaseEvent);\n for (const delta of tokens) {\n sequence.push({ type: EventType.TEXT_MESSAGE_CONTENT, messageId, delta } as BaseEvent);\n }\n sequence.push({ type: EventType.TEXT_MESSAGE_END, messageId } as BaseEvent);\n sequence.push({ type: EventType.RUN_FINISHED, threadId: input.threadId, runId: input.runId } as BaseEvent);\n\n return this.emitSequence(sequence, 30);\n }\n\n private scriptedSequence(input: RunAgentInput): BaseEvent[] | undefined {\n if (this.script.length === 0) return undefined;\n const branch = this.script.find((candidate) => matchesBranch(candidate.when, input));\n if (!branch) return undefined;\n return [\n { type: EventType.RUN_STARTED, threadId: input.threadId, runId: input.runId } as BaseEvent,\n ...branch.events,\n { type: EventType.RUN_FINISHED, threadId: input.threadId, runId: input.runId } as BaseEvent,\n ];\n }\n\n private emitSequence(sequence: readonly BaseEvent[], initialDelayMs: number): Observable<BaseEvent> {\n const delayMs = this.delayMs;\n return new Observable<BaseEvent>((observer) => {\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let i = 0;\n\n const emitNext = () => {\n if (cancelled) return;\n if (i >= sequence.length) {\n observer.complete();\n return;\n }\n observer.next(sequence[i]);\n i++;\n // Steady cadence except a tiny initial delay before RUN_STARTED.\n timer = setTimeout(emitNext, delayMs);\n };\n\n timer = setTimeout(emitNext, initialDelayMs);\n\n return () => {\n cancelled = true;\n if (timer !== undefined) clearTimeout(timer);\n };\n });\n }\n}\n\nfunction matchesBranch(when: FakeAgentScriptWhen, input: RunAgentInput): boolean {\n if (when === 'initial') return !hasToolMessages(input);\n return hasToolMessageFor(input, when.toolMessageFor);\n}\n\nfunction hasToolMessages(input: RunAgentInput): boolean {\n return (input.messages ?? []).some((message) => isToolMessage(message));\n}\n\nfunction hasToolMessageFor(input: RunAgentInput, toolCallId: string): boolean {\n return (input.messages ?? []).some((message) => {\n if (!isToolMessage(message)) return false;\n const record = message as Record<string, unknown>;\n return record['toolCallId'] === toolCallId || record['tool_call_id'] === toolCallId;\n });\n}\n\nfunction isToolMessage(message: unknown): boolean {\n const record = message as Record<string, unknown>;\n return record['role'] === 'tool' || record['type'] === 'tool';\n}\n","// libs/ag-ui/src/lib/testing/provide-fake-agent.ts\n// SPDX-License-Identifier: MIT\nimport { type Provider } from '@angular/core';\nimport type { FakeAgentConfig } from '@threadplane/chat/testing';\nimport { AGENT } from '../provide-agent';\nimport { toAgent } from '../to-agent';\nimport { FakeAgent } from './fake-agent';\n\n/**\n * Registers an in-process FakeAgent under AGENT.\n *\n * Use for offline demos and development. Drop-in replacement for\n * provideAgent({ url }) when no real backend is available.\n *\n * @example\n * ```ts\n * TestBed.configureTestingModule({\n * providers: [provideFakeAgent({ tokens: ['Hello from the fake agent'] })],\n * });\n * ```\n */\nexport function provideFakeAgent(config: FakeAgentConfig = {}): Provider[] {\n return [\n {\n provide: AGENT,\n useFactory: () => toAgent(new FakeAgent(config)),\n },\n ];\n}\n","// SPDX-License-Identifier: MIT\nexport { toAgent } from './lib/to-agent';\nexport type { ToAgentOptions, AgUiAgent } from './lib/to-agent';\nexport type { CustomStreamEvent } from './lib/reducer';\nexport { provideAgent, injectAgent } from './lib/provide-agent';\nexport type { AgentConfig } from './lib/provide-agent';\nexport { FakeAgent } from './lib/testing/fake-agent';\nexport { provideFakeAgent } from './lib/testing/provide-fake-agent';\n\n// Citation state bridge\nexport { bridgeCitationsState } from './lib/bridge-citations-state';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["randomId"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadplane/ag-ui",
3
- "version": "0.0.56",
3
+ "version": "0.0.57",
4
4
  "description": "AG-UI protocol adapter for @threadplane/chat — works with any AG-UI-compatible backend.",
5
5
  "keywords": [
6
6
  "angular",
@@ -1,5 +1,5 @@
1
1
  import { Signal, Provider } from '@angular/core';
2
- import { AbstractAgent, RunAgentInput, BaseEvent } from '@ag-ui/client';
2
+ import { AbstractAgent, BaseEvent, RunAgentInput } from '@ag-ui/client';
3
3
  import { Agent, ClientToolsCapability, Subagent, AgentRuntimeTelemetrySink, AgentRef, Message } from '@threadplane/chat';
4
4
  import { Observable } from 'rxjs';
5
5
  import { FakeAgentConfig } from '@threadplane/chat/testing';
@@ -126,6 +126,13 @@ declare function provideAgent(configOrFactory: AgentConfig | (() => AgentConfig)
126
126
  declare function injectAgent(): AgUiAgent;
127
127
  declare function injectAgent<T>(ref: AgentRef<T>): AgUiAgent<T>;
128
128
 
129
+ type FakeAgentScriptWhen = 'initial' | {
130
+ toolMessageFor: string;
131
+ };
132
+ interface FakeAgentScriptBranch {
133
+ when: FakeAgentScriptWhen;
134
+ events: readonly BaseEvent[];
135
+ }
129
136
  /**
130
137
  * In-process AG-UI agent that emits a canned streaming response.
131
138
  *
@@ -144,13 +151,18 @@ declare class FakeAgent extends AbstractAgent {
144
151
  private readonly reasoningTokens;
145
152
  /** Milliseconds between successive token emissions. */
146
153
  private readonly delayMs;
154
+ /** Optional deterministic event branches for tests that need exact streams. */
155
+ private readonly script;
147
156
  constructor(opts?: {
148
157
  tokens?: string[];
149
158
  /** Optional reasoning chunks emitted before the text reply. */
150
159
  reasoningTokens?: string[];
151
160
  delayMs?: number;
161
+ script?: readonly FakeAgentScriptBranch[];
152
162
  });
153
163
  run(input: RunAgentInput): Observable<BaseEvent>;
164
+ private scriptedSequence;
165
+ private emitSequence;
154
166
  }
155
167
 
156
168
  /**