@threadplane/ag-ui 0.0.53 → 0.0.55

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.
package/README.md CHANGED
@@ -32,10 +32,10 @@ Part of [Threadplane](https://github.com/cacheplane/angular-agent-framework).
32
32
  ## Install
33
33
 
34
34
  ```bash
35
- npm install @threadplane/ag-ui @threadplane/chat @ag-ui/client
35
+ npm install @threadplane/ag-ui @threadplane/chat @ag-ui/client @ag-ui/core
36
36
  ```
37
37
 
38
- **Peer dependencies:** `@threadplane/chat: *`, `@angular/core: ^20.0.0 || ^21.0.0`, `@ag-ui/client: *`, `rxjs: ~7.8.0`
38
+ **Peer dependencies:** `@threadplane/chat: *`, `@angular/core: ^20.0.0 || ^21.0.0`, `@ag-ui/client: *`, `@ag-ui/core: *`, `rxjs: ~7.8.0`
39
39
 
40
40
  ---
41
41
 
@@ -794,21 +794,21 @@ function toAgent(source, options = {}) {
794
794
  source.state = { ...(source.state ?? {}), ...patch };
795
795
  store.state.update((prev) => ({ ...prev, ...patch }));
796
796
  };
797
- captureAgentRuntimeTelemetry(options.telemetry, 'ngaf:runtime_instance_created', telemetryProperties);
797
+ captureAgentRuntimeTelemetry(options.telemetry, 'tplane:runtime_instance_created', telemetryProperties);
798
798
  function startRunTelemetry(requestType) {
799
799
  const run = { startedAt: Date.now(), errored: false };
800
800
  activeRun = run;
801
- captureAgentRuntimeTelemetry(options.telemetry, 'ngaf:runtime_request_created', {
801
+ captureAgentRuntimeTelemetry(options.telemetry, 'tplane:runtime_request_created', {
802
802
  ...telemetryProperties,
803
803
  requestType,
804
804
  });
805
- captureAgentRuntimeTelemetry(options.telemetry, 'ngaf:stream_started', telemetryProperties);
805
+ captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_started', telemetryProperties);
806
806
  return run;
807
807
  }
808
808
  function finishRunTelemetry(run) {
809
809
  if (run.errored)
810
810
  return;
811
- captureAgentRuntimeTelemetry(options.telemetry, 'ngaf:stream_ended', {
811
+ captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_ended', {
812
812
  ...telemetryProperties,
813
813
  durationMs: Date.now() - run.startedAt,
814
814
  });
@@ -819,7 +819,7 @@ function toAgent(source, options = {}) {
819
819
  if (!run || run.errored)
820
820
  return;
821
821
  run.errored = true;
822
- captureAgentRuntimeTelemetry(options.telemetry, 'ngaf:stream_errored', {
822
+ captureAgentRuntimeTelemetry(options.telemetry, 'tplane:stream_errored', {
823
823
  ...telemetryProperties,
824
824
  durationMs: Date.now() - run.startedAt,
825
825
  errorClass: agentRuntimeTelemetryErrorClass(error),
@@ -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 store.messages.set(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 optional\n * `customEvents` signal (the chat composition feature-detects it to enable\n * live a2ui streaming) and the optional `clientTools` capability.\n * Mirrors langgraph's LangGraphAgent extension.\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 */\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 'ngaf: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, 'ngaf:runtime_request_created', {\n ...telemetryProperties,\n requestType,\n });\n captureAgentRuntimeTelemetry(options.telemetry, 'ngaf: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, 'ngaf: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, 'ngaf: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({ responses: ['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 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 store.messages.set(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 optional\n * `customEvents` signal (the chat composition feature-detects it to enable\n * live a2ui streaming) and the optional `clientTools` capability.\n * Mirrors langgraph's LangGraphAgent extension.\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 */\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({ responses: ['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.53",
3
+ "version": "0.0.55",
4
4
  "description": "AG-UI protocol adapter for @threadplane/chat — works with any AG-UI-compatible backend.",
5
5
  "keywords": [
6
6
  "angular",