@threadplane/ag-ui 0.0.49 → 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
- import { signal, InjectionToken, inject } from '@angular/core';
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
@@ -259,6 +260,11 @@ function normalizeCitation(entry, fallbackIndex) {
259
260
  };
260
261
  }
261
262
 
263
+ // SPDX-License-Identifier: MIT
264
+ // @ag-ui/client@0.0.52 — EventType is a string enum with uppercase values.
265
+ // Discriminator strings (e.g. 'RUN_STARTED') match EventType enum members
266
+ // verbatim; the switch cases below use the string literals directly so this
267
+ // file has no runtime dependency on the EventType enum import.
262
268
  /**
263
269
  * Per-message reasoning timing. Populated by REASONING_MESSAGE_START /
264
270
  * REASONING_MESSAGE_END handlers. The map lives on the module — same
@@ -287,9 +293,10 @@ function reduceEvent(event, store) {
287
293
  case 'RUN_STARTED': {
288
294
  store.status.set('running');
289
295
  store.isLoading.set(true);
290
- store.error.set(null);
296
+ store.error.set(undefined);
291
297
  store.interrupt.set(undefined);
292
298
  store.customEvents.set([]);
299
+ store.activities.set(new Map());
293
300
  return;
294
301
  }
295
302
  case 'RUN_FINISHED': {
@@ -300,7 +307,8 @@ function reduceEvent(event, store) {
300
307
  case 'RUN_ERROR': {
301
308
  store.status.set('error');
302
309
  store.isLoading.set(false);
303
- store.error.set(event.message ?? event);
310
+ const runErrorMsg = event.message;
311
+ store.error.set(toAgentError(typeof runErrorMsg === 'string' ? new Error(runErrorMsg) : (runErrorMsg ?? event)));
304
312
  return;
305
313
  }
306
314
  case 'TEXT_MESSAGE_START': {
@@ -381,13 +389,30 @@ function reduceEvent(event, store) {
381
389
  }
382
390
  case 'TOOL_CALL_ARGS': {
383
391
  const e = event;
384
- const args = safeParseArgs(e.delta);
385
- store.toolCalls.update((prev) => prev.map((t) => t.id === e.toolCallId ? { ...t, args } : t));
392
+ // Deltas are FRAGMENTS of a JSON document, not standalone JSON: a live
393
+ // model streams args token-by-token (`{"loca`, `tion":"Pa`, …), so we
394
+ // accumulate the raw text and parse the accumulated buffer. Until the
395
+ // buffer parses, keep the last-good args (initially {}).
396
+ const buffers = (store.argsBuffers ??= new Map());
397
+ const buffer = (buffers.get(e.toolCallId) ?? '') + e.delta;
398
+ buffers.set(e.toolCallId, buffer);
399
+ const args = tryParseArgs(buffer);
400
+ if (args !== undefined) {
401
+ store.toolCalls.update((prev) => prev.map((t) => t.id === e.toolCallId ? { ...t, args } : t));
402
+ }
386
403
  return;
387
404
  }
388
405
  case 'TOOL_CALL_END': {
389
406
  const e = event;
390
- store.toolCalls.update((prev) => prev.map((t) => t.id === e.toolCallId ? { ...t, status: 'complete' } : t));
407
+ // Belt and braces: apply the final accumulated args (in case the last
408
+ // ARGS delta arrived but an intermediate state was left unparsed), then
409
+ // drop the buffer.
410
+ const finalBuffer = store.argsBuffers?.get(e.toolCallId);
411
+ store.argsBuffers?.delete(e.toolCallId);
412
+ const finalArgs = finalBuffer !== undefined ? tryParseArgs(finalBuffer) : undefined;
413
+ store.toolCalls.update((prev) => prev.map((t) => t.id === e.toolCallId
414
+ ? { ...t, status: 'complete', ...(finalArgs !== undefined ? { args: finalArgs } : {}) }
415
+ : t));
391
416
  return;
392
417
  }
393
418
  case 'TOOL_CALL_RESULT': {
@@ -473,6 +498,41 @@ function reduceEvent(event, store) {
473
498
  }
474
499
  return;
475
500
  }
501
+ case 'ACTIVITY_SNAPSHOT': {
502
+ const e = event;
503
+ const map = new Map(store.activities());
504
+ const existing = map.get(e.messageId);
505
+ if (existing && existing.activityType === e.activityType && !e.replace) {
506
+ existing.content.update((c) => ({ ...c, ...e.content }));
507
+ }
508
+ else {
509
+ map.set(e.messageId, {
510
+ messageId: e.messageId,
511
+ activityType: e.activityType,
512
+ content: signal(e.content ?? {}),
513
+ });
514
+ }
515
+ store.activities.set(map); // new ref → projection picks up membership change
516
+ return;
517
+ }
518
+ case 'ACTIVITY_DELTA': {
519
+ const e = event;
520
+ const entry = store.activities().get(e.messageId);
521
+ if (!entry)
522
+ return; // unknown activity — ignore
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
534
+ return;
535
+ }
476
536
  default: {
477
537
  // Unknown event types are ignored; AG-UI may add new ones in
478
538
  // future protocol versions. We surface them as no-ops rather
@@ -496,6 +556,17 @@ function safeParseArgs(delta) {
496
556
  return {};
497
557
  }
498
558
  }
559
+ /** Parse an (accumulated) args buffer; `undefined` when it isn't valid JSON
560
+ * yet — callers keep the previous args rather than clobbering them with {}. */
561
+ function tryParseArgs(buffer) {
562
+ try {
563
+ const parsed = JSON.parse(buffer);
564
+ return isRecord(parsed) ? parsed : undefined;
565
+ }
566
+ catch {
567
+ return undefined;
568
+ }
569
+ }
499
570
  /** Parse a JSON string to its value; return the original string on failure. */
500
571
  function safeParseJson(s) {
501
572
  try {
@@ -512,6 +583,93 @@ function deepClone(v) {
512
583
  return JSON.parse(JSON.stringify(v));
513
584
  }
514
585
 
586
+ // SPDX-License-Identifier: MIT
587
+ /** Convert a ClientToolSpec to the AG-UI Tool wire shape. */
588
+ function toAgUiTool(spec) {
589
+ return { name: spec.name, description: spec.description, parameters: spec.parameters };
590
+ }
591
+ /** Serialize a tool result value to a string for the ToolMessage content. */
592
+ function safeStringify(v) {
593
+ return typeof v === 'string' ? v : JSON.stringify(v);
594
+ }
595
+ /**
596
+ * Creates a ClientToolsCapability backed by an AG-UI source agent and a
597
+ * ReducerStore. Extracted into a factory so it can be unit-tested in isolation
598
+ * without standing up a full Angular DI environment.
599
+ *
600
+ * The capability:
601
+ * - Maintains a catalog of client tool specs (setCatalog).
602
+ * - Exposes a `pending` computed signal: tool calls whose name is in the catalog,
603
+ * have no backend result, and haven't been resolved client-side yet — but ONLY
604
+ * when the run is not in progress (isLoading===false). The backend ends the run
605
+ * without emitting TOOL_CALL_RESULT for client tools, so result stays undefined.
606
+ * - resolve(id, result): marks the call as resolved, writes the outcome onto
607
+ * the local ToolCall in the store (so the transcript freezes: the mounted
608
+ * ask component re-renders with its emitted value as props and can branch to
609
+ * a frozen state), adds a ToolMessage via source.addMessage, then re-runs
610
+ * the agent with the catalog tools attached.
611
+ *
612
+ * Call catalogAsAgUiTools() to get the current catalog as AG-UI Tool[] for
613
+ * threading into runAgent().
614
+ */
615
+ function createClientToolsCapability(source, store) {
616
+ const catalog = signal([], ...(ngDevMode ? [{ debugName: "catalog" }] : []));
617
+ const resolvedIds = signal(new Set(), ...(ngDevMode ? [{ debugName: "resolvedIds" }] : []));
618
+ function catalogAsAgUiTools() {
619
+ return catalog().map(toAgUiTool);
620
+ }
621
+ const clientTools = {
622
+ setCatalog(specs) {
623
+ catalog.set([...specs]);
624
+ },
625
+ pending: computed(() => {
626
+ // Client tools are only actionable after the run ends (backend signals it
627
+ // by ending the run WITHOUT emitting TOOL_CALL_RESULT for client tools).
628
+ if (store.isLoading())
629
+ return [];
630
+ const names = new Set(catalog().map((s) => s.name));
631
+ const done = resolvedIds();
632
+ return store.toolCalls().filter((tc) => names.has(tc.name) && tc.result === undefined && !done.has(tc.id));
633
+ }),
634
+ resolve(id, result) {
635
+ // Mark as resolved first so pending() drops it immediately.
636
+ resolvedIds.update((s) => new Set(s).add(id));
637
+ // Write the outcome onto the LOCAL ToolCall in the store. The client tool
638
+ // DID produce a result client-side, so this is semantically correct — and
639
+ // it freezes the transcript card: toToolViewSpec spreads `{...args,
640
+ // ...result, status}` into the mounted ask component, so the component
641
+ // re-renders with its own emitted value as props and can branch to a
642
+ // resolved/frozen state. The backend ToolMessage never reaches this local
643
+ // ToolCall, so without this write the card stays interactive forever.
644
+ const ok = result.ok;
645
+ const value = result.value;
646
+ const error = result.error;
647
+ store.toolCalls.update((calls) => calls.map((tc) => tc.id === id
648
+ ? {
649
+ ...tc,
650
+ result: ok ? value : { error },
651
+ ...(ok ? {} : { error, status: 'error' }),
652
+ }
653
+ : tc));
654
+ // Cast rather than rely on discriminant narrowing: consumer apps that
655
+ // compile this source with `strictNullChecks: false` don't narrow the
656
+ // ClientToolResult union in a ternary.
657
+ const content = ok
658
+ ? safeStringify(value)
659
+ : `Error: ${error}`;
660
+ source.addMessage({
661
+ id: `tool-${id}`,
662
+ role: 'tool',
663
+ toolCallId: id,
664
+ content,
665
+ });
666
+ void source.runAgent({ tools: catalogAsAgUiTools() });
667
+ },
668
+ catalogAsAgUiTools,
669
+ };
670
+ return clientTools;
671
+ }
672
+
515
673
  // SPDX-License-Identifier: MIT
516
674
  function captureAgentRuntimeTelemetry(sink, event, properties) {
517
675
  if (!sink)
@@ -554,15 +712,73 @@ function toAgent(source, options = {}) {
554
712
  messages: signal([]),
555
713
  status: signal('idle'),
556
714
  isLoading: signal(false),
557
- error: signal(null),
715
+ error: signal(undefined),
558
716
  toolCalls: signal([]),
559
717
  state: signal({}),
560
718
  interrupt: signal(undefined),
561
719
  events$: new Subject(),
562
720
  customEvents: signal([]),
721
+ activities: signal(new Map()),
563
722
  };
564
723
  const telemetryProperties = { transport: 'ag-ui', surface: 'to_agent' };
565
724
  let activeRun = null;
725
+ // Set by stop(); lets run-failure handlers distinguish a user-initiated
726
+ // abort (graceful cancel) from a genuine stream failure.
727
+ let abortRequested = false;
728
+ // Set to true the first time settleIfAborted() handles an abort error for the
729
+ // current run. The AG-UI client can surface the same abort via both the event
730
+ // stream (RUN_ERROR event) AND onRunFailed — abortSettled lets the second
731
+ // delivery see through as a no-op rather than re-writing store state or
732
+ // triggering a real error path. Both flags are reset together at the top of
733
+ // submit() so the next run starts clean.
734
+ let abortSettled = false;
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;
738
+ /** Settles the store as idle for stop()-induced failures; returns true if handled. */
739
+ function settleIfAborted(error) {
740
+ // If we already settled this abort (duplicate delivery — e.g. RUN_ERROR
741
+ // event THEN onRunFailed), defensively re-apply the idle settle so any
742
+ // state written between the two deliveries (e.g. RUN_STARTED from a new
743
+ // run that started before flags were reset) is corrected. Telemetry is
744
+ // not re-emitted — the guard returns true to suppress further processing.
745
+ if (abortSettled && isAbortError(error)) {
746
+ store.status.set('idle');
747
+ store.isLoading.set(false);
748
+ return true;
749
+ }
750
+ if (!abortRequested || !isAbortError(error))
751
+ return false;
752
+ abortRequested = false;
753
+ abortSettled = true;
754
+ store.status.set('idle');
755
+ store.isLoading.set(false);
756
+ // Not a failure: leave store.error null and close out telemetry as a
757
+ // normal finish so the aborted run doesn't count as errored.
758
+ const run = activeRun;
759
+ if (run) {
760
+ finishRunTelemetry(run);
761
+ // Mark errored so any subsequent finishRunTelemetry/failRunTelemetry
762
+ // call on the same run object (e.g. from submit's try block resolving
763
+ // after the abort) is a no-op — telemetry fires at most once per run.
764
+ run.errored = true;
765
+ }
766
+ return true;
767
+ }
768
+ // Build the client-tools capability. catalogAsAgUiTools() is used below to
769
+ // thread the catalog into every runAgent() call.
770
+ const clientToolsCap = createClientToolsCapability(source, store);
771
+ /** Forward a neutral-contract state patch onto the AG-UI run input.
772
+ * Mirrors the canonical demo's `input.state` mechanism: the patch is
773
+ * merged into the source agent's client state (carried on
774
+ * RunAgentInput.state) and reflected optimistically in the local
775
+ * state signal — the server's next STATE_SNAPSHOT stays authoritative. */
776
+ const applyStatePatch = (patch) => {
777
+ if (!patch || Object.keys(patch).length === 0)
778
+ return;
779
+ source.state = { ...(source.state ?? {}), ...patch };
780
+ store.state.update((prev) => ({ ...prev, ...patch }));
781
+ };
566
782
  captureAgentRuntimeTelemetry(options.telemetry, 'ngaf:runtime_instance_created', telemetryProperties);
567
783
  function startRunTelemetry(requestType) {
568
784
  const run = { startedAt: Date.now(), errored: false };
@@ -596,19 +812,84 @@ function toAgent(source, options = {}) {
596
812
  if (activeRun === run)
597
813
  activeRun = null;
598
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
+ }
599
836
  // Tap all events from the source agent via the AgentSubscriber API.
600
837
  // This subscription lives for the lifetime of `source`.
601
838
  source.subscribe({
602
839
  onEvent({ event }) {
840
+ // The AG-UI client surfaces a user-initiated abort both as a
841
+ // RUN_ERROR event (here) and via onRunFailed; guard the event path too
842
+ // so the reducer never marks a deliberate stop as an error.
843
+ if (event.type === 'RUN_ERROR') {
844
+ const message = event.message ?? '';
845
+ if (settleIfAborted(new Error(message)))
846
+ return;
847
+ }
603
848
  reduceEvent(event, store);
604
849
  },
605
850
  onRunFailed({ error }) {
851
+ if (settleIfAborted(error))
852
+ return;
606
853
  store.status.set('error');
607
854
  store.isLoading.set(false);
608
- store.error.set(error);
855
+ store.error.set(toAgentError(error));
609
856
  failRunTelemetry(error);
610
857
  },
611
858
  });
859
+ // Stable Subagent wrappers per messageId so chat-subagents (tracks by
860
+ // toolCallId) doesn't churn as activity content streams.
861
+ const subagentWrappers = new Map();
862
+ function subagentFor(id, entry) {
863
+ let w = subagentWrappers.get(id);
864
+ if (!w) {
865
+ w = {
866
+ toolCallId: entry.content()['toolCallId'] ?? id,
867
+ name: entry.content()['name'],
868
+ status: computed(() => entry.content()['status'] ?? 'running'),
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
+ }),
887
+ state: computed(() => entry.content()['state'] ?? {}),
888
+ };
889
+ subagentWrappers.set(id, w);
890
+ }
891
+ return w;
892
+ }
612
893
  return {
613
894
  messages: store.messages,
614
895
  status: store.status,
@@ -619,25 +900,53 @@ function toAgent(source, options = {}) {
619
900
  interrupt: store.interrupt,
620
901
  events$: store.events$.asObservable(),
621
902
  customEvents: store.customEvents,
903
+ subagents: computed(() => {
904
+ const out = new Map();
905
+ for (const [id, entry] of store.activities()) {
906
+ if (entry.activityType !== 'subagent')
907
+ continue;
908
+ out.set(id, subagentFor(id, entry));
909
+ }
910
+ // Prune stale wrappers: keeps the cache bounded and prevents a reused
911
+ // tool-call-id from binding to an orphaned (pre-RUN_STARTED) content signal.
912
+ for (const id of subagentWrappers.keys()) {
913
+ if (!out.has(id))
914
+ subagentWrappers.delete(id);
915
+ }
916
+ return out;
917
+ }),
918
+ clientTools: clientToolsCap,
622
919
  submit: async (input, _opts) => {
920
+ // Reset both abort flags so a new submit starts clean and genuine
921
+ // failures after a previous stop are never swallowed.
922
+ abortRequested = false;
923
+ abortSettled = false;
623
924
  if (input.resume !== undefined) {
624
925
  // Resume path: clear the pending interrupt and replay the run with the
625
926
  // resume payload forwarded to the LangGraph backend via AG-UI's
626
927
  // forwardedProps.command.resume mechanism.
928
+ applyStatePatch(input.state);
627
929
  store.interrupt.set(undefined);
628
930
  const run = startRunTelemetry('resume');
931
+ const tools = clientToolsCap.catalogAsAgUiTools();
629
932
  try {
630
- await source.runAgent({ forwardedProps: { command: { resume: input.resume } } });
933
+ await source.runAgent({
934
+ forwardedProps: { command: { resume: input.resume } },
935
+ ...(tools.length > 0 ? { tools } : {}),
936
+ });
631
937
  finishRunTelemetry(run);
632
938
  }
633
939
  catch (err) {
634
- store.status.set('error');
635
- store.isLoading.set(false);
636
- store.error.set(err);
637
- failRunTelemetry(err, run);
940
+ if (!settleIfAborted(err)) {
941
+ store.status.set('error');
942
+ store.isLoading.set(false);
943
+ store.error.set(toAgentError(err));
944
+ failRunTelemetry(err, run);
945
+ }
638
946
  }
639
947
  return;
640
948
  }
949
+ applyStatePatch(input.state);
641
950
  // Optimistic append of user message to our signals and to the source
642
951
  // agent's own message list so runAgent() sees the new message.
643
952
  const userMsg = buildUserMessage(input);
@@ -646,27 +955,36 @@ function toAgent(source, options = {}) {
646
955
  // Sync to AG-UI source so it's included in the next run's input.
647
956
  source.addMessage(userMsg);
648
957
  }
649
- const run = startRunTelemetry('submit');
650
- try {
651
- await source.runAgent();
652
- finishRunTelemetry(run);
653
- }
654
- catch (err) {
655
- // If the run was aborted via stop(), abortRun() resolves the promise
656
- // rather than rejecting but catch any unexpected errors here.
657
- store.status.set('error');
658
- store.isLoading.set(false);
659
- store.error.set(err);
660
- failRunTelemetry(err, run);
661
- }
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();
662
973
  },
663
974
  stop: async () => {
975
+ abortRequested = true;
664
976
  source.abortRun();
665
977
  },
666
978
  regenerate: async (assistantMessageIndex) => {
667
979
  if (store.isLoading()) {
668
980
  throw new Error('Cannot regenerate while agent is loading another response');
669
981
  }
982
+ // Reset abort flags so a regenerate starts clean, exactly like submit().
983
+ // Without this, flags left over from a prior stop() would cause the
984
+ // duplicate-delivery guard in settleIfAborted() to silently swallow the
985
+ // abort error without settling, wedging the store in streaming/running.
986
+ abortRequested = false;
987
+ abortSettled = false;
670
988
  const msgs = store.messages();
671
989
  const target = msgs[assistantMessageIndex];
672
990
  if (!target || target.role !== 'assistant') {
@@ -693,15 +1011,18 @@ function toAgent(source, options = {}) {
693
1011
  // message in `trimmed` becomes the active prompt for the next run.
694
1012
  source.setMessages(trimmed);
695
1013
  const run = startRunTelemetry('regenerate');
1014
+ const regenTools = clientToolsCap.catalogAsAgUiTools();
696
1015
  try {
697
- await source.runAgent();
1016
+ await source.runAgent(regenTools.length > 0 ? { tools: regenTools } : undefined);
698
1017
  finishRunTelemetry(run);
699
1018
  }
700
1019
  catch (err) {
701
- store.status.set('error');
702
- store.isLoading.set(false);
703
- store.error.set(err);
704
- failRunTelemetry(err, run);
1020
+ if (!settleIfAborted(err)) {
1021
+ store.status.set('error');
1022
+ store.isLoading.set(false);
1023
+ store.error.set(toAgentError(err));
1024
+ failRunTelemetry(err, run);
1025
+ }
705
1026
  }
706
1027
  },
707
1028
  };
@@ -719,44 +1040,40 @@ function randomId() {
719
1040
  }
720
1041
 
721
1042
  // SPDX-License-Identifier: MIT
722
- /** @internal — exported for spec access only. Consumers must use injectAgent(). */
723
- const AGENT = new InjectionToken('AGENT');
724
1043
  /**
725
- * Provides an Agent instance wired through HttpAgent and toAgent.
726
- * Constructs an HttpAgent from config and wraps it in the runtime-neutral
727
- * Agent contract via toAgent(). Returns a provider array suitable for
728
- * bootstrapApplication or TestBed.configureTestingModule().
729
- *
730
- * **Static vs factory config.** Pass a plain `AgentConfig` object when the
731
- * config is known up front. Pass a `() => AgentConfig` factory when the config
732
- * depends on runtime/DI state — the factory runs inside an Angular injection
733
- * context, so it may call `inject()` to read services or route params.
1044
+ * @internal exported for spec access only. Consumers must use injectAgent().
1045
+ * Both `provideAgent` and `provideFakeAgent` register the result of `toAgent()`,
1046
+ * which is always an `AgUiAgent`, so the token is typed accordingly.
734
1047
  */
735
- function provideAgent(configOrFactory) {
736
- return [
737
- {
738
- provide: AGENT,
739
- useFactory: () => {
740
- // useFactory runs in an injection context, so a config factory may
741
- // call inject() to read runtime/DI state.
742
- const config = typeof configOrFactory === 'function' ? configOrFactory() : configOrFactory;
743
- const source = new HttpAgent({
744
- url: config.url,
745
- ...(config.agentId !== undefined ? { agentId: config.agentId } : {}),
746
- ...(config.threadId !== undefined ? { threadId: config.threadId } : {}),
747
- ...(config.headers !== undefined ? { headers: config.headers } : {}),
748
- });
749
- return toAgent(source, { telemetry: config.telemetry });
750
- },
751
- },
1048
+ const AGENT = new InjectionToken('AGENT');
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) },
752
1070
  ];
1071
+ if (ref)
1072
+ providers.push({ provide: ref.token, useExisting: AGENT });
1073
+ return providers;
753
1074
  }
754
- /**
755
- * Injects the Agent from Angular's dependency injection container.
756
- * Use this in components or services that have been provided via provideAgent().
757
- */
758
- function injectAgent() {
759
- return inject(AGENT);
1075
+ function injectAgent(ref) {
1076
+ return inject(ref ? ref.token : AGENT);
760
1077
  }
761
1078
 
762
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/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 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\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}\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 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 const args = safeParseArgs(e.delta);\n store.toolCalls.update((prev) =>\n prev.map((t) => t.id === e.toolCallId ? { ...t, args } : t),\n );\n return;\n }\n case 'TOOL_CALL_END': {\n const e = event as unknown as { toolCallId: string };\n store.toolCalls.update((prev) =>\n prev.map((t) => t.id === e.toolCallId ? { ...t, status: 'complete' } : t),\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 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 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 { 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} from '@threadplane/chat';\nimport { reduceEvent, type ReducerStore, type CustomStreamEvent } from './reducer';\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). Mirrors langgraph's LangGraphAgent extension.\n */\nexport interface AgUiAgent extends Agent {\n customEvents: Signal<CustomStreamEvent[]>;\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 };\n const telemetryProperties = { transport: 'ag-ui' as const, surface: 'to_agent' };\n let activeRun: { startedAt: number; errored: boolean } | null = null;\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 reduceEvent(event, store);\n },\n onRunFailed({ error }) {\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(error);\n failRunTelemetry(error);\n },\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\n submit: async (input: AgentSubmitInput, _opts?: AgentSubmitOptions) => {\n if (input.resume !== undefined) {\n // Resume path: clear the pending interrupt and replay the run with the\n // resume payload forwarded to the LangGraph backend via AG-UI's\n // forwardedProps.command.resume mechanism.\n store.interrupt.set(undefined);\n const run = startRunTelemetry('resume');\n try {\n await source.runAgent({ forwardedProps: { command: { resume: input.resume } } });\n finishRunTelemetry(run);\n } catch (err) {\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(err);\n failRunTelemetry(err, run);\n }\n return;\n }\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 try {\n await source.runAgent();\n finishRunTelemetry(run);\n } catch (err) {\n // If the run was aborted via stop(), abortRun() resolves the promise\n // rather than rejecting — but catch any unexpected errors here.\n store.status.set('error');\n store.isLoading.set(false);\n store.error.set(err);\n failRunTelemetry(err, run);\n }\n },\n\n stop: async () => {\n source.abortRun();\n },\n\n regenerate: async (assistantMessageIndex: number): Promise<void> => {\n if (store.isLoading()) {\n throw new Error('Cannot regenerate while agent is loading another response');\n }\n const msgs = store.messages();\n const target = msgs[assistantMessageIndex];\n if (!target || target.role !== 'assistant') {\n throw new Error(`Message at index ${assistantMessageIndex} is not an assistant message`);\n }\n\n // Find the user message immediately preceding the target assistant message.\n const userIdx = msgs\n .slice(0, assistantMessageIndex)\n .map((m, i) => ({ m, i }))\n .reverse()\n .find(({ m }) => m.role === 'user')?.i;\n if (userIdx === undefined) {\n throw new Error('No user message found before the target assistant message');\n }\n\n // Truncate local message buffer INCLUSIVE of the user message. This\n // preserves the user message in the UI (replace-semantics) while the\n // new assistant response streams in. The trailing user message becomes\n // the active prompt for the next run — we must NOT re-add it.\n const trimmed = msgs.slice(0, userIdx + 1);\n store.messages.set(trimmed);\n\n // Sync the trimmed list back to the source agent so its internal state\n // matches what we're about to re-run. source.setMessages() replaces the\n // agent's internal message list without appending — the trailing user\n // message in `trimmed` becomes the active prompt for the next run.\n source.setMessages(trimmed as Parameters<typeof source.setMessages>[0]);\n\n const run = startRunTelemetry('regenerate');\n try {\n await source.runAgent();\n finishRunTelemetry(run);\n } catch (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\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 { Agent, AgentRuntimeTelemetrySink } from '@threadplane/chat';\nimport { toAgent } 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/** @internal — exported for spec access only. Consumers must use injectAgent(). */\nexport const AGENT = new InjectionToken<Agent>('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 Agent from Angular's dependency injection container.\n * Use this in components or services that have been provided via provideAgent().\n */\nexport function injectAgent(): Agent {\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.49",
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",
@@ -13,6 +13,7 @@
13
13
  "@threadplane/chat": "*",
14
14
  "@angular/core": "^20.0.0 || ^21.0.0",
15
15
  "@ag-ui/client": "*",
16
+ "@ag-ui/core": "*",
16
17
  "rxjs": "~7.8.0"
17
18
  },
18
19
  "license": "MIT",
@@ -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, 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
 
@@ -23,10 +23,16 @@ interface ToAgentOptions {
23
23
  /**
24
24
  * The neutral Agent contract, widened with the AG-UI adapter's optional
25
25
  * `customEvents` signal (the chat composition feature-detects it to enable
26
- * live a2ui streaming). Mirrors langgraph's LangGraphAgent extension.
26
+ * live a2ui streaming) and the optional `clientTools` capability.
27
+ * Mirrors langgraph's LangGraphAgent extension.
27
28
  */
28
- interface AgUiAgent extends Agent {
29
+ interface AgUiAgent<TState = Record<string, unknown>> extends Agent<TState> {
29
30
  customEvents: Signal<CustomStreamEvent[]>;
31
+ clientTools: ClientToolsCapability;
32
+ /** Subagent activities (activityType==='subagent') projected to the neutral
33
+ * Subagent contract, keyed by messageId. Narrows the base Agent's optional
34
+ * `subagents?` to a concrete signal for AG-UI consumers. */
35
+ subagents: Signal<Map<string, Subagent>>;
30
36
  }
31
37
  /**
32
38
  * Wraps an AG-UI AbstractAgent into the runtime-neutral Agent contract.
@@ -70,13 +76,43 @@ interface AgentConfig {
70
76
  * config is known up front. Pass a `() => AgentConfig` factory when the config
71
77
  * depends on runtime/DI state — the factory runs inside an Angular injection
72
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
+ * ```
73
92
  */
93
+ declare function provideAgent<T = Record<string, unknown>>(ref: AgentRef<T>, configOrFactory: AgentConfig | (() => AgentConfig)): Provider[];
74
94
  declare function provideAgent(configOrFactory: AgentConfig | (() => AgentConfig)): Provider[];
75
95
  /**
76
- * Injects the Agent from Angular's dependency injection container.
77
- * Use this in components or services that have been provided via provideAgent().
96
+ * Injects the AG-UI agent from Angular's dependency injection container.
97
+ * Use this in components or services provided via `provideAgent()` (or
98
+ * `provideFakeAgent()`).
99
+ *
100
+ * Returns an `AgUiAgent` — the runtime-neutral `Agent` contract plus the
101
+ * AG-UI-specific `customEvents` signal — so `customEvents` is reachable
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>>`.
78
113
  */
79
- declare function injectAgent(): Agent;
114
+ declare function injectAgent(): AgUiAgent;
115
+ declare function injectAgent<T>(ref: AgentRef<T>): AgUiAgent<T>;
80
116
 
81
117
  /**
82
118
  * In-process AG-UI agent that emits a canned streaming response.