@gendive/chatllm 0.17.24 → 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 +1157 -396
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +1140 -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 {
|
|
@@ -3009,6 +3077,165 @@ ${result.content}
|
|
|
3009
3077
|
}
|
|
3010
3078
|
}
|
|
3011
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
|
+
}
|
|
3012
3239
|
setSessions(
|
|
3013
3240
|
(prev) => prev.map((s) => {
|
|
3014
3241
|
if (s.id !== capturedSessionId) return s;
|
|
@@ -3108,6 +3335,187 @@ ${result.content}
|
|
|
3108
3335
|
attachments,
|
|
3109
3336
|
continueAfterToolResult
|
|
3110
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
|
+
);
|
|
3111
3519
|
const handlePollSubmit = (0, import_react5.useCallback)(
|
|
3112
3520
|
(messageId, responses) => {
|
|
3113
3521
|
const currentSess = sessions.find((s) => s.id === currentSessionId);
|
|
@@ -3132,7 +3540,7 @@ ${result.content}
|
|
|
3132
3540
|
return { ...m, pollBlock: void 0 };
|
|
3133
3541
|
});
|
|
3134
3542
|
updatedMessages.push({
|
|
3135
|
-
id:
|
|
3543
|
+
id: generateId4("msg"),
|
|
3136
3544
|
role: "assistant",
|
|
3137
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.",
|
|
3138
3546
|
model: selectedModel,
|
|
@@ -3456,7 +3864,7 @@ ${currentSession.contextSummary}` },
|
|
|
3456
3864
|
}
|
|
3457
3865
|
}
|
|
3458
3866
|
const alternative = {
|
|
3459
|
-
id:
|
|
3867
|
+
id: generateId4("alt"),
|
|
3460
3868
|
model: targetModel,
|
|
3461
3869
|
content: responseContent,
|
|
3462
3870
|
timestamp: Date.now(),
|
|
@@ -3710,7 +4118,14 @@ ${result.content}
|
|
|
3710
4118
|
projectSettingsOpen,
|
|
3711
4119
|
openProjectSettings: () => setProjectSettingsOpen(true),
|
|
3712
4120
|
closeProjectSettings: () => setProjectSettingsOpen(false),
|
|
3713
|
-
projectMemory
|
|
4121
|
+
projectMemory,
|
|
4122
|
+
// Checklist
|
|
4123
|
+
/** @Todo vibecode - 체크리스트 자동 실행 중단 */
|
|
4124
|
+
handleChecklistAbort,
|
|
4125
|
+
/** @Todo vibecode - 체크리스트 error 항목 재시도 */
|
|
4126
|
+
handleChecklistRetry,
|
|
4127
|
+
/** @Todo vibecode - 체크리스트 pending 항목 건너뛰기 */
|
|
4128
|
+
handleChecklistSkip
|
|
3714
4129
|
};
|
|
3715
4130
|
};
|
|
3716
4131
|
|
|
@@ -5466,10 +5881,10 @@ var iconButtonStyle = {
|
|
|
5466
5881
|
};
|
|
5467
5882
|
|
|
5468
5883
|
// src/react/components/MessageList.tsx
|
|
5469
|
-
var
|
|
5884
|
+
var import_react18 = require("react");
|
|
5470
5885
|
|
|
5471
5886
|
// src/react/components/MessageBubble.tsx
|
|
5472
|
-
var
|
|
5887
|
+
var import_react17 = require("react");
|
|
5473
5888
|
|
|
5474
5889
|
// src/react/components/MarkdownRenderer.tsx
|
|
5475
5890
|
var import_react11 = __toESM(require("react"));
|
|
@@ -5652,6 +6067,7 @@ var THINKING_TEXT_REGEX = /^Thinking:\s*\n([\s\S]*?)(?=\n\n|$)/gim;
|
|
|
5652
6067
|
var UNCLOSED_THINKING_TAG_REGEX = /<thinking>(?![\s\S]*?<\/thinking>)/gi;
|
|
5653
6068
|
var UNCLOSED_POLL_TAG_REGEX = /<poll[^>]*>(?![\s\S]*?<\/poll>)[\s\S]*$/gi;
|
|
5654
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;
|
|
5655
6071
|
var INLINE_CODE_REGEX = /`([^`]+)`/g;
|
|
5656
6072
|
var BOLD_REGEX = /\*\*([^*]+)\*\*/g;
|
|
5657
6073
|
var ITALIC_REGEX = /(?<!\*)\*([^*]+)\*(?!\*)/g;
|
|
@@ -6533,6 +6949,9 @@ var MarkdownRenderer = ({
|
|
|
6533
6949
|
}
|
|
6534
6950
|
processedContent = processedContent.replace(/<skill_use[^>]*>[\s\S]*?<\/skill_use>/gi, "");
|
|
6535
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;
|
|
6536
6955
|
const codeBlocks = [];
|
|
6537
6956
|
processedContent = processedContent.replace(CODE_BLOCK_REGEX, (match, lang, code) => {
|
|
6538
6957
|
if (lang === "markdown" || lang === "md") {
|
|
@@ -8202,8 +8621,311 @@ var ContentPartRenderer = ({
|
|
|
8202
8621
|
}) });
|
|
8203
8622
|
};
|
|
8204
8623
|
|
|
8205
|
-
// src/react/components/
|
|
8624
|
+
// src/react/components/ChecklistCard.tsx
|
|
8625
|
+
var import_react16 = require("react");
|
|
8206
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");
|
|
8207
8929
|
var MessageBubble = ({
|
|
8208
8930
|
message,
|
|
8209
8931
|
isLoading,
|
|
@@ -8223,10 +8945,13 @@ var MessageBubble = ({
|
|
|
8223
8945
|
showThinking = true,
|
|
8224
8946
|
thinkingDefaultOpen = false,
|
|
8225
8947
|
isLoadingAlternative = false,
|
|
8226
|
-
onPollSubmit
|
|
8948
|
+
onPollSubmit,
|
|
8949
|
+
onChecklistAbort,
|
|
8950
|
+
onChecklistRetry,
|
|
8951
|
+
onChecklistSkip
|
|
8227
8952
|
}) => {
|
|
8228
|
-
const [showActions, setShowActions] = (0,
|
|
8229
|
-
const [showModelMenu, setShowModelMenu] = (0,
|
|
8953
|
+
const [showActions, setShowActions] = (0, import_react17.useState)(false);
|
|
8954
|
+
const [showModelMenu, setShowModelMenu] = (0, import_react17.useState)(false);
|
|
8230
8955
|
const isUser = message.role === "user";
|
|
8231
8956
|
const isAssistant = message.role === "assistant";
|
|
8232
8957
|
const relevantAlternatives = isUser ? alternatives : message.alternatives;
|
|
@@ -8237,7 +8962,7 @@ var MessageBubble = ({
|
|
|
8237
8962
|
const displayModel = isAssistant && relevantAlternatives && relevantAlternatives.length > 0 && relevantActiveIndex > 0 ? relevantAlternatives[relevantActiveIndex - 1]?.model : message.model;
|
|
8238
8963
|
const displaySources = isAssistant && relevantAlternatives && relevantAlternatives.length > 0 && relevantActiveIndex > 0 ? relevantAlternatives[relevantActiveIndex - 1]?.sources : message.sources;
|
|
8239
8964
|
if (isUser) {
|
|
8240
|
-
return /* @__PURE__ */ (0,
|
|
8965
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8241
8966
|
"div",
|
|
8242
8967
|
{
|
|
8243
8968
|
className: "chatllm-message chatllm-message--user",
|
|
@@ -8250,7 +8975,7 @@ var MessageBubble = ({
|
|
|
8250
8975
|
onMouseEnter: () => setShowActions(true),
|
|
8251
8976
|
onMouseLeave: () => setShowActions(false),
|
|
8252
8977
|
children: [
|
|
8253
|
-
/* @__PURE__ */ (0,
|
|
8978
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8254
8979
|
"div",
|
|
8255
8980
|
{
|
|
8256
8981
|
style: {
|
|
@@ -8260,9 +8985,9 @@ var MessageBubble = ({
|
|
|
8260
8985
|
borderRadius: "16px",
|
|
8261
8986
|
borderTopRightRadius: "4px"
|
|
8262
8987
|
},
|
|
8263
|
-
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) => {
|
|
8264
8989
|
if (part.type === "text") {
|
|
8265
|
-
return /* @__PURE__ */ (0,
|
|
8990
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8266
8991
|
"div",
|
|
8267
8992
|
{
|
|
8268
8993
|
style: {
|
|
@@ -8277,7 +9002,7 @@ var MessageBubble = ({
|
|
|
8277
9002
|
);
|
|
8278
9003
|
}
|
|
8279
9004
|
if (part.type === "image") {
|
|
8280
|
-
return /* @__PURE__ */ (0,
|
|
9005
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8281
9006
|
"img",
|
|
8282
9007
|
{
|
|
8283
9008
|
src: part.url,
|
|
@@ -8293,7 +9018,7 @@ var MessageBubble = ({
|
|
|
8293
9018
|
);
|
|
8294
9019
|
}
|
|
8295
9020
|
if (part.type === "file") {
|
|
8296
|
-
return /* @__PURE__ */ (0,
|
|
9021
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8297
9022
|
"div",
|
|
8298
9023
|
{
|
|
8299
9024
|
style: {
|
|
@@ -8307,15 +9032,15 @@ var MessageBubble = ({
|
|
|
8307
9032
|
color: "var(--chatllm-text)"
|
|
8308
9033
|
},
|
|
8309
9034
|
children: [
|
|
8310
|
-
/* @__PURE__ */ (0,
|
|
8311
|
-
/* @__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 })
|
|
8312
9037
|
]
|
|
8313
9038
|
},
|
|
8314
9039
|
idx
|
|
8315
9040
|
);
|
|
8316
9041
|
}
|
|
8317
9042
|
return null;
|
|
8318
|
-
}) }) : /* @__PURE__ */ (0,
|
|
9043
|
+
}) }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8319
9044
|
"div",
|
|
8320
9045
|
{
|
|
8321
9046
|
style: {
|
|
@@ -8329,7 +9054,7 @@ var MessageBubble = ({
|
|
|
8329
9054
|
)
|
|
8330
9055
|
}
|
|
8331
9056
|
),
|
|
8332
|
-
!isLoading && /* @__PURE__ */ (0,
|
|
9057
|
+
!isLoading && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8333
9058
|
"div",
|
|
8334
9059
|
{
|
|
8335
9060
|
style: {
|
|
@@ -8341,7 +9066,7 @@ var MessageBubble = ({
|
|
|
8341
9066
|
transition: "opacity 0.15s ease"
|
|
8342
9067
|
},
|
|
8343
9068
|
children: [
|
|
8344
|
-
/* @__PURE__ */ (0,
|
|
9069
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("button", { onClick: onCopy, style: actionButtonSmallStyle, title: "\uBCF5\uC0AC", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8345
9070
|
IconSvg,
|
|
8346
9071
|
{
|
|
8347
9072
|
name: isCopied ? "check-line" : "file-copy-line",
|
|
@@ -8349,7 +9074,7 @@ var MessageBubble = ({
|
|
|
8349
9074
|
color: isCopied ? "var(--chatllm-success)" : "var(--chatllm-text-muted)"
|
|
8350
9075
|
}
|
|
8351
9076
|
) }),
|
|
8352
|
-
/* @__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)" }) })
|
|
8353
9078
|
]
|
|
8354
9079
|
}
|
|
8355
9080
|
)
|
|
@@ -8357,7 +9082,7 @@ var MessageBubble = ({
|
|
|
8357
9082
|
}
|
|
8358
9083
|
);
|
|
8359
9084
|
}
|
|
8360
|
-
return /* @__PURE__ */ (0,
|
|
9085
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8361
9086
|
"div",
|
|
8362
9087
|
{
|
|
8363
9088
|
className: "chatllm-message chatllm-message--assistant",
|
|
@@ -8370,7 +9095,7 @@ var MessageBubble = ({
|
|
|
8370
9095
|
onMouseEnter: () => setShowActions(true),
|
|
8371
9096
|
onMouseLeave: () => setShowActions(false),
|
|
8372
9097
|
children: [
|
|
8373
|
-
/* @__PURE__ */ (0,
|
|
9098
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8374
9099
|
"div",
|
|
8375
9100
|
{
|
|
8376
9101
|
className: "chatllm-sheet",
|
|
@@ -8381,7 +9106,7 @@ var MessageBubble = ({
|
|
|
8381
9106
|
gap: "12px"
|
|
8382
9107
|
},
|
|
8383
9108
|
children: [
|
|
8384
|
-
/* @__PURE__ */ (0,
|
|
9109
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { flexShrink: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8385
9110
|
"div",
|
|
8386
9111
|
{
|
|
8387
9112
|
style: {
|
|
@@ -8394,11 +9119,11 @@ var MessageBubble = ({
|
|
|
8394
9119
|
justifyContent: "center",
|
|
8395
9120
|
color: "var(--chatllm-primary)"
|
|
8396
9121
|
},
|
|
8397
|
-
children: /* @__PURE__ */ (0,
|
|
9122
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "magic-line", size: 20 })
|
|
8398
9123
|
}
|
|
8399
9124
|
) }),
|
|
8400
|
-
/* @__PURE__ */ (0,
|
|
8401
|
-
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)(
|
|
8402
9127
|
"div",
|
|
8403
9128
|
{
|
|
8404
9129
|
style: {
|
|
@@ -8407,7 +9132,7 @@ var MessageBubble = ({
|
|
|
8407
9132
|
gap: "8px",
|
|
8408
9133
|
marginBottom: "8px"
|
|
8409
9134
|
},
|
|
8410
|
-
children: /* @__PURE__ */ (0,
|
|
9135
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8411
9136
|
"span",
|
|
8412
9137
|
{
|
|
8413
9138
|
style: {
|
|
@@ -8422,9 +9147,9 @@ var MessageBubble = ({
|
|
|
8422
9147
|
)
|
|
8423
9148
|
}
|
|
8424
9149
|
),
|
|
8425
|
-
message.isDeepResearch && message.researchProgress && message.researchProgress.phase !== "done" && /* @__PURE__ */ (0,
|
|
8426
|
-
message.skillExecution && message.skillExecution.status !== "done" && (message.skillExecution.progress?.subAgents ? /* @__PURE__ */ (0,
|
|
8427
|
-
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)(
|
|
8428
9153
|
"div",
|
|
8429
9154
|
{
|
|
8430
9155
|
className: "chatllm-deep-research__header",
|
|
@@ -8437,8 +9162,8 @@ var MessageBubble = ({
|
|
|
8437
9162
|
borderBottom: "1px solid var(--chatllm-border-light)"
|
|
8438
9163
|
},
|
|
8439
9164
|
children: [
|
|
8440
|
-
/* @__PURE__ */ (0,
|
|
8441
|
-
/* @__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)(
|
|
8442
9167
|
"span",
|
|
8443
9168
|
{
|
|
8444
9169
|
style: {
|
|
@@ -8449,7 +9174,7 @@ var MessageBubble = ({
|
|
|
8449
9174
|
children: "\uC2EC\uCE35\uC5F0\uAD6C"
|
|
8450
9175
|
}
|
|
8451
9176
|
),
|
|
8452
|
-
displaySources && displaySources.length > 0 && /* @__PURE__ */ (0,
|
|
9177
|
+
displaySources && displaySources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8453
9178
|
"span",
|
|
8454
9179
|
{
|
|
8455
9180
|
className: "chatllm-deep-research__source-count",
|
|
@@ -8471,7 +9196,7 @@ var MessageBubble = ({
|
|
|
8471
9196
|
]
|
|
8472
9197
|
}
|
|
8473
9198
|
),
|
|
8474
|
-
!!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)(
|
|
8475
9200
|
ContentPartRenderer,
|
|
8476
9201
|
{
|
|
8477
9202
|
parts: message.contentParts,
|
|
@@ -8482,13 +9207,13 @@ var MessageBubble = ({
|
|
|
8482
9207
|
) }),
|
|
8483
9208
|
isLoading && !displayContent && !message.isDeepResearch && (message.contentParts?.length ? (
|
|
8484
9209
|
/* contentParts 있을 때: 간소화된 AI 응답 대기 표시 */
|
|
8485
|
-
/* @__PURE__ */ (0,
|
|
8486
|
-
/* @__PURE__ */ (0,
|
|
8487
|
-
/* @__PURE__ */ (0,
|
|
8488
|
-
/* @__PURE__ */ (0,
|
|
8489
|
-
/* @__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 })
|
|
8490
9215
|
] }),
|
|
8491
|
-
/* @__PURE__ */ (0,
|
|
9216
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8492
9217
|
"span",
|
|
8493
9218
|
{
|
|
8494
9219
|
style: {
|
|
@@ -8503,14 +9228,14 @@ var MessageBubble = ({
|
|
|
8503
9228
|
] })
|
|
8504
9229
|
) : (
|
|
8505
9230
|
/* contentParts 없을 때: 풀 스켈레톤 */
|
|
8506
|
-
/* @__PURE__ */ (0,
|
|
8507
|
-
/* @__PURE__ */ (0,
|
|
8508
|
-
/* @__PURE__ */ (0,
|
|
8509
|
-
/* @__PURE__ */ (0,
|
|
8510
|
-
/* @__PURE__ */ (0,
|
|
8511
|
-
/* @__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 })
|
|
8512
9237
|
] }),
|
|
8513
|
-
/* @__PURE__ */ (0,
|
|
9238
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8514
9239
|
"span",
|
|
8515
9240
|
{
|
|
8516
9241
|
style: {
|
|
@@ -8523,17 +9248,17 @@ var MessageBubble = ({
|
|
|
8523
9248
|
}
|
|
8524
9249
|
)
|
|
8525
9250
|
] }),
|
|
8526
|
-
/* @__PURE__ */ (0,
|
|
8527
|
-
/* @__PURE__ */ (0,
|
|
8528
|
-
/* @__PURE__ */ (0,
|
|
8529
|
-
/* @__PURE__ */ (0,
|
|
8530
|
-
/* @__PURE__ */ (0,
|
|
8531
|
-
/* @__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" } })
|
|
8532
9257
|
] })
|
|
8533
9258
|
] })
|
|
8534
9259
|
] })
|
|
8535
9260
|
)),
|
|
8536
|
-
displayContent ? /* @__PURE__ */ (0,
|
|
9261
|
+
displayContent ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { wordBreak: "break-word" }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8537
9262
|
MarkdownRenderer,
|
|
8538
9263
|
{
|
|
8539
9264
|
content: displayContent,
|
|
@@ -8542,7 +9267,7 @@ var MessageBubble = ({
|
|
|
8542
9267
|
thinkingDefaultOpen
|
|
8543
9268
|
}
|
|
8544
9269
|
) }) : null,
|
|
8545
|
-
message.pollBlock && message.pollBlock.questions.length > 0 && /* @__PURE__ */ (0,
|
|
9270
|
+
message.pollBlock && message.pollBlock.questions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8546
9271
|
PollCard,
|
|
8547
9272
|
{
|
|
8548
9273
|
questions: message.pollBlock.questions,
|
|
@@ -8554,7 +9279,18 @@ var MessageBubble = ({
|
|
|
8554
9279
|
}
|
|
8555
9280
|
}
|
|
8556
9281
|
),
|
|
8557
|
-
|
|
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)(
|
|
8558
9294
|
"div",
|
|
8559
9295
|
{
|
|
8560
9296
|
style: {
|
|
@@ -8567,7 +9303,7 @@ var MessageBubble = ({
|
|
|
8567
9303
|
children: "\uC751\uB2F5\uC744 \uC0DD\uC131\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694."
|
|
8568
9304
|
}
|
|
8569
9305
|
),
|
|
8570
|
-
displaySources && displaySources.length > 0 && /* @__PURE__ */ (0,
|
|
9306
|
+
displaySources && displaySources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8571
9307
|
"div",
|
|
8572
9308
|
{
|
|
8573
9309
|
style: {
|
|
@@ -8579,7 +9315,7 @@ var MessageBubble = ({
|
|
|
8579
9315
|
borderTop: "1px solid var(--chatllm-border-light)"
|
|
8580
9316
|
},
|
|
8581
9317
|
children: [
|
|
8582
|
-
/* @__PURE__ */ (0,
|
|
9318
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8583
9319
|
"span",
|
|
8584
9320
|
{
|
|
8585
9321
|
style: {
|
|
@@ -8591,7 +9327,7 @@ var MessageBubble = ({
|
|
|
8591
9327
|
children: "\uCD9C\uCC98:"
|
|
8592
9328
|
}
|
|
8593
9329
|
),
|
|
8594
|
-
displaySources.map((source, index) => /* @__PURE__ */ (0,
|
|
9330
|
+
displaySources.map((source, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8595
9331
|
LinkChip,
|
|
8596
9332
|
{
|
|
8597
9333
|
text: source.title,
|
|
@@ -8604,7 +9340,7 @@ var MessageBubble = ({
|
|
|
8604
9340
|
]
|
|
8605
9341
|
}
|
|
8606
9342
|
),
|
|
8607
|
-
relevantAlternatives && relevantAlternatives.length > 0 && /* @__PURE__ */ (0,
|
|
9343
|
+
relevantAlternatives && relevantAlternatives.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8608
9344
|
"div",
|
|
8609
9345
|
{
|
|
8610
9346
|
style: {
|
|
@@ -8618,8 +9354,8 @@ var MessageBubble = ({
|
|
|
8618
9354
|
fontSize: "12px"
|
|
8619
9355
|
},
|
|
8620
9356
|
children: [
|
|
8621
|
-
/* @__PURE__ */ (0,
|
|
8622
|
-
/* @__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)(
|
|
8623
9359
|
"button",
|
|
8624
9360
|
{
|
|
8625
9361
|
onClick: () => onAlternativeChange?.(Math.max(0, relevantActiveIndex - 1)),
|
|
@@ -8629,15 +9365,15 @@ var MessageBubble = ({
|
|
|
8629
9365
|
opacity: relevantActiveIndex === 0 ? 0.5 : 1,
|
|
8630
9366
|
cursor: relevantActiveIndex === 0 ? "not-allowed" : "pointer"
|
|
8631
9367
|
},
|
|
8632
|
-
children: /* @__PURE__ */ (0,
|
|
9368
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "arrow-left-line", size: 12 })
|
|
8633
9369
|
}
|
|
8634
9370
|
),
|
|
8635
|
-
/* @__PURE__ */ (0,
|
|
9371
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { style: { color: "var(--chatllm-text-secondary)" }, children: [
|
|
8636
9372
|
relevantActiveIndex + 1,
|
|
8637
9373
|
" / ",
|
|
8638
9374
|
relevantAlternatives.length + 1
|
|
8639
9375
|
] }),
|
|
8640
|
-
/* @__PURE__ */ (0,
|
|
9376
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8641
9377
|
"button",
|
|
8642
9378
|
{
|
|
8643
9379
|
onClick: () => onAlternativeChange?.(Math.min(relevantAlternatives.length, relevantActiveIndex + 1)),
|
|
@@ -8647,13 +9383,13 @@ var MessageBubble = ({
|
|
|
8647
9383
|
opacity: relevantActiveIndex === relevantAlternatives.length ? 0.5 : 1,
|
|
8648
9384
|
cursor: relevantActiveIndex === relevantAlternatives.length ? "not-allowed" : "pointer"
|
|
8649
9385
|
},
|
|
8650
|
-
children: /* @__PURE__ */ (0,
|
|
9386
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "arrow-right-line", size: 12 })
|
|
8651
9387
|
}
|
|
8652
9388
|
)
|
|
8653
9389
|
]
|
|
8654
9390
|
}
|
|
8655
9391
|
),
|
|
8656
|
-
isLoadingAlternative && /* @__PURE__ */ (0,
|
|
9392
|
+
isLoadingAlternative && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8657
9393
|
"div",
|
|
8658
9394
|
{
|
|
8659
9395
|
style: {
|
|
@@ -8668,12 +9404,12 @@ var MessageBubble = ({
|
|
|
8668
9404
|
color: "var(--chatllm-primary, #3584FA)"
|
|
8669
9405
|
},
|
|
8670
9406
|
children: [
|
|
8671
|
-
/* @__PURE__ */ (0,
|
|
8672
|
-
/* @__PURE__ */ (0,
|
|
8673
|
-
/* @__PURE__ */ (0,
|
|
8674
|
-
/* @__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 })
|
|
8675
9411
|
] }),
|
|
8676
|
-
/* @__PURE__ */ (0,
|
|
9412
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontWeight: 500 }, children: "\uB2E4\uB978 \uBAA8\uB378 \uC751\uB2F5 \uC0DD\uC131 \uC911..." })
|
|
8677
9413
|
]
|
|
8678
9414
|
}
|
|
8679
9415
|
)
|
|
@@ -8681,7 +9417,7 @@ var MessageBubble = ({
|
|
|
8681
9417
|
]
|
|
8682
9418
|
}
|
|
8683
9419
|
),
|
|
8684
|
-
!isLoading && /* @__PURE__ */ (0,
|
|
9420
|
+
!isLoading && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8685
9421
|
"div",
|
|
8686
9422
|
{
|
|
8687
9423
|
style: {
|
|
@@ -8694,7 +9430,7 @@ var MessageBubble = ({
|
|
|
8694
9430
|
transition: "opacity 0.15s ease"
|
|
8695
9431
|
},
|
|
8696
9432
|
children: [
|
|
8697
|
-
/* @__PURE__ */ (0,
|
|
9433
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("button", { onClick: onCopy, style: actionButtonSmallStyle, title: "\uBCF5\uC0AC", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8698
9434
|
IconSvg,
|
|
8699
9435
|
{
|
|
8700
9436
|
name: isCopied ? "check-line" : "file-copy-line",
|
|
@@ -8702,18 +9438,18 @@ var MessageBubble = ({
|
|
|
8702
9438
|
color: isCopied ? "var(--chatllm-success)" : "var(--chatllm-text-muted)"
|
|
8703
9439
|
}
|
|
8704
9440
|
) }),
|
|
8705
|
-
onRegenerate && /* @__PURE__ */ (0,
|
|
8706
|
-
onAskOtherModel && otherModels.length > 0 && /* @__PURE__ */ (0,
|
|
8707
|
-
/* @__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)(
|
|
8708
9444
|
"button",
|
|
8709
9445
|
{
|
|
8710
9446
|
onClick: () => setShowModelMenu(!showModelMenu),
|
|
8711
9447
|
style: actionButtonSmallStyle,
|
|
8712
9448
|
title: "\uB2E4\uB978 \uBAA8\uB378\uC5D0\uAC8C \uC9C8\uBB38",
|
|
8713
|
-
children: /* @__PURE__ */ (0,
|
|
9449
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconSvg, { name: "robot-line", size: 12, color: "var(--chatllm-text-muted)" })
|
|
8714
9450
|
}
|
|
8715
9451
|
),
|
|
8716
|
-
showModelMenu && /* @__PURE__ */ (0,
|
|
9452
|
+
showModelMenu && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8717
9453
|
ModelMenu,
|
|
8718
9454
|
{
|
|
8719
9455
|
models: otherModels,
|
|
@@ -8732,7 +9468,7 @@ var MessageBubble = ({
|
|
|
8732
9468
|
}
|
|
8733
9469
|
);
|
|
8734
9470
|
};
|
|
8735
|
-
var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0,
|
|
9471
|
+
var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8736
9472
|
"div",
|
|
8737
9473
|
{
|
|
8738
9474
|
style: {
|
|
@@ -8750,7 +9486,7 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0, import_js
|
|
|
8750
9486
|
},
|
|
8751
9487
|
onMouseLeave: onClose,
|
|
8752
9488
|
children: [
|
|
8753
|
-
/* @__PURE__ */ (0,
|
|
9489
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
8754
9490
|
"div",
|
|
8755
9491
|
{
|
|
8756
9492
|
style: {
|
|
@@ -8765,7 +9501,7 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0, import_js
|
|
|
8765
9501
|
children: "\uB2E4\uB978 \uBAA8\uB378\uC5D0\uAC8C \uC9C8\uBB38"
|
|
8766
9502
|
}
|
|
8767
9503
|
),
|
|
8768
|
-
models.map((model) => /* @__PURE__ */ (0,
|
|
9504
|
+
models.map((model) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
8769
9505
|
"button",
|
|
8770
9506
|
{
|
|
8771
9507
|
onClick: () => onSelect(model.id),
|
|
@@ -8790,9 +9526,9 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ (0, import_js
|
|
|
8790
9526
|
e.currentTarget.style.backgroundColor = "transparent";
|
|
8791
9527
|
},
|
|
8792
9528
|
children: [
|
|
8793
|
-
/* @__PURE__ */ (0,
|
|
8794
|
-
/* @__PURE__ */ (0,
|
|
8795
|
-
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)(
|
|
8796
9532
|
"span",
|
|
8797
9533
|
{
|
|
8798
9534
|
style: {
|
|
@@ -8841,7 +9577,7 @@ var navButtonStyle = {
|
|
|
8841
9577
|
};
|
|
8842
9578
|
|
|
8843
9579
|
// src/react/components/MessageList.tsx
|
|
8844
|
-
var
|
|
9580
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
8845
9581
|
var MessageList = ({
|
|
8846
9582
|
messages,
|
|
8847
9583
|
isLoading,
|
|
@@ -8859,16 +9595,19 @@ var MessageList = ({
|
|
|
8859
9595
|
showThinking = true,
|
|
8860
9596
|
thinkingDefaultOpen = false,
|
|
8861
9597
|
loadingAlternativeFor,
|
|
8862
|
-
onPollSubmit
|
|
9598
|
+
onPollSubmit,
|
|
9599
|
+
onChecklistAbort,
|
|
9600
|
+
onChecklistRetry,
|
|
9601
|
+
onChecklistSkip
|
|
8863
9602
|
}) => {
|
|
8864
|
-
const messagesEndRef = (0,
|
|
8865
|
-
const containerRef = (0,
|
|
8866
|
-
const [selectedText, setSelectedText] = (0,
|
|
8867
|
-
const [selectionPosition, setSelectionPosition] = (0,
|
|
8868
|
-
const [showScrollButton, setShowScrollButton] = (0,
|
|
8869
|
-
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);
|
|
8870
9609
|
const SCROLL_THRESHOLD = 100;
|
|
8871
|
-
const handleScroll = (0,
|
|
9610
|
+
const handleScroll = (0, import_react18.useCallback)(() => {
|
|
8872
9611
|
if (!containerRef.current) return;
|
|
8873
9612
|
const { scrollTop, scrollHeight, clientHeight } = containerRef.current;
|
|
8874
9613
|
const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
|
|
@@ -8876,16 +9615,16 @@ var MessageList = ({
|
|
|
8876
9615
|
isUserScrolledUpRef.current = !isNearBottom;
|
|
8877
9616
|
setShowScrollButton(!isNearBottom);
|
|
8878
9617
|
}, []);
|
|
8879
|
-
(0,
|
|
9618
|
+
(0, import_react18.useEffect)(() => {
|
|
8880
9619
|
if (isUserScrolledUpRef.current) return;
|
|
8881
9620
|
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
8882
9621
|
}, [messages]);
|
|
8883
|
-
const scrollToBottom = (0,
|
|
9622
|
+
const scrollToBottom = (0, import_react18.useCallback)(() => {
|
|
8884
9623
|
isUserScrolledUpRef.current = false;
|
|
8885
9624
|
setShowScrollButton(false);
|
|
8886
9625
|
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
8887
9626
|
}, []);
|
|
8888
|
-
const handleMouseUp = (0,
|
|
9627
|
+
const handleMouseUp = (0, import_react18.useCallback)(() => {
|
|
8889
9628
|
const selection = typeof window !== "undefined" ? window.getSelection() : null;
|
|
8890
9629
|
const text = selection?.toString().trim();
|
|
8891
9630
|
if (text && text.length > 0) {
|
|
@@ -8919,7 +9658,7 @@ var MessageList = ({
|
|
|
8919
9658
|
}
|
|
8920
9659
|
}
|
|
8921
9660
|
};
|
|
8922
|
-
return /* @__PURE__ */ (0,
|
|
9661
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
8923
9662
|
"div",
|
|
8924
9663
|
{
|
|
8925
9664
|
ref: containerRef,
|
|
@@ -8932,7 +9671,7 @@ var MessageList = ({
|
|
|
8932
9671
|
onScroll: handleScroll,
|
|
8933
9672
|
onMouseUp: handleMouseUp,
|
|
8934
9673
|
children: [
|
|
8935
|
-
/* @__PURE__ */ (0,
|
|
9674
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
8936
9675
|
"div",
|
|
8937
9676
|
{
|
|
8938
9677
|
style: {
|
|
@@ -8947,7 +9686,7 @@ var MessageList = ({
|
|
|
8947
9686
|
const nextAssistant = message.role === "user" && index + 1 < messages.length ? messages[index + 1] : null;
|
|
8948
9687
|
const assistantForAlts = nextAssistant?.role === "assistant" ? nextAssistant : null;
|
|
8949
9688
|
const activeAltIndex = assistantForAlts ? activeAlternatives[assistantForAlts.id] ?? 0 : 0;
|
|
8950
|
-
return /* @__PURE__ */ (0,
|
|
9689
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
8951
9690
|
MessageBubble,
|
|
8952
9691
|
{
|
|
8953
9692
|
message,
|
|
@@ -8973,16 +9712,19 @@ var MessageList = ({
|
|
|
8973
9712
|
showThinking,
|
|
8974
9713
|
thinkingDefaultOpen,
|
|
8975
9714
|
isLoadingAlternative: loadingAlternativeFor === message.id,
|
|
8976
|
-
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
|
|
8977
9719
|
},
|
|
8978
9720
|
message.id
|
|
8979
9721
|
);
|
|
8980
9722
|
}),
|
|
8981
|
-
/* @__PURE__ */ (0,
|
|
9723
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { ref: messagesEndRef })
|
|
8982
9724
|
]
|
|
8983
9725
|
}
|
|
8984
9726
|
),
|
|
8985
|
-
showScrollButton && /* @__PURE__ */ (0,
|
|
9727
|
+
showScrollButton && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
8986
9728
|
"button",
|
|
8987
9729
|
{
|
|
8988
9730
|
onClick: scrollToBottom,
|
|
@@ -9005,10 +9747,10 @@ var MessageList = ({
|
|
|
9005
9747
|
zIndex: 10,
|
|
9006
9748
|
transition: "opacity 0.2s"
|
|
9007
9749
|
},
|
|
9008
|
-
children: /* @__PURE__ */ (0,
|
|
9750
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IconSvg, { name: "arrow-down-s-line", size: 24, color: "var(--chatllm-text-secondary)" })
|
|
9009
9751
|
}
|
|
9010
9752
|
),
|
|
9011
|
-
selectionPosition && /* @__PURE__ */ (0,
|
|
9753
|
+
selectionPosition && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
9012
9754
|
"div",
|
|
9013
9755
|
{
|
|
9014
9756
|
style: {
|
|
@@ -9020,7 +9762,7 @@ var MessageList = ({
|
|
|
9020
9762
|
pointerEvents: "auto"
|
|
9021
9763
|
},
|
|
9022
9764
|
children: [
|
|
9023
|
-
/* @__PURE__ */ (0,
|
|
9765
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
9024
9766
|
"button",
|
|
9025
9767
|
{
|
|
9026
9768
|
onClick: handleQuote,
|
|
@@ -9040,12 +9782,12 @@ var MessageList = ({
|
|
|
9040
9782
|
whiteSpace: "nowrap"
|
|
9041
9783
|
},
|
|
9042
9784
|
children: [
|
|
9043
|
-
/* @__PURE__ */ (0,
|
|
9785
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IconSvg, { name: "double-quotes-l", size: 16, color: "#ffffff" }),
|
|
9044
9786
|
"\uC778\uC6A9\uD558\uAE30"
|
|
9045
9787
|
]
|
|
9046
9788
|
}
|
|
9047
9789
|
),
|
|
9048
|
-
/* @__PURE__ */ (0,
|
|
9790
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
9049
9791
|
"div",
|
|
9050
9792
|
{
|
|
9051
9793
|
style: {
|
|
@@ -9070,8 +9812,8 @@ var MessageList = ({
|
|
|
9070
9812
|
};
|
|
9071
9813
|
|
|
9072
9814
|
// src/react/components/SettingsModal.tsx
|
|
9073
|
-
var
|
|
9074
|
-
var
|
|
9815
|
+
var import_react19 = require("react");
|
|
9816
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
9075
9817
|
var DEFAULT_PERSONALIZATION2 = {
|
|
9076
9818
|
responseStyle: {
|
|
9077
9819
|
warmth: "medium",
|
|
@@ -9106,9 +9848,9 @@ var SettingsModal = ({
|
|
|
9106
9848
|
currentProjectTitle,
|
|
9107
9849
|
showMemoryTab = true
|
|
9108
9850
|
}) => {
|
|
9109
|
-
const [activeTab, setActiveTab] = (0,
|
|
9110
|
-
const [localApiKey, setLocalApiKey] = (0,
|
|
9111
|
-
(0,
|
|
9851
|
+
const [activeTab, setActiveTab] = (0, import_react19.useState)("general");
|
|
9852
|
+
const [localApiKey, setLocalApiKey] = (0, import_react19.useState)(apiKey);
|
|
9853
|
+
(0, import_react19.useEffect)(() => {
|
|
9112
9854
|
setLocalApiKey(apiKey);
|
|
9113
9855
|
}, [apiKey]);
|
|
9114
9856
|
if (!isOpen) return null;
|
|
@@ -9134,7 +9876,7 @@ var SettingsModal = ({
|
|
|
9134
9876
|
setLocalApiKey(value);
|
|
9135
9877
|
onApiKeyChange?.(value);
|
|
9136
9878
|
};
|
|
9137
|
-
return /* @__PURE__ */ (0,
|
|
9879
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9138
9880
|
"div",
|
|
9139
9881
|
{
|
|
9140
9882
|
className: "chatllm-settings-overlay",
|
|
@@ -9148,7 +9890,7 @@ var SettingsModal = ({
|
|
|
9148
9890
|
zIndex: 1e3
|
|
9149
9891
|
},
|
|
9150
9892
|
onClick: onClose,
|
|
9151
|
-
children: /* @__PURE__ */ (0,
|
|
9893
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9152
9894
|
"div",
|
|
9153
9895
|
{
|
|
9154
9896
|
className: "chatllm-settings-modal",
|
|
@@ -9166,7 +9908,7 @@ var SettingsModal = ({
|
|
|
9166
9908
|
},
|
|
9167
9909
|
onClick: (e) => e.stopPropagation(),
|
|
9168
9910
|
children: [
|
|
9169
|
-
/* @__PURE__ */ (0,
|
|
9911
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9170
9912
|
"div",
|
|
9171
9913
|
{
|
|
9172
9914
|
style: {
|
|
@@ -9177,7 +9919,7 @@ var SettingsModal = ({
|
|
|
9177
9919
|
flexDirection: "column"
|
|
9178
9920
|
},
|
|
9179
9921
|
children: [
|
|
9180
|
-
/* @__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)(
|
|
9181
9923
|
"button",
|
|
9182
9924
|
{
|
|
9183
9925
|
onClick: onClose,
|
|
@@ -9191,11 +9933,11 @@ var SettingsModal = ({
|
|
|
9191
9933
|
alignItems: "center",
|
|
9192
9934
|
justifyContent: "center"
|
|
9193
9935
|
},
|
|
9194
|
-
children: /* @__PURE__ */ (0,
|
|
9936
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #6b7280)" })
|
|
9195
9937
|
}
|
|
9196
9938
|
) }),
|
|
9197
|
-
/* @__PURE__ */ (0,
|
|
9198
|
-
/* @__PURE__ */ (0,
|
|
9939
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("nav", { style: { flex: 1, padding: "8px" }, children: [
|
|
9940
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9199
9941
|
TabButton,
|
|
9200
9942
|
{
|
|
9201
9943
|
active: activeTab === "general",
|
|
@@ -9204,7 +9946,7 @@ var SettingsModal = ({
|
|
|
9204
9946
|
label: "\uC77C\uBC18"
|
|
9205
9947
|
}
|
|
9206
9948
|
),
|
|
9207
|
-
/* @__PURE__ */ (0,
|
|
9949
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9208
9950
|
TabButton,
|
|
9209
9951
|
{
|
|
9210
9952
|
active: activeTab === "personalization",
|
|
@@ -9213,7 +9955,7 @@ var SettingsModal = ({
|
|
|
9213
9955
|
label: "\uAC1C\uC778 \uB9DE\uCDA4 \uC124\uC815"
|
|
9214
9956
|
}
|
|
9215
9957
|
),
|
|
9216
|
-
showMemoryTab && /* @__PURE__ */ (0,
|
|
9958
|
+
showMemoryTab && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9217
9959
|
TabButton,
|
|
9218
9960
|
{
|
|
9219
9961
|
active: activeTab === "memory",
|
|
@@ -9222,7 +9964,7 @@ var SettingsModal = ({
|
|
|
9222
9964
|
label: "AI \uBA54\uBAA8\uB9AC"
|
|
9223
9965
|
}
|
|
9224
9966
|
),
|
|
9225
|
-
showMemoryTab && enableProjects && /* @__PURE__ */ (0,
|
|
9967
|
+
showMemoryTab && enableProjects && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9226
9968
|
TabButton,
|
|
9227
9969
|
{
|
|
9228
9970
|
active: activeTab === "project-memory",
|
|
@@ -9231,7 +9973,7 @@ var SettingsModal = ({
|
|
|
9231
9973
|
label: "\uD504\uB85C\uC81D\uD2B8 \uBA54\uBAA8\uB9AC"
|
|
9232
9974
|
}
|
|
9233
9975
|
),
|
|
9234
|
-
/* @__PURE__ */ (0,
|
|
9976
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9235
9977
|
TabButton,
|
|
9236
9978
|
{
|
|
9237
9979
|
active: activeTab === "data",
|
|
@@ -9244,24 +9986,24 @@ var SettingsModal = ({
|
|
|
9244
9986
|
]
|
|
9245
9987
|
}
|
|
9246
9988
|
),
|
|
9247
|
-
/* @__PURE__ */ (0,
|
|
9248
|
-
activeTab === "general" && /* @__PURE__ */ (0,
|
|
9249
|
-
/* @__PURE__ */ (0,
|
|
9250
|
-
/* @__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)(
|
|
9251
9993
|
"select",
|
|
9252
9994
|
{
|
|
9253
9995
|
value: personalization.language,
|
|
9254
9996
|
onChange: (e) => onPersonalizationChange({ ...personalization, language: e.target.value }),
|
|
9255
9997
|
style: selectStyle,
|
|
9256
9998
|
children: [
|
|
9257
|
-
/* @__PURE__ */ (0,
|
|
9258
|
-
/* @__PURE__ */ (0,
|
|
9259
|
-
/* @__PURE__ */ (0,
|
|
9260
|
-
/* @__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" })
|
|
9261
10003
|
]
|
|
9262
10004
|
}
|
|
9263
10005
|
) }),
|
|
9264
|
-
/* @__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)(
|
|
9265
10007
|
"button",
|
|
9266
10008
|
{
|
|
9267
10009
|
onClick: () => onPersonalizationChange(DEFAULT_PERSONALIZATION2),
|
|
@@ -9269,11 +10011,11 @@ var SettingsModal = ({
|
|
|
9269
10011
|
children: "\uCD08\uAE30\uD654"
|
|
9270
10012
|
}
|
|
9271
10013
|
) }),
|
|
9272
|
-
onApiKeyChange && /* @__PURE__ */ (0,
|
|
9273
|
-
/* @__PURE__ */ (0,
|
|
9274
|
-
/* @__PURE__ */ (0,
|
|
9275
|
-
/* @__PURE__ */ (0,
|
|
9276
|
-
/* @__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)(
|
|
9277
10019
|
"input",
|
|
9278
10020
|
{
|
|
9279
10021
|
type: "password",
|
|
@@ -9283,18 +10025,18 @@ var SettingsModal = ({
|
|
|
9283
10025
|
style: inputStyle
|
|
9284
10026
|
}
|
|
9285
10027
|
),
|
|
9286
|
-
/* @__PURE__ */ (0,
|
|
10028
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "4px" }, children: apiKeyDescription })
|
|
9287
10029
|
] })
|
|
9288
10030
|
] })
|
|
9289
10031
|
] }),
|
|
9290
|
-
activeTab === "personalization" && /* @__PURE__ */ (0,
|
|
9291
|
-
/* @__PURE__ */ (0,
|
|
9292
|
-
/* @__PURE__ */ (0,
|
|
9293
|
-
/* @__PURE__ */ (0,
|
|
9294
|
-
/* @__PURE__ */ (0,
|
|
9295
|
-
/* @__PURE__ */ (0,
|
|
9296
|
-
/* @__PURE__ */ (0,
|
|
9297
|
-
/* @__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)(
|
|
9298
10040
|
"input",
|
|
9299
10041
|
{
|
|
9300
10042
|
type: "text",
|
|
@@ -9305,9 +10047,9 @@ var SettingsModal = ({
|
|
|
9305
10047
|
}
|
|
9306
10048
|
)
|
|
9307
10049
|
] }),
|
|
9308
|
-
/* @__PURE__ */ (0,
|
|
9309
|
-
/* @__PURE__ */ (0,
|
|
9310
|
-
/* @__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)(
|
|
9311
10053
|
"input",
|
|
9312
10054
|
{
|
|
9313
10055
|
type: "text",
|
|
@@ -9318,9 +10060,9 @@ var SettingsModal = ({
|
|
|
9318
10060
|
}
|
|
9319
10061
|
)
|
|
9320
10062
|
] }),
|
|
9321
|
-
/* @__PURE__ */ (0,
|
|
9322
|
-
/* @__PURE__ */ (0,
|
|
9323
|
-
/* @__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)(
|
|
9324
10066
|
"textarea",
|
|
9325
10067
|
{
|
|
9326
10068
|
value: personalization.userProfile.additionalInfo || "",
|
|
@@ -9333,62 +10075,62 @@ var SettingsModal = ({
|
|
|
9333
10075
|
] })
|
|
9334
10076
|
] })
|
|
9335
10077
|
] }),
|
|
9336
|
-
/* @__PURE__ */ (0,
|
|
9337
|
-
/* @__PURE__ */ (0,
|
|
9338
|
-
/* @__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)(
|
|
9339
10081
|
"select",
|
|
9340
10082
|
{
|
|
9341
10083
|
value: personalization.responseStyle.warmth,
|
|
9342
10084
|
onChange: (e) => updateResponseStyle("warmth", e.target.value),
|
|
9343
10085
|
style: selectStyle,
|
|
9344
10086
|
children: [
|
|
9345
|
-
/* @__PURE__ */ (0,
|
|
9346
|
-
/* @__PURE__ */ (0,
|
|
9347
|
-
/* @__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" })
|
|
9348
10090
|
]
|
|
9349
10091
|
}
|
|
9350
10092
|
) }),
|
|
9351
|
-
/* @__PURE__ */ (0,
|
|
10093
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uC5F4\uC815\uC801", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9352
10094
|
"select",
|
|
9353
10095
|
{
|
|
9354
10096
|
value: personalization.responseStyle.enthusiasm,
|
|
9355
10097
|
onChange: (e) => updateResponseStyle("enthusiasm", e.target.value),
|
|
9356
10098
|
style: selectStyle,
|
|
9357
10099
|
children: [
|
|
9358
|
-
/* @__PURE__ */ (0,
|
|
9359
|
-
/* @__PURE__ */ (0,
|
|
9360
|
-
/* @__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" })
|
|
9361
10103
|
]
|
|
9362
10104
|
}
|
|
9363
10105
|
) }),
|
|
9364
|
-
/* @__PURE__ */ (0,
|
|
10106
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uC774\uBAA8\uC9C0 \uC0AC\uC6A9", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9365
10107
|
"select",
|
|
9366
10108
|
{
|
|
9367
10109
|
value: personalization.responseStyle.emojiUsage,
|
|
9368
10110
|
onChange: (e) => updateResponseStyle("emojiUsage", e.target.value),
|
|
9369
10111
|
style: selectStyle,
|
|
9370
10112
|
children: [
|
|
9371
|
-
/* @__PURE__ */ (0,
|
|
9372
|
-
/* @__PURE__ */ (0,
|
|
9373
|
-
/* @__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" })
|
|
9374
10116
|
]
|
|
9375
10117
|
}
|
|
9376
10118
|
) }),
|
|
9377
|
-
/* @__PURE__ */ (0,
|
|
10119
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SettingRow, { label: "\uC751\uB2F5 \uAE38\uC774", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9378
10120
|
"select",
|
|
9379
10121
|
{
|
|
9380
10122
|
value: personalization.responseStyle.verbosity,
|
|
9381
10123
|
onChange: (e) => updateResponseStyle("verbosity", e.target.value),
|
|
9382
10124
|
style: selectStyle,
|
|
9383
10125
|
children: [
|
|
9384
|
-
/* @__PURE__ */ (0,
|
|
9385
|
-
/* @__PURE__ */ (0,
|
|
9386
|
-
/* @__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" })
|
|
9387
10129
|
]
|
|
9388
10130
|
}
|
|
9389
10131
|
) })
|
|
9390
10132
|
] }),
|
|
9391
|
-
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)(
|
|
9392
10134
|
"button",
|
|
9393
10135
|
{
|
|
9394
10136
|
onClick: onSave,
|
|
@@ -9409,7 +10151,7 @@ var SettingsModal = ({
|
|
|
9409
10151
|
}
|
|
9410
10152
|
) })
|
|
9411
10153
|
] }),
|
|
9412
|
-
activeTab === "memory" && showMemoryTab && /* @__PURE__ */ (0,
|
|
10154
|
+
activeTab === "memory" && showMemoryTab && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9413
10155
|
MemoryTabContent,
|
|
9414
10156
|
{
|
|
9415
10157
|
items: memoryItems,
|
|
@@ -9418,7 +10160,7 @@ var SettingsModal = ({
|
|
|
9418
10160
|
onClearAll: onClearMemory
|
|
9419
10161
|
}
|
|
9420
10162
|
),
|
|
9421
|
-
activeTab === "project-memory" && showMemoryTab && enableProjects && /* @__PURE__ */ (0,
|
|
10163
|
+
activeTab === "project-memory" && showMemoryTab && enableProjects && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9422
10164
|
MemoryTabContent,
|
|
9423
10165
|
{
|
|
9424
10166
|
items: projectMemoryItems,
|
|
@@ -9429,9 +10171,9 @@ var SettingsModal = ({
|
|
|
9429
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"
|
|
9430
10172
|
}
|
|
9431
10173
|
),
|
|
9432
|
-
activeTab === "data" && /* @__PURE__ */ (0,
|
|
9433
|
-
/* @__PURE__ */ (0,
|
|
9434
|
-
/* @__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)(
|
|
9435
10177
|
"button",
|
|
9436
10178
|
{
|
|
9437
10179
|
onClick: () => onPersonalizationChange({ ...personalization, useMemory: !personalization.useMemory }),
|
|
@@ -9445,7 +10187,7 @@ var SettingsModal = ({
|
|
|
9445
10187
|
position: "relative",
|
|
9446
10188
|
transition: "background-color 0.2s"
|
|
9447
10189
|
},
|
|
9448
|
-
children: /* @__PURE__ */ (0,
|
|
10190
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9449
10191
|
"div",
|
|
9450
10192
|
{
|
|
9451
10193
|
style: {
|
|
@@ -9463,7 +10205,7 @@ var SettingsModal = ({
|
|
|
9463
10205
|
)
|
|
9464
10206
|
}
|
|
9465
10207
|
) }),
|
|
9466
|
-
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)(
|
|
9467
10209
|
"button",
|
|
9468
10210
|
{
|
|
9469
10211
|
onClick: () => {
|
|
@@ -9483,7 +10225,7 @@ var SettingsModal = ({
|
|
|
9483
10225
|
}
|
|
9484
10226
|
);
|
|
9485
10227
|
};
|
|
9486
|
-
var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ (0,
|
|
10228
|
+
var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9487
10229
|
"button",
|
|
9488
10230
|
{
|
|
9489
10231
|
onClick,
|
|
@@ -9504,12 +10246,12 @@ var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ (0, import
|
|
|
9504
10246
|
marginBottom: "4px"
|
|
9505
10247
|
},
|
|
9506
10248
|
children: [
|
|
9507
|
-
/* @__PURE__ */ (0,
|
|
10249
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSvg, { name: icon, size: 20 }),
|
|
9508
10250
|
label
|
|
9509
10251
|
]
|
|
9510
10252
|
}
|
|
9511
10253
|
);
|
|
9512
|
-
var SettingRow = ({ label, description, children }) => /* @__PURE__ */ (0,
|
|
10254
|
+
var SettingRow = ({ label, description, children }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9513
10255
|
"div",
|
|
9514
10256
|
{
|
|
9515
10257
|
style: {
|
|
@@ -9520,9 +10262,9 @@ var SettingRow = ({ label, description, children }) => /* @__PURE__ */ (0, impor
|
|
|
9520
10262
|
borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)"
|
|
9521
10263
|
},
|
|
9522
10264
|
children: [
|
|
9523
|
-
/* @__PURE__ */ (0,
|
|
9524
|
-
/* @__PURE__ */ (0,
|
|
9525
|
-
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 })
|
|
9526
10268
|
] }),
|
|
9527
10269
|
children
|
|
9528
10270
|
]
|
|
@@ -9582,8 +10324,8 @@ var memoryCategoryColors = {
|
|
|
9582
10324
|
preference: "#8b5cf6"
|
|
9583
10325
|
};
|
|
9584
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" }) => {
|
|
9585
|
-
const [activeFilter, setActiveFilter] = (0,
|
|
9586
|
-
const [expandedId, setExpandedId] = (0,
|
|
10327
|
+
const [activeFilter, setActiveFilter] = (0, import_react19.useState)("all");
|
|
10328
|
+
const [expandedId, setExpandedId] = (0, import_react19.useState)(null);
|
|
9587
10329
|
const filteredItems = activeFilter === "all" ? items : items.filter((item) => item.category === activeFilter);
|
|
9588
10330
|
const formatDate = (timestamp) => {
|
|
9589
10331
|
const date = new Date(timestamp);
|
|
@@ -9594,15 +10336,15 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9594
10336
|
minute: "2-digit"
|
|
9595
10337
|
});
|
|
9596
10338
|
};
|
|
9597
|
-
return /* @__PURE__ */ (0,
|
|
9598
|
-
/* @__PURE__ */ (0,
|
|
9599
|
-
/* @__PURE__ */ (0,
|
|
9600
|
-
/* @__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: [
|
|
9601
10343
|
items.length,
|
|
9602
10344
|
"\uAC1C \uD56D\uBAA9"
|
|
9603
10345
|
] })
|
|
9604
10346
|
] }),
|
|
9605
|
-
/* @__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)(
|
|
9606
10348
|
"button",
|
|
9607
10349
|
{
|
|
9608
10350
|
onClick: () => setActiveFilter(tab),
|
|
@@ -9620,7 +10362,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9620
10362
|
},
|
|
9621
10363
|
tab
|
|
9622
10364
|
)) }),
|
|
9623
|
-
contextSummary && activeFilter === "all" && /* @__PURE__ */ (0,
|
|
10365
|
+
contextSummary && activeFilter === "all" && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
9624
10366
|
"div",
|
|
9625
10367
|
{
|
|
9626
10368
|
style: {
|
|
@@ -9631,19 +10373,19 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9631
10373
|
borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
|
|
9632
10374
|
},
|
|
9633
10375
|
children: [
|
|
9634
|
-
/* @__PURE__ */ (0,
|
|
9635
|
-
/* @__PURE__ */ (0,
|
|
9636
|
-
/* @__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" })
|
|
9637
10379
|
] }),
|
|
9638
|
-
/* @__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 })
|
|
9639
10381
|
]
|
|
9640
10382
|
}
|
|
9641
10383
|
),
|
|
9642
|
-
filteredItems.length === 0 ? /* @__PURE__ */ (0,
|
|
9643
|
-
/* @__PURE__ */ (0,
|
|
9644
|
-
/* @__PURE__ */ (0,
|
|
9645
|
-
/* @__PURE__ */ (0,
|
|
9646
|
-
] }) : /* @__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)(
|
|
9647
10389
|
"div",
|
|
9648
10390
|
{
|
|
9649
10391
|
style: {
|
|
@@ -9656,10 +10398,10 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9656
10398
|
},
|
|
9657
10399
|
onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
|
|
9658
10400
|
children: [
|
|
9659
|
-
/* @__PURE__ */ (0,
|
|
9660
|
-
/* @__PURE__ */ (0,
|
|
9661
|
-
/* @__PURE__ */ (0,
|
|
9662
|
-
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)(
|
|
9663
10405
|
"span",
|
|
9664
10406
|
{
|
|
9665
10407
|
style: {
|
|
@@ -9673,12 +10415,12 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9673
10415
|
children: memoryCategoryLabels[item.category]
|
|
9674
10416
|
}
|
|
9675
10417
|
),
|
|
9676
|
-
/* @__PURE__ */ (0,
|
|
10418
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
|
|
9677
10419
|
] }),
|
|
9678
|
-
/* @__PURE__ */ (0,
|
|
10420
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { fontSize: "13px", fontWeight: 500, color: "var(--chatllm-text, #1f2937)" }, children: item.key })
|
|
9679
10421
|
] }),
|
|
9680
|
-
/* @__PURE__ */ (0,
|
|
9681
|
-
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)(
|
|
9682
10424
|
"button",
|
|
9683
10425
|
{
|
|
9684
10426
|
onClick: (e) => {
|
|
@@ -9694,10 +10436,10 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9694
10436
|
opacity: 0.5
|
|
9695
10437
|
},
|
|
9696
10438
|
"aria-label": "\uBA54\uBAA8\uB9AC \uC0AD\uC81C",
|
|
9697
|
-
children: /* @__PURE__ */ (0,
|
|
10439
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
|
|
9698
10440
|
}
|
|
9699
10441
|
),
|
|
9700
|
-
/* @__PURE__ */ (0,
|
|
10442
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9701
10443
|
IconSvg,
|
|
9702
10444
|
{
|
|
9703
10445
|
name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
|
|
@@ -9707,7 +10449,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9707
10449
|
)
|
|
9708
10450
|
] })
|
|
9709
10451
|
] }),
|
|
9710
|
-
expandedId === item.id && /* @__PURE__ */ (0,
|
|
10452
|
+
expandedId === item.id && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9711
10453
|
"div",
|
|
9712
10454
|
{
|
|
9713
10455
|
style: {
|
|
@@ -9715,7 +10457,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9715
10457
|
paddingTop: "12px",
|
|
9716
10458
|
borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
|
|
9717
10459
|
},
|
|
9718
|
-
children: /* @__PURE__ */ (0,
|
|
10460
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
9719
10461
|
"p",
|
|
9720
10462
|
{
|
|
9721
10463
|
style: {
|
|
@@ -9734,7 +10476,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9734
10476
|
},
|
|
9735
10477
|
item.id
|
|
9736
10478
|
)) }),
|
|
9737
|
-
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)(
|
|
9738
10480
|
"button",
|
|
9739
10481
|
{
|
|
9740
10482
|
onClick: () => {
|
|
@@ -9750,8 +10492,8 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
|
|
|
9750
10492
|
};
|
|
9751
10493
|
|
|
9752
10494
|
// src/react/components/ProjectSettingsModal.tsx
|
|
9753
|
-
var
|
|
9754
|
-
var
|
|
10495
|
+
var import_react20 = require("react");
|
|
10496
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
9755
10497
|
var COLOR_PRESETS = [
|
|
9756
10498
|
"#3584FA",
|
|
9757
10499
|
"#7c3aed",
|
|
@@ -9771,12 +10513,12 @@ var ProjectSettingsModal = ({
|
|
|
9771
10513
|
onDeleteFile,
|
|
9772
10514
|
onDeleteProject
|
|
9773
10515
|
}) => {
|
|
9774
|
-
const [activeTab, setActiveTab] = (0,
|
|
9775
|
-
const [title, setTitle] = (0,
|
|
9776
|
-
const [description, setDescription] = (0,
|
|
9777
|
-
const [instructions, setInstructions] = (0,
|
|
9778
|
-
const [color, setColor] = (0,
|
|
9779
|
-
(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)(() => {
|
|
9780
10522
|
if (project) {
|
|
9781
10523
|
setTitle(project.title);
|
|
9782
10524
|
setDescription(project.description || "");
|
|
@@ -9832,7 +10574,7 @@ var ProjectSettingsModal = ({
|
|
|
9832
10574
|
cursor: "pointer",
|
|
9833
10575
|
fontFamily: "inherit"
|
|
9834
10576
|
});
|
|
9835
|
-
return /* @__PURE__ */ (0,
|
|
10577
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
9836
10578
|
"div",
|
|
9837
10579
|
{
|
|
9838
10580
|
style: {
|
|
@@ -9847,7 +10589,7 @@ var ProjectSettingsModal = ({
|
|
|
9847
10589
|
onClick: (e) => {
|
|
9848
10590
|
if (e.target === e.currentTarget) onClose();
|
|
9849
10591
|
},
|
|
9850
|
-
children: /* @__PURE__ */ (0,
|
|
10592
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
9851
10593
|
"div",
|
|
9852
10594
|
{
|
|
9853
10595
|
style: {
|
|
@@ -9861,7 +10603,7 @@ var ProjectSettingsModal = ({
|
|
|
9861
10603
|
overflow: "hidden"
|
|
9862
10604
|
},
|
|
9863
10605
|
children: [
|
|
9864
|
-
/* @__PURE__ */ (0,
|
|
10606
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
9865
10607
|
"div",
|
|
9866
10608
|
{
|
|
9867
10609
|
style: {
|
|
@@ -9871,8 +10613,8 @@ var ProjectSettingsModal = ({
|
|
|
9871
10613
|
padding: "20px 24px 0"
|
|
9872
10614
|
},
|
|
9873
10615
|
children: [
|
|
9874
|
-
/* @__PURE__ */ (0,
|
|
9875
|
-
/* @__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)(
|
|
9876
10618
|
"button",
|
|
9877
10619
|
{
|
|
9878
10620
|
onClick: onClose,
|
|
@@ -9885,13 +10627,13 @@ var ProjectSettingsModal = ({
|
|
|
9885
10627
|
alignItems: "center"
|
|
9886
10628
|
},
|
|
9887
10629
|
"aria-label": "\uB2EB\uAE30",
|
|
9888
|
-
children: /* @__PURE__ */ (0,
|
|
10630
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #999)" })
|
|
9889
10631
|
}
|
|
9890
10632
|
)
|
|
9891
10633
|
]
|
|
9892
10634
|
}
|
|
9893
10635
|
),
|
|
9894
|
-
/* @__PURE__ */ (0,
|
|
10636
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
9895
10637
|
"div",
|
|
9896
10638
|
{
|
|
9897
10639
|
style: {
|
|
@@ -9901,9 +10643,9 @@ var ProjectSettingsModal = ({
|
|
|
9901
10643
|
borderBottom: "1px solid var(--chatllm-border, #e0e0e0)"
|
|
9902
10644
|
},
|
|
9903
10645
|
children: [
|
|
9904
|
-
/* @__PURE__ */ (0,
|
|
9905
|
-
/* @__PURE__ */ (0,
|
|
9906
|
-
/* @__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: [
|
|
9907
10649
|
"\uD30C\uC77C (",
|
|
9908
10650
|
project.files.length,
|
|
9909
10651
|
")"
|
|
@@ -9911,11 +10653,11 @@ var ProjectSettingsModal = ({
|
|
|
9911
10653
|
]
|
|
9912
10654
|
}
|
|
9913
10655
|
),
|
|
9914
|
-
/* @__PURE__ */ (0,
|
|
9915
|
-
activeTab === "general" && /* @__PURE__ */ (0,
|
|
9916
|
-
/* @__PURE__ */ (0,
|
|
9917
|
-
/* @__PURE__ */ (0,
|
|
9918
|
-
/* @__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)(
|
|
9919
10661
|
"input",
|
|
9920
10662
|
{
|
|
9921
10663
|
type: "text",
|
|
@@ -9937,9 +10679,9 @@ var ProjectSettingsModal = ({
|
|
|
9937
10679
|
}
|
|
9938
10680
|
)
|
|
9939
10681
|
] }),
|
|
9940
|
-
/* @__PURE__ */ (0,
|
|
9941
|
-
/* @__PURE__ */ (0,
|
|
9942
|
-
/* @__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)(
|
|
9943
10685
|
"textarea",
|
|
9944
10686
|
{
|
|
9945
10687
|
value: description,
|
|
@@ -9960,9 +10702,9 @@ var ProjectSettingsModal = ({
|
|
|
9960
10702
|
}
|
|
9961
10703
|
)
|
|
9962
10704
|
] }),
|
|
9963
|
-
/* @__PURE__ */ (0,
|
|
9964
|
-
/* @__PURE__ */ (0,
|
|
9965
|
-
/* @__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)(
|
|
9966
10708
|
"button",
|
|
9967
10709
|
{
|
|
9968
10710
|
onClick: () => setColor(c),
|
|
@@ -9980,8 +10722,8 @@ var ProjectSettingsModal = ({
|
|
|
9980
10722
|
c
|
|
9981
10723
|
)) })
|
|
9982
10724
|
] }),
|
|
9983
|
-
/* @__PURE__ */ (0,
|
|
9984
|
-
!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)(
|
|
9985
10727
|
"button",
|
|
9986
10728
|
{
|
|
9987
10729
|
onClick: () => {
|
|
@@ -10004,7 +10746,7 @@ var ProjectSettingsModal = ({
|
|
|
10004
10746
|
children: "\uD504\uB85C\uC81D\uD2B8 \uC0AD\uC81C"
|
|
10005
10747
|
}
|
|
10006
10748
|
),
|
|
10007
|
-
/* @__PURE__ */ (0,
|
|
10749
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10008
10750
|
"button",
|
|
10009
10751
|
{
|
|
10010
10752
|
onClick: handleSaveGeneral,
|
|
@@ -10024,9 +10766,9 @@ var ProjectSettingsModal = ({
|
|
|
10024
10766
|
)
|
|
10025
10767
|
] })
|
|
10026
10768
|
] }),
|
|
10027
|
-
activeTab === "instructions" && /* @__PURE__ */ (0,
|
|
10028
|
-
/* @__PURE__ */ (0,
|
|
10029
|
-
/* @__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)(
|
|
10030
10772
|
"textarea",
|
|
10031
10773
|
{
|
|
10032
10774
|
value: instructions,
|
|
@@ -10047,7 +10789,7 @@ var ProjectSettingsModal = ({
|
|
|
10047
10789
|
}
|
|
10048
10790
|
}
|
|
10049
10791
|
),
|
|
10050
|
-
/* @__PURE__ */ (0,
|
|
10792
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { style: { display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10051
10793
|
"button",
|
|
10052
10794
|
{
|
|
10053
10795
|
onClick: handleSaveInstructions,
|
|
@@ -10066,10 +10808,10 @@ var ProjectSettingsModal = ({
|
|
|
10066
10808
|
}
|
|
10067
10809
|
) })
|
|
10068
10810
|
] }),
|
|
10069
|
-
activeTab === "files" && /* @__PURE__ */ (0,
|
|
10070
|
-
/* @__PURE__ */ (0,
|
|
10071
|
-
/* @__PURE__ */ (0,
|
|
10072
|
-
/* @__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)(
|
|
10073
10815
|
"button",
|
|
10074
10816
|
{
|
|
10075
10817
|
onClick: handleFileUpload,
|
|
@@ -10087,13 +10829,13 @@ var ProjectSettingsModal = ({
|
|
|
10087
10829
|
color: "var(--chatllm-text, #1a1a1a)"
|
|
10088
10830
|
},
|
|
10089
10831
|
children: [
|
|
10090
|
-
/* @__PURE__ */ (0,
|
|
10832
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconSvg, { name: "upload-line", size: 14 }),
|
|
10091
10833
|
"\uC5C5\uB85C\uB4DC"
|
|
10092
10834
|
]
|
|
10093
10835
|
}
|
|
10094
10836
|
)
|
|
10095
10837
|
] }),
|
|
10096
|
-
project.files.length === 0 ? /* @__PURE__ */ (0,
|
|
10838
|
+
project.files.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10097
10839
|
"div",
|
|
10098
10840
|
{
|
|
10099
10841
|
style: {
|
|
@@ -10106,7 +10848,7 @@ var ProjectSettingsModal = ({
|
|
|
10106
10848
|
},
|
|
10107
10849
|
children: "\uC544\uC9C1 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4"
|
|
10108
10850
|
}
|
|
10109
|
-
) : /* @__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)(
|
|
10110
10852
|
"div",
|
|
10111
10853
|
{
|
|
10112
10854
|
style: {
|
|
@@ -10118,10 +10860,10 @@ var ProjectSettingsModal = ({
|
|
|
10118
10860
|
borderRadius: "6px"
|
|
10119
10861
|
},
|
|
10120
10862
|
children: [
|
|
10121
|
-
/* @__PURE__ */ (0,
|
|
10122
|
-
/* @__PURE__ */ (0,
|
|
10123
|
-
/* @__PURE__ */ (0,
|
|
10124
|
-
/* @__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)(
|
|
10125
10867
|
"div",
|
|
10126
10868
|
{
|
|
10127
10869
|
style: {
|
|
@@ -10135,13 +10877,13 @@ var ProjectSettingsModal = ({
|
|
|
10135
10877
|
children: file.name
|
|
10136
10878
|
}
|
|
10137
10879
|
),
|
|
10138
|
-
/* @__PURE__ */ (0,
|
|
10880
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #999)" }, children: [
|
|
10139
10881
|
file.type,
|
|
10140
10882
|
formatSize(file.size) ? ` \xB7 ${formatSize(file.size)}` : ""
|
|
10141
10883
|
] })
|
|
10142
10884
|
] })
|
|
10143
10885
|
] }),
|
|
10144
|
-
/* @__PURE__ */ (0,
|
|
10886
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
10145
10887
|
"button",
|
|
10146
10888
|
{
|
|
10147
10889
|
onClick: () => onDeleteFile(project.id, file.id),
|
|
@@ -10162,7 +10904,7 @@ var ProjectSettingsModal = ({
|
|
|
10162
10904
|
e.currentTarget.style.opacity = "0.5";
|
|
10163
10905
|
},
|
|
10164
10906
|
"aria-label": `${file.name} \uC0AD\uC81C`,
|
|
10165
|
-
children: /* @__PURE__ */ (0,
|
|
10907
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconSvg, { name: "delete-bin-line", size: 16, color: "#dc2626" })
|
|
10166
10908
|
}
|
|
10167
10909
|
)
|
|
10168
10910
|
]
|
|
@@ -10179,14 +10921,14 @@ var ProjectSettingsModal = ({
|
|
|
10179
10921
|
};
|
|
10180
10922
|
|
|
10181
10923
|
// src/react/components/DisclaimerModal.tsx
|
|
10182
|
-
var
|
|
10924
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
10183
10925
|
var highlightStyle = {
|
|
10184
10926
|
color: "var(--chatllm-text, #1e293b)",
|
|
10185
10927
|
fontWeight: 600
|
|
10186
10928
|
};
|
|
10187
10929
|
var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
10188
10930
|
if (!isOpen) return null;
|
|
10189
|
-
return /* @__PURE__ */ (0,
|
|
10931
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10190
10932
|
"div",
|
|
10191
10933
|
{
|
|
10192
10934
|
className: "chatllm-disclaimer-overlay",
|
|
@@ -10200,7 +10942,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10200
10942
|
zIndex: 1e3
|
|
10201
10943
|
},
|
|
10202
10944
|
onClick: onClose,
|
|
10203
|
-
children: /* @__PURE__ */ (0,
|
|
10945
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
10204
10946
|
"div",
|
|
10205
10947
|
{
|
|
10206
10948
|
className: "chatllm-disclaimer-modal",
|
|
@@ -10218,7 +10960,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10218
10960
|
},
|
|
10219
10961
|
onClick: (e) => e.stopPropagation(),
|
|
10220
10962
|
children: [
|
|
10221
|
-
/* @__PURE__ */ (0,
|
|
10963
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
10222
10964
|
"div",
|
|
10223
10965
|
{
|
|
10224
10966
|
style: {
|
|
@@ -10229,9 +10971,9 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10229
10971
|
borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
|
|
10230
10972
|
},
|
|
10231
10973
|
children: [
|
|
10232
|
-
/* @__PURE__ */ (0,
|
|
10233
|
-
/* @__PURE__ */ (0,
|
|
10234
|
-
/* @__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)(
|
|
10235
10977
|
"h2",
|
|
10236
10978
|
{
|
|
10237
10979
|
style: {
|
|
@@ -10244,7 +10986,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10244
10986
|
}
|
|
10245
10987
|
)
|
|
10246
10988
|
] }),
|
|
10247
|
-
/* @__PURE__ */ (0,
|
|
10989
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10248
10990
|
"button",
|
|
10249
10991
|
{
|
|
10250
10992
|
onClick: onClose,
|
|
@@ -10259,13 +11001,13 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10259
11001
|
alignItems: "center",
|
|
10260
11002
|
justifyContent: "center"
|
|
10261
11003
|
},
|
|
10262
|
-
children: /* @__PURE__ */ (0,
|
|
11004
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #64748b)" })
|
|
10263
11005
|
}
|
|
10264
11006
|
)
|
|
10265
11007
|
]
|
|
10266
11008
|
}
|
|
10267
11009
|
),
|
|
10268
|
-
/* @__PURE__ */ (0,
|
|
11010
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
10269
11011
|
"div",
|
|
10270
11012
|
{
|
|
10271
11013
|
className: "chatllm-scrollbar",
|
|
@@ -10277,12 +11019,12 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10277
11019
|
color: "var(--chatllm-text-secondary, #475569)"
|
|
10278
11020
|
},
|
|
10279
11021
|
children: [
|
|
10280
|
-
/* @__PURE__ */ (0,
|
|
11022
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: "0 0 16px" }, children: [
|
|
10281
11023
|
"\uC800\uB294 \uC5EC\uB7EC\uBD84\uC758 \uC9C8\uBB38\uC5D0 ",
|
|
10282
|
-
/* @__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" }),
|
|
10283
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."
|
|
10284
11026
|
] }),
|
|
10285
|
-
/* @__PURE__ */ (0,
|
|
11027
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
10286
11028
|
"div",
|
|
10287
11029
|
{
|
|
10288
11030
|
style: {
|
|
@@ -10295,33 +11037,33 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10295
11037
|
lineHeight: 1.7
|
|
10296
11038
|
},
|
|
10297
11039
|
children: [
|
|
10298
|
-
/* @__PURE__ */ (0,
|
|
10299
|
-
/* @__PURE__ */ (0,
|
|
10300
|
-
/* @__PURE__ */ (0,
|
|
10301
|
-
/* @__PURE__ */ (0,
|
|
10302
|
-
/* @__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" })
|
|
10303
11045
|
] })
|
|
10304
11046
|
]
|
|
10305
11047
|
}
|
|
10306
11048
|
),
|
|
10307
|
-
/* @__PURE__ */ (0,
|
|
11049
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: "0 0 16px" }, children: [
|
|
10308
11050
|
"\uC774\uB7F0 \uD604\uC0C1\uC744 ",
|
|
10309
|
-
/* @__PURE__ */ (0,
|
|
11051
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: highlightStyle, children: "'\uD658\uAC01(Hallucination)'" }),
|
|
10310
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, ",
|
|
10311
|
-
/* @__PURE__ */ (0,
|
|
11053
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: highlightStyle, children: "\uD55C \uBC88 \uB354 \uD655\uC778" }),
|
|
10312
11054
|
"\uD574 \uC8FC\uC2DC\uBA74 \uAC10\uC0AC\uD558\uACA0\uC2B5\uB2C8\uB2E4."
|
|
10313
11055
|
] }),
|
|
10314
|
-
/* @__PURE__ */ (0,
|
|
10315
|
-
/* @__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" }),
|
|
10316
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."
|
|
10317
11059
|
] }),
|
|
10318
|
-
/* @__PURE__ */ (0,
|
|
11060
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: "0 0 16px" }, children: [
|
|
10319
11061
|
"\uC81C\uAC00 \uC6F9 \uAC80\uC0C9 \uACB0\uACFC\uB97C \uC54C\uB824\uB4DC\uB9B4 \uB54C\uB3C4,",
|
|
10320
11062
|
" ",
|
|
10321
|
-
/* @__PURE__ */ (0,
|
|
11063
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: highlightStyle, children: "\uC6D0\uBCF8 \uCD9C\uCC98\uB97C \uC9C1\uC811 \uD655\uC778" }),
|
|
10322
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."
|
|
10323
11065
|
] }),
|
|
10324
|
-
/* @__PURE__ */ (0,
|
|
11066
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10325
11067
|
"div",
|
|
10326
11068
|
{
|
|
10327
11069
|
style: {
|
|
@@ -10332,10 +11074,10 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10332
11074
|
lineHeight: 1.7,
|
|
10333
11075
|
textAlign: "center"
|
|
10334
11076
|
},
|
|
10335
|
-
children: /* @__PURE__ */ (0,
|
|
11077
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("p", { style: { margin: 0 }, children: [
|
|
10336
11078
|
"\uC800\uC5D0 \uB300\uD55C \uC758\uACAC\uC774\uB098 \uAC1C\uC120 \uC81C\uC548\uC774 \uC788\uC73C\uC2DC\uB2E4\uBA74",
|
|
10337
11079
|
" ",
|
|
10338
|
-
/* @__PURE__ */ (0,
|
|
11080
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
10339
11081
|
"a",
|
|
10340
11082
|
{
|
|
10341
11083
|
href: "mailto:info@gendive.ai",
|
|
@@ -10348,7 +11090,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10348
11090
|
}
|
|
10349
11091
|
),
|
|
10350
11092
|
"\uB85C \uC54C\uB824\uC8FC\uC138\uC694.",
|
|
10351
|
-
/* @__PURE__ */ (0,
|
|
11093
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("br", {}),
|
|
10352
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."
|
|
10353
11095
|
] })
|
|
10354
11096
|
}
|
|
@@ -10364,7 +11106,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
|
|
|
10364
11106
|
};
|
|
10365
11107
|
|
|
10366
11108
|
// src/react/ChatUI.tsx
|
|
10367
|
-
var
|
|
11109
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
10368
11110
|
var DEFAULT_ACTIONS = [];
|
|
10369
11111
|
var DEFAULT_TEMPLATES = [];
|
|
10370
11112
|
var DEFAULT_MODELS = [
|
|
@@ -10407,6 +11149,17 @@ var injectStyles = () => {
|
|
|
10407
11149
|
100% { transform: rotate(360deg); }
|
|
10408
11150
|
}
|
|
10409
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
|
+
|
|
10410
11163
|
@keyframes chatllm-welcome-exit {
|
|
10411
11164
|
from { opacity: 1; transform: translateY(0); }
|
|
10412
11165
|
to { opacity: 0; transform: translateY(-16px); }
|
|
@@ -10688,12 +11441,16 @@ var ChatUIView = ({
|
|
|
10688
11441
|
openProjectSettings,
|
|
10689
11442
|
closeProjectSettings,
|
|
10690
11443
|
projectMemory,
|
|
10691
|
-
isSessionsLoading
|
|
11444
|
+
isSessionsLoading,
|
|
11445
|
+
// Checklist
|
|
11446
|
+
handleChecklistAbort,
|
|
11447
|
+
handleChecklistRetry,
|
|
11448
|
+
handleChecklistSkip
|
|
10692
11449
|
} = state;
|
|
10693
|
-
const [disclaimerOpen, setDisclaimerOpen] =
|
|
10694
|
-
const [welcomeExiting, setWelcomeExiting] =
|
|
10695
|
-
const prevMessageCountRef =
|
|
10696
|
-
|
|
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(() => {
|
|
10697
11454
|
let timer;
|
|
10698
11455
|
if (prevMessageCountRef.current === 0 && messages.length > 0) {
|
|
10699
11456
|
setWelcomeExiting(true);
|
|
@@ -10717,7 +11474,7 @@ var ChatUIView = ({
|
|
|
10717
11474
|
const handleChoiceClick = (choice) => {
|
|
10718
11475
|
setInput(choice.text);
|
|
10719
11476
|
};
|
|
10720
|
-
const memoryItems =
|
|
11477
|
+
const memoryItems = import_react21.default.useMemo(() => {
|
|
10721
11478
|
if (!globalMemory?.state.entries) return [];
|
|
10722
11479
|
const items = [];
|
|
10723
11480
|
for (const [key, entry] of globalMemory.state.entries) {
|
|
@@ -10731,7 +11488,7 @@ var ChatUIView = ({
|
|
|
10731
11488
|
}
|
|
10732
11489
|
return items;
|
|
10733
11490
|
}, [globalMemory?.state.entries]);
|
|
10734
|
-
const projectMemoryItems =
|
|
11491
|
+
const projectMemoryItems = import_react21.default.useMemo(() => {
|
|
10735
11492
|
if (!projectMemory?.state.entries) return [];
|
|
10736
11493
|
const items = [];
|
|
10737
11494
|
for (const [key, entry] of projectMemory.state.entries) {
|
|
@@ -10746,7 +11503,7 @@ var ChatUIView = ({
|
|
|
10746
11503
|
return items;
|
|
10747
11504
|
}, [projectMemory?.state.entries]);
|
|
10748
11505
|
const themeClass = theme?.mode === "dark" ? "chatllm-dark" : "";
|
|
10749
|
-
return /* @__PURE__ */ (0,
|
|
11506
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
10750
11507
|
"div",
|
|
10751
11508
|
{
|
|
10752
11509
|
className: `chatllm-root ${themeClass} ${className}`,
|
|
@@ -10759,7 +11516,7 @@ var ChatUIView = ({
|
|
|
10759
11516
|
position: "relative"
|
|
10760
11517
|
},
|
|
10761
11518
|
children: [
|
|
10762
|
-
showSidebar && /* @__PURE__ */ (0,
|
|
11519
|
+
showSidebar && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10763
11520
|
ChatSidebar,
|
|
10764
11521
|
{
|
|
10765
11522
|
sessions,
|
|
@@ -10791,7 +11548,7 @@ var ChatUIView = ({
|
|
|
10791
11548
|
isLoading: isSessionsLoading
|
|
10792
11549
|
}
|
|
10793
11550
|
),
|
|
10794
|
-
/* @__PURE__ */ (0,
|
|
11551
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
10795
11552
|
"main",
|
|
10796
11553
|
{
|
|
10797
11554
|
style: {
|
|
@@ -10803,7 +11560,7 @@ var ChatUIView = ({
|
|
|
10803
11560
|
minWidth: 0
|
|
10804
11561
|
},
|
|
10805
11562
|
children: [
|
|
10806
|
-
/* @__PURE__ */ (0,
|
|
11563
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10807
11564
|
ChatHeader,
|
|
10808
11565
|
{
|
|
10809
11566
|
title: currentSession?.title || "\uC0C8 \uB300\uD654",
|
|
@@ -10817,7 +11574,7 @@ var ChatUIView = ({
|
|
|
10817
11574
|
showSettings
|
|
10818
11575
|
}
|
|
10819
11576
|
),
|
|
10820
|
-
(messages.length === 0 || welcomeExiting) && /* @__PURE__ */ (0,
|
|
11577
|
+
(messages.length === 0 || welcomeExiting) && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
10821
11578
|
"div",
|
|
10822
11579
|
{
|
|
10823
11580
|
style: {
|
|
@@ -10832,7 +11589,7 @@ var ChatUIView = ({
|
|
|
10832
11589
|
pointerEvents: welcomeExiting ? "none" : "auto"
|
|
10833
11590
|
},
|
|
10834
11591
|
children: [
|
|
10835
|
-
/* @__PURE__ */ (0,
|
|
11592
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10836
11593
|
"h1",
|
|
10837
11594
|
{
|
|
10838
11595
|
style: {
|
|
@@ -10846,7 +11603,7 @@ var ChatUIView = ({
|
|
|
10846
11603
|
children: greeting ? `${greeting} \u273A` : "\u273A \uBB34\uC5C7\uC744 \uC0DD\uAC01\uD574 \uBCFC\uAE4C\uC694?"
|
|
10847
11604
|
}
|
|
10848
11605
|
),
|
|
10849
|
-
/* @__PURE__ */ (0,
|
|
11606
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10850
11607
|
ChatInput,
|
|
10851
11608
|
{
|
|
10852
11609
|
value: input,
|
|
@@ -10874,7 +11631,7 @@ var ChatUIView = ({
|
|
|
10874
11631
|
inline: true
|
|
10875
11632
|
}
|
|
10876
11633
|
) }),
|
|
10877
|
-
suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ (0,
|
|
11634
|
+
suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10878
11635
|
"div",
|
|
10879
11636
|
{
|
|
10880
11637
|
style: {
|
|
@@ -10884,7 +11641,7 @@ var ChatUIView = ({
|
|
|
10884
11641
|
justifyContent: "center",
|
|
10885
11642
|
maxWidth: "680px"
|
|
10886
11643
|
},
|
|
10887
|
-
children: suggestedPrompts.map((sp) => /* @__PURE__ */ (0,
|
|
11644
|
+
children: suggestedPrompts.map((sp) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
10888
11645
|
"button",
|
|
10889
11646
|
{
|
|
10890
11647
|
onClick: () => setInput(sp.prompt),
|
|
@@ -10903,7 +11660,7 @@ var ChatUIView = ({
|
|
|
10903
11660
|
transition: "all 0.2s"
|
|
10904
11661
|
},
|
|
10905
11662
|
children: [
|
|
10906
|
-
sp.icon && /* @__PURE__ */ (0,
|
|
11663
|
+
sp.icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
|
|
10907
11664
|
sp.label
|
|
10908
11665
|
]
|
|
10909
11666
|
},
|
|
@@ -10914,8 +11671,8 @@ var ChatUIView = ({
|
|
|
10914
11671
|
]
|
|
10915
11672
|
}
|
|
10916
11673
|
),
|
|
10917
|
-
messages.length > 0 && /* @__PURE__ */ (0,
|
|
10918
|
-
/* @__PURE__ */ (0,
|
|
11674
|
+
messages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
|
|
11675
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10919
11676
|
MessageList,
|
|
10920
11677
|
{
|
|
10921
11678
|
messages,
|
|
@@ -10934,10 +11691,13 @@ var ChatUIView = ({
|
|
|
10934
11691
|
showThinking,
|
|
10935
11692
|
thinkingDefaultOpen,
|
|
10936
11693
|
loadingAlternativeFor,
|
|
10937
|
-
onPollSubmit: handlePollSubmit
|
|
11694
|
+
onPollSubmit: handlePollSubmit,
|
|
11695
|
+
onChecklistAbort: handleChecklistAbort,
|
|
11696
|
+
onChecklistRetry: handleChecklistRetry,
|
|
11697
|
+
onChecklistSkip: handleChecklistSkip
|
|
10938
11698
|
}
|
|
10939
11699
|
),
|
|
10940
|
-
/* @__PURE__ */ (0,
|
|
11700
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10941
11701
|
ChatInput,
|
|
10942
11702
|
{
|
|
10943
11703
|
value: input,
|
|
@@ -10968,7 +11728,7 @@ var ChatUIView = ({
|
|
|
10968
11728
|
]
|
|
10969
11729
|
}
|
|
10970
11730
|
),
|
|
10971
|
-
showSettings && /* @__PURE__ */ (0,
|
|
11731
|
+
showSettings && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10972
11732
|
SettingsModal,
|
|
10973
11733
|
{
|
|
10974
11734
|
isOpen: settingsOpen,
|
|
@@ -10995,7 +11755,7 @@ var ChatUIView = ({
|
|
|
10995
11755
|
currentProjectTitle: currentProject?.title
|
|
10996
11756
|
}
|
|
10997
11757
|
),
|
|
10998
|
-
/* @__PURE__ */ (0,
|
|
11758
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
10999
11759
|
ProjectSettingsModal,
|
|
11000
11760
|
{
|
|
11001
11761
|
isOpen: projectSettingsOpen,
|
|
@@ -11007,7 +11767,7 @@ var ChatUIView = ({
|
|
|
11007
11767
|
onDeleteProject: deleteProject
|
|
11008
11768
|
}
|
|
11009
11769
|
),
|
|
11010
|
-
/* @__PURE__ */ (0,
|
|
11770
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
|
|
11011
11771
|
]
|
|
11012
11772
|
}
|
|
11013
11773
|
);
|
|
@@ -11110,7 +11870,7 @@ var ChatUIWithHook = ({
|
|
|
11110
11870
|
onDeleteProjectFile
|
|
11111
11871
|
};
|
|
11112
11872
|
const state = useChatUI(hookOptions);
|
|
11113
|
-
return /* @__PURE__ */ (0,
|
|
11873
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
11114
11874
|
ChatUIView,
|
|
11115
11875
|
{
|
|
11116
11876
|
state,
|
|
@@ -11158,7 +11918,7 @@ var ChatUI = (props) => {
|
|
|
11158
11918
|
deepResearch,
|
|
11159
11919
|
suggestedPrompts: chatStateSuggestedPrompts
|
|
11160
11920
|
} = props;
|
|
11161
|
-
return /* @__PURE__ */ (0,
|
|
11921
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
11162
11922
|
ChatUIView,
|
|
11163
11923
|
{
|
|
11164
11924
|
state: props.chatState,
|
|
@@ -11183,11 +11943,11 @@ var ChatUI = (props) => {
|
|
|
11183
11943
|
}
|
|
11184
11944
|
);
|
|
11185
11945
|
}
|
|
11186
|
-
return /* @__PURE__ */ (0,
|
|
11946
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ChatUIWithHook, { ...props });
|
|
11187
11947
|
};
|
|
11188
11948
|
|
|
11189
11949
|
// src/react/hooks/useDeepResearch.ts
|
|
11190
|
-
var
|
|
11950
|
+
var import_react22 = require("react");
|
|
11191
11951
|
var REPORT_GENERATION_PROMPT2 = `\uB2F9\uC2E0\uC740 \uB9AC\uC11C\uCE58 \uBCF4\uACE0\uC11C \uC791\uC131 \uC804\uBB38\uAC00\uC785\uB2C8\uB2E4.
|
|
11192
11952
|
|
|
11193
11953
|
<collected_sources>
|
|
@@ -11238,10 +11998,10 @@ var QUERY_ANALYSIS_PROMPT2 = `\uC0AC\uC6A9\uC790 \uC9C8\uBB38\uC744 \uBD84\uC11D
|
|
|
11238
11998
|
- JSON \uC678 \uB2E4\uB978 \uD14D\uC2A4\uD2B8 \uCD9C\uB825 \uAE08\uC9C0`;
|
|
11239
11999
|
var useDeepResearch = (options) => {
|
|
11240
12000
|
const { onWebSearch, onExtractContent, apiEndpoint, apiKey, model, provider } = options;
|
|
11241
|
-
const [isResearching, setIsResearching] = (0,
|
|
11242
|
-
const [progress, setProgress] = (0,
|
|
11243
|
-
const abortControllerRef = (0,
|
|
11244
|
-
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)(
|
|
11245
12005
|
async (prompt, stream = false) => {
|
|
11246
12006
|
const response = await fetch(apiEndpoint, {
|
|
11247
12007
|
method: "POST",
|
|
@@ -11268,7 +12028,7 @@ var useDeepResearch = (options) => {
|
|
|
11268
12028
|
},
|
|
11269
12029
|
[apiEndpoint, apiKey, model, provider]
|
|
11270
12030
|
);
|
|
11271
|
-
const analyzeQuery2 = (0,
|
|
12031
|
+
const analyzeQuery2 = (0, import_react22.useCallback)(
|
|
11272
12032
|
async (query) => {
|
|
11273
12033
|
const prompt = QUERY_ANALYSIS_PROMPT2.replace("{question}", query);
|
|
11274
12034
|
const response = await callLLM2(prompt);
|
|
@@ -11287,7 +12047,7 @@ var useDeepResearch = (options) => {
|
|
|
11287
12047
|
},
|
|
11288
12048
|
[callLLM2]
|
|
11289
12049
|
);
|
|
11290
|
-
const runSubAgent2 = (0,
|
|
12050
|
+
const runSubAgent2 = (0, import_react22.useCallback)(
|
|
11291
12051
|
async (topic, queries, agentId, updateProgress) => {
|
|
11292
12052
|
updateProgress({ status: "searching", searchCount: 0, resultsCount: 0 });
|
|
11293
12053
|
const allResults = [];
|
|
@@ -11326,7 +12086,7 @@ var useDeepResearch = (options) => {
|
|
|
11326
12086
|
},
|
|
11327
12087
|
[onWebSearch, onExtractContent]
|
|
11328
12088
|
);
|
|
11329
|
-
const generateReport2 = (0,
|
|
12089
|
+
const generateReport2 = (0, import_react22.useCallback)(
|
|
11330
12090
|
async (query, results, onStreamContent) => {
|
|
11331
12091
|
const allSources = [];
|
|
11332
12092
|
const sourcesForPrompt = [];
|
|
@@ -11384,7 +12144,7 @@ var useDeepResearch = (options) => {
|
|
|
11384
12144
|
},
|
|
11385
12145
|
[callLLM2]
|
|
11386
12146
|
);
|
|
11387
|
-
const runDeepResearch = (0,
|
|
12147
|
+
const runDeepResearch = (0, import_react22.useCallback)(
|
|
11388
12148
|
async (query, onStreamContent) => {
|
|
11389
12149
|
abortControllerRef.current = new AbortController();
|
|
11390
12150
|
setIsResearching(true);
|
|
@@ -11487,7 +12247,7 @@ var useDeepResearch = (options) => {
|
|
|
11487
12247
|
},
|
|
11488
12248
|
[analyzeQuery2, runSubAgent2, generateReport2]
|
|
11489
12249
|
);
|
|
11490
|
-
const stopResearch = (0,
|
|
12250
|
+
const stopResearch = (0, import_react22.useCallback)(() => {
|
|
11491
12251
|
abortControllerRef.current?.abort();
|
|
11492
12252
|
setIsResearching(false);
|
|
11493
12253
|
setProgress(null);
|
|
@@ -11501,7 +12261,7 @@ var useDeepResearch = (options) => {
|
|
|
11501
12261
|
};
|
|
11502
12262
|
|
|
11503
12263
|
// src/react/components/EmptyState.tsx
|
|
11504
|
-
var
|
|
12264
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
11505
12265
|
var EmptyState = ({
|
|
11506
12266
|
greeting,
|
|
11507
12267
|
templates = [],
|
|
@@ -11519,7 +12279,7 @@ var EmptyState = ({
|
|
|
11519
12279
|
return iconMap[icon] || "sparkling-line";
|
|
11520
12280
|
};
|
|
11521
12281
|
const hasContent = actions.length > 0 || templates.length > 0;
|
|
11522
|
-
return /* @__PURE__ */ (0,
|
|
12282
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
11523
12283
|
"div",
|
|
11524
12284
|
{
|
|
11525
12285
|
className: "chatllm-empty-state",
|
|
@@ -11534,7 +12294,7 @@ var EmptyState = ({
|
|
|
11534
12294
|
textAlign: "center"
|
|
11535
12295
|
},
|
|
11536
12296
|
children: [
|
|
11537
|
-
/* @__PURE__ */ (0,
|
|
12297
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
11538
12298
|
"div",
|
|
11539
12299
|
{
|
|
11540
12300
|
className: "chatllm-sheet",
|
|
@@ -11548,10 +12308,10 @@ var EmptyState = ({
|
|
|
11548
12308
|
marginBottom: "32px",
|
|
11549
12309
|
color: "var(--chatllm-primary)"
|
|
11550
12310
|
},
|
|
11551
|
-
children: /* @__PURE__ */ (0,
|
|
12311
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(IconSvg, { name: "chat-1-line", size: 40 })
|
|
11552
12312
|
}
|
|
11553
12313
|
),
|
|
11554
|
-
/* @__PURE__ */ (0,
|
|
12314
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
11555
12315
|
"h1",
|
|
11556
12316
|
{
|
|
11557
12317
|
style: {
|
|
@@ -11564,7 +12324,7 @@ var EmptyState = ({
|
|
|
11564
12324
|
children: "How can I help you today?"
|
|
11565
12325
|
}
|
|
11566
12326
|
),
|
|
11567
|
-
(actions.length > 0 || templates.length > 0) && /* @__PURE__ */ (0,
|
|
12327
|
+
(actions.length > 0 || templates.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
11568
12328
|
"div",
|
|
11569
12329
|
{
|
|
11570
12330
|
style: {
|
|
@@ -11576,7 +12336,7 @@ var EmptyState = ({
|
|
|
11576
12336
|
marginBottom: "48px"
|
|
11577
12337
|
},
|
|
11578
12338
|
children: [
|
|
11579
|
-
actions.map((action) => /* @__PURE__ */ (0,
|
|
12339
|
+
actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
11580
12340
|
"button",
|
|
11581
12341
|
{
|
|
11582
12342
|
onClick: () => onActionSelect?.(action),
|
|
@@ -11590,7 +12350,7 @@ var EmptyState = ({
|
|
|
11590
12350
|
fontWeight: 500
|
|
11591
12351
|
},
|
|
11592
12352
|
children: [
|
|
11593
|
-
/* @__PURE__ */ (0,
|
|
12353
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
11594
12354
|
IconSvg,
|
|
11595
12355
|
{
|
|
11596
12356
|
name: getActionIcon(action.icon),
|
|
@@ -11603,7 +12363,7 @@ var EmptyState = ({
|
|
|
11603
12363
|
},
|
|
11604
12364
|
action.id
|
|
11605
12365
|
)),
|
|
11606
|
-
templates.slice(0, 4).map((template) => /* @__PURE__ */ (0,
|
|
12366
|
+
templates.slice(0, 4).map((template) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
11607
12367
|
"button",
|
|
11608
12368
|
{
|
|
11609
12369
|
onClick: () => onTemplateClick(template),
|
|
@@ -11617,7 +12377,7 @@ var EmptyState = ({
|
|
|
11617
12377
|
fontWeight: 500
|
|
11618
12378
|
},
|
|
11619
12379
|
children: [
|
|
11620
|
-
/* @__PURE__ */ (0,
|
|
12380
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
11621
12381
|
IconSvg,
|
|
11622
12382
|
{
|
|
11623
12383
|
name: "sparkling-line",
|
|
@@ -11639,8 +12399,8 @@ var EmptyState = ({
|
|
|
11639
12399
|
};
|
|
11640
12400
|
|
|
11641
12401
|
// src/react/components/MemoryPanel.tsx
|
|
11642
|
-
var
|
|
11643
|
-
var
|
|
12402
|
+
var import_react23 = require("react");
|
|
12403
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
11644
12404
|
var categoryLabels = {
|
|
11645
12405
|
fact: "\uC0AC\uC6A9\uC790 \uC815\uBCF4",
|
|
11646
12406
|
skill: "\uC804\uBB38 \uBD84\uC57C/\uAE30\uC220",
|
|
@@ -11659,8 +12419,8 @@ var MemoryPanel = ({
|
|
|
11659
12419
|
isOpen,
|
|
11660
12420
|
onToggle
|
|
11661
12421
|
}) => {
|
|
11662
|
-
const [expandedId, setExpandedId] = (0,
|
|
11663
|
-
const [activeTab, setActiveTab] = (0,
|
|
12422
|
+
const [expandedId, setExpandedId] = (0, import_react23.useState)(null);
|
|
12423
|
+
const [activeTab, setActiveTab] = (0, import_react23.useState)("all");
|
|
11664
12424
|
const filteredItems = activeTab === "all" ? items : items.filter((item) => item.category === activeTab);
|
|
11665
12425
|
const formatDate = (timestamp) => {
|
|
11666
12426
|
const date = new Date(timestamp);
|
|
@@ -11672,7 +12432,7 @@ var MemoryPanel = ({
|
|
|
11672
12432
|
});
|
|
11673
12433
|
};
|
|
11674
12434
|
if (!isOpen) {
|
|
11675
|
-
return /* @__PURE__ */ (0,
|
|
12435
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11676
12436
|
"button",
|
|
11677
12437
|
{
|
|
11678
12438
|
onClick: onToggle,
|
|
@@ -11692,11 +12452,11 @@ var MemoryPanel = ({
|
|
|
11692
12452
|
justifyContent: "center",
|
|
11693
12453
|
zIndex: 100
|
|
11694
12454
|
},
|
|
11695
|
-
children: /* @__PURE__ */ (0,
|
|
12455
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
|
|
11696
12456
|
}
|
|
11697
12457
|
);
|
|
11698
12458
|
}
|
|
11699
|
-
return /* @__PURE__ */ (0,
|
|
12459
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11700
12460
|
"div",
|
|
11701
12461
|
{
|
|
11702
12462
|
className: "chatllm-memory-panel",
|
|
@@ -11716,7 +12476,7 @@ var MemoryPanel = ({
|
|
|
11716
12476
|
zIndex: 100
|
|
11717
12477
|
},
|
|
11718
12478
|
children: [
|
|
11719
|
-
/* @__PURE__ */ (0,
|
|
12479
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11720
12480
|
"div",
|
|
11721
12481
|
{
|
|
11722
12482
|
style: {
|
|
@@ -11727,8 +12487,8 @@ var MemoryPanel = ({
|
|
|
11727
12487
|
borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
|
|
11728
12488
|
},
|
|
11729
12489
|
children: [
|
|
11730
|
-
/* @__PURE__ */ (0,
|
|
11731
|
-
/* @__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)(
|
|
11732
12492
|
"div",
|
|
11733
12493
|
{
|
|
11734
12494
|
style: {
|
|
@@ -11740,19 +12500,19 @@ var MemoryPanel = ({
|
|
|
11740
12500
|
alignItems: "center",
|
|
11741
12501
|
justifyContent: "center"
|
|
11742
12502
|
},
|
|
11743
|
-
children: /* @__PURE__ */ (0,
|
|
12503
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
|
|
11744
12504
|
}
|
|
11745
12505
|
),
|
|
11746
|
-
/* @__PURE__ */ (0,
|
|
11747
|
-
/* @__PURE__ */ (0,
|
|
11748
|
-
/* @__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: [
|
|
11749
12509
|
items.length,
|
|
11750
12510
|
"\uAC1C \uD56D\uBAA9"
|
|
11751
12511
|
] })
|
|
11752
12512
|
] })
|
|
11753
12513
|
] }),
|
|
11754
|
-
/* @__PURE__ */ (0,
|
|
11755
|
-
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)(
|
|
11756
12516
|
"button",
|
|
11757
12517
|
{
|
|
11758
12518
|
onClick: onClearAll,
|
|
@@ -11764,10 +12524,10 @@ var MemoryPanel = ({
|
|
|
11764
12524
|
cursor: "pointer"
|
|
11765
12525
|
},
|
|
11766
12526
|
title: "\uC804\uCCB4 \uC0AD\uC81C",
|
|
11767
|
-
children: /* @__PURE__ */ (0,
|
|
12527
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
|
|
11768
12528
|
}
|
|
11769
12529
|
),
|
|
11770
|
-
/* @__PURE__ */ (0,
|
|
12530
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11771
12531
|
"button",
|
|
11772
12532
|
{
|
|
11773
12533
|
onClick: onToggle,
|
|
@@ -11778,14 +12538,14 @@ var MemoryPanel = ({
|
|
|
11778
12538
|
borderRadius: "8px",
|
|
11779
12539
|
cursor: "pointer"
|
|
11780
12540
|
},
|
|
11781
|
-
children: /* @__PURE__ */ (0,
|
|
12541
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
|
|
11782
12542
|
}
|
|
11783
12543
|
)
|
|
11784
12544
|
] })
|
|
11785
12545
|
]
|
|
11786
12546
|
}
|
|
11787
12547
|
),
|
|
11788
|
-
/* @__PURE__ */ (0,
|
|
12548
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11789
12549
|
"div",
|
|
11790
12550
|
{
|
|
11791
12551
|
style: {
|
|
@@ -11795,7 +12555,7 @@ var MemoryPanel = ({
|
|
|
11795
12555
|
borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)",
|
|
11796
12556
|
overflowX: "auto"
|
|
11797
12557
|
},
|
|
11798
|
-
children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ (0,
|
|
12558
|
+
children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11799
12559
|
"button",
|
|
11800
12560
|
{
|
|
11801
12561
|
onClick: () => setActiveTab(tab),
|
|
@@ -11816,8 +12576,8 @@ var MemoryPanel = ({
|
|
|
11816
12576
|
))
|
|
11817
12577
|
}
|
|
11818
12578
|
),
|
|
11819
|
-
/* @__PURE__ */ (0,
|
|
11820
|
-
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)(
|
|
11821
12581
|
"div",
|
|
11822
12582
|
{
|
|
11823
12583
|
style: {
|
|
@@ -11828,7 +12588,7 @@ var MemoryPanel = ({
|
|
|
11828
12588
|
borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
|
|
11829
12589
|
},
|
|
11830
12590
|
children: [
|
|
11831
|
-
/* @__PURE__ */ (0,
|
|
12591
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11832
12592
|
"div",
|
|
11833
12593
|
{
|
|
11834
12594
|
style: {
|
|
@@ -11838,12 +12598,12 @@ var MemoryPanel = ({
|
|
|
11838
12598
|
marginBottom: "8px"
|
|
11839
12599
|
},
|
|
11840
12600
|
children: [
|
|
11841
|
-
/* @__PURE__ */ (0,
|
|
11842
|
-
/* @__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" })
|
|
11843
12603
|
]
|
|
11844
12604
|
}
|
|
11845
12605
|
),
|
|
11846
|
-
/* @__PURE__ */ (0,
|
|
12606
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11847
12607
|
"p",
|
|
11848
12608
|
{
|
|
11849
12609
|
style: {
|
|
@@ -11858,7 +12618,7 @@ var MemoryPanel = ({
|
|
|
11858
12618
|
]
|
|
11859
12619
|
}
|
|
11860
12620
|
),
|
|
11861
|
-
filteredItems.length === 0 ? /* @__PURE__ */ (0,
|
|
12621
|
+
filteredItems.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
11862
12622
|
"div",
|
|
11863
12623
|
{
|
|
11864
12624
|
style: {
|
|
@@ -11867,11 +12627,11 @@ var MemoryPanel = ({
|
|
|
11867
12627
|
color: "var(--chatllm-text-muted, #9ca3af)"
|
|
11868
12628
|
},
|
|
11869
12629
|
children: [
|
|
11870
|
-
/* @__PURE__ */ (0,
|
|
11871
|
-
/* @__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" })
|
|
11872
12632
|
]
|
|
11873
12633
|
}
|
|
11874
|
-
) : /* @__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)(
|
|
11875
12635
|
"div",
|
|
11876
12636
|
{
|
|
11877
12637
|
style: {
|
|
@@ -11884,10 +12644,10 @@ var MemoryPanel = ({
|
|
|
11884
12644
|
},
|
|
11885
12645
|
onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
|
|
11886
12646
|
children: [
|
|
11887
|
-
/* @__PURE__ */ (0,
|
|
11888
|
-
/* @__PURE__ */ (0,
|
|
11889
|
-
/* @__PURE__ */ (0,
|
|
11890
|
-
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)(
|
|
11891
12651
|
"span",
|
|
11892
12652
|
{
|
|
11893
12653
|
style: {
|
|
@@ -11901,9 +12661,9 @@ var MemoryPanel = ({
|
|
|
11901
12661
|
children: categoryLabels[item.category]
|
|
11902
12662
|
}
|
|
11903
12663
|
),
|
|
11904
|
-
/* @__PURE__ */ (0,
|
|
12664
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
|
|
11905
12665
|
] }),
|
|
11906
|
-
/* @__PURE__ */ (0,
|
|
12666
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11907
12667
|
"div",
|
|
11908
12668
|
{
|
|
11909
12669
|
style: {
|
|
@@ -11915,8 +12675,8 @@ var MemoryPanel = ({
|
|
|
11915
12675
|
}
|
|
11916
12676
|
)
|
|
11917
12677
|
] }),
|
|
11918
|
-
/* @__PURE__ */ (0,
|
|
11919
|
-
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)(
|
|
11920
12680
|
"button",
|
|
11921
12681
|
{
|
|
11922
12682
|
onClick: (e) => {
|
|
@@ -11931,10 +12691,10 @@ var MemoryPanel = ({
|
|
|
11931
12691
|
cursor: "pointer",
|
|
11932
12692
|
opacity: 0.5
|
|
11933
12693
|
},
|
|
11934
|
-
children: /* @__PURE__ */ (0,
|
|
12694
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
|
|
11935
12695
|
}
|
|
11936
12696
|
),
|
|
11937
|
-
/* @__PURE__ */ (0,
|
|
12697
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11938
12698
|
IconSvg,
|
|
11939
12699
|
{
|
|
11940
12700
|
name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
|
|
@@ -11944,7 +12704,7 @@ var MemoryPanel = ({
|
|
|
11944
12704
|
)
|
|
11945
12705
|
] })
|
|
11946
12706
|
] }),
|
|
11947
|
-
expandedId === item.id && /* @__PURE__ */ (0,
|
|
12707
|
+
expandedId === item.id && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11948
12708
|
"div",
|
|
11949
12709
|
{
|
|
11950
12710
|
style: {
|
|
@@ -11952,7 +12712,7 @@ var MemoryPanel = ({
|
|
|
11952
12712
|
paddingTop: "12px",
|
|
11953
12713
|
borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
|
|
11954
12714
|
},
|
|
11955
|
-
children: /* @__PURE__ */ (0,
|
|
12715
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
11956
12716
|
"p",
|
|
11957
12717
|
{
|
|
11958
12718
|
style: {
|
|
@@ -11982,6 +12742,7 @@ var MemoryPanel = ({
|
|
|
11982
12742
|
ChatInput,
|
|
11983
12743
|
ChatSidebar,
|
|
11984
12744
|
ChatUI,
|
|
12745
|
+
ChecklistCard,
|
|
11985
12746
|
ContentPartRenderer,
|
|
11986
12747
|
DEFAULT_PROJECT_ID,
|
|
11987
12748
|
DEFAULT_PROJECT_TITLE,
|