@gendive/chatllm 0.21.4 → 0.21.5

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.
@@ -1,5 +1,5 @@
1
1
  // src/react/ChatUI.tsx
2
- import React16 from "react";
2
+ import React17 from "react";
3
3
 
4
4
  // src/react/hooks/useChatUI.ts
5
5
  import { useState as useState6, useRef as useRef5, useCallback as useCallback6, useEffect as useEffect4, useMemo as useMemo3 } from "react";
@@ -1992,6 +1992,58 @@ var parseChecklistFromContent = (content) => {
1992
1992
  };
1993
1993
  };
1994
1994
 
1995
+ // src/react/utils/artifactParser.ts
1996
+ var ARTIFACT_LANGUAGE_VALUES = ["html", "svg", "mermaid"];
1997
+ var parseArtifactTags = (content) => {
1998
+ const artifactRegex = /<artifact(?:\s+title=["']([^"']*)["'])?(?:\s+language=["']([^"']*)["'])?(?:\s+title=["']([^"']*)["'])?>([\s\S]*?)<\/artifact>/gi;
1999
+ const artifacts = [];
2000
+ let cleanContent = content;
2001
+ let match;
2002
+ while ((match = artifactRegex.exec(content)) !== null) {
2003
+ const title = match[1] || match[3] || void 0;
2004
+ const rawLanguage = (match[2] || "html").toLowerCase();
2005
+ const language = ARTIFACT_LANGUAGE_VALUES.includes(
2006
+ rawLanguage
2007
+ ) ? rawLanguage : "html";
2008
+ const code = match[4].trim();
2009
+ if (code) {
2010
+ artifacts.push({ type: "artifact", title, language, code });
2011
+ }
2012
+ cleanContent = cleanContent.replace(match[0], "");
2013
+ }
2014
+ return { artifacts, cleanContent };
2015
+ };
2016
+ var parseCodeBlockArtifacts = (content) => {
2017
+ const codeBlockRegex = /```(mermaid|svg)\s*\n([\s\S]*?)```/gi;
2018
+ const artifacts = [];
2019
+ let cleanContent = content;
2020
+ let match;
2021
+ while ((match = codeBlockRegex.exec(content)) !== null) {
2022
+ const rawLanguage = match[1].toLowerCase();
2023
+ const language = ARTIFACT_LANGUAGE_VALUES.includes(
2024
+ rawLanguage
2025
+ ) ? rawLanguage : "html";
2026
+ const code = match[2].trim();
2027
+ if (code) {
2028
+ artifacts.push({ type: "artifact", language, code });
2029
+ }
2030
+ cleanContent = cleanContent.replace(match[0], "");
2031
+ }
2032
+ return { artifacts, cleanContent };
2033
+ };
2034
+ var parseArtifactsFromContent = (content) => {
2035
+ const tagResult = parseArtifactTags(content);
2036
+ const codeBlockResult = parseCodeBlockArtifacts(tagResult.cleanContent);
2037
+ const allArtifacts = [...tagResult.artifacts, ...codeBlockResult.artifacts];
2038
+ const cleanContent = codeBlockResult.cleanContent.replace(/\n{3,}/g, "\n\n").trim();
2039
+ return { artifacts: allArtifacts, cleanContent };
2040
+ };
2041
+ var hasArtifactTag = (content) => {
2042
+ if (/<artifact[\s>]/i.test(content) && /<\/artifact>/i.test(content)) return true;
2043
+ if (/```(?:mermaid|svg)\s*\n[\s\S]*?```/i.test(content)) return true;
2044
+ return false;
2045
+ };
2046
+
1995
2047
  // src/react/utils/contextRefParser.ts
1996
2048
  var parseContextRefs = (content) => {
1997
2049
  const refRegex = /<ref_context\s+id=["']([^"']+)["']\s*\/>/gi;
@@ -2693,6 +2745,47 @@ ${projectMemoryContext}`);
2693
2745
  const shouldIncludePoll = promptControl.includePoll !== false;
2694
2746
  const shouldIncludeChecklist = promptControl.includeChecklist !== false;
2695
2747
  const shouldIncludeCapabilityGuide = promptControl.includeCapabilityGuide !== false;
2748
+ parts.push(`
2749
+ ## \uC2DC\uAC01\uD654 \uAE30\uB2A5
2750
+
2751
+ \uB370\uC774\uD130, \uD504\uB85C\uC138\uC2A4, \uAD6C\uC870\uB97C \uC124\uBA85\uD560 \uB54C \uC2DC\uAC01\uC801 \uD45C\uD604\uC774 \uB354 \uD6A8\uACFC\uC801\uC774\uBA74 \uC790\uB3D9\uC73C\uB85C \uC2DC\uAC01\uD654\uB97C \uC0DD\uC131\uD558\uC138\uC694.
2752
+ **\uC911\uC694: \uC808\uB300 ASCII art\uB098 \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uB2E4\uC774\uC5B4\uADF8\uB7A8\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.**
2753
+
2754
+ **\uD615\uC2DD:**
2755
+ - mermaid, svg \u2192 \uB9C8\uD06C\uB2E4\uC6B4 \uCF54\uB4DC\uBE14\uB85D(\`\`\`mermaid, \`\`\`svg) \uC0AC\uC6A9
2756
+ - html (\uCC28\uD2B8/\uC778\uD130\uB799\uD2F0\uBE0C) \u2192 \uBC18\uB4DC\uC2DC <artifact> \uD0DC\uADF8 \uC0AC\uC6A9
2757
+
2758
+ **\uC0AC\uC6A9 \uC2DC\uC810 (\uC790\uB3D9 \uD310\uB2E8):**
2759
+ - \uD504\uB85C\uC138\uC2A4/\uD750\uB984 \uC124\uBA85 \u2192 mermaid \uD50C\uB85C\uCC28\uD2B8
2760
+ - \uC2DC\uC2A4\uD15C \uAD6C\uC870/\uAD00\uACC4 \uC124\uBA85 \u2192 mermaid \uB2E4\uC774\uC5B4\uADF8\uB7A8
2761
+ - \uB370\uC774\uD130 \uBE44\uAD50/\uCD94\uC774 \u2192 html (Chart.js CDN \uC0AC\uC6A9, <artifact> \uD0DC\uADF8)
2762
+ - \uC544\uC774\uCF58/\uB85C\uACE0/\uC77C\uB7EC\uC2A4\uD2B8 \u2192 svg
2763
+
2764
+ **mermaid \uC608\uC2DC:**
2765
+ \`\`\`mermaid
2766
+ graph TD
2767
+ A[\uC2DC\uC791] --> B{\uC870\uAC74}
2768
+ B -->|Yes| C[\uCC98\uB9AC]
2769
+ B -->|No| D[\uC885\uB8CC]
2770
+ \`\`\`
2771
+
2772
+ **html \uCC28\uD2B8 \uC608\uC2DC (<artifact> \uD0DC\uADF8 \uD544\uC218):**
2773
+ <artifact title="\uB9E4\uCD9C \uBE44\uAD50" language="html">
2774
+ <canvas id="chart" width="400" height="200"></canvas>
2775
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
2776
+ <script>
2777
+ new Chart(document.getElementById('chart'), {
2778
+ type: 'bar',
2779
+ data: { labels: ['A','B','C'], datasets: [{ label: '\uB9E4\uCD9C', data: [10,20,30] }] }
2780
+ });
2781
+ </script>
2782
+ </artifact>
2783
+
2784
+ **\uADDC\uCE59:**
2785
+ - html \uC2DC\uAC01\uD654\uB294 \uBC18\uB4DC\uC2DC <artifact language="html"> \uD0DC\uADF8\uB85C \uAC10\uC2F8\uC57C \uD568 (\`\`\`html \uCF54\uB4DC\uBE14\uB85D \uC0AC\uC6A9 \uAE08\uC9C0)
2786
+ - \uC0AC\uC6A9\uC790\uAC00 \uC2DC\uAC01\uD654\uB97C \uC694\uCCAD\uD558\uC9C0 \uC54A\uC544\uB3C4 \uC801\uC808\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C \uD3EC\uD568
2787
+ - \uC2DC\uAC01\uD654 \uC55E\uB4A4\uC5D0 \uAC04\uACB0\uD55C \uD14D\uC2A4\uD2B8 \uC124\uBA85 \uD3EC\uD568
2788
+ - mermaid \uBB38\uBC95 \uC624\uB958 \uC8FC\uC758 (\uD2B9\uD788 \uAD04\uD638, \uB530\uC634\uD45C \uC774\uC2A4\uCF00\uC774\uD504)`);
2696
2789
  if (shouldIncludeSkills) {
2697
2790
  const skillsPrompt = buildSkillsPrompt();
2698
2791
  if (skillsPrompt) {
@@ -4516,6 +4609,28 @@ ${stepSummary}
4516
4609
  } else {
4517
4610
  skipNextChecklistParsingRef.current = false;
4518
4611
  }
4612
+ if (hasArtifactTag(accumulatedContent)) {
4613
+ setSessions(
4614
+ (prev) => prev.map((s) => {
4615
+ if (s.id !== capturedSessionId) return s;
4616
+ return {
4617
+ ...s,
4618
+ messages: s.messages.map((m) => {
4619
+ if (m.id !== assistantMessageId) return m;
4620
+ const { artifacts, cleanContent } = parseArtifactsFromContent(m.content);
4621
+ if (artifacts.length === 0) return m;
4622
+ const existingParts = m.contentParts || [];
4623
+ const textPart = cleanContent.trim() ? [{ type: "text", content: cleanContent }] : [];
4624
+ return {
4625
+ ...m,
4626
+ content: cleanContent,
4627
+ contentParts: [...textPart, ...existingParts.filter((p) => p.type !== "text" && p.type !== "artifact"), ...artifacts]
4628
+ };
4629
+ })
4630
+ };
4631
+ })
4632
+ );
4633
+ }
4519
4634
  setSessions(
4520
4635
  (prev) => prev.map((s) => {
4521
4636
  if (s.id !== capturedSessionId) return s;
@@ -5801,6 +5916,7 @@ var UNCLOSED_THINKING_TAG_REGEX = /<thinking>(?![\s\S]*?<\/thinking>)/gi;
5801
5916
  var UNCLOSED_POLL_TAG_REGEX = /<poll[^>]*>(?![\s\S]*?<\/poll>)[\s\S]*$/gi;
5802
5917
  var UNCLOSED_SKILL_TAG_REGEX = /<skill_use[^>]*>(?![\s\S]*?<\/skill_use>)[\s\S]*$/gi;
5803
5918
  var UNCLOSED_CHECKLIST_TAG_REGEX = /<checklist>(?![\s\S]*?<\/checklist>)[\s\S]*$/gi;
5919
+ var UNCLOSED_ARTIFACT_TAG_REGEX = /<artifact[^>]*>(?![\s\S]*?<\/artifact>)[\s\S]*$/gi;
5804
5920
  var INLINE_CODE_REGEX = /`([^`]+)`/g;
5805
5921
  var BOLD_REGEX = /\*\*([^*]+)\*\*/g;
5806
5922
  var ITALIC_REGEX = /(?<!\*)\*([^*]+)\*(?!\*)/g;
@@ -6713,6 +6829,9 @@ var MarkdownRenderer = ({
6713
6829
  processedContent = processedContent.replace(/<checklist>[\s\S]*?<\/checklist>/gi, "");
6714
6830
  processedContent = processedContent.replace(UNCLOSED_CHECKLIST_TAG_REGEX, "");
6715
6831
  UNCLOSED_CHECKLIST_TAG_REGEX.lastIndex = 0;
6832
+ processedContent = processedContent.replace(/<artifact[^>]*>[\s\S]*?<\/artifact>/gi, "");
6833
+ processedContent = processedContent.replace(UNCLOSED_ARTIFACT_TAG_REGEX, "");
6834
+ UNCLOSED_ARTIFACT_TAG_REGEX.lastIndex = 0;
6716
6835
  const codeBlocks = [];
6717
6836
  processedContent = processedContent.replace(CODE_BLOCK_REGEX, (match, lang, code) => {
6718
6837
  if (lang === "markdown" || lang === "md") {
@@ -8715,10 +8834,10 @@ var iconButtonStyle = {
8715
8834
  };
8716
8835
 
8717
8836
  // src/react/components/MessageList.tsx
8718
- import React13, { useRef as useRef9, useEffect as useEffect9, useCallback as useCallback9, useState as useState17 } from "react";
8837
+ import React14, { useRef as useRef10, useEffect as useEffect10, useCallback as useCallback10, useState as useState18 } from "react";
8719
8838
 
8720
8839
  // src/react/components/MessageBubble.tsx
8721
- import { useState as useState16 } from "react";
8840
+ import { useState as useState17 } from "react";
8722
8841
 
8723
8842
  // src/react/components/DeepResearchProgressUI.tsx
8724
8843
  import React7 from "react";
@@ -9928,8 +10047,324 @@ var ToolStatusCard = ({
9928
10047
  ] });
9929
10048
  };
9930
10049
 
9931
- // src/react/components/ContentPartRenderer.tsx
10050
+ // src/react/components/ArtifactCard.tsx
10051
+ import { useRef as useRef9, useEffect as useEffect9, useState as useState15, useCallback as useCallback8 } from "react";
9932
10052
  import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
10053
+ var getThemeStyles = () => {
10054
+ const root = document.documentElement;
10055
+ const style = getComputedStyle(root);
10056
+ const vars = [
10057
+ "--chatllm-primary",
10058
+ "--chatllm-text",
10059
+ "--chatllm-text-muted",
10060
+ "--chatllm-bg",
10061
+ "--chatllm-bg-secondary",
10062
+ "--chatllm-border"
10063
+ ];
10064
+ const cssVars = vars.map((v) => {
10065
+ const val = style.getPropertyValue(v).trim();
10066
+ return val ? `${v}: ${val};` : "";
10067
+ }).filter(Boolean).join("\n ");
10068
+ return `
10069
+ <style>
10070
+ :root { ${cssVars} }
10071
+ * { margin: 0; padding: 0; box-sizing: border-box; }
10072
+ body {
10073
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
10074
+ color: var(--chatllm-text, #1e293b);
10075
+ background: transparent;
10076
+ overflow: hidden;
10077
+ }
10078
+ </style>`;
10079
+ };
10080
+ var getAutoResizeScript = (id) => `
10081
+ <script>
10082
+ const ro = new ResizeObserver(() => {
10083
+ const h = document.documentElement.scrollHeight;
10084
+ window.parent.postMessage({ type: 'artifact-resize', id: '${id}', height: h }, '*');
10085
+ });
10086
+ ro.observe(document.body);
10087
+ window.addEventListener('load', () => {
10088
+ window.parent.postMessage({ type: 'artifact-resize', id: '${id}', height: document.documentElement.scrollHeight }, '*');
10089
+ });
10090
+ </script>`;
10091
+ var HtmlArtifact = ({ code }) => {
10092
+ const iframeRef = useRef9(null);
10093
+ const [height, setHeight] = useState15(200);
10094
+ const artifactId = useRef9(`artifact-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`);
10095
+ useEffect9(() => {
10096
+ const id = artifactId.current;
10097
+ const handleMessage = (e) => {
10098
+ if (e.data?.type === "artifact-resize" && e.data.id === id && typeof e.data.height === "number") {
10099
+ setHeight(Math.min(e.data.height + 2, 600));
10100
+ }
10101
+ };
10102
+ window.addEventListener("message", handleMessage);
10103
+ return () => window.removeEventListener("message", handleMessage);
10104
+ }, []);
10105
+ const srcdoc = `<!DOCTYPE html><html><head><meta charset="utf-8">${getThemeStyles()}</head><body>${code}${getAutoResizeScript(artifactId.current)}</body></html>`;
10106
+ return /* @__PURE__ */ jsx14(
10107
+ "iframe",
10108
+ {
10109
+ ref: iframeRef,
10110
+ sandbox: "allow-scripts",
10111
+ srcDoc: srcdoc,
10112
+ title: "artifact",
10113
+ style: {
10114
+ width: "100%",
10115
+ height: `${height}px`,
10116
+ border: "none",
10117
+ display: "block",
10118
+ transition: "height 0.3s ease"
10119
+ }
10120
+ }
10121
+ );
10122
+ };
10123
+ var sanitizeSvg = (svg) => {
10124
+ return svg.replace(/<script[\s\S]*?<\/script>/gi, "").replace(/<script[^>]*\/>/gi, "").replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]*)/gi, "").replace(/href\s*=\s*(?:"javascript:[^"]*"|'javascript:[^']*')/gi, "");
10125
+ };
10126
+ var SvgArtifact = ({ code }) => {
10127
+ return /* @__PURE__ */ jsx14(
10128
+ "div",
10129
+ {
10130
+ dangerouslySetInnerHTML: { __html: sanitizeSvg(code) },
10131
+ style: {
10132
+ width: "100%",
10133
+ display: "flex",
10134
+ justifyContent: "center",
10135
+ overflow: "hidden"
10136
+ }
10137
+ }
10138
+ );
10139
+ };
10140
+ var MermaidArtifact = ({ code }) => {
10141
+ const containerRef = useRef9(null);
10142
+ const [svgHtml, setSvgHtml] = useState15(null);
10143
+ const [error, setError] = useState15(null);
10144
+ const renderMermaid = useCallback8(async () => {
10145
+ try {
10146
+ let mermaid;
10147
+ try {
10148
+ mermaid = (await Function('return import("mermaid")')()).default;
10149
+ } catch {
10150
+ mermaid = (await Function('return import("https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs")')()).default;
10151
+ }
10152
+ mermaid.initialize({ startOnLoad: false, theme: "neutral" });
10153
+ const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
10154
+ const { svg } = await mermaid.render(id, code.trim());
10155
+ setSvgHtml(svg);
10156
+ } catch (e) {
10157
+ setError(e instanceof Error ? e.message : "Mermaid \uB80C\uB354\uB9C1 \uC2E4\uD328");
10158
+ }
10159
+ }, [code]);
10160
+ useEffect9(() => {
10161
+ renderMermaid();
10162
+ }, [renderMermaid]);
10163
+ if (error) {
10164
+ return /* @__PURE__ */ jsx14(
10165
+ "div",
10166
+ {
10167
+ style: {
10168
+ padding: "12px",
10169
+ fontSize: "13px",
10170
+ color: "var(--chatllm-error, #ef4444)",
10171
+ backgroundColor: "var(--chatllm-error-bg, #fef2f2)",
10172
+ borderRadius: "6px"
10173
+ },
10174
+ children: error
10175
+ }
10176
+ );
10177
+ }
10178
+ if (!svgHtml) {
10179
+ return /* @__PURE__ */ jsx14(
10180
+ "div",
10181
+ {
10182
+ style: {
10183
+ padding: "24px",
10184
+ display: "flex",
10185
+ alignItems: "center",
10186
+ justifyContent: "center"
10187
+ },
10188
+ children: /* @__PURE__ */ jsx14(IconSvg, { name: "loader-4-line", size: 20, color: "var(--chatllm-text-muted, #94a3b8)" })
10189
+ }
10190
+ );
10191
+ }
10192
+ return /* @__PURE__ */ jsx14(
10193
+ "div",
10194
+ {
10195
+ ref: containerRef,
10196
+ dangerouslySetInnerHTML: { __html: svgHtml },
10197
+ style: {
10198
+ width: "100%",
10199
+ display: "flex",
10200
+ justifyContent: "center",
10201
+ overflow: "auto"
10202
+ }
10203
+ }
10204
+ );
10205
+ };
10206
+ var ArtifactActions = ({ code, language }) => {
10207
+ const [showCode, setShowCode] = useState15(false);
10208
+ const [copied, setCopied] = useState15(false);
10209
+ const handleCopy = async () => {
10210
+ try {
10211
+ await navigator.clipboard.writeText(code);
10212
+ setCopied(true);
10213
+ setTimeout(() => setCopied(false), 2e3);
10214
+ } catch {
10215
+ }
10216
+ };
10217
+ const langLabel = language === "mermaid" ? "Mermaid" : language === "svg" ? "SVG" : "HTML";
10218
+ return /* @__PURE__ */ jsxs13("div", { children: [
10219
+ /* @__PURE__ */ jsxs13(
10220
+ "div",
10221
+ {
10222
+ style: {
10223
+ display: "flex",
10224
+ alignItems: "center",
10225
+ gap: "4px",
10226
+ padding: "6px 12px",
10227
+ borderTop: "1px solid var(--chatllm-border, #e5e7eb)",
10228
+ backgroundColor: "var(--chatllm-bg-secondary, #f9fafb)"
10229
+ },
10230
+ children: [
10231
+ /* @__PURE__ */ jsxs13(
10232
+ "button",
10233
+ {
10234
+ onClick: () => setShowCode(!showCode),
10235
+ style: {
10236
+ display: "flex",
10237
+ alignItems: "center",
10238
+ gap: "4px",
10239
+ padding: "4px 8px",
10240
+ fontSize: "12px",
10241
+ color: "var(--chatllm-text-muted, #64748b)",
10242
+ backgroundColor: showCode ? "var(--chatllm-bg-tertiary, #ededed)" : "transparent",
10243
+ border: "none",
10244
+ borderRadius: "4px",
10245
+ cursor: "pointer"
10246
+ },
10247
+ children: [
10248
+ /* @__PURE__ */ jsx14(IconSvg, { name: "code-s-slash-line", size: 12, color: "var(--chatllm-text-muted, #64748b)" }),
10249
+ langLabel,
10250
+ " \uCF54\uB4DC"
10251
+ ]
10252
+ }
10253
+ ),
10254
+ /* @__PURE__ */ jsxs13(
10255
+ "button",
10256
+ {
10257
+ onClick: handleCopy,
10258
+ style: {
10259
+ display: "flex",
10260
+ alignItems: "center",
10261
+ gap: "4px",
10262
+ padding: "4px 8px",
10263
+ fontSize: "12px",
10264
+ color: copied ? "var(--chatllm-success, #22c55e)" : "var(--chatllm-text-muted, #64748b)",
10265
+ backgroundColor: "transparent",
10266
+ border: "none",
10267
+ borderRadius: "4px",
10268
+ cursor: "pointer"
10269
+ },
10270
+ children: [
10271
+ /* @__PURE__ */ jsx14(
10272
+ IconSvg,
10273
+ {
10274
+ name: copied ? "check-line" : "file-copy-line",
10275
+ size: 12,
10276
+ color: copied ? "var(--chatllm-success, #22c55e)" : "var(--chatllm-text-muted, #64748b)"
10277
+ }
10278
+ ),
10279
+ copied ? "\uBCF5\uC0AC\uB428" : "\uBCF5\uC0AC"
10280
+ ]
10281
+ }
10282
+ )
10283
+ ]
10284
+ }
10285
+ ),
10286
+ showCode && /* @__PURE__ */ jsx14(
10287
+ "div",
10288
+ {
10289
+ style: {
10290
+ maxHeight: "300px",
10291
+ overflow: "auto",
10292
+ borderTop: "1px solid var(--chatllm-border, #e5e7eb)"
10293
+ },
10294
+ children: /* @__PURE__ */ jsx14(
10295
+ "pre",
10296
+ {
10297
+ style: {
10298
+ margin: 0,
10299
+ padding: "12px",
10300
+ fontSize: "12px",
10301
+ lineHeight: 1.5,
10302
+ fontFamily: "'Fira Code', 'Consolas', monospace",
10303
+ color: "var(--chatllm-text, #1e293b)",
10304
+ backgroundColor: "var(--chatllm-bg-secondary, #f9fafb)",
10305
+ whiteSpace: "pre-wrap",
10306
+ wordBreak: "break-all"
10307
+ },
10308
+ children: code
10309
+ }
10310
+ )
10311
+ }
10312
+ )
10313
+ ] });
10314
+ };
10315
+ var ArtifactCard = ({ part, index = 0 }) => {
10316
+ return /* @__PURE__ */ jsxs13(
10317
+ "div",
10318
+ {
10319
+ className: "chatllm-artifact-card",
10320
+ style: {
10321
+ borderRadius: "8px",
10322
+ border: "1px solid var(--chatllm-border, #e5e7eb)",
10323
+ overflow: "hidden",
10324
+ backgroundColor: "var(--chatllm-bg, #ffffff)",
10325
+ animationDelay: `${index * 300}ms`
10326
+ },
10327
+ children: [
10328
+ part.title && /* @__PURE__ */ jsxs13(
10329
+ "div",
10330
+ {
10331
+ style: {
10332
+ padding: "8px 12px",
10333
+ fontSize: "13px",
10334
+ fontWeight: 600,
10335
+ color: "var(--chatllm-text, #1e293b)",
10336
+ backgroundColor: "var(--chatllm-bg-secondary, #f9fafb)",
10337
+ borderBottom: "1px solid var(--chatllm-border, #e5e7eb)",
10338
+ display: "flex",
10339
+ alignItems: "center",
10340
+ gap: "6px"
10341
+ },
10342
+ children: [
10343
+ /* @__PURE__ */ jsx14(
10344
+ IconSvg,
10345
+ {
10346
+ name: "code-s-slash-line",
10347
+ size: 14,
10348
+ color: "var(--chatllm-text-muted, #64748b)"
10349
+ }
10350
+ ),
10351
+ part.title
10352
+ ]
10353
+ }
10354
+ ),
10355
+ /* @__PURE__ */ jsxs13("div", { style: { padding: part.language === "html" ? 0 : "12px" }, children: [
10356
+ part.language === "html" && /* @__PURE__ */ jsx14(HtmlArtifact, { code: part.code }),
10357
+ part.language === "svg" && /* @__PURE__ */ jsx14(SvgArtifact, { code: part.code }),
10358
+ part.language === "mermaid" && /* @__PURE__ */ jsx14(MermaidArtifact, { code: part.code })
10359
+ ] }),
10360
+ /* @__PURE__ */ jsx14(ArtifactActions, { code: part.code, language: part.language })
10361
+ ]
10362
+ }
10363
+ );
10364
+ };
10365
+
10366
+ // src/react/components/ContentPartRenderer.tsx
10367
+ import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
9933
10368
  var ContentPartRenderer = ({
9934
10369
  parts,
9935
10370
  onChoiceClick,
@@ -9944,10 +10379,11 @@ var ContentPartRenderer = ({
9944
10379
  collectedSources.push(...part.results);
9945
10380
  }
9946
10381
  }
9947
- return /* @__PURE__ */ jsx14("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: parts.map((part, idx) => {
10382
+ let artifactIndex = 0;
10383
+ return /* @__PURE__ */ jsx15("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: parts.map((part, idx) => {
9948
10384
  switch (part.type) {
9949
10385
  case "text":
9950
- return /* @__PURE__ */ jsx14(
10386
+ return /* @__PURE__ */ jsx15(
9951
10387
  MarkdownRenderer,
9952
10388
  {
9953
10389
  content: part.content,
@@ -9959,11 +10395,11 @@ var ContentPartRenderer = ({
9959
10395
  idx
9960
10396
  );
9961
10397
  case "image":
9962
- return /* @__PURE__ */ jsx14(ImageContentCard, { part }, idx);
10398
+ return /* @__PURE__ */ jsx15(ImageContentCard, { part }, idx);
9963
10399
  case "file":
9964
- return /* @__PURE__ */ jsx14(FileContentCard, { part }, idx);
10400
+ return /* @__PURE__ */ jsx15(FileContentCard, { part }, idx);
9965
10401
  case "search_result":
9966
- return /* @__PURE__ */ jsx14("div", { style: { display: "flex", flexWrap: "wrap", gap: "6px" }, children: part.results.map((source, si) => /* @__PURE__ */ jsx14(
10402
+ return /* @__PURE__ */ jsx15("div", { style: { display: "flex", flexWrap: "wrap", gap: "6px" }, children: part.results.map((source, si) => /* @__PURE__ */ jsx15(
9967
10403
  LinkChip,
9968
10404
  {
9969
10405
  text: source.title,
@@ -9974,7 +10410,7 @@ var ContentPartRenderer = ({
9974
10410
  si
9975
10411
  )) }, idx);
9976
10412
  case "tool_loading":
9977
- return /* @__PURE__ */ jsx14(
10413
+ return /* @__PURE__ */ jsx15(
9978
10414
  ToolStatusCard,
9979
10415
  {
9980
10416
  toolName: part.toolName,
@@ -9986,8 +10422,8 @@ var ContentPartRenderer = ({
9986
10422
  case "tool_result": {
9987
10423
  const { result } = part;
9988
10424
  const effectiveType = result.type !== "text" ? result.type : result.metadata?.type || result.metadata?.resultType || result.type;
9989
- return /* @__PURE__ */ jsxs13("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: [
9990
- /* @__PURE__ */ jsx14(
10425
+ return /* @__PURE__ */ jsxs14("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: [
10426
+ /* @__PURE__ */ jsx15(
9991
10427
  ToolStatusCard,
9992
10428
  {
9993
10429
  toolName: part.toolName,
@@ -9998,13 +10434,13 @@ var ContentPartRenderer = ({
9998
10434
  errorMessage: effectiveType === "error" ? result.content : void 0
9999
10435
  }
10000
10436
  ),
10001
- effectiveType === "image" && /* @__PURE__ */ jsx14(
10437
+ effectiveType === "image" && /* @__PURE__ */ jsx15(
10002
10438
  ImageContentCard,
10003
10439
  {
10004
10440
  part: { type: "image", url: result.content, alt: result.metadata?.alt }
10005
10441
  }
10006
10442
  ),
10007
- effectiveType === "file" && /* @__PURE__ */ jsx14(
10443
+ effectiveType === "file" && /* @__PURE__ */ jsx15(
10008
10444
  FileContentCard,
10009
10445
  {
10010
10446
  part: {
@@ -10017,8 +10453,10 @@ var ContentPartRenderer = ({
10017
10453
  )
10018
10454
  ] }, idx);
10019
10455
  }
10456
+ case "artifact":
10457
+ return /* @__PURE__ */ jsx15(ArtifactCard, { part, index: artifactIndex++ }, idx);
10020
10458
  case "error":
10021
- return /* @__PURE__ */ jsxs13(
10459
+ return /* @__PURE__ */ jsxs14(
10022
10460
  "div",
10023
10461
  {
10024
10462
  style: {
@@ -10033,7 +10471,7 @@ var ContentPartRenderer = ({
10033
10471
  gap: "8px"
10034
10472
  },
10035
10473
  children: [
10036
- /* @__PURE__ */ jsx14(IconSvg, { name: "error-warning-line", size: 16, color: "var(--chatllm-error, #ef4444)" }),
10474
+ /* @__PURE__ */ jsx15(IconSvg, { name: "error-warning-line", size: 16, color: "var(--chatllm-error, #ef4444)" }),
10037
10475
  part.message
10038
10476
  ]
10039
10477
  },
@@ -10046,8 +10484,8 @@ var ContentPartRenderer = ({
10046
10484
  };
10047
10485
 
10048
10486
  // src/react/components/ChecklistCard.tsx
10049
- import { useState as useState15, useMemo as useMemo5 } from "react";
10050
- import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
10487
+ import { useState as useState16, useMemo as useMemo5 } from "react";
10488
+ import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
10051
10489
  var ChecklistCard = ({
10052
10490
  items,
10053
10491
  completed,
@@ -10056,7 +10494,7 @@ var ChecklistCard = ({
10056
10494
  onSkipStep,
10057
10495
  onStart
10058
10496
  }) => {
10059
- const [expandedItems, setExpandedItems] = useState15(/* @__PURE__ */ new Set());
10497
+ const [expandedItems, setExpandedItems] = useState16(/* @__PURE__ */ new Set());
10060
10498
  const { doneCount, isRunning, hasError, isWaiting } = useMemo5(() => {
10061
10499
  const done = items.filter((it) => it.status === "done").length;
10062
10500
  const running = items.some((it) => it.status === "in_progress");
@@ -10079,7 +10517,7 @@ var ChecklistCard = ({
10079
10517
  const renderStatusIcon = (item) => {
10080
10518
  switch (item.status) {
10081
10519
  case "done":
10082
- return /* @__PURE__ */ jsx15(
10520
+ return /* @__PURE__ */ jsx16(
10083
10521
  "div",
10084
10522
  {
10085
10523
  style: {
@@ -10092,11 +10530,11 @@ var ChecklistCard = ({
10092
10530
  justifyContent: "center",
10093
10531
  flexShrink: 0
10094
10532
  },
10095
- children: /* @__PURE__ */ jsx15(IconSvg, { name: "check-line", size: 13, color: "#fff" })
10533
+ children: /* @__PURE__ */ jsx16(IconSvg, { name: "check-line", size: 13, color: "#fff" })
10096
10534
  }
10097
10535
  );
10098
10536
  case "in_progress":
10099
- return /* @__PURE__ */ jsx15(
10537
+ return /* @__PURE__ */ jsx16(
10100
10538
  "div",
10101
10539
  {
10102
10540
  style: {
@@ -10110,11 +10548,11 @@ var ChecklistCard = ({
10110
10548
  flexShrink: 0,
10111
10549
  animation: "chatllm-checklist-pulse 1.5s ease-in-out infinite"
10112
10550
  },
10113
- children: /* @__PURE__ */ jsx15("div", { style: { width: "6px", height: "6px", borderRadius: "50%", backgroundColor: "#fff" } })
10551
+ children: /* @__PURE__ */ jsx16("div", { style: { width: "6px", height: "6px", borderRadius: "50%", backgroundColor: "#fff" } })
10114
10552
  }
10115
10553
  );
10116
10554
  case "error":
10117
- return /* @__PURE__ */ jsx15(
10555
+ return /* @__PURE__ */ jsx16(
10118
10556
  "div",
10119
10557
  {
10120
10558
  style: {
@@ -10127,11 +10565,11 @@ var ChecklistCard = ({
10127
10565
  justifyContent: "center",
10128
10566
  flexShrink: 0
10129
10567
  },
10130
- children: /* @__PURE__ */ jsx15(IconSvg, { name: "close-line", size: 13, color: "#fff" })
10568
+ children: /* @__PURE__ */ jsx16(IconSvg, { name: "close-line", size: 13, color: "#fff" })
10131
10569
  }
10132
10570
  );
10133
10571
  default:
10134
- return /* @__PURE__ */ jsx15(
10572
+ return /* @__PURE__ */ jsx16(
10135
10573
  "div",
10136
10574
  {
10137
10575
  style: {
@@ -10149,7 +10587,7 @@ var ChecklistCard = ({
10149
10587
  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}`;
10150
10588
  const headerColor = completed ? "var(--chatllm-success, #22c55e)" : hasError ? "var(--chatllm-error, #ef4444)" : "var(--chatllm-primary, #3584FA)";
10151
10589
  const progressBarColor = completed ? "var(--chatllm-success, #22c55e)" : "var(--chatllm-primary, #3584FA)";
10152
- return /* @__PURE__ */ jsxs14(
10590
+ return /* @__PURE__ */ jsxs15(
10153
10591
  "div",
10154
10592
  {
10155
10593
  style: {
@@ -10160,9 +10598,9 @@ var ChecklistCard = ({
10160
10598
  marginTop: "8px"
10161
10599
  },
10162
10600
  children: [
10163
- /* @__PURE__ */ jsxs14("div", { style: { padding: "14px 16px 10px" }, children: [
10164
- /* @__PURE__ */ jsxs14("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "8px" }, children: [
10165
- /* @__PURE__ */ jsx15(
10601
+ /* @__PURE__ */ jsxs15("div", { style: { padding: "14px 16px 10px" }, children: [
10602
+ /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "8px" }, children: [
10603
+ /* @__PURE__ */ jsx16(
10166
10604
  IconSvg,
10167
10605
  {
10168
10606
  name: completed ? "checkbox-circle-line" : "list-check",
@@ -10170,9 +10608,9 @@ var ChecklistCard = ({
10170
10608
  color: headerColor
10171
10609
  }
10172
10610
  ),
10173
- /* @__PURE__ */ jsx15("span", { style: { fontSize: "13px", fontWeight: 600, color: headerColor }, children: headerText })
10611
+ /* @__PURE__ */ jsx16("span", { style: { fontSize: "13px", fontWeight: 600, color: headerColor }, children: headerText })
10174
10612
  ] }),
10175
- /* @__PURE__ */ jsx15(
10613
+ /* @__PURE__ */ jsx16(
10176
10614
  "div",
10177
10615
  {
10178
10616
  style: {
@@ -10181,7 +10619,7 @@ var ChecklistCard = ({
10181
10619
  borderRadius: "2px",
10182
10620
  overflow: "hidden"
10183
10621
  },
10184
- children: /* @__PURE__ */ jsx15(
10622
+ children: /* @__PURE__ */ jsx16(
10185
10623
  "div",
10186
10624
  {
10187
10625
  style: {
@@ -10196,12 +10634,12 @@ var ChecklistCard = ({
10196
10634
  }
10197
10635
  )
10198
10636
  ] }),
10199
- /* @__PURE__ */ jsx15("div", { children: items.map((item, idx) => {
10637
+ /* @__PURE__ */ jsx16("div", { children: items.map((item, idx) => {
10200
10638
  const isExpanded = expandedItems.has(item.id);
10201
10639
  const canExpand = item.status === "done" && item.result && item.result !== "(\uAC74\uB108\uB700)";
10202
10640
  const isStopped = !isRunning && !completed;
10203
- return /* @__PURE__ */ jsxs14("div", { children: [
10204
- /* @__PURE__ */ jsxs14(
10641
+ return /* @__PURE__ */ jsxs15("div", { children: [
10642
+ /* @__PURE__ */ jsxs15(
10205
10643
  "div",
10206
10644
  {
10207
10645
  onClick: () => canExpand && toggleExpanded(item.id),
@@ -10218,7 +10656,7 @@ var ChecklistCard = ({
10218
10656
  },
10219
10657
  children: [
10220
10658
  renderStatusIcon(item),
10221
- /* @__PURE__ */ jsxs14(
10659
+ /* @__PURE__ */ jsxs15(
10222
10660
  "span",
10223
10661
  {
10224
10662
  style: {
@@ -10234,7 +10672,7 @@ var ChecklistCard = ({
10234
10672
  ]
10235
10673
  }
10236
10674
  ),
10237
- item.status === "error" && onRetryStep && /* @__PURE__ */ jsx15(
10675
+ item.status === "error" && onRetryStep && /* @__PURE__ */ jsx16(
10238
10676
  "button",
10239
10677
  {
10240
10678
  onClick: (e) => {
@@ -10254,7 +10692,7 @@ var ChecklistCard = ({
10254
10692
  children: "\uC7AC\uC2DC\uB3C4"
10255
10693
  }
10256
10694
  ),
10257
- item.status === "pending" && isStopped && hasError && onSkipStep && /* @__PURE__ */ jsx15(
10695
+ item.status === "pending" && isStopped && hasError && onSkipStep && /* @__PURE__ */ jsx16(
10258
10696
  "button",
10259
10697
  {
10260
10698
  onClick: (e) => {
@@ -10274,7 +10712,7 @@ var ChecklistCard = ({
10274
10712
  children: "\uAC74\uB108\uB6F0\uAE30"
10275
10713
  }
10276
10714
  ),
10277
- canExpand && /* @__PURE__ */ jsx15(
10715
+ canExpand && /* @__PURE__ */ jsx16(
10278
10716
  IconSvg,
10279
10717
  {
10280
10718
  name: isExpanded ? "arrow-up-s-line" : "arrow-down-s-line",
@@ -10282,11 +10720,11 @@ var ChecklistCard = ({
10282
10720
  color: "var(--chatllm-text-muted, #94a3b8)"
10283
10721
  }
10284
10722
  ),
10285
- item.result === "(\uAC74\uB108\uB700)" && /* @__PURE__ */ jsx15("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #94a3b8)" }, children: "\uAC74\uB108\uB700" })
10723
+ item.result === "(\uAC74\uB108\uB700)" && /* @__PURE__ */ jsx16("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #94a3b8)" }, children: "\uAC74\uB108\uB700" })
10286
10724
  ]
10287
10725
  }
10288
10726
  ),
10289
- canExpand && isExpanded && /* @__PURE__ */ jsxs14(
10727
+ canExpand && isExpanded && /* @__PURE__ */ jsxs15(
10290
10728
  "div",
10291
10729
  {
10292
10730
  className: "chatllm-scrollbar",
@@ -10302,7 +10740,7 @@ var ChecklistCard = ({
10302
10740
  color: "var(--chatllm-text-secondary, #475569)"
10303
10741
  },
10304
10742
  children: [
10305
- item.imageUrl && /* @__PURE__ */ jsx15(
10743
+ item.imageUrl && /* @__PURE__ */ jsx16(
10306
10744
  "img",
10307
10745
  {
10308
10746
  src: item.imageUrl,
@@ -10314,13 +10752,13 @@ var ChecklistCard = ({
10314
10752
  }
10315
10753
  }
10316
10754
  ),
10317
- item.result && /* @__PURE__ */ jsx15(MarkdownRenderer, { content: item.result })
10755
+ item.result && /* @__PURE__ */ jsx16(MarkdownRenderer, { content: item.result })
10318
10756
  ]
10319
10757
  }
10320
10758
  )
10321
10759
  ] }, item.id);
10322
10760
  }) }),
10323
- /* @__PURE__ */ jsxs14(
10761
+ /* @__PURE__ */ jsxs15(
10324
10762
  "div",
10325
10763
  {
10326
10764
  style: {
@@ -10331,13 +10769,13 @@ var ChecklistCard = ({
10331
10769
  borderTop: "1px solid var(--chatllm-border, #e5e7eb)"
10332
10770
  },
10333
10771
  children: [
10334
- /* @__PURE__ */ jsxs14("span", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #94a3b8)" }, children: [
10772
+ /* @__PURE__ */ jsxs15("span", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #94a3b8)" }, children: [
10335
10773
  doneCount,
10336
10774
  "/",
10337
10775
  items.length,
10338
10776
  " \uC644\uB8CC"
10339
10777
  ] }),
10340
- isWaiting && !completed && onStart && /* @__PURE__ */ jsx15(
10778
+ isWaiting && !completed && onStart && /* @__PURE__ */ jsx16(
10341
10779
  "button",
10342
10780
  {
10343
10781
  onClick: onStart,
@@ -10355,7 +10793,7 @@ var ChecklistCard = ({
10355
10793
  children: "\uC2E4\uD589"
10356
10794
  }
10357
10795
  ),
10358
- isRunning && onAbort && /* @__PURE__ */ jsx15(
10796
+ isRunning && onAbort && /* @__PURE__ */ jsx16(
10359
10797
  "button",
10360
10798
  {
10361
10799
  onClick: onAbort,
@@ -10394,7 +10832,7 @@ var ChecklistMiniIndicator = ({
10394
10832
  const statusText = 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 ${items.length}\uB2E8\uACC4`;
10395
10833
  const statusColor = completed ? "var(--chatllm-success, #22c55e)" : hasError ? "var(--chatllm-error, #ef4444)" : "var(--chatllm-primary, #3584FA)";
10396
10834
  const barColor = completed ? "var(--chatllm-success, #22c55e)" : "var(--chatllm-primary, #3584FA)";
10397
- return /* @__PURE__ */ jsxs14(
10835
+ return /* @__PURE__ */ jsxs15(
10398
10836
  "div",
10399
10837
  {
10400
10838
  style: {
@@ -10405,13 +10843,13 @@ var ChecklistMiniIndicator = ({
10405
10843
  } : {}
10406
10844
  },
10407
10845
  children: [
10408
- isWaiting && onStart && /* @__PURE__ */ jsx15("style", { children: `
10846
+ isWaiting && onStart && /* @__PURE__ */ jsx16("style", { children: `
10409
10847
  @keyframes chatllm-checklist-pending-pulse {
10410
10848
  0%, 100% { box-shadow: 0 0 0 0 rgba(53, 132, 250, 0.15); }
10411
10849
  50% { box-shadow: 0 0 0 4px rgba(53, 132, 250, 0.15); }
10412
10850
  }
10413
10851
  ` }),
10414
- /* @__PURE__ */ jsxs14(
10852
+ /* @__PURE__ */ jsxs15(
10415
10853
  "div",
10416
10854
  {
10417
10855
  onClick: isWaiting ? void 0 : onClick,
@@ -10427,7 +10865,7 @@ var ChecklistMiniIndicator = ({
10427
10865
  transition: "border-color 0.15s ease, background-color 0.15s ease"
10428
10866
  },
10429
10867
  children: [
10430
- /* @__PURE__ */ jsx15(
10868
+ /* @__PURE__ */ jsx16(
10431
10869
  IconSvg,
10432
10870
  {
10433
10871
  name: completed ? "checkbox-circle-line" : "list-check",
@@ -10435,7 +10873,7 @@ var ChecklistMiniIndicator = ({
10435
10873
  color: statusColor
10436
10874
  }
10437
10875
  ),
10438
- /* @__PURE__ */ jsx15(
10876
+ /* @__PURE__ */ jsx16(
10439
10877
  "span",
10440
10878
  {
10441
10879
  style: {
@@ -10447,7 +10885,7 @@ var ChecklistMiniIndicator = ({
10447
10885
  children: statusText
10448
10886
  }
10449
10887
  ),
10450
- !isWaiting && /* @__PURE__ */ jsx15(
10888
+ !isWaiting && /* @__PURE__ */ jsx16(
10451
10889
  "div",
10452
10890
  {
10453
10891
  style: {
@@ -10458,7 +10896,7 @@ var ChecklistMiniIndicator = ({
10458
10896
  overflow: "hidden",
10459
10897
  minWidth: "60px"
10460
10898
  },
10461
- children: /* @__PURE__ */ jsx15(
10899
+ children: /* @__PURE__ */ jsx16(
10462
10900
  "div",
10463
10901
  {
10464
10902
  style: {
@@ -10472,8 +10910,8 @@ var ChecklistMiniIndicator = ({
10472
10910
  )
10473
10911
  }
10474
10912
  ),
10475
- isWaiting && onStart && /* @__PURE__ */ jsxs14("div", { style: { display: "flex", gap: "6px", marginLeft: "auto" }, children: [
10476
- /* @__PURE__ */ jsx15(
10913
+ isWaiting && onStart && /* @__PURE__ */ jsxs15("div", { style: { display: "flex", gap: "6px", marginLeft: "auto" }, children: [
10914
+ /* @__PURE__ */ jsx16(
10477
10915
  "span",
10478
10916
  {
10479
10917
  style: {
@@ -10485,7 +10923,7 @@ var ChecklistMiniIndicator = ({
10485
10923
  children: "\uC218\uC815\uD558\uB824\uBA74 \uBA54\uC2DC\uC9C0\uB97C \uBCF4\uB0B4\uC138\uC694"
10486
10924
  }
10487
10925
  ),
10488
- /* @__PURE__ */ jsx15(
10926
+ /* @__PURE__ */ jsx16(
10489
10927
  "button",
10490
10928
  {
10491
10929
  onClick: (e) => {
@@ -10508,7 +10946,7 @@ var ChecklistMiniIndicator = ({
10508
10946
  }
10509
10947
  )
10510
10948
  ] }),
10511
- !isWaiting && onClick && /* @__PURE__ */ jsx15(
10949
+ !isWaiting && onClick && /* @__PURE__ */ jsx16(
10512
10950
  IconSvg,
10513
10951
  {
10514
10952
  name: "arrow-right-line",
@@ -10525,7 +10963,7 @@ var ChecklistMiniIndicator = ({
10525
10963
  };
10526
10964
 
10527
10965
  // src/react/components/MessageBubble.tsx
10528
- import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
10966
+ import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
10529
10967
  var MessageBubble = ({
10530
10968
  message,
10531
10969
  isLoading,
@@ -10554,9 +10992,9 @@ var MessageBubble = ({
10554
10992
  onToggleChecklistPanel,
10555
10993
  onChecklistStart
10556
10994
  }) => {
10557
- const [showActions, setShowActions] = useState16(false);
10558
- const [showModelMenu, setShowModelMenu] = useState16(false);
10559
- const [stepExpanded, setStepExpanded] = useState16(false);
10995
+ const [showActions, setShowActions] = useState17(false);
10996
+ const [showModelMenu, setShowModelMenu] = useState17(false);
10997
+ const [stepExpanded, setStepExpanded] = useState17(false);
10560
10998
  const isUser = message.role === "user";
10561
10999
  const isAssistant = message.role === "assistant";
10562
11000
  const relevantAlternatives = isUser ? alternatives : message.alternatives;
@@ -10568,14 +11006,14 @@ var MessageBubble = ({
10568
11006
  const displaySources = isAssistant && relevantAlternatives && relevantAlternatives.length > 0 && relevantActiveIndex > 0 ? relevantAlternatives[relevantActiveIndex - 1]?.sources : message.sources;
10569
11007
  if (isAssistant && message.checklistStepInfo) {
10570
11008
  const { step, total, title } = message.checklistStepInfo;
10571
- return /* @__PURE__ */ jsxs15(
11009
+ return /* @__PURE__ */ jsxs16(
10572
11010
  "div",
10573
11011
  {
10574
11012
  style: {
10575
11013
  padding: "2px 24px"
10576
11014
  },
10577
11015
  children: [
10578
- /* @__PURE__ */ jsxs15(
11016
+ /* @__PURE__ */ jsxs16(
10579
11017
  "div",
10580
11018
  {
10581
11019
  onClick: () => setStepExpanded(!stepExpanded),
@@ -10592,7 +11030,7 @@ var MessageBubble = ({
10592
11030
  marginLeft: "44px"
10593
11031
  },
10594
11032
  children: [
10595
- /* @__PURE__ */ jsx16(
11033
+ /* @__PURE__ */ jsx17(
10596
11034
  IconSvg,
10597
11035
  {
10598
11036
  name: "checkbox-circle-line",
@@ -10600,7 +11038,7 @@ var MessageBubble = ({
10600
11038
  color: "var(--chatllm-success, #22c55e)"
10601
11039
  }
10602
11040
  ),
10603
- /* @__PURE__ */ jsxs15("span", { style: {
11041
+ /* @__PURE__ */ jsxs16("span", { style: {
10604
11042
  flex: 1,
10605
11043
  fontSize: "13px",
10606
11044
  color: "var(--chatllm-text-secondary, #475569)"
@@ -10611,7 +11049,7 @@ var MessageBubble = ({
10611
11049
  "\uB2E8\uACC4: ",
10612
11050
  title
10613
11051
  ] }),
10614
- /* @__PURE__ */ jsx16(
11052
+ /* @__PURE__ */ jsx17(
10615
11053
  IconSvg,
10616
11054
  {
10617
11055
  name: stepExpanded ? "arrow-up-s-line" : "arrow-down-s-line",
@@ -10622,7 +11060,7 @@ var MessageBubble = ({
10622
11060
  ]
10623
11061
  }
10624
11062
  ),
10625
- stepExpanded && /* @__PURE__ */ jsx16(
11063
+ stepExpanded && /* @__PURE__ */ jsx17(
10626
11064
  "div",
10627
11065
  {
10628
11066
  className: "chatllm-sheet",
@@ -10632,7 +11070,7 @@ var MessageBubble = ({
10632
11070
  marginLeft: "44px",
10633
11071
  maxWidth: "calc(100% - 44px)"
10634
11072
  },
10635
- children: /* @__PURE__ */ jsx16("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsx16(MarkdownRenderer, { content: displayContent }) })
11073
+ children: /* @__PURE__ */ jsx17("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsx17(MarkdownRenderer, { content: displayContent }) })
10636
11074
  }
10637
11075
  )
10638
11076
  ]
@@ -10640,7 +11078,7 @@ var MessageBubble = ({
10640
11078
  );
10641
11079
  }
10642
11080
  if (isUser) {
10643
- return /* @__PURE__ */ jsxs15(
11081
+ return /* @__PURE__ */ jsxs16(
10644
11082
  "div",
10645
11083
  {
10646
11084
  className: "chatllm-message chatllm-message--user",
@@ -10653,7 +11091,7 @@ var MessageBubble = ({
10653
11091
  onMouseEnter: () => setShowActions(true),
10654
11092
  onMouseLeave: () => setShowActions(false),
10655
11093
  children: [
10656
- /* @__PURE__ */ jsx16(
11094
+ /* @__PURE__ */ jsx17(
10657
11095
  "div",
10658
11096
  {
10659
11097
  style: {
@@ -10663,9 +11101,9 @@ var MessageBubble = ({
10663
11101
  borderRadius: "16px",
10664
11102
  borderTopRightRadius: "4px"
10665
11103
  },
10666
- children: message.contentParts?.length ? /* @__PURE__ */ jsx16("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: message.contentParts.map((part, idx) => {
11104
+ children: message.contentParts?.length ? /* @__PURE__ */ jsx17("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: message.contentParts.map((part, idx) => {
10667
11105
  if (part.type === "text") {
10668
- return /* @__PURE__ */ jsx16(
11106
+ return /* @__PURE__ */ jsx17(
10669
11107
  "div",
10670
11108
  {
10671
11109
  style: {
@@ -10680,7 +11118,7 @@ var MessageBubble = ({
10680
11118
  );
10681
11119
  }
10682
11120
  if (part.type === "image") {
10683
- return /* @__PURE__ */ jsx16(
11121
+ return /* @__PURE__ */ jsx17(
10684
11122
  "img",
10685
11123
  {
10686
11124
  src: part.url,
@@ -10696,7 +11134,7 @@ var MessageBubble = ({
10696
11134
  );
10697
11135
  }
10698
11136
  if (part.type === "file") {
10699
- return /* @__PURE__ */ jsxs15(
11137
+ return /* @__PURE__ */ jsxs16(
10700
11138
  "div",
10701
11139
  {
10702
11140
  style: {
@@ -10710,15 +11148,15 @@ var MessageBubble = ({
10710
11148
  color: "var(--chatllm-text)"
10711
11149
  },
10712
11150
  children: [
10713
- /* @__PURE__ */ jsx16(IconSvg, { name: "file-text-line", size: 16, color: "var(--chatllm-text-muted)" }),
10714
- /* @__PURE__ */ jsx16("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: part.name })
11151
+ /* @__PURE__ */ jsx17(IconSvg, { name: "file-text-line", size: 16, color: "var(--chatllm-text-muted)" }),
11152
+ /* @__PURE__ */ jsx17("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: part.name })
10715
11153
  ]
10716
11154
  },
10717
11155
  idx
10718
11156
  );
10719
11157
  }
10720
11158
  return null;
10721
- }) }) : /* @__PURE__ */ jsx16(
11159
+ }) }) : /* @__PURE__ */ jsx17(
10722
11160
  "div",
10723
11161
  {
10724
11162
  style: {
@@ -10732,7 +11170,7 @@ var MessageBubble = ({
10732
11170
  )
10733
11171
  }
10734
11172
  ),
10735
- !isLoading && /* @__PURE__ */ jsxs15(
11173
+ !isLoading && /* @__PURE__ */ jsxs16(
10736
11174
  "div",
10737
11175
  {
10738
11176
  style: {
@@ -10744,7 +11182,7 @@ var MessageBubble = ({
10744
11182
  transition: "opacity 0.15s ease"
10745
11183
  },
10746
11184
  children: [
10747
- /* @__PURE__ */ jsx16("button", { onClick: onCopy, style: actionButtonSmallStyle, title: "\uBCF5\uC0AC", children: /* @__PURE__ */ jsx16(
11185
+ /* @__PURE__ */ jsx17("button", { onClick: onCopy, style: actionButtonSmallStyle, title: "\uBCF5\uC0AC", children: /* @__PURE__ */ jsx17(
10748
11186
  IconSvg,
10749
11187
  {
10750
11188
  name: isCopied ? "check-line" : "file-copy-line",
@@ -10752,7 +11190,7 @@ var MessageBubble = ({
10752
11190
  color: isCopied ? "var(--chatllm-success)" : "var(--chatllm-text-muted)"
10753
11191
  }
10754
11192
  ) }),
10755
- /* @__PURE__ */ jsx16("button", { onClick: onEdit, style: actionButtonSmallStyle, title: "\uC218\uC815", children: /* @__PURE__ */ jsx16(IconSvg, { name: "edit-line", size: 12, color: "var(--chatllm-text-muted)" }) })
11193
+ /* @__PURE__ */ jsx17("button", { onClick: onEdit, style: actionButtonSmallStyle, title: "\uC218\uC815", children: /* @__PURE__ */ jsx17(IconSvg, { name: "edit-line", size: 12, color: "var(--chatllm-text-muted)" }) })
10756
11194
  ]
10757
11195
  }
10758
11196
  )
@@ -10760,7 +11198,7 @@ var MessageBubble = ({
10760
11198
  }
10761
11199
  );
10762
11200
  }
10763
- return /* @__PURE__ */ jsxs15(
11201
+ return /* @__PURE__ */ jsxs16(
10764
11202
  "div",
10765
11203
  {
10766
11204
  className: "chatllm-message chatllm-message--assistant",
@@ -10773,7 +11211,7 @@ var MessageBubble = ({
10773
11211
  onMouseEnter: () => setShowActions(true),
10774
11212
  onMouseLeave: () => setShowActions(false),
10775
11213
  children: [
10776
- /* @__PURE__ */ jsxs15(
11214
+ /* @__PURE__ */ jsxs16(
10777
11215
  "div",
10778
11216
  {
10779
11217
  className: "chatllm-sheet",
@@ -10784,7 +11222,7 @@ var MessageBubble = ({
10784
11222
  gap: "12px"
10785
11223
  },
10786
11224
  children: [
10787
- /* @__PURE__ */ jsx16("div", { style: { flexShrink: 0 }, children: assistantIcon || /* @__PURE__ */ jsx16(
11225
+ /* @__PURE__ */ jsx17("div", { style: { flexShrink: 0 }, children: assistantIcon || /* @__PURE__ */ jsx17(
10788
11226
  "div",
10789
11227
  {
10790
11228
  style: {
@@ -10797,11 +11235,11 @@ var MessageBubble = ({
10797
11235
  justifyContent: "center",
10798
11236
  color: "var(--chatllm-primary)"
10799
11237
  },
10800
- children: /* @__PURE__ */ jsx16(IconSvg, { name: "magic-line", size: 20 })
11238
+ children: /* @__PURE__ */ jsx17(IconSvg, { name: "magic-line", size: 20 })
10801
11239
  }
10802
11240
  ) }),
10803
- /* @__PURE__ */ jsxs15("div", { style: { flex: 1, minWidth: 0 }, children: [
10804
- displayModel && /* @__PURE__ */ jsx16(
11241
+ /* @__PURE__ */ jsxs16("div", { style: { flex: 1, minWidth: 0 }, children: [
11242
+ displayModel && /* @__PURE__ */ jsx17(
10805
11243
  "div",
10806
11244
  {
10807
11245
  style: {
@@ -10810,7 +11248,7 @@ var MessageBubble = ({
10810
11248
  gap: "8px",
10811
11249
  marginBottom: "8px"
10812
11250
  },
10813
- children: /* @__PURE__ */ jsx16(
11251
+ children: /* @__PURE__ */ jsx17(
10814
11252
  "span",
10815
11253
  {
10816
11254
  style: {
@@ -10825,9 +11263,9 @@ var MessageBubble = ({
10825
11263
  )
10826
11264
  }
10827
11265
  ),
10828
- message.isDeepResearch && message.researchProgress && message.researchProgress.phase !== "done" && /* @__PURE__ */ jsx16(DeepResearchProgressUI, { progress: message.researchProgress }),
10829
- message.skillExecution && message.skillExecution.status !== "done" && (message.skillExecution.progress?.subAgents ? /* @__PURE__ */ jsx16(DeepResearchProgressUI, { progress: message.skillExecution.progress }) : /* @__PURE__ */ jsx16(SkillProgressUI, { execution: message.skillExecution })),
10830
- message.isDeepResearch && displayContent && /* @__PURE__ */ jsxs15(
11266
+ message.isDeepResearch && message.researchProgress && message.researchProgress.phase !== "done" && /* @__PURE__ */ jsx17(DeepResearchProgressUI, { progress: message.researchProgress }),
11267
+ message.skillExecution && message.skillExecution.status !== "done" && (message.skillExecution.progress?.subAgents ? /* @__PURE__ */ jsx17(DeepResearchProgressUI, { progress: message.skillExecution.progress }) : /* @__PURE__ */ jsx17(SkillProgressUI, { execution: message.skillExecution })),
11268
+ message.isDeepResearch && displayContent && /* @__PURE__ */ jsxs16(
10831
11269
  "div",
10832
11270
  {
10833
11271
  className: "chatllm-deep-research__header",
@@ -10840,8 +11278,8 @@ var MessageBubble = ({
10840
11278
  borderBottom: "1px solid var(--chatllm-border-light)"
10841
11279
  },
10842
11280
  children: [
10843
- /* @__PURE__ */ jsx16(IconSvg, { name: "search-eye-line", size: 18, color: "var(--chatllm-primary)" }),
10844
- /* @__PURE__ */ jsx16(
11281
+ /* @__PURE__ */ jsx17(IconSvg, { name: "search-eye-line", size: 18, color: "var(--chatllm-primary)" }),
11282
+ /* @__PURE__ */ jsx17(
10845
11283
  "span",
10846
11284
  {
10847
11285
  style: {
@@ -10852,7 +11290,7 @@ var MessageBubble = ({
10852
11290
  children: "\uC2EC\uCE35\uC5F0\uAD6C"
10853
11291
  }
10854
11292
  ),
10855
- displaySources && displaySources.length > 0 && /* @__PURE__ */ jsxs15(
11293
+ displaySources && displaySources.length > 0 && /* @__PURE__ */ jsxs16(
10856
11294
  "span",
10857
11295
  {
10858
11296
  className: "chatllm-deep-research__source-count",
@@ -10874,7 +11312,7 @@ var MessageBubble = ({
10874
11312
  ]
10875
11313
  }
10876
11314
  ),
10877
- !!message.contentParts?.length && /* @__PURE__ */ jsx16("div", { style: { wordBreak: "break-word" }, children: /* @__PURE__ */ jsx16(
11315
+ !!message.contentParts?.length && /* @__PURE__ */ jsx17("div", { style: { wordBreak: "break-word" }, children: /* @__PURE__ */ jsx17(
10878
11316
  ContentPartRenderer,
10879
11317
  {
10880
11318
  parts: message.contentParts,
@@ -10885,13 +11323,13 @@ var MessageBubble = ({
10885
11323
  ) }),
10886
11324
  isLoading && !displayContent && !message.isDeepResearch && (message.contentParts?.length ? (
10887
11325
  /* contentParts 있을 때: 간소화된 AI 응답 대기 표시 */
10888
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginTop: "4px" }, children: [
10889
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
10890
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle }),
10891
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle }),
10892
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle })
11326
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginTop: "4px" }, children: [
11327
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
11328
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle }),
11329
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle }),
11330
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle })
10893
11331
  ] }),
10894
- /* @__PURE__ */ jsx16(
11332
+ /* @__PURE__ */ jsx17(
10895
11333
  "span",
10896
11334
  {
10897
11335
  style: {
@@ -10906,14 +11344,14 @@ var MessageBubble = ({
10906
11344
  ] })
10907
11345
  ) : (
10908
11346
  /* contentParts 없을 때: 풀 스켈레톤 */
10909
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [
10910
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [
10911
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
10912
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle }),
10913
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle }),
10914
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle })
11347
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [
11348
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [
11349
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
11350
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle }),
11351
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle }),
11352
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle })
10915
11353
  ] }),
10916
- /* @__PURE__ */ jsx16(
11354
+ /* @__PURE__ */ jsx17(
10917
11355
  "span",
10918
11356
  {
10919
11357
  style: {
@@ -10926,17 +11364,17 @@ var MessageBubble = ({
10926
11364
  }
10927
11365
  )
10928
11366
  ] }),
10929
- /* @__PURE__ */ jsxs15("div", { className: "chatllm-skeleton-pulse", style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
10930
- /* @__PURE__ */ jsx16("div", { style: { height: "32px", width: "75%", backgroundColor: "var(--chatllm-bg-tertiary)", borderRadius: "8px" } }),
10931
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [
10932
- /* @__PURE__ */ jsx16("div", { style: { height: "16px", width: "100%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } }),
10933
- /* @__PURE__ */ jsx16("div", { style: { height: "16px", width: "85%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } }),
10934
- /* @__PURE__ */ jsx16("div", { style: { height: "16px", width: "65%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } })
11367
+ /* @__PURE__ */ jsxs16("div", { className: "chatllm-skeleton-pulse", style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
11368
+ /* @__PURE__ */ jsx17("div", { style: { height: "32px", width: "75%", backgroundColor: "var(--chatllm-bg-tertiary)", borderRadius: "8px" } }),
11369
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [
11370
+ /* @__PURE__ */ jsx17("div", { style: { height: "16px", width: "100%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } }),
11371
+ /* @__PURE__ */ jsx17("div", { style: { height: "16px", width: "85%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } }),
11372
+ /* @__PURE__ */ jsx17("div", { style: { height: "16px", width: "65%", backgroundColor: "var(--chatllm-bg-secondary)", borderRadius: "4px" } })
10935
11373
  ] })
10936
11374
  ] })
10937
11375
  ] })
10938
11376
  )),
10939
- displayContent ? /* @__PURE__ */ jsx16("div", { style: { wordBreak: "break-word" }, children: /* @__PURE__ */ jsx16(
11377
+ displayContent ? /* @__PURE__ */ jsx17("div", { className: isLoading ? "chatllm-streaming-content" : "", style: { wordBreak: "break-word" }, children: /* @__PURE__ */ jsx17(
10940
11378
  MarkdownRenderer,
10941
11379
  {
10942
11380
  content: displayContent,
@@ -10945,7 +11383,30 @@ var MessageBubble = ({
10945
11383
  thinkingDefaultOpen
10946
11384
  }
10947
11385
  ) }) : null,
10948
- message.pollBlock && message.pollBlock.questions.length > 0 && /* @__PURE__ */ jsx16(
11386
+ isLoading && message.content && /<artifact[^>]*>(?![\s\S]*?<\/artifact>)/i.test(message.content) && /* @__PURE__ */ jsxs16(
11387
+ "div",
11388
+ {
11389
+ className: "chatllm-artifact-loading",
11390
+ style: {
11391
+ display: "flex",
11392
+ alignItems: "center",
11393
+ gap: "10px",
11394
+ padding: "14px 16px",
11395
+ marginTop: "8px",
11396
+ borderRadius: "8px",
11397
+ border: "1px solid var(--chatllm-border, #e5e7eb)",
11398
+ backgroundColor: "var(--chatllm-bg-secondary, #f9fafb)"
11399
+ },
11400
+ children: [
11401
+ /* @__PURE__ */ jsx17(IconSvg, { name: "loader-4-line", size: 18, color: "var(--chatllm-primary, #6366f1)" }),
11402
+ /* @__PURE__ */ jsx17("span", { style: {
11403
+ fontSize: "13px",
11404
+ color: "var(--chatllm-text-muted, #64748b)"
11405
+ }, children: "\uC2DC\uAC01\uD654 \uC0DD\uC131 \uC911..." })
11406
+ ]
11407
+ }
11408
+ ),
11409
+ message.pollBlock && message.pollBlock.questions.length > 0 && /* @__PURE__ */ jsx17(
10949
11410
  PollCard,
10950
11411
  {
10951
11412
  questions: message.pollBlock.questions,
@@ -10957,7 +11418,7 @@ var MessageBubble = ({
10957
11418
  }
10958
11419
  }
10959
11420
  ),
10960
- message.checklistBlock && message.checklistBlock.items.length > 0 && /* @__PURE__ */ jsx16(
11421
+ message.checklistBlock && message.checklistBlock.items.length > 0 && /* @__PURE__ */ jsx17(
10961
11422
  ChecklistMiniIndicator,
10962
11423
  {
10963
11424
  items: message.checklistBlock.items,
@@ -10966,7 +11427,7 @@ var MessageBubble = ({
10966
11427
  onStart: onChecklistStart
10967
11428
  }
10968
11429
  ),
10969
- !isLoading && !displayContent && !message.pollBlock && !message.checklistBlock && !message.contentParts?.length && /* @__PURE__ */ jsx16(
11430
+ !isLoading && !displayContent && !message.pollBlock && !message.checklistBlock && !message.contentParts?.length && /* @__PURE__ */ jsx17(
10970
11431
  "div",
10971
11432
  {
10972
11433
  style: {
@@ -10979,7 +11440,7 @@ var MessageBubble = ({
10979
11440
  children: "\uC751\uB2F5\uC744 \uC0DD\uC131\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694."
10980
11441
  }
10981
11442
  ),
10982
- displaySources && displaySources.length > 0 && /* @__PURE__ */ jsxs15(
11443
+ displaySources && displaySources.length > 0 && /* @__PURE__ */ jsxs16(
10983
11444
  "div",
10984
11445
  {
10985
11446
  style: {
@@ -10991,7 +11452,7 @@ var MessageBubble = ({
10991
11452
  borderTop: "1px solid var(--chatllm-border-light)"
10992
11453
  },
10993
11454
  children: [
10994
- /* @__PURE__ */ jsx16(
11455
+ /* @__PURE__ */ jsx17(
10995
11456
  "span",
10996
11457
  {
10997
11458
  style: {
@@ -11003,7 +11464,7 @@ var MessageBubble = ({
11003
11464
  children: "\uCD9C\uCC98:"
11004
11465
  }
11005
11466
  ),
11006
- displaySources.map((source, index) => /* @__PURE__ */ jsx16(
11467
+ displaySources.map((source, index) => /* @__PURE__ */ jsx17(
11007
11468
  LinkChip,
11008
11469
  {
11009
11470
  text: source.title,
@@ -11016,7 +11477,7 @@ var MessageBubble = ({
11016
11477
  ]
11017
11478
  }
11018
11479
  ),
11019
- relevantAlternatives && relevantAlternatives.length > 0 && /* @__PURE__ */ jsxs15(
11480
+ relevantAlternatives && relevantAlternatives.length > 0 && /* @__PURE__ */ jsxs16(
11020
11481
  "div",
11021
11482
  {
11022
11483
  style: {
@@ -11030,8 +11491,8 @@ var MessageBubble = ({
11030
11491
  fontSize: "12px"
11031
11492
  },
11032
11493
  children: [
11033
- /* @__PURE__ */ jsx16("span", { style: { color: "var(--chatllm-text-muted)", marginRight: "4px" }, children: displayModel || "\uBAA8\uB378" }),
11034
- /* @__PURE__ */ jsx16(
11494
+ /* @__PURE__ */ jsx17("span", { style: { color: "var(--chatllm-text-muted)", marginRight: "4px" }, children: displayModel || "\uBAA8\uB378" }),
11495
+ /* @__PURE__ */ jsx17(
11035
11496
  "button",
11036
11497
  {
11037
11498
  onClick: () => onAlternativeChange?.(Math.max(0, relevantActiveIndex - 1)),
@@ -11041,15 +11502,15 @@ var MessageBubble = ({
11041
11502
  opacity: relevantActiveIndex === 0 ? 0.5 : 1,
11042
11503
  cursor: relevantActiveIndex === 0 ? "not-allowed" : "pointer"
11043
11504
  },
11044
- children: /* @__PURE__ */ jsx16(IconSvg, { name: "arrow-left-line", size: 12 })
11505
+ children: /* @__PURE__ */ jsx17(IconSvg, { name: "arrow-left-line", size: 12 })
11045
11506
  }
11046
11507
  ),
11047
- /* @__PURE__ */ jsxs15("span", { style: { color: "var(--chatllm-text-secondary)" }, children: [
11508
+ /* @__PURE__ */ jsxs16("span", { style: { color: "var(--chatllm-text-secondary)" }, children: [
11048
11509
  relevantActiveIndex + 1,
11049
11510
  " / ",
11050
11511
  relevantAlternatives.length + 1
11051
11512
  ] }),
11052
- /* @__PURE__ */ jsx16(
11513
+ /* @__PURE__ */ jsx17(
11053
11514
  "button",
11054
11515
  {
11055
11516
  onClick: () => onAlternativeChange?.(Math.min(relevantAlternatives.length, relevantActiveIndex + 1)),
@@ -11059,13 +11520,13 @@ var MessageBubble = ({
11059
11520
  opacity: relevantActiveIndex === relevantAlternatives.length ? 0.5 : 1,
11060
11521
  cursor: relevantActiveIndex === relevantAlternatives.length ? "not-allowed" : "pointer"
11061
11522
  },
11062
- children: /* @__PURE__ */ jsx16(IconSvg, { name: "arrow-right-line", size: 12 })
11523
+ children: /* @__PURE__ */ jsx17(IconSvg, { name: "arrow-right-line", size: 12 })
11063
11524
  }
11064
11525
  )
11065
11526
  ]
11066
11527
  }
11067
11528
  ),
11068
- isLoadingAlternative && /* @__PURE__ */ jsxs15(
11529
+ isLoadingAlternative && /* @__PURE__ */ jsxs16(
11069
11530
  "div",
11070
11531
  {
11071
11532
  style: {
@@ -11080,12 +11541,12 @@ var MessageBubble = ({
11080
11541
  color: "var(--chatllm-primary, #3584FA)"
11081
11542
  },
11082
11543
  children: [
11083
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
11084
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle }),
11085
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle }),
11086
- /* @__PURE__ */ jsx16("span", { className: "chatllm-dot-bounce", style: dotStyle })
11544
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
11545
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle }),
11546
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle }),
11547
+ /* @__PURE__ */ jsx17("span", { className: "chatllm-dot-bounce", style: dotStyle })
11087
11548
  ] }),
11088
- /* @__PURE__ */ jsx16("span", { style: { fontWeight: 500 }, children: "\uB2E4\uB978 \uBAA8\uB378 \uC751\uB2F5 \uC0DD\uC131 \uC911..." })
11549
+ /* @__PURE__ */ jsx17("span", { style: { fontWeight: 500 }, children: "\uB2E4\uB978 \uBAA8\uB378 \uC751\uB2F5 \uC0DD\uC131 \uC911..." })
11089
11550
  ]
11090
11551
  }
11091
11552
  )
@@ -11093,7 +11554,7 @@ var MessageBubble = ({
11093
11554
  ]
11094
11555
  }
11095
11556
  ),
11096
- !isLoading && /* @__PURE__ */ jsxs15(
11557
+ !isLoading && /* @__PURE__ */ jsxs16(
11097
11558
  "div",
11098
11559
  {
11099
11560
  style: {
@@ -11106,7 +11567,7 @@ var MessageBubble = ({
11106
11567
  transition: "opacity 0.15s ease"
11107
11568
  },
11108
11569
  children: [
11109
- /* @__PURE__ */ jsx16("button", { onClick: onCopy, style: actionButtonSmallStyle, title: "\uBCF5\uC0AC", children: /* @__PURE__ */ jsx16(
11570
+ /* @__PURE__ */ jsx17("button", { onClick: onCopy, style: actionButtonSmallStyle, title: "\uBCF5\uC0AC", children: /* @__PURE__ */ jsx17(
11110
11571
  IconSvg,
11111
11572
  {
11112
11573
  name: isCopied ? "check-line" : "file-copy-line",
@@ -11114,19 +11575,19 @@ var MessageBubble = ({
11114
11575
  color: isCopied ? "var(--chatllm-success)" : "var(--chatllm-text-muted)"
11115
11576
  }
11116
11577
  ) }),
11117
- onExport && /* @__PURE__ */ jsx16("button", { onClick: () => onExport("markdown"), style: actionButtonSmallStyle, title: "MD \uB2E4\uC6B4\uB85C\uB4DC", children: /* @__PURE__ */ jsx16(IconSvg, { name: "download-line", size: 12, color: "var(--chatllm-text-muted)" }) }),
11118
- onRegenerate && /* @__PURE__ */ jsx16("button", { onClick: onRegenerate, style: actionButtonSmallStyle, title: "\uB2E4\uC2DC \uC0DD\uC131", children: /* @__PURE__ */ jsx16(IconSvg, { name: "refresh-line", size: 12, color: "var(--chatllm-text-muted)" }) }),
11119
- onAskOtherModel && otherModels.length > 0 && /* @__PURE__ */ jsxs15("div", { style: { position: "relative" }, children: [
11120
- /* @__PURE__ */ jsx16(
11578
+ onExport && /* @__PURE__ */ jsx17("button", { onClick: () => onExport("markdown"), style: actionButtonSmallStyle, title: "MD \uB2E4\uC6B4\uB85C\uB4DC", children: /* @__PURE__ */ jsx17(IconSvg, { name: "download-line", size: 12, color: "var(--chatllm-text-muted)" }) }),
11579
+ onRegenerate && /* @__PURE__ */ jsx17("button", { onClick: onRegenerate, style: actionButtonSmallStyle, title: "\uB2E4\uC2DC \uC0DD\uC131", children: /* @__PURE__ */ jsx17(IconSvg, { name: "refresh-line", size: 12, color: "var(--chatllm-text-muted)" }) }),
11580
+ onAskOtherModel && otherModels.length > 0 && /* @__PURE__ */ jsxs16("div", { style: { position: "relative" }, children: [
11581
+ /* @__PURE__ */ jsx17(
11121
11582
  "button",
11122
11583
  {
11123
11584
  onClick: () => setShowModelMenu(!showModelMenu),
11124
11585
  style: actionButtonSmallStyle,
11125
11586
  title: "\uB2E4\uB978 \uBAA8\uB378\uC5D0\uAC8C \uC9C8\uBB38",
11126
- children: /* @__PURE__ */ jsx16(IconSvg, { name: "robot-line", size: 12, color: "var(--chatllm-text-muted)" })
11587
+ children: /* @__PURE__ */ jsx17(IconSvg, { name: "robot-line", size: 12, color: "var(--chatllm-text-muted)" })
11127
11588
  }
11128
11589
  ),
11129
- showModelMenu && /* @__PURE__ */ jsx16(
11590
+ showModelMenu && /* @__PURE__ */ jsx17(
11130
11591
  ModelMenu,
11131
11592
  {
11132
11593
  models: otherModels,
@@ -11145,7 +11606,7 @@ var MessageBubble = ({
11145
11606
  }
11146
11607
  );
11147
11608
  };
11148
- var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ jsxs15(
11609
+ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ jsxs16(
11149
11610
  "div",
11150
11611
  {
11151
11612
  style: {
@@ -11163,7 +11624,7 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ jsxs15(
11163
11624
  },
11164
11625
  onMouseLeave: onClose,
11165
11626
  children: [
11166
- /* @__PURE__ */ jsx16(
11627
+ /* @__PURE__ */ jsx17(
11167
11628
  "div",
11168
11629
  {
11169
11630
  style: {
@@ -11178,7 +11639,7 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ jsxs15(
11178
11639
  children: "\uB2E4\uB978 \uBAA8\uB378\uC5D0\uAC8C \uC9C8\uBB38"
11179
11640
  }
11180
11641
  ),
11181
- models.map((model) => /* @__PURE__ */ jsxs15(
11642
+ models.map((model) => /* @__PURE__ */ jsxs16(
11182
11643
  "button",
11183
11644
  {
11184
11645
  onClick: () => onSelect(model.id),
@@ -11203,9 +11664,9 @@ var ModelMenu = ({ models, onSelect, onClose }) => /* @__PURE__ */ jsxs15(
11203
11664
  e.currentTarget.style.backgroundColor = "transparent";
11204
11665
  },
11205
11666
  children: [
11206
- /* @__PURE__ */ jsx16(IconSvg, { name: "robot-line", size: 16, color: "var(--chatllm-primary)" }),
11207
- /* @__PURE__ */ jsx16("span", { style: { flex: 1, fontWeight: 500 }, children: model.name }),
11208
- model.provider && /* @__PURE__ */ jsx16(
11667
+ /* @__PURE__ */ jsx17(IconSvg, { name: "robot-line", size: 16, color: "var(--chatllm-primary)" }),
11668
+ /* @__PURE__ */ jsx17("span", { style: { flex: 1, fontWeight: 500 }, children: model.name }),
11669
+ model.provider && /* @__PURE__ */ jsx17(
11209
11670
  "span",
11210
11671
  {
11211
11672
  style: {
@@ -11254,7 +11715,7 @@ var navButtonStyle = {
11254
11715
  };
11255
11716
 
11256
11717
  // src/react/components/MessageList.tsx
11257
- import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
11718
+ import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
11258
11719
  var MessageList = ({
11259
11720
  messages,
11260
11721
  isLoading,
@@ -11284,14 +11745,14 @@ var MessageList = ({
11284
11745
  onExport,
11285
11746
  onToggleChecklistPanel
11286
11747
  }) => {
11287
- const messagesEndRef = useRef9(null);
11288
- const containerRef = useRef9(null);
11289
- const [selectedText, setSelectedText] = useState17("");
11290
- const [selectionPosition, setSelectionPosition] = useState17(null);
11291
- const [showScrollButton, setShowScrollButton] = useState17(false);
11292
- const userScrollLockRef = useRef9(false);
11748
+ const messagesEndRef = useRef10(null);
11749
+ const containerRef = useRef10(null);
11750
+ const [selectedText, setSelectedText] = useState18("");
11751
+ const [selectionPosition, setSelectionPosition] = useState18(null);
11752
+ const [showScrollButton, setShowScrollButton] = useState18(false);
11753
+ const userScrollLockRef = useRef10(false);
11293
11754
  const SCROLL_THRESHOLD = 100;
11294
- useEffect9(() => {
11755
+ useEffect10(() => {
11295
11756
  const container = containerRef.current;
11296
11757
  if (!container) return;
11297
11758
  const handleWheel = (e) => {
@@ -11328,7 +11789,7 @@ var MessageList = ({
11328
11789
  container.removeEventListener("touchmove", handleTouchMove);
11329
11790
  };
11330
11791
  }, []);
11331
- const handleScroll = useCallback9(() => {
11792
+ const handleScroll = useCallback10(() => {
11332
11793
  if (!containerRef.current) return;
11333
11794
  const { scrollTop, scrollHeight, clientHeight } = containerRef.current;
11334
11795
  const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
@@ -11337,14 +11798,14 @@ var MessageList = ({
11337
11798
  setShowScrollButton(false);
11338
11799
  }
11339
11800
  }, []);
11340
- useEffect9(() => {
11801
+ useEffect10(() => {
11341
11802
  if (userScrollLockRef.current) return;
11342
11803
  containerRef.current?.scrollTo({
11343
11804
  top: containerRef.current.scrollHeight,
11344
11805
  behavior: "smooth"
11345
11806
  });
11346
11807
  }, [messages]);
11347
- const scrollToBottom = useCallback9(() => {
11808
+ const scrollToBottom = useCallback10(() => {
11348
11809
  userScrollLockRef.current = false;
11349
11810
  setShowScrollButton(false);
11350
11811
  containerRef.current?.scrollTo({
@@ -11352,7 +11813,7 @@ var MessageList = ({
11352
11813
  behavior: "smooth"
11353
11814
  });
11354
11815
  }, []);
11355
- const handleMouseUp = useCallback9(() => {
11816
+ const handleMouseUp = useCallback10(() => {
11356
11817
  const selection = typeof window !== "undefined" ? window.getSelection() : null;
11357
11818
  const text = selection?.toString().trim();
11358
11819
  if (text && text.length > 0) {
@@ -11386,7 +11847,7 @@ var MessageList = ({
11386
11847
  }
11387
11848
  }
11388
11849
  };
11389
- return /* @__PURE__ */ jsxs16(
11850
+ return /* @__PURE__ */ jsxs17(
11390
11851
  "div",
11391
11852
  {
11392
11853
  ref: containerRef,
@@ -11401,7 +11862,7 @@ var MessageList = ({
11401
11862
  onScroll: handleScroll,
11402
11863
  onMouseUp: handleMouseUp,
11403
11864
  children: [
11404
- /* @__PURE__ */ jsxs16(
11865
+ /* @__PURE__ */ jsxs17(
11405
11866
  "div",
11406
11867
  {
11407
11868
  style: {
@@ -11416,7 +11877,7 @@ var MessageList = ({
11416
11877
  const nextAssistant = message.role === "user" && index + 1 < messages.length ? messages[index + 1] : null;
11417
11878
  const assistantForAlts = nextAssistant?.role === "assistant" ? nextAssistant : null;
11418
11879
  const activeAltIndex = assistantForAlts ? activeAlternatives[assistantForAlts.id] ?? 0 : 0;
11419
- const bubbleElement = /* @__PURE__ */ jsx17(
11880
+ const bubbleElement = /* @__PURE__ */ jsx18(
11420
11881
  MessageBubble,
11421
11882
  {
11422
11883
  message,
@@ -11453,13 +11914,13 @@ var MessageList = ({
11453
11914
  },
11454
11915
  message.id
11455
11916
  );
11456
- return renderMessage ? /* @__PURE__ */ jsx17(React13.Fragment, { children: renderMessage(message, bubbleElement) }, message.id) : bubbleElement;
11917
+ return renderMessage ? /* @__PURE__ */ jsx18(React14.Fragment, { children: renderMessage(message, bubbleElement) }, message.id) : bubbleElement;
11457
11918
  }),
11458
- /* @__PURE__ */ jsx17("div", { ref: messagesEndRef })
11919
+ /* @__PURE__ */ jsx18("div", { ref: messagesEndRef })
11459
11920
  ]
11460
11921
  }
11461
11922
  ),
11462
- showScrollButton && /* @__PURE__ */ jsx17(
11923
+ showScrollButton && /* @__PURE__ */ jsx18(
11463
11924
  "button",
11464
11925
  {
11465
11926
  onClick: scrollToBottom,
@@ -11482,10 +11943,10 @@ var MessageList = ({
11482
11943
  zIndex: 10,
11483
11944
  transition: "opacity 0.2s"
11484
11945
  },
11485
- children: /* @__PURE__ */ jsx17(IconSvg, { name: "arrow-down-s-line", size: 24, color: "var(--chatllm-text-secondary)" })
11946
+ children: /* @__PURE__ */ jsx18(IconSvg, { name: "arrow-down-s-line", size: 24, color: "var(--chatllm-text-secondary)" })
11486
11947
  }
11487
11948
  ),
11488
- selectionPosition && /* @__PURE__ */ jsxs16(
11949
+ selectionPosition && /* @__PURE__ */ jsxs17(
11489
11950
  "div",
11490
11951
  {
11491
11952
  style: {
@@ -11497,7 +11958,7 @@ var MessageList = ({
11497
11958
  pointerEvents: "auto"
11498
11959
  },
11499
11960
  children: [
11500
- /* @__PURE__ */ jsxs16(
11961
+ /* @__PURE__ */ jsxs17(
11501
11962
  "button",
11502
11963
  {
11503
11964
  onClick: handleQuote,
@@ -11517,12 +11978,12 @@ var MessageList = ({
11517
11978
  whiteSpace: "nowrap"
11518
11979
  },
11519
11980
  children: [
11520
- /* @__PURE__ */ jsx17(IconSvg, { name: "double-quotes-l", size: 16, color: "#ffffff" }),
11981
+ /* @__PURE__ */ jsx18(IconSvg, { name: "double-quotes-l", size: 16, color: "#ffffff" }),
11521
11982
  "\uC778\uC6A9\uD558\uAE30"
11522
11983
  ]
11523
11984
  }
11524
11985
  ),
11525
- /* @__PURE__ */ jsx17(
11986
+ /* @__PURE__ */ jsx18(
11526
11987
  "div",
11527
11988
  {
11528
11989
  style: {
@@ -11547,8 +12008,8 @@ var MessageList = ({
11547
12008
  };
11548
12009
 
11549
12010
  // src/react/components/SettingsModal.tsx
11550
- import { useState as useState18, useEffect as useEffect10 } from "react";
11551
- import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
12011
+ import { useState as useState19, useEffect as useEffect11 } from "react";
12012
+ import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
11552
12013
  var DEFAULT_IMPORT_MEMORY_PROMPT = `Export all of my stored memories and any context you've learned about me from past conversations. Preserve my words verbatim where possible, especially for instructions and preferences.
11553
12014
 
11554
12015
  ## Categories (output in this order):
@@ -11612,9 +12073,9 @@ var SettingsModal = ({
11612
12073
  onImportMemory,
11613
12074
  importMemoryPrompt
11614
12075
  }) => {
11615
- const [activeTab, setActiveTab] = useState18("general");
11616
- const [localApiKey, setLocalApiKey] = useState18(apiKey);
11617
- useEffect10(() => {
12076
+ const [activeTab, setActiveTab] = useState19("general");
12077
+ const [localApiKey, setLocalApiKey] = useState19(apiKey);
12078
+ useEffect11(() => {
11618
12079
  setLocalApiKey(apiKey);
11619
12080
  }, [apiKey]);
11620
12081
  if (!isOpen) return null;
@@ -11640,7 +12101,7 @@ var SettingsModal = ({
11640
12101
  setLocalApiKey(value);
11641
12102
  onApiKeyChange?.(value);
11642
12103
  };
11643
- return /* @__PURE__ */ jsx18(
12104
+ return /* @__PURE__ */ jsx19(
11644
12105
  "div",
11645
12106
  {
11646
12107
  className: "chatllm-settings-overlay",
@@ -11654,7 +12115,7 @@ var SettingsModal = ({
11654
12115
  zIndex: 1e3
11655
12116
  },
11656
12117
  onClick: onClose,
11657
- children: /* @__PURE__ */ jsxs17(
12118
+ children: /* @__PURE__ */ jsxs18(
11658
12119
  "div",
11659
12120
  {
11660
12121
  className: "chatllm-settings-modal",
@@ -11672,7 +12133,7 @@ var SettingsModal = ({
11672
12133
  },
11673
12134
  onClick: (e) => e.stopPropagation(),
11674
12135
  children: [
11675
- /* @__PURE__ */ jsxs17(
12136
+ /* @__PURE__ */ jsxs18(
11676
12137
  "div",
11677
12138
  {
11678
12139
  style: {
@@ -11683,7 +12144,7 @@ var SettingsModal = ({
11683
12144
  flexDirection: "column"
11684
12145
  },
11685
12146
  children: [
11686
- /* @__PURE__ */ jsx18("div", { style: { padding: "16px", borderBottom: "1px solid var(--chatllm-border, #e5e7eb)" }, children: /* @__PURE__ */ jsx18(
12147
+ /* @__PURE__ */ jsx19("div", { style: { padding: "16px", borderBottom: "1px solid var(--chatllm-border, #e5e7eb)" }, children: /* @__PURE__ */ jsx19(
11687
12148
  "button",
11688
12149
  {
11689
12150
  onClick: onClose,
@@ -11697,11 +12158,11 @@ var SettingsModal = ({
11697
12158
  alignItems: "center",
11698
12159
  justifyContent: "center"
11699
12160
  },
11700
- children: /* @__PURE__ */ jsx18(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #6b7280)" })
12161
+ children: /* @__PURE__ */ jsx19(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #6b7280)" })
11701
12162
  }
11702
12163
  ) }),
11703
- /* @__PURE__ */ jsxs17("nav", { style: { flex: 1, padding: "8px" }, children: [
11704
- /* @__PURE__ */ jsx18(
12164
+ /* @__PURE__ */ jsxs18("nav", { style: { flex: 1, padding: "8px" }, children: [
12165
+ /* @__PURE__ */ jsx19(
11705
12166
  TabButton,
11706
12167
  {
11707
12168
  active: activeTab === "general",
@@ -11710,7 +12171,7 @@ var SettingsModal = ({
11710
12171
  label: "\uC77C\uBC18"
11711
12172
  }
11712
12173
  ),
11713
- /* @__PURE__ */ jsx18(
12174
+ /* @__PURE__ */ jsx19(
11714
12175
  TabButton,
11715
12176
  {
11716
12177
  active: activeTab === "personalization",
@@ -11719,7 +12180,7 @@ var SettingsModal = ({
11719
12180
  label: "\uAC1C\uC778 \uB9DE\uCDA4 \uC124\uC815"
11720
12181
  }
11721
12182
  ),
11722
- showMemoryTab && /* @__PURE__ */ jsx18(
12183
+ showMemoryTab && /* @__PURE__ */ jsx19(
11723
12184
  TabButton,
11724
12185
  {
11725
12186
  active: activeTab === "memory",
@@ -11728,7 +12189,7 @@ var SettingsModal = ({
11728
12189
  label: "AI \uBA54\uBAA8\uB9AC"
11729
12190
  }
11730
12191
  ),
11731
- showMemoryTab && enableProjects && /* @__PURE__ */ jsx18(
12192
+ showMemoryTab && enableProjects && /* @__PURE__ */ jsx19(
11732
12193
  TabButton,
11733
12194
  {
11734
12195
  active: activeTab === "project-memory",
@@ -11737,7 +12198,7 @@ var SettingsModal = ({
11737
12198
  label: "\uD504\uB85C\uC81D\uD2B8 \uBA54\uBAA8\uB9AC"
11738
12199
  }
11739
12200
  ),
11740
- /* @__PURE__ */ jsx18(
12201
+ /* @__PURE__ */ jsx19(
11741
12202
  TabButton,
11742
12203
  {
11743
12204
  active: activeTab === "data",
@@ -11750,24 +12211,24 @@ var SettingsModal = ({
11750
12211
  ]
11751
12212
  }
11752
12213
  ),
11753
- /* @__PURE__ */ jsxs17("div", { style: { flex: 1, overflow: "auto", padding: "24px" }, children: [
11754
- activeTab === "general" && /* @__PURE__ */ jsxs17("div", { children: [
11755
- /* @__PURE__ */ jsx18("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uC77C\uBC18" }),
11756
- /* @__PURE__ */ jsx18(SettingRow, { label: "\uC5B8\uC5B4", children: /* @__PURE__ */ jsxs17(
12214
+ /* @__PURE__ */ jsxs18("div", { style: { flex: 1, overflow: "auto", padding: "24px" }, children: [
12215
+ activeTab === "general" && /* @__PURE__ */ jsxs18("div", { children: [
12216
+ /* @__PURE__ */ jsx19("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uC77C\uBC18" }),
12217
+ /* @__PURE__ */ jsx19(SettingRow, { label: "\uC5B8\uC5B4", children: /* @__PURE__ */ jsxs18(
11757
12218
  "select",
11758
12219
  {
11759
12220
  value: personalization.language,
11760
12221
  onChange: (e) => onPersonalizationChange({ ...personalization, language: e.target.value }),
11761
12222
  style: selectStyle,
11762
12223
  children: [
11763
- /* @__PURE__ */ jsx18("option", { value: "auto", children: "\uC790\uB3D9 \uD0D0\uC9C0" }),
11764
- /* @__PURE__ */ jsx18("option", { value: "ko", children: "\uD55C\uAD6D\uC5B4" }),
11765
- /* @__PURE__ */ jsx18("option", { value: "en", children: "English" }),
11766
- /* @__PURE__ */ jsx18("option", { value: "ja", children: "\u65E5\u672C\u8A9E" })
12224
+ /* @__PURE__ */ jsx19("option", { value: "auto", children: "\uC790\uB3D9 \uD0D0\uC9C0" }),
12225
+ /* @__PURE__ */ jsx19("option", { value: "ko", children: "\uD55C\uAD6D\uC5B4" }),
12226
+ /* @__PURE__ */ jsx19("option", { value: "en", children: "English" }),
12227
+ /* @__PURE__ */ jsx19("option", { value: "ja", children: "\u65E5\u672C\u8A9E" })
11767
12228
  ]
11768
12229
  }
11769
12230
  ) }),
11770
- /* @__PURE__ */ jsx18(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__ */ jsx18(
12231
+ /* @__PURE__ */ jsx19(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__ */ jsx19(
11771
12232
  "button",
11772
12233
  {
11773
12234
  onClick: () => onPersonalizationChange(DEFAULT_PERSONALIZATION2),
@@ -11775,11 +12236,11 @@ var SettingsModal = ({
11775
12236
  children: "\uCD08\uAE30\uD654"
11776
12237
  }
11777
12238
  ) }),
11778
- onApiKeyChange && /* @__PURE__ */ jsxs17("div", { style: { marginTop: "32px", paddingTop: "24px", borderTop: "1px solid var(--chatllm-border, #e5e7eb)" }, children: [
11779
- /* @__PURE__ */ jsx18("h3", { style: { fontSize: "16px", fontWeight: 500, marginBottom: "16px", color: "var(--chatllm-text, #1f2937)" }, children: "API \uC124\uC815" }),
11780
- /* @__PURE__ */ jsxs17("div", { children: [
11781
- /* @__PURE__ */ jsx18("label", { style: { display: "block", fontSize: "14px", marginBottom: "8px", color: "var(--chatllm-text, #374151)" }, children: apiKeyLabel }),
11782
- /* @__PURE__ */ jsx18(
12239
+ onApiKeyChange && /* @__PURE__ */ jsxs18("div", { style: { marginTop: "32px", paddingTop: "24px", borderTop: "1px solid var(--chatllm-border, #e5e7eb)" }, children: [
12240
+ /* @__PURE__ */ jsx19("h3", { style: { fontSize: "16px", fontWeight: 500, marginBottom: "16px", color: "var(--chatllm-text, #1f2937)" }, children: "API \uC124\uC815" }),
12241
+ /* @__PURE__ */ jsxs18("div", { children: [
12242
+ /* @__PURE__ */ jsx19("label", { style: { display: "block", fontSize: "14px", marginBottom: "8px", color: "var(--chatllm-text, #374151)" }, children: apiKeyLabel }),
12243
+ /* @__PURE__ */ jsx19(
11783
12244
  "input",
11784
12245
  {
11785
12246
  type: "password",
@@ -11789,18 +12250,18 @@ var SettingsModal = ({
11789
12250
  style: inputStyle
11790
12251
  }
11791
12252
  ),
11792
- /* @__PURE__ */ jsx18("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "4px" }, children: apiKeyDescription })
12253
+ /* @__PURE__ */ jsx19("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "4px" }, children: apiKeyDescription })
11793
12254
  ] })
11794
12255
  ] })
11795
12256
  ] }),
11796
- activeTab === "personalization" && /* @__PURE__ */ jsxs17("div", { children: [
11797
- /* @__PURE__ */ jsx18("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uAC1C\uC778 \uB9DE\uCDA4 \uC124\uC815" }),
11798
- /* @__PURE__ */ jsxs17("section", { style: { marginBottom: "32px" }, children: [
11799
- /* @__PURE__ */ jsx18("h3", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text-muted, #6b7280)", marginBottom: "16px" }, children: "\uC0AC\uC6A9\uC790 \uD504\uB85C\uD544" }),
11800
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
11801
- /* @__PURE__ */ jsxs17("div", { children: [
11802
- /* @__PURE__ */ jsx18("label", { style: labelStyle, children: "\uB2C9\uB124\uC784" }),
11803
- /* @__PURE__ */ jsx18(
12257
+ activeTab === "personalization" && /* @__PURE__ */ jsxs18("div", { children: [
12258
+ /* @__PURE__ */ jsx19("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uAC1C\uC778 \uB9DE\uCDA4 \uC124\uC815" }),
12259
+ /* @__PURE__ */ jsxs18("section", { style: { marginBottom: "32px" }, children: [
12260
+ /* @__PURE__ */ jsx19("h3", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text-muted, #6b7280)", marginBottom: "16px" }, children: "\uC0AC\uC6A9\uC790 \uD504\uB85C\uD544" }),
12261
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
12262
+ /* @__PURE__ */ jsxs18("div", { children: [
12263
+ /* @__PURE__ */ jsx19("label", { style: labelStyle, children: "\uB2C9\uB124\uC784" }),
12264
+ /* @__PURE__ */ jsx19(
11804
12265
  "input",
11805
12266
  {
11806
12267
  type: "text",
@@ -11811,9 +12272,9 @@ var SettingsModal = ({
11811
12272
  }
11812
12273
  )
11813
12274
  ] }),
11814
- /* @__PURE__ */ jsxs17("div", { children: [
11815
- /* @__PURE__ */ jsx18("label", { style: labelStyle, children: "\uC9C1\uC5C5" }),
11816
- /* @__PURE__ */ jsx18(
12275
+ /* @__PURE__ */ jsxs18("div", { children: [
12276
+ /* @__PURE__ */ jsx19("label", { style: labelStyle, children: "\uC9C1\uC5C5" }),
12277
+ /* @__PURE__ */ jsx19(
11817
12278
  "input",
11818
12279
  {
11819
12280
  type: "text",
@@ -11824,9 +12285,9 @@ var SettingsModal = ({
11824
12285
  }
11825
12286
  )
11826
12287
  ] }),
11827
- /* @__PURE__ */ jsxs17("div", { children: [
11828
- /* @__PURE__ */ jsx18("label", { style: labelStyle, children: "\uCD94\uAC00 \uC815\uBCF4" }),
11829
- /* @__PURE__ */ jsx18(
12288
+ /* @__PURE__ */ jsxs18("div", { children: [
12289
+ /* @__PURE__ */ jsx19("label", { style: labelStyle, children: "\uCD94\uAC00 \uC815\uBCF4" }),
12290
+ /* @__PURE__ */ jsx19(
11830
12291
  "textarea",
11831
12292
  {
11832
12293
  value: personalization.userProfile.additionalInfo || "",
@@ -11839,62 +12300,62 @@ var SettingsModal = ({
11839
12300
  ] })
11840
12301
  ] })
11841
12302
  ] }),
11842
- /* @__PURE__ */ jsxs17("section", { children: [
11843
- /* @__PURE__ */ jsx18("h3", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text-muted, #6b7280)", marginBottom: "16px" }, children: "\uC751\uB2F5 \uC2A4\uD0C0\uC77C" }),
11844
- /* @__PURE__ */ jsx18(SettingRow, { label: "\uB530\uB73B\uD568", children: /* @__PURE__ */ jsxs17(
12303
+ /* @__PURE__ */ jsxs18("section", { children: [
12304
+ /* @__PURE__ */ jsx19("h3", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text-muted, #6b7280)", marginBottom: "16px" }, children: "\uC751\uB2F5 \uC2A4\uD0C0\uC77C" }),
12305
+ /* @__PURE__ */ jsx19(SettingRow, { label: "\uB530\uB73B\uD568", children: /* @__PURE__ */ jsxs18(
11845
12306
  "select",
11846
12307
  {
11847
12308
  value: personalization.responseStyle.warmth,
11848
12309
  onChange: (e) => updateResponseStyle("warmth", e.target.value),
11849
12310
  style: selectStyle,
11850
12311
  children: [
11851
- /* @__PURE__ */ jsx18("option", { value: "high", children: "\uB192\uC74C - \uCE5C\uADFC\uD558\uACE0 \uB530\uB73B\uD558\uAC8C" }),
11852
- /* @__PURE__ */ jsx18("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
11853
- /* @__PURE__ */ jsx18("option", { value: "low", children: "\uB0AE\uC74C - \uAC04\uACB0\uD558\uACE0 \uC0AC\uBB34\uC801\uC73C\uB85C" })
12312
+ /* @__PURE__ */ jsx19("option", { value: "high", children: "\uB192\uC74C - \uCE5C\uADFC\uD558\uACE0 \uB530\uB73B\uD558\uAC8C" }),
12313
+ /* @__PURE__ */ jsx19("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
12314
+ /* @__PURE__ */ jsx19("option", { value: "low", children: "\uB0AE\uC74C - \uAC04\uACB0\uD558\uACE0 \uC0AC\uBB34\uC801\uC73C\uB85C" })
11854
12315
  ]
11855
12316
  }
11856
12317
  ) }),
11857
- /* @__PURE__ */ jsx18(SettingRow, { label: "\uC5F4\uC815\uC801", children: /* @__PURE__ */ jsxs17(
12318
+ /* @__PURE__ */ jsx19(SettingRow, { label: "\uC5F4\uC815\uC801", children: /* @__PURE__ */ jsxs18(
11858
12319
  "select",
11859
12320
  {
11860
12321
  value: personalization.responseStyle.enthusiasm,
11861
12322
  onChange: (e) => updateResponseStyle("enthusiasm", e.target.value),
11862
12323
  style: selectStyle,
11863
12324
  children: [
11864
- /* @__PURE__ */ jsx18("option", { value: "high", children: "\uB192\uC74C - \uC801\uADF9\uC801\uC774\uACE0 \uD65C\uBC1C\uD558\uAC8C" }),
11865
- /* @__PURE__ */ jsx18("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
11866
- /* @__PURE__ */ jsx18("option", { value: "low", children: "\uB0AE\uC74C - \uCC28\uBD84\uD558\uACE0 \uC808\uC81C\uC788\uAC8C" })
12325
+ /* @__PURE__ */ jsx19("option", { value: "high", children: "\uB192\uC74C - \uC801\uADF9\uC801\uC774\uACE0 \uD65C\uBC1C\uD558\uAC8C" }),
12326
+ /* @__PURE__ */ jsx19("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
12327
+ /* @__PURE__ */ jsx19("option", { value: "low", children: "\uB0AE\uC74C - \uCC28\uBD84\uD558\uACE0 \uC808\uC81C\uC788\uAC8C" })
11867
12328
  ]
11868
12329
  }
11869
12330
  ) }),
11870
- /* @__PURE__ */ jsx18(SettingRow, { label: "\uC774\uBAA8\uC9C0 \uC0AC\uC6A9", children: /* @__PURE__ */ jsxs17(
12331
+ /* @__PURE__ */ jsx19(SettingRow, { label: "\uC774\uBAA8\uC9C0 \uC0AC\uC6A9", children: /* @__PURE__ */ jsxs18(
11871
12332
  "select",
11872
12333
  {
11873
12334
  value: personalization.responseStyle.emojiUsage,
11874
12335
  onChange: (e) => updateResponseStyle("emojiUsage", e.target.value),
11875
12336
  style: selectStyle,
11876
12337
  children: [
11877
- /* @__PURE__ */ jsx18("option", { value: "high", children: "\uB192\uC74C - \uC790\uC8FC \uC0AC\uC6A9" }),
11878
- /* @__PURE__ */ jsx18("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
11879
- /* @__PURE__ */ jsx18("option", { value: "low", children: "\uB0AE\uC74C - \uAC70\uC758 \uC0AC\uC6A9 \uC548 \uD568" })
12338
+ /* @__PURE__ */ jsx19("option", { value: "high", children: "\uB192\uC74C - \uC790\uC8FC \uC0AC\uC6A9" }),
12339
+ /* @__PURE__ */ jsx19("option", { value: "medium", children: "\uAE30\uBCF8\uAC12" }),
12340
+ /* @__PURE__ */ jsx19("option", { value: "low", children: "\uB0AE\uC74C - \uAC70\uC758 \uC0AC\uC6A9 \uC548 \uD568" })
11880
12341
  ]
11881
12342
  }
11882
12343
  ) }),
11883
- /* @__PURE__ */ jsx18(SettingRow, { label: "\uC751\uB2F5 \uAE38\uC774", children: /* @__PURE__ */ jsxs17(
12344
+ /* @__PURE__ */ jsx19(SettingRow, { label: "\uC751\uB2F5 \uAE38\uC774", children: /* @__PURE__ */ jsxs18(
11884
12345
  "select",
11885
12346
  {
11886
12347
  value: personalization.responseStyle.verbosity,
11887
12348
  onChange: (e) => updateResponseStyle("verbosity", e.target.value),
11888
12349
  style: selectStyle,
11889
12350
  children: [
11890
- /* @__PURE__ */ jsx18("option", { value: "detailed", children: "\uC0C1\uC138 - \uC790\uC138\uD558\uAC8C \uC124\uBA85" }),
11891
- /* @__PURE__ */ jsx18("option", { value: "balanced", children: "\uAE30\uBCF8\uAC12" }),
11892
- /* @__PURE__ */ jsx18("option", { value: "concise", children: "\uAC04\uACB0 - \uD575\uC2EC\uB9CC \uC694\uC57D" })
12351
+ /* @__PURE__ */ jsx19("option", { value: "detailed", children: "\uC0C1\uC138 - \uC790\uC138\uD558\uAC8C \uC124\uBA85" }),
12352
+ /* @__PURE__ */ jsx19("option", { value: "balanced", children: "\uAE30\uBCF8\uAC12" }),
12353
+ /* @__PURE__ */ jsx19("option", { value: "concise", children: "\uAC04\uACB0 - \uD575\uC2EC\uB9CC \uC694\uC57D" })
11893
12354
  ]
11894
12355
  }
11895
12356
  ) })
11896
12357
  ] }),
11897
- onSave && /* @__PURE__ */ jsx18("div", { style: { marginTop: "24px", display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ jsx18(
12358
+ onSave && /* @__PURE__ */ jsx19("div", { style: { marginTop: "24px", display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ jsx19(
11898
12359
  "button",
11899
12360
  {
11900
12361
  onClick: onSave,
@@ -11915,7 +12376,7 @@ var SettingsModal = ({
11915
12376
  }
11916
12377
  ) })
11917
12378
  ] }),
11918
- activeTab === "memory" && showMemoryTab && /* @__PURE__ */ jsx18(
12379
+ activeTab === "memory" && showMemoryTab && /* @__PURE__ */ jsx19(
11919
12380
  MemoryTabContent,
11920
12381
  {
11921
12382
  items: memoryItems,
@@ -11926,7 +12387,7 @@ var SettingsModal = ({
11926
12387
  importMemoryPrompt
11927
12388
  }
11928
12389
  ),
11929
- activeTab === "project-memory" && showMemoryTab && enableProjects && /* @__PURE__ */ jsx18(
12390
+ activeTab === "project-memory" && showMemoryTab && enableProjects && /* @__PURE__ */ jsx19(
11930
12391
  MemoryTabContent,
11931
12392
  {
11932
12393
  items: projectMemoryItems,
@@ -11937,9 +12398,9 @@ var SettingsModal = ({
11937
12398
  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"
11938
12399
  }
11939
12400
  ),
11940
- activeTab === "data" && /* @__PURE__ */ jsxs17("div", { children: [
11941
- /* @__PURE__ */ jsx18("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uB370\uC774\uD130 \uC81C\uC5B4" }),
11942
- /* @__PURE__ */ jsx18(SettingRow, { label: "\uBA54\uBAA8\uB9AC \uC0AC\uC6A9", description: "\uB300\uD654 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAE30\uC5B5\uD569\uB2C8\uB2E4", children: /* @__PURE__ */ jsx18(
12401
+ activeTab === "data" && /* @__PURE__ */ jsxs18("div", { children: [
12402
+ /* @__PURE__ */ jsx19("h2", { style: { fontSize: "20px", fontWeight: 600, marginBottom: "24px", color: "var(--chatllm-text, #1f2937)" }, children: "\uB370\uC774\uD130 \uC81C\uC5B4" }),
12403
+ /* @__PURE__ */ jsx19(SettingRow, { label: "\uBA54\uBAA8\uB9AC \uC0AC\uC6A9", description: "\uB300\uD654 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAE30\uC5B5\uD569\uB2C8\uB2E4", children: /* @__PURE__ */ jsx19(
11943
12404
  "button",
11944
12405
  {
11945
12406
  onClick: () => onPersonalizationChange({ ...personalization, useMemory: !personalization.useMemory }),
@@ -11953,7 +12414,7 @@ var SettingsModal = ({
11953
12414
  position: "relative",
11954
12415
  transition: "background-color 0.2s"
11955
12416
  },
11956
- children: /* @__PURE__ */ jsx18(
12417
+ children: /* @__PURE__ */ jsx19(
11957
12418
  "div",
11958
12419
  {
11959
12420
  style: {
@@ -11971,7 +12432,7 @@ var SettingsModal = ({
11971
12432
  )
11972
12433
  }
11973
12434
  ) }),
11974
- onClearAllData && /* @__PURE__ */ jsx18(SettingRow, { label: "\uB300\uD654 \uAE30\uB85D \uC0AD\uC81C", description: "\uBAA8\uB4E0 \uB300\uD654 \uAE30\uB85D\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4", children: /* @__PURE__ */ jsx18(
12435
+ onClearAllData && /* @__PURE__ */ jsx19(SettingRow, { label: "\uB300\uD654 \uAE30\uB85D \uC0AD\uC81C", description: "\uBAA8\uB4E0 \uB300\uD654 \uAE30\uB85D\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4", children: /* @__PURE__ */ jsx19(
11975
12436
  "button",
11976
12437
  {
11977
12438
  onClick: () => {
@@ -11991,7 +12452,7 @@ var SettingsModal = ({
11991
12452
  }
11992
12453
  );
11993
12454
  };
11994
- var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ jsxs17(
12455
+ var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ jsxs18(
11995
12456
  "button",
11996
12457
  {
11997
12458
  onClick,
@@ -12012,12 +12473,12 @@ var TabButton = ({ active, onClick, icon, label }) => /* @__PURE__ */ jsxs17(
12012
12473
  marginBottom: "4px"
12013
12474
  },
12014
12475
  children: [
12015
- /* @__PURE__ */ jsx18(IconSvg, { name: icon, size: 20 }),
12476
+ /* @__PURE__ */ jsx19(IconSvg, { name: icon, size: 20 }),
12016
12477
  label
12017
12478
  ]
12018
12479
  }
12019
12480
  );
12020
- var SettingRow = ({ label, description, children }) => /* @__PURE__ */ jsxs17(
12481
+ var SettingRow = ({ label, description, children }) => /* @__PURE__ */ jsxs18(
12021
12482
  "div",
12022
12483
  {
12023
12484
  style: {
@@ -12028,9 +12489,9 @@ var SettingRow = ({ label, description, children }) => /* @__PURE__ */ jsxs17(
12028
12489
  borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)"
12029
12490
  },
12030
12491
  children: [
12031
- /* @__PURE__ */ jsxs17("div", { children: [
12032
- /* @__PURE__ */ jsx18("span", { style: { fontSize: "14px", color: "var(--chatllm-text, #374151)" }, children: label }),
12033
- description && /* @__PURE__ */ jsx18("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "2px" }, children: description })
12492
+ /* @__PURE__ */ jsxs18("div", { children: [
12493
+ /* @__PURE__ */ jsx19("span", { style: { fontSize: "14px", color: "var(--chatllm-text, #374151)" }, children: label }),
12494
+ description && /* @__PURE__ */ jsx19("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "2px" }, children: description })
12034
12495
  ] }),
12035
12496
  children
12036
12497
  ]
@@ -12090,11 +12551,11 @@ var memoryCategoryColors = {
12090
12551
  preference: "#8b5cf6"
12091
12552
  };
12092
12553
  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", onImportMemory, importMemoryPrompt }) => {
12093
- const [activeFilter, setActiveFilter] = useState18("all");
12094
- const [expandedId, setExpandedId] = useState18(null);
12095
- const [importModalOpen, setImportModalOpen] = useState18(false);
12096
- const [importText, setImportText] = useState18("");
12097
- const [promptCopied, setPromptCopied] = useState18(false);
12554
+ const [activeFilter, setActiveFilter] = useState19("all");
12555
+ const [expandedId, setExpandedId] = useState19(null);
12556
+ const [importModalOpen, setImportModalOpen] = useState19(false);
12557
+ const [importText, setImportText] = useState19("");
12558
+ const [promptCopied, setPromptCopied] = useState19(false);
12098
12559
  const filteredItems = activeFilter === "all" ? items : items.filter((item) => item.category === activeFilter);
12099
12560
  const formatDate = (timestamp) => {
12100
12561
  const date = new Date(timestamp);
@@ -12105,11 +12566,11 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12105
12566
  minute: "2-digit"
12106
12567
  });
12107
12568
  };
12108
- return /* @__PURE__ */ jsxs17("div", { children: [
12109
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "24px" }, children: [
12110
- /* @__PURE__ */ jsx18("h2", { style: { fontSize: "20px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)", margin: 0 }, children: title }),
12111
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [
12112
- onImportMemory && /* @__PURE__ */ jsxs17(
12569
+ return /* @__PURE__ */ jsxs18("div", { children: [
12570
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "24px" }, children: [
12571
+ /* @__PURE__ */ jsx19("h2", { style: { fontSize: "20px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)", margin: 0 }, children: title }),
12572
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [
12573
+ onImportMemory && /* @__PURE__ */ jsxs18(
12113
12574
  "button",
12114
12575
  {
12115
12576
  onClick: () => setImportModalOpen(true),
@@ -12130,18 +12591,18 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12130
12591
  onMouseEnter: (e) => e.currentTarget.style.opacity = "0.85",
12131
12592
  onMouseLeave: (e) => e.currentTarget.style.opacity = "1",
12132
12593
  children: [
12133
- /* @__PURE__ */ jsx18(IconSvg, { name: "download-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12594
+ /* @__PURE__ */ jsx19(IconSvg, { name: "download-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12134
12595
  "\uAC00\uC838\uC624\uAE30"
12135
12596
  ]
12136
12597
  }
12137
12598
  ),
12138
- /* @__PURE__ */ jsxs17("span", { style: { fontSize: "13px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
12599
+ /* @__PURE__ */ jsxs18("span", { style: { fontSize: "13px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
12139
12600
  items.length,
12140
12601
  "\uAC1C \uD56D\uBAA9"
12141
12602
  ] })
12142
12603
  ] })
12143
12604
  ] }),
12144
- /* @__PURE__ */ jsx18("div", { style: { display: "flex", gap: "6px", marginBottom: "20px", flexWrap: "wrap" }, children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx18(
12605
+ /* @__PURE__ */ jsx19("div", { style: { display: "flex", gap: "6px", marginBottom: "20px", flexWrap: "wrap" }, children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx19(
12145
12606
  "button",
12146
12607
  {
12147
12608
  onClick: () => setActiveFilter(tab),
@@ -12159,7 +12620,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12159
12620
  },
12160
12621
  tab
12161
12622
  )) }),
12162
- contextSummary && activeFilter === "all" && /* @__PURE__ */ jsxs17(
12623
+ contextSummary && activeFilter === "all" && /* @__PURE__ */ jsxs18(
12163
12624
  "div",
12164
12625
  {
12165
12626
  style: {
@@ -12170,19 +12631,19 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12170
12631
  borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
12171
12632
  },
12172
12633
  children: [
12173
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: "6px", marginBottom: "8px" }, children: [
12174
- /* @__PURE__ */ jsx18(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12175
- /* @__PURE__ */ jsx18("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
12634
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "6px", marginBottom: "8px" }, children: [
12635
+ /* @__PURE__ */ jsx19(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12636
+ /* @__PURE__ */ jsx19("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
12176
12637
  ] }),
12177
- /* @__PURE__ */ jsx18("p", { style: { fontSize: "13px", lineHeight: "1.6", color: "var(--chatllm-text, #374151)", margin: 0 }, children: contextSummary })
12638
+ /* @__PURE__ */ jsx19("p", { style: { fontSize: "13px", lineHeight: "1.6", color: "var(--chatllm-text, #374151)", margin: 0 }, children: contextSummary })
12178
12639
  ]
12179
12640
  }
12180
12641
  ),
12181
- filteredItems.length === 0 ? /* @__PURE__ */ jsxs17("div", { style: { padding: "40px 16px", textAlign: "center" }, children: [
12182
- /* @__PURE__ */ jsx18(IconSvg, { name: "robot-line", size: 40, color: "var(--chatllm-text-muted, #d1d5db)" }),
12183
- /* @__PURE__ */ jsx18("p", { style: { fontSize: "14px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "12px" }, children: emptyMessage }),
12184
- /* @__PURE__ */ jsx18("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #d1d5db)", marginTop: "4px" }, children: emptyDescription })
12185
- ] }) : /* @__PURE__ */ jsx18("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ jsxs17(
12642
+ filteredItems.length === 0 ? /* @__PURE__ */ jsxs18("div", { style: { padding: "40px 16px", textAlign: "center" }, children: [
12643
+ /* @__PURE__ */ jsx19(IconSvg, { name: "robot-line", size: 40, color: "var(--chatllm-text-muted, #d1d5db)" }),
12644
+ /* @__PURE__ */ jsx19("p", { style: { fontSize: "14px", color: "var(--chatllm-text-muted, #9ca3af)", marginTop: "12px" }, children: emptyMessage }),
12645
+ /* @__PURE__ */ jsx19("p", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #d1d5db)", marginTop: "4px" }, children: emptyDescription })
12646
+ ] }) : /* @__PURE__ */ jsx19("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ jsxs18(
12186
12647
  "div",
12187
12648
  {
12188
12649
  style: {
@@ -12195,10 +12656,10 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12195
12656
  },
12196
12657
  onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
12197
12658
  children: [
12198
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
12199
- /* @__PURE__ */ jsxs17("div", { style: { flex: 1, minWidth: 0 }, children: [
12200
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
12201
- item.category && /* @__PURE__ */ jsx18(
12659
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
12660
+ /* @__PURE__ */ jsxs18("div", { style: { flex: 1, minWidth: 0 }, children: [
12661
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
12662
+ item.category && /* @__PURE__ */ jsx19(
12202
12663
  "span",
12203
12664
  {
12204
12665
  style: {
@@ -12212,12 +12673,12 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12212
12673
  children: memoryCategoryLabels[item.category]
12213
12674
  }
12214
12675
  ),
12215
- /* @__PURE__ */ jsx18("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
12676
+ /* @__PURE__ */ jsx19("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
12216
12677
  ] }),
12217
- /* @__PURE__ */ jsx18("div", { style: { fontSize: "13px", fontWeight: 500, color: "var(--chatllm-text, #1f2937)" }, children: item.key })
12678
+ /* @__PURE__ */ jsx19("div", { style: { fontSize: "13px", fontWeight: 500, color: "var(--chatllm-text, #1f2937)" }, children: item.key })
12218
12679
  ] }),
12219
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12220
- onDelete && /* @__PURE__ */ jsx18(
12680
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12681
+ onDelete && /* @__PURE__ */ jsx19(
12221
12682
  "button",
12222
12683
  {
12223
12684
  onClick: (e) => {
@@ -12233,10 +12694,10 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12233
12694
  opacity: 0.5
12234
12695
  },
12235
12696
  "aria-label": "\uBA54\uBAA8\uB9AC \uC0AD\uC81C",
12236
- children: /* @__PURE__ */ jsx18(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
12697
+ children: /* @__PURE__ */ jsx19(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
12237
12698
  }
12238
12699
  ),
12239
- /* @__PURE__ */ jsx18(
12700
+ /* @__PURE__ */ jsx19(
12240
12701
  IconSvg,
12241
12702
  {
12242
12703
  name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
@@ -12246,7 +12707,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12246
12707
  )
12247
12708
  ] })
12248
12709
  ] }),
12249
- expandedId === item.id && /* @__PURE__ */ jsx18(
12710
+ expandedId === item.id && /* @__PURE__ */ jsx19(
12250
12711
  "div",
12251
12712
  {
12252
12713
  style: {
@@ -12254,7 +12715,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12254
12715
  paddingTop: "12px",
12255
12716
  borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
12256
12717
  },
12257
- children: /* @__PURE__ */ jsx18(
12718
+ children: /* @__PURE__ */ jsx19(
12258
12719
  "p",
12259
12720
  {
12260
12721
  style: {
@@ -12273,7 +12734,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12273
12734
  },
12274
12735
  item.id
12275
12736
  )) }),
12276
- onClearAll && items.length > 0 && /* @__PURE__ */ jsx18("div", { style: { marginTop: "24px", paddingTop: "16px", borderTop: "1px solid var(--chatllm-border, #e5e7eb)" }, children: /* @__PURE__ */ jsx18(
12737
+ onClearAll && items.length > 0 && /* @__PURE__ */ jsx19("div", { style: { marginTop: "24px", paddingTop: "16px", borderTop: "1px solid var(--chatllm-border, #e5e7eb)" }, children: /* @__PURE__ */ jsx19(
12277
12738
  "button",
12278
12739
  {
12279
12740
  onClick: () => {
@@ -12285,7 +12746,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12285
12746
  children: "\uC804\uCCB4 \uBA54\uBAA8\uB9AC \uC0AD\uC81C"
12286
12747
  }
12287
12748
  ) }),
12288
- importModalOpen && onImportMemory && /* @__PURE__ */ jsx18(
12749
+ importModalOpen && onImportMemory && /* @__PURE__ */ jsx19(
12289
12750
  "div",
12290
12751
  {
12291
12752
  style: {
@@ -12301,7 +12762,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12301
12762
  zIndex: 1100
12302
12763
  },
12303
12764
  onClick: () => setImportModalOpen(false),
12304
- children: /* @__PURE__ */ jsxs17(
12765
+ children: /* @__PURE__ */ jsxs18(
12305
12766
  "div",
12306
12767
  {
12307
12768
  style: {
@@ -12314,7 +12775,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12314
12775
  },
12315
12776
  onClick: (e) => e.stopPropagation(),
12316
12777
  children: [
12317
- /* @__PURE__ */ jsxs17(
12778
+ /* @__PURE__ */ jsxs18(
12318
12779
  "div",
12319
12780
  {
12320
12781
  style: {
@@ -12324,8 +12785,8 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12324
12785
  padding: "20px 24px 16px"
12325
12786
  },
12326
12787
  children: [
12327
- /* @__PURE__ */ jsx18("h3", { style: { fontSize: "18px", fontWeight: 700, color: "var(--chatllm-text, #ffffff)", margin: 0 }, children: "Claude\uB85C \uBA54\uBAA8\uB9AC \uAC00\uC838\uC624\uAE30" }),
12328
- /* @__PURE__ */ jsx18(
12788
+ /* @__PURE__ */ jsx19("h3", { style: { fontSize: "18px", fontWeight: 700, color: "var(--chatllm-text, #ffffff)", margin: 0 }, children: "Claude\uB85C \uBA54\uBAA8\uB9AC \uAC00\uC838\uC624\uAE30" }),
12789
+ /* @__PURE__ */ jsx19(
12329
12790
  "button",
12330
12791
  {
12331
12792
  onClick: () => {
@@ -12340,16 +12801,16 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12340
12801
  borderRadius: "6px",
12341
12802
  cursor: "pointer"
12342
12803
  },
12343
- children: /* @__PURE__ */ jsx18(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #9ca3af)" })
12804
+ children: /* @__PURE__ */ jsx19(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #9ca3af)" })
12344
12805
  }
12345
12806
  )
12346
12807
  ]
12347
12808
  }
12348
12809
  ),
12349
- /* @__PURE__ */ jsxs17("div", { style: { padding: "0 24px 24px" }, children: [
12350
- /* @__PURE__ */ jsxs17("div", { style: { marginBottom: "24px" }, children: [
12351
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: "10px", marginBottom: "12px" }, children: [
12352
- /* @__PURE__ */ jsx18(
12810
+ /* @__PURE__ */ jsxs18("div", { style: { padding: "0 24px 24px" }, children: [
12811
+ /* @__PURE__ */ jsxs18("div", { style: { marginBottom: "24px" }, children: [
12812
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "10px", marginBottom: "12px" }, children: [
12813
+ /* @__PURE__ */ jsx19(
12353
12814
  "div",
12354
12815
  {
12355
12816
  style: {
@@ -12368,9 +12829,9 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12368
12829
  children: "1"
12369
12830
  }
12370
12831
  ),
12371
- /* @__PURE__ */ jsx18("span", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text, #ffffff)" }, children: "\uB2E4\uB978 AI \uC81C\uACF5\uC5C5\uCCB4\uC758 \uCC44\uD305\uC5D0 \uC774 \uD504\uB86C\uD504\uD2B8\uB97C \uBCF5\uC0AC\uD558\uC138\uC694" })
12832
+ /* @__PURE__ */ jsx19("span", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text, #ffffff)" }, children: "\uB2E4\uB978 AI \uC81C\uACF5\uC5C5\uCCB4\uC758 \uCC44\uD305\uC5D0 \uC774 \uD504\uB86C\uD504\uD2B8\uB97C \uBCF5\uC0AC\uD558\uC138\uC694" })
12372
12833
  ] }),
12373
- /* @__PURE__ */ jsxs17(
12834
+ /* @__PURE__ */ jsxs18(
12374
12835
  "div",
12375
12836
  {
12376
12837
  style: {
@@ -12383,7 +12844,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12383
12844
  overflow: "auto"
12384
12845
  },
12385
12846
  children: [
12386
- /* @__PURE__ */ jsx18(
12847
+ /* @__PURE__ */ jsx19(
12387
12848
  "p",
12388
12849
  {
12389
12850
  style: {
@@ -12396,7 +12857,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12396
12857
  children: importMemoryPrompt || DEFAULT_IMPORT_MEMORY_PROMPT
12397
12858
  }
12398
12859
  ),
12399
- /* @__PURE__ */ jsxs17(
12860
+ /* @__PURE__ */ jsxs18(
12400
12861
  "button",
12401
12862
  {
12402
12863
  onClick: () => {
@@ -12421,7 +12882,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12421
12882
  color: "var(--chatllm-text, #ffffff)"
12422
12883
  },
12423
12884
  children: [
12424
- /* @__PURE__ */ jsx18(IconSvg, { name: promptCopied ? "check-line" : "file-copy-line", size: 14, color: "var(--chatllm-text, #ffffff)" }),
12885
+ /* @__PURE__ */ jsx19(IconSvg, { name: promptCopied ? "check-line" : "file-copy-line", size: 14, color: "var(--chatllm-text, #ffffff)" }),
12425
12886
  promptCopied ? "\uBCF5\uC0AC\uB428" : "\uBCF5\uC0AC"
12426
12887
  ]
12427
12888
  }
@@ -12430,9 +12891,9 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12430
12891
  }
12431
12892
  )
12432
12893
  ] }),
12433
- /* @__PURE__ */ jsxs17("div", { children: [
12434
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: "10px", marginBottom: "12px" }, children: [
12435
- /* @__PURE__ */ jsx18(
12894
+ /* @__PURE__ */ jsxs18("div", { children: [
12895
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "10px", marginBottom: "12px" }, children: [
12896
+ /* @__PURE__ */ jsx19(
12436
12897
  "div",
12437
12898
  {
12438
12899
  style: {
@@ -12451,9 +12912,9 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12451
12912
  children: "2"
12452
12913
  }
12453
12914
  ),
12454
- /* @__PURE__ */ jsx18("span", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text, #ffffff)" }, children: "\uC544\uB798\uC5D0 \uACB0\uACFC\uB97C \uBD99\uC5EC\uB123\uC5B4 Claude\uC758 \uBA54\uBAA8\uB9AC\uC5D0 \uCD94\uAC00\uD558\uC138\uC694" })
12915
+ /* @__PURE__ */ jsx19("span", { style: { fontSize: "14px", fontWeight: 500, color: "var(--chatllm-text, #ffffff)" }, children: "\uC544\uB798\uC5D0 \uACB0\uACFC\uB97C \uBD99\uC5EC\uB123\uC5B4 Claude\uC758 \uBA54\uBAA8\uB9AC\uC5D0 \uCD94\uAC00\uD558\uC138\uC694" })
12455
12916
  ] }),
12456
- /* @__PURE__ */ jsx18(
12917
+ /* @__PURE__ */ jsx19(
12457
12918
  "textarea",
12458
12919
  {
12459
12920
  value: importText,
@@ -12480,7 +12941,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12480
12941
  )
12481
12942
  ] })
12482
12943
  ] }),
12483
- /* @__PURE__ */ jsxs17(
12944
+ /* @__PURE__ */ jsxs18(
12484
12945
  "div",
12485
12946
  {
12486
12947
  style: {
@@ -12490,7 +12951,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12490
12951
  padding: "0 24px 20px"
12491
12952
  },
12492
12953
  children: [
12493
- /* @__PURE__ */ jsx18(
12954
+ /* @__PURE__ */ jsx19(
12494
12955
  "button",
12495
12956
  {
12496
12957
  onClick: () => {
@@ -12511,7 +12972,7 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12511
12972
  children: "\uCDE8\uC18C"
12512
12973
  }
12513
12974
  ),
12514
- /* @__PURE__ */ jsx18(
12975
+ /* @__PURE__ */ jsx19(
12515
12976
  "button",
12516
12977
  {
12517
12978
  onClick: () => {
@@ -12551,8 +13012,8 @@ var MemoryTabContent = ({ items, contextSummary, onDelete, onClearAll, title = "
12551
13012
  };
12552
13013
 
12553
13014
  // src/react/components/ProjectSettingsModal.tsx
12554
- import { useState as useState19, useEffect as useEffect11 } from "react";
12555
- import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
13015
+ import { useState as useState20, useEffect as useEffect12 } from "react";
13016
+ import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
12556
13017
  var COLOR_PRESETS = [
12557
13018
  "#3584FA",
12558
13019
  "#7c3aed",
@@ -12572,12 +13033,12 @@ var ProjectSettingsModal = ({
12572
13033
  onDeleteFile,
12573
13034
  onDeleteProject
12574
13035
  }) => {
12575
- const [activeTab, setActiveTab] = useState19("general");
12576
- const [title, setTitle] = useState19("");
12577
- const [description, setDescription] = useState19("");
12578
- const [instructions, setInstructions] = useState19("");
12579
- const [color, setColor] = useState19("#3584FA");
12580
- useEffect11(() => {
13036
+ const [activeTab, setActiveTab] = useState20("general");
13037
+ const [title, setTitle] = useState20("");
13038
+ const [description, setDescription] = useState20("");
13039
+ const [instructions, setInstructions] = useState20("");
13040
+ const [color, setColor] = useState20("#3584FA");
13041
+ useEffect12(() => {
12581
13042
  if (project) {
12582
13043
  setTitle(project.title);
12583
13044
  setDescription(project.description || "");
@@ -12633,7 +13094,7 @@ var ProjectSettingsModal = ({
12633
13094
  cursor: "pointer",
12634
13095
  fontFamily: "inherit"
12635
13096
  });
12636
- return /* @__PURE__ */ jsx19(
13097
+ return /* @__PURE__ */ jsx20(
12637
13098
  "div",
12638
13099
  {
12639
13100
  style: {
@@ -12648,7 +13109,7 @@ var ProjectSettingsModal = ({
12648
13109
  onClick: (e) => {
12649
13110
  if (e.target === e.currentTarget) onClose();
12650
13111
  },
12651
- children: /* @__PURE__ */ jsxs18(
13112
+ children: /* @__PURE__ */ jsxs19(
12652
13113
  "div",
12653
13114
  {
12654
13115
  style: {
@@ -12662,7 +13123,7 @@ var ProjectSettingsModal = ({
12662
13123
  overflow: "hidden"
12663
13124
  },
12664
13125
  children: [
12665
- /* @__PURE__ */ jsxs18(
13126
+ /* @__PURE__ */ jsxs19(
12666
13127
  "div",
12667
13128
  {
12668
13129
  style: {
@@ -12672,8 +13133,8 @@ var ProjectSettingsModal = ({
12672
13133
  padding: "20px 24px 0"
12673
13134
  },
12674
13135
  children: [
12675
- /* @__PURE__ */ jsx19("h2", { style: { fontSize: "16px", fontWeight: 600, margin: 0, color: "var(--chatllm-text, #1a1a1a)" }, children: "\uD504\uB85C\uC81D\uD2B8 \uC124\uC815" }),
12676
- /* @__PURE__ */ jsx19(
13136
+ /* @__PURE__ */ jsx20("h2", { style: { fontSize: "16px", fontWeight: 600, margin: 0, color: "var(--chatllm-text, #1a1a1a)" }, children: "\uD504\uB85C\uC81D\uD2B8 \uC124\uC815" }),
13137
+ /* @__PURE__ */ jsx20(
12677
13138
  "button",
12678
13139
  {
12679
13140
  onClick: onClose,
@@ -12686,13 +13147,13 @@ var ProjectSettingsModal = ({
12686
13147
  alignItems: "center"
12687
13148
  },
12688
13149
  "aria-label": "\uB2EB\uAE30",
12689
- children: /* @__PURE__ */ jsx19(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #999)" })
13150
+ children: /* @__PURE__ */ jsx20(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #999)" })
12690
13151
  }
12691
13152
  )
12692
13153
  ]
12693
13154
  }
12694
13155
  ),
12695
- /* @__PURE__ */ jsxs18(
13156
+ /* @__PURE__ */ jsxs19(
12696
13157
  "div",
12697
13158
  {
12698
13159
  style: {
@@ -12702,9 +13163,9 @@ var ProjectSettingsModal = ({
12702
13163
  borderBottom: "1px solid var(--chatllm-border, #e0e0e0)"
12703
13164
  },
12704
13165
  children: [
12705
- /* @__PURE__ */ jsx19("button", { onClick: () => setActiveTab("general"), style: tabStyle("general"), children: "\uC77C\uBC18" }),
12706
- /* @__PURE__ */ jsx19("button", { onClick: () => setActiveTab("instructions"), style: tabStyle("instructions"), children: "\uC9C0\uCE68" }),
12707
- /* @__PURE__ */ jsxs18("button", { onClick: () => setActiveTab("files"), style: tabStyle("files"), children: [
13166
+ /* @__PURE__ */ jsx20("button", { onClick: () => setActiveTab("general"), style: tabStyle("general"), children: "\uC77C\uBC18" }),
13167
+ /* @__PURE__ */ jsx20("button", { onClick: () => setActiveTab("instructions"), style: tabStyle("instructions"), children: "\uC9C0\uCE68" }),
13168
+ /* @__PURE__ */ jsxs19("button", { onClick: () => setActiveTab("files"), style: tabStyle("files"), children: [
12708
13169
  "\uD30C\uC77C (",
12709
13170
  project.files.length,
12710
13171
  ")"
@@ -12712,11 +13173,11 @@ var ProjectSettingsModal = ({
12712
13173
  ]
12713
13174
  }
12714
13175
  ),
12715
- /* @__PURE__ */ jsxs18("div", { style: { padding: "24px", overflowY: "auto", flex: 1 }, children: [
12716
- activeTab === "general" && /* @__PURE__ */ jsxs18("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [
12717
- /* @__PURE__ */ jsxs18("div", { children: [
12718
- /* @__PURE__ */ jsx19("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uD504\uB85C\uC81D\uD2B8 \uC774\uB984" }),
12719
- /* @__PURE__ */ jsx19(
13176
+ /* @__PURE__ */ jsxs19("div", { style: { padding: "24px", overflowY: "auto", flex: 1 }, children: [
13177
+ activeTab === "general" && /* @__PURE__ */ jsxs19("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [
13178
+ /* @__PURE__ */ jsxs19("div", { children: [
13179
+ /* @__PURE__ */ jsx20("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uD504\uB85C\uC81D\uD2B8 \uC774\uB984" }),
13180
+ /* @__PURE__ */ jsx20(
12720
13181
  "input",
12721
13182
  {
12722
13183
  type: "text",
@@ -12738,9 +13199,9 @@ var ProjectSettingsModal = ({
12738
13199
  }
12739
13200
  )
12740
13201
  ] }),
12741
- /* @__PURE__ */ jsxs18("div", { children: [
12742
- /* @__PURE__ */ jsx19("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uC124\uBA85" }),
12743
- /* @__PURE__ */ jsx19(
13202
+ /* @__PURE__ */ jsxs19("div", { children: [
13203
+ /* @__PURE__ */ jsx20("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uC124\uBA85" }),
13204
+ /* @__PURE__ */ jsx20(
12744
13205
  "textarea",
12745
13206
  {
12746
13207
  value: description,
@@ -12761,9 +13222,9 @@ var ProjectSettingsModal = ({
12761
13222
  }
12762
13223
  )
12763
13224
  ] }),
12764
- /* @__PURE__ */ jsxs18("div", { children: [
12765
- /* @__PURE__ */ jsx19("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uC0C9\uC0C1" }),
12766
- /* @__PURE__ */ jsx19("div", { style: { display: "flex", gap: "8px", flexWrap: "wrap" }, children: COLOR_PRESETS.map((c) => /* @__PURE__ */ jsx19(
13225
+ /* @__PURE__ */ jsxs19("div", { children: [
13226
+ /* @__PURE__ */ jsx20("label", { style: { display: "block", fontSize: "13px", fontWeight: 500, marginBottom: "6px", color: "var(--chatllm-text, #1a1a1a)" }, children: "\uC0C9\uC0C1" }),
13227
+ /* @__PURE__ */ jsx20("div", { style: { display: "flex", gap: "8px", flexWrap: "wrap" }, children: COLOR_PRESETS.map((c) => /* @__PURE__ */ jsx20(
12767
13228
  "button",
12768
13229
  {
12769
13230
  onClick: () => setColor(c),
@@ -12781,8 +13242,8 @@ var ProjectSettingsModal = ({
12781
13242
  c
12782
13243
  )) })
12783
13244
  ] }),
12784
- /* @__PURE__ */ jsxs18("div", { style: { display: "flex", gap: "8px", justifyContent: "flex-end", marginTop: "8px" }, children: [
12785
- !isDefaultProject && onDeleteProject && /* @__PURE__ */ jsx19(
13245
+ /* @__PURE__ */ jsxs19("div", { style: { display: "flex", gap: "8px", justifyContent: "flex-end", marginTop: "8px" }, children: [
13246
+ !isDefaultProject && onDeleteProject && /* @__PURE__ */ jsx20(
12786
13247
  "button",
12787
13248
  {
12788
13249
  onClick: () => {
@@ -12805,7 +13266,7 @@ var ProjectSettingsModal = ({
12805
13266
  children: "\uD504\uB85C\uC81D\uD2B8 \uC0AD\uC81C"
12806
13267
  }
12807
13268
  ),
12808
- /* @__PURE__ */ jsx19(
13269
+ /* @__PURE__ */ jsx20(
12809
13270
  "button",
12810
13271
  {
12811
13272
  onClick: handleSaveGeneral,
@@ -12825,9 +13286,9 @@ var ProjectSettingsModal = ({
12825
13286
  )
12826
13287
  ] })
12827
13288
  ] }),
12828
- activeTab === "instructions" && /* @__PURE__ */ jsxs18("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
12829
- /* @__PURE__ */ jsx19("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." }),
12830
- /* @__PURE__ */ jsx19(
13289
+ activeTab === "instructions" && /* @__PURE__ */ jsxs19("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
13290
+ /* @__PURE__ */ jsx20("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." }),
13291
+ /* @__PURE__ */ jsx20(
12831
13292
  "textarea",
12832
13293
  {
12833
13294
  value: instructions,
@@ -12848,7 +13309,7 @@ var ProjectSettingsModal = ({
12848
13309
  }
12849
13310
  }
12850
13311
  ),
12851
- /* @__PURE__ */ jsx19("div", { style: { display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ jsx19(
13312
+ /* @__PURE__ */ jsx20("div", { style: { display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ jsx20(
12852
13313
  "button",
12853
13314
  {
12854
13315
  onClick: handleSaveInstructions,
@@ -12867,10 +13328,10 @@ var ProjectSettingsModal = ({
12867
13328
  }
12868
13329
  ) })
12869
13330
  ] }),
12870
- activeTab === "files" && /* @__PURE__ */ jsxs18("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
12871
- /* @__PURE__ */ jsxs18("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
12872
- /* @__PURE__ */ jsx19("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." }),
12873
- /* @__PURE__ */ jsxs18(
13331
+ activeTab === "files" && /* @__PURE__ */ jsxs19("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
13332
+ /* @__PURE__ */ jsxs19("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
13333
+ /* @__PURE__ */ jsx20("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." }),
13334
+ /* @__PURE__ */ jsxs19(
12874
13335
  "button",
12875
13336
  {
12876
13337
  onClick: handleFileUpload,
@@ -12888,13 +13349,13 @@ var ProjectSettingsModal = ({
12888
13349
  color: "var(--chatllm-text, #1a1a1a)"
12889
13350
  },
12890
13351
  children: [
12891
- /* @__PURE__ */ jsx19(IconSvg, { name: "upload-line", size: 14 }),
13352
+ /* @__PURE__ */ jsx20(IconSvg, { name: "upload-line", size: 14 }),
12892
13353
  "\uC5C5\uB85C\uB4DC"
12893
13354
  ]
12894
13355
  }
12895
13356
  )
12896
13357
  ] }),
12897
- project.files.length === 0 ? /* @__PURE__ */ jsx19(
13358
+ project.files.length === 0 ? /* @__PURE__ */ jsx20(
12898
13359
  "div",
12899
13360
  {
12900
13361
  style: {
@@ -12907,7 +13368,7 @@ var ProjectSettingsModal = ({
12907
13368
  },
12908
13369
  children: "\uC544\uC9C1 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4"
12909
13370
  }
12910
- ) : /* @__PURE__ */ jsx19("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: project.files.map((file) => /* @__PURE__ */ jsxs18(
13371
+ ) : /* @__PURE__ */ jsx20("div", { style: { display: "flex", flexDirection: "column", gap: "6px" }, children: project.files.map((file) => /* @__PURE__ */ jsxs19(
12911
13372
  "div",
12912
13373
  {
12913
13374
  style: {
@@ -12919,10 +13380,10 @@ var ProjectSettingsModal = ({
12919
13380
  borderRadius: "6px"
12920
13381
  },
12921
13382
  children: [
12922
- /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "10px", overflow: "hidden" }, children: [
12923
- /* @__PURE__ */ jsx19(IconSvg, { name: getFileIcon2(file.type), size: 18, color: "var(--chatllm-text-muted, #999)" }),
12924
- /* @__PURE__ */ jsxs18("div", { style: { overflow: "hidden" }, children: [
12925
- /* @__PURE__ */ jsx19(
13383
+ /* @__PURE__ */ jsxs19("div", { style: { display: "flex", alignItems: "center", gap: "10px", overflow: "hidden" }, children: [
13384
+ /* @__PURE__ */ jsx20(IconSvg, { name: getFileIcon2(file.type), size: 18, color: "var(--chatllm-text-muted, #999)" }),
13385
+ /* @__PURE__ */ jsxs19("div", { style: { overflow: "hidden" }, children: [
13386
+ /* @__PURE__ */ jsx20(
12926
13387
  "div",
12927
13388
  {
12928
13389
  style: {
@@ -12936,13 +13397,13 @@ var ProjectSettingsModal = ({
12936
13397
  children: file.name
12937
13398
  }
12938
13399
  ),
12939
- /* @__PURE__ */ jsxs18("div", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #999)" }, children: [
13400
+ /* @__PURE__ */ jsxs19("div", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #999)" }, children: [
12940
13401
  file.type,
12941
13402
  formatSize(file.size) ? ` \xB7 ${formatSize(file.size)}` : ""
12942
13403
  ] })
12943
13404
  ] })
12944
13405
  ] }),
12945
- /* @__PURE__ */ jsx19(
13406
+ /* @__PURE__ */ jsx20(
12946
13407
  "button",
12947
13408
  {
12948
13409
  onClick: () => onDeleteFile(project.id, file.id),
@@ -12963,7 +13424,7 @@ var ProjectSettingsModal = ({
12963
13424
  e.currentTarget.style.opacity = "0.5";
12964
13425
  },
12965
13426
  "aria-label": `${file.name} \uC0AD\uC81C`,
12966
- children: /* @__PURE__ */ jsx19(IconSvg, { name: "delete-bin-line", size: 16, color: "#dc2626" })
13427
+ children: /* @__PURE__ */ jsx20(IconSvg, { name: "delete-bin-line", size: 16, color: "#dc2626" })
12967
13428
  }
12968
13429
  )
12969
13430
  ]
@@ -12980,14 +13441,14 @@ var ProjectSettingsModal = ({
12980
13441
  };
12981
13442
 
12982
13443
  // src/react/components/DisclaimerModal.tsx
12983
- import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
13444
+ import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
12984
13445
  var highlightStyle = {
12985
13446
  color: "var(--chatllm-text, #1e293b)",
12986
13447
  fontWeight: 600
12987
13448
  };
12988
13449
  var DisclaimerModal = ({ isOpen, onClose }) => {
12989
13450
  if (!isOpen) return null;
12990
- return /* @__PURE__ */ jsx20(
13451
+ return /* @__PURE__ */ jsx21(
12991
13452
  "div",
12992
13453
  {
12993
13454
  className: "chatllm-disclaimer-overlay",
@@ -13001,7 +13462,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13001
13462
  zIndex: 1e3
13002
13463
  },
13003
13464
  onClick: onClose,
13004
- children: /* @__PURE__ */ jsxs19(
13465
+ children: /* @__PURE__ */ jsxs20(
13005
13466
  "div",
13006
13467
  {
13007
13468
  className: "chatllm-disclaimer-modal",
@@ -13019,7 +13480,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13019
13480
  },
13020
13481
  onClick: (e) => e.stopPropagation(),
13021
13482
  children: [
13022
- /* @__PURE__ */ jsxs19(
13483
+ /* @__PURE__ */ jsxs20(
13023
13484
  "div",
13024
13485
  {
13025
13486
  style: {
@@ -13030,9 +13491,9 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13030
13491
  borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
13031
13492
  },
13032
13493
  children: [
13033
- /* @__PURE__ */ jsxs19("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
13034
- /* @__PURE__ */ jsx20(IconSvg, { name: "error-warning-line", size: 20, color: "var(--chatllm-primary, #3584FA)" }),
13035
- /* @__PURE__ */ jsx20(
13494
+ /* @__PURE__ */ jsxs20("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
13495
+ /* @__PURE__ */ jsx21(IconSvg, { name: "error-warning-line", size: 20, color: "var(--chatllm-primary, #3584FA)" }),
13496
+ /* @__PURE__ */ jsx21(
13036
13497
  "h2",
13037
13498
  {
13038
13499
  style: {
@@ -13045,7 +13506,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13045
13506
  }
13046
13507
  )
13047
13508
  ] }),
13048
- /* @__PURE__ */ jsx20(
13509
+ /* @__PURE__ */ jsx21(
13049
13510
  "button",
13050
13511
  {
13051
13512
  onClick: onClose,
@@ -13060,13 +13521,13 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13060
13521
  alignItems: "center",
13061
13522
  justifyContent: "center"
13062
13523
  },
13063
- children: /* @__PURE__ */ jsx20(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #64748b)" })
13524
+ children: /* @__PURE__ */ jsx21(IconSvg, { name: "close-line", size: 20, color: "var(--chatllm-text-muted, #64748b)" })
13064
13525
  }
13065
13526
  )
13066
13527
  ]
13067
13528
  }
13068
13529
  ),
13069
- /* @__PURE__ */ jsxs19(
13530
+ /* @__PURE__ */ jsxs20(
13070
13531
  "div",
13071
13532
  {
13072
13533
  className: "chatllm-scrollbar",
@@ -13078,12 +13539,12 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13078
13539
  color: "var(--chatllm-text-secondary, #475569)"
13079
13540
  },
13080
13541
  children: [
13081
- /* @__PURE__ */ jsxs19("p", { style: { margin: "0 0 16px" }, children: [
13542
+ /* @__PURE__ */ jsxs20("p", { style: { margin: "0 0 16px" }, children: [
13082
13543
  "\uC800\uB294 \uC5EC\uB7EC\uBD84\uC758 \uC9C8\uBB38\uC5D0 ",
13083
- /* @__PURE__ */ jsx20("span", { style: highlightStyle, children: "\uCD5C\uC120\uC758 \uB2F5\uBCC0\uC744 \uB4DC\uB9AC\uAE30 \uC704\uD574 \uD56D\uC0C1 \uB178\uB825" }),
13544
+ /* @__PURE__ */ jsx21("span", { style: highlightStyle, children: "\uCD5C\uC120\uC758 \uB2F5\uBCC0\uC744 \uB4DC\uB9AC\uAE30 \uC704\uD574 \uD56D\uC0C1 \uB178\uB825" }),
13084
13545
  "\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."
13085
13546
  ] }),
13086
- /* @__PURE__ */ jsxs19(
13547
+ /* @__PURE__ */ jsxs20(
13087
13548
  "div",
13088
13549
  {
13089
13550
  style: {
@@ -13096,33 +13557,33 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13096
13557
  lineHeight: 1.7
13097
13558
  },
13098
13559
  children: [
13099
- /* @__PURE__ */ jsx20("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" }),
13100
- /* @__PURE__ */ jsxs19("ul", { style: { margin: 0, paddingLeft: "18px", display: "flex", flexDirection: "column", gap: "4px" }, children: [
13101
- /* @__PURE__ */ jsx20("li", { children: "\uCD5C\uC2E0 \uC815\uBCF4\uB97C \uBC18\uC601\uD558\uC9C0 \uBABB\uD55C \uB2F5\uBCC0\uC744 \uB4DC\uB9AC\uB294 \uACBD\uC6B0" }),
13102
- /* @__PURE__ */ jsx20("li", { children: "\uADF8\uB7F4\uB4EF\uD558\uAC8C \uB4E4\uB9AC\uC9C0\uB9CC \uC2E4\uC81C\uB85C\uB294 \uC815\uD655\uD558\uC9C0 \uC54A\uC740 \uB0B4\uC6A9" }),
13103
- /* @__PURE__ */ jsx20("li", { children: "\uC2E4\uC81C\uB85C \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uCD9C\uCC98\uB098 \uC778\uC6A9\uC744 \uB9CC\uB4E4\uC5B4\uB0B4\uB294 \uACBD\uC6B0" })
13560
+ /* @__PURE__ */ jsx21("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" }),
13561
+ /* @__PURE__ */ jsxs20("ul", { style: { margin: 0, paddingLeft: "18px", display: "flex", flexDirection: "column", gap: "4px" }, children: [
13562
+ /* @__PURE__ */ jsx21("li", { children: "\uCD5C\uC2E0 \uC815\uBCF4\uB97C \uBC18\uC601\uD558\uC9C0 \uBABB\uD55C \uB2F5\uBCC0\uC744 \uB4DC\uB9AC\uB294 \uACBD\uC6B0" }),
13563
+ /* @__PURE__ */ jsx21("li", { children: "\uADF8\uB7F4\uB4EF\uD558\uAC8C \uB4E4\uB9AC\uC9C0\uB9CC \uC2E4\uC81C\uB85C\uB294 \uC815\uD655\uD558\uC9C0 \uC54A\uC740 \uB0B4\uC6A9" }),
13564
+ /* @__PURE__ */ jsx21("li", { children: "\uC2E4\uC81C\uB85C \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uCD9C\uCC98\uB098 \uC778\uC6A9\uC744 \uB9CC\uB4E4\uC5B4\uB0B4\uB294 \uACBD\uC6B0" })
13104
13565
  ] })
13105
13566
  ]
13106
13567
  }
13107
13568
  ),
13108
- /* @__PURE__ */ jsxs19("p", { style: { margin: "0 0 16px" }, children: [
13569
+ /* @__PURE__ */ jsxs20("p", { style: { margin: "0 0 16px" }, children: [
13109
13570
  "\uC774\uB7F0 \uD604\uC0C1\uC744 ",
13110
- /* @__PURE__ */ jsx20("span", { style: highlightStyle, children: "'\uD658\uAC01(Hallucination)'" }),
13571
+ /* @__PURE__ */ jsx21("span", { style: highlightStyle, children: "'\uD658\uAC01(Hallucination)'" }),
13111
13572
  "\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, ",
13112
- /* @__PURE__ */ jsx20("span", { style: highlightStyle, children: "\uD55C \uBC88 \uB354 \uD655\uC778" }),
13573
+ /* @__PURE__ */ jsx21("span", { style: highlightStyle, children: "\uD55C \uBC88 \uB354 \uD655\uC778" }),
13113
13574
  "\uD574 \uC8FC\uC2DC\uBA74 \uAC10\uC0AC\uD558\uACA0\uC2B5\uB2C8\uB2E4."
13114
13575
  ] }),
13115
- /* @__PURE__ */ jsxs19("p", { style: { margin: "0 0 16px" }, children: [
13116
- /* @__PURE__ */ jsx20("span", { style: highlightStyle, children: "\uC81C \uB2F5\uBCC0\uC740 \uCC38\uACE0 \uC790\uB8CC" }),
13576
+ /* @__PURE__ */ jsxs20("p", { style: { margin: "0 0 16px" }, children: [
13577
+ /* @__PURE__ */ jsx21("span", { style: highlightStyle, children: "\uC81C \uB2F5\uBCC0\uC740 \uCC38\uACE0 \uC790\uB8CC" }),
13117
13578
  "\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."
13118
13579
  ] }),
13119
- /* @__PURE__ */ jsxs19("p", { style: { margin: "0 0 16px" }, children: [
13580
+ /* @__PURE__ */ jsxs20("p", { style: { margin: "0 0 16px" }, children: [
13120
13581
  "\uC81C\uAC00 \uC6F9 \uAC80\uC0C9 \uACB0\uACFC\uB97C \uC54C\uB824\uB4DC\uB9B4 \uB54C\uB3C4,",
13121
13582
  " ",
13122
- /* @__PURE__ */ jsx20("span", { style: highlightStyle, children: "\uC6D0\uBCF8 \uCD9C\uCC98\uB97C \uC9C1\uC811 \uD655\uC778" }),
13583
+ /* @__PURE__ */ jsx21("span", { style: highlightStyle, children: "\uC6D0\uBCF8 \uCD9C\uCC98\uB97C \uC9C1\uC811 \uD655\uC778" }),
13123
13584
  "\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."
13124
13585
  ] }),
13125
- /* @__PURE__ */ jsx20(
13586
+ /* @__PURE__ */ jsx21(
13126
13587
  "div",
13127
13588
  {
13128
13589
  style: {
@@ -13133,10 +13594,10 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13133
13594
  lineHeight: 1.7,
13134
13595
  textAlign: "center"
13135
13596
  },
13136
- children: /* @__PURE__ */ jsxs19("p", { style: { margin: 0 }, children: [
13597
+ children: /* @__PURE__ */ jsxs20("p", { style: { margin: 0 }, children: [
13137
13598
  "\uC800\uC5D0 \uB300\uD55C \uC758\uACAC\uC774\uB098 \uAC1C\uC120 \uC81C\uC548\uC774 \uC788\uC73C\uC2DC\uB2E4\uBA74",
13138
13599
  " ",
13139
- /* @__PURE__ */ jsx20(
13600
+ /* @__PURE__ */ jsx21(
13140
13601
  "a",
13141
13602
  {
13142
13603
  href: "mailto:info@gendive.ai",
@@ -13149,7 +13610,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13149
13610
  }
13150
13611
  ),
13151
13612
  "\uB85C \uC54C\uB824\uC8FC\uC138\uC694.",
13152
- /* @__PURE__ */ jsx20("br", {}),
13613
+ /* @__PURE__ */ jsx21("br", {}),
13153
13614
  "\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."
13154
13615
  ] })
13155
13616
  }
@@ -13165,7 +13626,7 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
13165
13626
  };
13166
13627
 
13167
13628
  // src/react/components/ChecklistPanel.tsx
13168
- import { Fragment as Fragment8, jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
13629
+ import { Fragment as Fragment8, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
13169
13630
  var ChecklistPanel = ({
13170
13631
  message,
13171
13632
  isOpen,
@@ -13179,8 +13640,8 @@ var ChecklistPanel = ({
13179
13640
  }) => {
13180
13641
  const block = message?.checklistBlock;
13181
13642
  if (isMobileOverlay) {
13182
- return /* @__PURE__ */ jsxs20(Fragment8, { children: [
13183
- /* @__PURE__ */ jsx21(
13643
+ return /* @__PURE__ */ jsxs21(Fragment8, { children: [
13644
+ /* @__PURE__ */ jsx22(
13184
13645
  "div",
13185
13646
  {
13186
13647
  onClick: onClose,
@@ -13195,7 +13656,7 @@ var ChecklistPanel = ({
13195
13656
  }
13196
13657
  }
13197
13658
  ),
13198
- /* @__PURE__ */ jsx21(
13659
+ /* @__PURE__ */ jsx22(
13199
13660
  "aside",
13200
13661
  {
13201
13662
  style: {
@@ -13218,7 +13679,7 @@ var ChecklistPanel = ({
13218
13679
  )
13219
13680
  ] });
13220
13681
  }
13221
- return /* @__PURE__ */ jsx21(
13682
+ return /* @__PURE__ */ jsx22(
13222
13683
  "aside",
13223
13684
  {
13224
13685
  style: {
@@ -13236,8 +13697,8 @@ var ChecklistPanel = ({
13236
13697
  }
13237
13698
  );
13238
13699
  function renderPanelContent() {
13239
- return /* @__PURE__ */ jsxs20(Fragment8, { children: [
13240
- /* @__PURE__ */ jsxs20(
13700
+ return /* @__PURE__ */ jsxs21(Fragment8, { children: [
13701
+ /* @__PURE__ */ jsxs21(
13241
13702
  "div",
13242
13703
  {
13243
13704
  style: {
@@ -13249,9 +13710,9 @@ var ChecklistPanel = ({
13249
13710
  flexShrink: 0
13250
13711
  },
13251
13712
  children: [
13252
- /* @__PURE__ */ jsxs20("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
13253
- /* @__PURE__ */ jsx21(IconSvg, { name: "list-check", size: 18, color: "var(--chatllm-primary, #3584FA)" }),
13254
- /* @__PURE__ */ jsx21(
13713
+ /* @__PURE__ */ jsxs21("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
13714
+ /* @__PURE__ */ jsx22(IconSvg, { name: "list-check", size: 18, color: "var(--chatllm-primary, #3584FA)" }),
13715
+ /* @__PURE__ */ jsx22(
13255
13716
  "span",
13256
13717
  {
13257
13718
  style: {
@@ -13263,7 +13724,7 @@ var ChecklistPanel = ({
13263
13724
  }
13264
13725
  )
13265
13726
  ] }),
13266
- /* @__PURE__ */ jsx21(
13727
+ /* @__PURE__ */ jsx22(
13267
13728
  "button",
13268
13729
  {
13269
13730
  onClick: onClose,
@@ -13281,13 +13742,13 @@ var ChecklistPanel = ({
13281
13742
  color: "var(--chatllm-text-muted, #94a3b8)",
13282
13743
  transition: "background-color 0.15s ease"
13283
13744
  },
13284
- children: /* @__PURE__ */ jsx21(IconSvg, { name: "close-line", size: 18, color: "currentColor" })
13745
+ children: /* @__PURE__ */ jsx22(IconSvg, { name: "close-line", size: 18, color: "currentColor" })
13285
13746
  }
13286
13747
  )
13287
13748
  ]
13288
13749
  }
13289
13750
  ),
13290
- /* @__PURE__ */ jsx21(
13751
+ /* @__PURE__ */ jsx22(
13291
13752
  "div",
13292
13753
  {
13293
13754
  className: "chatllm-scrollbar",
@@ -13296,7 +13757,7 @@ var ChecklistPanel = ({
13296
13757
  overflowY: "auto",
13297
13758
  padding: "16px"
13298
13759
  },
13299
- children: block && block.items.length > 0 ? /* @__PURE__ */ jsx21(
13760
+ children: block && block.items.length > 0 ? /* @__PURE__ */ jsx22(
13300
13761
  ChecklistCard,
13301
13762
  {
13302
13763
  items: block.items,
@@ -13307,7 +13768,7 @@ var ChecklistPanel = ({
13307
13768
  onSkipStep: onSkip,
13308
13769
  onStart
13309
13770
  }
13310
- ) : /* @__PURE__ */ jsx21(
13771
+ ) : /* @__PURE__ */ jsx22(
13311
13772
  "div",
13312
13773
  {
13313
13774
  style: {
@@ -13384,6 +13845,57 @@ var injectBaseStyles = () => {
13384
13845
  to { opacity: 1; }
13385
13846
  }
13386
13847
 
13848
+ @keyframes chatllm-stream-fadein {
13849
+ from { opacity: 0; transform: translateY(4px); }
13850
+ to { opacity: 1; transform: translateY(0); }
13851
+ }
13852
+
13853
+ .chatllm-message--assistant .chatllm-sheet {
13854
+ animation: chatllm-stream-fadein 0.3s ease-out;
13855
+ }
13856
+
13857
+ /* \uC2A4\uD2B8\uB9AC\uBC0D \uD14D\uC2A4\uD2B8 \uBD80\uB4DC\uB7EC\uC6B4 \uB192\uC774 \uC804\uD658 */
13858
+ .chatllm-message--assistant .chatllm-sheet > div {
13859
+ transition: height 0.15s ease-out;
13860
+ }
13861
+
13862
+ /* \uC2A4\uD2B8\uB9AC\uBC0D \uC911 \uB9C8\uC9C0\uB9C9 \uB2E8\uC5B4 \uD398\uC774\uB4DC\uC778 \uD6A8\uACFC */
13863
+ @keyframes chatllm-word-fadein {
13864
+ from { opacity: 0.3; }
13865
+ to { opacity: 1; }
13866
+ }
13867
+
13868
+ .chatllm-streaming-content p:last-child,
13869
+ .chatllm-streaming-content li:last-child,
13870
+ .chatllm-streaming-content h1:last-child,
13871
+ .chatllm-streaming-content h2:last-child,
13872
+ .chatllm-streaming-content h3:last-child {
13873
+ animation: chatllm-word-fadein 0.2s ease-out;
13874
+ }
13875
+
13876
+ @keyframes chatllm-artifact-enter {
13877
+ from {
13878
+ opacity: 0;
13879
+ transform: translateY(12px) scale(0.97);
13880
+ }
13881
+ to {
13882
+ opacity: 1;
13883
+ transform: translateY(0) scale(1);
13884
+ }
13885
+ }
13886
+
13887
+ .chatllm-artifact-card {
13888
+ animation: chatllm-artifact-enter 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;
13889
+ }
13890
+
13891
+ /** @Todo vibecode - artifact \uC0DD\uC131 \uC911 \uB85C\uB529 \uC778\uB514\uCF00\uC774\uD130 \uC2A4\uD540 + \uD398\uC774\uB4DC\uC778 */
13892
+ .chatllm-artifact-loading {
13893
+ animation: chatllm-stream-fadein 0.3s ease both;
13894
+ }
13895
+ .chatllm-artifact-loading svg {
13896
+ animation: chatllm-spin 1s linear infinite;
13897
+ }
13898
+
13387
13899
  .chatllm-root {
13388
13900
  --chatllm-primary: #3584FA;
13389
13901
  --chatllm-primary-hover: #2D70D5;
@@ -13885,7 +14397,7 @@ var injectFloatingStyles = () => {
13885
14397
  };
13886
14398
 
13887
14399
  // src/react/ChatUI.tsx
13888
- import { Fragment as Fragment9, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
14400
+ import { Fragment as Fragment9, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
13889
14401
  var DEFAULT_ACTIONS = [];
13890
14402
  var DEFAULT_TEMPLATES = [];
13891
14403
  var DEFAULT_MODELS = [
@@ -13991,28 +14503,28 @@ var ChatUIView = ({
13991
14503
  handleChecklistSkip,
13992
14504
  activeChecklistMessage
13993
14505
  } = state;
13994
- const [disclaimerOpen, setDisclaimerOpen] = React16.useState(false);
13995
- const [isMobile, setIsMobile] = React16.useState(false);
13996
- React16.useEffect(() => {
14506
+ const [disclaimerOpen, setDisclaimerOpen] = React17.useState(false);
14507
+ const [isMobile, setIsMobile] = React17.useState(false);
14508
+ React17.useEffect(() => {
13997
14509
  if (typeof window === "undefined") return;
13998
14510
  const check = () => setIsMobile(window.innerWidth < 768);
13999
14511
  check();
14000
14512
  window.addEventListener("resize", check);
14001
14513
  return () => window.removeEventListener("resize", check);
14002
14514
  }, []);
14003
- const [checklistPanelDismissed, setChecklistPanelDismissed] = React16.useState(false);
14515
+ const [checklistPanelDismissed, setChecklistPanelDismissed] = React17.useState(false);
14004
14516
  const isChecklistPanelOpen = !!activeChecklistMessage && !checklistPanelDismissed;
14005
- const prevChecklistIdRef = React16.useRef(void 0);
14006
- React16.useEffect(() => {
14517
+ const prevChecklistIdRef = React17.useRef(void 0);
14518
+ React17.useEffect(() => {
14007
14519
  const currentId = activeChecklistMessage?.checklistBlock?.id;
14008
14520
  if (currentId && currentId !== prevChecklistIdRef.current && !activeChecklistMessage?.checklistBlock?.completed) {
14009
14521
  setChecklistPanelDismissed(false);
14010
14522
  }
14011
14523
  prevChecklistIdRef.current = currentId;
14012
14524
  }, [activeChecklistMessage?.checklistBlock?.id, activeChecklistMessage?.checklistBlock?.completed]);
14013
- const [welcomeExiting, setWelcomeExiting] = React16.useState(false);
14014
- const prevMessageCountRef = React16.useRef(messages.length);
14015
- React16.useEffect(() => {
14525
+ const [welcomeExiting, setWelcomeExiting] = React17.useState(false);
14526
+ const prevMessageCountRef = React17.useRef(messages.length);
14527
+ React17.useEffect(() => {
14016
14528
  let timer;
14017
14529
  if (prevMessageCountRef.current === 0 && messages.length > 0) {
14018
14530
  setWelcomeExiting(true);
@@ -14036,7 +14548,7 @@ var ChatUIView = ({
14036
14548
  const handleChoiceClick = (choice) => {
14037
14549
  setInput(choice.text);
14038
14550
  };
14039
- const memoryItems = React16.useMemo(() => {
14551
+ const memoryItems = React17.useMemo(() => {
14040
14552
  if (!globalMemory?.state.entries) return [];
14041
14553
  const items = [];
14042
14554
  for (const [key, entry] of globalMemory.state.entries) {
@@ -14050,7 +14562,7 @@ var ChatUIView = ({
14050
14562
  }
14051
14563
  return items;
14052
14564
  }, [globalMemory?.state.entries]);
14053
- const projectMemoryItems = React16.useMemo(() => {
14565
+ const projectMemoryItems = React17.useMemo(() => {
14054
14566
  if (!projectMemory?.state.entries) return [];
14055
14567
  const items = [];
14056
14568
  for (const [key, entry] of projectMemory.state.entries) {
@@ -14065,7 +14577,7 @@ var ChatUIView = ({
14065
14577
  return items;
14066
14578
  }, [projectMemory?.state.entries]);
14067
14579
  const themeClass = theme?.mode === "dark" ? "chatllm-dark" : "";
14068
- return /* @__PURE__ */ jsxs21(
14580
+ return /* @__PURE__ */ jsxs22(
14069
14581
  "div",
14070
14582
  {
14071
14583
  className: `chatllm-root ${themeClass} ${className}`,
@@ -14078,7 +14590,7 @@ var ChatUIView = ({
14078
14590
  position: "relative"
14079
14591
  },
14080
14592
  children: [
14081
- showSidebar && /* @__PURE__ */ jsx22(
14593
+ showSidebar && /* @__PURE__ */ jsx23(
14082
14594
  ChatSidebar,
14083
14595
  {
14084
14596
  sessions,
@@ -14110,7 +14622,7 @@ var ChatUIView = ({
14110
14622
  isLoading: isSessionsLoading
14111
14623
  }
14112
14624
  ),
14113
- /* @__PURE__ */ jsxs21(
14625
+ /* @__PURE__ */ jsxs22(
14114
14626
  "main",
14115
14627
  {
14116
14628
  style: {
@@ -14122,7 +14634,7 @@ var ChatUIView = ({
14122
14634
  minWidth: 0
14123
14635
  },
14124
14636
  children: [
14125
- /* @__PURE__ */ jsx22(
14637
+ /* @__PURE__ */ jsx23(
14126
14638
  ChatHeader,
14127
14639
  {
14128
14640
  title: currentSession?.title || "\uC0C8 \uB300\uD654",
@@ -14137,7 +14649,7 @@ var ChatUIView = ({
14137
14649
  renderHeaderExtra
14138
14650
  }
14139
14651
  ),
14140
- (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ jsxs21(
14652
+ (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ jsxs22(
14141
14653
  "div",
14142
14654
  {
14143
14655
  style: {
@@ -14152,7 +14664,7 @@ var ChatUIView = ({
14152
14664
  pointerEvents: welcomeExiting ? "none" : "auto"
14153
14665
  },
14154
14666
  children: [
14155
- /* @__PURE__ */ jsx22(
14667
+ /* @__PURE__ */ jsx23(
14156
14668
  "h1",
14157
14669
  {
14158
14670
  style: {
@@ -14166,7 +14678,7 @@ var ChatUIView = ({
14166
14678
  children: greeting ? `${greeting} \u273A` : "\u273A \uBB34\uC5C7\uC744 \uC0DD\uAC01\uD574 \uBCFC\uAE4C\uC694?"
14167
14679
  }
14168
14680
  ),
14169
- /* @__PURE__ */ jsx22("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ jsx22(
14681
+ /* @__PURE__ */ jsx23("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ jsx23(
14170
14682
  ChatInput,
14171
14683
  {
14172
14684
  value: input,
@@ -14194,7 +14706,7 @@ var ChatUIView = ({
14194
14706
  inline: true
14195
14707
  }
14196
14708
  ) }),
14197
- suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx22(
14709
+ suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx23(
14198
14710
  "div",
14199
14711
  {
14200
14712
  style: {
@@ -14204,7 +14716,7 @@ var ChatUIView = ({
14204
14716
  justifyContent: "center",
14205
14717
  maxWidth: "680px"
14206
14718
  },
14207
- children: suggestedPrompts.map((sp) => /* @__PURE__ */ jsxs21(
14719
+ children: suggestedPrompts.map((sp) => /* @__PURE__ */ jsxs22(
14208
14720
  "button",
14209
14721
  {
14210
14722
  onClick: () => setInput(sp.prompt),
@@ -14223,7 +14735,7 @@ var ChatUIView = ({
14223
14735
  transition: "all 0.2s"
14224
14736
  },
14225
14737
  children: [
14226
- sp.icon && /* @__PURE__ */ jsx22(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
14738
+ sp.icon && /* @__PURE__ */ jsx23(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
14227
14739
  sp.label
14228
14740
  ]
14229
14741
  },
@@ -14234,8 +14746,8 @@ var ChatUIView = ({
14234
14746
  ]
14235
14747
  }
14236
14748
  ),
14237
- messages.length > 0 && /* @__PURE__ */ jsxs21(Fragment9, { children: [
14238
- /* @__PURE__ */ jsx22(
14749
+ messages.length > 0 && /* @__PURE__ */ jsxs22(Fragment9, { children: [
14750
+ /* @__PURE__ */ jsx23(
14239
14751
  MessageList,
14240
14752
  {
14241
14753
  messages,
@@ -14265,7 +14777,7 @@ var ChatUIView = ({
14265
14777
  onToggleChecklistPanel: () => setChecklistPanelDismissed(false)
14266
14778
  }
14267
14779
  ),
14268
- /* @__PURE__ */ jsx22(
14780
+ /* @__PURE__ */ jsx23(
14269
14781
  ChatInput,
14270
14782
  {
14271
14783
  value: input,
@@ -14296,7 +14808,7 @@ var ChatUIView = ({
14296
14808
  ]
14297
14809
  }
14298
14810
  ),
14299
- /* @__PURE__ */ jsx22(
14811
+ /* @__PURE__ */ jsx23(
14300
14812
  ChecklistPanel,
14301
14813
  {
14302
14814
  message: activeChecklistMessage,
@@ -14309,7 +14821,7 @@ var ChatUIView = ({
14309
14821
  isMobileOverlay: isMobile
14310
14822
  }
14311
14823
  ),
14312
- showSettings && /* @__PURE__ */ jsx22(
14824
+ showSettings && /* @__PURE__ */ jsx23(
14313
14825
  SettingsModal,
14314
14826
  {
14315
14827
  isOpen: settingsOpen,
@@ -14338,7 +14850,7 @@ var ChatUIView = ({
14338
14850
  importMemoryPrompt
14339
14851
  }
14340
14852
  ),
14341
- /* @__PURE__ */ jsx22(
14853
+ /* @__PURE__ */ jsx23(
14342
14854
  ProjectSettingsModal,
14343
14855
  {
14344
14856
  isOpen: projectSettingsOpen,
@@ -14350,7 +14862,7 @@ var ChatUIView = ({
14350
14862
  onDeleteProject: deleteProject
14351
14863
  }
14352
14864
  ),
14353
- /* @__PURE__ */ jsx22(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
14865
+ /* @__PURE__ */ jsx23(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
14354
14866
  ]
14355
14867
  }
14356
14868
  );
@@ -14475,7 +14987,7 @@ var ChatUIWithHook = ({
14475
14987
  onUploadImage
14476
14988
  };
14477
14989
  const state = useChatUI(hookOptions);
14478
- return /* @__PURE__ */ jsx22(
14990
+ return /* @__PURE__ */ jsx23(
14479
14991
  ChatUIView,
14480
14992
  {
14481
14993
  state,
@@ -14532,7 +15044,7 @@ var ChatUI = (props) => {
14532
15044
  onImportMemory,
14533
15045
  importMemoryPrompt
14534
15046
  } = props;
14535
- return /* @__PURE__ */ jsx22(
15047
+ return /* @__PURE__ */ jsx23(
14536
15048
  ChatUIView,
14537
15049
  {
14538
15050
  state: props.chatState,
@@ -14562,17 +15074,17 @@ var ChatUI = (props) => {
14562
15074
  }
14563
15075
  );
14564
15076
  }
14565
- return /* @__PURE__ */ jsx22(ChatUIWithHook, { ...props });
15077
+ return /* @__PURE__ */ jsx23(ChatUIWithHook, { ...props });
14566
15078
  };
14567
15079
 
14568
15080
  // src/react/ChatFloatingWidget.tsx
14569
- import { useState as useState27, useRef as useRef16, useEffect as useEffect18, useMemo as useMemo7, useCallback as useCallback14 } from "react";
15081
+ import { useState as useState28, useRef as useRef17, useEffect as useEffect19, useMemo as useMemo7, useCallback as useCallback15 } from "react";
14570
15082
 
14571
15083
  // src/react/hooks/useFloatingWidget.ts
14572
- import { useState as useState21, useCallback as useCallback11, useEffect as useEffect13, useRef as useRef11 } from "react";
15084
+ import { useState as useState22, useCallback as useCallback12, useEffect as useEffect14, useRef as useRef12 } from "react";
14573
15085
 
14574
15086
  // src/react/hooks/useDragResize.ts
14575
- import { useState as useState20, useRef as useRef10, useCallback as useCallback10, useEffect as useEffect12, useMemo as useMemo6 } from "react";
15087
+ import { useState as useState21, useRef as useRef11, useCallback as useCallback11, useEffect as useEffect13, useMemo as useMemo6 } from "react";
14576
15088
  var DRAG_THRESHOLD = 5;
14577
15089
  var FAB_SIZE = 56;
14578
15090
  var EDGE_MARGIN = 24;
@@ -14640,8 +15152,8 @@ var useDragResize = (options) => {
14640
15152
  maxWidth = DEFAULT_MAX_WIDTH,
14641
15153
  minHeight = DEFAULT_MIN_HEIGHT
14642
15154
  } = options;
14643
- const [isMobile, setIsMobile] = useState20(false);
14644
- useEffect12(() => {
15155
+ const [isMobile, setIsMobile] = useState21(false);
15156
+ useEffect13(() => {
14645
15157
  if (typeof window === "undefined") return;
14646
15158
  const mql = window.matchMedia("(max-width: 767px)");
14647
15159
  setIsMobile(mql.matches);
@@ -14656,19 +15168,19 @@ var useDragResize = (options) => {
14656
15168
  panelWidth: initialWidth,
14657
15169
  panelHeight: initialHeight
14658
15170
  });
14659
- const [fabPos, setFabPos] = useState20({ x: persisted.fabX, y: persisted.fabY });
14660
- const [panelSize, setPanelSize] = useState20({ width: persisted.panelWidth, height: persisted.panelHeight });
14661
- const [isDragging, setIsDragging] = useState20(false);
14662
- const [isResizing, setIsResizing] = useState20(false);
14663
- const [isDizzy, setIsDizzy] = useState20(false);
14664
- const [viewport, setViewport] = useState20(() => ({
15171
+ const [fabPos, setFabPos] = useState21({ x: persisted.fabX, y: persisted.fabY });
15172
+ const [panelSize, setPanelSize] = useState21({ width: persisted.panelWidth, height: persisted.panelHeight });
15173
+ const [isDragging, setIsDragging] = useState21(false);
15174
+ const [isResizing, setIsResizing] = useState21(false);
15175
+ const [isDizzy, setIsDizzy] = useState21(false);
15176
+ const [viewport, setViewport] = useState21(() => ({
14665
15177
  width: typeof window !== "undefined" ? window.innerWidth : 1024,
14666
15178
  height: typeof window !== "undefined" ? window.innerHeight : 768
14667
15179
  }));
14668
15180
  const vw = viewport.width;
14669
15181
  const vh = viewport.height;
14670
- const initializedRef = useRef10(false);
14671
- useEffect12(() => {
15182
+ const initializedRef = useRef11(false);
15183
+ useEffect13(() => {
14672
15184
  if (initializedRef.current || typeof window === "undefined") return;
14673
15185
  initializedRef.current = true;
14674
15186
  const correctFab = getInitialFabPosition(initialPosition);
@@ -14681,39 +15193,39 @@ var useDragResize = (options) => {
14681
15193
  setFabPos({ x: loaded.fabX, y: loaded.fabY });
14682
15194
  setPanelSize({ width: loaded.panelWidth, height: loaded.panelHeight });
14683
15195
  }, [initialPosition, storageKey, initialWidth, initialHeight]);
14684
- const dragStartRef = useRef10(null);
14685
- const isDraggingRef = useRef10(false);
14686
- const wasDragRef = useRef10(false);
14687
- const dragDeltaRef = useRef10({ dx: 0, dy: 0 });
14688
- const fabElRef = useRef10(null);
14689
- const dragCleanupRef = useRef10(null);
14690
- const snapTimerRef = useRef10(null);
14691
- const prevDragRef = useRef10(null);
14692
- const shakeScoreRef = useRef10(0);
14693
- const prevVelocityRef = useRef10(null);
14694
- const isDizzyRef = useRef10(false);
14695
- const dizzyTimerRef = useRef10(null);
14696
- const lastVelocityRef = useRef10({ vx: 0, vy: 0, speed: 0 });
14697
- const dragRafRef = useRef10(null);
14698
- const animCleanupRef = useRef10(null);
14699
- const snapEnabledRef = useRef10(snapEnabled);
14700
- const storageKeyRef = useRef10(storageKey);
14701
- const panelSizeRef = useRef10(panelSize);
14702
- const fabPosRef = useRef10(fabPos);
14703
- useEffect12(() => {
15196
+ const dragStartRef = useRef11(null);
15197
+ const isDraggingRef = useRef11(false);
15198
+ const wasDragRef = useRef11(false);
15199
+ const dragDeltaRef = useRef11({ dx: 0, dy: 0 });
15200
+ const fabElRef = useRef11(null);
15201
+ const dragCleanupRef = useRef11(null);
15202
+ const snapTimerRef = useRef11(null);
15203
+ const prevDragRef = useRef11(null);
15204
+ const shakeScoreRef = useRef11(0);
15205
+ const prevVelocityRef = useRef11(null);
15206
+ const isDizzyRef = useRef11(false);
15207
+ const dizzyTimerRef = useRef11(null);
15208
+ const lastVelocityRef = useRef11({ vx: 0, vy: 0, speed: 0 });
15209
+ const dragRafRef = useRef11(null);
15210
+ const animCleanupRef = useRef11(null);
15211
+ const snapEnabledRef = useRef11(snapEnabled);
15212
+ const storageKeyRef = useRef11(storageKey);
15213
+ const panelSizeRef = useRef11(panelSize);
15214
+ const fabPosRef = useRef11(fabPos);
15215
+ useEffect13(() => {
14704
15216
  snapEnabledRef.current = snapEnabled;
14705
15217
  }, [snapEnabled]);
14706
- useEffect12(() => {
15218
+ useEffect13(() => {
14707
15219
  storageKeyRef.current = storageKey;
14708
15220
  }, [storageKey]);
14709
- useEffect12(() => {
15221
+ useEffect13(() => {
14710
15222
  panelSizeRef.current = panelSize;
14711
15223
  }, [panelSize]);
14712
- useEffect12(() => {
15224
+ useEffect13(() => {
14713
15225
  fabPosRef.current = fabPos;
14714
15226
  }, [fabPos]);
14715
- const resizeStartRef = useRef10(null);
14716
- useEffect12(() => {
15227
+ const resizeStartRef = useRef11(null);
15228
+ useEffect13(() => {
14717
15229
  return () => {
14718
15230
  dragCleanupRef.current?.();
14719
15231
  if (snapTimerRef.current) clearTimeout(snapTimerRef.current);
@@ -14721,7 +15233,7 @@ var useDragResize = (options) => {
14721
15233
  if (dragRafRef.current) cancelAnimationFrame(dragRafRef.current);
14722
15234
  };
14723
15235
  }, []);
14724
- const handleFabPointerDown = useCallback10((e) => {
15236
+ const handleFabPointerDown = useCallback11((e) => {
14725
15237
  if (disabled || isMobile) return;
14726
15238
  dragCleanupRef.current?.();
14727
15239
  const el = e.currentTarget;
@@ -14934,7 +15446,7 @@ var useDragResize = (options) => {
14934
15446
  borderRadius: "var(--floating-panel-radius, 16px)"
14935
15447
  };
14936
15448
  }, [isMobile, disabled, fabPos.x, fabPos.y, panelSize.width, panelSize.height, vw, vh, panelDirection, minHeight]);
14937
- const handleResizePointerDown = useCallback10((edge, e) => {
15449
+ const handleResizePointerDown = useCallback11((edge, e) => {
14938
15450
  if (disabled || isMobile) return;
14939
15451
  e.preventDefault();
14940
15452
  e.stopPropagation();
@@ -14950,7 +15462,7 @@ var useDragResize = (options) => {
14950
15462
  };
14951
15463
  setIsResizing(true);
14952
15464
  }, [disabled, isMobile]);
14953
- const handleResizePointerMove = useCallback10((e) => {
15465
+ const handleResizePointerMove = useCallback11((e) => {
14954
15466
  if (!resizeStartRef.current) return;
14955
15467
  const { startX, startY, width, height, edge, fabY } = resizeStartRef.current;
14956
15468
  const dx = e.clientX - startX;
@@ -14974,7 +15486,7 @@ var useDragResize = (options) => {
14974
15486
  newHeight = Math.max(minHeight, Math.min(maxH, newHeight));
14975
15487
  setPanelSize({ width: newWidth, height: newHeight });
14976
15488
  }, [minWidth, maxWidth, minHeight]);
14977
- const handleResizePointerUp = useCallback10((e) => {
15489
+ const handleResizePointerUp = useCallback11((e) => {
14978
15490
  if (!resizeStartRef.current) return;
14979
15491
  e.currentTarget.releasePointerCapture(e.pointerId);
14980
15492
  resizeStartRef.current = null;
@@ -14983,7 +15495,7 @@ var useDragResize = (options) => {
14983
15495
  const fp = fabPosRef.current;
14984
15496
  persistState(storageKeyRef.current, { fabX: fp.x, fabY: fp.y, panelWidth: ps.width, panelHeight: ps.height });
14985
15497
  }, []);
14986
- useEffect12(() => {
15498
+ useEffect13(() => {
14987
15499
  if (typeof window === "undefined") return;
14988
15500
  const handleResize = () => {
14989
15501
  const newVw = window.innerWidth;
@@ -15041,9 +15553,9 @@ var useFloatingWidget = (options) => {
15041
15553
  maxWidth,
15042
15554
  minHeight
15043
15555
  } = options || {};
15044
- const [isOpen, setIsOpen] = useState21(defaultOpen);
15045
- const [activeTab, setActiveTab] = useState21(defaultTab);
15046
- const panelRef = useRef11(null);
15556
+ const [isOpen, setIsOpen] = useState22(defaultOpen);
15557
+ const [activeTab, setActiveTab] = useState22(defaultTab);
15558
+ const panelRef = useRef12(null);
15047
15559
  const dragResize = useDragResize({
15048
15560
  initialPosition: position,
15049
15561
  initialWidth: width,
@@ -15055,27 +15567,27 @@ var useFloatingWidget = (options) => {
15055
15567
  maxWidth,
15056
15568
  minHeight
15057
15569
  });
15058
- const onOpenRef = useRef11(onOpen);
15059
- const onCloseRef = useRef11(onClose);
15060
- const onTabChangeRef = useRef11(onTabChange);
15061
- useEffect13(() => {
15570
+ const onOpenRef = useRef12(onOpen);
15571
+ const onCloseRef = useRef12(onClose);
15572
+ const onTabChangeRef = useRef12(onTabChange);
15573
+ useEffect14(() => {
15062
15574
  onOpenRef.current = onOpen;
15063
15575
  }, [onOpen]);
15064
- useEffect13(() => {
15576
+ useEffect14(() => {
15065
15577
  onCloseRef.current = onClose;
15066
15578
  }, [onClose]);
15067
- useEffect13(() => {
15579
+ useEffect14(() => {
15068
15580
  onTabChangeRef.current = onTabChange;
15069
15581
  }, [onTabChange]);
15070
- const open = useCallback11(() => {
15582
+ const open = useCallback12(() => {
15071
15583
  setIsOpen(true);
15072
15584
  onOpenRef.current?.();
15073
15585
  }, []);
15074
- const close = useCallback11(() => {
15586
+ const close = useCallback12(() => {
15075
15587
  setIsOpen(false);
15076
15588
  onCloseRef.current?.();
15077
15589
  }, []);
15078
- const toggle = useCallback11(() => {
15590
+ const toggle = useCallback12(() => {
15079
15591
  setIsOpen((prev) => {
15080
15592
  const next = !prev;
15081
15593
  if (next) onOpenRef.current?.();
@@ -15083,15 +15595,15 @@ var useFloatingWidget = (options) => {
15083
15595
  return next;
15084
15596
  });
15085
15597
  }, []);
15086
- const setTab = useCallback11((tabKey) => {
15598
+ const setTab = useCallback12((tabKey) => {
15087
15599
  setActiveTab(tabKey);
15088
15600
  onTabChangeRef.current?.(tabKey);
15089
15601
  }, []);
15090
- const handleFabInteraction = useCallback11(() => {
15602
+ const handleFabInteraction = useCallback12(() => {
15091
15603
  if (dragResize.isDragging) return;
15092
15604
  toggle();
15093
15605
  }, [dragResize.isDragging, toggle]);
15094
- useEffect13(() => {
15606
+ useEffect14(() => {
15095
15607
  if (!isOpen) return;
15096
15608
  const handleKeyDown = (e) => {
15097
15609
  if (e.key === "Escape") {
@@ -15101,7 +15613,7 @@ var useFloatingWidget = (options) => {
15101
15613
  document.addEventListener("keydown", handleKeyDown);
15102
15614
  return () => document.removeEventListener("keydown", handleKeyDown);
15103
15615
  }, [isOpen, close]);
15104
- useEffect13(() => {
15616
+ useEffect14(() => {
15105
15617
  if (!isOpen) return;
15106
15618
  const handleClickOutside = (e) => {
15107
15619
  if (dragResize.isDragging || dragResize.isResizing) return;
@@ -15117,11 +15629,11 @@ var useFloatingWidget = (options) => {
15117
15629
  };
15118
15630
 
15119
15631
  // src/react/components/floating/FloatingFab.tsx
15120
- import { useRef as useRef13, useState as useState23, useEffect as useEffect15 } from "react";
15632
+ import { useRef as useRef14, useState as useState24, useEffect as useEffect16 } from "react";
15121
15633
 
15122
15634
  // src/react/components/floating/DevDiveCharacter.tsx
15123
- import { useState as useState22, useEffect as useEffect14, useRef as useRef12, useCallback as useCallback12 } from "react";
15124
- import { Fragment as Fragment10, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
15635
+ import { useState as useState23, useEffect as useEffect15, useRef as useRef13, useCallback as useCallback13 } from "react";
15636
+ import { Fragment as Fragment10, jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
15125
15637
  var THEMES = {
15126
15638
  dark: { body: "#2ecc71", stroke: "#27ae60", highlight: "#3ddc84", face: "#1a1a2e", eyeLight: "#fff" },
15127
15639
  light: { body: "#1a1a2e", stroke: "#12122a", highlight: "#2a2a3e", face: "#2ecc71", eyeLight: "#fff" }
@@ -15141,32 +15653,32 @@ var DevDiveFabCharacter = ({
15141
15653
  isComplete = false
15142
15654
  }) => {
15143
15655
  const c = THEMES[theme];
15144
- const [eyeOffset, setEyeOffset] = useState22({ x: 0, y: 0 });
15145
- const [isBlinking, setIsBlinking] = useState22(false);
15146
- const [isHappy, setIsHappy] = useState22(false);
15147
- const [isPressed, setIsPressed] = useState22(false);
15148
- const [mouthOpen, setMouthOpen] = useState22(false);
15149
- const [isSleepy, setIsSleepy] = useState22(false);
15150
- const [isSurprised, setIsSurprised] = useState22(false);
15151
- const [isWinking, setIsWinking] = useState22(false);
15152
- const [isCatMouth, setIsCatMouth] = useState22(false);
15153
- const [isEntering, setIsEntering] = useState22(true);
15154
- const svgRef = useRef12(null);
15155
- const cleanupRef = useRef12(null);
15156
- const lastActivityRef = useRef12(Date.now());
15157
- const isSleepyRef = useRef12(false);
15158
- const markActivity = useCallback12(() => {
15656
+ const [eyeOffset, setEyeOffset] = useState23({ x: 0, y: 0 });
15657
+ const [isBlinking, setIsBlinking] = useState23(false);
15658
+ const [isHappy, setIsHappy] = useState23(false);
15659
+ const [isPressed, setIsPressed] = useState23(false);
15660
+ const [mouthOpen, setMouthOpen] = useState23(false);
15661
+ const [isSleepy, setIsSleepy] = useState23(false);
15662
+ const [isSurprised, setIsSurprised] = useState23(false);
15663
+ const [isWinking, setIsWinking] = useState23(false);
15664
+ const [isCatMouth, setIsCatMouth] = useState23(false);
15665
+ const [isEntering, setIsEntering] = useState23(true);
15666
+ const svgRef = useRef13(null);
15667
+ const cleanupRef = useRef13(null);
15668
+ const lastActivityRef = useRef13(Date.now());
15669
+ const isSleepyRef = useRef13(false);
15670
+ const markActivity = useCallback13(() => {
15159
15671
  lastActivityRef.current = Date.now();
15160
15672
  if (isSleepyRef.current) {
15161
15673
  isSleepyRef.current = false;
15162
15674
  setIsSleepy(false);
15163
15675
  }
15164
15676
  }, []);
15165
- useEffect14(() => {
15677
+ useEffect15(() => {
15166
15678
  const t = setTimeout(() => setIsEntering(false), 600);
15167
15679
  return () => clearTimeout(t);
15168
15680
  }, []);
15169
- useEffect14(() => {
15681
+ useEffect15(() => {
15170
15682
  let timer;
15171
15683
  let blinkTimer;
15172
15684
  const scheduleBlink = () => {
@@ -15182,7 +15694,7 @@ var DevDiveFabCharacter = ({
15182
15694
  clearTimeout(blinkTimer);
15183
15695
  };
15184
15696
  }, []);
15185
- useEffect14(() => {
15697
+ useEffect15(() => {
15186
15698
  if (!isTalking) {
15187
15699
  setMouthOpen(false);
15188
15700
  return;
@@ -15195,7 +15707,7 @@ var DevDiveFabCharacter = ({
15195
15707
  toggle();
15196
15708
  return () => clearTimeout(timer);
15197
15709
  }, [isTalking]);
15198
- useEffect14(() => {
15710
+ useEffect15(() => {
15199
15711
  if (typeof window === "undefined") return;
15200
15712
  let rafId = 0;
15201
15713
  const onMouseMove = (e) => {
@@ -15219,7 +15731,7 @@ var DevDiveFabCharacter = ({
15219
15731
  cancelAnimationFrame(rafId);
15220
15732
  };
15221
15733
  }, []);
15222
- useEffect14(() => {
15734
+ useEffect15(() => {
15223
15735
  let upTimer;
15224
15736
  let surpriseTimer;
15225
15737
  const rafId = requestAnimationFrame(() => {
@@ -15262,10 +15774,10 @@ var DevDiveFabCharacter = ({
15262
15774
  cleanupRef.current?.();
15263
15775
  };
15264
15776
  }, [markActivity]);
15265
- useEffect14(() => {
15777
+ useEffect15(() => {
15266
15778
  markActivity();
15267
15779
  }, [isOpen, isTalking, markActivity]);
15268
- useEffect14(() => {
15780
+ useEffect15(() => {
15269
15781
  if (isOpen || isTalking || isDizzy) return;
15270
15782
  const check = setInterval(() => {
15271
15783
  if (Date.now() - lastActivityRef.current > IDLE_TIMEOUT_MS && !isSleepyRef.current) {
@@ -15275,8 +15787,8 @@ var DevDiveFabCharacter = ({
15275
15787
  }, 5e3);
15276
15788
  return () => clearInterval(check);
15277
15789
  }, [isOpen, isTalking, isDizzy]);
15278
- const prevCompleteRef = useRef12(false);
15279
- useEffect14(() => {
15790
+ const prevCompleteRef = useRef13(false);
15791
+ useEffect15(() => {
15280
15792
  const wasComplete = prevCompleteRef.current;
15281
15793
  prevCompleteRef.current = isComplete;
15282
15794
  if (wasComplete || !isComplete) return;
@@ -15284,7 +15796,7 @@ var DevDiveFabCharacter = ({
15284
15796
  const t = setTimeout(() => setIsWinking(false), WINK_DURATION_MS);
15285
15797
  return () => clearTimeout(t);
15286
15798
  }, [isComplete]);
15287
- useEffect14(() => {
15799
+ useEffect15(() => {
15288
15800
  if (isOpen || isTalking || isDizzy || isError || isSleepy) {
15289
15801
  setIsCatMouth(false);
15290
15802
  return;
@@ -15309,62 +15821,62 @@ var DevDiveFabCharacter = ({
15309
15821
  clearTimeout(hideT);
15310
15822
  };
15311
15823
  }, [isOpen, isTalking, isDizzy, isError, isSleepy]);
15312
- const renderNormalEyes = (r) => /* @__PURE__ */ jsxs22(Fragment10, { children: [
15313
- /* @__PURE__ */ jsx23("circle", { cx: "87", cy: "106", r, fill: c.face, style: { transition: "fill 0.4s ease" } }),
15314
- /* @__PURE__ */ jsx23("circle", { cx: "133", cy: "106", r, fill: c.face, style: { transition: "fill 0.4s ease" } }),
15315
- /* @__PURE__ */ jsx23("circle", { cx: "90", cy: "102", r: "2.5", fill: c.eyeLight, opacity: "0.9" }),
15316
- /* @__PURE__ */ jsx23("circle", { cx: "136", cy: "102", r: "2.5", fill: c.eyeLight, opacity: "0.9" })
15824
+ const renderNormalEyes = (r) => /* @__PURE__ */ jsxs23(Fragment10, { children: [
15825
+ /* @__PURE__ */ jsx24("circle", { cx: "87", cy: "106", r, fill: c.face, style: { transition: "fill 0.4s ease" } }),
15826
+ /* @__PURE__ */ jsx24("circle", { cx: "133", cy: "106", r, fill: c.face, style: { transition: "fill 0.4s ease" } }),
15827
+ /* @__PURE__ */ jsx24("circle", { cx: "90", cy: "102", r: "2.5", fill: c.eyeLight, opacity: "0.9" }),
15828
+ /* @__PURE__ */ jsx24("circle", { cx: "136", cy: "102", r: "2.5", fill: c.eyeLight, opacity: "0.9" })
15317
15829
  ] });
15318
15830
  const renderEyes = () => {
15319
- if (isDizzy) return /* @__PURE__ */ jsxs22(Fragment10, { children: [
15320
- /* @__PURE__ */ jsxs22("g", { children: [
15321
- /* @__PURE__ */ jsx23("line", { x1: "81", y1: "100", x2: "93", y2: "112", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" }),
15322
- /* @__PURE__ */ jsx23("line", { x1: "93", y1: "100", x2: "81", y2: "112", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" })
15831
+ if (isDizzy) return /* @__PURE__ */ jsxs23(Fragment10, { children: [
15832
+ /* @__PURE__ */ jsxs23("g", { children: [
15833
+ /* @__PURE__ */ jsx24("line", { x1: "81", y1: "100", x2: "93", y2: "112", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" }),
15834
+ /* @__PURE__ */ jsx24("line", { x1: "93", y1: "100", x2: "81", y2: "112", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" })
15323
15835
  ] }),
15324
- /* @__PURE__ */ jsxs22("g", { children: [
15325
- /* @__PURE__ */ jsx23("line", { x1: "127", y1: "100", x2: "139", y2: "112", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" }),
15326
- /* @__PURE__ */ jsx23("line", { x1: "139", y1: "100", x2: "127", y2: "112", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" })
15836
+ /* @__PURE__ */ jsxs23("g", { children: [
15837
+ /* @__PURE__ */ jsx24("line", { x1: "127", y1: "100", x2: "139", y2: "112", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" }),
15838
+ /* @__PURE__ */ jsx24("line", { x1: "139", y1: "100", x2: "127", y2: "112", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" })
15327
15839
  ] })
15328
15840
  ] });
15329
- if (isSleepy) return /* @__PURE__ */ jsxs22(Fragment10, { children: [
15330
- /* @__PURE__ */ jsx23("path", { d: "M80 108 Q87 102 94 108", fill: "none", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" }),
15331
- /* @__PURE__ */ jsx23("path", { d: "M126 108 Q133 102 140 108", fill: "none", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" })
15841
+ if (isSleepy) return /* @__PURE__ */ jsxs23(Fragment10, { children: [
15842
+ /* @__PURE__ */ jsx24("path", { d: "M80 108 Q87 102 94 108", fill: "none", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" }),
15843
+ /* @__PURE__ */ jsx24("path", { d: "M126 108 Q133 102 140 108", fill: "none", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" })
15332
15844
  ] });
15333
- if (isSurprised) return /* @__PURE__ */ jsxs22(Fragment10, { children: [
15334
- /* @__PURE__ */ jsx23("circle", { cx: "87", cy: "106", r: "12", fill: c.face }),
15335
- /* @__PURE__ */ jsx23("circle", { cx: "133", cy: "106", r: "12", fill: c.face }),
15336
- /* @__PURE__ */ jsx23("circle", { cx: "91", cy: "100", r: "3.5", fill: c.eyeLight }),
15337
- /* @__PURE__ */ jsx23("circle", { cx: "137", cy: "100", r: "3.5", fill: c.eyeLight })
15845
+ if (isSurprised) return /* @__PURE__ */ jsxs23(Fragment10, { children: [
15846
+ /* @__PURE__ */ jsx24("circle", { cx: "87", cy: "106", r: "12", fill: c.face }),
15847
+ /* @__PURE__ */ jsx24("circle", { cx: "133", cy: "106", r: "12", fill: c.face }),
15848
+ /* @__PURE__ */ jsx24("circle", { cx: "91", cy: "100", r: "3.5", fill: c.eyeLight }),
15849
+ /* @__PURE__ */ jsx24("circle", { cx: "137", cy: "100", r: "3.5", fill: c.eyeLight })
15338
15850
  ] });
15339
- if (isWinking) return /* @__PURE__ */ jsxs22(Fragment10, { children: [
15340
- /* @__PURE__ */ jsx23("circle", { cx: "87", cy: "106", r: "8", fill: c.face }),
15341
- /* @__PURE__ */ jsx23("circle", { cx: "90", cy: "102", r: "2.5", fill: c.eyeLight, opacity: "0.9" }),
15342
- /* @__PURE__ */ jsx23("line", { x1: "126", y1: "108", x2: "140", y2: "108", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" })
15851
+ if (isWinking) return /* @__PURE__ */ jsxs23(Fragment10, { children: [
15852
+ /* @__PURE__ */ jsx24("circle", { cx: "87", cy: "106", r: "8", fill: c.face }),
15853
+ /* @__PURE__ */ jsx24("circle", { cx: "90", cy: "102", r: "2.5", fill: c.eyeLight, opacity: "0.9" }),
15854
+ /* @__PURE__ */ jsx24("line", { x1: "126", y1: "108", x2: "140", y2: "108", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" })
15343
15855
  ] });
15344
- if (isError) return /* @__PURE__ */ jsxs22(Fragment10, { children: [
15856
+ if (isError) return /* @__PURE__ */ jsxs23(Fragment10, { children: [
15345
15857
  renderNormalEyes(8),
15346
- /* @__PURE__ */ jsx23("line", { x1: "79", y1: "90", x2: "95", y2: "95", stroke: c.face, strokeWidth: "2.5", strokeLinecap: "round" }),
15347
- /* @__PURE__ */ jsx23("line", { x1: "141", y1: "90", x2: "125", y2: "95", stroke: c.face, strokeWidth: "2.5", strokeLinecap: "round" })
15858
+ /* @__PURE__ */ jsx24("line", { x1: "79", y1: "90", x2: "95", y2: "95", stroke: c.face, strokeWidth: "2.5", strokeLinecap: "round" }),
15859
+ /* @__PURE__ */ jsx24("line", { x1: "141", y1: "90", x2: "125", y2: "95", stroke: c.face, strokeWidth: "2.5", strokeLinecap: "round" })
15348
15860
  ] });
15349
- if (isBlinking) return /* @__PURE__ */ jsxs22(Fragment10, { children: [
15350
- /* @__PURE__ */ jsx23("line", { x1: "80", y1: "108", x2: "94", y2: "108", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" }),
15351
- /* @__PURE__ */ jsx23("line", { x1: "126", y1: "108", x2: "140", y2: "108", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" })
15861
+ if (isBlinking) return /* @__PURE__ */ jsxs23(Fragment10, { children: [
15862
+ /* @__PURE__ */ jsx24("line", { x1: "80", y1: "108", x2: "94", y2: "108", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" }),
15863
+ /* @__PURE__ */ jsx24("line", { x1: "126", y1: "108", x2: "140", y2: "108", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round" })
15352
15864
  ] });
15353
15865
  return renderNormalEyes(isHappy ? 10 : 8);
15354
15866
  };
15355
15867
  const renderMouth = () => {
15356
- if (isDizzy) return /* @__PURE__ */ jsx23("path", { d: "M98 130 Q102 125 106 130 Q110 135 114 130 Q118 125 122 130", fill: "none", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" });
15357
- if (isSurprised) return /* @__PURE__ */ jsx23("circle", { cx: "110", cy: "133", r: "7", fill: c.face });
15358
- if (isSleepy) return /* @__PURE__ */ jsx23("ellipse", { cx: "110", cy: "131", rx: "4", ry: "3", fill: c.face });
15359
- if (isError) return /* @__PURE__ */ jsx23("path", { d: "M103 130 Q110 135 117 130", fill: "none", stroke: c.face, strokeWidth: "2.5", strokeLinecap: "round" });
15360
- if (mouthOpen) return /* @__PURE__ */ jsx23("ellipse", { cx: "110", cy: "131", rx: "6", ry: "5", fill: c.face });
15361
- if (isCatMouth) return /* @__PURE__ */ jsx23("path", { d: "M100 130 Q105 137 110 128 Q115 137 120 130", fill: "none", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" });
15362
- if (isPressed) return /* @__PURE__ */ jsx23("ellipse", { cx: "110", cy: "132", rx: "6", ry: "6", fill: c.face, style: { transition: "fill 0.4s ease" } });
15363
- if (isHappy) return /* @__PURE__ */ jsx23("path", { d: "M101 128 Q110 138 119 128", fill: "none", stroke: c.face, strokeWidth: "4", strokeLinecap: "round", style: { transition: "stroke 0.4s ease" } });
15364
- return /* @__PURE__ */ jsx23("path", { d: "M103 128 Q110 134 117 128", fill: "none", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round", style: { transition: "stroke 0.4s ease" } });
15868
+ if (isDizzy) return /* @__PURE__ */ jsx24("path", { d: "M98 130 Q102 125 106 130 Q110 135 114 130 Q118 125 122 130", fill: "none", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" });
15869
+ if (isSurprised) return /* @__PURE__ */ jsx24("circle", { cx: "110", cy: "133", r: "7", fill: c.face });
15870
+ if (isSleepy) return /* @__PURE__ */ jsx24("ellipse", { cx: "110", cy: "131", rx: "4", ry: "3", fill: c.face });
15871
+ if (isError) return /* @__PURE__ */ jsx24("path", { d: "M103 130 Q110 135 117 130", fill: "none", stroke: c.face, strokeWidth: "2.5", strokeLinecap: "round" });
15872
+ if (mouthOpen) return /* @__PURE__ */ jsx24("ellipse", { cx: "110", cy: "131", rx: "6", ry: "5", fill: c.face });
15873
+ if (isCatMouth) return /* @__PURE__ */ jsx24("path", { d: "M100 130 Q105 137 110 128 Q115 137 120 130", fill: "none", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" });
15874
+ if (isPressed) return /* @__PURE__ */ jsx24("ellipse", { cx: "110", cy: "132", rx: "6", ry: "6", fill: c.face, style: { transition: "fill 0.4s ease" } });
15875
+ if (isHappy) return /* @__PURE__ */ jsx24("path", { d: "M101 128 Q110 138 119 128", fill: "none", stroke: c.face, strokeWidth: "4", strokeLinecap: "round", style: { transition: "stroke 0.4s ease" } });
15876
+ return /* @__PURE__ */ jsx24("path", { d: "M103 128 Q110 134 117 128", fill: "none", stroke: c.face, strokeWidth: "3.5", strokeLinecap: "round", style: { transition: "stroke 0.4s ease" } });
15365
15877
  };
15366
15878
  const shouldFloat = !isEntering && !isOpen && !isSurprised && !isDizzy;
15367
- return /* @__PURE__ */ jsxs22(
15879
+ return /* @__PURE__ */ jsxs23(
15368
15880
  "svg",
15369
15881
  {
15370
15882
  ref: svgRef,
@@ -15374,7 +15886,7 @@ var DevDiveFabCharacter = ({
15374
15886
  className: `${isEntering ? "chatllm-character-entrance" : ""} ${shouldFloat ? "chatllm-character-float" : ""}`,
15375
15887
  style: { overflow: "visible", pointerEvents: "none" },
15376
15888
  children: [
15377
- /* @__PURE__ */ jsx23(
15889
+ /* @__PURE__ */ jsx24(
15378
15890
  "path",
15379
15891
  {
15380
15892
  d: BODY_PATH,
@@ -15386,21 +15898,21 @@ var DevDiveFabCharacter = ({
15386
15898
  ),
15387
15899
  isOpen && isHappy ? (
15388
15900
  /* @Todo vibecode - 열림+호버 시에만 X 표시 (평소엔 얼굴 유지) */
15389
- /* @__PURE__ */ jsxs22("g", { style: { transition: "transform 0.3s ease", transform: "rotate(90deg)", transformOrigin: "110px 115px" }, children: [
15390
- /* @__PURE__ */ jsx23("line", { x1: "95", y1: "100", x2: "125", y2: "130", stroke: c.face, strokeWidth: "5", strokeLinecap: "round" }),
15391
- /* @__PURE__ */ jsx23("line", { x1: "125", y1: "100", x2: "95", y2: "130", stroke: c.face, strokeWidth: "5", strokeLinecap: "round" })
15901
+ /* @__PURE__ */ jsxs23("g", { style: { transition: "transform 0.3s ease", transform: "rotate(90deg)", transformOrigin: "110px 115px" }, children: [
15902
+ /* @__PURE__ */ jsx24("line", { x1: "95", y1: "100", x2: "125", y2: "130", stroke: c.face, strokeWidth: "5", strokeLinecap: "round" }),
15903
+ /* @__PURE__ */ jsx24("line", { x1: "125", y1: "100", x2: "95", y2: "130", stroke: c.face, strokeWidth: "5", strokeLinecap: "round" })
15392
15904
  ] })
15393
15905
  ) : (
15394
15906
  /* 눈 + 입 — 마우스 추적 (isDizzy/isSleepy 시 추적 비활성) */
15395
- /* @__PURE__ */ jsxs22("g", { transform: isDizzy || isSleepy ? "" : `translate(${eyeOffset.x}, ${eyeOffset.y})`, children: [
15907
+ /* @__PURE__ */ jsxs23("g", { transform: isDizzy || isSleepy ? "" : `translate(${eyeOffset.x}, ${eyeOffset.y})`, children: [
15396
15908
  renderEyes(),
15397
15909
  renderMouth(),
15398
- isSleepy && /* @__PURE__ */ jsxs22("g", { children: [
15399
- /* @__PURE__ */ jsx23("text", { x: "152", y: "88", fontSize: "14", fill: c.face, opacity: "0.7", className: "chatllm-zzz chatllm-zzz-1", fontFamily: "sans-serif", fontWeight: "bold", children: "z" }),
15400
- /* @__PURE__ */ jsx23("text", { x: "160", y: "76", fontSize: "11", fill: c.face, opacity: "0.5", className: "chatllm-zzz chatllm-zzz-2", fontFamily: "sans-serif", fontWeight: "bold", children: "z" }),
15401
- /* @__PURE__ */ jsx23("text", { x: "166", y: "66", fontSize: "9", fill: c.face, opacity: "0.3", className: "chatllm-zzz chatllm-zzz-3", fontFamily: "sans-serif", fontWeight: "bold", children: "z" })
15910
+ isSleepy && /* @__PURE__ */ jsxs23("g", { children: [
15911
+ /* @__PURE__ */ jsx24("text", { x: "152", y: "88", fontSize: "14", fill: c.face, opacity: "0.7", className: "chatllm-zzz chatllm-zzz-1", fontFamily: "sans-serif", fontWeight: "bold", children: "z" }),
15912
+ /* @__PURE__ */ jsx24("text", { x: "160", y: "76", fontSize: "11", fill: c.face, opacity: "0.5", className: "chatllm-zzz chatllm-zzz-2", fontFamily: "sans-serif", fontWeight: "bold", children: "z" }),
15913
+ /* @__PURE__ */ jsx24("text", { x: "166", y: "66", fontSize: "9", fill: c.face, opacity: "0.3", className: "chatllm-zzz chatllm-zzz-3", fontFamily: "sans-serif", fontWeight: "bold", children: "z" })
15402
15914
  ] }),
15403
- isError && /* @__PURE__ */ jsx23(
15915
+ isError && /* @__PURE__ */ jsx24(
15404
15916
  "path",
15405
15917
  {
15406
15918
  d: "M158 80 Q161 88 158 94 Q155 88 158 80Z",
@@ -15416,7 +15928,7 @@ var DevDiveFabCharacter = ({
15416
15928
  };
15417
15929
  var DevDiveAvatar = ({ size = 32, theme = "light" }) => {
15418
15930
  const c = THEMES[theme];
15419
- return /* @__PURE__ */ jsxs22(
15931
+ return /* @__PURE__ */ jsxs23(
15420
15932
  "svg",
15421
15933
  {
15422
15934
  width: size,
@@ -15424,7 +15936,7 @@ var DevDiveAvatar = ({ size = 32, theme = "light" }) => {
15424
15936
  viewBox: "30 45 160 140",
15425
15937
  style: { display: "block" },
15426
15938
  children: [
15427
- /* @__PURE__ */ jsx23(
15939
+ /* @__PURE__ */ jsx24(
15428
15940
  "path",
15429
15941
  {
15430
15942
  d: BODY_PATH,
@@ -15433,7 +15945,7 @@ var DevDiveAvatar = ({ size = 32, theme = "light" }) => {
15433
15945
  strokeWidth: "5"
15434
15946
  }
15435
15947
  ),
15436
- /* @__PURE__ */ jsx23(
15948
+ /* @__PURE__ */ jsx24(
15437
15949
  "path",
15438
15950
  {
15439
15951
  d: "M170 72 C176 86, 178 102, 175 120",
@@ -15443,18 +15955,18 @@ var DevDiveAvatar = ({ size = 32, theme = "light" }) => {
15443
15955
  strokeLinecap: "round"
15444
15956
  }
15445
15957
  ),
15446
- /* @__PURE__ */ jsx23("circle", { cx: "87", cy: "106", r: "7.5", fill: c.face }),
15447
- /* @__PURE__ */ jsx23("circle", { cx: "133", cy: "106", r: "7.5", fill: c.face }),
15448
- /* @__PURE__ */ jsx23("circle", { cx: "90", cy: "102", r: "2", fill: c.eyeLight, opacity: "0.85" }),
15449
- /* @__PURE__ */ jsx23("circle", { cx: "136", cy: "102", r: "2", fill: c.eyeLight, opacity: "0.85" }),
15450
- /* @__PURE__ */ jsx23("path", { d: "M104 127 Q110 132 116 127", fill: "none", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" })
15958
+ /* @__PURE__ */ jsx24("circle", { cx: "87", cy: "106", r: "7.5", fill: c.face }),
15959
+ /* @__PURE__ */ jsx24("circle", { cx: "133", cy: "106", r: "7.5", fill: c.face }),
15960
+ /* @__PURE__ */ jsx24("circle", { cx: "90", cy: "102", r: "2", fill: c.eyeLight, opacity: "0.85" }),
15961
+ /* @__PURE__ */ jsx24("circle", { cx: "136", cy: "102", r: "2", fill: c.eyeLight, opacity: "0.85" }),
15962
+ /* @__PURE__ */ jsx24("path", { d: "M104 127 Q110 132 116 127", fill: "none", stroke: c.face, strokeWidth: "3", strokeLinecap: "round" })
15451
15963
  ]
15452
15964
  }
15453
15965
  );
15454
15966
  };
15455
15967
 
15456
15968
  // src/react/components/floating/FloatingFab.tsx
15457
- import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
15969
+ import { jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
15458
15970
  var FloatingFab = ({
15459
15971
  onClick,
15460
15972
  isOpen,
@@ -15476,12 +15988,12 @@ var FloatingFab = ({
15476
15988
  }) => {
15477
15989
  const isRight = position.includes("right");
15478
15990
  const isBottom = position.includes("bottom");
15479
- const fabRef = useRef13(null);
15991
+ const fabRef = useRef14(null);
15480
15992
  const isCharacterMode = !icon;
15481
- const [bubbleOnRight, setBubbleOnRight] = useState23(!isRight);
15993
+ const [bubbleOnRight, setBubbleOnRight] = useState24(!isRight);
15482
15994
  const posLeft = positionStyle?.left;
15483
15995
  const posTop = positionStyle?.top;
15484
- useEffect15(() => {
15996
+ useEffect16(() => {
15485
15997
  if (!fabRef.current || typeof window === "undefined") {
15486
15998
  setBubbleOnRight(!isRight);
15487
15999
  return;
@@ -15489,14 +16001,14 @@ var FloatingFab = ({
15489
16001
  const rect = fabRef.current.getBoundingClientRect();
15490
16002
  setBubbleOnRight(rect.left + rect.width / 2 < window.innerWidth / 2);
15491
16003
  }, [isRight, posLeft, posTop]);
15492
- const [bubbleText, setBubbleText] = useState23(null);
15493
- const [bubbleExiting, setBubbleExiting] = useState23(false);
15494
- const bubbleTextRef = useRef13(bubbleText);
16004
+ const [bubbleText, setBubbleText] = useState24(null);
16005
+ const [bubbleExiting, setBubbleExiting] = useState24(false);
16006
+ const bubbleTextRef = useRef14(bubbleText);
15495
16007
  bubbleTextRef.current = bubbleText;
15496
- const [displayText, setDisplayText] = useState23(null);
15497
- const [isTyping, setIsTyping] = useState23(false);
15498
- const typingTimerRef = useRef13(null);
15499
- useEffect15(() => {
16008
+ const [displayText, setDisplayText] = useState24(null);
16009
+ const [isTyping, setIsTyping] = useState24(false);
16010
+ const typingTimerRef = useRef14(null);
16011
+ useEffect16(() => {
15500
16012
  if (notification) {
15501
16013
  setBubbleText(notification);
15502
16014
  setBubbleExiting(false);
@@ -15532,9 +16044,9 @@ var FloatingFab = ({
15532
16044
  }, 300);
15533
16045
  return () => clearTimeout(timer);
15534
16046
  }, [notification]);
15535
- const notifContentRef = useRef13(null);
15536
- const [needsMarquee, setNeedsMarquee] = useState23(false);
15537
- useEffect15(() => {
16047
+ const notifContentRef = useRef14(null);
16048
+ const [needsMarquee, setNeedsMarquee] = useState24(false);
16049
+ useEffect16(() => {
15538
16050
  if (isTyping || !notification) {
15539
16051
  setNeedsMarquee(false);
15540
16052
  return;
@@ -15556,7 +16068,7 @@ var FloatingFab = ({
15556
16068
  ...isBottom ? { bottom: 28 } : { top: 28 },
15557
16069
  ...isRight ? { right: 28 } : { left: 28 }
15558
16070
  };
15559
- return /* @__PURE__ */ jsxs23(
16071
+ return /* @__PURE__ */ jsxs24(
15560
16072
  "button",
15561
16073
  {
15562
16074
  ref: fabRef,
@@ -15591,7 +16103,7 @@ var FloatingFab = ({
15591
16103
  ...fabStyle
15592
16104
  },
15593
16105
  children: [
15594
- /* @__PURE__ */ jsx24(
16106
+ /* @__PURE__ */ jsx25(
15595
16107
  "span",
15596
16108
  {
15597
16109
  style: {
@@ -15605,10 +16117,10 @@ var FloatingFab = ({
15605
16117
  transition: "transform 0.3s ease",
15606
16118
  transform: !isCharacterMode && isOpen ? "rotate(90deg)" : "rotate(0deg)"
15607
16119
  },
15608
- children: isCharacterMode ? /* @__PURE__ */ jsx24(DevDiveFabCharacter, { theme: theme?.mode === "dark" ? "dark" : "light", isTalking, isOpen, isDizzy, isError, isComplete }) : isOpen ? /* @__PURE__ */ jsx24(IconSvg, { name: "close-line", size: 24, color: "#fff" }) : icon || /* @__PURE__ */ jsx24(IconSvg, { name: "chat-1-line", size: 24, color: "#fff" })
16120
+ children: isCharacterMode ? /* @__PURE__ */ jsx25(DevDiveFabCharacter, { theme: theme?.mode === "dark" ? "dark" : "light", isTalking, isOpen, isDizzy, isError, isComplete }) : isOpen ? /* @__PURE__ */ jsx25(IconSvg, { name: "close-line", size: 24, color: "#fff" }) : icon || /* @__PURE__ */ jsx25(IconSvg, { name: "chat-1-line", size: 24, color: "#fff" })
15609
16121
  }
15610
16122
  ),
15611
- !!badge && badge > 0 && !isOpen && /* @__PURE__ */ jsx24(
16123
+ !!badge && badge > 0 && !isOpen && /* @__PURE__ */ jsx25(
15612
16124
  "span",
15613
16125
  {
15614
16126
  style: {
@@ -15632,7 +16144,7 @@ var FloatingFab = ({
15632
16144
  children: badge > 99 ? "99+" : badge
15633
16145
  }
15634
16146
  ),
15635
- bubbleText && /* @__PURE__ */ jsx24(
16147
+ bubbleText && /* @__PURE__ */ jsx25(
15636
16148
  "div",
15637
16149
  {
15638
16150
  className: [
@@ -15650,19 +16162,19 @@ var FloatingFab = ({
15650
16162
  opacity: !isOpen && !isDragging && !bubbleExiting ? 1 : 0,
15651
16163
  transition: "opacity 0.2s ease"
15652
16164
  },
15653
- children: /* @__PURE__ */ jsx24(
16165
+ children: /* @__PURE__ */ jsx25(
15654
16166
  "div",
15655
16167
  {
15656
16168
  ref: notifContentRef,
15657
16169
  className: `chatllm-fab-notification__content${needsMarquee ? " chatllm-fab-notification__content--scrolling" : ""}`,
15658
- children: /* @__PURE__ */ jsxs23(
16170
+ children: /* @__PURE__ */ jsxs24(
15659
16171
  "div",
15660
16172
  {
15661
16173
  className: "chatllm-fab-notification__track",
15662
16174
  style: needsMarquee ? { animationDuration: `${Math.max(6, bubbleText.length * 0.3)}s` } : void 0,
15663
16175
  children: [
15664
- /* @__PURE__ */ jsx24("span", { children: displayText ?? bubbleText }),
15665
- needsMarquee && /* @__PURE__ */ jsx24("span", { "aria-hidden": "true", children: bubbleText })
16176
+ /* @__PURE__ */ jsx25("span", { children: displayText ?? bubbleText }),
16177
+ needsMarquee && /* @__PURE__ */ jsx25("span", { "aria-hidden": "true", children: bubbleText })
15666
16178
  ]
15667
16179
  }
15668
16180
  )
@@ -15676,8 +16188,8 @@ var FloatingFab = ({
15676
16188
  };
15677
16189
 
15678
16190
  // src/react/components/floating/FloatingPanel.tsx
15679
- import { useState as useState24, useEffect as useEffect16, useRef as useRef14 } from "react";
15680
- import { jsxs as jsxs24 } from "react/jsx-runtime";
16191
+ import { useState as useState25, useEffect as useEffect17, useRef as useRef15 } from "react";
16192
+ import { jsxs as jsxs25 } from "react/jsx-runtime";
15681
16193
  var FloatingPanel = ({
15682
16194
  isOpen,
15683
16195
  width,
@@ -15694,8 +16206,8 @@ var FloatingPanel = ({
15694
16206
  }) => {
15695
16207
  const isRight = position.includes("right");
15696
16208
  const themeClass = theme?.mode === "dark" ? "chatllm-dark" : "";
15697
- const [isMobile, setIsMobile] = useState24(false);
15698
- useEffect16(() => {
16209
+ const [isMobile, setIsMobile] = useState25(false);
16210
+ useEffect17(() => {
15699
16211
  if (typeof window === "undefined") return;
15700
16212
  const mql = window.matchMedia("(max-width: 767px)");
15701
16213
  setIsMobile(mql.matches);
@@ -15703,10 +16215,10 @@ var FloatingPanel = ({
15703
16215
  mql.addEventListener("change", handler);
15704
16216
  return () => mql.removeEventListener("change", handler);
15705
16217
  }, []);
15706
- const [shouldRender, setShouldRender] = useState24(isOpen);
15707
- const [isVisible, setIsVisible] = useState24(isOpen);
15708
- const rafRef = useRef14(0);
15709
- useEffect16(() => {
16218
+ const [shouldRender, setShouldRender] = useState25(isOpen);
16219
+ const [isVisible, setIsVisible] = useState25(isOpen);
16220
+ const rafRef = useRef15(0);
16221
+ useEffect17(() => {
15710
16222
  if (isOpen) {
15711
16223
  setShouldRender(true);
15712
16224
  rafRef.current = requestAnimationFrame(() => {
@@ -15721,7 +16233,7 @@ var FloatingPanel = ({
15721
16233
  }
15722
16234
  return () => cancelAnimationFrame(rafRef.current);
15723
16235
  }, [isOpen]);
15724
- useEffect16(() => {
16236
+ useEffect17(() => {
15725
16237
  if (!isOpen || !isMobile) return;
15726
16238
  const prev = document.body.style.overflow;
15727
16239
  document.body.style.overflow = "hidden";
@@ -15746,7 +16258,7 @@ var FloatingPanel = ({
15746
16258
  };
15747
16259
  const computedPosition = isMobile ? mobilePosition : positionStyle || defaultDesktopPosition;
15748
16260
  const transition = "opacity 0.25s ease, transform 0.25s ease";
15749
- return /* @__PURE__ */ jsxs24(
16261
+ return /* @__PURE__ */ jsxs25(
15750
16262
  "div",
15751
16263
  {
15752
16264
  ref: panelRef,
@@ -15776,14 +16288,14 @@ var FloatingPanel = ({
15776
16288
  };
15777
16289
 
15778
16290
  // src/react/components/floating/FloatingTabBar.tsx
15779
- import { jsx as jsx25, jsxs as jsxs25 } from "react/jsx-runtime";
16291
+ import { jsx as jsx26, jsxs as jsxs26 } from "react/jsx-runtime";
15780
16292
  var FloatingTabBar = ({
15781
16293
  tabs,
15782
16294
  activeTab,
15783
16295
  onTabChange
15784
16296
  }) => {
15785
16297
  if (tabs.length <= 1) return null;
15786
- return /* @__PURE__ */ jsx25(
16298
+ return /* @__PURE__ */ jsx26(
15787
16299
  "div",
15788
16300
  {
15789
16301
  role: "tablist",
@@ -15796,7 +16308,7 @@ var FloatingTabBar = ({
15796
16308
  },
15797
16309
  children: tabs.map((tab) => {
15798
16310
  const isActive = tab.key === activeTab;
15799
- return /* @__PURE__ */ jsxs25(
16311
+ return /* @__PURE__ */ jsxs26(
15800
16312
  "button",
15801
16313
  {
15802
16314
  onClick: () => onTabChange(tab.key),
@@ -15821,7 +16333,7 @@ var FloatingTabBar = ({
15821
16333
  transition: "color 0.15s ease"
15822
16334
  },
15823
16335
  children: [
15824
- tab.icon && /* @__PURE__ */ jsxs25(
16336
+ tab.icon && /* @__PURE__ */ jsxs26(
15825
16337
  "span",
15826
16338
  {
15827
16339
  style: {
@@ -15831,7 +16343,7 @@ var FloatingTabBar = ({
15831
16343
  },
15832
16344
  children: [
15833
16345
  tab.icon,
15834
- !!tab.badge && tab.badge > 0 && /* @__PURE__ */ jsx25(
16346
+ !!tab.badge && tab.badge > 0 && /* @__PURE__ */ jsx26(
15835
16347
  "span",
15836
16348
  {
15837
16349
  style: {
@@ -15857,8 +16369,8 @@ var FloatingTabBar = ({
15857
16369
  ]
15858
16370
  }
15859
16371
  ),
15860
- /* @__PURE__ */ jsx25("span", { children: tab.label }),
15861
- isActive && /* @__PURE__ */ jsx25(
16372
+ /* @__PURE__ */ jsx26("span", { children: tab.label }),
16373
+ isActive && /* @__PURE__ */ jsx26(
15862
16374
  "span",
15863
16375
  {
15864
16376
  style: {
@@ -15882,11 +16394,11 @@ var FloatingTabBar = ({
15882
16394
  };
15883
16395
 
15884
16396
  // src/react/components/floating/CompactChatView.tsx
15885
- import { useState as useState26, useCallback as useCallback13 } from "react";
16397
+ import { useState as useState27, useCallback as useCallback14 } from "react";
15886
16398
 
15887
16399
  // src/react/components/floating/CompactSessionMenu.tsx
15888
- import { useState as useState25, useRef as useRef15, useEffect as useEffect17 } from "react";
15889
- import { jsx as jsx26, jsxs as jsxs26 } from "react/jsx-runtime";
16400
+ import { useState as useState26, useRef as useRef16, useEffect as useEffect18 } from "react";
16401
+ import { jsx as jsx27, jsxs as jsxs27 } from "react/jsx-runtime";
15890
16402
  var CompactSessionMenu = ({
15891
16403
  sessions,
15892
16404
  currentSessionId,
@@ -15897,13 +16409,13 @@ var CompactSessionMenu = ({
15897
16409
  onClose,
15898
16410
  isLoading = false
15899
16411
  }) => {
15900
- const menuRef = useRef15(null);
15901
- const inputRef = useRef15(null);
15902
- const onCloseRef = useRef15(onClose);
16412
+ const menuRef = useRef16(null);
16413
+ const inputRef = useRef16(null);
16414
+ const onCloseRef = useRef16(onClose);
15903
16415
  onCloseRef.current = onClose;
15904
- const [editingId, setEditingId] = useState25(null);
15905
- const [editingTitle, setEditingTitle] = useState25("");
15906
- useEffect17(() => {
16416
+ const [editingId, setEditingId] = useState26(null);
16417
+ const [editingTitle, setEditingTitle] = useState26("");
16418
+ useEffect18(() => {
15907
16419
  const handleMouseDown = (e) => {
15908
16420
  if (menuRef.current && !menuRef.current.contains(e.target)) {
15909
16421
  onCloseRef.current();
@@ -15912,7 +16424,7 @@ var CompactSessionMenu = ({
15912
16424
  document.addEventListener("mousedown", handleMouseDown);
15913
16425
  return () => document.removeEventListener("mousedown", handleMouseDown);
15914
16426
  }, []);
15915
- useEffect17(() => {
16427
+ useEffect18(() => {
15916
16428
  if (editingId && inputRef.current) {
15917
16429
  inputRef.current.focus();
15918
16430
  inputRef.current.select();
@@ -15946,7 +16458,7 @@ var CompactSessionMenu = ({
15946
16458
  const handleNew = () => {
15947
16459
  onNew();
15948
16460
  };
15949
- return /* @__PURE__ */ jsxs26(
16461
+ return /* @__PURE__ */ jsxs27(
15950
16462
  "div",
15951
16463
  {
15952
16464
  ref: menuRef,
@@ -15964,7 +16476,7 @@ var CompactSessionMenu = ({
15964
16476
  flexDirection: "column"
15965
16477
  },
15966
16478
  children: [
15967
- /* @__PURE__ */ jsxs26(
16479
+ /* @__PURE__ */ jsxs27(
15968
16480
  "button",
15969
16481
  {
15970
16482
  onClick: handleNew,
@@ -15984,12 +16496,12 @@ var CompactSessionMenu = ({
15984
16496
  flexShrink: 0
15985
16497
  },
15986
16498
  children: [
15987
- /* @__PURE__ */ jsx26(IconSvg, { name: "add-line", size: 16, color: "var(--chatllm-primary, #3584FA)" }),
16499
+ /* @__PURE__ */ jsx27(IconSvg, { name: "add-line", size: 16, color: "var(--chatllm-primary, #3584FA)" }),
15988
16500
  "\uC0C8 \uB300\uD654"
15989
16501
  ]
15990
16502
  }
15991
16503
  ),
15992
- /* @__PURE__ */ jsx26(
16504
+ /* @__PURE__ */ jsx27(
15993
16505
  "div",
15994
16506
  {
15995
16507
  className: "chatllm-scrollbar",
@@ -16000,7 +16512,7 @@ var CompactSessionMenu = ({
16000
16512
  },
16001
16513
  children: isLoading ? (
16002
16514
  /** @Todo vibecode - 로딩 스켈레톤 (2개) */
16003
- /* @__PURE__ */ jsx26("div", { style: { padding: "8px" }, children: [1, 2].map((i) => /* @__PURE__ */ jsx26(
16515
+ /* @__PURE__ */ jsx27("div", { style: { padding: "8px" }, children: [1, 2].map((i) => /* @__PURE__ */ jsx27(
16004
16516
  "div",
16005
16517
  {
16006
16518
  className: "chatllm-skeleton-pulse",
@@ -16016,7 +16528,7 @@ var CompactSessionMenu = ({
16016
16528
  )) })
16017
16529
  ) : sessions.length === 0 ? (
16018
16530
  /** @Todo vibecode - 빈 상태 */
16019
- /* @__PURE__ */ jsx26(
16531
+ /* @__PURE__ */ jsx27(
16020
16532
  "div",
16021
16533
  {
16022
16534
  style: {
@@ -16028,9 +16540,9 @@ var CompactSessionMenu = ({
16028
16540
  children: "\uB300\uD654 \uB0B4\uC5ED\uC774 \uC5C6\uC2B5\uB2C8\uB2E4"
16029
16541
  }
16030
16542
  )
16031
- ) : /* @__PURE__ */ jsx26("div", { style: { padding: "4px" }, children: sessions.map((session) => {
16543
+ ) : /* @__PURE__ */ jsx27("div", { style: { padding: "4px" }, children: sessions.map((session) => {
16032
16544
  const isSelected = session.id === currentSessionId;
16033
- return /* @__PURE__ */ jsxs26(
16545
+ return /* @__PURE__ */ jsxs27(
16034
16546
  "div",
16035
16547
  {
16036
16548
  onClick: () => handleSelect(session.id),
@@ -16055,7 +16567,7 @@ var CompactSessionMenu = ({
16055
16567
  }
16056
16568
  },
16057
16569
  children: [
16058
- /* @__PURE__ */ jsx26(
16570
+ /* @__PURE__ */ jsx27(
16059
16571
  IconSvg,
16060
16572
  {
16061
16573
  name: "chat-1-line",
@@ -16063,7 +16575,7 @@ var CompactSessionMenu = ({
16063
16575
  color: "var(--chatllm-text-muted, #94a3b8)"
16064
16576
  }
16065
16577
  ),
16066
- /* @__PURE__ */ jsx26("div", { style: { flex: 1, minWidth: 0 }, children: editingId === session.id ? /* @__PURE__ */ jsx26(
16578
+ /* @__PURE__ */ jsx27("div", { style: { flex: 1, minWidth: 0 }, children: editingId === session.id ? /* @__PURE__ */ jsx27(
16067
16579
  "input",
16068
16580
  {
16069
16581
  ref: inputRef,
@@ -16087,7 +16599,7 @@ var CompactSessionMenu = ({
16087
16599
  fontFamily: "inherit"
16088
16600
  }
16089
16601
  }
16090
- ) : /* @__PURE__ */ jsx26(
16602
+ ) : /* @__PURE__ */ jsx27(
16091
16603
  "p",
16092
16604
  {
16093
16605
  style: {
@@ -16099,10 +16611,10 @@ var CompactSessionMenu = ({
16099
16611
  whiteSpace: "nowrap",
16100
16612
  margin: 0
16101
16613
  },
16102
- children: /* @__PURE__ */ jsx26(MarkdownRenderer, { content: session.title, inline: true })
16614
+ children: /* @__PURE__ */ jsx27(MarkdownRenderer, { content: session.title, inline: true })
16103
16615
  }
16104
16616
  ) }),
16105
- isSelected && editingId !== session.id && /* @__PURE__ */ jsxs26(
16617
+ isSelected && editingId !== session.id && /* @__PURE__ */ jsxs27(
16106
16618
  "div",
16107
16619
  {
16108
16620
  style: {
@@ -16111,7 +16623,7 @@ var CompactSessionMenu = ({
16111
16623
  flexShrink: 0
16112
16624
  },
16113
16625
  children: [
16114
- onRename && /* @__PURE__ */ jsx26(
16626
+ onRename && /* @__PURE__ */ jsx27(
16115
16627
  "button",
16116
16628
  {
16117
16629
  onClick: (e) => handleStartEdit(session, e),
@@ -16126,10 +16638,10 @@ var CompactSessionMenu = ({
16126
16638
  display: "flex",
16127
16639
  alignItems: "center"
16128
16640
  },
16129
- children: /* @__PURE__ */ jsx26(IconSvg, { name: "pencil-line", size: 12 })
16641
+ children: /* @__PURE__ */ jsx27(IconSvg, { name: "pencil-line", size: 12 })
16130
16642
  }
16131
16643
  ),
16132
- /* @__PURE__ */ jsx26(
16644
+ /* @__PURE__ */ jsx27(
16133
16645
  "button",
16134
16646
  {
16135
16647
  onClick: (e) => {
@@ -16147,7 +16659,7 @@ var CompactSessionMenu = ({
16147
16659
  display: "flex",
16148
16660
  alignItems: "center"
16149
16661
  },
16150
- children: /* @__PURE__ */ jsx26(IconSvg, { name: "delete-bin-line", size: 12 })
16662
+ children: /* @__PURE__ */ jsx27(IconSvg, { name: "delete-bin-line", size: 12 })
16151
16663
  }
16152
16664
  )
16153
16665
  ]
@@ -16166,7 +16678,7 @@ var CompactSessionMenu = ({
16166
16678
  };
16167
16679
 
16168
16680
  // src/react/components/floating/CompactChatView.tsx
16169
- import { jsx as jsx27, jsxs as jsxs27 } from "react/jsx-runtime";
16681
+ import { jsx as jsx28, jsxs as jsxs28 } from "react/jsx-runtime";
16170
16682
  var CompactChatView = ({
16171
16683
  chatState,
16172
16684
  actions = [],
@@ -16227,20 +16739,20 @@ var CompactChatView = ({
16227
16739
  const handleChoiceClick = (choice) => {
16228
16740
  setInput(choice.text);
16229
16741
  };
16230
- const [showSessionMenu, setShowSessionMenu] = useState26(false);
16231
- const handleSessionSelect = useCallback13((id) => {
16742
+ const [showSessionMenu, setShowSessionMenu] = useState27(false);
16743
+ const handleSessionSelect = useCallback14((id) => {
16232
16744
  selectSession(id);
16233
16745
  setShowSessionMenu(false);
16234
16746
  }, [selectSession]);
16235
- const handleNewSession = useCallback13(() => {
16747
+ const handleNewSession = useCallback14(() => {
16236
16748
  newSession();
16237
16749
  setShowSessionMenu(false);
16238
16750
  }, [newSession]);
16239
- const handleCloseMenu = useCallback13(() => {
16751
+ const handleCloseMenu = useCallback14(() => {
16240
16752
  setShowSessionMenu(false);
16241
16753
  }, []);
16242
16754
  const greeting = personalization?.userProfile?.nickname ? `${personalization.userProfile.nickname}\uB2D8, \uBB34\uC5C7\uC774\uB4E0 \uBB3C\uC5B4\uBCF4\uC138\uC694` : "\uBB34\uC5C7\uC774\uB4E0 \uBB3C\uC5B4\uBCF4\uC138\uC694";
16243
- return /* @__PURE__ */ jsxs27(
16755
+ return /* @__PURE__ */ jsxs28(
16244
16756
  "div",
16245
16757
  {
16246
16758
  style: {
@@ -16251,7 +16763,7 @@ var CompactChatView = ({
16251
16763
  overflow: "hidden"
16252
16764
  },
16253
16765
  children: [
16254
- /* @__PURE__ */ jsxs27(
16766
+ /* @__PURE__ */ jsxs28(
16255
16767
  "div",
16256
16768
  {
16257
16769
  style: {
@@ -16266,7 +16778,7 @@ var CompactChatView = ({
16266
16778
  height: 44
16267
16779
  },
16268
16780
  children: [
16269
- /* @__PURE__ */ jsxs27(
16781
+ /* @__PURE__ */ jsxs28(
16270
16782
  "button",
16271
16783
  {
16272
16784
  onClick: () => setShowSessionMenu((prev) => !prev),
@@ -16283,7 +16795,7 @@ var CompactChatView = ({
16283
16795
  fontFamily: "inherit"
16284
16796
  },
16285
16797
  children: [
16286
- /* @__PURE__ */ jsx27(
16798
+ /* @__PURE__ */ jsx28(
16287
16799
  "span",
16288
16800
  {
16289
16801
  style: {
@@ -16294,10 +16806,10 @@ var CompactChatView = ({
16294
16806
  textOverflow: "ellipsis",
16295
16807
  whiteSpace: "nowrap"
16296
16808
  },
16297
- children: /* @__PURE__ */ jsx27(MarkdownRenderer, { content: currentSession?.title || "AI \uCC44\uD305", inline: true })
16809
+ children: /* @__PURE__ */ jsx28(MarkdownRenderer, { content: currentSession?.title || "AI \uCC44\uD305", inline: true })
16298
16810
  }
16299
16811
  ),
16300
- /* @__PURE__ */ jsx27(
16812
+ /* @__PURE__ */ jsx28(
16301
16813
  IconSvg,
16302
16814
  {
16303
16815
  name: "arrow-down-s-line",
@@ -16309,7 +16821,7 @@ var CompactChatView = ({
16309
16821
  }
16310
16822
  ),
16311
16823
  renderHeaderExtra?.(),
16312
- fullScreenPath && /* @__PURE__ */ jsxs27(
16824
+ fullScreenPath && /* @__PURE__ */ jsxs28(
16313
16825
  "a",
16314
16826
  {
16315
16827
  href: fullScreenPath,
@@ -16324,12 +16836,12 @@ var CompactChatView = ({
16324
16836
  marginLeft: 8
16325
16837
  },
16326
16838
  children: [
16327
- /* @__PURE__ */ jsx27(IconSvg, { name: "arrow-right-line", size: 14, color: "var(--chatllm-text-muted, #94a3b8)" }),
16839
+ /* @__PURE__ */ jsx28(IconSvg, { name: "arrow-right-line", size: 14, color: "var(--chatllm-text-muted, #94a3b8)" }),
16328
16840
  "\uC804\uCCB4 \uD654\uBA74"
16329
16841
  ]
16330
16842
  }
16331
16843
  ),
16332
- showSessionMenu && /* @__PURE__ */ jsx27(
16844
+ showSessionMenu && /* @__PURE__ */ jsx28(
16333
16845
  CompactSessionMenu,
16334
16846
  {
16335
16847
  sessions,
@@ -16345,7 +16857,7 @@ var CompactChatView = ({
16345
16857
  ]
16346
16858
  }
16347
16859
  ),
16348
- /* @__PURE__ */ jsx27("div", { style: { flex: 1, minHeight: 0, display: "flex", flexDirection: "column", overflow: "hidden" }, children: messages.length === 0 ? /* @__PURE__ */ jsxs27(
16860
+ /* @__PURE__ */ jsx28("div", { style: { flex: 1, minHeight: 0, display: "flex", flexDirection: "column", overflow: "hidden" }, children: messages.length === 0 ? /* @__PURE__ */ jsxs28(
16349
16861
  "div",
16350
16862
  {
16351
16863
  style: {
@@ -16358,7 +16870,7 @@ var CompactChatView = ({
16358
16870
  gap: "12px"
16359
16871
  },
16360
16872
  children: [
16361
- /* @__PURE__ */ jsx27(
16873
+ /* @__PURE__ */ jsx28(
16362
16874
  "p",
16363
16875
  {
16364
16876
  style: {
@@ -16371,7 +16883,7 @@ var CompactChatView = ({
16371
16883
  children: greeting
16372
16884
  }
16373
16885
  ),
16374
- suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx27(
16886
+ suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx28(
16375
16887
  "div",
16376
16888
  {
16377
16889
  style: {
@@ -16381,7 +16893,7 @@ var CompactChatView = ({
16381
16893
  justifyContent: "center",
16382
16894
  maxWidth: "100%"
16383
16895
  },
16384
- children: suggestedPrompts.slice(0, 4).map((sp) => /* @__PURE__ */ jsxs27(
16896
+ children: suggestedPrompts.slice(0, 4).map((sp) => /* @__PURE__ */ jsxs28(
16385
16897
  "button",
16386
16898
  {
16387
16899
  onClick: () => setInput(sp.prompt),
@@ -16401,7 +16913,7 @@ var CompactChatView = ({
16401
16913
  whiteSpace: "nowrap"
16402
16914
  },
16403
16915
  children: [
16404
- sp.icon && /* @__PURE__ */ jsx27(IconSvg, { name: sp.icon, size: 14, color: "var(--chatllm-text-muted)" }),
16916
+ sp.icon && /* @__PURE__ */ jsx28(IconSvg, { name: sp.icon, size: 14, color: "var(--chatllm-text-muted)" }),
16405
16917
  sp.label
16406
16918
  ]
16407
16919
  },
@@ -16411,7 +16923,7 @@ var CompactChatView = ({
16411
16923
  )
16412
16924
  ]
16413
16925
  }
16414
- ) : /* @__PURE__ */ jsx27(
16926
+ ) : /* @__PURE__ */ jsx28(
16415
16927
  MessageList,
16416
16928
  {
16417
16929
  messages,
@@ -16436,11 +16948,11 @@ var CompactChatView = ({
16436
16948
  onChecklistSkip: handleChecklistSkip,
16437
16949
  activeSkillExecution,
16438
16950
  compact: true,
16439
- assistantIcon: /* @__PURE__ */ jsx27(DevDiveAvatar, { size: 32 }),
16951
+ assistantIcon: /* @__PURE__ */ jsx28(DevDiveAvatar, { size: 32 }),
16440
16952
  renderMessage
16441
16953
  }
16442
16954
  ) }),
16443
- /* @__PURE__ */ jsx27("div", { style: { flex: "none", padding: "0 8px 8px 8px" }, children: /* @__PURE__ */ jsx27(
16955
+ /* @__PURE__ */ jsx28("div", { style: { flex: "none", padding: "0 8px 8px 8px" }, children: /* @__PURE__ */ jsx28(
16444
16956
  ChatInput,
16445
16957
  {
16446
16958
  value: input,
@@ -16473,7 +16985,7 @@ var CompactChatView = ({
16473
16985
  };
16474
16986
 
16475
16987
  // src/react/components/floating/ResizeHandles.tsx
16476
- import { Fragment as Fragment11, jsx as jsx28 } from "react/jsx-runtime";
16988
+ import { Fragment as Fragment11, jsx as jsx29 } from "react/jsx-runtime";
16477
16989
  var HANDLES = [
16478
16990
  { edge: "top", className: "chatllm-resize-handle chatllm-resize-handle--top" },
16479
16991
  { edge: "left", className: "chatllm-resize-handle chatllm-resize-handle--left" },
@@ -16486,7 +16998,7 @@ var ResizeHandles = ({
16486
16998
  onPointerMove,
16487
16999
  onPointerUp
16488
17000
  }) => {
16489
- return /* @__PURE__ */ jsx28(Fragment11, { children: HANDLES.map(({ edge, className }) => /* @__PURE__ */ jsx28(
17001
+ return /* @__PURE__ */ jsx29(Fragment11, { children: HANDLES.map(({ edge, className }) => /* @__PURE__ */ jsx29(
16490
17002
  "div",
16491
17003
  {
16492
17004
  className,
@@ -16499,7 +17011,7 @@ var ResizeHandles = ({
16499
17011
  };
16500
17012
 
16501
17013
  // src/react/ChatFloatingWidget.tsx
16502
- import { jsx as jsx29, jsxs as jsxs28 } from "react/jsx-runtime";
17014
+ import { jsx as jsx30, jsxs as jsxs29 } from "react/jsx-runtime";
16503
17015
  injectBaseStyles();
16504
17016
  injectFloatingStyles();
16505
17017
  var ChatFloatingWidget = ({
@@ -16560,7 +17072,7 @@ var ChatFloatingWidget = ({
16560
17072
  if (!notification) return null;
16561
17073
  return typeof notification === "string" ? { text: notification } : notification;
16562
17074
  }, [notification]);
16563
- const handleFabClick = useCallback14(() => {
17075
+ const handleFabClick = useCallback15(() => {
16564
17076
  if (notifObj?.onClick) {
16565
17077
  notifObj.onClick();
16566
17078
  if (!isOpen) handleFabInteraction();
@@ -16578,7 +17090,7 @@ var ChatFloatingWidget = ({
16578
17090
  const chatTab = {
16579
17091
  key: "chat",
16580
17092
  label: "\uCC44\uD305",
16581
- icon: /* @__PURE__ */ jsx29(IconSvg, { name: "chat-1-line", size: 16 })
17093
+ icon: /* @__PURE__ */ jsx30(IconSvg, { name: "chat-1-line", size: 16 })
16582
17094
  };
16583
17095
  const customTabs = tabs.map((t) => ({
16584
17096
  key: t.key,
@@ -16588,9 +17100,9 @@ var ChatFloatingWidget = ({
16588
17100
  }));
16589
17101
  return [chatTab, ...customTabs];
16590
17102
  }, [tabs]);
16591
- const [unreadBadge, setUnreadBadge] = useState27(0);
16592
- const seenMessageIdsRef = useRef16(new Set(chatState.messages.map((m) => m.id)));
16593
- useEffect18(() => {
17103
+ const [unreadBadge, setUnreadBadge] = useState28(0);
17104
+ const seenMessageIdsRef = useRef17(new Set(chatState.messages.map((m) => m.id)));
17105
+ useEffect19(() => {
16594
17106
  if (!isOpen) {
16595
17107
  const newAssistant = chatState.messages.filter(
16596
17108
  (m) => m.role === "assistant" && !seenMessageIdsRef.current.has(m.id)
@@ -16603,16 +17115,16 @@ var ChatFloatingWidget = ({
16603
17115
  seenMessageIdsRef.current.add(m.id);
16604
17116
  }
16605
17117
  }, [chatState.messages, isOpen]);
16606
- useEffect18(() => {
17118
+ useEffect19(() => {
16607
17119
  if (isOpen) setUnreadBadge(0);
16608
17120
  }, [isOpen]);
16609
17121
  const totalBadge = useMemo7(() => {
16610
17122
  return tabs.reduce((sum, t) => sum + (t.badge || 0), 0) + unreadBadge;
16611
17123
  }, [tabs, unreadBadge]);
16612
17124
  const isTalking = useMemo7(() => !!notification || chatState.isLoading, [notification, chatState.isLoading]);
16613
- const prevLoadingRef = useRef16(chatState.isLoading);
16614
- const [isComplete, setIsComplete] = useState27(false);
16615
- useEffect18(() => {
17125
+ const prevLoadingRef = useRef17(chatState.isLoading);
17126
+ const [isComplete, setIsComplete] = useState28(false);
17127
+ useEffect19(() => {
16616
17128
  const wasLoading = prevLoadingRef.current;
16617
17129
  prevLoadingRef.current = chatState.isLoading;
16618
17130
  if (!wasLoading || chatState.isLoading || chatState.messages.length === 0) return;
@@ -16620,8 +17132,8 @@ var ChatFloatingWidget = ({
16620
17132
  const t = setTimeout(() => setIsComplete(false), 100);
16621
17133
  return () => clearTimeout(t);
16622
17134
  }, [chatState.isLoading, chatState.messages.length]);
16623
- return /* @__PURE__ */ jsxs28("div", { className: `chatllm-floating-widget ${className}`, children: [
16624
- /* @__PURE__ */ jsx29(
17135
+ return /* @__PURE__ */ jsxs29("div", { className: `chatllm-floating-widget ${className}`, children: [
17136
+ /* @__PURE__ */ jsx30(
16625
17137
  FloatingFab,
16626
17138
  {
16627
17139
  onClick: handleFabClick,
@@ -16642,7 +17154,7 @@ var ChatFloatingWidget = ({
16642
17154
  isComplete
16643
17155
  }
16644
17156
  ),
16645
- /* @__PURE__ */ jsxs28(
17157
+ /* @__PURE__ */ jsxs29(
16646
17158
  FloatingPanel,
16647
17159
  {
16648
17160
  isOpen,
@@ -16654,7 +17166,7 @@ var ChatFloatingWidget = ({
16654
17166
  panelRef,
16655
17167
  positionStyle: dragResize.panelPositionStyle,
16656
17168
  isResizing: dragResize.isResizing,
16657
- resizeHandles: !dragResize.isMobile && !disableDragResize ? /* @__PURE__ */ jsx29(
17169
+ resizeHandles: !dragResize.isMobile && !disableDragResize ? /* @__PURE__ */ jsx30(
16658
17170
  ResizeHandles,
16659
17171
  {
16660
17172
  onPointerDown: dragResize.resizeHandlers.onPointerDown,
@@ -16663,7 +17175,7 @@ var ChatFloatingWidget = ({
16663
17175
  }
16664
17176
  ) : null,
16665
17177
  children: [
16666
- /* @__PURE__ */ jsx29(
17178
+ /* @__PURE__ */ jsx30(
16667
17179
  FloatingTabBar,
16668
17180
  {
16669
17181
  tabs: allTabs,
@@ -16671,8 +17183,8 @@ var ChatFloatingWidget = ({
16671
17183
  onTabChange: setTab
16672
17184
  }
16673
17185
  ),
16674
- /* @__PURE__ */ jsxs28("div", { style: { flex: 1, position: "relative", overflow: "hidden", minHeight: 0 }, children: [
16675
- /* @__PURE__ */ jsx29(
17186
+ /* @__PURE__ */ jsxs29("div", { style: { flex: 1, position: "relative", overflow: "hidden", minHeight: 0 }, children: [
17187
+ /* @__PURE__ */ jsx30(
16676
17188
  "div",
16677
17189
  {
16678
17190
  style: {
@@ -16686,7 +17198,7 @@ var ChatFloatingWidget = ({
16686
17198
  bottom: 0,
16687
17199
  overflow: "hidden"
16688
17200
  },
16689
- children: /* @__PURE__ */ jsx29(
17201
+ children: /* @__PURE__ */ jsx30(
16690
17202
  CompactChatView,
16691
17203
  {
16692
17204
  chatState,
@@ -16702,7 +17214,7 @@ var ChatFloatingWidget = ({
16702
17214
  )
16703
17215
  }
16704
17216
  ),
16705
- tabs.map((tab) => /* @__PURE__ */ jsx29(
17217
+ tabs.map((tab) => /* @__PURE__ */ jsx30(
16706
17218
  "div",
16707
17219
  {
16708
17220
  style: {
@@ -16728,7 +17240,7 @@ var ChatFloatingWidget = ({
16728
17240
  };
16729
17241
 
16730
17242
  // src/react/hooks/useDeepResearch.ts
16731
- import { useState as useState28, useCallback as useCallback15, useRef as useRef17 } from "react";
17243
+ import { useState as useState29, useCallback as useCallback16, useRef as useRef18 } from "react";
16732
17244
  var REPORT_GENERATION_PROMPT2 = `\uB2F9\uC2E0\uC740 \uB9AC\uC11C\uCE58 \uBCF4\uACE0\uC11C \uC791\uC131 \uC804\uBB38\uAC00\uC785\uB2C8\uB2E4.
16733
17245
 
16734
17246
  <collected_sources>
@@ -16779,10 +17291,10 @@ var QUERY_ANALYSIS_PROMPT2 = `\uC0AC\uC6A9\uC790 \uC9C8\uBB38\uC744 \uBD84\uC11D
16779
17291
  - JSON \uC678 \uB2E4\uB978 \uD14D\uC2A4\uD2B8 \uCD9C\uB825 \uAE08\uC9C0`;
16780
17292
  var useDeepResearch = (options) => {
16781
17293
  const { onWebSearch, onExtractContent, apiEndpoint, apiKey, model, provider } = options;
16782
- const [isResearching, setIsResearching] = useState28(false);
16783
- const [progress, setProgress] = useState28(null);
16784
- const abortControllerRef = useRef17(null);
16785
- const callLLM2 = useCallback15(
17294
+ const [isResearching, setIsResearching] = useState29(false);
17295
+ const [progress, setProgress] = useState29(null);
17296
+ const abortControllerRef = useRef18(null);
17297
+ const callLLM2 = useCallback16(
16786
17298
  async (prompt, stream = false) => {
16787
17299
  const response = await fetch(apiEndpoint, {
16788
17300
  method: "POST",
@@ -16809,7 +17321,7 @@ var useDeepResearch = (options) => {
16809
17321
  },
16810
17322
  [apiEndpoint, apiKey, model, provider]
16811
17323
  );
16812
- const analyzeQuery2 = useCallback15(
17324
+ const analyzeQuery2 = useCallback16(
16813
17325
  async (query) => {
16814
17326
  const prompt = QUERY_ANALYSIS_PROMPT2.replace("{question}", query);
16815
17327
  const response = await callLLM2(prompt);
@@ -16828,7 +17340,7 @@ var useDeepResearch = (options) => {
16828
17340
  },
16829
17341
  [callLLM2]
16830
17342
  );
16831
- const runSubAgent2 = useCallback15(
17343
+ const runSubAgent2 = useCallback16(
16832
17344
  async (topic, queries, agentId, updateProgress) => {
16833
17345
  updateProgress({ status: "searching", searchCount: 0, resultsCount: 0 });
16834
17346
  const allResults = [];
@@ -16867,7 +17379,7 @@ var useDeepResearch = (options) => {
16867
17379
  },
16868
17380
  [onWebSearch, onExtractContent]
16869
17381
  );
16870
- const generateReport2 = useCallback15(
17382
+ const generateReport2 = useCallback16(
16871
17383
  async (query, results, onStreamContent) => {
16872
17384
  const allSources = [];
16873
17385
  const sourcesForPrompt = [];
@@ -16925,7 +17437,7 @@ var useDeepResearch = (options) => {
16925
17437
  },
16926
17438
  [callLLM2]
16927
17439
  );
16928
- const runDeepResearch = useCallback15(
17440
+ const runDeepResearch = useCallback16(
16929
17441
  async (query, onStreamContent) => {
16930
17442
  abortControllerRef.current = new AbortController();
16931
17443
  setIsResearching(true);
@@ -17028,7 +17540,7 @@ var useDeepResearch = (options) => {
17028
17540
  },
17029
17541
  [analyzeQuery2, runSubAgent2, generateReport2]
17030
17542
  );
17031
- const stopResearch = useCallback15(() => {
17543
+ const stopResearch = useCallback16(() => {
17032
17544
  abortControllerRef.current?.abort();
17033
17545
  setIsResearching(false);
17034
17546
  setProgress(null);
@@ -17042,7 +17554,7 @@ var useDeepResearch = (options) => {
17042
17554
  };
17043
17555
 
17044
17556
  // src/react/components/EmptyState.tsx
17045
- import { jsx as jsx30, jsxs as jsxs29 } from "react/jsx-runtime";
17557
+ import { jsx as jsx31, jsxs as jsxs30 } from "react/jsx-runtime";
17046
17558
  var EmptyState = ({
17047
17559
  greeting,
17048
17560
  templates = [],
@@ -17060,7 +17572,7 @@ var EmptyState = ({
17060
17572
  return iconMap[icon] || "sparkling-line";
17061
17573
  };
17062
17574
  const hasContent = actions.length > 0 || templates.length > 0;
17063
- return /* @__PURE__ */ jsxs29(
17575
+ return /* @__PURE__ */ jsxs30(
17064
17576
  "div",
17065
17577
  {
17066
17578
  className: "chatllm-empty-state",
@@ -17075,7 +17587,7 @@ var EmptyState = ({
17075
17587
  textAlign: "center"
17076
17588
  },
17077
17589
  children: [
17078
- /* @__PURE__ */ jsx30(
17590
+ /* @__PURE__ */ jsx31(
17079
17591
  "div",
17080
17592
  {
17081
17593
  className: "chatllm-sheet",
@@ -17089,10 +17601,10 @@ var EmptyState = ({
17089
17601
  marginBottom: "32px",
17090
17602
  color: "var(--chatllm-primary)"
17091
17603
  },
17092
- children: /* @__PURE__ */ jsx30(IconSvg, { name: "chat-1-line", size: 40 })
17604
+ children: /* @__PURE__ */ jsx31(IconSvg, { name: "chat-1-line", size: 40 })
17093
17605
  }
17094
17606
  ),
17095
- /* @__PURE__ */ jsx30(
17607
+ /* @__PURE__ */ jsx31(
17096
17608
  "h1",
17097
17609
  {
17098
17610
  style: {
@@ -17105,7 +17617,7 @@ var EmptyState = ({
17105
17617
  children: "How can I help you today?"
17106
17618
  }
17107
17619
  ),
17108
- (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ jsxs29(
17620
+ (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ jsxs30(
17109
17621
  "div",
17110
17622
  {
17111
17623
  style: {
@@ -17117,7 +17629,7 @@ var EmptyState = ({
17117
17629
  marginBottom: "48px"
17118
17630
  },
17119
17631
  children: [
17120
- actions.map((action) => /* @__PURE__ */ jsxs29(
17632
+ actions.map((action) => /* @__PURE__ */ jsxs30(
17121
17633
  "button",
17122
17634
  {
17123
17635
  onClick: () => onActionSelect?.(action),
@@ -17131,7 +17643,7 @@ var EmptyState = ({
17131
17643
  fontWeight: 500
17132
17644
  },
17133
17645
  children: [
17134
- /* @__PURE__ */ jsx30(
17646
+ /* @__PURE__ */ jsx31(
17135
17647
  IconSvg,
17136
17648
  {
17137
17649
  name: getActionIcon(action.icon),
@@ -17144,7 +17656,7 @@ var EmptyState = ({
17144
17656
  },
17145
17657
  action.id
17146
17658
  )),
17147
- templates.slice(0, 4).map((template) => /* @__PURE__ */ jsxs29(
17659
+ templates.slice(0, 4).map((template) => /* @__PURE__ */ jsxs30(
17148
17660
  "button",
17149
17661
  {
17150
17662
  onClick: () => onTemplateClick(template),
@@ -17158,7 +17670,7 @@ var EmptyState = ({
17158
17670
  fontWeight: 500
17159
17671
  },
17160
17672
  children: [
17161
- /* @__PURE__ */ jsx30(
17673
+ /* @__PURE__ */ jsx31(
17162
17674
  IconSvg,
17163
17675
  {
17164
17676
  name: "sparkling-line",
@@ -17180,8 +17692,8 @@ var EmptyState = ({
17180
17692
  };
17181
17693
 
17182
17694
  // src/react/components/MemoryPanel.tsx
17183
- import { useState as useState29 } from "react";
17184
- import { jsx as jsx31, jsxs as jsxs30 } from "react/jsx-runtime";
17695
+ import { useState as useState30 } from "react";
17696
+ import { jsx as jsx32, jsxs as jsxs31 } from "react/jsx-runtime";
17185
17697
  var categoryLabels = {
17186
17698
  fact: "\uC0AC\uC6A9\uC790 \uC815\uBCF4",
17187
17699
  skill: "\uC804\uBB38 \uBD84\uC57C/\uAE30\uC220",
@@ -17200,8 +17712,8 @@ var MemoryPanel = ({
17200
17712
  isOpen,
17201
17713
  onToggle
17202
17714
  }) => {
17203
- const [expandedId, setExpandedId] = useState29(null);
17204
- const [activeTab, setActiveTab] = useState29("all");
17715
+ const [expandedId, setExpandedId] = useState30(null);
17716
+ const [activeTab, setActiveTab] = useState30("all");
17205
17717
  const filteredItems = activeTab === "all" ? items : items.filter((item) => item.category === activeTab);
17206
17718
  const formatDate = (timestamp) => {
17207
17719
  const date = new Date(timestamp);
@@ -17213,7 +17725,7 @@ var MemoryPanel = ({
17213
17725
  });
17214
17726
  };
17215
17727
  if (!isOpen) {
17216
- return /* @__PURE__ */ jsx31(
17728
+ return /* @__PURE__ */ jsx32(
17217
17729
  "button",
17218
17730
  {
17219
17731
  onClick: onToggle,
@@ -17233,11 +17745,11 @@ var MemoryPanel = ({
17233
17745
  justifyContent: "center",
17234
17746
  zIndex: 100
17235
17747
  },
17236
- children: /* @__PURE__ */ jsx31(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
17748
+ children: /* @__PURE__ */ jsx32(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
17237
17749
  }
17238
17750
  );
17239
17751
  }
17240
- return /* @__PURE__ */ jsxs30(
17752
+ return /* @__PURE__ */ jsxs31(
17241
17753
  "div",
17242
17754
  {
17243
17755
  className: "chatllm-memory-panel",
@@ -17257,7 +17769,7 @@ var MemoryPanel = ({
17257
17769
  zIndex: 100
17258
17770
  },
17259
17771
  children: [
17260
- /* @__PURE__ */ jsxs30(
17772
+ /* @__PURE__ */ jsxs31(
17261
17773
  "div",
17262
17774
  {
17263
17775
  style: {
@@ -17268,8 +17780,8 @@ var MemoryPanel = ({
17268
17780
  borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
17269
17781
  },
17270
17782
  children: [
17271
- /* @__PURE__ */ jsxs30("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
17272
- /* @__PURE__ */ jsx31(
17783
+ /* @__PURE__ */ jsxs31("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
17784
+ /* @__PURE__ */ jsx32(
17273
17785
  "div",
17274
17786
  {
17275
17787
  style: {
@@ -17281,19 +17793,19 @@ var MemoryPanel = ({
17281
17793
  alignItems: "center",
17282
17794
  justifyContent: "center"
17283
17795
  },
17284
- children: /* @__PURE__ */ jsx31(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
17796
+ children: /* @__PURE__ */ jsx32(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
17285
17797
  }
17286
17798
  ),
17287
- /* @__PURE__ */ jsxs30("div", { children: [
17288
- /* @__PURE__ */ jsx31("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
17289
- /* @__PURE__ */ jsxs30("div", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
17799
+ /* @__PURE__ */ jsxs31("div", { children: [
17800
+ /* @__PURE__ */ jsx32("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
17801
+ /* @__PURE__ */ jsxs31("div", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
17290
17802
  items.length,
17291
17803
  "\uAC1C \uD56D\uBAA9"
17292
17804
  ] })
17293
17805
  ] })
17294
17806
  ] }),
17295
- /* @__PURE__ */ jsxs30("div", { style: { display: "flex", gap: "4px" }, children: [
17296
- onClearAll && items.length > 0 && /* @__PURE__ */ jsx31(
17807
+ /* @__PURE__ */ jsxs31("div", { style: { display: "flex", gap: "4px" }, children: [
17808
+ onClearAll && items.length > 0 && /* @__PURE__ */ jsx32(
17297
17809
  "button",
17298
17810
  {
17299
17811
  onClick: onClearAll,
@@ -17305,10 +17817,10 @@ var MemoryPanel = ({
17305
17817
  cursor: "pointer"
17306
17818
  },
17307
17819
  title: "\uC804\uCCB4 \uC0AD\uC81C",
17308
- children: /* @__PURE__ */ jsx31(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
17820
+ children: /* @__PURE__ */ jsx32(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
17309
17821
  }
17310
17822
  ),
17311
- /* @__PURE__ */ jsx31(
17823
+ /* @__PURE__ */ jsx32(
17312
17824
  "button",
17313
17825
  {
17314
17826
  onClick: onToggle,
@@ -17319,14 +17831,14 @@ var MemoryPanel = ({
17319
17831
  borderRadius: "8px",
17320
17832
  cursor: "pointer"
17321
17833
  },
17322
- children: /* @__PURE__ */ jsx31(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
17834
+ children: /* @__PURE__ */ jsx32(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
17323
17835
  }
17324
17836
  )
17325
17837
  ] })
17326
17838
  ]
17327
17839
  }
17328
17840
  ),
17329
- /* @__PURE__ */ jsx31(
17841
+ /* @__PURE__ */ jsx32(
17330
17842
  "div",
17331
17843
  {
17332
17844
  style: {
@@ -17336,7 +17848,7 @@ var MemoryPanel = ({
17336
17848
  borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)",
17337
17849
  overflowX: "auto"
17338
17850
  },
17339
- children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx31(
17851
+ children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx32(
17340
17852
  "button",
17341
17853
  {
17342
17854
  onClick: () => setActiveTab(tab),
@@ -17357,8 +17869,8 @@ var MemoryPanel = ({
17357
17869
  ))
17358
17870
  }
17359
17871
  ),
17360
- /* @__PURE__ */ jsxs30("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
17361
- contextSummary && activeTab === "all" && /* @__PURE__ */ jsxs30(
17872
+ /* @__PURE__ */ jsxs31("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
17873
+ contextSummary && activeTab === "all" && /* @__PURE__ */ jsxs31(
17362
17874
  "div",
17363
17875
  {
17364
17876
  style: {
@@ -17369,7 +17881,7 @@ var MemoryPanel = ({
17369
17881
  borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
17370
17882
  },
17371
17883
  children: [
17372
- /* @__PURE__ */ jsxs30(
17884
+ /* @__PURE__ */ jsxs31(
17373
17885
  "div",
17374
17886
  {
17375
17887
  style: {
@@ -17379,12 +17891,12 @@ var MemoryPanel = ({
17379
17891
  marginBottom: "8px"
17380
17892
  },
17381
17893
  children: [
17382
- /* @__PURE__ */ jsx31(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
17383
- /* @__PURE__ */ jsx31("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
17894
+ /* @__PURE__ */ jsx32(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
17895
+ /* @__PURE__ */ jsx32("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
17384
17896
  ]
17385
17897
  }
17386
17898
  ),
17387
- /* @__PURE__ */ jsx31(
17899
+ /* @__PURE__ */ jsx32(
17388
17900
  "p",
17389
17901
  {
17390
17902
  style: {
@@ -17399,7 +17911,7 @@ var MemoryPanel = ({
17399
17911
  ]
17400
17912
  }
17401
17913
  ),
17402
- filteredItems.length === 0 ? /* @__PURE__ */ jsxs30(
17914
+ filteredItems.length === 0 ? /* @__PURE__ */ jsxs31(
17403
17915
  "div",
17404
17916
  {
17405
17917
  style: {
@@ -17408,11 +17920,11 @@ var MemoryPanel = ({
17408
17920
  color: "var(--chatllm-text-muted, #9ca3af)"
17409
17921
  },
17410
17922
  children: [
17411
- /* @__PURE__ */ jsx31(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
17412
- /* @__PURE__ */ jsx31("p", { style: { fontSize: "14px", marginTop: "12px" }, children: "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" })
17923
+ /* @__PURE__ */ jsx32(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
17924
+ /* @__PURE__ */ jsx32("p", { style: { fontSize: "14px", marginTop: "12px" }, children: "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" })
17413
17925
  ]
17414
17926
  }
17415
- ) : /* @__PURE__ */ jsx31("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ jsxs30(
17927
+ ) : /* @__PURE__ */ jsx32("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ jsxs31(
17416
17928
  "div",
17417
17929
  {
17418
17930
  style: {
@@ -17425,10 +17937,10 @@ var MemoryPanel = ({
17425
17937
  },
17426
17938
  onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
17427
17939
  children: [
17428
- /* @__PURE__ */ jsxs30("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
17429
- /* @__PURE__ */ jsxs30("div", { style: { flex: 1, minWidth: 0 }, children: [
17430
- /* @__PURE__ */ jsxs30("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
17431
- item.category && /* @__PURE__ */ jsx31(
17940
+ /* @__PURE__ */ jsxs31("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
17941
+ /* @__PURE__ */ jsxs31("div", { style: { flex: 1, minWidth: 0 }, children: [
17942
+ /* @__PURE__ */ jsxs31("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
17943
+ item.category && /* @__PURE__ */ jsx32(
17432
17944
  "span",
17433
17945
  {
17434
17946
  style: {
@@ -17442,9 +17954,9 @@ var MemoryPanel = ({
17442
17954
  children: categoryLabels[item.category]
17443
17955
  }
17444
17956
  ),
17445
- /* @__PURE__ */ jsx31("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
17957
+ /* @__PURE__ */ jsx32("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
17446
17958
  ] }),
17447
- /* @__PURE__ */ jsx31(
17959
+ /* @__PURE__ */ jsx32(
17448
17960
  "div",
17449
17961
  {
17450
17962
  style: {
@@ -17456,8 +17968,8 @@ var MemoryPanel = ({
17456
17968
  }
17457
17969
  )
17458
17970
  ] }),
17459
- /* @__PURE__ */ jsxs30("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
17460
- onDelete && /* @__PURE__ */ jsx31(
17971
+ /* @__PURE__ */ jsxs31("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
17972
+ onDelete && /* @__PURE__ */ jsx32(
17461
17973
  "button",
17462
17974
  {
17463
17975
  onClick: (e) => {
@@ -17472,10 +17984,10 @@ var MemoryPanel = ({
17472
17984
  cursor: "pointer",
17473
17985
  opacity: 0.5
17474
17986
  },
17475
- children: /* @__PURE__ */ jsx31(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
17987
+ children: /* @__PURE__ */ jsx32(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
17476
17988
  }
17477
17989
  ),
17478
- /* @__PURE__ */ jsx31(
17990
+ /* @__PURE__ */ jsx32(
17479
17991
  IconSvg,
17480
17992
  {
17481
17993
  name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
@@ -17485,7 +17997,7 @@ var MemoryPanel = ({
17485
17997
  )
17486
17998
  ] })
17487
17999
  ] }),
17488
- expandedId === item.id && /* @__PURE__ */ jsx31(
18000
+ expandedId === item.id && /* @__PURE__ */ jsx32(
17489
18001
  "div",
17490
18002
  {
17491
18003
  style: {
@@ -17493,7 +18005,7 @@ var MemoryPanel = ({
17493
18005
  paddingTop: "12px",
17494
18006
  borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
17495
18007
  },
17496
- children: /* @__PURE__ */ jsx31(
18008
+ children: /* @__PURE__ */ jsx32(
17497
18009
  "p",
17498
18010
  {
17499
18011
  style: {
@@ -17518,6 +18030,7 @@ var MemoryPanel = ({
17518
18030
  );
17519
18031
  };
17520
18032
  export {
18033
+ ArtifactCard,
17521
18034
  ChatFloatingWidget,
17522
18035
  ChatHeader,
17523
18036
  ChatInput,