@gendive/chatllm 0.17.23 → 0.17.25
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/react/index.d.mts +98 -1
- package/dist/react/index.d.ts +98 -1
- package/dist/react/index.js +1184 -396
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +1167 -380
- package/dist/react/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __export(index_exports, {
|
|
|
34
34
|
ChatInput: () => ChatInput,
|
|
35
35
|
ChatSidebar: () => ChatSidebar,
|
|
36
36
|
ChatUI: () => ChatUI,
|
|
37
|
+
ChecklistCard: () => ChecklistCard,
|
|
37
38
|
ContentPartRenderer: () => ContentPartRenderer,
|
|
38
39
|
DEFAULT_PROJECT_ID: () => DEFAULT_PROJECT_ID,
|
|
39
40
|
DEFAULT_PROJECT_TITLE: () => DEFAULT_PROJECT_TITLE,
|
|
@@ -65,7 +66,7 @@ __export(index_exports, {
|
|
|
65
66
|
module.exports = __toCommonJS(index_exports);
|
|
66
67
|
|
|
67
68
|
// src/react/ChatUI.tsx
|
|
68
|
-
var
|
|
69
|
+
var import_react21 = __toESM(require("react"));
|
|
69
70
|
|
|
70
71
|
// src/react/hooks/useChatUI.ts
|
|
71
72
|
var import_react5 = require("react");
|
|
@@ -1574,6 +1575,65 @@ var convertToolsToSkills = (tools, onToolCall) => {
|
|
|
1574
1575
|
return skillMap;
|
|
1575
1576
|
};
|
|
1576
1577
|
|
|
1578
|
+
// src/react/utils/checklistParser.ts
|
|
1579
|
+
var generateId3 = () => {
|
|
1580
|
+
return Math.random().toString(36).substring(2, 11);
|
|
1581
|
+
};
|
|
1582
|
+
var parseChecklistFromContent = (content) => {
|
|
1583
|
+
const checklistRegex = /<checklist>([\s\S]*?)<\/checklist>/i;
|
|
1584
|
+
const match = checklistRegex.exec(content);
|
|
1585
|
+
if (!match) {
|
|
1586
|
+
return { checklistBlock: null, cleanContent: content };
|
|
1587
|
+
}
|
|
1588
|
+
const innerContent = match[1].trim();
|
|
1589
|
+
const items = [];
|
|
1590
|
+
const stepTagRegex = /<step>([^<]+)<\/step>/gi;
|
|
1591
|
+
let stepMatch;
|
|
1592
|
+
while ((stepMatch = stepTagRegex.exec(innerContent)) !== null) {
|
|
1593
|
+
items.push({
|
|
1594
|
+
id: generateId3(),
|
|
1595
|
+
title: stepMatch[1].trim(),
|
|
1596
|
+
status: "pending"
|
|
1597
|
+
});
|
|
1598
|
+
}
|
|
1599
|
+
if (items.length === 0) {
|
|
1600
|
+
const numberedRegex = /^\d+[.)]\s+(.+)$/gm;
|
|
1601
|
+
let numMatch;
|
|
1602
|
+
while ((numMatch = numberedRegex.exec(innerContent)) !== null) {
|
|
1603
|
+
items.push({
|
|
1604
|
+
id: generateId3(),
|
|
1605
|
+
title: numMatch[1].trim(),
|
|
1606
|
+
status: "pending"
|
|
1607
|
+
});
|
|
1608
|
+
}
|
|
1609
|
+
}
|
|
1610
|
+
if (items.length === 0) {
|
|
1611
|
+
const listRegex = /^[-*]\s+(.+)$/gm;
|
|
1612
|
+
let listMatch;
|
|
1613
|
+
while ((listMatch = listRegex.exec(innerContent)) !== null) {
|
|
1614
|
+
items.push({
|
|
1615
|
+
id: generateId3(),
|
|
1616
|
+
title: listMatch[1].trim(),
|
|
1617
|
+
status: "pending"
|
|
1618
|
+
});
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
if (items.length < 2) {
|
|
1622
|
+
return { checklistBlock: null, cleanContent: content };
|
|
1623
|
+
}
|
|
1624
|
+
let cleanContent = content.replace(match[0], "");
|
|
1625
|
+
cleanContent = cleanContent.replace(/\n{3,}/g, "\n\n").trim();
|
|
1626
|
+
return {
|
|
1627
|
+
checklistBlock: {
|
|
1628
|
+
id: generateId3(),
|
|
1629
|
+
items,
|
|
1630
|
+
currentStep: -1,
|
|
1631
|
+
completed: false
|
|
1632
|
+
},
|
|
1633
|
+
cleanContent
|
|
1634
|
+
};
|
|
1635
|
+
};
|
|
1636
|
+
|
|
1577
1637
|
// src/react/utils/sessionCache.ts
|
|
1578
1638
|
var buildCacheKey = (storageKey, sessionId) => `${storageKey}_cache_${sessionId}`;
|
|
1579
1639
|
var writeSessionCache = (storageKey, session) => {
|
|
@@ -1638,7 +1698,7 @@ var DEFAULT_COMPRESSION_THRESHOLD = 20;
|
|
|
1638
1698
|
var DEFAULT_KEEP_RECENT = 6;
|
|
1639
1699
|
var DEFAULT_RECOMPRESSION_THRESHOLD = 10;
|
|
1640
1700
|
var DEFAULT_TOKEN_LIMIT = 8e3;
|
|
1641
|
-
var
|
|
1701
|
+
var generateId4 = (prefix) => `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
1642
1702
|
var fileToBase64 = (file) => new Promise((resolve, reject) => {
|
|
1643
1703
|
const reader = new FileReader();
|
|
1644
1704
|
reader.onload = () => resolve(reader.result.split(",")[1] || "");
|
|
@@ -1779,6 +1839,8 @@ var useChatUI = (options) => {
|
|
|
1779
1839
|
const abortControllerRef = (0, import_react5.useRef)(null);
|
|
1780
1840
|
const skipNextPollParsingRef = (0, import_react5.useRef)(false);
|
|
1781
1841
|
const skipNextSkillParsingRef = (0, import_react5.useRef)(false);
|
|
1842
|
+
const skipNextChecklistParsingRef = (0, import_react5.useRef)(false);
|
|
1843
|
+
const activeChecklistRef = (0, import_react5.useRef)(null);
|
|
1782
1844
|
const lastExtractionMsgCountRef = (0, import_react5.useRef)(0);
|
|
1783
1845
|
const memoryOptions = (0, import_react5.useMemo)(
|
|
1784
1846
|
() => ({
|
|
@@ -2129,7 +2191,7 @@ ${newConversation}
|
|
|
2129
2191
|
}
|
|
2130
2192
|
const now = Date.now();
|
|
2131
2193
|
const newSess = {
|
|
2132
|
-
id:
|
|
2194
|
+
id: generateId4("session"),
|
|
2133
2195
|
title: "\uC0C8 \uB300\uD654",
|
|
2134
2196
|
messages: [],
|
|
2135
2197
|
model: selectedModel,
|
|
@@ -2146,7 +2208,7 @@ ${newConversation}
|
|
|
2146
2208
|
try {
|
|
2147
2209
|
const sessionDetail = await onLoadSessionRef.current(id);
|
|
2148
2210
|
let loadedMessages = sessionDetail.messages.map((m, idx) => ({
|
|
2149
|
-
id: m.id ||
|
|
2211
|
+
id: m.id || generateId4("msg"),
|
|
2150
2212
|
role: typeof m.role === "string" ? m.role.toLowerCase() : m.role,
|
|
2151
2213
|
// API는 message 필드, 내부는 content 필드 사용
|
|
2152
2214
|
content: m.content || m.message || "",
|
|
@@ -2311,7 +2373,7 @@ ${newConversation}
|
|
|
2311
2373
|
const newAttachments = files.map((file) => {
|
|
2312
2374
|
const isImage = file.type.startsWith("image/");
|
|
2313
2375
|
return {
|
|
2314
|
-
id:
|
|
2376
|
+
id: generateId4("attach"),
|
|
2315
2377
|
file,
|
|
2316
2378
|
name: file.name,
|
|
2317
2379
|
type: isImage ? "image" : "file",
|
|
@@ -2363,7 +2425,7 @@ ${newConversation}
|
|
|
2363
2425
|
} else {
|
|
2364
2426
|
const now = Date.now();
|
|
2365
2427
|
const newSess = {
|
|
2366
|
-
id:
|
|
2428
|
+
id: generateId4("session"),
|
|
2367
2429
|
title: "\uC0C8 \uB300\uD654",
|
|
2368
2430
|
messages: [],
|
|
2369
2431
|
model: selectedModel,
|
|
@@ -2402,7 +2464,7 @@ ${finalContent}`;
|
|
|
2402
2464
|
}
|
|
2403
2465
|
}
|
|
2404
2466
|
const userMessage = {
|
|
2405
|
-
id:
|
|
2467
|
+
id: generateId4("msg"),
|
|
2406
2468
|
role: "user",
|
|
2407
2469
|
content: finalContent,
|
|
2408
2470
|
timestamp: Date.now(),
|
|
@@ -2416,7 +2478,7 @@ ${finalContent}`;
|
|
|
2416
2478
|
const contextSummary = currentSession2?.compressionState?.contextSummary || currentSession2?.contextSummary;
|
|
2417
2479
|
const summaryAfterIndex = currentSession2?.compressionState?.summaryAfterIndex || currentSession2?.summaryAfterIndex || 0;
|
|
2418
2480
|
let compressionCount = currentSession2?.compressionState?.compressionCount || 0;
|
|
2419
|
-
const assistantMessageId =
|
|
2481
|
+
const assistantMessageId = generateId4("msg");
|
|
2420
2482
|
const assistantMessage = {
|
|
2421
2483
|
id: assistantMessageId,
|
|
2422
2484
|
role: "assistant",
|
|
@@ -2715,6 +2777,7 @@ ${attachmentContext}
|
|
|
2715
2777
|
let buffer = "";
|
|
2716
2778
|
let accumulatedContent = "";
|
|
2717
2779
|
let skillTagDetected = false;
|
|
2780
|
+
let checklistTagDetected = false;
|
|
2718
2781
|
while (true) {
|
|
2719
2782
|
const { done, value } = await reader.read();
|
|
2720
2783
|
if (done) break;
|
|
@@ -2739,6 +2802,11 @@ ${attachmentContext}
|
|
|
2739
2802
|
accumulatedContent = accumulatedContent.substring(0, endIdx + "</skill_use>".length);
|
|
2740
2803
|
skillTagDetected = true;
|
|
2741
2804
|
}
|
|
2805
|
+
if (!skipNextChecklistParsingRef.current && accumulatedContent.includes("</checklist>")) {
|
|
2806
|
+
const endIdx = accumulatedContent.indexOf("</checklist>");
|
|
2807
|
+
accumulatedContent = accumulatedContent.substring(0, endIdx + "</checklist>".length);
|
|
2808
|
+
checklistTagDetected = true;
|
|
2809
|
+
}
|
|
2742
2810
|
const displayContent = skillTagDetected ? accumulatedContent : null;
|
|
2743
2811
|
setSessions(
|
|
2744
2812
|
(prev) => prev.map((s) => {
|
|
@@ -2771,12 +2839,12 @@ ${attachmentContext}
|
|
|
2771
2839
|
return s;
|
|
2772
2840
|
})
|
|
2773
2841
|
);
|
|
2774
|
-
if (skillTagDetected) break;
|
|
2842
|
+
if (skillTagDetected || checklistTagDetected) break;
|
|
2775
2843
|
}
|
|
2776
2844
|
} catch {
|
|
2777
2845
|
}
|
|
2778
2846
|
}
|
|
2779
|
-
if (skillTagDetected) break;
|
|
2847
|
+
if (skillTagDetected || checklistTagDetected) break;
|
|
2780
2848
|
}
|
|
2781
2849
|
if (buffer.trim()) {
|
|
2782
2850
|
try {
|
|
@@ -2801,6 +2869,26 @@ ${attachmentContext}
|
|
|
2801
2869
|
} catch {
|
|
2802
2870
|
}
|
|
2803
2871
|
}
|
|
2872
|
+
const saveMessagesOnEarlyReturn = () => {
|
|
2873
|
+
if (!useExternalStorage || !capturedSessionId) return;
|
|
2874
|
+
queueMicrotask(() => {
|
|
2875
|
+
const latestSession = sessionsRef.current.find((s) => s.id === capturedSessionId);
|
|
2876
|
+
if (!latestSession) return;
|
|
2877
|
+
const latestMessages = latestSession.messages;
|
|
2878
|
+
const assistantMsg = [...latestMessages].reverse().find((m) => m.role === "assistant");
|
|
2879
|
+
const userMsg = latestMessages.find((m) => m.role === "user" && m.content === finalContent);
|
|
2880
|
+
const assistantContent = assistantMsg?.content || "";
|
|
2881
|
+
if (assistantContent && onSaveMessagesRef.current) {
|
|
2882
|
+
onSaveMessagesRef.current(capturedSessionId, [
|
|
2883
|
+
{ role: "user", message: finalContent, ...userMsg?.contentParts && { contentParts: userMsg.contentParts } },
|
|
2884
|
+
{ role: "assistant", message: assistantContent, ...assistantMsg?.contentParts && { contentParts: assistantMsg.contentParts } }
|
|
2885
|
+
]).catch((e) => console.error("[useChatUI] Failed to save messages:", e));
|
|
2886
|
+
}
|
|
2887
|
+
if (latestSession.messages.length > 0) {
|
|
2888
|
+
writeSessionCache(storageKey, latestSession);
|
|
2889
|
+
}
|
|
2890
|
+
});
|
|
2891
|
+
};
|
|
2804
2892
|
if (!shouldSkipSkillParsing) {
|
|
2805
2893
|
const assistantContent = accumulatedContent;
|
|
2806
2894
|
const { skillCall: detectedSkill, cleanContent: skillCleanContent } = parseSkillCallFromContent(assistantContent);
|
|
@@ -2904,6 +2992,7 @@ ${attachmentContext}
|
|
|
2904
2992
|
})
|
|
2905
2993
|
);
|
|
2906
2994
|
if (resultType === "image" || resultType === "file") {
|
|
2995
|
+
saveMessagesOnEarlyReturn();
|
|
2907
2996
|
setIsLoading(false);
|
|
2908
2997
|
abortControllerRef.current = null;
|
|
2909
2998
|
return;
|
|
@@ -2914,11 +3003,13 @@ ${attachmentContext}
|
|
|
2914
3003
|
shouldContinue = decision === "continue";
|
|
2915
3004
|
}
|
|
2916
3005
|
if (!shouldContinue) {
|
|
3006
|
+
saveMessagesOnEarlyReturn();
|
|
2917
3007
|
setIsLoading(false);
|
|
2918
3008
|
abortControllerRef.current = null;
|
|
2919
3009
|
return;
|
|
2920
3010
|
}
|
|
2921
3011
|
skipNextSkillParsingRef.current = true;
|
|
3012
|
+
saveMessagesOnEarlyReturn();
|
|
2922
3013
|
const feedbackPrompt = resultType === "error" ? `\uB3C4\uAD6C "${toolName}" \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD: ${result.content}
|
|
2923
3014
|
|
|
2924
3015
|
\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:
|
|
@@ -2954,6 +3045,7 @@ ${result.content}
|
|
|
2954
3045
|
})
|
|
2955
3046
|
);
|
|
2956
3047
|
if (streamedReport) {
|
|
3048
|
+
saveMessagesOnEarlyReturn();
|
|
2957
3049
|
setIsLoading(false);
|
|
2958
3050
|
abortControllerRef.current = null;
|
|
2959
3051
|
return;
|
|
@@ -2964,11 +3056,13 @@ ${result.content}
|
|
|
2964
3056
|
shouldContinueSkill = decision === "continue";
|
|
2965
3057
|
}
|
|
2966
3058
|
if (!shouldContinueSkill) {
|
|
3059
|
+
saveMessagesOnEarlyReturn();
|
|
2967
3060
|
setIsLoading(false);
|
|
2968
3061
|
abortControllerRef.current = null;
|
|
2969
3062
|
return;
|
|
2970
3063
|
}
|
|
2971
3064
|
skipNextSkillParsingRef.current = true;
|
|
3065
|
+
saveMessagesOnEarlyReturn();
|
|
2972
3066
|
const resultPrompt = `\uC2A4\uD0AC "${detectedSkill.name}" \uC2E4\uD589 \uACB0\uACFC:
|
|
2973
3067
|
|
|
2974
3068
|
${result.content}
|
|
@@ -2983,6 +3077,165 @@ ${result.content}
|
|
|
2983
3077
|
}
|
|
2984
3078
|
}
|
|
2985
3079
|
}
|
|
3080
|
+
if (activeChecklistRef.current) {
|
|
3081
|
+
const checklist = activeChecklistRef.current;
|
|
3082
|
+
const stepIndex = checklist.currentStep;
|
|
3083
|
+
checklist.stepResults.push(accumulatedContent);
|
|
3084
|
+
setSessions(
|
|
3085
|
+
(prev) => prev.map((s) => {
|
|
3086
|
+
if (s.id !== checklist.sessionId) return s;
|
|
3087
|
+
return {
|
|
3088
|
+
...s,
|
|
3089
|
+
messages: s.messages.map((m) => {
|
|
3090
|
+
if (m.id !== checklist.messageId || !m.checklistBlock) return m;
|
|
3091
|
+
const updatedItems = m.checklistBlock.items.map((it, idx) => ({
|
|
3092
|
+
...it,
|
|
3093
|
+
status: idx <= stepIndex ? "done" : it.status,
|
|
3094
|
+
result: idx === stepIndex ? accumulatedContent : it.result
|
|
3095
|
+
}));
|
|
3096
|
+
return {
|
|
3097
|
+
...m,
|
|
3098
|
+
checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: stepIndex + 1 }
|
|
3099
|
+
};
|
|
3100
|
+
})
|
|
3101
|
+
};
|
|
3102
|
+
})
|
|
3103
|
+
);
|
|
3104
|
+
setSessions(
|
|
3105
|
+
(prev) => prev.map((s) => {
|
|
3106
|
+
if (s.id !== capturedSessionId) return s;
|
|
3107
|
+
return {
|
|
3108
|
+
...s,
|
|
3109
|
+
messages: s.messages.map((m) => {
|
|
3110
|
+
if (m.id !== assistantMessageId) return m;
|
|
3111
|
+
return { ...m, hidden: true };
|
|
3112
|
+
})
|
|
3113
|
+
};
|
|
3114
|
+
})
|
|
3115
|
+
);
|
|
3116
|
+
const nextStep = stepIndex + 1;
|
|
3117
|
+
if (nextStep < checklist.items.length) {
|
|
3118
|
+
checklist.currentStep = nextStep;
|
|
3119
|
+
setSessions(
|
|
3120
|
+
(prev) => prev.map((s) => {
|
|
3121
|
+
if (s.id !== checklist.sessionId) return s;
|
|
3122
|
+
return {
|
|
3123
|
+
...s,
|
|
3124
|
+
messages: s.messages.map((m) => {
|
|
3125
|
+
if (m.id !== checklist.messageId || !m.checklistBlock) return m;
|
|
3126
|
+
const updatedItems = m.checklistBlock.items.map((it, idx) => ({
|
|
3127
|
+
...it,
|
|
3128
|
+
status: idx === nextStep ? "in_progress" : it.status
|
|
3129
|
+
}));
|
|
3130
|
+
return {
|
|
3131
|
+
...m,
|
|
3132
|
+
checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: nextStep }
|
|
3133
|
+
};
|
|
3134
|
+
})
|
|
3135
|
+
};
|
|
3136
|
+
})
|
|
3137
|
+
);
|
|
3138
|
+
skipNextChecklistParsingRef.current = true;
|
|
3139
|
+
setTimeout(() => {
|
|
3140
|
+
sendMessage(
|
|
3141
|
+
`\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 ${nextStep + 1}/${checklist.items.length}\uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC138\uC694: "${checklist.items[nextStep].title}".
|
|
3142
|
+
\uC774\uC804 \uB2E8\uACC4 \uACB0\uACFC\uB97C \uCC38\uACE0\uD558\uB418, \uC774 \uB2E8\uACC4\uC5D0\uB9CC \uC9D1\uC911\uD558\uC5EC \uACB0\uACFC\uB97C \uC791\uC131\uD558\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
|
|
3143
|
+
{ hiddenUserMessage: true }
|
|
3144
|
+
);
|
|
3145
|
+
}, 100);
|
|
3146
|
+
saveMessagesOnEarlyReturn();
|
|
3147
|
+
setIsLoading(false);
|
|
3148
|
+
abortControllerRef.current = null;
|
|
3149
|
+
return;
|
|
3150
|
+
}
|
|
3151
|
+
const stepSummary = checklist.stepResults.map((r, i) => `### ${i + 1}. ${checklist.items[i].title}
|
|
3152
|
+
${r}`).join("\n\n");
|
|
3153
|
+
setSessions(
|
|
3154
|
+
(prev) => prev.map((s) => {
|
|
3155
|
+
if (s.id !== checklist.sessionId) return s;
|
|
3156
|
+
return {
|
|
3157
|
+
...s,
|
|
3158
|
+
messages: s.messages.map((m) => {
|
|
3159
|
+
if (m.id !== checklist.messageId || !m.checklistBlock) return m;
|
|
3160
|
+
return { ...m, checklistBlock: { ...m.checklistBlock, completed: true } };
|
|
3161
|
+
})
|
|
3162
|
+
};
|
|
3163
|
+
})
|
|
3164
|
+
);
|
|
3165
|
+
activeChecklistRef.current = null;
|
|
3166
|
+
skipNextChecklistParsingRef.current = true;
|
|
3167
|
+
setTimeout(() => {
|
|
3168
|
+
sendMessage(
|
|
3169
|
+
`\uBAA8\uB4E0 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB2E8\uACC4\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC544\uB798\uB294 \uAC01 \uB2E8\uACC4\uBCC4 \uACB0\uACFC\uC785\uB2C8\uB2E4:
|
|
3170
|
+
|
|
3171
|
+
${stepSummary}
|
|
3172
|
+
|
|
3173
|
+
\uC704 \uACB0\uACFC\uB97C \uC885\uD569\uD558\uC5EC \uCD5C\uC885 \uACB0\uACFC\uBB3C\uC744 \uC644\uC131\uD574\uC8FC\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
|
|
3174
|
+
{ hiddenUserMessage: true }
|
|
3175
|
+
);
|
|
3176
|
+
}, 100);
|
|
3177
|
+
saveMessagesOnEarlyReturn();
|
|
3178
|
+
setIsLoading(false);
|
|
3179
|
+
abortControllerRef.current = null;
|
|
3180
|
+
return;
|
|
3181
|
+
}
|
|
3182
|
+
if (!skipNextChecklistParsingRef.current) {
|
|
3183
|
+
const { checklistBlock, cleanContent: checklistCleanContent } = parseChecklistFromContent(accumulatedContent);
|
|
3184
|
+
if (checklistBlock) {
|
|
3185
|
+
setSessions(
|
|
3186
|
+
(prev) => prev.map((s) => {
|
|
3187
|
+
if (s.id !== capturedSessionId) return s;
|
|
3188
|
+
return {
|
|
3189
|
+
...s,
|
|
3190
|
+
messages: s.messages.map((m) => {
|
|
3191
|
+
if (m.id !== assistantMessageId) return m;
|
|
3192
|
+
return { ...m, content: checklistCleanContent, checklistBlock };
|
|
3193
|
+
})
|
|
3194
|
+
};
|
|
3195
|
+
})
|
|
3196
|
+
);
|
|
3197
|
+
activeChecklistRef.current = {
|
|
3198
|
+
messageId: assistantMessageId,
|
|
3199
|
+
sessionId: capturedSessionId,
|
|
3200
|
+
items: checklistBlock.items.map((it) => ({ id: it.id, title: it.title })),
|
|
3201
|
+
currentStep: 0,
|
|
3202
|
+
stepResults: []
|
|
3203
|
+
};
|
|
3204
|
+
setSessions(
|
|
3205
|
+
(prev) => prev.map((s) => {
|
|
3206
|
+
if (s.id !== capturedSessionId) return s;
|
|
3207
|
+
return {
|
|
3208
|
+
...s,
|
|
3209
|
+
messages: s.messages.map((m) => {
|
|
3210
|
+
if (m.id !== assistantMessageId || !m.checklistBlock) return m;
|
|
3211
|
+
const updatedItems = m.checklistBlock.items.map((it, idx) => ({
|
|
3212
|
+
...it,
|
|
3213
|
+
status: idx === 0 ? "in_progress" : it.status
|
|
3214
|
+
}));
|
|
3215
|
+
return {
|
|
3216
|
+
...m,
|
|
3217
|
+
checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: 0 }
|
|
3218
|
+
};
|
|
3219
|
+
})
|
|
3220
|
+
};
|
|
3221
|
+
})
|
|
3222
|
+
);
|
|
3223
|
+
skipNextChecklistParsingRef.current = true;
|
|
3224
|
+
setTimeout(() => {
|
|
3225
|
+
sendMessage(
|
|
3226
|
+
`\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 1/${checklistBlock.items.length}\uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC138\uC694: "${checklistBlock.items[0].title}".
|
|
3227
|
+
\uC774 \uB2E8\uACC4\uC5D0\uB9CC \uC9D1\uC911\uD558\uC5EC \uACB0\uACFC\uB97C \uC791\uC131\uD558\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
|
|
3228
|
+
{ hiddenUserMessage: true }
|
|
3229
|
+
);
|
|
3230
|
+
}, 100);
|
|
3231
|
+
saveMessagesOnEarlyReturn();
|
|
3232
|
+
setIsLoading(false);
|
|
3233
|
+
abortControllerRef.current = null;
|
|
3234
|
+
return;
|
|
3235
|
+
}
|
|
3236
|
+
} else {
|
|
3237
|
+
skipNextChecklistParsingRef.current = false;
|
|
3238
|
+
}
|
|
2986
3239
|
setSessions(
|
|
2987
3240
|
(prev) => prev.map((s) => {
|
|
2988
3241
|
if (s.id !== capturedSessionId) return s;
|
|
@@ -3082,6 +3335,187 @@ ${result.content}
|
|
|
3082
3335
|
attachments,
|
|
3083
3336
|
continueAfterToolResult
|
|
3084
3337
|
]);
|
|
3338
|
+
const handleChecklistAbort = (0, import_react5.useCallback)(() => {
|
|
3339
|
+
if (!activeChecklistRef.current) return;
|
|
3340
|
+
const checklist = activeChecklistRef.current;
|
|
3341
|
+
const stepIdx = checklist.currentStep;
|
|
3342
|
+
abortControllerRef.current?.abort();
|
|
3343
|
+
setSessions(
|
|
3344
|
+
(prev) => prev.map((s) => {
|
|
3345
|
+
if (s.id !== checklist.sessionId) return s;
|
|
3346
|
+
return {
|
|
3347
|
+
...s,
|
|
3348
|
+
messages: s.messages.map((m) => {
|
|
3349
|
+
if (m.id !== checklist.messageId || !m.checklistBlock) return m;
|
|
3350
|
+
return {
|
|
3351
|
+
...m,
|
|
3352
|
+
checklistBlock: {
|
|
3353
|
+
...m.checklistBlock,
|
|
3354
|
+
items: m.checklistBlock.items.map((it, idx) => ({
|
|
3355
|
+
...it,
|
|
3356
|
+
status: idx === stepIdx ? "error" : it.status
|
|
3357
|
+
}))
|
|
3358
|
+
}
|
|
3359
|
+
};
|
|
3360
|
+
})
|
|
3361
|
+
};
|
|
3362
|
+
})
|
|
3363
|
+
);
|
|
3364
|
+
activeChecklistRef.current = null;
|
|
3365
|
+
setIsLoading(false);
|
|
3366
|
+
}, []);
|
|
3367
|
+
const handleChecklistRetry = (0, import_react5.useCallback)(
|
|
3368
|
+
(messageId, stepIndex) => {
|
|
3369
|
+
const session = sessionsRef.current.find(
|
|
3370
|
+
(s) => s.messages.some((m) => m.id === messageId)
|
|
3371
|
+
);
|
|
3372
|
+
if (!session) return;
|
|
3373
|
+
const message = session.messages.find((m) => m.id === messageId);
|
|
3374
|
+
if (!message?.checklistBlock) return;
|
|
3375
|
+
activeChecklistRef.current = {
|
|
3376
|
+
messageId,
|
|
3377
|
+
sessionId: session.id,
|
|
3378
|
+
items: message.checklistBlock.items.map((it) => ({ id: it.id, title: it.title })),
|
|
3379
|
+
currentStep: stepIndex,
|
|
3380
|
+
stepResults: message.checklistBlock.items.slice(0, stepIndex).map((it) => it.result || "")
|
|
3381
|
+
};
|
|
3382
|
+
setSessions(
|
|
3383
|
+
(prev) => prev.map((s) => {
|
|
3384
|
+
if (s.id !== session.id) return s;
|
|
3385
|
+
return {
|
|
3386
|
+
...s,
|
|
3387
|
+
messages: s.messages.map((m) => {
|
|
3388
|
+
if (m.id !== messageId || !m.checklistBlock) return m;
|
|
3389
|
+
return {
|
|
3390
|
+
...m,
|
|
3391
|
+
checklistBlock: {
|
|
3392
|
+
...m.checklistBlock,
|
|
3393
|
+
items: m.checklistBlock.items.map((it, idx) => ({
|
|
3394
|
+
...it,
|
|
3395
|
+
status: idx === stepIndex ? "in_progress" : idx > stepIndex ? "pending" : it.status
|
|
3396
|
+
})),
|
|
3397
|
+
currentStep: stepIndex
|
|
3398
|
+
}
|
|
3399
|
+
};
|
|
3400
|
+
})
|
|
3401
|
+
};
|
|
3402
|
+
})
|
|
3403
|
+
);
|
|
3404
|
+
skipNextChecklistParsingRef.current = true;
|
|
3405
|
+
setTimeout(() => {
|
|
3406
|
+
sendMessage(
|
|
3407
|
+
`\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 ${stepIndex + 1}/${message.checklistBlock.items.length}\uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC138\uC694: "${message.checklistBlock.items[stepIndex].title}".
|
|
3408
|
+
\uC774\uC804 \uB2E8\uACC4 \uACB0\uACFC\uB97C \uCC38\uACE0\uD558\uB418, \uC774 \uB2E8\uACC4\uC5D0\uB9CC \uC9D1\uC911\uD558\uC5EC \uACB0\uACFC\uB97C \uC791\uC131\uD558\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
|
|
3409
|
+
{ hiddenUserMessage: true }
|
|
3410
|
+
);
|
|
3411
|
+
}, 100);
|
|
3412
|
+
},
|
|
3413
|
+
[sendMessage]
|
|
3414
|
+
);
|
|
3415
|
+
const handleChecklistSkip = (0, import_react5.useCallback)(
|
|
3416
|
+
(messageId, stepIndex) => {
|
|
3417
|
+
const session = sessionsRef.current.find(
|
|
3418
|
+
(s) => s.messages.some((m) => m.id === messageId)
|
|
3419
|
+
);
|
|
3420
|
+
if (!session) return;
|
|
3421
|
+
const message = session.messages.find((m) => m.id === messageId);
|
|
3422
|
+
if (!message?.checklistBlock) return;
|
|
3423
|
+
setSessions(
|
|
3424
|
+
(prev) => prev.map((s) => {
|
|
3425
|
+
if (s.id !== session.id) return s;
|
|
3426
|
+
return {
|
|
3427
|
+
...s,
|
|
3428
|
+
messages: s.messages.map((m) => {
|
|
3429
|
+
if (m.id !== messageId || !m.checklistBlock) return m;
|
|
3430
|
+
return {
|
|
3431
|
+
...m,
|
|
3432
|
+
checklistBlock: {
|
|
3433
|
+
...m.checklistBlock,
|
|
3434
|
+
items: m.checklistBlock.items.map((it, idx) => ({
|
|
3435
|
+
...it,
|
|
3436
|
+
status: idx === stepIndex ? "done" : it.status,
|
|
3437
|
+
result: idx === stepIndex ? "(\uAC74\uB108\uB700)" : it.result
|
|
3438
|
+
}))
|
|
3439
|
+
}
|
|
3440
|
+
};
|
|
3441
|
+
})
|
|
3442
|
+
};
|
|
3443
|
+
})
|
|
3444
|
+
);
|
|
3445
|
+
const nextPending = message.checklistBlock.items.findIndex(
|
|
3446
|
+
(it, idx) => idx > stepIndex && (it.status === "pending" || it.status === "error")
|
|
3447
|
+
);
|
|
3448
|
+
if (nextPending >= 0) {
|
|
3449
|
+
activeChecklistRef.current = {
|
|
3450
|
+
messageId,
|
|
3451
|
+
sessionId: session.id,
|
|
3452
|
+
items: message.checklistBlock.items.map((it) => ({ id: it.id, title: it.title })),
|
|
3453
|
+
currentStep: nextPending,
|
|
3454
|
+
stepResults: message.checklistBlock.items.slice(0, nextPending).map((it) => it.result || "(\uAC74\uB108\uB700)")
|
|
3455
|
+
};
|
|
3456
|
+
setSessions(
|
|
3457
|
+
(prev) => prev.map((s) => {
|
|
3458
|
+
if (s.id !== session.id) return s;
|
|
3459
|
+
return {
|
|
3460
|
+
...s,
|
|
3461
|
+
messages: s.messages.map((m) => {
|
|
3462
|
+
if (m.id !== messageId || !m.checklistBlock) return m;
|
|
3463
|
+
return {
|
|
3464
|
+
...m,
|
|
3465
|
+
checklistBlock: {
|
|
3466
|
+
...m.checklistBlock,
|
|
3467
|
+
items: m.checklistBlock.items.map((it, idx) => ({
|
|
3468
|
+
...it,
|
|
3469
|
+
status: idx === nextPending ? "in_progress" : it.status
|
|
3470
|
+
})),
|
|
3471
|
+
currentStep: nextPending
|
|
3472
|
+
}
|
|
3473
|
+
};
|
|
3474
|
+
})
|
|
3475
|
+
};
|
|
3476
|
+
})
|
|
3477
|
+
);
|
|
3478
|
+
skipNextChecklistParsingRef.current = true;
|
|
3479
|
+
setTimeout(() => {
|
|
3480
|
+
sendMessage(
|
|
3481
|
+
`\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 ${nextPending + 1}/${message.checklistBlock.items.length}\uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC138\uC694: "${message.checklistBlock.items[nextPending].title}".
|
|
3482
|
+
\uC774\uC804 \uB2E8\uACC4 \uACB0\uACFC\uB97C \uCC38\uACE0\uD558\uB418, \uC774 \uB2E8\uACC4\uC5D0\uB9CC \uC9D1\uC911\uD558\uC5EC \uACB0\uACFC\uB97C \uC791\uC131\uD558\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
|
|
3483
|
+
{ hiddenUserMessage: true }
|
|
3484
|
+
);
|
|
3485
|
+
}, 100);
|
|
3486
|
+
} else {
|
|
3487
|
+
const allResults = message.checklistBlock.items.map((it, i) => {
|
|
3488
|
+
const result = i === stepIndex ? "(\uAC74\uB108\uB700)" : it.result || "(\uAC74\uB108\uB700)";
|
|
3489
|
+
return `### ${i + 1}. ${it.title}
|
|
3490
|
+
${result}`;
|
|
3491
|
+
}).join("\n\n");
|
|
3492
|
+
setSessions(
|
|
3493
|
+
(prev) => prev.map((s) => {
|
|
3494
|
+
if (s.id !== session.id) return s;
|
|
3495
|
+
return {
|
|
3496
|
+
...s,
|
|
3497
|
+
messages: s.messages.map((m) => {
|
|
3498
|
+
if (m.id !== messageId || !m.checklistBlock) return m;
|
|
3499
|
+
return { ...m, checklistBlock: { ...m.checklistBlock, completed: true } };
|
|
3500
|
+
})
|
|
3501
|
+
};
|
|
3502
|
+
})
|
|
3503
|
+
);
|
|
3504
|
+
skipNextChecklistParsingRef.current = true;
|
|
3505
|
+
setTimeout(() => {
|
|
3506
|
+
sendMessage(
|
|
3507
|
+
`\uBAA8\uB4E0 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB2E8\uACC4\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC544\uB798\uB294 \uAC01 \uB2E8\uACC4\uBCC4 \uACB0\uACFC\uC785\uB2C8\uB2E4:
|
|
3508
|
+
|
|
3509
|
+
${allResults}
|
|
3510
|
+
|
|
3511
|
+
\uC704 \uACB0\uACFC\uB97C \uC885\uD569\uD558\uC5EC \uCD5C\uC885 \uACB0\uACFC\uBB3C\uC744 \uC644\uC131\uD574\uC8FC\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
|
|
3512
|
+
{ hiddenUserMessage: true }
|
|
3513
|
+
);
|
|
3514
|
+
}, 100);
|
|
3515
|
+
}
|
|
3516
|
+
},
|
|
3517
|
+
[sendMessage]
|
|
3518
|
+
);
|
|
3085
3519
|
const handlePollSubmit = (0, import_react5.useCallback)(
|
|
3086
3520
|
(messageId, responses) => {
|
|
3087
3521
|
const currentSess = sessions.find((s) => s.id === currentSessionId);
|
|
@@ -3106,7 +3540,7 @@ ${result.content}
|
|
|
3106
3540
|
return { ...m, pollBlock: void 0 };
|
|
3107
3541
|
});
|
|
3108
3542
|
updatedMessages.push({
|
|
3109
|
-
id:
|
|
3543
|
+
id: generateId4("msg"),
|
|
3110
3544
|
role: "assistant",
|
|
3111
3545
|
content: isAutoGenerate ? "\uC790\uB3D9\uC73C\uB85C \uCD5C\uC801\uC758 \uC635\uC158\uC744 \uC120\uD0DD\uD558\uC5EC \uC751\uB2F5\uD558\uACA0\uC2B5\uB2C8\uB2E4. \uC774\uC81C \uC2DC\uC791\uD558\uACA0\uC2B5\uB2C8\uB2E4." : "\uC120\uD0DD\uD558\uC2E0 \uB0B4\uC6A9\uC744 \uAE30\uBC18\uC73C\uB85C \uC751\uB2F5\uD558\uACA0\uC2B5\uB2C8\uB2E4. \uC774\uC81C \uC2DC\uC791\uD558\uACA0\uC2B5\uB2C8\uB2E4.",
|
|
3112
3546
|
model: selectedModel,
|
|
@@ -3430,7 +3864,7 @@ ${currentSession.contextSummary}` },
|
|
|
3430
3864
|
}
|
|
3431
3865
|
}
|
|
3432
3866
|
const alternative = {
|
|
3433
|
-
id:
|
|
3867
|
+
id: generateId4("alt"),
|
|
3434
3868
|
model: targetModel,
|
|
3435
3869
|
content: responseContent,
|
|
3436
3870
|
timestamp: Date.now(),
|
|
@@ -3684,7 +4118,14 @@ ${result.content}
|
|
|
3684
4118
|
projectSettingsOpen,
|
|
3685
4119
|
openProjectSettings: () => setProjectSettingsOpen(true),
|
|
3686
4120
|
closeProjectSettings: () => setProjectSettingsOpen(false),
|
|
3687
|
-
projectMemory
|
|
4121
|
+
projectMemory,
|
|
4122
|
+
// Checklist
|
|
4123
|
+
/** @Todo vibecode - 체크리스트 자동 실행 중단 */
|
|
4124
|
+
handleChecklistAbort,
|
|
4125
|
+
/** @Todo vibecode - 체크리스트 error 항목 재시도 */
|
|
4126
|
+
handleChecklistRetry,
|
|
4127
|
+
/** @Todo vibecode - 체크리스트 pending 항목 건너뛰기 */
|
|
4128
|
+
handleChecklistSkip
|
|
3688
4129
|
};
|
|
3689
4130
|
};
|
|
3690
4131
|
|
|
@@ -5440,10 +5881,10 @@ var iconButtonStyle = {
|
|
|
5440
5881
|
};
|
|
5441
5882
|
|
|
5442
5883
|
// src/react/components/MessageList.tsx
|
|
5443
|
-
var
|
|
5884
|
+
var import_react18 = require("react");
|
|
5444
5885
|
|
|
5445
5886
|
// src/react/components/MessageBubble.tsx
|
|
5446
|
-
var
|
|
5887
|
+
var import_react17 = require("react");
|
|
5447
5888
|
|
|
5448
5889
|
// src/react/components/MarkdownRenderer.tsx
|
|
5449
5890
|
var import_react11 = __toESM(require("react"));
|
|
@@ -5626,6 +6067,7 @@ var THINKING_TEXT_REGEX = /^Thinking:\s*\n([\s\S]*?)(?=\n\n|$)/gim;
|
|
|
5626
6067
|
var UNCLOSED_THINKING_TAG_REGEX = /<thinking>(?![\s\S]*?<\/thinking>)/gi;
|
|
5627
6068
|
var UNCLOSED_POLL_TAG_REGEX = /<poll[^>]*>(?![\s\S]*?<\/poll>)[\s\S]*$/gi;
|
|
5628
6069
|
var UNCLOSED_SKILL_TAG_REGEX = /<skill_use[^>]*>(?![\s\S]*?<\/skill_use>)[\s\S]*$/gi;
|
|
6070
|
+
var UNCLOSED_CHECKLIST_TAG_REGEX = /<checklist>(?![\s\S]*?<\/checklist>)[\s\S]*$/gi;
|
|
5629
6071
|
var INLINE_CODE_REGEX = /`([^`]+)`/g;
|
|
5630
6072
|
var BOLD_REGEX = /\*\*([^*]+)\*\*/g;
|
|
5631
6073
|
var ITALIC_REGEX = /(?<!\*)\*([^*]+)\*(?!\*)/g;
|
|
@@ -6505,7 +6947,11 @@ var MarkdownRenderer = ({
|
|
|
6505
6947
|
if (hasUnfinishedPoll) {
|
|
6506
6948
|
processedContent += "\n\xA7POLL_LOADING\xA7";
|
|
6507
6949
|
}
|
|
6950
|
+
processedContent = processedContent.replace(/<skill_use[^>]*>[\s\S]*?<\/skill_use>/gi, "");
|
|
6508
6951
|
processedContent = processedContent.replace(UNCLOSED_SKILL_TAG_REGEX, "");
|
|
6952
|
+
processedContent = processedContent.replace(/<checklist>[\s\S]*?<\/checklist>/gi, "");
|
|
6953
|
+
processedContent = processedContent.replace(UNCLOSED_CHECKLIST_TAG_REGEX, "");
|
|
6954
|
+
UNCLOSED_CHECKLIST_TAG_REGEX.lastIndex = 0;
|
|
6509
6955
|
const codeBlocks = [];
|
|
6510
6956
|
processedContent = processedContent.replace(CODE_BLOCK_REGEX, (match, lang, code) => {
|
|
6511
6957
|
if (lang === "markdown" || lang === "md") {
|
|
@@ -8175,8 +8621,311 @@ var ContentPartRenderer = ({
|
|
|
8175
8621
|
}) });
|
|
8176
8622
|
};
|
|
8177
8623
|
|
|
8178
|
-
// src/react/components/
|
|
8624
|
+
// src/react/components/ChecklistCard.tsx
|
|
8625
|
+
var import_react16 = require("react");
|
|
8179
8626
|
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
8627
|
+
var ChecklistCard = ({
|
|
8628
|
+
items,
|
|
8629
|
+
completed,
|
|
8630
|
+
onAbort,
|
|
8631
|
+
onRetryStep,
|
|
8632
|
+
onSkipStep
|
|
8633
|
+
}) => {
|
|
8634
|
+
const [expandedItems, setExpandedItems] = (0, import_react16.useState)(/* @__PURE__ */ new Set());
|
|
8635
|
+
const { doneCount, isRunning, hasError } = (0, import_react16.useMemo)(() => {
|
|
8636
|
+
const done = items.filter((it) => it.status === "done").length;
|
|
8637
|
+
const running = items.some((it) => it.status === "in_progress");
|
|
8638
|
+
const error = items.some((it) => it.status === "error");
|
|
8639
|
+
return { doneCount: done, isRunning: running, hasError: error };
|
|
8640
|
+
}, [items]);
|
|
8641
|
+
const progressPercent = doneCount / items.length * 100;
|
|
8642
|
+
const toggleExpanded = (itemId) => {
|
|
8643
|
+
setExpandedItems((prev) => {
|
|
8644
|
+
const next = new Set(prev);
|
|
8645
|
+
if (next.has(itemId)) {
|
|
8646
|
+
next.delete(itemId);
|
|
8647
|
+
} else {
|
|
8648
|
+
next.add(itemId);
|
|
8649
|
+
}
|
|
8650
|
+
return next;
|
|
8651
|
+
});
|
|
8652
|
+
};
|
|
8653
|
+
const renderStatusIcon = (item) => {
|
|
8654
|
+
switch (item.status) {
|
|
8655
|
+
case "done":
|
|
8656
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8657
|
+
"div",
|
|
8658
|
+
{
|
|
8659
|
+
style: {
|
|
8660
|
+
width: "20px",
|
|
8661
|
+
height: "20px",
|
|
8662
|
+
borderRadius: "50%",
|
|
8663
|
+
backgroundColor: "var(--chatllm-success, #22c55e)",
|
|
8664
|
+
display: "flex",
|
|
8665
|
+
alignItems: "center",
|
|
8666
|
+
justifyContent: "center",
|
|
8667
|
+
flexShrink: 0
|
|
8668
|
+
},
|
|
8669
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(IconSvg, { name: "check-line", size: 13, color: "#fff" })
|
|
8670
|
+
}
|
|
8671
|
+
);
|
|
8672
|
+
case "in_progress":
|
|
8673
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8674
|
+
"div",
|
|
8675
|
+
{
|
|
8676
|
+
style: {
|
|
8677
|
+
width: "20px",
|
|
8678
|
+
height: "20px",
|
|
8679
|
+
borderRadius: "50%",
|
|
8680
|
+
backgroundColor: "var(--chatllm-primary, #3584FA)",
|
|
8681
|
+
display: "flex",
|
|
8682
|
+
alignItems: "center",
|
|
8683
|
+
justifyContent: "center",
|
|
8684
|
+
flexShrink: 0,
|
|
8685
|
+
animation: "chatllm-checklist-pulse 1.5s ease-in-out infinite"
|
|
8686
|
+
},
|
|
8687
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { width: "6px", height: "6px", borderRadius: "50%", backgroundColor: "#fff" } })
|
|
8688
|
+
}
|
|
8689
|
+
);
|
|
8690
|
+
case "error":
|
|
8691
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8692
|
+
"div",
|
|
8693
|
+
{
|
|
8694
|
+
style: {
|
|
8695
|
+
width: "20px",
|
|
8696
|
+
height: "20px",
|
|
8697
|
+
borderRadius: "50%",
|
|
8698
|
+
backgroundColor: "var(--chatllm-error, #ef4444)",
|
|
8699
|
+
display: "flex",
|
|
8700
|
+
alignItems: "center",
|
|
8701
|
+
justifyContent: "center",
|
|
8702
|
+
flexShrink: 0
|
|
8703
|
+
},
|
|
8704
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(IconSvg, { name: "close-line", size: 13, color: "#fff" })
|
|
8705
|
+
}
|
|
8706
|
+
);
|
|
8707
|
+
default:
|
|
8708
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8709
|
+
"div",
|
|
8710
|
+
{
|
|
8711
|
+
style: {
|
|
8712
|
+
width: "20px",
|
|
8713
|
+
height: "20px",
|
|
8714
|
+
borderRadius: "50%",
|
|
8715
|
+
border: "2px solid var(--chatllm-text-muted, #94a3b8)",
|
|
8716
|
+
opacity: 0.5,
|
|
8717
|
+
flexShrink: 0
|
|
8718
|
+
}
|
|
8719
|
+
}
|
|
8720
|
+
);
|
|
8721
|
+
}
|
|
8722
|
+
};
|
|
8723
|
+
const headerText = completed ? "\uBAA8\uB4E0 \uB2E8\uACC4 \uC644\uB8CC" : hasError ? "\uC791\uC5C5 \uC911\uB2E8\uB428" : isRunning ? `\uC791\uC5C5 \uC9C4\uD589 \uC911 \xB7 ${doneCount}/${items.length}` : `\uB300\uAE30 \uC911 \xB7 ${doneCount}/${items.length}`;
|
|
8724
|
+
const headerColor = completed ? "var(--chatllm-success, #22c55e)" : hasError ? "var(--chatllm-error, #ef4444)" : "var(--chatllm-primary, #3584FA)";
|
|
8725
|
+
const progressBarColor = completed ? "var(--chatllm-success, #22c55e)" : "var(--chatllm-primary, #3584FA)";
|
|
8726
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
8727
|
+
"div",
|
|
8728
|
+
{
|
|
8729
|
+
style: {
|
|
8730
|
+
border: "1px solid var(--chatllm-border, #e5e7eb)",
|
|
8731
|
+
borderRadius: "12px",
|
|
8732
|
+
backgroundColor: "var(--chatllm-content-bg, #fff)",
|
|
8733
|
+
overflow: "hidden",
|
|
8734
|
+
marginTop: "8px"
|
|
8735
|
+
},
|
|
8736
|
+
children: [
|
|
8737
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { padding: "14px 16px 10px" }, children: [
|
|
8738
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "8px" }, children: [
|
|
8739
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8740
|
+
IconSvg,
|
|
8741
|
+
{
|
|
8742
|
+
name: completed ? "checkbox-circle-line" : "list-check",
|
|
8743
|
+
size: 16,
|
|
8744
|
+
color: headerColor
|
|
8745
|
+
}
|
|
8746
|
+
),
|
|
8747
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: "13px", fontWeight: 600, color: headerColor }, children: headerText })
|
|
8748
|
+
] }),
|
|
8749
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8750
|
+
"div",
|
|
8751
|
+
{
|
|
8752
|
+
style: {
|
|
8753
|
+
height: "3px",
|
|
8754
|
+
backgroundColor: "var(--chatllm-bg-secondary, #f1f5f9)",
|
|
8755
|
+
borderRadius: "2px",
|
|
8756
|
+
overflow: "hidden"
|
|
8757
|
+
},
|
|
8758
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8759
|
+
"div",
|
|
8760
|
+
{
|
|
8761
|
+
style: {
|
|
8762
|
+
height: "100%",
|
|
8763
|
+
width: `${progressPercent}%`,
|
|
8764
|
+
backgroundColor: progressBarColor,
|
|
8765
|
+
borderRadius: "2px",
|
|
8766
|
+
transition: "width 0.6s cubic-bezier(0.25, 1, 0.5, 1)"
|
|
8767
|
+
}
|
|
8768
|
+
}
|
|
8769
|
+
)
|
|
8770
|
+
}
|
|
8771
|
+
)
|
|
8772
|
+
] }),
|
|
8773
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { children: items.map((item, idx) => {
|
|
8774
|
+
const isExpanded = expandedItems.has(item.id);
|
|
8775
|
+
const canExpand = item.status === "done" && item.result && item.result !== "(\uAC74\uB108\uB700)";
|
|
8776
|
+
const isStopped = !isRunning && !completed;
|
|
8777
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { children: [
|
|
8778
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
8779
|
+
"div",
|
|
8780
|
+
{
|
|
8781
|
+
onClick: () => canExpand && toggleExpanded(item.id),
|
|
8782
|
+
style: {
|
|
8783
|
+
padding: "10px 16px",
|
|
8784
|
+
display: "flex",
|
|
8785
|
+
alignItems: "center",
|
|
8786
|
+
gap: "10px",
|
|
8787
|
+
borderTop: idx === 0 ? "1px solid var(--chatllm-border, #e5e7eb)" : "none",
|
|
8788
|
+
borderBottom: "1px solid var(--chatllm-border-light, #f1f5f9)",
|
|
8789
|
+
cursor: canExpand ? "pointer" : "default",
|
|
8790
|
+
backgroundColor: item.status === "error" ? "rgba(239, 68, 68, 0.04)" : item.status === "in_progress" ? "rgba(53, 132, 250, 0.03)" : "transparent",
|
|
8791
|
+
transition: "background-color 0.15s ease"
|
|
8792
|
+
},
|
|
8793
|
+
children: [
|
|
8794
|
+
renderStatusIcon(item),
|
|
8795
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
8796
|
+
"span",
|
|
8797
|
+
{
|
|
8798
|
+
style: {
|
|
8799
|
+
flex: 1,
|
|
8800
|
+
fontSize: "13px",
|
|
8801
|
+
fontWeight: item.status === "in_progress" ? 500 : 400,
|
|
8802
|
+
color: item.status === "pending" ? "var(--chatllm-text-muted, #94a3b8)" : item.status === "error" ? "var(--chatllm-error, #ef4444)" : "var(--chatllm-text, #374151)"
|
|
8803
|
+
},
|
|
8804
|
+
children: [
|
|
8805
|
+
idx + 1,
|
|
8806
|
+
". ",
|
|
8807
|
+
item.title
|
|
8808
|
+
]
|
|
8809
|
+
}
|
|
8810
|
+
),
|
|
8811
|
+
item.status === "error" && onRetryStep && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8812
|
+
"button",
|
|
8813
|
+
{
|
|
8814
|
+
onClick: (e) => {
|
|
8815
|
+
e.stopPropagation();
|
|
8816
|
+
onRetryStep(idx);
|
|
8817
|
+
},
|
|
8818
|
+
style: {
|
|
8819
|
+
padding: "4px 10px",
|
|
8820
|
+
fontSize: "11px",
|
|
8821
|
+
fontWeight: 500,
|
|
8822
|
+
color: "var(--chatllm-error, #ef4444)",
|
|
8823
|
+
backgroundColor: "rgba(239, 68, 68, 0.08)",
|
|
8824
|
+
border: "1px solid rgba(239, 68, 68, 0.2)",
|
|
8825
|
+
borderRadius: "4px",
|
|
8826
|
+
cursor: "pointer"
|
|
8827
|
+
},
|
|
8828
|
+
children: "\uC7AC\uC2DC\uB3C4"
|
|
8829
|
+
}
|
|
8830
|
+
),
|
|
8831
|
+
item.status === "pending" && isStopped && hasError && onSkipStep && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8832
|
+
"button",
|
|
8833
|
+
{
|
|
8834
|
+
onClick: (e) => {
|
|
8835
|
+
e.stopPropagation();
|
|
8836
|
+
onSkipStep(idx);
|
|
8837
|
+
},
|
|
8838
|
+
style: {
|
|
8839
|
+
padding: "4px 10px",
|
|
8840
|
+
fontSize: "11px",
|
|
8841
|
+
fontWeight: 500,
|
|
8842
|
+
color: "var(--chatllm-text-muted, #94a3b8)",
|
|
8843
|
+
backgroundColor: "var(--chatllm-bg-secondary, #f9fafb)",
|
|
8844
|
+
border: "1px solid var(--chatllm-border, #e5e7eb)",
|
|
8845
|
+
borderRadius: "4px",
|
|
8846
|
+
cursor: "pointer"
|
|
8847
|
+
},
|
|
8848
|
+
children: "\uAC74\uB108\uB6F0\uAE30"
|
|
8849
|
+
}
|
|
8850
|
+
),
|
|
8851
|
+
canExpand && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8852
|
+
IconSvg,
|
|
8853
|
+
{
|
|
8854
|
+
name: isExpanded ? "arrow-up-s-line" : "arrow-down-s-line",
|
|
8855
|
+
size: 16,
|
|
8856
|
+
color: "var(--chatllm-text-muted, #94a3b8)"
|
|
8857
|
+
}
|
|
8858
|
+
),
|
|
8859
|
+
item.result === "(\uAC74\uB108\uB700)" && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #94a3b8)" }, children: "\uAC74\uB108\uB700" })
|
|
8860
|
+
]
|
|
8861
|
+
}
|
|
8862
|
+
),
|
|
8863
|
+
canExpand && isExpanded && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8864
|
+
"div",
|
|
8865
|
+
{
|
|
8866
|
+
style: {
|
|
8867
|
+
padding: "8px 16px 12px 46px",
|
|
8868
|
+
backgroundColor: "var(--chatllm-bg-secondary, #f9fafb)",
|
|
8869
|
+
margin: "0 8px 4px",
|
|
8870
|
+
borderRadius: "6px",
|
|
8871
|
+
maxHeight: "300px",
|
|
8872
|
+
overflowY: "auto",
|
|
8873
|
+
fontSize: "13px",
|
|
8874
|
+
lineHeight: "1.6",
|
|
8875
|
+
color: "var(--chatllm-text-secondary, #475569)",
|
|
8876
|
+
whiteSpace: "pre-wrap",
|
|
8877
|
+
wordBreak: "break-word"
|
|
8878
|
+
},
|
|
8879
|
+
children: item.result
|
|
8880
|
+
}
|
|
8881
|
+
)
|
|
8882
|
+
] }, item.id);
|
|
8883
|
+
}) }),
|
|
8884
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
8885
|
+
"div",
|
|
8886
|
+
{
|
|
8887
|
+
style: {
|
|
8888
|
+
padding: "10px 16px",
|
|
8889
|
+
display: "flex",
|
|
8890
|
+
justifyContent: "space-between",
|
|
8891
|
+
alignItems: "center",
|
|
8892
|
+
borderTop: "1px solid var(--chatllm-border, #e5e7eb)"
|
|
8893
|
+
},
|
|
8894
|
+
children: [
|
|
8895
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #94a3b8)" }, children: [
|
|
8896
|
+
doneCount,
|
|
8897
|
+
"/",
|
|
8898
|
+
items.length,
|
|
8899
|
+
" \uC644\uB8CC"
|
|
8900
|
+
] }),
|
|
8901
|
+
isRunning && onAbort && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
8902
|
+
"button",
|
|
8903
|
+
{
|
|
8904
|
+
onClick: onAbort,
|
|
8905
|
+
style: {
|
|
8906
|
+
padding: "4px 12px",
|
|
8907
|
+
fontSize: "12px",
|
|
8908
|
+
fontWeight: 500,
|
|
8909
|
+
color: "var(--chatllm-text-muted, #94a3b8)",
|
|
8910
|
+
backgroundColor: "transparent",
|
|
8911
|
+
border: "1px solid var(--chatllm-border, #e5e7eb)",
|
|
8912
|
+
borderRadius: "4px",
|
|
8913
|
+
cursor: "pointer",
|
|
8914
|
+
transition: "all 0.15s ease"
|
|
8915
|
+
},
|
|
8916
|
+
children: "\uC911\uB2E8"
|
|
8917
|
+
}
|
|
8918
|
+
)
|
|
8919
|
+
]
|
|
8920
|
+
}
|
|
8921
|
+
)
|
|
8922
|
+
]
|
|
8923
|
+
}
|
|
8924
|
+
);
|
|
8925
|
+
};
|
|
8926
|
+
|
|
8927
|
+
// src/react/components/MessageBubble.tsx
|
|
8928
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
8180
8929
|
var MessageBubble = ({
|
|
8181
8930
|
message,
|
|
8182
8931
|
isLoading,
|
|
@@ -8196,10 +8945,13 @@ var MessageBubble = ({
|
|
|
8196
8945
|
showThinking = true,
|
|
8197
8946
|
thinkingDefaultOpen = false,
|
|
8198
8947
|
isLoadingAlternative = false,
|
|
8199
|
-
onPollSubmit
|
|
8948
|
+
onPollSubmit,
|
|
8949
|
+
onChecklistAbort,
|
|
8950
|
+
onChecklistRetry,
|
|
8951
|
+
onChecklistSkip
|
|
8200
8952
|
}) => {
|
|
8201
|
-
const [showActions, setShowActions] = (0,
|
|
8202
|
-
const [showModelMenu, setShowModelMenu] = (0,
|
|
8953
|
+
const [showActions, setShowActions] = (0, import_react17.useState)(false);
|
|
8954
|
+
const [showModelMenu, setShowModelMenu] = (0, import_react17.useState)(false);
|
|
8203
8955
|
const isUser = message.role === "user";
|
|
8204
8956
|
const isAssistant = message.role === "assistant";
|
|
8205
8957
|
const relevantAlternatives = isUser ? alternatives : message.alternatives;
|
|
@@ -8210,7 +8962,7 @@ var MessageBubble = ({
|
|
|
8210
8962
|
const displayModel = isAssistant && relevantAlternatives && relevantAlternatives.length > 0 && relevantActiveIndex > 0 ? relevantAlternatives[relevantActiveIndex - 1]?.model : message.model;
|
|
8211
8963
|
const displaySources = isAssistant && relevantAlternatives && relevantAlternatives.length > 0 && relevantActiveIndex > 0 ? relevantAlternatives[relevantActiveIndex - 1]?.sources : message.sources;
|
|
8212
8964
|
if (isUser) {
|
|
8213
|
-
return /* @__PURE__ */ (0,
|
|
8965
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8214
8966
|
"div",
|
|
8215
8967
|
{
|
|
8216
8968
|
className: "chatllm-message chatllm-message--user",
|
|
@@ -8223,7 +8975,7 @@ var MessageBubble = ({
|
|
|
8223
8975
|
onMouseEnter: () => setShowActions(true),
|
|
8224
8976
|
onMouseLeave: () => setShowActions(false),
|
|
8225
8977
|
children: [
|
|
8226
|
-
/* @__PURE__ */ (0,
|
|
8978
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8227
8979
|
"div",
|
|
8228
8980
|
{
|
|
8229
8981
|
style: {
|
|
@@ -8233,9 +8985,9 @@ var MessageBubble = ({
|
|
|
8233
8985
|
borderRadius: "16px",
|
|
8234
8986
|
borderTopRightRadius: "4px"
|
|
8235
8987
|
},
|
|
8236
|
-
children: message.contentParts?.length ? /* @__PURE__ */ (0,
|
|
8988
|
+
children: message.contentParts?.length ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: message.contentParts.map((part, idx) => {
|
|
8237
8989
|
if (part.type === "text") {
|
|
8238
|
-
return /* @__PURE__ */ (0,
|
|
8990
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8239
8991
|
"div",
|
|
8240
8992
|
{
|
|
8241
8993
|
style: {
|
|
@@ -8250,7 +9002,7 @@ var MessageBubble = ({
|
|
|
8250
9002
|
);
|
|
8251
9003
|
}
|
|
8252
9004
|
if (part.type === "image") {
|
|
8253
|
-
return /* @__PURE__ */ (0,
|
|
9005
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8254
9006
|
"img",
|
|
8255
9007
|
{
|
|
8256
9008
|
src: part.url,
|
|
@@ -8266,7 +9018,7 @@ var MessageBubble = ({
|
|
|
8266
9018
|
);
|
|
8267
9019
|
}
|
|
8268
9020
|
if (part.type === "file") {
|
|
8269
|
-
return /* @__PURE__ */ (0,
|
|
9021
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8270
9022
|
"div",
|
|
8271
9023
|
{
|
|
8272
9024
|
style: {
|
|
@@ -8280,15 +9032,15 @@ var MessageBubble = ({
|
|
|
8280
9032
|
color: "var(--chatllm-text)"
|
|
8281
9033
|
},
|
|
8282
9034
|
children: [
|
|
8283
|
-
/* @__PURE__ */ (0,
|
|
8284
|
-
/* @__PURE__ */ (0,
|
|
9035
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "file-text-line", size: 16, color: "var(--chatllm-text-muted)" }),
|
|
9036
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: part.name })
|
|
8285
9037
|
]
|
|
8286
9038
|
},
|
|
8287
9039
|
idx
|
|
8288
9040
|
);
|
|
8289
9041
|
}
|
|
8290
9042
|
return null;
|
|
8291
|
-
}) }) : /* @__PURE__ */ (0,
|
|
9043
|
+
}) }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8292
9044
|
"div",
|
|
8293
9045
|
{
|
|
8294
9046
|
style: {
|
|
@@ -8302,7 +9054,7 @@ var MessageBubble = ({
|
|
|
8302
9054
|
)
|
|
8303
9055
|
}
|
|
8304
9056
|
),
|
|
8305
|
-
!isLoading && /* @__PURE__ */ (0,
|
|
9057
|
+
!isLoading && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8306
9058
|
"div",
|
|
8307
9059
|
{
|
|
8308
9060
|
style: {
|
|
@@ -8314,7 +9066,7 @@ var MessageBubble = ({
|
|
|
8314
9066
|
transition: "opacity 0.15s ease"
|
|
8315
9067
|
},
|
|
8316
9068
|
children: [
|
|
8317
|
-
/* @__PURE__ */ (0,
|
|
9069
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("button", { onClick: onCopy, style: actionButtonSmallStyle, title: "\uBCF5\uC0AC", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8318
9070
|
IconSvg,
|
|
8319
9071
|
{
|
|
8320
9072
|
name: isCopied ? "check-line" : "file-copy-line",
|
|
@@ -8322,7 +9074,7 @@ var MessageBubble = ({
|
|
|
8322
9074
|
color: isCopied ? "var(--chatllm-success)" : "var(--chatllm-text-muted)"
|
|
8323
9075
|
}
|
|
8324
9076
|
) }),
|
|
8325
|
-
/* @__PURE__ */ (0,
|
|
9077
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("button", { onClick: onEdit, style: actionButtonSmallStyle, title: "\uC218\uC815", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "edit-line", size: 12, color: "var(--chatllm-text-muted)" }) })
|
|
8326
9078
|
]
|
|
8327
9079
|
}
|
|
8328
9080
|
)
|
|
@@ -8330,7 +9082,7 @@ var MessageBubble = ({
|
|
|
8330
9082
|
}
|
|
8331
9083
|
);
|
|
8332
9084
|
}
|
|
8333
|
-
return /* @__PURE__ */ (0,
|
|
9085
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8334
9086
|
"div",
|
|
8335
9087
|
{
|
|
8336
9088
|
className: "chatllm-message chatllm-message--assistant",
|
|
@@ -8343,7 +9095,7 @@ var MessageBubble = ({
|
|
|
8343
9095
|
onMouseEnter: () => setShowActions(true),
|
|
8344
9096
|
onMouseLeave: () => setShowActions(false),
|
|
8345
9097
|
children: [
|
|
8346
|
-
/* @__PURE__ */ (0,
|
|
9098
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8347
9099
|
"div",
|
|
8348
9100
|
{
|
|
8349
9101
|
className: "chatllm-sheet",
|
|
@@ -8354,7 +9106,7 @@ var MessageBubble = ({
|
|
|
8354
9106
|
gap: "12px"
|
|
8355
9107
|
},
|
|
8356
9108
|
children: [
|
|
8357
|
-
/* @__PURE__ */ (0,
|
|
9109
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { flexShrink: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8358
9110
|
"div",
|
|
8359
9111
|
{
|
|
8360
9112
|
style: {
|
|
@@ -8367,11 +9119,11 @@ var MessageBubble = ({
|
|
|
8367
9119
|
justifyContent: "center",
|
|
8368
9120
|
color: "var(--chatllm-primary)"
|
|
8369
9121
|
},
|
|
8370
|
-
children: /* @__PURE__ */ (0,
|
|
9122
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "magic-line", size: 20 })
|
|
8371
9123
|
}
|
|
8372
9124
|
) }),
|
|
8373
|
-
/* @__PURE__ */ (0,
|
|
8374
|
-
displayModel && /* @__PURE__ */ (0,
|
|
9125
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
|
|
9126
|
+
displayModel && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8375
9127
|
"div",
|
|
8376
9128
|
{
|
|
8377
9129
|
style: {
|
|
@@ -8380,7 +9132,7 @@ var MessageBubble = ({
|
|
|
8380
9132
|
gap: "8px",
|
|
8381
9133
|
marginBottom: "8px"
|
|
8382
9134
|
},
|
|
8383
|
-
children: /* @__PURE__ */ (0,
|
|
9135
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8384
9136
|
"span",
|
|
8385
9137
|
{
|
|
8386
9138
|
style: {
|
|
@@ -8395,9 +9147,9 @@ var MessageBubble = ({
|
|
|
8395
9147
|
)
|
|
8396
9148
|
}
|
|
8397
9149
|
),
|
|
8398
|
-
message.isDeepResearch && message.researchProgress && message.researchProgress.phase !== "done" && /* @__PURE__ */ (0,
|
|
8399
|
-
message.skillExecution && message.skillExecution.status !== "done" && (message.skillExecution.progress?.subAgents ? /* @__PURE__ */ (0,
|
|
8400
|
-
message.isDeepResearch && displayContent && /* @__PURE__ */ (0,
|
|
9150
|
+
message.isDeepResearch && message.researchProgress && message.researchProgress.phase !== "done" && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(DeepResearchProgressUI, { progress: message.researchProgress }),
|
|
9151
|
+
message.skillExecution && message.skillExecution.status !== "done" && (message.skillExecution.progress?.subAgents ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(DeepResearchProgressUI, { progress: message.skillExecution.progress }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(SkillProgressUI, { execution: message.skillExecution })),
|
|
9152
|
+
message.isDeepResearch && displayContent && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8401
9153
|
"div",
|
|
8402
9154
|
{
|
|
8403
9155
|
className: "chatllm-deep-research__header",
|
|
@@ -8410,8 +9162,8 @@ var MessageBubble = ({
|
|
|
8410
9162
|
borderBottom: "1px solid var(--chatllm-border-light)"
|
|
8411
9163
|
},
|
|
8412
9164
|
children: [
|
|
8413
|
-
/* @__PURE__ */ (0,
|
|
8414
|
-
/* @__PURE__ */ (0,
|
|
9165
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "search-eye-line", size: 18, color: "var(--chatllm-primary)" }),
|
|
9166
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8415
9167
|
"span",
|
|
8416
9168
|
{
|
|
8417
9169
|
style: {
|
|
@@ -8422,7 +9174,7 @@ var MessageBubble = ({
|
|
|
8422
9174
|
children: "\uC2EC\uCE35\uC5F0\uAD6C"
|
|
8423
9175
|
}
|
|
8424
9176
|
),
|
|
8425
|
-
displaySources && displaySources.length > 0 && /* @__PURE__ */ (0,
|
|
9177
|
+
displaySources && displaySources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8426
9178
|
"span",
|
|
8427
9179
|
{
|
|
8428
9180
|
className: "chatllm-deep-research__source-count",
|
|
@@ -8444,7 +9196,7 @@ var MessageBubble = ({
|
|
|
8444
9196
|
]
|
|
8445
9197
|
}
|
|
8446
9198
|
),
|
|
8447
|
-
!!message.contentParts?.length && /* @__PURE__ */ (0,
|
|
9199
|
+
!!message.contentParts?.length && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { wordBreak: "break-word" }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8448
9200
|
ContentPartRenderer,
|
|
8449
9201
|
{
|
|
8450
9202
|
parts: message.contentParts,
|
|
@@ -8455,13 +9207,13 @@ var MessageBubble = ({
|
|
|
8455
9207
|
) }),
|
|
8456
9208
|
isLoading && !displayContent && !message.isDeepResearch && (message.contentParts?.length ? (
|
|
8457
9209
|
/* contentParts 있을 때: 간소화된 AI 응답 대기 표시 */
|
|
8458
|
-
/* @__PURE__ */ (0,
|
|
8459
|
-
/* @__PURE__ */ (0,
|
|
8460
|
-
/* @__PURE__ */ (0,
|
|
8461
|
-
/* @__PURE__ */ (0,
|
|
8462
|
-
/* @__PURE__ */ (0,
|
|
9210
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginTop: "4px" }, children: [
|
|
9211
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
|
|
9212
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle }),
|
|
9213
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle }),
|
|
9214
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle })
|
|
8463
9215
|
] }),
|
|
8464
|
-
/* @__PURE__ */ (0,
|
|
9216
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8465
9217
|
"span",
|
|
8466
9218
|
{
|
|
8467
9219
|
style: {
|
|
@@ -8476,14 +9228,14 @@ var MessageBubble = ({
|
|
|
8476
9228
|
] })
|
|
8477
9229
|
) : (
|
|
8478
9230
|
/* contentParts 없을 때: 풀 스켈레톤 */
|
|
8479
|
-
/* @__PURE__ */ (0,
|
|
8480
|
-
/* @__PURE__ */ (0,
|
|
8481
|
-
/* @__PURE__ */ (0,
|
|
8482
|
-
/* @__PURE__ */ (0,
|
|
8483
|
-
/* @__PURE__ */ (0,
|
|
8484
|
-
/* @__PURE__ */ (0,
|
|
9231
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [
|
|
9232
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [
|
|
9233
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
|
|
9234
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle }),
|
|
9235
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle }),
|
|
9236
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle })
|
|
8485
9237
|
] }),
|
|
8486
|
-
/* @__PURE__ */ (0,
|
|
9238
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8487
9239
|
"span",
|
|
8488
9240
|
{
|
|
8489
9241
|
style: {
|
|
@@ -8496,17 +9248,17 @@ var MessageBubble = ({
|
|
|
8496
9248
|
}
|
|
8497
9249
|
)
|
|
8498
9250
|
] }),
|
|
8499
|
-
/* @__PURE__ */ (0,
|
|
8500
|
-
/* @__PURE__ */ (0,
|
|
8501
|
-
/* @__PURE__ */ (0,
|
|
8502
|
-
/* @__PURE__ */ (0,
|
|
8503
|
-
/* @__PURE__ */ (0,
|
|
8504
|
-
/* @__PURE__ */ (0,
|
|
9251
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "chatllm-skeleton-pulse", style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
|
|
9252
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { height: "32px", width: "75%", backgroundColor: "var(--chatllm-bg-tertiary)", borderRadius: "8px" } }),
|
|
9253
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [
|
|
9254
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { height: "16px", width: "100%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } }),
|
|
9255
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { height: "16px", width: "85%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } }),
|
|
9256
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { height: "16px", width: "65%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } })
|
|
8505
9257
|
] })
|
|
8506
9258
|
] })
|
|
8507
9259
|
] })
|
|
8508
9260
|
)),
|
|
8509
|
-
displayContent ? /* @__PURE__ */ (0,
|
|
9261
|
+
displayContent ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { wordBreak: "break-word" }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8510
9262
|
MarkdownRenderer,
|
|
8511
9263
|
{
|
|
8512
9264
|
content: displayContent,
|
|
@@ -8515,7 +9267,7 @@ var MessageBubble = ({
|
|
|
8515
9267
|
thinkingDefaultOpen
|
|
8516
9268
|
}
|
|
8517
9269
|
) }) : null,
|
|
8518
|
-
message.pollBlock && message.pollBlock.questions.length > 0 && /* @__PURE__ */ (0,
|
|
9270
|
+
message.pollBlock && message.pollBlock.questions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8519
9271
|
PollCard,
|
|
8520
9272
|
{
|
|
8521
9273
|
questions: message.pollBlock.questions,
|
|
@@ -8527,7 +9279,18 @@ var MessageBubble = ({
|
|
|
8527
9279
|
}
|
|
8528
9280
|
}
|
|
8529
9281
|
),
|
|
8530
|
-
|
|
9282
|
+
message.checklistBlock && message.checklistBlock.items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
9283
|
+
ChecklistCard,
|
|
9284
|
+
{
|
|
9285
|
+
items: message.checklistBlock.items,
|
|
9286
|
+
currentStep: message.checklistBlock.currentStep,
|
|
9287
|
+
completed: message.checklistBlock.completed,
|
|
9288
|
+
onAbort: onChecklistAbort,
|
|
9289
|
+
onRetryStep: onChecklistRetry,
|
|
9290
|
+
onSkipStep: onChecklistSkip
|
|
9291
|
+
}
|
|
9292
|
+
),
|
|
9293
|
+
!isLoading && !displayContent && !message.pollBlock && !message.checklistBlock && !message.contentParts?.length && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8531
9294
|
"div",
|
|
8532
9295
|
{
|
|
8533
9296
|
style: {
|
|
@@ -8540,7 +9303,7 @@ var MessageBubble = ({
|
|
|
8540
9303
|
children: "\uC751\uB2F5\uC744 \uC0DD\uC131\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694."
|
|
8541
9304
|
}
|
|
8542
9305
|
),
|
|
8543
|
-
displaySources && displaySources.length > 0 && /* @__PURE__ */ (0,
|
|
9306
|
+
displaySources && displaySources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8544
9307
|
"div",
|
|
8545
9308
|
{
|
|
8546
9309
|
style: {
|
|
@@ -8552,7 +9315,7 @@ var MessageBubble = ({
|
|
|
8552
9315
|
borderTop: "1px solid var(--chatllm-border-light)"
|
|
8553
9316
|
},
|
|
8554
9317
|
children: [
|
|
8555
|
-
/* @__PURE__ */ (0,
|
|
9318
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8556
9319
|
"span",
|
|
8557
9320
|
{
|
|
8558
9321
|
style: {
|
|
@@ -8564,7 +9327,7 @@ var MessageBubble = ({
|
|
|
8564
9327
|
children: "\uCD9C\uCC98:"
|
|
8565
9328
|
}
|
|
8566
9329
|
),
|
|
8567
|
-
displaySources.map((source, index) => /* @__PURE__ */ (0,
|
|
9330
|
+
displaySources.map((source, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8568
9331
|
LinkChip,
|
|
8569
9332
|
{
|
|
8570
9333
|
text: source.title,
|
|
@@ -8577,7 +9340,7 @@ var MessageBubble = ({
|
|
|
8577
9340
|
]
|
|
8578
9341
|
}
|
|
8579
9342
|
),
|
|
8580
|
-
relevantAlternatives && relevantAlternatives.length > 0 && /* @__PURE__ */ (0,
|
|
9343
|
+
relevantAlternatives && relevantAlternatives.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8581
9344
|
"div",
|
|
8582
9345
|
{
|
|
8583
9346
|
style: {
|
|
@@ -8591,8 +9354,8 @@ var MessageBubble = ({
|
|
|
8591
9354
|
fontSize: "12px"
|
|
8592
9355
|
},
|
|
8593
9356
|
children: [
|
|
8594
|
-
/* @__PURE__ */ (0,
|
|
8595
|
-
/* @__PURE__ */ (0,
|
|
9357
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { color: "var(--chatllm-text-muted)", marginRight: "4px" }, children: displayModel || "\uBAA8\uB378" }),
|
|
9358
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8596
9359
|
"button",
|
|
8597
9360
|
{
|
|
8598
9361
|
onClick: () => onAlternativeChange?.(Math.max(0, relevantActiveIndex - 1)),
|
|
@@ -8602,15 +9365,15 @@ var MessageBubble = ({
|
|
|
8602
9365
|
opacity: relevantActiveIndex === 0 ? 0.5 : 1,
|
|
8603
9366
|
cursor: relevantActiveIndex === 0 ? "not-allowed" : "pointer"
|
|
8604
9367
|
},
|
|
8605
|
-
children: /* @__PURE__ */ (0,
|
|
9368
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "arrow-left-line", size: 12 })
|
|
8606
9369
|
}
|
|
8607
9370
|
),
|
|
8608
|
-
/* @__PURE__ */ (0,
|
|
9371
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { style: { color: "var(--chatllm-text-secondary)" }, children: [
|
|
8609
9372
|
relevantActiveIndex + 1,
|
|
8610
9373
|
" / ",
|
|
8611
9374
|
relevantAlternatives.length + 1
|
|
8612
9375
|
] }),
|
|
8613
|
-
/* @__PURE__ */ (0,
|
|
9376
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8614
9377
|
"button",
|
|
8615
9378
|
{
|
|
8616
9379
|
onClick: () => onAlternativeChange?.(Math.min(relevantAlternatives.length, relevantActiveIndex + 1)),
|
|
@@ -8620,13 +9383,13 @@ var MessageBubble = ({
|
|
|
8620
9383
|
opacity: relevantActiveIndex === relevantAlternatives.length ? 0.5 : 1,
|
|
8621
9384
|
cursor: relevantActiveIndex === relevantAlternatives.length ? "not-allowed" : "pointer"
|
|
8622
9385
|
},
|
|
8623
|
-
children: /* @__PURE__ */ (0,
|
|
9386
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "arrow-right-line", size: 12 })
|
|
8624
9387
|
}
|
|
8625
9388
|
)
|
|
8626
9389
|
]
|
|
8627
9390
|
}
|
|
8628
9391
|
),
|
|
8629
|
-
isLoadingAlternative && /* @__PURE__ */ (0,
|
|
9392
|
+
isLoadingAlternative && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8630
9393
|
"div",
|
|
8631
9394
|
{
|
|
8632
9395
|
style: {
|
|
@@ -8641,12 +9404,12 @@ var MessageBubble = ({
|
|
|
8641
9404
|
color: "var(--chatllm-primary, #3584FA)"
|
|
8642
9405
|
},
|
|
8643
9406
|
children: [
|
|
8644
|
-
/* @__PURE__ */ (0,
|
|
8645
|
-
/* @__PURE__ */ (0,
|
|
8646
|
-
/* @__PURE__ */ (0,
|
|
8647
|
-
/* @__PURE__ */ (0,
|
|
9407
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
|
|
9408
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle }),
|
|
9409
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle }),
|
|
9410
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "chatllm-dot-bounce", style: dotStyle })
|
|
8648
9411
|
] }),
|
|
8649
|
-
/* @__PURE__ */ (0,
|
|
9412
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontWeight: 500 }, children: "\uB2E4\uB978 \uBAA8\uB378 \uC751\uB2F5 \uC0DD\uC131 \uC911..." })
|
|
8650
9413
|
]
|
|
8651
9414
|
}
|
|
8652
9415
|
)
|
|
@@ -8654,7 +9417,7 @@ var MessageBubble = ({
|
|
|
8654
9417
|
]
|
|
8655
9418
|
}
|
|
8656
9419
|
),
|
|
8657
|
-
!isLoading && /* @__PURE__ */ (0,
|
|
9420
|
+
!isLoading && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8658
9421
|
"div",
|
|
8659
9422
|
{
|
|
8660
9423
|
style: {
|
|
@@ -8667,7 +9430,7 @@ var MessageBubble = ({
|
|
|
8667
9430
|
transition: "opacity 0.15s ease"
|
|
8668
9431
|
},
|
|
8669
9432
|
children: [
|
|
8670
|
-
/* @__PURE__ */ (0,
|
|
9433
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("button", { onClick: onCopy, style: actionButtonSmallStyle, title: "\uBCF5\uC0AC", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8671
9434
|
IconSvg,
|
|
8672
9435
|
{
|
|
8673
9436
|
name: isCopied ? "check-line" : "file-copy-line",
|
|
@@ -8675,18 +9438,18 @@ var MessageBubble = ({
|
|
|
8675
9438
|
color: isCopied ? "var(--chatllm-success)" : "var(--chatllm-text-muted)"
|
|
8676
9439
|
}
|
|
8677
9440
|
) }),
|
|
8678
|
-
onRegenerate && /* @__PURE__ */ (0,
|
|
8679
|
-
onAskOtherModel && otherModels.length > 0 && /* @__PURE__ */ (0,
|
|
8680
|
-
/* @__PURE__ */ (0,
|
|
9441
|
+
onRegenerate && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("button", { onClick: onRegenerate, style: actionButtonSmallStyle, title: "\uB2E4\uC2DC \uC0DD\uC131", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "refresh-line", size: 12, color: "var(--chatllm-text-muted)" }) }),
|
|
9442
|
+
onAskOtherModel && otherModels.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { position: "relative" }, children: [
|
|
9443
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8681
9444
|
"button",
|
|
8682
9445
|
{
|
|
8683
9446
|
onClick: () => setShowModelMenu(!showModelMenu),
|
|
8684
9447
|
style: actionButtonSmallStyle,
|
|
8685
9448
|
title: "\uB2E4\uB978 \uBAA8\uB378\uC5D0\uAC8C \uC9C8\uBB38",
|
|
8686
|
-
children: /* @__PURE__ */ (0,
|
|
9449
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "robot-line", size: 12, color: "var(--chatllm-text-muted)" })
|
|
8687
9450
|
}
|
|
8688
9451
|
),
|
|
8689
|
-
showModelMenu && /* @__PURE__ */ (0,
|
|
9452
|
+
showModelMenu && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8690
9453
|
ModelMenu,
|
|
8691
9454
|
{
|
|
8692
9455
|
models: otherModels,
|
|
@@ -8705,7 +9468,7 @@ var MessageBubble = ({
|
|
|
8705
9468
|
}
|
|
8706
9469
|
);
|
|
8707
9470
|
};
|
|
8708
|
-
var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0,
|
|
9471
|
+
var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8709
9472
|
"div",
|
|
8710
9473
|
{
|
|
8711
9474
|
style: {
|
|
@@ -8723,7 +9486,7 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0, import_js
|
|
|
8723
9486
|
},
|
|
8724
9487
|
onMouseLeave: onClose,
|
|
8725
9488
|
children: [
|
|
8726
|
-
/* @__PURE__ */ (0,
|
|
9489
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8727
9490
|
"div",
|
|
8728
9491
|
{
|
|
8729
9492
|
style: {
|
|
@@ -8738,7 +9501,7 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0, import_js
|
|
|
8738
9501
|
children: "\uB2E4\uB978 \uBAA8\uB378\uC5D0\uAC8C \uC9C8\uBB38"
|
|
8739
9502
|
}
|
|
8740
9503
|
),
|
|
8741
|
-
models.map((model) => /* @__PURE__ */ (0,
|
|
9504
|
+
models.map((model) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8742
9505
|
"button",
|
|
8743
9506
|
{
|
|
8744
9507
|
onClick: () => onSelect(model.id),
|
|
@@ -8763,9 +9526,9 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0, import_js
|
|
|
8763
9526
|
e.currentTarget.style.backgroundColor = "transparent";
|
|
8764
9527
|
},
|
|
8765
9528
|
children: [
|
|
8766
|
-
/* @__PURE__ */ (0,
|
|
8767
|
-
/* @__PURE__ */ (0,
|
|
8768
|
-
model.provider && /* @__PURE__ */ (0,
|
|
9529
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "robot-line", size: 16, color: "var(--chatllm-primary)" }),
|
|
9530
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { flex: 1, fontWeight: 500 }, children: model.name }),
|
|
9531
|
+
model.provider && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8769
9532
|
"span",
|
|
8770
9533
|
{
|
|
8771
9534
|
style: {
|
|
@@ -8814,7 +9577,7 @@ var navButtonStyle = {
|
|
|
8814
9577
|
};
|
|
8815
9578
|
|
|
8816
9579
|
// src/react/components/MessageList.tsx
|
|
8817
|
-
var
|
|
9580
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
8818
9581
|
var MessageList = ({
|
|
8819
9582
|
messages,
|
|
8820
9583
|
isLoading,
|
|
@@ -8832,16 +9595,19 @@ var MessageList = ({
|
|
|
8832
9595
|
showThinking = true,
|
|
8833
9596
|
thinkingDefaultOpen = false,
|
|
8834
9597
|
loadingAlternativeFor,
|
|
8835
|
-
onPollSubmit
|
|
9598
|
+
onPollSubmit,
|
|
9599
|
+
onChecklistAbort,
|
|
9600
|
+
onChecklistRetry,
|
|
9601
|
+
onChecklistSkip
|
|
8836
9602
|
}) => {
|
|
8837
|
-
const messagesEndRef = (0,
|
|
8838
|
-
const containerRef = (0,
|
|
8839
|
-
const [selectedText, setSelectedText] = (0,
|
|
8840
|
-
const [selectionPosition, setSelectionPosition] = (0,
|
|
8841
|
-
const [showScrollButton, setShowScrollButton] = (0,
|
|
8842
|
-
const isUserScrolledUpRef = (0,
|
|
9603
|
+
const messagesEndRef = (0, import_react18.useRef)(null);
|
|
9604
|
+
const containerRef = (0, import_react18.useRef)(null);
|
|
9605
|
+
const [selectedText, setSelectedText] = (0, import_react18.useState)("");
|
|
9606
|
+
const [selectionPosition, setSelectionPosition] = (0, import_react18.useState)(null);
|
|
9607
|
+
const [showScrollButton, setShowScrollButton] = (0, import_react18.useState)(false);
|
|
9608
|
+
const isUserScrolledUpRef = (0, import_react18.useRef)(false);
|
|
8843
9609
|
const SCROLL_THRESHOLD = 100;
|
|
8844
|
-
const handleScroll = (0,
|
|
9610
|
+
const handleScroll = (0, import_react18.useCallback)(() => {
|
|
8845
9611
|
if (!containerRef.current) return;
|
|
8846
9612
|
const { scrollTop, scrollHeight, clientHeight } = containerRef.current;
|
|
8847
9613
|
const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
|
|
@@ -8849,16 +9615,16 @@ var MessageList = ({
|
|
|
8849
9615
|
isUserScrolledUpRef.current = !isNearBottom;
|
|
8850
9616
|
setShowScrollButton(!isNearBottom);
|
|
8851
9617
|
}, []);
|
|
8852
|
-
(0,
|
|
9618
|
+
(0, import_react18.useEffect)(() => {
|
|
8853
9619
|
if (isUserScrolledUpRef.current) return;
|
|
8854
9620
|
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
8855
9621
|
}, [messages]);
|
|
8856
|
-
const scrollToBottom = (0,
|
|
9622
|
+
const scrollToBottom = (0, import_react18.useCallback)(() => {
|
|
8857
9623
|
isUserScrolledUpRef.current = false;
|
|
8858
9624
|
setShowScrollButton(false);
|
|
8859
9625
|
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
8860
9626
|
}, []);
|
|
8861
|
-
const handleMouseUp = (0,
|
|
9627
|
+
const handleMouseUp = (0, import_react18.useCallback)(() => {
|
|
8862
9628
|
const selection = typeof window !== "undefined" ? window.getSelection() : null;
|
|
8863
9629
|
const text = selection?.toString().trim();
|
|
8864
9630
|
if (text && text.length > 0) {
|
|
@@ -8892,7 +9658,7 @@ var MessageList = ({
|
|
|
8892
9658
|
}
|
|
8893
9659
|
}
|
|
8894
9660
|
};
|
|
8895
|
-
return /* @__PURE__ */ (0,
|
|
9661
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
8896
9662
|
"div",
|
|
8897
9663
|
{
|
|
8898
9664
|
ref: containerRef,
|
|
@@ -8905,7 +9671,7 @@ var MessageList = ({
|
|
|
8905
9671
|
onScroll: handleScroll,
|
|
8906
9672
|
onMouseUp: handleMouseUp,
|
|
8907
9673
|
children: [
|
|
8908
|
-
/* @__PURE__ */ (0,
|
|
9674
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
8909
9675
|
"div",
|
|
8910
9676
|
{
|
|
8911
9677
|
style: {
|
|
@@ -8920,7 +9686,7 @@ var MessageList = ({
|
|
|
8920
9686
|
const nextAssistant = message.role === "user" && index + 1 < messages.length ? messages[index + 1] : null;
|
|
8921
9687
|
const assistantForAlts = nextAssistant?.role === "assistant" ? nextAssistant : null;
|
|
8922
9688
|
const activeAltIndex = assistantForAlts ? activeAlternatives[assistantForAlts.id] ?? 0 : 0;
|
|
8923
|
-
return /* @__PURE__ */ (0,
|
|
9689
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
8924
9690
|
MessageBubble,
|
|
8925
9691
|
{
|
|
8926
9692
|
message,
|
|
@@ -8946,16 +9712,19 @@ var MessageList = ({
|
|
|
8946
9712
|
showThinking,
|
|
8947
9713
|
thinkingDefaultOpen,
|
|
8948
9714
|
isLoadingAlternative: loadingAlternativeFor === message.id,
|
|
8949
|
-
onPollSubmit: message.role === "assistant" && onPollSubmit ? (response) => onPollSubmit(message.id, response) : void 0
|
|
9715
|
+
onPollSubmit: message.role === "assistant" && onPollSubmit ? (response) => onPollSubmit(message.id, response) : void 0,
|
|
9716
|
+
onChecklistAbort: message.role === "assistant" && onChecklistAbort ? onChecklistAbort : void 0,
|
|
9717
|
+
onChecklistRetry: message.role === "assistant" && onChecklistRetry ? (stepIndex) => onChecklistRetry(message.id, stepIndex) : void 0,
|
|
9718
|
+
onChecklistSkip: message.role === "assistant" && onChecklistSkip ? (stepIndex) => onChecklistSkip(message.id, stepIndex) : void 0
|
|
8950
9719
|
},
|
|
8951
9720
|
message.id
|
|
8952
9721
|
);
|
|
8953
9722
|
}),
|
|
8954
|
-
/* @__PURE__ */ (0,
|
|
9723
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { ref: messagesEndRef })
|
|
8955
9724
|
]
|
|
8956
9725
|
}
|
|
8957
9726
|
),
|
|
8958
|
-
showScrollButton && /* @__PURE__ */ (0,
|
|
9727
|
+
showScrollButton && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
8959
9728
|
"button",
|
|
8960
9729
|
{
|
|
8961
9730
|
onClick: scrollToBottom,
|
|
@@ -8978,10 +9747,10 @@ var MessageList = ({
|
|
|
8978
9747
|
zIndex: 10,
|
|
8979
9748
|
transition: "opacity 0.2s"
|
|
8980
9749
|
},
|
|
8981
|
-
children: /* @__PURE__ */ (0,
|
|
9750
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IconSvg, { name: "arrow-down-s-line", size: 24, color: "var(--chatllm-text-secondary)" })
|
|
8982
9751
|
}
|
|
8983
9752
|
),
|
|
8984
|
-
selectionPosition && /* @__PURE__ */ (0,
|
|
9753
|
+
selectionPosition && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
8985
9754
|
"div",
|
|
8986
9755
|
{
|
|
8987
9756
|
style: {
|
|
@@ -8993,7 +9762,7 @@ var MessageList = ({
|
|
|
8993
9762
|
pointerEvents: "auto"
|
|
8994
9763
|
},
|
|
8995
9764
|
children: [
|
|
8996
|
-
/* @__PURE__ */ (0,
|
|
9765
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
8997
9766
|
"button",
|
|
8998
9767
|
{
|
|
8999
9768
|
onClick: handleQuote,
|
|
@@ -9013,12 +9782,12 @@ var MessageList = ({
|
|
|
9013
9782
|
whiteSpace: "nowrap"
|
|
9014
9783
|
},
|
|
9015
9784
|
children: [
|
|
9016
|
-
/* @__PURE__ */ (0,
|
|
9785
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IconSvg, { name: "double-quotes-l", size: 16, color: "#ffffff" }),
|
|
9017
9786
|
"\uC778\uC6A9\uD558\uAE30"
|
|
9018
9787
|
]
|
|
9019
9788
|
}
|
|
9020
9789
|
),
|
|
9021
|
-
/* @__PURE__ */ (0,
|
|
9790
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
9022
9791
|
"div",
|
|
9023
9792
|
{
|
|
9024
9793
|
style: {
|
|
@@ -9043,8 +9812,8 @@ var MessageList = ({
|
|
|
9043
9812
|
};
|
|
9044
9813
|
|
|
9045
9814
|
// src/react/components/SettingsModal.tsx
|
|
9046
|
-
var
|
|
9047
|
-
var
|
|
9815
|
+
var import_react19 = require("react");
|
|
9816
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
9048
9817
|
var DEFAULT_PERSONALIZATION2 = {
|
|
9049
9818
|
responseStyle: {
|
|
9050
9819
|
warmth: "medium",
|
|
@@ -9079,9 +9848,9 @@ var SettingsModal = ({
|
|
|
9079
9848
|
currentProjectTitle,
|
|
9080
9849
|
showMemoryTab = true
|
|
9081
9850
|
}) => {
|
|
9082
|
-
const [activeTab, setActiveTab] = (0,
|
|
9083
|
-
const [localApiKey, setLocalApiKey] = (0,
|
|
9084
|
-
(0,
|
|
9851
|
+
const [activeTab, setActiveTab] = (0, import_react19.useState)("general");
|
|
9852
|
+
const [localApiKey, setLocalApiKey] = (0, import_react19.useState)(apiKey);
|
|
9853
|
+
(0, import_react19.useEffect)(() => {
|
|
9085
9854
|
setLocalApiKey(apiKey);
|
|
9086
9855
|
}, [apiKey]);
|
|
9087
9856
|
if (!isOpen) return null;
|
|
@@ -9107,7 +9876,7 @@ var SettingsModal = ({
|
|
|
9107
9876
|
setLocalApiKey(value);
|
|
9108
9877
|
onApiKeyChange?.(value);
|
|
9109
9878
|
};
|
|
9110
|
-
return /* @__PURE__ */ (0,
|
|
9879
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9111
9880
|
"div",
|
|
9112
9881
|
{
|
|
9113
9882
|
className: "chatllm-settings-overlay",
|
|
@@ -9121,7 +9890,7 @@ var SettingsModal = ({
|
|
|
9121
9890
|
zIndex: 1e3
|
|
9122
9891
|
},
|
|
9123
9892
|
onClick: onClose,
|
|
9124
|
-
children: /* @__PURE__ */ (0,
|
|
9893
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9125
9894
|
"div",
|
|
9126
9895
|
{
|
|
9127
9896
|
className: "chatllm-settings-modal",
|
|
@@ -9139,7 +9908,7 @@ var SettingsModal = ({
|
|
|
9139
9908
|
},
|
|
9140
9909
|
onClick: (e) => e.stopPropagation(),
|
|
9141
9910
|
children: [
|
|
9142
|
-
/* @__PURE__ */ (0,
|
|
9911
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9143
9912
|
"div",
|
|
9144
9913
|
{
|
|
9145
9914
|
style: {
|
|
@@ -9150,7 +9919,7 @@ var SettingsModal = ({
|
|
|
9150
9919
|
flexDirection: "column"
|
|
9151
9920
|
},
|
|
9152
9921
|
children: [
|
|
9153
|
-
/* @__PURE__ */ (0,
|
|
9922
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { padding: "16px", borderBottom: "1px solid var(--chatllm-border, #e5e7eb)" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9154
9923
|
"button",
|
|
9155
9924
|
{
|
|
9156
9925
|
onClick: onClose,
|
|
@@ -9164,11 +9933,11 @@ var SettingsModal = ({
|
|
|
9164
9933
|
alignItems: "center",
|
|
9165
9934
|
justifyContent: "center"
|
|
9166
9935
|
},
|
|
9167
|
-
children: /* @__PURE__ */ (0,
|
|
9936
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #6b7280)" })
|
|
9168
9937
|
}
|
|
9169
9938
|
) }),
|
|
9170
|
-
/* @__PURE__ */ (0,
|
|
9171
|
-
/* @__PURE__ */ (0,
|
|
9939
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("nav", { style: { flex: 1, padding: "8px" }, children: [
|
|
9940
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9172
9941
|
TabButton,
|
|
9173
9942
|
{
|
|
9174
9943
|
active: activeTab === "general",
|
|
@@ -9177,7 +9946,7 @@ var SettingsModal = ({
|
|
|
9177
9946
|
label: "\uC77C\uBC18"
|
|
9178
9947
|
}
|
|
9179
9948
|
),
|
|
9180
|
-
/* @__PURE__ */ (0,
|
|
9949
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9181
9950
|
TabButton,
|
|
9182
9951
|
{
|
|
9183
9952
|
active: activeTab === "personalization",
|
|
@@ -9186,7 +9955,7 @@ var SettingsModal = ({
|
|
|
9186
9955
|
label: "\uAC1C\uC778 \uB9DE\uCDA4 \uC124\uC815"
|
|
9187
9956
|
}
|
|
9188
9957
|
),
|
|
9189
|
-
showMemoryTab && /* @__PURE__ */ (0,
|
|
9958
|
+
showMemoryTab && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9190
9959
|
TabButton,
|
|
9191
9960
|
{
|
|
9192
9961
|
active: activeTab === "memory",
|
|
@@ -9195,7 +9964,7 @@ var SettingsModal = ({
|
|
|
9195
9964
|
label: "AI \uBA54\uBAA8\uB9AC"
|
|
9196
9965
|
}
|
|
9197
9966
|
),
|
|
9198
|
-
showMemoryTab && enableProjects && /* @__PURE__ */ (0,
|
|
9967
|
+
showMemoryTab && enableProjects && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9199
9968
|
TabButton,
|
|
9200
9969
|
{
|
|
9201
9970
|
active: activeTab === "project-memory",
|
|
@@ -9204,7 +9973,7 @@ var SettingsModal = ({
|
|
|
9204
9973
|
label: "\uD504\uB85C\uC81D\uD2B8 \uBA54\uBAA8\uB9AC"
|
|
9205
9974
|
}
|
|
9206
9975
|
),
|
|
9207
|
-
/* @__PURE__ */ (0,
|
|
9976
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9208
9977
|
TabButton,
|
|
9209
9978
|
{
|
|
9210
9979
|
active: activeTab === "data",
|
|
@@ -9217,24 +9986,24 @@ var SettingsModal = ({
|
|
|
9217
9986
|
]
|
|
9218
9987
|
}
|
|
9219
9988
|
),
|
|
9220
|
-
/* @__PURE__ */ (0,
|
|
9221
|
-
activeTab === "general" && /* @__PURE__ */ (0,
|
|
9222
|
-
/* @__PURE__ */ (0,
|
|
9223
|
-
/* @__PURE__ */ (0,
|
|
9989
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { flex: 1, overflow: "auto", padding: "24px" }, children: [
|
|
9990
|
+
activeTab === "general" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
9991
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uC77C\uBC18" }),
|
|
9992
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uC5B8\uC5B4", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9224
9993
|
"select",
|
|
9225
9994
|
{
|
|
9226
9995
|
value: personalization.language,
|
|
9227
9996
|
onChange: (e) => onPersonalizationChange({ ...personalization, language: e.target.value }),
|
|
9228
9997
|
style: selectStyle,
|
|
9229
9998
|
children: [
|
|
9230
|
-
/* @__PURE__ */ (0,
|
|
9231
|
-
/* @__PURE__ */ (0,
|
|
9232
|
-
/* @__PURE__ */ (0,
|
|
9233
|
-
/* @__PURE__ */ (0,
|
|
9999
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "auto", children: "\uC790\uB3D9 \uD0D0\uC9C0" }),
|
|
10000
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "ko", children: "\uD55C\uAD6D\uC5B4" }),
|
|
10001
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "en", children: "English" }),
|
|
10002
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "ja", children: "\u65E5\u672C\u8A9E" })
|
|
9234
10003
|
]
|
|
9235
10004
|
}
|
|
9236
10005
|
) }),
|
|
9237
|
-
/* @__PURE__ */ (0,
|
|
10006
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uAE30\uBCF8\uAC12\uC73C\uB85C \uCD08\uAE30\uD654", description: "\uBAA8\uB4E0 \uC124\uC815\uC744 \uCD08\uAE30 \uC0C1\uD0DC\uB85C \uB418\uB3CC\uB9BD\uB2C8\uB2E4", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9238
10007
|
"button",
|
|
9239
10008
|
{
|
|
9240
10009
|
onClick: () => onPersonalizationChange(DEFAULT_PERSONALIZATION2),
|
|
@@ -9242,11 +10011,11 @@ var SettingsModal = ({
|
|
|
9242
10011
|
children: "\uCD08\uAE30\uD654"
|
|
9243
10012
|
}
|
|
9244
10013
|
) }),
|
|
9245
|
-
onApiKeyChange && /* @__PURE__ */ (0,
|
|
9246
|
-
/* @__PURE__ */ (0,
|
|
9247
|
-
/* @__PURE__ */ (0,
|
|
9248
|
-
/* @__PURE__ */ (0,
|
|
9249
|
-
/* @__PURE__ */ (0,
|
|
10014
|
+
onApiKeyChange && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { marginTop: "32px", paddingTop: "24px", borderTop: "1px solid var(--chatllm-border, #e5e7eb)" }, children: [
|
|
10015
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { style: { fontSize: "16px", fontWeight: 500, marginBottom: "16px", color: "var(--chatllm-text, #1f2937)" }, children: "API \uC124\uC815" }),
|
|
10016
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
10017
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { style: { display: "block", fontSize: "14px", marginBottom: "8px", color: "var(--chatllm-text, #374151)" }, children: apiKeyLabel }),
|
|
10018
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9250
10019
|
"input",
|
|
9251
10020
|
{
|
|
9252
10021
|
type: "password",
|
|
@@ -9256,18 +10025,18 @@ var SettingsModal = ({
|
|
|
9256
10025
|
style: inputStyle
|
|
9257
10026
|
}
|
|
9258
10027
|
),
|
|
9259
|
-
/* @__PURE__ */ (0,
|
|
10028
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "4px" }, children: apiKeyDescription })
|
|
9260
10029
|
] })
|
|
9261
10030
|
] })
|
|
9262
10031
|
] }),
|
|
9263
|
-
activeTab === "personalization" && /* @__PURE__ */ (0,
|
|
9264
|
-
/* @__PURE__ */ (0,
|
|
9265
|
-
/* @__PURE__ */ (0,
|
|
9266
|
-
/* @__PURE__ */ (0,
|
|
9267
|
-
/* @__PURE__ */ (0,
|
|
9268
|
-
/* @__PURE__ */ (0,
|
|
9269
|
-
/* @__PURE__ */ (0,
|
|
9270
|
-
/* @__PURE__ */ (0,
|
|
10032
|
+
activeTab === "personalization" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
10033
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uAC1C\uC778 \uB9DE\uCDA4 \uC124\uC815" }),
|
|
10034
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("section", { style: { marginBottom: "32px" }, children: [
|
|
10035
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text-muted, #6b7280)", marginBottom: "16px" }, children: "\uC0AC\uC6A9\uC790 \uD504\uB85C\uD544" }),
|
|
10036
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
|
|
10037
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
10038
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { style: labelStyle, children: "\uB2C9\uB124\uC784" }),
|
|
10039
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9271
10040
|
"input",
|
|
9272
10041
|
{
|
|
9273
10042
|
type: "text",
|
|
@@ -9278,9 +10047,9 @@ var SettingsModal = ({
|
|
|
9278
10047
|
}
|
|
9279
10048
|
)
|
|
9280
10049
|
] }),
|
|
9281
|
-
/* @__PURE__ */ (0,
|
|
9282
|
-
/* @__PURE__ */ (0,
|
|
9283
|
-
/* @__PURE__ */ (0,
|
|
10050
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
10051
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { style: labelStyle, children: "\uC9C1\uC5C5" }),
|
|
10052
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9284
10053
|
"input",
|
|
9285
10054
|
{
|
|
9286
10055
|
type: "text",
|
|
@@ -9291,9 +10060,9 @@ var SettingsModal = ({
|
|
|
9291
10060
|
}
|
|
9292
10061
|
)
|
|
9293
10062
|
] }),
|
|
9294
|
-
/* @__PURE__ */ (0,
|
|
9295
|
-
/* @__PURE__ */ (0,
|
|
9296
|
-
/* @__PURE__ */ (0,
|
|
10063
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
10064
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { style: labelStyle, children: "\uCD94\uAC00 \uC815\uBCF4" }),
|
|
10065
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9297
10066
|
"textarea",
|
|
9298
10067
|
{
|
|
9299
10068
|
value: personalization.userProfile.additionalInfo || "",
|
|
@@ -9306,62 +10075,62 @@ var SettingsModal = ({
|
|
|
9306
10075
|
] })
|
|
9307
10076
|
] })
|
|
9308
10077
|
] }),
|
|
9309
|
-
/* @__PURE__ */ (0,
|
|
9310
|
-
/* @__PURE__ */ (0,
|
|
9311
|
-
/* @__PURE__ */ (0,
|
|
10078
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("section", { children: [
|
|
10079
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text-muted, #6b7280)", marginBottom: "16px" }, children: "\uC751\uB2F5 \uC2A4\uD0C0\uC77C" }),
|
|
10080
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uB530\uB73B\uD568", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9312
10081
|
"select",
|
|
9313
10082
|
{
|
|
9314
10083
|
value: personalization.responseStyle.warmth,
|
|
9315
10084
|
onChange: (e) => updateResponseStyle("warmth", e.target.value),
|
|
9316
10085
|
style: selectStyle,
|
|
9317
10086
|
children: [
|
|
9318
|
-
/* @__PURE__ */ (0,
|
|
9319
|
-
/* @__PURE__ */ (0,
|
|
9320
|
-
/* @__PURE__ */ (0,
|
|
10087
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "high", children: "\uB192\uC74C - \uCE5C\uADFC\uD558\uACE0 \uB530\uB73B\uD558\uAC8C" }),
|
|
10088
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
|
|
10089
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "low", children: "\uB0AE\uC74C - \uAC04\uACB0\uD558\uACE0 \uC0AC\uBB34\uC801\uC73C\uB85C" })
|
|
9321
10090
|
]
|
|
9322
10091
|
}
|
|
9323
10092
|
) }),
|
|
9324
|
-
/* @__PURE__ */ (0,
|
|
10093
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uC5F4\uC815\uC801", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9325
10094
|
"select",
|
|
9326
10095
|
{
|
|
9327
10096
|
value: personalization.responseStyle.enthusiasm,
|
|
9328
10097
|
onChange: (e) => updateResponseStyle("enthusiasm", e.target.value),
|
|
9329
10098
|
style: selectStyle,
|
|
9330
10099
|
children: [
|
|
9331
|
-
/* @__PURE__ */ (0,
|
|
9332
|
-
/* @__PURE__ */ (0,
|
|
9333
|
-
/* @__PURE__ */ (0,
|
|
10100
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "high", children: "\uB192\uC74C - \uC801\uADF9\uC801\uC774\uACE0 \uD65C\uBC1C\uD558\uAC8C" }),
|
|
10101
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
|
|
10102
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "low", children: "\uB0AE\uC74C - \uCC28\uBD84\uD558\uACE0 \uC808\uC81C\uC788\uAC8C" })
|
|
9334
10103
|
]
|
|
9335
10104
|
}
|
|
9336
10105
|
) }),
|
|
9337
|
-
/* @__PURE__ */ (0,
|
|
10106
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uC774\uBAA8\uC9C0 \uC0AC\uC6A9", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9338
10107
|
"select",
|
|
9339
10108
|
{
|
|
9340
10109
|
value: personalization.responseStyle.emojiUsage,
|
|
9341
10110
|
onChange: (e) => updateResponseStyle("emojiUsage", e.target.value),
|
|
9342
10111
|
style: selectStyle,
|
|
9343
10112
|
children: [
|
|
9344
|
-
/* @__PURE__ */ (0,
|
|
9345
|
-
/* @__PURE__ */ (0,
|
|
9346
|
-
/* @__PURE__ */ (0,
|
|
10113
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "high", children: "\uB192\uC74C - \uC790\uC8FC \uC0AC\uC6A9" }),
|
|
10114
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
|
|
10115
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "low", children: "\uB0AE\uC74C - \uAC70\uC758 \uC0AC\uC6A9 \uC548 \uD568" })
|
|
9347
10116
|
]
|
|
9348
10117
|
}
|
|
9349
10118
|
) }),
|
|
9350
|
-
/* @__PURE__ */ (0,
|
|
10119
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uC751\uB2F5 \uAE38\uC774", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9351
10120
|
"select",
|
|
9352
10121
|
{
|
|
9353
10122
|
value: personalization.responseStyle.verbosity,
|
|
9354
10123
|
onChange: (e) => updateResponseStyle("verbosity", e.target.value),
|
|
9355
10124
|
style: selectStyle,
|
|
9356
10125
|
children: [
|
|
9357
|
-
/* @__PURE__ */ (0,
|
|
9358
|
-
/* @__PURE__ */ (0,
|
|
9359
|
-
/* @__PURE__ */ (0,
|
|
10126
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "detailed", children: "\uC0C1\uC138 - \uC790\uC138\uD558\uAC8C \uC124\uBA85" }),
|
|
10127
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "balanced", children: "\uAE30\uBCF8\uAC12" }),
|
|
10128
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("option", { value: "concise", children: "\uAC04\uACB0 - \uD575\uC2EC\uB9CC \uC694\uC57D" })
|
|
9360
10129
|
]
|
|
9361
10130
|
}
|
|
9362
10131
|
) })
|
|
9363
10132
|
] }),
|
|
9364
|
-
onSave && /* @__PURE__ */ (0,
|
|
10133
|
+
onSave && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { marginTop: "24px", display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9365
10134
|
"button",
|
|
9366
10135
|
{
|
|
9367
10136
|
onClick: onSave,
|
|
@@ -9382,7 +10151,7 @@ var SettingsModal = ({
|
|
|
9382
10151
|
}
|
|
9383
10152
|
) })
|
|
9384
10153
|
] }),
|
|
9385
|
-
activeTab === "memory" && showMemoryTab && /* @__PURE__ */ (0,
|
|
10154
|
+
activeTab === "memory" && showMemoryTab && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9386
10155
|
MemoryTabContent,
|
|
9387
10156
|
{
|
|
9388
10157
|
items: memoryItems,
|
|
@@ -9391,7 +10160,7 @@ var SettingsModal = ({
|
|
|
9391
10160
|
onClearAll: onClearMemory
|
|
9392
10161
|
}
|
|
9393
10162
|
),
|
|
9394
|
-
activeTab === "project-memory" && showMemoryTab && enableProjects && /* @__PURE__ */ (0,
|
|
10163
|
+
activeTab === "project-memory" && showMemoryTab && enableProjects && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9395
10164
|
MemoryTabContent,
|
|
9396
10165
|
{
|
|
9397
10166
|
items: projectMemoryItems,
|
|
@@ -9402,9 +10171,9 @@ var SettingsModal = ({
|
|
|
9402
10171
|
emptyDescription: "\uB300\uD654\uAC00 \uC9C4\uD589\uB418\uBA74 AI\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB9E5\uB77D\uC744 \uC790\uB3D9\uC73C\uB85C \uD559\uC2B5\uD569\uB2C8\uB2E4"
|
|
9403
10172
|
}
|
|
9404
10173
|
),
|
|
9405
|
-
activeTab === "data" && /* @__PURE__ */ (0,
|
|
9406
|
-
/* @__PURE__ */ (0,
|
|
9407
|
-
/* @__PURE__ */ (0,
|
|
10174
|
+
activeTab === "data" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
10175
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uB370\uC774\uD130 \uC81C\uC5B4" }),
|
|
10176
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uBA54\uBAA8\uB9AC \uC0AC\uC6A9", description: "\uB300\uD654 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAE30\uC5B5\uD569\uB2C8\uB2E4", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9408
10177
|
"button",
|
|
9409
10178
|
{
|
|
9410
10179
|
onClick: () => onPersonalizationChange({ ...personalization, useMemory: !personalization.useMemory }),
|
|
@@ -9418,7 +10187,7 @@ var SettingsModal = ({
|
|
|
9418
10187
|
position: "relative",
|
|
9419
10188
|
transition: "background-color 0.2s"
|
|
9420
10189
|
},
|
|
9421
|
-
children: /* @__PURE__ */ (0,
|
|
10190
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9422
10191
|
"div",
|
|
9423
10192
|
{
|
|
9424
10193
|
style: {
|
|
@@ -9436,7 +10205,7 @@ var SettingsModal = ({
|
|
|
9436
10205
|
)
|
|
9437
10206
|
}
|
|
9438
10207
|
) }),
|
|
9439
|
-
onClearAllData && /* @__PURE__ */ (0,
|
|
10208
|
+
onClearAllData && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uB300\uD654 \uAE30\uB85D \uC0AD\uC81C", description: "\uBAA8\uB4E0 \uB300\uD654 \uAE30\uB85D\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9440
10209
|
"button",
|
|
9441
10210
|
{
|
|
9442
10211
|
onClick: () => {
|
|
@@ -9456,7 +10225,7 @@ var SettingsModal = ({
|
|
|
9456
10225
|
}
|
|
9457
10226
|
);
|
|
9458
10227
|
};
|
|
9459
|
-
var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ (0,
|
|
10228
|
+
var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9460
10229
|
"button",
|
|
9461
10230
|
{
|
|
9462
10231
|
onClick,
|
|
@@ -9477,12 +10246,12 @@ var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ (0, import
|
|
|
9477
10246
|
marginBottom: "4px"
|
|
9478
10247
|
},
|
|
9479
10248
|
children: [
|
|
9480
|
-
/* @__PURE__ */ (0,
|
|
10249
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSvg, { name: icon, size: 20 }),
|
|
9481
10250
|
label
|
|
9482
10251
|
]
|
|
9483
10252
|
}
|
|
9484
10253
|
);
|
|
9485
|
-
var SettingRow = ({ label, description, children }) => /* @__PURE__ */ (0,
|
|
10254
|
+
var SettingRow = ({ label, description, children }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9486
10255
|
"div",
|
|
9487
10256
|
{
|
|
9488
10257
|
style: {
|
|
@@ -9493,9 +10262,9 @@ var SettingRow = ({ label, description, children }) => /* @__PURE__ */ (0, impor
|
|
|
9493
10262
|
borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)"
|
|
9494
10263
|
},
|
|
9495
10264
|
children: [
|
|
9496
|
-
/* @__PURE__ */ (0,
|
|
9497
|
-
/* @__PURE__ */ (0,
|
|
9498
|
-
description && /* @__PURE__ */ (0,
|
|
10265
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
10266
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontSize: "14px", color: "var(--chatllm-text, #374151)" }, children: label }),
|
|
10267
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "2px" }, children: description })
|
|
9499
10268
|
] }),
|
|
9500
10269
|
children
|
|
9501
10270
|
]
|
|
@@ -9555,8 +10324,8 @@ var memoryCategoryColors = {
|
|
|
9555
10324
|
preference: "#8b5cf6"
|
|
9556
10325
|
};
|
|
9557
10326
|
var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "AI \uBA54\uBAA8\uB9AC", emptyMessage = "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4", emptyDescription = "\uB300\uD654\uAC00 \uC9C4\uD589\uB418\uBA74 AI\uAC00 \uC790\uB3D9\uC73C\uB85C \uC815\uBCF4\uB97C \uD559\uC2B5\uD569\uB2C8\uB2E4" }) => {
|
|
9558
|
-
const [activeFilter, setActiveFilter] = (0,
|
|
9559
|
-
const [expandedId, setExpandedId] = (0,
|
|
10327
|
+
const [activeFilter, setActiveFilter] = (0, import_react19.useState)("all");
|
|
10328
|
+
const [expandedId, setExpandedId] = (0, import_react19.useState)(null);
|
|
9560
10329
|
const filteredItems = activeFilter === "all" ? items : items.filter((item) => item.category === activeFilter);
|
|
9561
10330
|
const formatDate = (timestamp) => {
|
|
9562
10331
|
const date = new Date(timestamp);
|
|
@@ -9567,15 +10336,15 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9567
10336
|
minute: "2-digit"
|
|
9568
10337
|
});
|
|
9569
10338
|
};
|
|
9570
|
-
return /* @__PURE__ */ (0,
|
|
9571
|
-
/* @__PURE__ */ (0,
|
|
9572
|
-
/* @__PURE__ */ (0,
|
|
9573
|
-
/* @__PURE__ */ (0,
|
|
10339
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
10340
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "24px" }, children: [
|
|
10341
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h2", { style: { fontSize: "20px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)", margin: 0 }, children: title }),
|
|
10342
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { style: { fontSize: "13px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
|
|
9574
10343
|
items.length,
|
|
9575
10344
|
"\uAC1C \uD56D\uBAA9"
|
|
9576
10345
|
] })
|
|
9577
10346
|
] }),
|
|
9578
|
-
/* @__PURE__ */ (0,
|
|
10347
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { display: "flex", gap: "6px", marginBottom: "20px", flexWrap: "wrap" }, children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9579
10348
|
"button",
|
|
9580
10349
|
{
|
|
9581
10350
|
onClick: () => setActiveFilter(tab),
|
|
@@ -9593,7 +10362,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9593
10362
|
},
|
|
9594
10363
|
tab
|
|
9595
10364
|
)) }),
|
|
9596
|
-
contextSummary && activeFilter === "all" && /* @__PURE__ */ (0,
|
|
10365
|
+
contextSummary && activeFilter === "all" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9597
10366
|
"div",
|
|
9598
10367
|
{
|
|
9599
10368
|
style: {
|
|
@@ -9604,19 +10373,19 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9604
10373
|
borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
|
|
9605
10374
|
},
|
|
9606
10375
|
children: [
|
|
9607
|
-
/* @__PURE__ */ (0,
|
|
9608
|
-
/* @__PURE__ */ (0,
|
|
9609
|
-
/* @__PURE__ */ (0,
|
|
10376
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "6px", marginBottom: "8px" }, children: [
|
|
10377
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
|
|
10378
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
|
|
9610
10379
|
] }),
|
|
9611
|
-
/* @__PURE__ */ (0,
|
|
10380
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { fontSize: "13px", lineHeight: "1.6", color: "var(--chatllm-text, #374151)", margin: 0 }, children: contextSummary })
|
|
9612
10381
|
]
|
|
9613
10382
|
}
|
|
9614
10383
|
),
|
|
9615
|
-
filteredItems.length === 0 ? /* @__PURE__ */ (0,
|
|
9616
|
-
/* @__PURE__ */ (0,
|
|
9617
|
-
/* @__PURE__ */ (0,
|
|
9618
|
-
/* @__PURE__ */ (0,
|
|
9619
|
-
] }) : /* @__PURE__ */ (0,
|
|
10384
|
+
filteredItems.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { padding: "40px 16px", textAlign: "center" }, children: [
|
|
10385
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSvg, { name: "robot-line", size: 40, color: "var(--chatllm-text-muted, #d1d5db)" }),
|
|
10386
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { fontSize: "14px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "12px" }, children: emptyMessage }),
|
|
10387
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #d1d5db)", marginTop: "4px" }, children: emptyDescription })
|
|
10388
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9620
10389
|
"div",
|
|
9621
10390
|
{
|
|
9622
10391
|
style: {
|
|
@@ -9629,10 +10398,10 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9629
10398
|
},
|
|
9630
10399
|
onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
|
|
9631
10400
|
children: [
|
|
9632
|
-
/* @__PURE__ */ (0,
|
|
9633
|
-
/* @__PURE__ */ (0,
|
|
9634
|
-
/* @__PURE__ */ (0,
|
|
9635
|
-
item.category && /* @__PURE__ */ (0,
|
|
10401
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
|
|
10402
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
|
|
10403
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
|
|
10404
|
+
item.category && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9636
10405
|
"span",
|
|
9637
10406
|
{
|
|
9638
10407
|
style: {
|
|
@@ -9646,12 +10415,12 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9646
10415
|
children: memoryCategoryLabels[item.category]
|
|
9647
10416
|
}
|
|
9648
10417
|
),
|
|
9649
|
-
/* @__PURE__ */ (0,
|
|
10418
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
|
|
9650
10419
|
] }),
|
|
9651
|
-
/* @__PURE__ */ (0,
|
|
10420
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { fontSize: "13px", fontWeight: 500, color: "var(--chatllm-text, #1f2937)" }, children: item.key })
|
|
9652
10421
|
] }),
|
|
9653
|
-
/* @__PURE__ */ (0,
|
|
9654
|
-
onDelete && /* @__PURE__ */ (0,
|
|
10422
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
|
|
10423
|
+
onDelete && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9655
10424
|
"button",
|
|
9656
10425
|
{
|
|
9657
10426
|
onClick: (e) => {
|
|
@@ -9667,10 +10436,10 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9667
10436
|
opacity: 0.5
|
|
9668
10437
|
},
|
|
9669
10438
|
"aria-label": "\uBA54\uBAA8\uB9AC \uC0AD\uC81C",
|
|
9670
|
-
children: /* @__PURE__ */ (0,
|
|
10439
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
|
|
9671
10440
|
}
|
|
9672
10441
|
),
|
|
9673
|
-
/* @__PURE__ */ (0,
|
|
10442
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9674
10443
|
IconSvg,
|
|
9675
10444
|
{
|
|
9676
10445
|
name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
|
|
@@ -9680,7 +10449,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9680
10449
|
)
|
|
9681
10450
|
] })
|
|
9682
10451
|
] }),
|
|
9683
|
-
expandedId === item.id && /* @__PURE__ */ (0,
|
|
10452
|
+
expandedId === item.id && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9684
10453
|
"div",
|
|
9685
10454
|
{
|
|
9686
10455
|
style: {
|
|
@@ -9688,7 +10457,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9688
10457
|
paddingTop: "12px",
|
|
9689
10458
|
borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
|
|
9690
10459
|
},
|
|
9691
|
-
children: /* @__PURE__ */ (0,
|
|
10460
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9692
10461
|
"p",
|
|
9693
10462
|
{
|
|
9694
10463
|
style: {
|
|
@@ -9707,7 +10476,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9707
10476
|
},
|
|
9708
10477
|
item.id
|
|
9709
10478
|
)) }),
|
|
9710
|
-
onClearAll && items.length > 0 && /* @__PURE__ */ (0,
|
|
10479
|
+
onClearAll && items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { marginTop: "24px", paddingTop: "16px", borderTop: "1px solid var(--chatllm-border, #e5e7eb)" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9711
10480
|
"button",
|
|
9712
10481
|
{
|
|
9713
10482
|
onClick: () => {
|
|
@@ -9723,8 +10492,8 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9723
10492
|
};
|
|
9724
10493
|
|
|
9725
10494
|
// src/react/components/ProjectSettingsModal.tsx
|
|
9726
|
-
var
|
|
9727
|
-
var
|
|
10495
|
+
var import_react20 = require("react");
|
|
10496
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
9728
10497
|
var COLOR_PRESETS = [
|
|
9729
10498
|
"#3584FA",
|
|
9730
10499
|
"#7c3aed",
|
|
@@ -9744,12 +10513,12 @@ var ProjectSettingsModal = ({
|
|
|
9744
10513
|
onDeleteFile,
|
|
9745
10514
|
onDeleteProject
|
|
9746
10515
|
}) => {
|
|
9747
|
-
const [activeTab, setActiveTab] = (0,
|
|
9748
|
-
const [title, setTitle] = (0,
|
|
9749
|
-
const [description, setDescription] = (0,
|
|
9750
|
-
const [instructions, setInstructions] = (0,
|
|
9751
|
-
const [color, setColor] = (0,
|
|
9752
|
-
(0,
|
|
10516
|
+
const [activeTab, setActiveTab] = (0, import_react20.useState)("general");
|
|
10517
|
+
const [title, setTitle] = (0, import_react20.useState)("");
|
|
10518
|
+
const [description, setDescription] = (0, import_react20.useState)("");
|
|
10519
|
+
const [instructions, setInstructions] = (0, import_react20.useState)("");
|
|
10520
|
+
const [color, setColor] = (0, import_react20.useState)("#3584FA");
|
|
10521
|
+
(0, import_react20.useEffect)(() => {
|
|
9753
10522
|
if (project) {
|
|
9754
10523
|
setTitle(project.title);
|
|
9755
10524
|
setDescription(project.description || "");
|
|
@@ -9805,7 +10574,7 @@ var ProjectSettingsModal = ({
|
|
|
9805
10574
|
cursor: "pointer",
|
|
9806
10575
|
fontFamily: "inherit"
|
|
9807
10576
|
});
|
|
9808
|
-
return /* @__PURE__ */ (0,
|
|
10577
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
9809
10578
|
"div",
|
|
9810
10579
|
{
|
|
9811
10580
|
style: {
|
|
@@ -9820,7 +10589,7 @@ var ProjectSettingsModal = ({
|
|
|
9820
10589
|
onClick: (e) => {
|
|
9821
10590
|
if (e.target === e.currentTarget) onClose();
|
|
9822
10591
|
},
|
|
9823
|
-
children: /* @__PURE__ */ (0,
|
|
10592
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
9824
10593
|
"div",
|
|
9825
10594
|
{
|
|
9826
10595
|
style: {
|
|
@@ -9834,7 +10603,7 @@ var ProjectSettingsModal = ({
|
|
|
9834
10603
|
overflow: "hidden"
|
|
9835
10604
|
},
|
|
9836
10605
|
children: [
|
|
9837
|
-
/* @__PURE__ */ (0,
|
|
10606
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
9838
10607
|
"div",
|
|
9839
10608
|
{
|
|
9840
10609
|
style: {
|
|
@@ -9844,8 +10613,8 @@ var ProjectSettingsModal = ({
|
|
|
9844
10613
|
padding: "20px 24px 0"
|
|
9845
10614
|
},
|
|
9846
10615
|
children: [
|
|
9847
|
-
/* @__PURE__ */ (0,
|
|
9848
|
-
/* @__PURE__ */ (0,
|
|
10616
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h2", { style: { fontSize: "16px", fontWeight: 600, margin: 0, color: "var(--chatllm-text, #1a1a1a)" }, children: "\uD504\uB85C\uC81D\uD2B8 \uC124\uC815" }),
|
|
10617
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
9849
10618
|
"button",
|
|
9850
10619
|
{
|
|
9851
10620
|
onClick: onClose,
|
|
@@ -9858,13 +10627,13 @@ var ProjectSettingsModal = ({
|
|
|
9858
10627
|
alignItems: "center"
|
|
9859
10628
|
},
|
|
9860
10629
|
"aria-label": "\uB2EB\uAE30",
|
|
9861
|
-
children: /* @__PURE__ */ (0,
|
|
10630
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #999)" })
|
|
9862
10631
|
}
|
|
9863
10632
|
)
|
|
9864
10633
|
]
|
|
9865
10634
|
}
|
|
9866
10635
|
),
|
|
9867
|
-
/* @__PURE__ */ (0,
|
|
10636
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
9868
10637
|
"div",
|
|
9869
10638
|
{
|
|
9870
10639
|
style: {
|
|
@@ -9874,9 +10643,9 @@ var ProjectSettingsModal = ({
|
|
|
9874
10643
|
borderBottom: "1px solid var(--chatllm-border, #e0e0e0)"
|
|
9875
10644
|
},
|
|
9876
10645
|
children: [
|
|
9877
|
-
/* @__PURE__ */ (0,
|
|
9878
|
-
/* @__PURE__ */ (0,
|
|
9879
|
-
/* @__PURE__ */ (0,
|
|
10646
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("button", { onClick: () => setActiveTab("general"), style: tabStyle("general"), children: "\uC77C\uBC18" }),
|
|
10647
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("button", { onClick: () => setActiveTab("instructions"), style: tabStyle("instructions"), children: "\uC9C0\uCE68" }),
|
|
10648
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("button", { onClick: () => setActiveTab("files"), style: tabStyle("files"), children: [
|
|
9880
10649
|
"\uD30C\uC77C (",
|
|
9881
10650
|
project.files.length,
|
|
9882
10651
|
")"
|
|
@@ -9884,11 +10653,11 @@ var ProjectSettingsModal = ({
|
|
|
9884
10653
|
]
|
|
9885
10654
|
}
|
|
9886
10655
|
),
|
|
9887
|
-
/* @__PURE__ */ (0,
|
|
9888
|
-
activeTab === "general" && /* @__PURE__ */ (0,
|
|
9889
|
-
/* @__PURE__ */ (0,
|
|
9890
|
-
/* @__PURE__ */ (0,
|
|
9891
|
-
/* @__PURE__ */ (0,
|
|
10656
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { padding: "24px", overflowY: "auto", flex: 1 }, children: [
|
|
10657
|
+
activeTab === "general" && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [
|
|
10658
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { children: [
|
|
10659
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uD504\uB85C\uC81D\uD2B8 \uC774\uB984" }),
|
|
10660
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
9892
10661
|
"input",
|
|
9893
10662
|
{
|
|
9894
10663
|
type: "text",
|
|
@@ -9910,9 +10679,9 @@ var ProjectSettingsModal = ({
|
|
|
9910
10679
|
}
|
|
9911
10680
|
)
|
|
9912
10681
|
] }),
|
|
9913
|
-
/* @__PURE__ */ (0,
|
|
9914
|
-
/* @__PURE__ */ (0,
|
|
9915
|
-
/* @__PURE__ */ (0,
|
|
10682
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { children: [
|
|
10683
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uC124\uBA85" }),
|
|
10684
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
9916
10685
|
"textarea",
|
|
9917
10686
|
{
|
|
9918
10687
|
value: description,
|
|
@@ -9933,9 +10702,9 @@ var ProjectSettingsModal = ({
|
|
|
9933
10702
|
}
|
|
9934
10703
|
)
|
|
9935
10704
|
] }),
|
|
9936
|
-
/* @__PURE__ */ (0,
|
|
9937
|
-
/* @__PURE__ */ (0,
|
|
9938
|
-
/* @__PURE__ */ (0,
|
|
10705
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { children: [
|
|
10706
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uC0C9\uC0C1" }),
|
|
10707
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { style: { display: "flex", gap: "8px", flexWrap: "wrap" }, children: COLOR_PRESETS.map((c) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
9939
10708
|
"button",
|
|
9940
10709
|
{
|
|
9941
10710
|
onClick: () => setColor(c),
|
|
@@ -9953,8 +10722,8 @@ var ProjectSettingsModal = ({
|
|
|
9953
10722
|
c
|
|
9954
10723
|
)) })
|
|
9955
10724
|
] }),
|
|
9956
|
-
/* @__PURE__ */ (0,
|
|
9957
|
-
!isDefaultProject && onDeleteProject && /* @__PURE__ */ (0,
|
|
10725
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", gap: "8px", justifyContent: "flex-end", marginTop: "8px" }, children: [
|
|
10726
|
+
!isDefaultProject && onDeleteProject && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
9958
10727
|
"button",
|
|
9959
10728
|
{
|
|
9960
10729
|
onClick: () => {
|
|
@@ -9977,7 +10746,7 @@ var ProjectSettingsModal = ({
|
|
|
9977
10746
|
children: "\uD504\uB85C\uC81D\uD2B8 \uC0AD\uC81C"
|
|
9978
10747
|
}
|
|
9979
10748
|
),
|
|
9980
|
-
/* @__PURE__ */ (0,
|
|
10749
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
9981
10750
|
"button",
|
|
9982
10751
|
{
|
|
9983
10752
|
onClick: handleSaveGeneral,
|
|
@@ -9997,9 +10766,9 @@ var ProjectSettingsModal = ({
|
|
|
9997
10766
|
)
|
|
9998
10767
|
] })
|
|
9999
10768
|
] }),
|
|
10000
|
-
activeTab === "instructions" && /* @__PURE__ */ (0,
|
|
10001
|
-
/* @__PURE__ */ (0,
|
|
10002
|
-
/* @__PURE__ */ (0,
|
|
10769
|
+
activeTab === "instructions" && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
|
|
10770
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { style: { fontSize: "13px", color: "var(--chatllm-text-muted, #999)", margin: 0 }, children: "\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uBAA8\uB4E0 \uB300\uD654\uC5D0\uC11C AI\uAC00 \uB530\uB77C\uC57C \uD560 \uC9C0\uCE68\uC744 \uC785\uB825\uD558\uC138\uC694." }),
|
|
10771
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10003
10772
|
"textarea",
|
|
10004
10773
|
{
|
|
10005
10774
|
value: instructions,
|
|
@@ -10020,7 +10789,7 @@ var ProjectSettingsModal = ({
|
|
|
10020
10789
|
}
|
|
10021
10790
|
}
|
|
10022
10791
|
),
|
|
10023
|
-
/* @__PURE__ */ (0,
|
|
10792
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { style: { display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10024
10793
|
"button",
|
|
10025
10794
|
{
|
|
10026
10795
|
onClick: handleSaveInstructions,
|
|
@@ -10039,10 +10808,10 @@ var ProjectSettingsModal = ({
|
|
|
10039
10808
|
}
|
|
10040
10809
|
) })
|
|
10041
10810
|
] }),
|
|
10042
|
-
activeTab === "files" && /* @__PURE__ */ (0,
|
|
10043
|
-
/* @__PURE__ */ (0,
|
|
10044
|
-
/* @__PURE__ */ (0,
|
|
10045
|
-
/* @__PURE__ */ (0,
|
|
10811
|
+
activeTab === "files" && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
|
|
10812
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
|
|
10813
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { style: { fontSize: "13px", color: "var(--chatllm-text-muted, #999)", margin: 0 }, children: "\uD504\uB85C\uC81D\uD2B8 \uCEE8\uD14D\uC2A4\uD2B8\uB85C \uC0AC\uC6A9\uD560 \uD30C\uC77C\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4." }),
|
|
10814
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
10046
10815
|
"button",
|
|
10047
10816
|
{
|
|
10048
10817
|
onClick: handleFileUpload,
|
|
@@ -10060,13 +10829,13 @@ var ProjectSettingsModal = ({
|
|
|
10060
10829
|
color: "var(--chatllm-text, #1a1a1a)"
|
|
10061
10830
|
},
|
|
10062
10831
|
children: [
|
|
10063
|
-
/* @__PURE__ */ (0,
|
|
10832
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconSvg, { name: "upload-line", size: 14 }),
|
|
10064
10833
|
"\uC5C5\uB85C\uB4DC"
|
|
10065
10834
|
]
|
|
10066
10835
|
}
|
|
10067
10836
|
)
|
|
10068
10837
|
] }),
|
|
10069
|
-
project.files.length === 0 ? /* @__PURE__ */ (0,
|
|
10838
|
+
project.files.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10070
10839
|
"div",
|
|
10071
10840
|
{
|
|
10072
10841
|
style: {
|
|
@@ -10079,7 +10848,7 @@ var ProjectSettingsModal = ({
|
|
|
10079
10848
|
},
|
|
10080
10849
|
children: "\uC544\uC9C1 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4"
|
|
10081
10850
|
}
|
|
10082
|
-
) : /* @__PURE__ */ (0,
|
|
10851
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: project.files.map((file) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
10083
10852
|
"div",
|
|
10084
10853
|
{
|
|
10085
10854
|
style: {
|
|
@@ -10091,10 +10860,10 @@ var ProjectSettingsModal = ({
|
|
|
10091
10860
|
borderRadius: "6px"
|
|
10092
10861
|
},
|
|
10093
10862
|
children: [
|
|
10094
|
-
/* @__PURE__ */ (0,
|
|
10095
|
-
/* @__PURE__ */ (0,
|
|
10096
|
-
/* @__PURE__ */ (0,
|
|
10097
|
-
/* @__PURE__ */ (0,
|
|
10863
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "10px", overflow: "hidden" }, children: [
|
|
10864
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconSvg, { name: getFileIcon2(file.type), size: 18, color: "var(--chatllm-text-muted, #999)" }),
|
|
10865
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { overflow: "hidden" }, children: [
|
|
10866
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10098
10867
|
"div",
|
|
10099
10868
|
{
|
|
10100
10869
|
style: {
|
|
@@ -10108,13 +10877,13 @@ var ProjectSettingsModal = ({
|
|
|
10108
10877
|
children: file.name
|
|
10109
10878
|
}
|
|
10110
10879
|
),
|
|
10111
|
-
/* @__PURE__ */ (0,
|
|
10880
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #999)" }, children: [
|
|
10112
10881
|
file.type,
|
|
10113
10882
|
formatSize(file.size) ? ` \xB7 ${formatSize(file.size)}` : ""
|
|
10114
10883
|
] })
|
|
10115
10884
|
] })
|
|
10116
10885
|
] }),
|
|
10117
|
-
/* @__PURE__ */ (0,
|
|
10886
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10118
10887
|
"button",
|
|
10119
10888
|
{
|
|
10120
10889
|
onClick: () => onDeleteFile(project.id, file.id),
|
|
@@ -10135,7 +10904,7 @@ var ProjectSettingsModal = ({
|
|
|
10135
10904
|
e.currentTarget.style.opacity = "0.5";
|
|
10136
10905
|
},
|
|
10137
10906
|
"aria-label": `${file.name} \uC0AD\uC81C`,
|
|
10138
|
-
children: /* @__PURE__ */ (0,
|
|
10907
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconSvg, { name: "delete-bin-line", size: 16, color: "#dc2626" })
|
|
10139
10908
|
}
|
|
10140
10909
|
)
|
|
10141
10910
|
]
|
|
@@ -10152,14 +10921,14 @@ var ProjectSettingsModal = ({
|
|
|
10152
10921
|
};
|
|
10153
10922
|
|
|
10154
10923
|
// src/react/components/DisclaimerModal.tsx
|
|
10155
|
-
var
|
|
10924
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
10156
10925
|
var highlightStyle = {
|
|
10157
10926
|
color: "var(--chatllm-text, #1e293b)",
|
|
10158
10927
|
fontWeight: 600
|
|
10159
10928
|
};
|
|
10160
10929
|
var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
10161
10930
|
if (!isOpen) return null;
|
|
10162
|
-
return /* @__PURE__ */ (0,
|
|
10931
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10163
10932
|
"div",
|
|
10164
10933
|
{
|
|
10165
10934
|
className: "chatllm-disclaimer-overlay",
|
|
@@ -10173,7 +10942,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10173
10942
|
zIndex: 1e3
|
|
10174
10943
|
},
|
|
10175
10944
|
onClick: onClose,
|
|
10176
|
-
children: /* @__PURE__ */ (0,
|
|
10945
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
10177
10946
|
"div",
|
|
10178
10947
|
{
|
|
10179
10948
|
className: "chatllm-disclaimer-modal",
|
|
@@ -10191,7 +10960,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10191
10960
|
},
|
|
10192
10961
|
onClick: (e) => e.stopPropagation(),
|
|
10193
10962
|
children: [
|
|
10194
|
-
/* @__PURE__ */ (0,
|
|
10963
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
10195
10964
|
"div",
|
|
10196
10965
|
{
|
|
10197
10966
|
style: {
|
|
@@ -10202,9 +10971,9 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10202
10971
|
borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
|
|
10203
10972
|
},
|
|
10204
10973
|
children: [
|
|
10205
|
-
/* @__PURE__ */ (0,
|
|
10206
|
-
/* @__PURE__ */ (0,
|
|
10207
|
-
/* @__PURE__ */ (0,
|
|
10974
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
|
|
10975
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(IconSvg, { name: "error-warning-line", size: 20, color: "var(--chatllm-primary, #3584FA)" }),
|
|
10976
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10208
10977
|
"h2",
|
|
10209
10978
|
{
|
|
10210
10979
|
style: {
|
|
@@ -10217,7 +10986,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10217
10986
|
}
|
|
10218
10987
|
)
|
|
10219
10988
|
] }),
|
|
10220
|
-
/* @__PURE__ */ (0,
|
|
10989
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10221
10990
|
"button",
|
|
10222
10991
|
{
|
|
10223
10992
|
onClick: onClose,
|
|
@@ -10232,13 +11001,13 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10232
11001
|
alignItems: "center",
|
|
10233
11002
|
justifyContent: "center"
|
|
10234
11003
|
},
|
|
10235
|
-
children: /* @__PURE__ */ (0,
|
|
11004
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #64748b)" })
|
|
10236
11005
|
}
|
|
10237
11006
|
)
|
|
10238
11007
|
]
|
|
10239
11008
|
}
|
|
10240
11009
|
),
|
|
10241
|
-
/* @__PURE__ */ (0,
|
|
11010
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
10242
11011
|
"div",
|
|
10243
11012
|
{
|
|
10244
11013
|
className: "chatllm-scrollbar",
|
|
@@ -10250,12 +11019,12 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10250
11019
|
color: "var(--chatllm-text-secondary, #475569)"
|
|
10251
11020
|
},
|
|
10252
11021
|
children: [
|
|
10253
|
-
/* @__PURE__ */ (0,
|
|
11022
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: "0 0 16px" }, children: [
|
|
10254
11023
|
"\uC800\uB294 \uC5EC\uB7EC\uBD84\uC758 \uC9C8\uBB38\uC5D0 ",
|
|
10255
|
-
/* @__PURE__ */ (0,
|
|
11024
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: highlightStyle, children: "\uCD5C\uC120\uC758 \uB2F5\uBCC0\uC744 \uB4DC\uB9AC\uAE30 \uC704\uD574 \uD56D\uC0C1 \uB178\uB825" }),
|
|
10256
11025
|
"\uD558\uACE0 \uC788\uC5B4\uC694. \uD558\uC9C0\uB9CC \uC194\uC9C1\uD558\uAC8C \uB9D0\uC500\uB4DC\uB9AC\uBA74, \uC800\uB3C4 \uB54C\uB54C\uB85C \uC2E4\uC218\uB97C \uD558\uAC70\uB098 \uC815\uD655\uD558\uC9C0 \uC54A\uC740 \uB2F5\uBCC0\uC744 \uB4DC\uB9B4 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
|
|
10257
11026
|
] }),
|
|
10258
|
-
/* @__PURE__ */ (0,
|
|
11027
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
10259
11028
|
"div",
|
|
10260
11029
|
{
|
|
10261
11030
|
style: {
|
|
@@ -10268,33 +11037,33 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10268
11037
|
lineHeight: 1.7
|
|
10269
11038
|
},
|
|
10270
11039
|
children: [
|
|
10271
|
-
/* @__PURE__ */ (0,
|
|
10272
|
-
/* @__PURE__ */ (0,
|
|
10273
|
-
/* @__PURE__ */ (0,
|
|
10274
|
-
/* @__PURE__ */ (0,
|
|
10275
|
-
/* @__PURE__ */ (0,
|
|
11040
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { style: { margin: "0 0 8px", fontWeight: 600, color: "var(--chatllm-text, #1e293b)" }, children: "\uC81C\uAC00 \uC774\uB7F0 \uC2E4\uC218\uB97C \uD560 \uC218 \uC788\uC5B4\uC694" }),
|
|
11041
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("ul", { style: { margin: 0, paddingLeft: "18px", display: "flex", flexDirection: "column", gap: "4px" }, children: [
|
|
11042
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("li", { children: "\uCD5C\uC2E0 \uC815\uBCF4\uB97C \uBC18\uC601\uD558\uC9C0 \uBABB\uD55C \uB2F5\uBCC0\uC744 \uB4DC\uB9AC\uB294 \uACBD\uC6B0" }),
|
|
11043
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("li", { children: "\uADF8\uB7F4\uB4EF\uD558\uAC8C \uB4E4\uB9AC\uC9C0\uB9CC \uC2E4\uC81C\uB85C\uB294 \uC815\uD655\uD558\uC9C0 \uC54A\uC740 \uB0B4\uC6A9" }),
|
|
11044
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("li", { children: "\uC2E4\uC81C\uB85C \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uCD9C\uCC98\uB098 \uC778\uC6A9\uC744 \uB9CC\uB4E4\uC5B4\uB0B4\uB294 \uACBD\uC6B0" })
|
|
10276
11045
|
] })
|
|
10277
11046
|
]
|
|
10278
11047
|
}
|
|
10279
11048
|
),
|
|
10280
|
-
/* @__PURE__ */ (0,
|
|
11049
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: "0 0 16px" }, children: [
|
|
10281
11050
|
"\uC774\uB7F0 \uD604\uC0C1\uC744 ",
|
|
10282
|
-
/* @__PURE__ */ (0,
|
|
11051
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: highlightStyle, children: "'\uD658\uAC01(Hallucination)'" }),
|
|
10283
11052
|
"\uC774\uB77C\uACE0 \uBD80\uB974\uB294\uB370\uC694, \uC544\uC9C1\uC740 \uC800\uC640 \uAC19\uC740 AI\uAC00 \uAC00\uC9C4 \uADFC\uBCF8\uC801\uC778 \uD55C\uACC4\uC608\uC694. \uC81C \uB2F5\uBCC0\uC774 \uC544\uBB34\uB9AC \uC790\uC5F0\uC2A4\uB7EC\uC6CC \uBCF4\uC5EC\uB3C4, ",
|
|
10284
|
-
/* @__PURE__ */ (0,
|
|
11053
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: highlightStyle, children: "\uD55C \uBC88 \uB354 \uD655\uC778" }),
|
|
10285
11054
|
"\uD574 \uC8FC\uC2DC\uBA74 \uAC10\uC0AC\uD558\uACA0\uC2B5\uB2C8\uB2E4."
|
|
10286
11055
|
] }),
|
|
10287
|
-
/* @__PURE__ */ (0,
|
|
10288
|
-
/* @__PURE__ */ (0,
|
|
11056
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: "0 0 16px" }, children: [
|
|
11057
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: highlightStyle, children: "\uC81C \uB2F5\uBCC0\uC740 \uCC38\uACE0 \uC790\uB8CC" }),
|
|
10289
11058
|
"\uB85C \uD65C\uC6A9\uD574 \uC8FC\uC2DC\uACE0, \uC911\uC694\uD55C \uD310\uB2E8\uC744 \uB0B4\uB9AC\uC2E4 \uB54C\uB294 \uAF2D \uCD94\uAC00\uB85C \uD655\uC778\uD574 \uC8FC\uC138\uC694. \uC800\uB3C4 \uB354 \uC815\uD655\uD55C \uB2F5\uBCC0\uC744 \uB4DC\uB9AC\uAE30 \uC704\uD574 \uACC4\uC18D \uBC1C\uC804\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4."
|
|
10290
11059
|
] }),
|
|
10291
|
-
/* @__PURE__ */ (0,
|
|
11060
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: "0 0 16px" }, children: [
|
|
10292
11061
|
"\uC81C\uAC00 \uC6F9 \uAC80\uC0C9 \uACB0\uACFC\uB97C \uC54C\uB824\uB4DC\uB9B4 \uB54C\uB3C4,",
|
|
10293
11062
|
" ",
|
|
10294
|
-
/* @__PURE__ */ (0,
|
|
11063
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: highlightStyle, children: "\uC6D0\uBCF8 \uCD9C\uCC98\uB97C \uC9C1\uC811 \uD655\uC778" }),
|
|
10295
11064
|
"\uD574 \uBCF4\uC2DC\uB294 \uAC78 \uCD94\uCC9C\uB4DC\uB824\uC694. \uC694\uC57D \uACFC\uC815\uC5D0\uC11C \uB193\uCE60 \uC218 \uC788\uB294 \uC911\uC694\uD55C \uB9E5\uB77D\uC774 \uC6D0\uBCF8\uC5D0 \uB2F4\uACA8 \uC788\uC744 \uC218 \uC788\uAC70\uB4E0\uC694."
|
|
10296
11065
|
] }),
|
|
10297
|
-
/* @__PURE__ */ (0,
|
|
11066
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10298
11067
|
"div",
|
|
10299
11068
|
{
|
|
10300
11069
|
style: {
|
|
@@ -10305,10 +11074,10 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10305
11074
|
lineHeight: 1.7,
|
|
10306
11075
|
textAlign: "center"
|
|
10307
11076
|
},
|
|
10308
|
-
children: /* @__PURE__ */ (0,
|
|
11077
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: 0 }, children: [
|
|
10309
11078
|
"\uC800\uC5D0 \uB300\uD55C \uC758\uACAC\uC774\uB098 \uAC1C\uC120 \uC81C\uC548\uC774 \uC788\uC73C\uC2DC\uB2E4\uBA74",
|
|
10310
11079
|
" ",
|
|
10311
|
-
/* @__PURE__ */ (0,
|
|
11080
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10312
11081
|
"a",
|
|
10313
11082
|
{
|
|
10314
11083
|
href: "mailto:info@gendive.ai",
|
|
@@ -10321,7 +11090,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10321
11090
|
}
|
|
10322
11091
|
),
|
|
10323
11092
|
"\uB85C \uC54C\uB824\uC8FC\uC138\uC694.",
|
|
10324
|
-
/* @__PURE__ */ (0,
|
|
11093
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("br", {}),
|
|
10325
11094
|
"\uC5EC\uB7EC\uBD84\uC758 \uD53C\uB4DC\uBC31 \uD558\uB098\uD558\uB098\uAC00 \uC81C\uAC00 \uC131\uC7A5\uD558\uB294 \uB370 \uD070 \uD798\uC774 \uB429\uB2C8\uB2E4."
|
|
10326
11095
|
] })
|
|
10327
11096
|
}
|
|
@@ -10337,7 +11106,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10337
11106
|
};
|
|
10338
11107
|
|
|
10339
11108
|
// src/react/ChatUI.tsx
|
|
10340
|
-
var
|
|
11109
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
10341
11110
|
var DEFAULT_ACTIONS = [];
|
|
10342
11111
|
var DEFAULT_TEMPLATES = [];
|
|
10343
11112
|
var DEFAULT_MODELS = [
|
|
@@ -10380,6 +11149,17 @@ var injectStyles = () => {
|
|
|
10380
11149
|
100% { transform: rotate(360deg); }
|
|
10381
11150
|
}
|
|
10382
11151
|
|
|
11152
|
+
@keyframes chatllm-checklist-pulse {
|
|
11153
|
+
0%, 100% { opacity: 1; }
|
|
11154
|
+
50% { opacity: 0.4; }
|
|
11155
|
+
}
|
|
11156
|
+
|
|
11157
|
+
@keyframes chatllm-checklist-check {
|
|
11158
|
+
0% { transform: scale(0); opacity: 0; }
|
|
11159
|
+
50% { transform: scale(1.2); }
|
|
11160
|
+
100% { transform: scale(1); opacity: 1; }
|
|
11161
|
+
}
|
|
11162
|
+
|
|
10383
11163
|
@keyframes chatllm-welcome-exit {
|
|
10384
11164
|
from { opacity: 1; transform: translateY(0); }
|
|
10385
11165
|
to { opacity: 0; transform: translateY(-16px); }
|
|
@@ -10661,12 +11441,16 @@ var ChatUIView = ({
|
|
|
10661
11441
|
openProjectSettings,
|
|
10662
11442
|
closeProjectSettings,
|
|
10663
11443
|
projectMemory,
|
|
10664
|
-
isSessionsLoading
|
|
11444
|
+
isSessionsLoading,
|
|
11445
|
+
// Checklist
|
|
11446
|
+
handleChecklistAbort,
|
|
11447
|
+
handleChecklistRetry,
|
|
11448
|
+
handleChecklistSkip
|
|
10665
11449
|
} = state;
|
|
10666
|
-
const [disclaimerOpen, setDisclaimerOpen] =
|
|
10667
|
-
const [welcomeExiting, setWelcomeExiting] =
|
|
10668
|
-
const prevMessageCountRef =
|
|
10669
|
-
|
|
11450
|
+
const [disclaimerOpen, setDisclaimerOpen] = import_react21.default.useState(false);
|
|
11451
|
+
const [welcomeExiting, setWelcomeExiting] = import_react21.default.useState(false);
|
|
11452
|
+
const prevMessageCountRef = import_react21.default.useRef(messages.length);
|
|
11453
|
+
import_react21.default.useEffect(() => {
|
|
10670
11454
|
let timer;
|
|
10671
11455
|
if (prevMessageCountRef.current === 0 && messages.length > 0) {
|
|
10672
11456
|
setWelcomeExiting(true);
|
|
@@ -10690,7 +11474,7 @@ var ChatUIView = ({
|
|
|
10690
11474
|
const handleChoiceClick = (choice) => {
|
|
10691
11475
|
setInput(choice.text);
|
|
10692
11476
|
};
|
|
10693
|
-
const memoryItems =
|
|
11477
|
+
const memoryItems = import_react21.default.useMemo(() => {
|
|
10694
11478
|
if (!globalMemory?.state.entries) return [];
|
|
10695
11479
|
const items = [];
|
|
10696
11480
|
for (const [key, entry] of globalMemory.state.entries) {
|
|
@@ -10704,7 +11488,7 @@ var ChatUIView = ({
|
|
|
10704
11488
|
}
|
|
10705
11489
|
return items;
|
|
10706
11490
|
}, [globalMemory?.state.entries]);
|
|
10707
|
-
const projectMemoryItems =
|
|
11491
|
+
const projectMemoryItems = import_react21.default.useMemo(() => {
|
|
10708
11492
|
if (!projectMemory?.state.entries) return [];
|
|
10709
11493
|
const items = [];
|
|
10710
11494
|
for (const [key, entry] of projectMemory.state.entries) {
|
|
@@ -10719,7 +11503,7 @@ var ChatUIView = ({
|
|
|
10719
11503
|
return items;
|
|
10720
11504
|
}, [projectMemory?.state.entries]);
|
|
10721
11505
|
const themeClass = theme?.mode === "dark" ? "chatllm-dark" : "";
|
|
10722
|
-
return /* @__PURE__ */ (0,
|
|
11506
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
10723
11507
|
"div",
|
|
10724
11508
|
{
|
|
10725
11509
|
className: `chatllm-root ${themeClass} ${className}`,
|
|
@@ -10732,7 +11516,7 @@ var ChatUIView = ({
|
|
|
10732
11516
|
position: "relative"
|
|
10733
11517
|
},
|
|
10734
11518
|
children: [
|
|
10735
|
-
showSidebar && /* @__PURE__ */ (0,
|
|
11519
|
+
showSidebar && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10736
11520
|
ChatSidebar,
|
|
10737
11521
|
{
|
|
10738
11522
|
sessions,
|
|
@@ -10764,7 +11548,7 @@ var ChatUIView = ({
|
|
|
10764
11548
|
isLoading: isSessionsLoading
|
|
10765
11549
|
}
|
|
10766
11550
|
),
|
|
10767
|
-
/* @__PURE__ */ (0,
|
|
11551
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
10768
11552
|
"main",
|
|
10769
11553
|
{
|
|
10770
11554
|
style: {
|
|
@@ -10776,7 +11560,7 @@ var ChatUIView = ({
|
|
|
10776
11560
|
minWidth: 0
|
|
10777
11561
|
},
|
|
10778
11562
|
children: [
|
|
10779
|
-
/* @__PURE__ */ (0,
|
|
11563
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10780
11564
|
ChatHeader,
|
|
10781
11565
|
{
|
|
10782
11566
|
title: currentSession?.title || "\uC0C8 \uB300\uD654",
|
|
@@ -10790,7 +11574,7 @@ var ChatUIView = ({
|
|
|
10790
11574
|
showSettings
|
|
10791
11575
|
}
|
|
10792
11576
|
),
|
|
10793
|
-
(messages.length === 0 || welcomeExiting) && /* @__PURE__ */ (0,
|
|
11577
|
+
(messages.length === 0 || welcomeExiting) && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
10794
11578
|
"div",
|
|
10795
11579
|
{
|
|
10796
11580
|
style: {
|
|
@@ -10805,7 +11589,7 @@ var ChatUIView = ({
|
|
|
10805
11589
|
pointerEvents: welcomeExiting ? "none" : "auto"
|
|
10806
11590
|
},
|
|
10807
11591
|
children: [
|
|
10808
|
-
/* @__PURE__ */ (0,
|
|
11592
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10809
11593
|
"h1",
|
|
10810
11594
|
{
|
|
10811
11595
|
style: {
|
|
@@ -10819,7 +11603,7 @@ var ChatUIView = ({
|
|
|
10819
11603
|
children: greeting ? `${greeting} \u273A` : "\u273A \uBB34\uC5C7\uC744 \uC0DD\uAC01\uD574 \uBCFC\uAE4C\uC694?"
|
|
10820
11604
|
}
|
|
10821
11605
|
),
|
|
10822
|
-
/* @__PURE__ */ (0,
|
|
11606
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10823
11607
|
ChatInput,
|
|
10824
11608
|
{
|
|
10825
11609
|
value: input,
|
|
@@ -10847,7 +11631,7 @@ var ChatUIView = ({
|
|
|
10847
11631
|
inline: true
|
|
10848
11632
|
}
|
|
10849
11633
|
) }),
|
|
10850
|
-
suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ (0,
|
|
11634
|
+
suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10851
11635
|
"div",
|
|
10852
11636
|
{
|
|
10853
11637
|
style: {
|
|
@@ -10857,7 +11641,7 @@ var ChatUIView = ({
|
|
|
10857
11641
|
justifyContent: "center",
|
|
10858
11642
|
maxWidth: "680px"
|
|
10859
11643
|
},
|
|
10860
|
-
children: suggestedPrompts.map((sp) => /* @__PURE__ */ (0,
|
|
11644
|
+
children: suggestedPrompts.map((sp) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
10861
11645
|
"button",
|
|
10862
11646
|
{
|
|
10863
11647
|
onClick: () => setInput(sp.prompt),
|
|
@@ -10876,7 +11660,7 @@ var ChatUIView = ({
|
|
|
10876
11660
|
transition: "all 0.2s"
|
|
10877
11661
|
},
|
|
10878
11662
|
children: [
|
|
10879
|
-
sp.icon && /* @__PURE__ */ (0,
|
|
11663
|
+
sp.icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
|
|
10880
11664
|
sp.label
|
|
10881
11665
|
]
|
|
10882
11666
|
},
|
|
@@ -10887,8 +11671,8 @@ var ChatUIView = ({
|
|
|
10887
11671
|
]
|
|
10888
11672
|
}
|
|
10889
11673
|
),
|
|
10890
|
-
messages.length > 0 && /* @__PURE__ */ (0,
|
|
10891
|
-
/* @__PURE__ */ (0,
|
|
11674
|
+
messages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
|
|
11675
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10892
11676
|
MessageList,
|
|
10893
11677
|
{
|
|
10894
11678
|
messages,
|
|
@@ -10907,10 +11691,13 @@ var ChatUIView = ({
|
|
|
10907
11691
|
showThinking,
|
|
10908
11692
|
thinkingDefaultOpen,
|
|
10909
11693
|
loadingAlternativeFor,
|
|
10910
|
-
onPollSubmit: handlePollSubmit
|
|
11694
|
+
onPollSubmit: handlePollSubmit,
|
|
11695
|
+
onChecklistAbort: handleChecklistAbort,
|
|
11696
|
+
onChecklistRetry: handleChecklistRetry,
|
|
11697
|
+
onChecklistSkip: handleChecklistSkip
|
|
10911
11698
|
}
|
|
10912
11699
|
),
|
|
10913
|
-
/* @__PURE__ */ (0,
|
|
11700
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10914
11701
|
ChatInput,
|
|
10915
11702
|
{
|
|
10916
11703
|
value: input,
|
|
@@ -10941,7 +11728,7 @@ var ChatUIView = ({
|
|
|
10941
11728
|
]
|
|
10942
11729
|
}
|
|
10943
11730
|
),
|
|
10944
|
-
showSettings && /* @__PURE__ */ (0,
|
|
11731
|
+
showSettings && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10945
11732
|
SettingsModal,
|
|
10946
11733
|
{
|
|
10947
11734
|
isOpen: settingsOpen,
|
|
@@ -10968,7 +11755,7 @@ var ChatUIView = ({
|
|
|
10968
11755
|
currentProjectTitle: currentProject?.title
|
|
10969
11756
|
}
|
|
10970
11757
|
),
|
|
10971
|
-
/* @__PURE__ */ (0,
|
|
11758
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10972
11759
|
ProjectSettingsModal,
|
|
10973
11760
|
{
|
|
10974
11761
|
isOpen: projectSettingsOpen,
|
|
@@ -10980,7 +11767,7 @@ var ChatUIView = ({
|
|
|
10980
11767
|
onDeleteProject: deleteProject
|
|
10981
11768
|
}
|
|
10982
11769
|
),
|
|
10983
|
-
/* @__PURE__ */ (0,
|
|
11770
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
|
|
10984
11771
|
]
|
|
10985
11772
|
}
|
|
10986
11773
|
);
|
|
@@ -11083,7 +11870,7 @@ var ChatUIWithHook = ({
|
|
|
11083
11870
|
onDeleteProjectFile
|
|
11084
11871
|
};
|
|
11085
11872
|
const state = useChatUI(hookOptions);
|
|
11086
|
-
return /* @__PURE__ */ (0,
|
|
11873
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
11087
11874
|
ChatUIView,
|
|
11088
11875
|
{
|
|
11089
11876
|
state,
|
|
@@ -11131,7 +11918,7 @@ var ChatUI = (props) => {
|
|
|
11131
11918
|
deepResearch,
|
|
11132
11919
|
suggestedPrompts: chatStateSuggestedPrompts
|
|
11133
11920
|
} = props;
|
|
11134
|
-
return /* @__PURE__ */ (0,
|
|
11921
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
11135
11922
|
ChatUIView,
|
|
11136
11923
|
{
|
|
11137
11924
|
state: props.chatState,
|
|
@@ -11156,11 +11943,11 @@ var ChatUI = (props) => {
|
|
|
11156
11943
|
}
|
|
11157
11944
|
);
|
|
11158
11945
|
}
|
|
11159
|
-
return /* @__PURE__ */ (0,
|
|
11946
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ChatUIWithHook, { ...props });
|
|
11160
11947
|
};
|
|
11161
11948
|
|
|
11162
11949
|
// src/react/hooks/useDeepResearch.ts
|
|
11163
|
-
var
|
|
11950
|
+
var import_react22 = require("react");
|
|
11164
11951
|
var REPORT_GENERATION_PROMPT2 = `\uB2F9\uC2E0\uC740 \uB9AC\uC11C\uCE58 \uBCF4\uACE0\uC11C \uC791\uC131 \uC804\uBB38\uAC00\uC785\uB2C8\uB2E4.
|
|
11165
11952
|
|
|
11166
11953
|
<collected_sources>
|
|
@@ -11211,10 +11998,10 @@ var QUERY_ANALYSIS_PROMPT2 = `\uC0AC\uC6A9\uC790 \uC9C8\uBB38\uC744 \uBD84\uC11D
|
|
|
11211
11998
|
- JSON \uC678 \uB2E4\uB978 \uD14D\uC2A4\uD2B8 \uCD9C\uB825 \uAE08\uC9C0`;
|
|
11212
11999
|
var useDeepResearch = (options) => {
|
|
11213
12000
|
const { onWebSearch, onExtractContent, apiEndpoint, apiKey, model, provider } = options;
|
|
11214
|
-
const [isResearching, setIsResearching] = (0,
|
|
11215
|
-
const [progress, setProgress] = (0,
|
|
11216
|
-
const abortControllerRef = (0,
|
|
11217
|
-
const callLLM2 = (0,
|
|
12001
|
+
const [isResearching, setIsResearching] = (0, import_react22.useState)(false);
|
|
12002
|
+
const [progress, setProgress] = (0, import_react22.useState)(null);
|
|
12003
|
+
const abortControllerRef = (0, import_react22.useRef)(null);
|
|
12004
|
+
const callLLM2 = (0, import_react22.useCallback)(
|
|
11218
12005
|
async (prompt, stream = false) => {
|
|
11219
12006
|
const response = await fetch(apiEndpoint, {
|
|
11220
12007
|
method: "POST",
|
|
@@ -11241,7 +12028,7 @@ var useDeepResearch = (options) => {
|
|
|
11241
12028
|
},
|
|
11242
12029
|
[apiEndpoint, apiKey, model, provider]
|
|
11243
12030
|
);
|
|
11244
|
-
const analyzeQuery2 = (0,
|
|
12031
|
+
const analyzeQuery2 = (0, import_react22.useCallback)(
|
|
11245
12032
|
async (query) => {
|
|
11246
12033
|
const prompt = QUERY_ANALYSIS_PROMPT2.replace("{question}", query);
|
|
11247
12034
|
const response = await callLLM2(prompt);
|
|
@@ -11260,7 +12047,7 @@ var useDeepResearch = (options) => {
|
|
|
11260
12047
|
},
|
|
11261
12048
|
[callLLM2]
|
|
11262
12049
|
);
|
|
11263
|
-
const runSubAgent2 = (0,
|
|
12050
|
+
const runSubAgent2 = (0, import_react22.useCallback)(
|
|
11264
12051
|
async (topic, queries, agentId, updateProgress) => {
|
|
11265
12052
|
updateProgress({ status: "searching", searchCount: 0, resultsCount: 0 });
|
|
11266
12053
|
const allResults = [];
|
|
@@ -11299,7 +12086,7 @@ var useDeepResearch = (options) => {
|
|
|
11299
12086
|
},
|
|
11300
12087
|
[onWebSearch, onExtractContent]
|
|
11301
12088
|
);
|
|
11302
|
-
const generateReport2 = (0,
|
|
12089
|
+
const generateReport2 = (0, import_react22.useCallback)(
|
|
11303
12090
|
async (query, results, onStreamContent) => {
|
|
11304
12091
|
const allSources = [];
|
|
11305
12092
|
const sourcesForPrompt = [];
|
|
@@ -11357,7 +12144,7 @@ var useDeepResearch = (options) => {
|
|
|
11357
12144
|
},
|
|
11358
12145
|
[callLLM2]
|
|
11359
12146
|
);
|
|
11360
|
-
const runDeepResearch = (0,
|
|
12147
|
+
const runDeepResearch = (0, import_react22.useCallback)(
|
|
11361
12148
|
async (query, onStreamContent) => {
|
|
11362
12149
|
abortControllerRef.current = new AbortController();
|
|
11363
12150
|
setIsResearching(true);
|
|
@@ -11460,7 +12247,7 @@ var useDeepResearch = (options) => {
|
|
|
11460
12247
|
},
|
|
11461
12248
|
[analyzeQuery2, runSubAgent2, generateReport2]
|
|
11462
12249
|
);
|
|
11463
|
-
const stopResearch = (0,
|
|
12250
|
+
const stopResearch = (0, import_react22.useCallback)(() => {
|
|
11464
12251
|
abortControllerRef.current?.abort();
|
|
11465
12252
|
setIsResearching(false);
|
|
11466
12253
|
setProgress(null);
|
|
@@ -11474,7 +12261,7 @@ var useDeepResearch = (options) => {
|
|
|
11474
12261
|
};
|
|
11475
12262
|
|
|
11476
12263
|
// src/react/components/EmptyState.tsx
|
|
11477
|
-
var
|
|
12264
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
11478
12265
|
var EmptyState = ({
|
|
11479
12266
|
greeting,
|
|
11480
12267
|
templates = [],
|
|
@@ -11492,7 +12279,7 @@ var EmptyState = ({
|
|
|
11492
12279
|
return iconMap[icon] || "sparkling-line";
|
|
11493
12280
|
};
|
|
11494
12281
|
const hasContent = actions.length > 0 || templates.length > 0;
|
|
11495
|
-
return /* @__PURE__ */ (0,
|
|
12282
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
11496
12283
|
"div",
|
|
11497
12284
|
{
|
|
11498
12285
|
className: "chatllm-empty-state",
|
|
@@ -11507,7 +12294,7 @@ var EmptyState = ({
|
|
|
11507
12294
|
textAlign: "center"
|
|
11508
12295
|
},
|
|
11509
12296
|
children: [
|
|
11510
|
-
/* @__PURE__ */ (0,
|
|
12297
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
11511
12298
|
"div",
|
|
11512
12299
|
{
|
|
11513
12300
|
className: "chatllm-sheet",
|
|
@@ -11521,10 +12308,10 @@ var EmptyState = ({
|
|
|
11521
12308
|
marginBottom: "32px",
|
|
11522
12309
|
color: "var(--chatllm-primary)"
|
|
11523
12310
|
},
|
|
11524
|
-
children: /* @__PURE__ */ (0,
|
|
12311
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(IconSvg, { name: "chat-1-line", size: 40 })
|
|
11525
12312
|
}
|
|
11526
12313
|
),
|
|
11527
|
-
/* @__PURE__ */ (0,
|
|
12314
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
11528
12315
|
"h1",
|
|
11529
12316
|
{
|
|
11530
12317
|
style: {
|
|
@@ -11537,7 +12324,7 @@ var EmptyState = ({
|
|
|
11537
12324
|
children: "How can I help you today?"
|
|
11538
12325
|
}
|
|
11539
12326
|
),
|
|
11540
|
-
(actions.length > 0 || templates.length > 0) && /* @__PURE__ */ (0,
|
|
12327
|
+
(actions.length > 0 || templates.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
11541
12328
|
"div",
|
|
11542
12329
|
{
|
|
11543
12330
|
style: {
|
|
@@ -11549,7 +12336,7 @@ var EmptyState = ({
|
|
|
11549
12336
|
marginBottom: "48px"
|
|
11550
12337
|
},
|
|
11551
12338
|
children: [
|
|
11552
|
-
actions.map((action) => /* @__PURE__ */ (0,
|
|
12339
|
+
actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
11553
12340
|
"button",
|
|
11554
12341
|
{
|
|
11555
12342
|
onClick: () => onActionSelect?.(action),
|
|
@@ -11563,7 +12350,7 @@ var EmptyState = ({
|
|
|
11563
12350
|
fontWeight: 500
|
|
11564
12351
|
},
|
|
11565
12352
|
children: [
|
|
11566
|
-
/* @__PURE__ */ (0,
|
|
12353
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
11567
12354
|
IconSvg,
|
|
11568
12355
|
{
|
|
11569
12356
|
name: getActionIcon(action.icon),
|
|
@@ -11576,7 +12363,7 @@ var EmptyState = ({
|
|
|
11576
12363
|
},
|
|
11577
12364
|
action.id
|
|
11578
12365
|
)),
|
|
11579
|
-
templates.slice(0, 4).map((template) => /* @__PURE__ */ (0,
|
|
12366
|
+
templates.slice(0, 4).map((template) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
11580
12367
|
"button",
|
|
11581
12368
|
{
|
|
11582
12369
|
onClick: () => onTemplateClick(template),
|
|
@@ -11590,7 +12377,7 @@ var EmptyState = ({
|
|
|
11590
12377
|
fontWeight: 500
|
|
11591
12378
|
},
|
|
11592
12379
|
children: [
|
|
11593
|
-
/* @__PURE__ */ (0,
|
|
12380
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
11594
12381
|
IconSvg,
|
|
11595
12382
|
{
|
|
11596
12383
|
name: "sparkling-line",
|
|
@@ -11612,8 +12399,8 @@ var EmptyState = ({
|
|
|
11612
12399
|
};
|
|
11613
12400
|
|
|
11614
12401
|
// src/react/components/MemoryPanel.tsx
|
|
11615
|
-
var
|
|
11616
|
-
var
|
|
12402
|
+
var import_react23 = require("react");
|
|
12403
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
11617
12404
|
var categoryLabels = {
|
|
11618
12405
|
fact: "\uC0AC\uC6A9\uC790 \uC815\uBCF4",
|
|
11619
12406
|
skill: "\uC804\uBB38 \uBD84\uC57C/\uAE30\uC220",
|
|
@@ -11632,8 +12419,8 @@ var MemoryPanel = ({
|
|
|
11632
12419
|
isOpen,
|
|
11633
12420
|
onToggle
|
|
11634
12421
|
}) => {
|
|
11635
|
-
const [expandedId, setExpandedId] = (0,
|
|
11636
|
-
const [activeTab, setActiveTab] = (0,
|
|
12422
|
+
const [expandedId, setExpandedId] = (0, import_react23.useState)(null);
|
|
12423
|
+
const [activeTab, setActiveTab] = (0, import_react23.useState)("all");
|
|
11637
12424
|
const filteredItems = activeTab === "all" ? items : items.filter((item) => item.category === activeTab);
|
|
11638
12425
|
const formatDate = (timestamp) => {
|
|
11639
12426
|
const date = new Date(timestamp);
|
|
@@ -11645,7 +12432,7 @@ var MemoryPanel = ({
|
|
|
11645
12432
|
});
|
|
11646
12433
|
};
|
|
11647
12434
|
if (!isOpen) {
|
|
11648
|
-
return /* @__PURE__ */ (0,
|
|
12435
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11649
12436
|
"button",
|
|
11650
12437
|
{
|
|
11651
12438
|
onClick: onToggle,
|
|
@@ -11665,11 +12452,11 @@ var MemoryPanel = ({
|
|
|
11665
12452
|
justifyContent: "center",
|
|
11666
12453
|
zIndex: 100
|
|
11667
12454
|
},
|
|
11668
|
-
children: /* @__PURE__ */ (0,
|
|
12455
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
|
|
11669
12456
|
}
|
|
11670
12457
|
);
|
|
11671
12458
|
}
|
|
11672
|
-
return /* @__PURE__ */ (0,
|
|
12459
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11673
12460
|
"div",
|
|
11674
12461
|
{
|
|
11675
12462
|
className: "chatllm-memory-panel",
|
|
@@ -11689,7 +12476,7 @@ var MemoryPanel = ({
|
|
|
11689
12476
|
zIndex: 100
|
|
11690
12477
|
},
|
|
11691
12478
|
children: [
|
|
11692
|
-
/* @__PURE__ */ (0,
|
|
12479
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11693
12480
|
"div",
|
|
11694
12481
|
{
|
|
11695
12482
|
style: {
|
|
@@ -11700,8 +12487,8 @@ var MemoryPanel = ({
|
|
|
11700
12487
|
borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
|
|
11701
12488
|
},
|
|
11702
12489
|
children: [
|
|
11703
|
-
/* @__PURE__ */ (0,
|
|
11704
|
-
/* @__PURE__ */ (0,
|
|
12490
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
|
|
12491
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11705
12492
|
"div",
|
|
11706
12493
|
{
|
|
11707
12494
|
style: {
|
|
@@ -11713,19 +12500,19 @@ var MemoryPanel = ({
|
|
|
11713
12500
|
alignItems: "center",
|
|
11714
12501
|
justifyContent: "center"
|
|
11715
12502
|
},
|
|
11716
|
-
children: /* @__PURE__ */ (0,
|
|
12503
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
|
|
11717
12504
|
}
|
|
11718
12505
|
),
|
|
11719
|
-
/* @__PURE__ */ (0,
|
|
11720
|
-
/* @__PURE__ */ (0,
|
|
11721
|
-
/* @__PURE__ */ (0,
|
|
12506
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
|
|
12507
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
|
|
12508
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
|
|
11722
12509
|
items.length,
|
|
11723
12510
|
"\uAC1C \uD56D\uBAA9"
|
|
11724
12511
|
] })
|
|
11725
12512
|
] })
|
|
11726
12513
|
] }),
|
|
11727
|
-
/* @__PURE__ */ (0,
|
|
11728
|
-
onClearAll && items.length > 0 && /* @__PURE__ */ (0,
|
|
12514
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", gap: "4px" }, children: [
|
|
12515
|
+
onClearAll && items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11729
12516
|
"button",
|
|
11730
12517
|
{
|
|
11731
12518
|
onClick: onClearAll,
|
|
@@ -11737,10 +12524,10 @@ var MemoryPanel = ({
|
|
|
11737
12524
|
cursor: "pointer"
|
|
11738
12525
|
},
|
|
11739
12526
|
title: "\uC804\uCCB4 \uC0AD\uC81C",
|
|
11740
|
-
children: /* @__PURE__ */ (0,
|
|
12527
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
|
|
11741
12528
|
}
|
|
11742
12529
|
),
|
|
11743
|
-
/* @__PURE__ */ (0,
|
|
12530
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11744
12531
|
"button",
|
|
11745
12532
|
{
|
|
11746
12533
|
onClick: onToggle,
|
|
@@ -11751,14 +12538,14 @@ var MemoryPanel = ({
|
|
|
11751
12538
|
borderRadius: "8px",
|
|
11752
12539
|
cursor: "pointer"
|
|
11753
12540
|
},
|
|
11754
|
-
children: /* @__PURE__ */ (0,
|
|
12541
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
|
|
11755
12542
|
}
|
|
11756
12543
|
)
|
|
11757
12544
|
] })
|
|
11758
12545
|
]
|
|
11759
12546
|
}
|
|
11760
12547
|
),
|
|
11761
|
-
/* @__PURE__ */ (0,
|
|
12548
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11762
12549
|
"div",
|
|
11763
12550
|
{
|
|
11764
12551
|
style: {
|
|
@@ -11768,7 +12555,7 @@ var MemoryPanel = ({
|
|
|
11768
12555
|
borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)",
|
|
11769
12556
|
overflowX: "auto"
|
|
11770
12557
|
},
|
|
11771
|
-
children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ (0,
|
|
12558
|
+
children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11772
12559
|
"button",
|
|
11773
12560
|
{
|
|
11774
12561
|
onClick: () => setActiveTab(tab),
|
|
@@ -11789,8 +12576,8 @@ var MemoryPanel = ({
|
|
|
11789
12576
|
))
|
|
11790
12577
|
}
|
|
11791
12578
|
),
|
|
11792
|
-
/* @__PURE__ */ (0,
|
|
11793
|
-
contextSummary && activeTab === "all" && /* @__PURE__ */ (0,
|
|
12579
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
|
|
12580
|
+
contextSummary && activeTab === "all" && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11794
12581
|
"div",
|
|
11795
12582
|
{
|
|
11796
12583
|
style: {
|
|
@@ -11801,7 +12588,7 @@ var MemoryPanel = ({
|
|
|
11801
12588
|
borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
|
|
11802
12589
|
},
|
|
11803
12590
|
children: [
|
|
11804
|
-
/* @__PURE__ */ (0,
|
|
12591
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11805
12592
|
"div",
|
|
11806
12593
|
{
|
|
11807
12594
|
style: {
|
|
@@ -11811,12 +12598,12 @@ var MemoryPanel = ({
|
|
|
11811
12598
|
marginBottom: "8px"
|
|
11812
12599
|
},
|
|
11813
12600
|
children: [
|
|
11814
|
-
/* @__PURE__ */ (0,
|
|
11815
|
-
/* @__PURE__ */ (0,
|
|
12601
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
|
|
12602
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
|
|
11816
12603
|
]
|
|
11817
12604
|
}
|
|
11818
12605
|
),
|
|
11819
|
-
/* @__PURE__ */ (0,
|
|
12606
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11820
12607
|
"p",
|
|
11821
12608
|
{
|
|
11822
12609
|
style: {
|
|
@@ -11831,7 +12618,7 @@ var MemoryPanel = ({
|
|
|
11831
12618
|
]
|
|
11832
12619
|
}
|
|
11833
12620
|
),
|
|
11834
|
-
filteredItems.length === 0 ? /* @__PURE__ */ (0,
|
|
12621
|
+
filteredItems.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11835
12622
|
"div",
|
|
11836
12623
|
{
|
|
11837
12624
|
style: {
|
|
@@ -11840,11 +12627,11 @@ var MemoryPanel = ({
|
|
|
11840
12627
|
color: "var(--chatllm-text-muted, #9ca3af)"
|
|
11841
12628
|
},
|
|
11842
12629
|
children: [
|
|
11843
|
-
/* @__PURE__ */ (0,
|
|
11844
|
-
/* @__PURE__ */ (0,
|
|
12630
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
|
|
12631
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { style: { fontSize: "14px", marginTop: "12px" }, children: "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" })
|
|
11845
12632
|
]
|
|
11846
12633
|
}
|
|
11847
|
-
) : /* @__PURE__ */ (0,
|
|
12634
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11848
12635
|
"div",
|
|
11849
12636
|
{
|
|
11850
12637
|
style: {
|
|
@@ -11857,10 +12644,10 @@ var MemoryPanel = ({
|
|
|
11857
12644
|
},
|
|
11858
12645
|
onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
|
|
11859
12646
|
children: [
|
|
11860
|
-
/* @__PURE__ */ (0,
|
|
11861
|
-
/* @__PURE__ */ (0,
|
|
11862
|
-
/* @__PURE__ */ (0,
|
|
11863
|
-
item.category && /* @__PURE__ */ (0,
|
|
12647
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
|
|
12648
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
|
|
12649
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
|
|
12650
|
+
item.category && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11864
12651
|
"span",
|
|
11865
12652
|
{
|
|
11866
12653
|
style: {
|
|
@@ -11874,9 +12661,9 @@ var MemoryPanel = ({
|
|
|
11874
12661
|
children: categoryLabels[item.category]
|
|
11875
12662
|
}
|
|
11876
12663
|
),
|
|
11877
|
-
/* @__PURE__ */ (0,
|
|
12664
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
|
|
11878
12665
|
] }),
|
|
11879
|
-
/* @__PURE__ */ (0,
|
|
12666
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11880
12667
|
"div",
|
|
11881
12668
|
{
|
|
11882
12669
|
style: {
|
|
@@ -11888,8 +12675,8 @@ var MemoryPanel = ({
|
|
|
11888
12675
|
}
|
|
11889
12676
|
)
|
|
11890
12677
|
] }),
|
|
11891
|
-
/* @__PURE__ */ (0,
|
|
11892
|
-
onDelete && /* @__PURE__ */ (0,
|
|
12678
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
|
|
12679
|
+
onDelete && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11893
12680
|
"button",
|
|
11894
12681
|
{
|
|
11895
12682
|
onClick: (e) => {
|
|
@@ -11904,10 +12691,10 @@ var MemoryPanel = ({
|
|
|
11904
12691
|
cursor: "pointer",
|
|
11905
12692
|
opacity: 0.5
|
|
11906
12693
|
},
|
|
11907
|
-
children: /* @__PURE__ */ (0,
|
|
12694
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
|
|
11908
12695
|
}
|
|
11909
12696
|
),
|
|
11910
|
-
/* @__PURE__ */ (0,
|
|
12697
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11911
12698
|
IconSvg,
|
|
11912
12699
|
{
|
|
11913
12700
|
name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
|
|
@@ -11917,7 +12704,7 @@ var MemoryPanel = ({
|
|
|
11917
12704
|
)
|
|
11918
12705
|
] })
|
|
11919
12706
|
] }),
|
|
11920
|
-
expandedId === item.id && /* @__PURE__ */ (0,
|
|
12707
|
+
expandedId === item.id && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11921
12708
|
"div",
|
|
11922
12709
|
{
|
|
11923
12710
|
style: {
|
|
@@ -11925,7 +12712,7 @@ var MemoryPanel = ({
|
|
|
11925
12712
|
paddingTop: "12px",
|
|
11926
12713
|
borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
|
|
11927
12714
|
},
|
|
11928
|
-
children: /* @__PURE__ */ (0,
|
|
12715
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11929
12716
|
"p",
|
|
11930
12717
|
{
|
|
11931
12718
|
style: {
|
|
@@ -11955,6 +12742,7 @@ var MemoryPanel = ({
|
|
|
11955
12742
|
ChatInput,
|
|
11956
12743
|
ChatSidebar,
|
|
11957
12744
|
ChatUI,
|
|
12745
|
+
ChecklistCard,
|
|
11958
12746
|
ContentPartRenderer,
|
|
11959
12747
|
DEFAULT_PROJECT_ID,
|
|
11960
12748
|
DEFAULT_PROJECT_TITLE,
|