@threadplane/ag-ui 0.0.50 → 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { signal, computed, InjectionToken, inject } from '@angular/core';
2
2
  import { Subject, Observable } from 'rxjs';
3
+ import { toAgentError, isAbortError } from '@threadplane/chat';
3
4
  import { HttpAgent, AbstractAgent, EventType } from '@ag-ui/client';
4
5
 
5
6
  // SPDX-License-Identifier: MIT
@@ -292,7 +293,7 @@ function reduceEvent(event, store) {
292
293
  case 'RUN_STARTED': {
293
294
  store.status.set('running');
294
295
  store.isLoading.set(true);
295
- store.error.set(null);
296
+ store.error.set(undefined);
296
297
  store.interrupt.set(undefined);
297
298
  store.customEvents.set([]);
298
299
  store.activities.set(new Map());
@@ -306,7 +307,8 @@ function reduceEvent(event, store) {
306
307
  case 'RUN_ERROR': {
307
308
  store.status.set('error');
308
309
  store.isLoading.set(false);
309
- store.error.set(event.message ?? event);
310
+ const runErrorMsg = event.message;
311
+ store.error.set(toAgentError(typeof runErrorMsg === 'string' ? new Error(runErrorMsg) : (runErrorMsg ?? event)));
310
312
  return;
311
313
  }
312
314
  case 'TEXT_MESSAGE_START': {
@@ -518,7 +520,17 @@ function reduceEvent(event, store) {
518
520
  const entry = store.activities().get(e.messageId);
519
521
  if (!entry)
520
522
  return; // unknown activity — ignore
521
- entry.content.update((c) => applyPatch(c, e.patch)); // inner signal → live, no map churn
523
+ entry.content.update((c) => {
524
+ try {
525
+ return applyPatch(c, e.patch);
526
+ }
527
+ catch (err) {
528
+ // A malformed/out-of-order ACTIVITY_DELTA must not break the stream — drop it.
529
+ if (typeof console !== 'undefined')
530
+ console.warn('[ag-ui] dropping malformed ACTIVITY_DELTA patch', err);
531
+ return c;
532
+ }
533
+ }); // inner signal → live, no map churn
522
534
  return;
523
535
  }
524
536
  default: {
@@ -700,7 +712,7 @@ function toAgent(source, options = {}) {
700
712
  messages: signal([]),
701
713
  status: signal('idle'),
702
714
  isLoading: signal(false),
703
- error: signal(null),
715
+ error: signal(undefined),
704
716
  toolCalls: signal([]),
705
717
  state: signal({}),
706
718
  interrupt: signal(undefined),
@@ -720,10 +732,9 @@ function toAgent(source, options = {}) {
720
732
  // triggering a real error path. Both flags are reset together at the top of
721
733
  // submit() so the next run starts clean.
722
734
  let abortSettled = false;
723
- function isAbortError(error) {
724
- return error instanceof Error
725
- && (error.name === 'AbortError' || /abort/i.test(error.message));
726
- }
735
+ // Tracks the last AgentSubmitInput so retry() can re-run it without
736
+ // duplicating the user message. Set at the top of submit()'s message path.
737
+ let lastInput;
727
738
  /** Settles the store as idle for stop()-induced failures; returns true if handled. */
728
739
  function settleIfAborted(error) {
729
740
  // If we already settled this abort (duplicate delivery — e.g. RUN_ERROR
@@ -801,6 +812,27 @@ function toAgent(source, options = {}) {
801
812
  if (activeRun === run)
802
813
  activeRun = null;
803
814
  }
815
+ /**
816
+ * Fires the current message list against the source agent (no append).
817
+ * Both submit() and retry() share this path; submit() appends the user
818
+ * message first, retry() skips the append and calls this directly.
819
+ */
820
+ async function runCurrentMessages() {
821
+ const run = startRunTelemetry('submit');
822
+ const tools = clientToolsCap.catalogAsAgUiTools();
823
+ try {
824
+ await source.runAgent(tools.length > 0 ? { tools } : undefined);
825
+ finishRunTelemetry(run);
826
+ }
827
+ catch (err) {
828
+ if (!settleIfAborted(err)) {
829
+ store.status.set('error');
830
+ store.isLoading.set(false);
831
+ store.error.set(toAgentError(err));
832
+ failRunTelemetry(err, run);
833
+ }
834
+ }
835
+ }
804
836
  // Tap all events from the source agent via the AgentSubscriber API.
805
837
  // This subscription lives for the lifetime of `source`.
806
838
  source.subscribe({
@@ -820,7 +852,7 @@ function toAgent(source, options = {}) {
820
852
  return;
821
853
  store.status.set('error');
822
854
  store.isLoading.set(false);
823
- store.error.set(error);
855
+ store.error.set(toAgentError(error));
824
856
  failRunTelemetry(error);
825
857
  },
826
858
  });
@@ -834,9 +866,24 @@ function toAgent(source, options = {}) {
834
866
  toolCallId: entry.content()['toolCallId'] ?? id,
835
867
  name: entry.content()['name'],
836
868
  status: computed(() => entry.content()['status'] ?? 'running'),
837
- messages: computed(() => [
838
- { id, role: 'assistant', content: String(entry.content()['text'] ?? '') },
839
- ]),
869
+ messages: computed(() => {
870
+ const c = entry.content();
871
+ const raw = c['messages'];
872
+ if (Array.isArray(raw)) {
873
+ return raw.map((m, i) => ({
874
+ id: m['id'] ?? `${id}-${i}`,
875
+ role: 'assistant',
876
+ content: typeof m['content'] === 'string' ? m['content'] : m['content'] ?? '',
877
+ ...(Array.isArray(m['toolCallIds']) ? { toolCallIds: m['toolCallIds'] } : {}),
878
+ ...(typeof m['reasoning'] === 'string' ? { reasoning: m['reasoning'] } : {}),
879
+ }));
880
+ }
881
+ return [{ id, role: 'assistant', content: String(c['text'] ?? '') }];
882
+ }),
883
+ toolCalls: computed(() => {
884
+ const raw = entry.content()['toolCalls'];
885
+ return Array.isArray(raw) ? raw : [];
886
+ }),
840
887
  state: computed(() => entry.content()['state'] ?? {}),
841
888
  };
842
889
  subagentWrappers.set(id, w);
@@ -893,7 +940,7 @@ function toAgent(source, options = {}) {
893
940
  if (!settleIfAborted(err)) {
894
941
  store.status.set('error');
895
942
  store.isLoading.set(false);
896
- store.error.set(err);
943
+ store.error.set(toAgentError(err));
897
944
  failRunTelemetry(err, run);
898
945
  }
899
946
  }
@@ -908,20 +955,21 @@ function toAgent(source, options = {}) {
908
955
  // Sync to AG-UI source so it's included in the next run's input.
909
956
  source.addMessage(userMsg);
910
957
  }
911
- const run = startRunTelemetry('submit');
912
- const tools = clientToolsCap.catalogAsAgUiTools();
913
- try {
914
- await source.runAgent(tools.length > 0 ? { tools } : undefined);
915
- finishRunTelemetry(run);
916
- }
917
- catch (err) {
918
- if (!settleIfAborted(err)) {
919
- store.status.set('error');
920
- store.isLoading.set(false);
921
- store.error.set(err);
922
- failRunTelemetry(err, run);
923
- }
924
- }
958
+ // Record the input so retry() can re-run it without re-appending the
959
+ // user message (the message is already in the list by this point).
960
+ lastInput = input;
961
+ await runCurrentMessages();
962
+ },
963
+ retry: async () => {
964
+ if (store.isLoading())
965
+ return; // no-op while a run is in flight
966
+ if (lastInput === undefined)
967
+ return; // nothing to retry
968
+ store.error.set(undefined);
969
+ // Re-run the same message list against the source without appending a
970
+ // duplicate user message — the message is already in store.messages and
971
+ // source's internal list from the original submit().
972
+ await runCurrentMessages();
925
973
  },
926
974
  stop: async () => {
927
975
  abortRequested = true;
@@ -972,7 +1020,7 @@ function toAgent(source, options = {}) {
972
1020
  if (!settleIfAborted(err)) {
973
1021
  store.status.set('error');
974
1022
  store.isLoading.set(false);
975
- store.error.set(err);
1023
+ store.error.set(toAgentError(err));
976
1024
  failRunTelemetry(err, run);
977
1025
  }
978
1026
  }
@@ -998,47 +1046,34 @@ function randomId() {
998
1046
  * which is always an `AgUiAgent`, so the token is typed accordingly.
999
1047
  */
1000
1048
  const AGENT = new InjectionToken('AGENT');
1001
- /**
1002
- * Provides an Agent instance wired through HttpAgent and toAgent.
1003
- * Constructs an HttpAgent from config and wraps it in the runtime-neutral
1004
- * Agent contract via toAgent(). Returns a provider array suitable for
1005
- * bootstrapApplication or TestBed.configureTestingModule().
1006
- *
1007
- * **Static vs factory config.** Pass a plain `AgentConfig` object when the
1008
- * config is known up front. Pass a `() => AgentConfig` factory when the config
1009
- * depends on runtime/DI state the factory runs inside an Angular injection
1010
- * context, so it may call `inject()` to read services or route params.
1011
- */
1012
- function provideAgent(configOrFactory) {
1013
- return [
1014
- {
1015
- provide: AGENT,
1016
- useFactory: () => {
1017
- // useFactory runs in an injection context, so a config factory may
1018
- // call inject() to read runtime/DI state.
1019
- const config = typeof configOrFactory === 'function' ? configOrFactory() : configOrFactory;
1020
- const source = new HttpAgent({
1021
- url: config.url,
1022
- ...(config.agentId !== undefined ? { agentId: config.agentId } : {}),
1023
- ...(config.threadId !== undefined ? { threadId: config.threadId } : {}),
1024
- ...(config.headers !== undefined ? { headers: config.headers } : {}),
1025
- });
1026
- return toAgent(source, { telemetry: config.telemetry });
1027
- },
1028
- },
1049
+ /** @internal — shared factory for building an AgUiAgent from an AgentConfig or factory. */
1050
+ function buildAgUiAgent(configOrFactory) {
1051
+ // useFactory runs in an injection context, so a config factory may
1052
+ // call inject() to read runtime/DI state.
1053
+ const config = typeof configOrFactory === 'function' ? configOrFactory() : configOrFactory;
1054
+ const source = new HttpAgent({
1055
+ url: config.url,
1056
+ ...(config.agentId !== undefined ? { agentId: config.agentId } : {}),
1057
+ ...(config.threadId !== undefined ? { threadId: config.threadId } : {}),
1058
+ ...(config.headers !== undefined ? { headers: config.headers } : {}),
1059
+ });
1060
+ return toAgent(source, { telemetry: config.telemetry });
1061
+ }
1062
+ function isAgentRef(x) {
1063
+ return typeof x === 'object' && x !== null && 'token' in x;
1064
+ }
1065
+ function provideAgent(refOrConfig, maybeConfig) {
1066
+ const ref = isAgentRef(refOrConfig) ? refOrConfig : undefined;
1067
+ const configOrFactory = (ref ? maybeConfig : refOrConfig);
1068
+ const providers = [
1069
+ { provide: AGENT, useFactory: () => buildAgUiAgent(configOrFactory) },
1029
1070
  ];
1071
+ if (ref)
1072
+ providers.push({ provide: ref.token, useExisting: AGENT });
1073
+ return providers;
1030
1074
  }
1031
- /**
1032
- * Injects the AG-UI agent from Angular's dependency injection container.
1033
- * Use this in components or services provided via `provideAgent()` (or
1034
- * `provideFakeAgent()`).
1035
- *
1036
- * Returns an `AgUiAgent` — the runtime-neutral `Agent` contract plus the
1037
- * AG-UI-specific `customEvents` signal — so `customEvents` is reachable
1038
- * directly, without casting.
1039
- */
1040
- function injectAgent() {
1041
- return inject(AGENT);
1075
+ function injectAgent(ref) {
1076
+ return inject(ref ? ref.token : AGENT);
1042
1077
  }
1043
1078
 
1044
1079
  // libs/ag-ui/src/lib/testing/fake-agent.ts
@@ -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\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 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<unknown>;\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(null);\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 store.error.set((event as { message?: unknown }).message ?? event);\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) => applyPatch(c, e.patch)); // 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 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 extends Agent {\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<unknown>(null),\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 function isAbortError(error: unknown): boolean {\n return error instanceof Error\n && (error.name === 'AbortError' || /abort/i.test(error.message));\n }\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 // 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(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 { id, role: 'assistant', content: String(entry.content()['text'] ?? '') },\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(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 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(err);\n failRunTelemetry(err, run);\n }\n }\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(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 { AgentRuntimeTelemetrySink } from '@threadplane/chat';\nimport { toAgent, type AgUiAgent } from './to-agent';\n\n/**\n * Configuration for the AG-UI agent provider.\n * HttpAgentConfig shape (from @ag-ui/client@0.0.52):\n * - url: string (required) — endpoint for the HTTP agent\n * - agentId: string (optional) — agent identifier\n * - threadId: string (optional) — thread identifier\n * - headers: Record<string, string> (optional) — custom HTTP headers\n */\nexport interface AgentConfig {\n url: string;\n agentId?: string;\n threadId?: string;\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/**\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 */\nexport function provideAgent(\n configOrFactory: AgentConfig | (() => AgentConfig),\n): Provider[] {\n return [\n {\n provide: AGENT,\n useFactory: () => {\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 },\n ];\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 */\nexport function injectAgent(): AgUiAgent {\n return inject(AGENT);\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 */\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\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 * Configuration for the AG-UI agent provider.\n * HttpAgentConfig shape (from @ag-ui/client@0.0.52):\n * - url: string (required) — endpoint for the HTTP agent\n * - agentId: string (optional) — agent identifier\n * - threadId: string (optional) — thread identifier\n * - headers: Record<string, string> (optional) — custom HTTP headers\n */\nexport interface AgentConfig {\n url: string;\n agentId?: string;\n threadId?: string;\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 * ```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:\n *\n * ```ts\n * const agent = injectAgent(TRIP); // AgUiAgent<TripState>\n * ```\n *\n * The no-arg form defaults to `AgUiAgent<Record<string, unknown>>`.\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 */\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":";;;;;AAAA;AACA;AACA;AACA;AACA;AASA;;;;;;;AAOG;AACG,SAAU,UAAU,CAAI,MAAS,EAAE,GAA2B,EAAA;IAClE,IAAI,OAAO,GAAY,MAAM;AAC7B,IAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;AACpB,QAAA,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;IACjC;AACA,IAAA,OAAO,OAAY;AACrB;AAEA,SAAS,QAAQ,CAAC,GAAY,EAAE,EAAe,EAAA;AAC7C,IAAA,QAAQ,EAAE,CAAC,EAAE;QACX,KAAK,KAAK,EAAM,OAAO,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,uBAAuB,IAAI,CAAC;QAC7F,KAAK,SAAS,EAAE,OAAO,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,uBAAuB,KAAK,CAAC;AAC9F,QAAA,KAAK,QAAQ,EAAG,OAAO,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3D,KAAK,MAAM,EAAE;AACX,YAAA,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC;YACjE,MAAM,UAAU,GAAG,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC;YACxC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC;YACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;AACzC,YAAA,OAAO,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;QAC3D;QACA,KAAK,MAAM,EAAE;AACX,YAAA,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC;AACjE,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAC/C,YAAA,OAAO,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAC5E;QACA,KAAK,MAAM,EAAE;AACX,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE;gBAChC,MAAM,IAAI,KAAK,CAAC,CAAA,yBAAA,EAA4B,EAAE,CAAC,IAAI,CAAA,CAAE,CAAC;YACxD;AACA,YAAA,OAAO,GAAG;QACZ;QACA,SAAS;YACP,MAAM,CAAC,GAAmB,EAAW;YACrC,MAAM,IAAI,KAAK,CAAC,CAAA,2BAAA,EAA8B,CAAC,CAAC,EAAE,CAAA,CAAE,CAAC;QACvD;;AAEJ;AAEA;;;;;;AAMG;AACG,SAAU,YAAY,CAAC,OAAe,EAAA;IAC1C,IAAI,OAAO,KAAK,EAAE;AAAE,QAAA,OAAO,EAAE;IAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC5B,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAA,CAAE,CAAC;IACrD;AACA,IAAA,OAAO;SACJ,KAAK,CAAC,CAAC;SACP,KAAK,CAAC,GAAG;SACT,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAChE;AAEA,SAAS,KAAK,CAAC,GAAY,EAAE,MAAyB,EAAA;IACpD,IAAI,GAAG,GAAY,GAAG;AACtB,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,QAAA,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;IAC5B;AACA,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,QAAQ,CAAC,IAAa,EAAE,KAAa,EAAA;AAC5C,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAC7C,QAAA,OAAO,IAAI,CAAC,CAAC,CAAC;IAChB;IACA,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC7C,QAAA,OAAQ,IAAgC,CAAC,KAAK,CAAC;IACjD;AACA,IAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,CAAA,CAAA,CAAG,CAAC;AACtE;AAEA,SAAS,KAAK,CACZ,GAAY,EACZ,MAAyB,EACzB,KAAc,EACd,gBAAyB,EAAA;AAEzB,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;;AAEvB,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC;IACnC;IACA,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM;AAC9B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE;AACvB,QAAA,MAAM,CAAC,GAAG,IAAI,KAAK,GAAG,IAAI,gBAAgB,GAAG,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,IAAK,EAAE,GAAG,CAAC,MAAM,IAAI,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACzH,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,IAAI,gBAAgB,EAAE;;AAEpB,gBAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC9C;iBAAO;;AAEL,gBAAA,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,CAAA,wCAAA,EAA2C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC;gBACpG,GAAG,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC;YACrC;QACF;aAAO;AACL,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA,CAAE,CAAC;AACzF,YAAA,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC;QACvD;AACA,QAAA,OAAO,GAAG;IACZ;IACA,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3C,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,uCAAA,EAA0C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC;IAChF;AACA,IAAA,MAAM,GAAG,GAAG,EAAE,GAAI,GAA+B,EAAE;AACnD,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,GAAG,CAAC,IAAK,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC;IACzC;SAAO;AACL,QAAA,IAAI,EAAE,IAAK,IAAI,GAAG,CAAC,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,mCAAA,EAAsC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC;QAC5E;AACA,QAAA,GAAG,CAAC,IAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC;IAC/D;AACA,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,QAAQ,CAAC,GAAY,EAAE,MAAyB,EAAA;AACvD,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,QAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;IACvC;IACA,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM;AAC9B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE;QACvB,MAAM,CAAC,GAAG,eAAe,CAAC,IAAK,EAAE,GAAG,CAAC,MAAM,CAAC;AAC5C,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA,CAAE,CAAC;AACnF,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,YAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QAClB;aAAO;AACL,YAAA,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QACjC;AACA,QAAA,OAAO,GAAG;IACZ;IACA,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3C,QAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAA,CAAA,CAAG,CAAC;IACxE;AACA,IAAA,MAAM,GAAG,GAAG,EAAE,GAAI,GAA+B,EAAE;AACnD,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,QAAA,IAAI,EAAE,IAAK,IAAI,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAA,CAAA,CAAG,CAAC;AAChF,QAAA,OAAO,GAAG,CAAC,IAAK,CAAC;IACnB;SAAO;AACL,QAAA,IAAI,EAAE,IAAK,IAAI,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAA,CAAA,CAAG,CAAC;AAClF,QAAA,GAAG,CAAC,IAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,IAAI,CAAC;IACzC;AACA,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,eAAe,CAAC,KAAa,EAAE,WAAmB,EAAA;AACzD,IAAA,IAAI,KAAK,KAAK,GAAG,EAAE;;AAEjB,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,+CAAA,CAAiD,CAAC;IACpE;IACA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACjC,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAA,CAAA,CAAG,CAAC;IACpD;IACA,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;AACpC,IAAA,IAAI,CAAC,GAAG,WAAW,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,CAAA,YAAA,EAAe,CAAC,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAE,CAAC;IAClE;AACA,IAAA,OAAO,CAAC;AACV;AAEA,SAAS,mBAAmB,CAAI,CAAI,EAAA;;;;AAIlC,IAAA,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,QAAA,OAAO,CAAC;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAM;AAC3C;AAEA,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU,EAAA;IACvC,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;AACxB,IAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;AAAE,QAAA,OAAO,KAAK;IAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;AAChE,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,KAAK;AACvD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACxC,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AACvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;QAC1C;AACA,QAAA,OAAO,IAAI;IACb;IACA,MAAM,EAAE,GAAG,CAA4B;IACvC,MAAM,EAAE,GAAG,CAA4B;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC7B,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,QAAA,OAAO,KAAK;AAC/C,IAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AAAE,YAAA,OAAO,KAAK;AAC9D,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,KAAK;IAC5C;AACA,IAAA,OAAO,IAAI;AACb;;AChNM,SAAU,oBAAoB,CAAC,MAAuB,EAAE,QAAmB,EAAA;AAC/E,IAAA,MAAM,cAAc,GAAI,MAAM,CAAC,KAAiC,EAAE,SAAS;AAC3E,IAAA,IAAI,CAAC,cAAc,IAAI,OAAO,cAAc,KAAK,QAAQ;AAAE,QAAA,OAAO,QAAQ;IAC1E,MAAM,GAAG,GAAG,cAAyC;AACrD,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAG;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;QACvD,OAAO,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;AACtF,IAAA,CAAC,CAAC;AACJ;AAEA,SAAS,iBAAiB,CAAC,KAAc,EAAE,aAAqB,EAAA;AAC9D,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,EAAE,EAAE,EAAE,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE;IACtE;AACA,IAAA,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAA4B;IAClD,MAAM,GAAG,GAAG,CAAC,GAAW,KACtB,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,GAAI,CAAC,CAAC,GAAG,CAAY,GAAG,SAAS;AAC7D,IAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAc,KAAwB;AACzD,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,KAAK,SAAS;AAAE,gBAAA,OAAO,CAAC;QAC/B;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;IACD,OAAO;AACL,QAAA,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE;AACpD,QAAA,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,GAAI,CAAC,CAAC,OAAO,CAAY,GAAG,aAAa;AAC9E,QAAA,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAChC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;QACtC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAClD,QAAA,KAAK,EACH,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK;AAC/C,cAAG,CAAC,CAAC,OAAO;AACZ,cAAE,SAAS;KAChB;AACH;;AC5CA;AACA;AACA;AACA;AACA;AAuEA;;;;;;;;;;AAUG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAmD;AAErF,SAAS,0BAA0B,CAAC,SAAiB,EAAA;IACnD,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AAC/C,IAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;AAC3D,IAAA,OAAO,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS;AACxC;AAEA;;;;AAIG;AACG,SAAU,WAAW,CAAC,KAAgB,EAAE,KAAmB,EAAA;AAC/D,IAAA,QAAQ,KAAK,CAAC,IAAI;QAChB,KAAK,aAAa,EAAE;AAClB,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC3B,YAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,YAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,YAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9B,YAAA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YAC/B;QACF;QACA,KAAK,cAAc,EAAE;AACnB,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,YAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC1B;QACF;QACA,KAAK,WAAW,EAAE;AAChB,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,YAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,MAAM,WAAW,GAAI,KAA+B,CAAC,OAAO;AAC5D,YAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAC1B,OAAO,WAAW,KAAK,QAAQ,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,CAClF,CAAC;YACF;QACF;QACA,KAAK,oBAAoB,EAAE;AACzB,YAAA,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;YAC/B,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACzB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE;AAC1B,kBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC;AACtE,kBAAE,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CACtD;YACD;QACF;QACA,KAAK,yBAAyB,EAAE;AAC9B,YAAA,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;AAC/B,YAAA,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;;YAErD,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACzB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE;AAC1B,kBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK;AACvB,sBAAE,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;sBACpC,CAAC;kBACL,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CACrE;YACD;QACF;AACA,QAAA,KAAK,2BAA2B;QAChC,KAAK,yBAAyB,EAAE;AAC9B,YAAA,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;AAC/B,YAAA,MAAM,KAAK,GAAI,KAA4B,CAAC,KAAK,IAAI,EAAE;YACvD,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK;AACvB,kBAAE,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,KAAK;AAChD,kBAAE,CAAC,CAAC,CACP;YACD;QACF;QACA,KAAK,uBAAuB,EAAE;AAC5B,YAAA,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;YAC/B,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,KAAK,EAAE;AACT,gBAAA,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;AAC1B,gBAAA,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC;AACjC,gBAAA,MAAM,QAAQ,GAAG,0BAA0B,CAAC,EAAE,CAAC;AAC/C,gBAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1B,oBAAA,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,mBAAmB,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAC3E;gBACH;YACF;YACA;QACF;QACA,KAAK,sBAAsB,EAAE;AAC3B,YAAA,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;AAC/B,YAAA,MAAM,KAAK,GAAI,KAA4B,CAAC,KAAK,IAAI,EAAE;YACvD,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CACxE;YACD;QACF;QACA,KAAK,kBAAkB,EAAE;;;YAGvB;QACF;QACA,KAAK,iBAAiB,EAAE;YACtB,MAAM,CAAC,GAAG,KAA0F;YACpG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC/B,gBAAA,GAAG,IAAI;AACP,gBAAA,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,aAAA,CAAC;;;;;;AAMF,YAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe;YAClC,IAAI,QAAQ,EAAE;gBACZ,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC7B,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;oBACpD,IAAI,QAAQ,EAAE;AACZ,wBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAChB,CAAC,CAAC,EAAE,KAAK;8BACL,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC;8BAC7D,CAAC,CACN;oBACH;oBACA,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;AACjG,gBAAA,CAAC,CAAC;YACJ;YACA;QACF;QACA,KAAK,gBAAgB,EAAE;YACrB,MAAM,CAAC,GAAG,KAAyD;;;;;YAKnE,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,GAAG,EAAkB,CAAC;AACjE,YAAA,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK;YAC1D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC;AACjC,YAAA,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;AACjC,YAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,gBAAA,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAC5D;YACH;YACA;QACF;QACA,KAAK,eAAe,EAAE;YACpB,MAAM,CAAC,GAAG,KAA0C;;;;AAIpD,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;YACxD,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;AACvC,YAAA,MAAM,SAAS,GAAG,WAAW,KAAK,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,SAAS;YACnF,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;kBACP,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,SAAS,KAAK,SAAS,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AACrF,kBAAE,CAAC,CACN,CACF;YACD;QACF;QACA,KAAK,kBAAkB,EAAE;YACvB,MAAM,CAAC,GAAG,KAA4D;;;;YAItE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO;AACnF,YAAA,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAC9D;YACD;QACF;QACA,KAAK,gBAAgB,EAAE;YACrB,MAAM,CAAC,GAAG,KAAyD;AACnE,YAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE;AACjC,YAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,oBAAoB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9E;QACF;QACA,KAAK,aAAa,EAAE;YAClB,MAAM,CAAC,GAAG,KAA4C;AACtD,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;AAC1D,YAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;YAC1E;QACF;QACA,KAAK,mBAAmB,EAAE;YACxB,MAAM,CAAC,GAAG,KAAuD;AACjE,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE;;;;;;YAM5B,MAAM,iBAAiB,GAAe,EAAE;YACxC,MAAM,QAAQ,GAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACxC,gBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AACtE,oBAAA,OAAO,CAAuB;gBAChC;gBACA,MAAM,GAAG,GAAa,EAAE;AACxB,gBAAA,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE;AAC5B,oBAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACf,iBAAiB,CAAC,IAAI,CAAC;wBACrB,EAAE,EAAE,EAAE,CAAC,EAAE;AACT,wBAAA,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;wBACtB,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC1C,wBAAA,MAAM,EAAE,UAAU;AACnB,qBAAA,CAAC;gBACJ;gBACA,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC;gBAC1C,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,GAAG,EAAwB;AAC5D,YAAA,CAAC,CAAC;AACF,YAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5B,YAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;;;AAG9B,oBAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;oBACpD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACvE,oBAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI;AACtD,gBAAA,CAAC,CAAC;YACJ;YACA;QACF;QACA,KAAK,QAAQ,EAAE;YACb,MAAM,CAAC,GAAG,KAAoD;;;;YAI9D,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK;AAClF,YAAA,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE;gBAC7B,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAEA,UAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC5E;YACF;;;;YAIA,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YACnF,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE;AACtD,gBAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACjE;iBAAO;gBACL,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACzE;YACA;QACF;QACA,KAAK,mBAAmB,EAAE;YACxB,MAAM,CAAC,GAAG,KAGT;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACrC,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACtE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D;iBAAO;AACL,gBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE;oBACnB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,YAAY,EAAE,CAAC,CAAC,YAAY;oBAC5B,OAAO,EAAE,MAAM,CAA0B,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;AAC1D,iBAAA,CAAC;YACJ;YACA,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B;QACF;QACA,KAAK,gBAAgB,EAAE;YACrB,MAAM,CAAC,GAAG,KAET;AACD,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO;YACnB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AACzB,gBAAA,IAAI;oBACF,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;gBAC/B;gBAAE,OAAO,GAAG,EAAE;;oBAEZ,IAAI,OAAO,OAAO,KAAK,WAAW;AAAE,wBAAA,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,GAAG,CAAC;AACxG,oBAAA,OAAO,CAAC;gBACV;YACF,CAAC,CAAC,CAAC;YACH;QACF;QACA,SAAS;;;;YAIP;QACF;;AAEJ;AAEA,SAASA,UAAQ,GAAA;AACf,IAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C;AAEA,SAAS,aAAa,CAAC,KAAgB,EAAA;AACrC,IAAA,OAAQ,KAAgC,CAAC,SAAS,IAAI,SAAS;AACjE;AAEA,SAAS,aAAa,CAAC,KAAa,EAAA;AAClC,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAChC,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE;IACvC;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,EAAE;IACX;AACF;AAEA;AACgF;AAChF,SAAS,YAAY,CAAC,MAAc,EAAA;AAClC,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AACjC,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS;IAC9C;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,SAAS;IAClB;AACF;AAEA;AACA,SAAS,aAAa,CAAC,CAAS,EAAA;AAC9B,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtB;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,CAAC;IACV;AACF;AAEA,SAAS,QAAQ,CAAC,CAAU,EAAA;AAC1B,IAAA,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACjE;AAEA,SAAS,SAAS,CAAI,CAAI,EAAA;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACtC;;AClaA;AAgBA;AACA,SAAS,UAAU,CAAC,IAAoB,EAAA;AACtC,IAAA,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AACxF;AAEA;AACA,SAAS,aAAa,CAAC,CAAU,EAAA;AAC/B,IAAA,OAAO,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACtD;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;AACG,SAAU,2BAA2B,CACzC,MAAyB,EACzB,KAAmB,EAAA;AAEnB,IAAA,MAAM,OAAO,GAAG,MAAM,CAA4B,EAAE,mDAAC;IACrD,MAAM,WAAW,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,uDAAC;AAE1D,IAAA,SAAS,kBAAkB,GAAA;AACzB,QAAA,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;IAClC;AAEA,IAAA,MAAM,WAAW,GAA6D;AAC5E,QAAA,UAAU,CAAC,KAAgC,EAAA;YACzC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QACzB,CAAC;AAED,QAAA,OAAO,EAAE,QAAQ,CAAC,MAAK;;;YAGrB,IAAI,KAAK,CAAC,SAAS,EAAE;AAAE,gBAAA,OAAO,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;AACnD,YAAA,MAAM,IAAI,GAAG,WAAW,EAAE;AAC1B,YAAA,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAC7B,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAC1E;AACH,QAAA,CAAC,CAAC;QAEF,OAAO,CAAC,EAAU,EAAE,MAAwB,EAAA;;AAE1C,YAAA,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;;;;;;;AAS7C,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE;AACpB,YAAA,MAAM,KAAK,GAAI,MAA6B,CAAC,KAAK;AAClD,YAAA,MAAM,KAAK,GAAI,MAA4B,CAAC,KAAK;YACjD,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,KAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KACX,EAAE,CAAC,EAAE,KAAK;AACR,kBAAE;AACE,oBAAA,GAAG,EAAE;oBACL,MAAM,EAAE,EAAE,GAAG,KAAK,GAAG,EAAE,KAAK,EAAE;AAC9B,oBAAA,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAgB,EAAE,CAAC;AACnD;AACH,kBAAE,EAAE,CACP,CACF;;;;YAKD,MAAM,OAAO,GAAG;AACd,kBAAE,aAAa,CAAC,KAAK;AACrB,kBAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE;YAErB,MAAM,CAAC,UAAU,CAAC;gBAChB,EAAE,EAAE,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAE;AAChB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,UAAU,EAAE,EAAE;gBACd,OAAO;AACG,aAAA,CAAC;YAEb,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC;QACvD,CAAC;QAED,kBAAkB;KACnB;AAED,IAAA,OAAO,WAAW;AACpB;;ACxHA;AAuBA,SAAS,4BAA4B,CACnC,IAAmD,EACnD,KAAiC,EACjC,UAA2C,EAAA;AAE3C,IAAA,IAAI,CAAC,IAAI;QAAE;AACX,IAAA,IAAI;QACF,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;IAC1E;AAAE,IAAA,MAAM;;IAER;AACF;AAEA,SAAS,+BAA+B,CAAC,KAAc,EAAA;IACrD,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,OAAO;AAClF,IAAA,IACE;WACG,OAAO,KAAK,KAAK;AACjB,WAAA,MAAM,IAAI;AACV,WAAA,OAAO,KAAK,CAAC,IAAI,KAAK;AACtB,WAAA,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EACxB;QACA,OAAO,KAAK,CAAC,IAAI;IACnB;AACA,IAAA,OAAO,cAAc;AACvB;AAiBA;;;;;;;;;;;;;AAaG;SACa,OAAO,CAAC,MAAqB,EAAE,UAA0B,EAAE,EAAA;AACzE,IAAA,MAAM,KAAK,GAAiB;AAC1B,QAAA,QAAQ,EAAM,MAAM,CAAY,EAAE,CAAC;AACnC,QAAA,MAAM,EAAQ,MAAM,CAAc,MAAM,CAAC;AACzC,QAAA,SAAS,EAAK,MAAM,CAAU,KAAK,CAAC;AACpC,QAAA,KAAK,EAAS,MAAM,CAAyB,SAAS,CAAC;AACvD,QAAA,SAAS,EAAK,MAAM,CAAa,EAAE,CAAC;AACpC,QAAA,KAAK,EAAS,MAAM,CAA0B,EAAE,CAAC;AACjD,QAAA,SAAS,EAAK,MAAM,CAA6B,SAAS,CAAC;QAC3D,OAAO,EAAO,IAAI,OAAO,EAAc;AACvC,QAAA,YAAY,EAAE,MAAM,CAAsB,EAAE,CAAC;AAC7C,QAAA,UAAU,EAAI,MAAM,CAA6B,IAAI,GAAG,EAAE,CAAC;KAC5D;IACD,MAAM,mBAAmB,GAAG,EAAE,SAAS,EAAE,OAAgB,EAAE,OAAO,EAAE,UAAU,EAAE;IAChF,IAAI,SAAS,GAAmD,IAAI;;;IAIpE,IAAI,cAAc,GAAG,KAAK;;;;;;;IAQ1B,IAAI,YAAY,GAAG,KAAK;;;AAIxB,IAAA,IAAI,SAAuC;;IAG3C,SAAS,eAAe,CAAC,KAAc,EAAA;;;;;;AAMrC,QAAA,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AACvC,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,YAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QACzD,cAAc,GAAG,KAAK;QACtB,YAAY,GAAG,IAAI;AACnB,QAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,QAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;;QAG1B,MAAM,GAAG,GAAG,SAAS;QACrB,IAAI,GAAG,EAAE;YACP,kBAAkB,CAAC,GAAG,CAAC;;;;AAIvB,YAAA,GAAG,CAAC,OAAO,GAAG,IAAI;QACpB;AACA,QAAA,OAAO,IAAI;IACb;;;IAIA,MAAM,cAAc,GAAG,2BAA2B,CAAC,MAAM,EAAE,KAAK,CAAC;AAEjE;;;;AAI2E;AAC3E,IAAA,MAAM,eAAe,GAAG,CAAC,KAA0C,KAAU;AAC3E,QAAA,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE;AAC/C,QAAA,MAAM,CAAC,KAAK,GAAG,EAAE,IAAK,MAAM,CAAC,KAAiC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE;QACjF,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AACvD,IAAA,CAAC;IAED,4BAA4B,CAC1B,OAAO,CAAC,SAAS,EACjB,+BAA+B,EAC/B,mBAAmB,CACpB;IAED,SAAS,iBAAiB,CAAC,WAAmB,EAAA;AAC5C,QAAA,MAAM,GAAG,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QACrD,SAAS,GAAG,GAAG;AACf,QAAA,4BAA4B,CAAC,OAAO,CAAC,SAAS,EAAE,8BAA8B,EAAE;AAC9E,YAAA,GAAG,mBAAmB;YACtB,WAAW;AACZ,SAAA,CAAC;QACF,4BAA4B,CAAC,OAAO,CAAC,SAAS,EAAE,qBAAqB,EAAE,mBAAmB,CAAC;AAC3F,QAAA,OAAO,GAAG;IACZ;IAEA,SAAS,kBAAkB,CAAC,GAA4C,EAAA;QACtE,IAAI,GAAG,CAAC,OAAO;YAAE;AACjB,QAAA,4BAA4B,CAAC,OAAO,CAAC,SAAS,EAAE,mBAAmB,EAAE;AACnE,YAAA,GAAG,mBAAmB;YACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS;AACvC,SAAA,CAAC;QACF,IAAI,SAAS,KAAK,GAAG;YAAE,SAAS,GAAG,IAAI;IACzC;AAEA,IAAA,SAAS,gBAAgB,CAAC,KAAc,EAAE,GAAG,GAAG,SAAS,EAAA;AACvD,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO;YAAE;AACzB,QAAA,GAAG,CAAC,OAAO,GAAG,IAAI;AAClB,QAAA,4BAA4B,CAAC,OAAO,CAAC,SAAS,EAAE,qBAAqB,EAAE;AACrE,YAAA,GAAG,mBAAmB;YACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS;AACtC,YAAA,UAAU,EAAE,+BAA+B,CAAC,KAAK,CAAC;AACnD,SAAA,CAAC;QACF,IAAI,SAAS,KAAK,GAAG;YAAE,SAAS,GAAG,IAAI;IACzC;AAEA;;;;AAIG;AACH,IAAA,eAAe,kBAAkB,GAAA;AAC/B,QAAA,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC;AACvC,QAAA,MAAM,KAAK,GAAG,cAAc,CAAC,kBAAkB,EAAE;AACjD,QAAA,IAAI;YACF,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;YAC/D,kBAAkB,CAAC,GAAG,CAAC;QACzB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,gBAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAClC,gBAAA,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;YAC5B;QACF;IACF;;;IAIA,MAAM,CAAC,SAAS,CAAC;QACf,OAAO,CAAC,EAAE,KAAK,EAAE,EAAA;;;;AAIf,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;AAC9B,gBAAA,MAAM,OAAO,GAAI,KAA8B,CAAC,OAAO,IAAI,EAAE;AAC7D,gBAAA,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;oBAAE;YAC3C;AACA,YAAA,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QAC3B,CAAC;QACD,WAAW,CAAC,EAAE,KAAK,EAAE,EAAA;YACnB,IAAI,eAAe,CAAC,KAAK,CAAC;gBAAE;AAC5B,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,YAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACpC,gBAAgB,CAAC,KAAK,CAAC;QACzB,CAAC;AACF,KAAA,CAAC;;;AAIF,IAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB;AACpD,IAAA,SAAS,WAAW,CAAC,EAAU,EAAE,KAAoB,EAAA;QACnD,IAAI,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,EAAE;AACN,YAAA,CAAC,GAAG;gBACF,UAAU,EAAG,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,CAAY,IAAI,EAAE;AAC3D,gBAAA,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,CAAuB;AACnD,gBAAA,MAAM,EAAE,QAAQ,CAAC,MAAO,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAoB,IAAI,SAAS,CAAC;AAClF,gBAAA,QAAQ,EAAE,QAAQ,CAAY,MAAK;AACjC,oBAAA,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE;AACzB,oBAAA,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC;AACzB,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;wBACtB,OAAQ,GAAsC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM;4BAC5D,EAAE,EAAG,CAAC,CAAC,IAAI,CAAY,IAAI,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE;AACvC,4BAAA,IAAI,EAAE,WAA8B;4BACpC,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,GAAI,CAAC,CAAC,SAAS,CAAY,GAAI,CAAC,CAAC,SAAS,CAAwB,IAAI,EAAE;4BACjH,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,aAAa,CAAa,EAAE,GAAG,EAAE,CAAC;4BACzF,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,CAAW,EAAE,GAAG,EAAE,CAAC;AACvF,yBAAA,CAAC,CAAC;oBACL;oBACA,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;AACtE,gBAAA,CAAC,CAAC;AACF,gBAAA,SAAS,EAAE,QAAQ,CAAa,MAAK;oBACnC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC;AACxC,oBAAA,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAI,GAAkB,GAAG,EAAE;AACtD,gBAAA,CAAC,CAAC;AACF,gBAAA,KAAK,EAAE,QAAQ,CAAC,MAAO,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,CAA6B,IAAI,EAAE,CAAC;aACnF;AACD,YAAA,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B;AACA,QAAA,OAAO,CAAC;IACV;IAEA,OAAO;QACL,QAAQ,EAAG,KAAK,CAAC,QAAQ;QACzB,MAAM,EAAK,KAAK,CAAC,MAAM;QACvB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAM,KAAK,CAAC,KAAK;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAM,KAAK,CAAC,KAAK;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;AAC1B,QAAA,OAAO,EAAO,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE;QAC1C,YAAY,EAAE,KAAK,CAAC,YAAY;AAChC,QAAA,SAAS,EAAE,QAAQ,CAAwB,MAAK;AAC9C,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB;AACvC,YAAA,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE;AAC5C,gBAAA,IAAI,KAAK,CAAC,YAAY,KAAK,UAAU;oBAAE;AACvC,gBAAA,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrC;;;YAGA,KAAK,MAAM,EAAE,IAAI,gBAAgB,CAAC,IAAI,EAAE,EAAE;AACxC,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,oBAAA,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/C;AACA,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,CAAC;AACF,QAAA,WAAW,EAAG,cAAc;AAE5B,QAAA,MAAM,EAAE,OAAO,KAAuB,EAAE,KAA0B,KAAI;;;YAGpE,cAAc,GAAG,KAAK;YACtB,YAAY,GAAG,KAAK;AAEpB,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE;;;;AAI9B,gBAAA,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;AAC5B,gBAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9B,gBAAA,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC;AACvC,gBAAA,MAAM,KAAK,GAAG,cAAc,CAAC,kBAAkB,EAAE;AACjD,gBAAA,IAAI;oBACF,MAAM,MAAM,CAAC,QAAQ,CAAC;wBACpB,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE;AACrD,wBAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACvC,qBAAA,CAAC;oBACF,kBAAkB,CAAC,GAAG,CAAC;gBACzB;gBAAE,OAAO,GAAG,EAAE;AACZ,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;AACzB,wBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,wBAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;wBAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAClC,wBAAA,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;oBAC5B;gBACF;gBACA;YACF;AAEA,YAAA,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;;;AAI5B,YAAA,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC;YACvC,IAAI,OAAO,EAAE;AACX,gBAAA,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;;AAEnD,gBAAA,MAAM,CAAC,UAAU,CAAC,OAAkD,CAAC;YACvE;;;YAIA,SAAS,GAAG,KAAK;YAEjB,MAAM,kBAAkB,EAAE;QAC5B,CAAC;QAED,KAAK,EAAE,YAAW;YAChB,IAAI,KAAK,CAAC,SAAS,EAAE;AAAE,gBAAA,OAAO;YAC9B,IAAI,SAAS,KAAK,SAAS;AAAE,gBAAA,OAAO;AACpC,YAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;;;;YAI1B,MAAM,kBAAkB,EAAE;QAC5B,CAAC;QAED,IAAI,EAAE,YAAW;YACf,cAAc,GAAG,IAAI;YACrB,MAAM,CAAC,QAAQ,EAAE;QACnB,CAAC;AAED,QAAA,UAAU,EAAE,OAAO,qBAA6B,KAAmB;AACjE,YAAA,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE;AACrB,gBAAA,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC;YAC9E;;;;;YAKA,cAAc,GAAG,KAAK;YACtB,YAAY,GAAG,KAAK;AACpB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE;AAC7B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC;YAC1C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE;AAC1C,gBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,qBAAqB,CAAA,4BAAA,CAA8B,CAAC;YAC1F;;YAGA,MAAM,OAAO,GAAG;AACb,iBAAA,KAAK,CAAC,CAAC,EAAE,qBAAqB;AAC9B,iBAAA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACxB,iBAAA,OAAO;AACP,iBAAA,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;AACxC,YAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,gBAAA,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC;YAC9E;;;;;AAMA,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;AAC1C,YAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;;;;;AAM3B,YAAA,MAAM,CAAC,WAAW,CAAC,OAAmD,CAAC;AAEvE,YAAA,MAAM,GAAG,GAAG,iBAAiB,CAAC,YAAY,CAAC;AAC3C,YAAA,MAAM,UAAU,GAAG,cAAc,CAAC,kBAAkB,EAAE;AACtD,YAAA,IAAI;gBACF,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;gBAChF,kBAAkB,CAAC,GAAG,CAAC;YACzB;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;AACzB,oBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,oBAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAClC,oBAAA,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;gBAC5B;YACF;QACF,CAAC;KACF;AACH;AAEA,SAAS,gBAAgB,CAAC,KAAuB,EAAA;AAC/C,IAAA,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;AACjD,IAAA,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK;UACrC,KAAK,CAAC;AACR,UAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACrF,IAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;AAClD;AAEA,SAAS,QAAQ,GAAA;AACf,IAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C;;AC3aA;AAuBA;;;;AAIG;AACI,MAAM,KAAK,GAAG,IAAI,cAAc,CAAY,OAAO,CAAC;AAE3D;AACA,SAAS,cAAc,CAAC,eAAkD,EAAA;;;AAGxE,IAAA,MAAM,MAAM,GACV,OAAO,eAAe,KAAK,UAAU,GAAG,eAAe,EAAE,GAAG,eAAe;AAC7E,IAAA,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;QACvE,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;AACrE,KAAA,CAAC;AACF,IAAA,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AACzD;AAEA,SAAS,UAAU,CAAI,CAAU,EAAA;AAC/B,IAAA,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC;AAC5D;AAiCM,SAAU,YAAY,CAC1B,WAA4D,EAC5D,WAA+C,EAAA;AAE/C,IAAA,MAAM,GAAG,GAAG,UAAU,CAAI,WAAW,CAAC,GAAG,WAAW,GAAG,SAAS;AAChE,IAAA,MAAM,eAAe,IAAI,GAAG,GAAG,WAAW,GAAG,WAAW,CAAsC;AAC9F,IAAA,MAAM,SAAS,GAAe;AAC5B,QAAA,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC,eAAe,CAAC,EAAE;KACtE;AACD,IAAA,IAAI,GAAG;AAAE,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACnE,IAAA,OAAO,SAAS;AAClB;AAuBM,SAAU,WAAW,CAAI,GAAiB,EAAA;AAC9C,IAAA,OAAO,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAiB;AACxD;;ACpHA;AACA;AASA;;;;;;;AAOG;AACG,MAAO,SAAU,SAAQ,aAAa,CAAA;AAC1C;;;AAGG;AACc,IAAA,MAAM;;AAGN,IAAA,eAAe;;AAGf,IAAA,OAAO;AAExB,IAAA,WAAA,CAAY,OAKR,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI;YAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS;YACtD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS;SACzD;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE;IACnC;AAEA,IAAA,GAAG,CAAC,KAAoB,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;QAC5B,MAAM,SAAS,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE;AAEhF,QAAA,MAAM,QAAQ,GAAgB;AAC5B,YAAA,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAe;SAC3F;AAED,QAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,uBAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAe,CAAC;AACrG,YAAA,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE;AACnC,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,yBAAyB,EAAE,SAAS,EAAE,KAAK,EAAe,CAAC;YAC7F;AACA,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,qBAAqB,EAAE,SAAS,EAAe,CAAC;QAClF;AAEA,QAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAe,CAAC;AAChG,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,oBAAoB,EAAE,SAAS,EAAE,KAAK,EAAe,CAAC;QACxF;AACA,QAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,gBAAgB,EAAE,SAAS,EAAe,CAAC;QAC3E,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAe,CAAC;AAE1G,QAAA,OAAO,IAAI,UAAU,CAAY,CAAC,QAAQ,KAAI;YAC5C,IAAI,SAAS,GAAG,KAAK;AACrB,YAAA,IAAI,KAAgD;YACpD,IAAI,CAAC,GAAG,CAAC;YAET,MAAM,QAAQ,GAAG,MAAK;AACpB,gBAAA,IAAI,SAAS;oBAAE;AACf,gBAAA,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE;oBACxB,QAAQ,CAAC,QAAQ,EAAE;oBACnB;gBACF;gBACA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1B,gBAAA,CAAC,EAAE;;AAEH,gBAAA,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC;AACvC,YAAA,CAAC;AAED,YAAA,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;AAEhC,YAAA,OAAO,MAAK;gBACV,SAAS,GAAG,IAAI;gBAChB,IAAI,KAAK,KAAK,SAAS;oBAAE,YAAY,CAAC,KAAK,CAAC;AAC9C,YAAA,CAAC;AACH,QAAA,CAAC,CAAC;IACJ;AACD;;ACxFD;;;;;AAKG;AACG,SAAU,gBAAgB,CAAC,MAAA,GAA0B,EAAE,EAAA;IAC3D,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;AACjD,SAAA;KACF;AACH;;ACrBA;;ACAA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadplane/ag-ui",
3
- "version": "0.0.50",
3
+ "version": "0.0.51",
4
4
  "description": "AG-UI protocol adapter for @threadplane/chat — works with any AG-UI-compatible backend.",
5
5
  "keywords": [
6
6
  "angular",
@@ -1,6 +1,6 @@
1
1
  import { Signal, Provider } from '@angular/core';
2
2
  import { AbstractAgent, RunAgentInput, BaseEvent } from '@ag-ui/client';
3
- import { Agent, ClientToolsCapability, Subagent, AgentRuntimeTelemetrySink, Message } from '@threadplane/chat';
3
+ import { Agent, ClientToolsCapability, Subagent, AgentRuntimeTelemetrySink, AgentRef, Message } from '@threadplane/chat';
4
4
  import { Observable } from 'rxjs';
5
5
  import { FakeAgentConfig } from '@threadplane/chat/testing';
6
6
 
@@ -26,7 +26,7 @@ interface ToAgentOptions {
26
26
  * live a2ui streaming) and the optional `clientTools` capability.
27
27
  * Mirrors langgraph's LangGraphAgent extension.
28
28
  */
29
- interface AgUiAgent extends Agent {
29
+ interface AgUiAgent<TState = Record<string, unknown>> extends Agent<TState> {
30
30
  customEvents: Signal<CustomStreamEvent[]>;
31
31
  clientTools: ClientToolsCapability;
32
32
  /** Subagent activities (activityType==='subagent') projected to the neutral
@@ -76,7 +76,21 @@ interface AgentConfig {
76
76
  * config is known up front. Pass a `() => AgentConfig` factory when the config
77
77
  * depends on runtime/DI state — the factory runs inside an Angular injection
78
78
  * context, so it may call `inject()` to read services or route params.
79
+ *
80
+ * **Typed state via AgentRef.** Pass a typed ref as the first argument to flow
81
+ * the state shape from `provideAgent` to `injectAgent` without repeating the
82
+ * generic at every call site:
83
+ *
84
+ * ```ts
85
+ * interface TripState { day: number; places: string[]; }
86
+ * export const TRIP = createAgentRef<TripState>('trip');
87
+ * // app.config.ts:
88
+ * providers: [provideAgent(TRIP, { url: 'http://localhost:8000/agent' })]
89
+ * // component:
90
+ * const agent = injectAgent(TRIP); // AgUiAgent<TripState>
91
+ * ```
79
92
  */
93
+ declare function provideAgent<T = Record<string, unknown>>(ref: AgentRef<T>, configOrFactory: AgentConfig | (() => AgentConfig)): Provider[];
80
94
  declare function provideAgent(configOrFactory: AgentConfig | (() => AgentConfig)): Provider[];
81
95
  /**
82
96
  * Injects the AG-UI agent from Angular's dependency injection container.
@@ -86,8 +100,19 @@ declare function provideAgent(configOrFactory: AgentConfig | (() => AgentConfig)
86
100
  * Returns an `AgUiAgent` — the runtime-neutral `Agent` contract plus the
87
101
  * AG-UI-specific `customEvents` signal — so `customEvents` is reachable
88
102
  * directly, without casting.
103
+ *
104
+ * **Typed state via AgentRef.** Pass the same ref that was supplied to
105
+ * `provideAgent(ref, …)` to carry the state type through DI without repeating
106
+ * the generic at every call site:
107
+ *
108
+ * ```ts
109
+ * const agent = injectAgent(TRIP); // AgUiAgent<TripState>
110
+ * ```
111
+ *
112
+ * The no-arg form defaults to `AgUiAgent<Record<string, unknown>>`.
89
113
  */
90
114
  declare function injectAgent(): AgUiAgent;
115
+ declare function injectAgent<T>(ref: AgentRef<T>): AgUiAgent<T>;
91
116
 
92
117
  /**
93
118
  * In-process AG-UI agent that emits a canned streaming response.