@gendive/chatllm 0.17.23 → 0.17.24

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.
@@ -2735,6 +2735,26 @@ ${attachmentContext}
2735
2735
  } catch {
2736
2736
  }
2737
2737
  }
2738
+ const saveMessagesOnEarlyReturn = () => {
2739
+ if (!useExternalStorage || !capturedSessionId) return;
2740
+ queueMicrotask(() => {
2741
+ const latestSession = sessionsRef.current.find((s) => s.id === capturedSessionId);
2742
+ if (!latestSession) return;
2743
+ const latestMessages = latestSession.messages;
2744
+ const assistantMsg = [...latestMessages].reverse().find((m) => m.role === "assistant");
2745
+ const userMsg = latestMessages.find((m) => m.role === "user" && m.content === finalContent);
2746
+ const assistantContent = assistantMsg?.content || "";
2747
+ if (assistantContent && onSaveMessagesRef.current) {
2748
+ onSaveMessagesRef.current(capturedSessionId, [
2749
+ { role: "user", message: finalContent, ...userMsg?.contentParts && { contentParts: userMsg.contentParts } },
2750
+ { role: "assistant", message: assistantContent, ...assistantMsg?.contentParts && { contentParts: assistantMsg.contentParts } }
2751
+ ]).catch((e) => console.error("[useChatUI] Failed to save messages:", e));
2752
+ }
2753
+ if (latestSession.messages.length > 0) {
2754
+ writeSessionCache(storageKey, latestSession);
2755
+ }
2756
+ });
2757
+ };
2738
2758
  if (!shouldSkipSkillParsing) {
2739
2759
  const assistantContent = accumulatedContent;
2740
2760
  const { skillCall: detectedSkill, cleanContent: skillCleanContent } = parseSkillCallFromContent(assistantContent);
@@ -2838,6 +2858,7 @@ ${attachmentContext}
2838
2858
  })
2839
2859
  );
2840
2860
  if (resultType === "image" || resultType === "file") {
2861
+ saveMessagesOnEarlyReturn();
2841
2862
  setIsLoading(false);
2842
2863
  abortControllerRef.current = null;
2843
2864
  return;
@@ -2848,11 +2869,13 @@ ${attachmentContext}
2848
2869
  shouldContinue = decision === "continue";
2849
2870
  }
2850
2871
  if (!shouldContinue) {
2872
+ saveMessagesOnEarlyReturn();
2851
2873
  setIsLoading(false);
2852
2874
  abortControllerRef.current = null;
2853
2875
  return;
2854
2876
  }
2855
2877
  skipNextSkillParsingRef.current = true;
2878
+ saveMessagesOnEarlyReturn();
2856
2879
  const feedbackPrompt = resultType === "error" ? `\uB3C4\uAD6C "${toolName}" \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD: ${result.content}
2857
2880
 
2858
2881
  \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC624\uB958\uB97C \uC548\uB0B4\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.` : `\uB3C4\uAD6C "${toolName}" \uACB0\uACFC:
@@ -2888,6 +2911,7 @@ ${result.content}
2888
2911
  })
2889
2912
  );
2890
2913
  if (streamedReport) {
2914
+ saveMessagesOnEarlyReturn();
2891
2915
  setIsLoading(false);
2892
2916
  abortControllerRef.current = null;
2893
2917
  return;
@@ -2898,11 +2922,13 @@ ${result.content}
2898
2922
  shouldContinueSkill = decision === "continue";
2899
2923
  }
2900
2924
  if (!shouldContinueSkill) {
2925
+ saveMessagesOnEarlyReturn();
2901
2926
  setIsLoading(false);
2902
2927
  abortControllerRef.current = null;
2903
2928
  return;
2904
2929
  }
2905
2930
  skipNextSkillParsingRef.current = true;
2931
+ saveMessagesOnEarlyReturn();
2906
2932
  const resultPrompt = `\uC2A4\uD0AC "${detectedSkill.name}" \uC2E4\uD589 \uACB0\uACFC:
2907
2933
 
2908
2934
  ${result.content}
@@ -6439,6 +6465,7 @@ var MarkdownRenderer = ({
6439
6465
  if (hasUnfinishedPoll) {
6440
6466
  processedContent += "\n\xA7POLL_LOADING\xA7";
6441
6467
  }
6468
+ processedContent = processedContent.replace(/<skill_use[^>]*>[\s\S]*?<\/skill_use>/gi, "");
6442
6469
  processedContent = processedContent.replace(UNCLOSED_SKILL_TAG_REGEX, "");
6443
6470
  const codeBlocks = [];
6444
6471
  processedContent = processedContent.replace(CODE_BLOCK_REGEX, (match, lang, code) => {