@dudousxd/nestjs-agent-react 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -43,6 +43,7 @@ __export(src_exports, {
43
43
  loadStoredSpeechLang: () => loadStoredSpeechLang,
44
44
  persistSpeechLang: () => persistSpeechLang,
45
45
  storedMessageToUiMessage: () => storedMessageToUiMessage,
46
+ storedThreadToUiMessages: () => storedThreadToUiMessages,
46
47
  useAgentChat: () => useAgentChat,
47
48
  useSpeechRecognition: () => useSpeechRecognition
48
49
  });
@@ -70,6 +71,7 @@ var AgentChatTransport = class {
70
71
  return this.currentThreadId;
71
72
  }
72
73
  async sendMessages(options) {
74
+ this.options.onAttemptStart?.();
73
75
  const lastMessage = options.messages.at(-1);
74
76
  const message = lastMessage ? extractText(lastMessage) : "";
75
77
  const body = {
@@ -102,6 +104,7 @@ var AgentChatTransport = class {
102
104
  return this.toChunkStream(response.body);
103
105
  }
104
106
  async reconnectToStream(options) {
107
+ this.options.onAttemptStart?.();
105
108
  const runId = this.options.getResumeRunId?.();
106
109
  if (runId === void 0) return null;
107
110
  const response = await this.fetchImpl()(`${this.baseUrl()}/agent/chat/${encodeURIComponent(runId)}/stream`, {
@@ -611,6 +614,59 @@ function storedMessageToUiMessage(message) {
611
614
  }
612
615
  __name(storedMessageToUiMessage, "storedMessageToUiMessage");
613
616
 
617
+ // src/stored-thread-to-ui-messages.ts
618
+ function storedThreadToUiMessages(messages) {
619
+ const turns = [];
620
+ for (const message of messages) {
621
+ const currentTurn = turns.at(-1);
622
+ const previousRow = currentTurn?.at(-1);
623
+ if (message.role === "assistant" && previousRow?.role === "assistant" && currentTurn) {
624
+ currentTurn.push(message);
625
+ } else {
626
+ turns.push([
627
+ message
628
+ ]);
629
+ }
630
+ }
631
+ return turns.map(mergeTurn);
632
+ }
633
+ __name(storedThreadToUiMessages, "storedThreadToUiMessages");
634
+ function mergeTurn(rows) {
635
+ const lastRow = rows.at(-1);
636
+ if (lastRow === void 0) {
637
+ throw new Error("storedThreadToUiMessages: encountered an empty turn");
638
+ }
639
+ if (rows.length === 1) {
640
+ return storedMessageToUiMessage(lastRow);
641
+ }
642
+ const parts = rows.flatMap((row) => storedMessageToUiMessage(row).parts);
643
+ const usage = sumUsage(rows);
644
+ return {
645
+ id: lastRow.id,
646
+ role: lastRow.role,
647
+ parts,
648
+ ...usage !== void 0 ? {
649
+ metadata: {
650
+ usage
651
+ }
652
+ } : {}
653
+ };
654
+ }
655
+ __name(mergeTurn, "mergeTurn");
656
+ function sumUsage(rows) {
657
+ const usages = rows.map((row) => row.usage).filter((usage) => usage !== void 0);
658
+ if (usages.length === 0) {
659
+ return void 0;
660
+ }
661
+ const allCostsUnknown = usages.every((usage) => usage.costUsd === null || usage.costUsd === void 0);
662
+ return {
663
+ inputTokens: usages.reduce((sum, usage) => sum + usage.inputTokens, 0),
664
+ outputTokens: usages.reduce((sum, usage) => sum + usage.outputTokens, 0),
665
+ costUsd: allCostsUnknown ? null : usages.reduce((sum, usage) => sum + (usage.costUsd ?? 0), 0)
666
+ };
667
+ }
668
+ __name(sumUsage, "sumUsage");
669
+
614
670
  // src/use-agent-chat.ts
615
671
  var import_react = require("@ai-sdk/react");
616
672
  var import_react2 = require("react");
@@ -620,6 +676,7 @@ function useAgentChat(options) {
620
676
  const [runId, setRunId] = (0, import_react2.useState)(options.resumeRunId);
621
677
  const runIdRef = (0, import_react2.useRef)(runId);
622
678
  runIdRef.current = runId;
679
+ const settlingRunIdRef = (0, import_react2.useRef)(void 0);
623
680
  const autoResumeRunIdRef = (0, import_react2.useRef)(void 0);
624
681
  const [autoResume, setAutoResume] = (0, import_react2.useState)(false);
625
682
  const [activeRunId, setActiveRunId] = (0, import_react2.useState)(null);
@@ -662,6 +719,7 @@ function useAgentChat(options) {
662
719
  ]);
663
720
  const transport = (0, import_react2.useMemo)(() => {
664
721
  function onMeta(meta) {
722
+ settlingRunIdRef.current = meta.runId;
665
723
  setRunId(meta.runId);
666
724
  if (latest.current.threadId === void 0 && meta.threadId && createdThreadId.current !== meta.threadId) {
667
725
  createdThreadId.current = meta.threadId;
@@ -702,7 +760,10 @@ function useAgentChat(options) {
702
760
  };
703
761
  }, "getBody"),
704
762
  getResumeRunId: /* @__PURE__ */ __name(() => latest.current.resumeRunId ?? autoResumeRunIdRef.current, "getResumeRunId"),
705
- onMeta
763
+ onMeta,
764
+ onAttemptStart: /* @__PURE__ */ __name(() => {
765
+ settlingRunIdRef.current = void 0;
766
+ }, "onAttemptStart")
706
767
  });
707
768
  }, []);
708
769
  const chat = (0, import_react.useChat)({
@@ -714,8 +775,15 @@ function useAgentChat(options) {
714
775
  ...options.initialMessages !== void 0 ? {
715
776
  messages: options.initialMessages
716
777
  } : {},
717
- onFinish: /* @__PURE__ */ __name(() => {
778
+ onFinish: /* @__PURE__ */ __name(({ isError }) => {
718
779
  latest.current.onFinish?.();
780
+ const settledRunId = settlingRunIdRef.current;
781
+ if (settledRunId !== void 0) {
782
+ latest.current.onRunSettled?.({
783
+ runId: settledRunId,
784
+ status: isError ? "failed" : "completed"
785
+ });
786
+ }
719
787
  }, "onFinish")
720
788
  });
721
789
  const chatRef = (0, import_react2.useRef)(chat);
@@ -1421,6 +1489,7 @@ __name(persistSpeechLang, "persistSpeechLang");
1421
1489
  loadStoredSpeechLang,
1422
1490
  persistSpeechLang,
1423
1491
  storedMessageToUiMessage,
1492
+ storedThreadToUiMessages,
1424
1493
  useAgentChat,
1425
1494
  useSpeechRecognition
1426
1495
  });