@gendive/chatllm 0.17.29 → 0.17.31

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.
@@ -2056,32 +2056,52 @@ ${projectMemoryContext}`);
2056
2056
  parts.push("");
2057
2057
  parts.push(`## \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uC790\uB3D9 \uC2E4\uD589 \uAE30\uB2A5
2058
2058
 
2059
- \uBCF5\uD569 \uC791\uC5C5(\uC870\uC0AC, \uBE44\uAD50 \uBD84\uC11D, \uB2E4\uB2E8\uACC4 \uC791\uC5C5)\uC744 \uC694\uCCAD\uBC1B\uC73C\uBA74 <checklist> \uD0DC\uADF8\uB85C \uC2E4\uD589 \uACC4\uD68D\uC744 \uC791\uC131\uD558\uC138\uC694.
2060
- \uC2DC\uC2A4\uD15C\uC774 \uAC01 \uB2E8\uACC4\uB97C \uC790\uB3D9\uC73C\uB85C \uD558\uB098\uC529 \uC2E4\uD589\uD569\uB2C8\uB2E4.
2059
+ **\uC911\uC694: \uC544\uB798 \uC870\uAC74\uC5D0 \uD574\uB2F9\uD558\uBA74 \uBC18\uB4DC\uC2DC <checklist> \uD0DC\uADF8\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.**
2060
+
2061
+ \uB2E4\uC74C \uC694\uCCAD\uC5D0\uB294 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uB97C \uC0AC\uC6A9\uD558\uC138\uC694:
2062
+ - \uC5EC\uB7EC \uB300\uC0C1\uC744 \uAC80\uC0C9/\uC870\uC0AC\uD558\uB294 \uC694\uCCAD (\uC608: "A\uC640 B \uAC80\uC0C9\uD574\uC918", "XX \uAD00\uB828 \uC11C\uBE44\uC2A4 \uCC3E\uC544\uC918")
2063
+ - \uBE44\uAD50 \uBD84\uC11D \uC694\uCCAD (\uC608: "A\uC0AC\uC640 B\uC0AC \uBE44\uAD50\uD574\uC918")
2064
+ - \uBCF4\uACE0\uC11C/\uB9AC\uD3EC\uD2B8 \uC791\uC131 \uC694\uCCAD
2065
+ - 3\uB2E8\uACC4 \uC774\uC0C1\uC758 \uBCF5\uD569 \uC791\uC5C5
2066
+
2067
+ \uC2DC\uC2A4\uD15C\uC774 \uAC01 \uB2E8\uACC4\uB97C \uC790\uB3D9\uC73C\uB85C \uD558\uB098\uC529 \uC2E4\uD589\uD569\uB2C8\uB2E4. \uB2F9\uC2E0\uC740 \uACC4\uD68D\uB9CC \uC138\uC6B0\uBA74 \uB429\uB2C8\uB2E4.
2061
2068
 
2062
2069
  **\uD615\uC2DD:**
2070
+ \uC9E7\uC740 \uC548\uB0B4 \uBA54\uC2DC\uC9C0
2071
+
2063
2072
  <checklist>
2064
2073
  <step>1\uB2E8\uACC4 \uC81C\uBAA9</step>
2065
2074
  <step>2\uB2E8\uACC4 \uC81C\uBAA9</step>
2066
2075
  <step>3\uB2E8\uACC4 \uC81C\uBAA9</step>
2067
2076
  </checklist>
2068
2077
 
2069
- **\uC608\uC2DC - "A\uC0AC\uC640 B\uC0AC \uBE44\uAD50 \uBD84\uC11D\uD574\uC918":**
2070
- \uB124, \uBE44\uAD50 \uBD84\uC11D\uC744 \uC9C4\uD589\uD558\uACA0\uC2B5\uB2C8\uB2E4.
2078
+ **\uC608\uC2DC 1 - "\uB370\uBE0C\uB2E4\uC774\uBE0C\uC640 \uC820\uB2E4\uC774\uBE0C \uAC80\uC0C9\uD558\uACE0 \uBCF4\uACE0\uC11C \uC791\uC131\uD574\uC918":**
2079
+ \uB124, \uC870\uC0AC\uB97C \uC9C4\uD589\uD558\uACA0\uC2B5\uB2C8\uB2E4.
2080
+
2081
+ <checklist>
2082
+ <step>\uB370\uBE0C\uB2E4\uC774\uBE0C \uC11C\uBE44\uC2A4 \uC815\uBCF4 \uC870\uC0AC</step>
2083
+ <step>\uC820\uB2E4\uC774\uBE0C \uC11C\uBE44\uC2A4 \uC815\uBCF4 \uC870\uC0AC</step>
2084
+ <step>\uC720\uC0AC \uC11C\uBE44\uC2A4 \uC870\uC0AC</step>
2085
+ <step>\uBE44\uAD50 \uBD84\uC11D\uD45C \uC791\uC131</step>
2086
+ <step>\uC885\uD569 \uBCF4\uACE0\uC11C \uC791\uC131</step>
2087
+ </checklist>
2088
+
2089
+ **\uC608\uC2DC 2 - "\uC6B0\uB9AC \uC11C\uBE44\uC2A4 \uB9C8\uCF00\uD305 \uC804\uB7B5 \uC138\uC6CC\uC918":**
2090
+ \uB9C8\uCF00\uD305 \uC804\uB7B5\uC744 \uB2E8\uACC4\uBCC4\uB85C \uC218\uB9BD\uD558\uACA0\uC2B5\uB2C8\uB2E4.
2071
2091
 
2072
2092
  <checklist>
2073
- <step>A\uC0AC \uC815\uBCF4 \uC870\uC0AC</step>
2074
- <step>B\uC0AC \uC815\uBCF4 \uC870\uC0AC</step>
2075
- <step>\uB450 \uD68C\uC0AC \uBE44\uAD50 \uBD84\uC11D\uD45C \uC791\uC131</step>
2076
- <step>\uC885\uD569 \uACB0\uB860 \uBC0F \uCD94\uCC9C</step>
2093
+ <step>\uD604\uC7AC \uC11C\uBE44\uC2A4 \uBD84\uC11D</step>
2094
+ <step>\uD0C0\uAC9F \uACE0\uAC1D \uC815\uC758</step>
2095
+ <step>\uACBD\uC7C1\uC0AC \uBCA4\uCE58\uB9C8\uD0B9</step>
2096
+ <step>\uB9C8\uCF00\uD305 \uC804\uB7B5 \uC218\uB9BD</step>
2077
2097
  </checklist>
2078
2098
 
2079
2099
  **\uADDC\uCE59:**
2080
- - 2~8\uB2E8\uACC4\uAC00 \uC801\uC808 (\uB108\uBB34 \uC801\uAC70\uB098 \uB9CE\uC73C\uBA74 \uC548 \uB428)
2100
+ - 2~8\uB2E8\uACC4\uAC00 \uC801\uC808
2081
2101
  - \uAC01 \uB2E8\uACC4\uB294 \uAD6C\uCCB4\uC801\uC774\uACE0 \uC2E4\uD589 \uAC00\uB2A5\uD55C \uC791\uC5C5
2082
2102
  - \uB2E8\uC21C \uC9C8\uBB38\uC774\uB098 \uD55C \uBC88\uC5D0 \uB2F5\uD560 \uC218 \uC788\uB294 \uC694\uCCAD\uC5D0\uB294 \uC0AC\uC6A9 \uAE08\uC9C0
2083
- - <checklist> \uD0DC\uADF8 \uC55E\uC5D0 \uC9E7\uC740 \uC548\uB0B4 \uBA54\uC2DC\uC9C0\uB97C \uD3EC\uD568
2084
- - \uAC80\uC0C9/\uC870\uC0AC, \uBE44\uAD50 \uBD84\uC11D, \uBCF4\uACE0\uC11C \uC791\uC131, \uB2E4\uB2E8\uACC4 \uC791\uC5C5\uC5D0 \uC801\uADF9 \uC0AC\uC6A9`);
2103
+ - <checklist> \uD0DC\uADF8 \uC55E\uC5D0 \uBC18\uB4DC\uC2DC \uC9E7\uC740 \uC548\uB0B4 \uBA54\uC2DC\uC9C0\uB97C \uD3EC\uD568\uD558\uC138\uC694
2104
+ - \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uD0DC\uADF8 \uB4A4\uC5D0 \uCD94\uAC00 \uD14D\uC2A4\uD2B8\uB97C \uC791\uC131\uD558\uC9C0 \uB9C8\uC138\uC694`);
2085
2105
  }
2086
2106
  return parts.length > 0 ? parts.join("\n") : "";
2087
2107
  }, [personalization, globalMemory, useGlobalMemoryEnabled, enablePoll, enableChecklist, buildSkillsPrompt, enableProjects, projectHook.currentProject, projectMemory]);
@@ -2866,6 +2886,7 @@ ${attachmentContext}
2866
2886
  }
2867
2887
  if (detectedSkill && !resolvedSkills[detectedSkill.name]) {
2868
2888
  console.warn(`[useChatUI] \uC2A4\uD0AC "${detectedSkill.name}" \uAC10\uC9C0\uB418\uC5C8\uC73C\uB098 \uBBF8\uB4F1\uB85D. \uB4F1\uB85D\uB41C \uC2A4\uD0AC:`, Object.keys(resolvedSkills));
2889
+ accumulatedContent = skillCleanContent;
2869
2890
  setSessions(
2870
2891
  (prev) => prev.map((s) => {
2871
2892
  if (s.id !== capturedSessionId) return s;
@@ -2880,84 +2901,157 @@ ${attachmentContext}
2880
2901
  );
2881
2902
  }
2882
2903
  if (detectedSkill && resolvedSkills[detectedSkill.name]) {
2883
- setSessions(
2884
- (prev) => prev.map((s) => {
2885
- if (s.id !== capturedSessionId) return s;
2886
- return {
2887
- ...s,
2888
- messages: s.messages.map((m) => {
2889
- if (m.id !== assistantMessageId) return m;
2890
- return {
2891
- ...m,
2892
- content: skillCleanContent,
2893
- skillExecution: {
2894
- skillName: detectedSkill.name,
2895
- params: detectedSkill.params,
2896
- status: "executing"
2897
- }
2898
- };
2899
- })
2900
- };
2901
- })
2902
- );
2903
- let streamedReport = "";
2904
- const { result } = await handleSkillCall(assistantContent, {
2905
- onProgress: (progress) => {
2906
- setSessions(
2907
- (prev) => prev.map((s) => {
2908
- if (s.id !== capturedSessionId) return s;
2909
- return {
2910
- ...s,
2911
- messages: s.messages.map((m) => {
2912
- if (m.id !== assistantMessageId) return m;
2913
- return {
2914
- ...m,
2915
- skillExecution: { ...m.skillExecution, progress }
2916
- };
2917
- })
2918
- };
2919
- })
2920
- );
2921
- },
2922
- onStream: (chunk) => {
2923
- streamedReport += chunk;
2924
- setSessions(
2925
- (prev) => prev.map((s) => {
2926
- if (s.id !== capturedSessionId) return s;
2927
- return {
2928
- ...s,
2929
- messages: s.messages.map((m) => {
2930
- if (m.id !== assistantMessageId) return m;
2931
- return { ...m, content: streamedReport };
2932
- })
2933
- };
2934
- })
2935
- );
2936
- },
2937
- signal: abortControllerRef.current?.signal
2938
- });
2939
- if (result) {
2940
- if (result.metadata?.__toolResult__) {
2941
- const resultType = result.metadata.resultType;
2942
- const toolName = result.metadata.toolName;
2943
- const toolLabel = result.metadata.toolLabel;
2944
- const toolIcon = result.metadata.toolIcon;
2945
- const parts = [];
2946
- if (skillCleanContent.trim()) {
2947
- parts.push({ type: "text", content: skillCleanContent });
2904
+ if (activeChecklistRef.current) {
2905
+ console.log("[useChatUI] \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB2E8\uACC4 \uB0B4 \uC2A4\uD0AC \uC2E4\uD589:", detectedSkill.name);
2906
+ accumulatedContent = skillCleanContent;
2907
+ setSessions(
2908
+ (prev) => prev.map((s) => {
2909
+ if (s.id !== capturedSessionId) return s;
2910
+ return { ...s, messages: s.messages.map((m) => m.id !== assistantMessageId ? m : { ...m, content: skillCleanContent }) };
2911
+ })
2912
+ );
2913
+ try {
2914
+ const { result: skillResult } = await handleSkillCall(assistantContent, {
2915
+ signal: abortControllerRef.current?.signal
2916
+ });
2917
+ if (skillResult?.content) {
2918
+ accumulatedContent = skillResult.content;
2948
2919
  }
2949
- parts.push({
2950
- type: "tool_result",
2951
- toolName,
2952
- label: toolLabel,
2953
- icon: toolIcon,
2954
- result: {
2955
- type: resultType,
2956
- content: result.content,
2957
- metadata: result.metadata,
2958
- sources: result.sources
2920
+ } catch (e) {
2921
+ console.warn("[useChatUI] \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB0B4 \uC2A4\uD0AC \uC2E4\uD589 \uC2E4\uD328:", e);
2922
+ }
2923
+ } else {
2924
+ setSessions(
2925
+ (prev) => prev.map((s) => {
2926
+ if (s.id !== capturedSessionId) return s;
2927
+ return {
2928
+ ...s,
2929
+ messages: s.messages.map((m) => {
2930
+ if (m.id !== assistantMessageId) return m;
2931
+ return {
2932
+ ...m,
2933
+ content: skillCleanContent,
2934
+ skillExecution: {
2935
+ skillName: detectedSkill.name,
2936
+ params: detectedSkill.params,
2937
+ status: "executing"
2938
+ }
2939
+ };
2940
+ })
2941
+ };
2942
+ })
2943
+ );
2944
+ let streamedReport = "";
2945
+ const { result } = await handleSkillCall(assistantContent, {
2946
+ onProgress: (progress) => {
2947
+ setSessions(
2948
+ (prev) => prev.map((s) => {
2949
+ if (s.id !== capturedSessionId) return s;
2950
+ return {
2951
+ ...s,
2952
+ messages: s.messages.map((m) => {
2953
+ if (m.id !== assistantMessageId) return m;
2954
+ return {
2955
+ ...m,
2956
+ skillExecution: { ...m.skillExecution, progress }
2957
+ };
2958
+ })
2959
+ };
2960
+ })
2961
+ );
2962
+ },
2963
+ onStream: (chunk) => {
2964
+ streamedReport += chunk;
2965
+ setSessions(
2966
+ (prev) => prev.map((s) => {
2967
+ if (s.id !== capturedSessionId) return s;
2968
+ return {
2969
+ ...s,
2970
+ messages: s.messages.map((m) => {
2971
+ if (m.id !== assistantMessageId) return m;
2972
+ return { ...m, content: streamedReport };
2973
+ })
2974
+ };
2975
+ })
2976
+ );
2977
+ },
2978
+ signal: abortControllerRef.current?.signal
2979
+ });
2980
+ if (result) {
2981
+ if (result.metadata?.__toolResult__) {
2982
+ const resultType = result.metadata.resultType;
2983
+ const toolName = result.metadata.toolName;
2984
+ const toolLabel = result.metadata.toolLabel;
2985
+ const toolIcon = result.metadata.toolIcon;
2986
+ const parts = [];
2987
+ if (skillCleanContent.trim()) {
2988
+ parts.push({ type: "text", content: skillCleanContent });
2959
2989
  }
2960
- });
2990
+ parts.push({
2991
+ type: "tool_result",
2992
+ toolName,
2993
+ label: toolLabel,
2994
+ icon: toolIcon,
2995
+ result: {
2996
+ type: resultType,
2997
+ content: result.content,
2998
+ metadata: result.metadata,
2999
+ sources: result.sources
3000
+ }
3001
+ });
3002
+ setSessions(
3003
+ (prev) => prev.map((s) => {
3004
+ if (s.id !== capturedSessionId) return s;
3005
+ return {
3006
+ ...s,
3007
+ messages: s.messages.map((m) => {
3008
+ if (m.id !== assistantMessageId) return m;
3009
+ return {
3010
+ ...m,
3011
+ contentParts: parts,
3012
+ skillExecution: {
3013
+ ...m.skillExecution,
3014
+ status: "done",
3015
+ result
3016
+ }
3017
+ };
3018
+ })
3019
+ };
3020
+ })
3021
+ );
3022
+ if (resultType === "image" || resultType === "file") {
3023
+ saveMessagesOnEarlyReturn();
3024
+ setIsLoading(false);
3025
+ abortControllerRef.current = null;
3026
+ return;
3027
+ }
3028
+ let shouldContinue = continueAfterToolResult;
3029
+ if (onSkillCompleteRef.current) {
3030
+ const decision = onSkillCompleteRef.current(toolName, result);
3031
+ shouldContinue = decision === "continue";
3032
+ }
3033
+ if (!shouldContinue) {
3034
+ saveMessagesOnEarlyReturn();
3035
+ setIsLoading(false);
3036
+ abortControllerRef.current = null;
3037
+ return;
3038
+ }
3039
+ skipNextSkillParsingRef.current = true;
3040
+ saveMessagesOnEarlyReturn();
3041
+ const feedbackPrompt = resultType === "error" ? `\uB3C4\uAD6C "${toolName}" \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD: ${result.content}
3042
+
3043
+ \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:
3044
+
3045
+ ${result.content}
3046
+
3047
+ \uC704 \uACB0\uACFC\uB97C \uBC14\uD0D5\uC73C\uB85C \uB2F5\uBCC0\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3048
+ setTimeout(() => {
3049
+ sendMessage(feedbackPrompt, { hiddenUserMessage: true });
3050
+ }, 100);
3051
+ setIsLoading(false);
3052
+ abortControllerRef.current = null;
3053
+ return;
3054
+ }
2961
3055
  setSessions(
2962
3056
  (prev) => prev.map((s) => {
2963
3057
  if (s.id !== capturedSessionId) return s;
@@ -2967,7 +3061,7 @@ ${attachmentContext}
2967
3061
  if (m.id !== assistantMessageId) return m;
2968
3062
  return {
2969
3063
  ...m,
2970
- contentParts: parts,
3064
+ sources: result.sources || m.sources,
2971
3065
  skillExecution: {
2972
3066
  ...m.skillExecution,
2973
3067
  status: "done",
@@ -2978,18 +3072,18 @@ ${attachmentContext}
2978
3072
  };
2979
3073
  })
2980
3074
  );
2981
- if (resultType === "image" || resultType === "file") {
3075
+ if (streamedReport) {
2982
3076
  saveMessagesOnEarlyReturn();
2983
3077
  setIsLoading(false);
2984
3078
  abortControllerRef.current = null;
2985
3079
  return;
2986
3080
  }
2987
- let shouldContinue = continueAfterToolResult;
3081
+ let shouldContinueSkill = continueAfterToolResult;
2988
3082
  if (onSkillCompleteRef.current) {
2989
- const decision = onSkillCompleteRef.current(toolName, result);
2990
- shouldContinue = decision === "continue";
3083
+ const decision = onSkillCompleteRef.current(detectedSkill.name, result);
3084
+ shouldContinueSkill = decision === "continue";
2991
3085
  }
2992
- if (!shouldContinue) {
3086
+ if (!shouldContinueSkill) {
2993
3087
  saveMessagesOnEarlyReturn();
2994
3088
  setIsLoading(false);
2995
3089
  abortControllerRef.current = null;
@@ -2997,70 +3091,18 @@ ${attachmentContext}
2997
3091
  }
2998
3092
  skipNextSkillParsingRef.current = true;
2999
3093
  saveMessagesOnEarlyReturn();
3000
- const feedbackPrompt = resultType === "error" ? `\uB3C4\uAD6C "${toolName}" \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD: ${result.content}
3001
-
3002
- \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:
3094
+ const resultPrompt = `\uC2A4\uD0AC "${detectedSkill.name}" \uC2E4\uD589 \uACB0\uACFC:
3003
3095
 
3004
3096
  ${result.content}
3005
3097
 
3006
- \uC704 \uACB0\uACFC\uB97C \uBC14\uD0D5\uC73C\uB85C \uB2F5\uBCC0\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3098
+ \uC704 \uACB0\uACFC\uB97C \uBC14\uD0D5\uC73C\uB85C \uC0AC\uC6A9\uC790\uC758 \uC6D0\uB798 \uC9C8\uBB38\uC5D0 \uB2F5\uBCC0\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3007
3099
  setTimeout(() => {
3008
- sendMessage(feedbackPrompt, { hiddenUserMessage: true });
3100
+ sendMessage(resultPrompt, { hiddenUserMessage: true });
3009
3101
  }, 100);
3010
3102
  setIsLoading(false);
3011
3103
  abortControllerRef.current = null;
3012
3104
  return;
3013
3105
  }
3014
- setSessions(
3015
- (prev) => prev.map((s) => {
3016
- if (s.id !== capturedSessionId) return s;
3017
- return {
3018
- ...s,
3019
- messages: s.messages.map((m) => {
3020
- if (m.id !== assistantMessageId) return m;
3021
- return {
3022
- ...m,
3023
- sources: result.sources || m.sources,
3024
- skillExecution: {
3025
- ...m.skillExecution,
3026
- status: "done",
3027
- result
3028
- }
3029
- };
3030
- })
3031
- };
3032
- })
3033
- );
3034
- if (streamedReport) {
3035
- saveMessagesOnEarlyReturn();
3036
- setIsLoading(false);
3037
- abortControllerRef.current = null;
3038
- return;
3039
- }
3040
- let shouldContinueSkill = continueAfterToolResult;
3041
- if (onSkillCompleteRef.current) {
3042
- const decision = onSkillCompleteRef.current(detectedSkill.name, result);
3043
- shouldContinueSkill = decision === "continue";
3044
- }
3045
- if (!shouldContinueSkill) {
3046
- saveMessagesOnEarlyReturn();
3047
- setIsLoading(false);
3048
- abortControllerRef.current = null;
3049
- return;
3050
- }
3051
- skipNextSkillParsingRef.current = true;
3052
- saveMessagesOnEarlyReturn();
3053
- const resultPrompt = `\uC2A4\uD0AC "${detectedSkill.name}" \uC2E4\uD589 \uACB0\uACFC:
3054
-
3055
- ${result.content}
3056
-
3057
- \uC704 \uACB0\uACFC\uB97C \uBC14\uD0D5\uC73C\uB85C \uC0AC\uC6A9\uC790\uC758 \uC6D0\uB798 \uC9C8\uBB38\uC5D0 \uB2F5\uBCC0\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3058
- setTimeout(() => {
3059
- sendMessage(resultPrompt, { hiddenUserMessage: true });
3060
- }, 100);
3061
- setIsLoading(false);
3062
- abortControllerRef.current = null;
3063
- return;
3064
3106
  }
3065
3107
  }
3066
3108
  }
@@ -9661,7 +9703,8 @@ var MessageList = ({
9661
9703
  onPollSubmit,
9662
9704
  onChecklistAbort,
9663
9705
  onChecklistRetry,
9664
- onChecklistSkip
9706
+ onChecklistSkip,
9707
+ activeSkillExecution
9665
9708
  }) => {
9666
9709
  const messagesEndRef = useRef8(null);
9667
9710
  const containerRef = useRef8(null);
@@ -9783,6 +9826,61 @@ var MessageList = ({
9783
9826
  message.id
9784
9827
  );
9785
9828
  }),
9829
+ activeSkillExecution && activeSkillExecution.status === "executing" && /* @__PURE__ */ jsxs16(
9830
+ "div",
9831
+ {
9832
+ style: {
9833
+ display: "flex",
9834
+ alignItems: "center",
9835
+ gap: "10px",
9836
+ padding: "12px 20px",
9837
+ margin: "8px auto",
9838
+ maxWidth: "680px",
9839
+ width: "100%"
9840
+ },
9841
+ children: [
9842
+ /* @__PURE__ */ jsx17(
9843
+ "div",
9844
+ {
9845
+ style: {
9846
+ width: "20px",
9847
+ height: "20px",
9848
+ borderRadius: "50%",
9849
+ border: "2px solid var(--chatllm-primary, #3584FA)",
9850
+ borderTopColor: "transparent",
9851
+ animation: "chatllm-spin 0.8s linear infinite",
9852
+ flexShrink: 0
9853
+ }
9854
+ }
9855
+ ),
9856
+ /* @__PURE__ */ jsx17(
9857
+ "span",
9858
+ {
9859
+ style: {
9860
+ fontSize: "13px",
9861
+ fontWeight: 500,
9862
+ color: "var(--chatllm-text-muted, #94a3b8)"
9863
+ },
9864
+ children: activeSkillExecution.progress?.phaseLabel || `${activeSkillExecution.skillName} \uC2E4\uD589 \uC911...`
9865
+ }
9866
+ ),
9867
+ activeSkillExecution.progress?.percentage != null && /* @__PURE__ */ jsxs16(
9868
+ "span",
9869
+ {
9870
+ style: {
9871
+ fontSize: "12px",
9872
+ color: "var(--chatllm-primary, #3584FA)",
9873
+ fontWeight: 600
9874
+ },
9875
+ children: [
9876
+ activeSkillExecution.progress.percentage,
9877
+ "%"
9878
+ ]
9879
+ }
9880
+ )
9881
+ ]
9882
+ }
9883
+ ),
9786
9884
  /* @__PURE__ */ jsx17("div", { ref: messagesEndRef })
9787
9885
  ]
9788
9886
  }
@@ -11942,7 +12040,8 @@ var ChatUIView = ({
11942
12040
  onPollSubmit: handlePollSubmit,
11943
12041
  onChecklistAbort: handleChecklistAbort,
11944
12042
  onChecklistRetry: handleChecklistRetry,
11945
- onChecklistSkip: handleChecklistSkip
12043
+ onChecklistSkip: handleChecklistSkip,
12044
+ activeSkillExecution
11946
12045
  }
11947
12046
  ),
11948
12047
  /* @__PURE__ */ jsx22(