@gendive/chatllm 0.17.24 → 0.17.25

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