@gendive/chatllm 0.17.23 → 0.17.25

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