@gendive/chatllm 0.17.26 → 0.17.28

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.
@@ -2826,7 +2826,26 @@ ${attachmentContext}
2826
2826
  };
2827
2827
  if (!shouldSkipSkillParsing) {
2828
2828
  const assistantContent = accumulatedContent;
2829
+ console.log("[useChatUI] Post-processing \u2014 accumulatedContent \uAE38\uC774:", assistantContent.length, ", skill_use \uD3EC\uD568:", assistantContent.includes("<skill_use"));
2829
2830
  const { skillCall: detectedSkill, cleanContent: skillCleanContent } = parseSkillCallFromContent(assistantContent);
2831
+ if (detectedSkill) {
2832
+ console.log("[useChatUI] \uC2A4\uD0AC \uAC10\uC9C0:", detectedSkill.name, ", resolvedSkills \uD0A4:", Object.keys(resolvedSkills));
2833
+ }
2834
+ if (detectedSkill && !resolvedSkills[detectedSkill.name]) {
2835
+ console.warn(`[useChatUI] \uC2A4\uD0AC "${detectedSkill.name}" \uAC10\uC9C0\uB418\uC5C8\uC73C\uB098 \uBBF8\uB4F1\uB85D. \uB4F1\uB85D\uB41C \uC2A4\uD0AC:`, Object.keys(resolvedSkills));
2836
+ setSessions(
2837
+ (prev) => prev.map((s) => {
2838
+ if (s.id !== capturedSessionId) return s;
2839
+ return {
2840
+ ...s,
2841
+ messages: s.messages.map((m) => {
2842
+ if (m.id !== assistantMessageId) return m;
2843
+ return { ...m, content: skillCleanContent };
2844
+ })
2845
+ };
2846
+ })
2847
+ );
2848
+ }
2830
2849
  if (detectedSkill && resolvedSkills[detectedSkill.name]) {
2831
2850
  setSessions(
2832
2851
  (prev) => prev.map((s) => {
@@ -4060,7 +4079,13 @@ ${result.content}
4060
4079
  /** @Todo vibecode - 체크리스트 error 항목 재시도 */
4061
4080
  handleChecklistRetry,
4062
4081
  /** @Todo vibecode - 체크리스트 pending 항목 건너뛰기 */
4063
- handleChecklistSkip
4082
+ handleChecklistSkip,
4083
+ /** @Todo vibecode - 활성 체크리스트가 포함된 메시지 (패널 자동 열기 트리거용) */
4084
+ activeChecklistMessage: messages.find(
4085
+ (m) => m.checklistBlock && !m.checklistBlock.completed
4086
+ ) || messages.find(
4087
+ (m) => m.checklistBlock?.completed
4088
+ ) || null
4064
4089
  };
4065
4090
  };
4066
4091
 
@@ -8858,6 +8883,80 @@ var ChecklistCard = ({
8858
8883
  }
8859
8884
  );
8860
8885
  };
8886
+ var ChecklistMiniIndicator = ({
8887
+ items,
8888
+ completed
8889
+ }) => {
8890
+ const doneCount = items.filter((it) => it.status === "done").length;
8891
+ const isRunning = items.some((it) => it.status === "in_progress");
8892
+ const hasError = items.some((it) => it.status === "error");
8893
+ const progressPercent = doneCount / items.length * 100;
8894
+ 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 ${doneCount}/${items.length}`;
8895
+ const statusColor = completed ? "var(--chatllm-success, #22c55e)" : hasError ? "var(--chatllm-error, #ef4444)" : "var(--chatllm-primary, #3584FA)";
8896
+ const barColor = completed ? "var(--chatllm-success, #22c55e)" : "var(--chatllm-primary, #3584FA)";
8897
+ return /* @__PURE__ */ jsxs14(
8898
+ "div",
8899
+ {
8900
+ style: {
8901
+ display: "flex",
8902
+ alignItems: "center",
8903
+ gap: "10px",
8904
+ padding: "10px 14px",
8905
+ border: "1px solid var(--chatllm-border, #e5e7eb)",
8906
+ borderRadius: "10px",
8907
+ backgroundColor: "var(--chatllm-content-bg, #fff)",
8908
+ marginTop: "8px"
8909
+ },
8910
+ children: [
8911
+ /* @__PURE__ */ jsx15(
8912
+ IconSvg,
8913
+ {
8914
+ name: completed ? "checkbox-circle-line" : "list-check",
8915
+ size: 16,
8916
+ color: statusColor
8917
+ }
8918
+ ),
8919
+ /* @__PURE__ */ jsx15(
8920
+ "span",
8921
+ {
8922
+ style: {
8923
+ fontSize: "13px",
8924
+ fontWeight: 500,
8925
+ color: statusColor,
8926
+ whiteSpace: "nowrap"
8927
+ },
8928
+ children: statusText
8929
+ }
8930
+ ),
8931
+ /* @__PURE__ */ jsx15(
8932
+ "div",
8933
+ {
8934
+ style: {
8935
+ flex: 1,
8936
+ height: "3px",
8937
+ backgroundColor: "var(--chatllm-bg-secondary, #f1f5f9)",
8938
+ borderRadius: "2px",
8939
+ overflow: "hidden",
8940
+ minWidth: "60px"
8941
+ },
8942
+ children: /* @__PURE__ */ jsx15(
8943
+ "div",
8944
+ {
8945
+ style: {
8946
+ height: "100%",
8947
+ width: `${progressPercent}%`,
8948
+ backgroundColor: barColor,
8949
+ borderRadius: "2px",
8950
+ transition: "width 0.6s cubic-bezier(0.25, 1, 0.5, 1)"
8951
+ }
8952
+ }
8953
+ )
8954
+ }
8955
+ )
8956
+ ]
8957
+ }
8958
+ );
8959
+ };
8861
8960
 
8862
8961
  // src/react/components/MessageBubble.tsx
8863
8962
  import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
@@ -9215,14 +9314,10 @@ var MessageBubble = ({
9215
9314
  }
9216
9315
  ),
9217
9316
  message.checklistBlock && message.checklistBlock.items.length > 0 && /* @__PURE__ */ jsx16(
9218
- ChecklistCard,
9317
+ ChecklistMiniIndicator,
9219
9318
  {
9220
9319
  items: message.checklistBlock.items,
9221
- currentStep: message.checklistBlock.currentStep,
9222
- completed: message.checklistBlock.completed,
9223
- onAbort: onChecklistAbort,
9224
- onRetryStep: onChecklistRetry,
9225
- onSkipStep: onChecklistSkip
9320
+ completed: message.checklistBlock.completed
9226
9321
  }
9227
9322
  ),
9228
9323
  !isLoading && !displayContent && !message.pollBlock && !message.checklistBlock && !message.contentParts?.length && /* @__PURE__ */ jsx16(
@@ -11040,8 +11135,169 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
11040
11135
  );
11041
11136
  };
11042
11137
 
11043
- // src/react/ChatUI.tsx
11138
+ // src/react/components/ChecklistPanel.tsx
11044
11139
  import { Fragment as Fragment8, jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
11140
+ var ChecklistPanel = ({
11141
+ message,
11142
+ isOpen,
11143
+ onClose,
11144
+ onAbort,
11145
+ onRetry,
11146
+ onSkip,
11147
+ width = 360,
11148
+ isMobileOverlay = false
11149
+ }) => {
11150
+ const block = message?.checklistBlock;
11151
+ if (isMobileOverlay) {
11152
+ return /* @__PURE__ */ jsxs20(Fragment8, { children: [
11153
+ /* @__PURE__ */ jsx21(
11154
+ "div",
11155
+ {
11156
+ onClick: onClose,
11157
+ style: {
11158
+ position: "fixed",
11159
+ inset: 0,
11160
+ backgroundColor: "rgba(0, 0, 0, 0.4)",
11161
+ zIndex: 999,
11162
+ opacity: isOpen ? 1 : 0,
11163
+ pointerEvents: isOpen ? "auto" : "none",
11164
+ transition: "opacity 0.3s ease"
11165
+ }
11166
+ }
11167
+ ),
11168
+ /* @__PURE__ */ jsx21(
11169
+ "aside",
11170
+ {
11171
+ style: {
11172
+ position: "fixed",
11173
+ top: 0,
11174
+ right: 0,
11175
+ bottom: 0,
11176
+ width: "85vw",
11177
+ maxWidth: "400px",
11178
+ backgroundColor: "var(--chatllm-bg, #F5F5F5)",
11179
+ zIndex: 1e3,
11180
+ transform: isOpen ? "translateX(0)" : "translateX(100%)",
11181
+ transition: "transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
11182
+ display: "flex",
11183
+ flexDirection: "column",
11184
+ boxShadow: isOpen ? "-4px 0 20px rgba(0, 0, 0, 0.1)" : "none"
11185
+ },
11186
+ children: renderPanelContent()
11187
+ }
11188
+ )
11189
+ ] });
11190
+ }
11191
+ return /* @__PURE__ */ jsx21(
11192
+ "aside",
11193
+ {
11194
+ style: {
11195
+ width: isOpen ? typeof width === "number" ? `${width}px` : width : "0px",
11196
+ minWidth: 0,
11197
+ overflow: "hidden",
11198
+ transition: "width 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
11199
+ borderLeft: isOpen ? "1px solid var(--chatllm-border, #e2e8f0)" : "none",
11200
+ backgroundColor: "var(--chatllm-bg, #F5F5F5)",
11201
+ display: "flex",
11202
+ flexDirection: "column",
11203
+ flexShrink: 0
11204
+ },
11205
+ children: isOpen && renderPanelContent()
11206
+ }
11207
+ );
11208
+ function renderPanelContent() {
11209
+ return /* @__PURE__ */ jsxs20(Fragment8, { children: [
11210
+ /* @__PURE__ */ jsxs20(
11211
+ "div",
11212
+ {
11213
+ style: {
11214
+ display: "flex",
11215
+ alignItems: "center",
11216
+ justifyContent: "space-between",
11217
+ padding: "16px",
11218
+ borderBottom: "1px solid var(--chatllm-border, #e2e8f0)",
11219
+ flexShrink: 0
11220
+ },
11221
+ children: [
11222
+ /* @__PURE__ */ jsxs20("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
11223
+ /* @__PURE__ */ jsx21(IconSvg, { name: "list-check", size: 18, color: "var(--chatllm-primary, #3584FA)" }),
11224
+ /* @__PURE__ */ jsx21(
11225
+ "span",
11226
+ {
11227
+ style: {
11228
+ fontSize: "14px",
11229
+ fontWeight: 600,
11230
+ color: "var(--chatllm-text, #1e293b)"
11231
+ },
11232
+ children: "\uCCB4\uD06C\uB9AC\uC2A4\uD2B8"
11233
+ }
11234
+ )
11235
+ ] }),
11236
+ /* @__PURE__ */ jsx21(
11237
+ "button",
11238
+ {
11239
+ onClick: onClose,
11240
+ "aria-label": "\uD328\uB110 \uB2EB\uAE30",
11241
+ style: {
11242
+ width: "28px",
11243
+ height: "28px",
11244
+ display: "flex",
11245
+ alignItems: "center",
11246
+ justifyContent: "center",
11247
+ borderRadius: "6px",
11248
+ border: "none",
11249
+ backgroundColor: "transparent",
11250
+ cursor: "pointer",
11251
+ color: "var(--chatllm-text-muted, #94a3b8)",
11252
+ transition: "background-color 0.15s ease"
11253
+ },
11254
+ children: /* @__PURE__ */ jsx21(IconSvg, { name: "close-line", size: 18, color: "currentColor" })
11255
+ }
11256
+ )
11257
+ ]
11258
+ }
11259
+ ),
11260
+ /* @__PURE__ */ jsx21(
11261
+ "div",
11262
+ {
11263
+ className: "chatllm-scrollbar",
11264
+ style: {
11265
+ flex: 1,
11266
+ overflowY: "auto",
11267
+ padding: "16px"
11268
+ },
11269
+ children: block && block.items.length > 0 ? /* @__PURE__ */ jsx21(
11270
+ ChecklistCard,
11271
+ {
11272
+ items: block.items,
11273
+ currentStep: block.currentStep,
11274
+ completed: block.completed,
11275
+ onAbort,
11276
+ onRetryStep: onRetry,
11277
+ onSkipStep: onSkip
11278
+ }
11279
+ ) : /* @__PURE__ */ jsx21(
11280
+ "div",
11281
+ {
11282
+ style: {
11283
+ display: "flex",
11284
+ alignItems: "center",
11285
+ justifyContent: "center",
11286
+ height: "100%",
11287
+ color: "var(--chatllm-text-muted, #94a3b8)",
11288
+ fontSize: "13px"
11289
+ },
11290
+ children: "\uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4"
11291
+ }
11292
+ )
11293
+ }
11294
+ )
11295
+ ] });
11296
+ }
11297
+ };
11298
+
11299
+ // src/react/ChatUI.tsx
11300
+ import { Fragment as Fragment9, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
11045
11301
  var DEFAULT_ACTIONS = [];
11046
11302
  var DEFAULT_TEMPLATES = [];
11047
11303
  var DEFAULT_MODELS = [
@@ -11380,9 +11636,33 @@ var ChatUIView = ({
11380
11636
  // Checklist
11381
11637
  handleChecklistAbort,
11382
11638
  handleChecklistRetry,
11383
- handleChecklistSkip
11639
+ handleChecklistSkip,
11640
+ activeChecklistMessage
11384
11641
  } = state;
11385
11642
  const [disclaimerOpen, setDisclaimerOpen] = React16.useState(false);
11643
+ const [isMobile, setIsMobile] = React16.useState(false);
11644
+ React16.useEffect(() => {
11645
+ if (typeof window === "undefined") return;
11646
+ const check = () => setIsMobile(window.innerWidth < 768);
11647
+ check();
11648
+ window.addEventListener("resize", check);
11649
+ return () => window.removeEventListener("resize", check);
11650
+ }, []);
11651
+ const [checklistPanelDismissed, setChecklistPanelDismissed] = React16.useState(false);
11652
+ const isChecklistPanelOpen = !!activeChecklistMessage && !checklistPanelDismissed;
11653
+ const prevChecklistIdRef = React16.useRef(void 0);
11654
+ React16.useEffect(() => {
11655
+ const currentId = activeChecklistMessage?.checklistBlock?.id;
11656
+ if (currentId && currentId !== prevChecklistIdRef.current && !activeChecklistMessage?.checklistBlock?.completed) {
11657
+ setChecklistPanelDismissed(false);
11658
+ }
11659
+ prevChecklistIdRef.current = currentId;
11660
+ }, [activeChecklistMessage?.checklistBlock?.id, activeChecklistMessage?.checklistBlock?.completed]);
11661
+ React16.useEffect(() => {
11662
+ if (!activeChecklistMessage?.checklistBlock?.completed) return;
11663
+ const timer = setTimeout(() => setChecklistPanelDismissed(true), 2e3);
11664
+ return () => clearTimeout(timer);
11665
+ }, [activeChecklistMessage?.checklistBlock?.completed]);
11386
11666
  const [welcomeExiting, setWelcomeExiting] = React16.useState(false);
11387
11667
  const prevMessageCountRef = React16.useRef(messages.length);
11388
11668
  React16.useEffect(() => {
@@ -11438,7 +11718,7 @@ var ChatUIView = ({
11438
11718
  return items;
11439
11719
  }, [projectMemory?.state.entries]);
11440
11720
  const themeClass = theme?.mode === "dark" ? "chatllm-dark" : "";
11441
- return /* @__PURE__ */ jsxs20(
11721
+ return /* @__PURE__ */ jsxs21(
11442
11722
  "div",
11443
11723
  {
11444
11724
  className: `chatllm-root ${themeClass} ${className}`,
@@ -11451,7 +11731,7 @@ var ChatUIView = ({
11451
11731
  position: "relative"
11452
11732
  },
11453
11733
  children: [
11454
- showSidebar && /* @__PURE__ */ jsx21(
11734
+ showSidebar && /* @__PURE__ */ jsx22(
11455
11735
  ChatSidebar,
11456
11736
  {
11457
11737
  sessions,
@@ -11483,7 +11763,7 @@ var ChatUIView = ({
11483
11763
  isLoading: isSessionsLoading
11484
11764
  }
11485
11765
  ),
11486
- /* @__PURE__ */ jsxs20(
11766
+ /* @__PURE__ */ jsxs21(
11487
11767
  "main",
11488
11768
  {
11489
11769
  style: {
@@ -11495,7 +11775,7 @@ var ChatUIView = ({
11495
11775
  minWidth: 0
11496
11776
  },
11497
11777
  children: [
11498
- /* @__PURE__ */ jsx21(
11778
+ /* @__PURE__ */ jsx22(
11499
11779
  ChatHeader,
11500
11780
  {
11501
11781
  title: currentSession?.title || "\uC0C8 \uB300\uD654",
@@ -11509,7 +11789,7 @@ var ChatUIView = ({
11509
11789
  showSettings
11510
11790
  }
11511
11791
  ),
11512
- (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ jsxs20(
11792
+ (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ jsxs21(
11513
11793
  "div",
11514
11794
  {
11515
11795
  style: {
@@ -11524,7 +11804,7 @@ var ChatUIView = ({
11524
11804
  pointerEvents: welcomeExiting ? "none" : "auto"
11525
11805
  },
11526
11806
  children: [
11527
- /* @__PURE__ */ jsx21(
11807
+ /* @__PURE__ */ jsx22(
11528
11808
  "h1",
11529
11809
  {
11530
11810
  style: {
@@ -11538,7 +11818,7 @@ var ChatUIView = ({
11538
11818
  children: greeting ? `${greeting} \u273A` : "\u273A \uBB34\uC5C7\uC744 \uC0DD\uAC01\uD574 \uBCFC\uAE4C\uC694?"
11539
11819
  }
11540
11820
  ),
11541
- /* @__PURE__ */ jsx21("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ jsx21(
11821
+ /* @__PURE__ */ jsx22("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ jsx22(
11542
11822
  ChatInput,
11543
11823
  {
11544
11824
  value: input,
@@ -11566,7 +11846,7 @@ var ChatUIView = ({
11566
11846
  inline: true
11567
11847
  }
11568
11848
  ) }),
11569
- suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx21(
11849
+ suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx22(
11570
11850
  "div",
11571
11851
  {
11572
11852
  style: {
@@ -11576,7 +11856,7 @@ var ChatUIView = ({
11576
11856
  justifyContent: "center",
11577
11857
  maxWidth: "680px"
11578
11858
  },
11579
- children: suggestedPrompts.map((sp) => /* @__PURE__ */ jsxs20(
11859
+ children: suggestedPrompts.map((sp) => /* @__PURE__ */ jsxs21(
11580
11860
  "button",
11581
11861
  {
11582
11862
  onClick: () => setInput(sp.prompt),
@@ -11595,7 +11875,7 @@ var ChatUIView = ({
11595
11875
  transition: "all 0.2s"
11596
11876
  },
11597
11877
  children: [
11598
- sp.icon && /* @__PURE__ */ jsx21(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
11878
+ sp.icon && /* @__PURE__ */ jsx22(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
11599
11879
  sp.label
11600
11880
  ]
11601
11881
  },
@@ -11606,8 +11886,8 @@ var ChatUIView = ({
11606
11886
  ]
11607
11887
  }
11608
11888
  ),
11609
- messages.length > 0 && /* @__PURE__ */ jsxs20(Fragment8, { children: [
11610
- /* @__PURE__ */ jsx21(
11889
+ messages.length > 0 && /* @__PURE__ */ jsxs21(Fragment9, { children: [
11890
+ /* @__PURE__ */ jsx22(
11611
11891
  MessageList,
11612
11892
  {
11613
11893
  messages,
@@ -11632,7 +11912,7 @@ var ChatUIView = ({
11632
11912
  onChecklistSkip: handleChecklistSkip
11633
11913
  }
11634
11914
  ),
11635
- /* @__PURE__ */ jsx21(
11915
+ /* @__PURE__ */ jsx22(
11636
11916
  ChatInput,
11637
11917
  {
11638
11918
  value: input,
@@ -11663,7 +11943,19 @@ var ChatUIView = ({
11663
11943
  ]
11664
11944
  }
11665
11945
  ),
11666
- showSettings && /* @__PURE__ */ jsx21(
11946
+ /* @__PURE__ */ jsx22(
11947
+ ChecklistPanel,
11948
+ {
11949
+ message: activeChecklistMessage,
11950
+ isOpen: isChecklistPanelOpen,
11951
+ onClose: () => setChecklistPanelDismissed(true),
11952
+ onAbort: handleChecklistAbort,
11953
+ onRetry: activeChecklistMessage ? (stepIndex) => handleChecklistRetry(activeChecklistMessage.id, stepIndex) : void 0,
11954
+ onSkip: activeChecklistMessage ? (stepIndex) => handleChecklistSkip(activeChecklistMessage.id, stepIndex) : void 0,
11955
+ isMobileOverlay: isMobile
11956
+ }
11957
+ ),
11958
+ showSettings && /* @__PURE__ */ jsx22(
11667
11959
  SettingsModal,
11668
11960
  {
11669
11961
  isOpen: settingsOpen,
@@ -11690,7 +11982,7 @@ var ChatUIView = ({
11690
11982
  currentProjectTitle: currentProject?.title
11691
11983
  }
11692
11984
  ),
11693
- /* @__PURE__ */ jsx21(
11985
+ /* @__PURE__ */ jsx22(
11694
11986
  ProjectSettingsModal,
11695
11987
  {
11696
11988
  isOpen: projectSettingsOpen,
@@ -11702,7 +11994,7 @@ var ChatUIView = ({
11702
11994
  onDeleteProject: deleteProject
11703
11995
  }
11704
11996
  ),
11705
- /* @__PURE__ */ jsx21(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
11997
+ /* @__PURE__ */ jsx22(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
11706
11998
  ]
11707
11999
  }
11708
12000
  );
@@ -11805,7 +12097,7 @@ var ChatUIWithHook = ({
11805
12097
  onDeleteProjectFile
11806
12098
  };
11807
12099
  const state = useChatUI(hookOptions);
11808
- return /* @__PURE__ */ jsx21(
12100
+ return /* @__PURE__ */ jsx22(
11809
12101
  ChatUIView,
11810
12102
  {
11811
12103
  state,
@@ -11853,7 +12145,7 @@ var ChatUI = (props) => {
11853
12145
  deepResearch,
11854
12146
  suggestedPrompts: chatStateSuggestedPrompts
11855
12147
  } = props;
11856
- return /* @__PURE__ */ jsx21(
12148
+ return /* @__PURE__ */ jsx22(
11857
12149
  ChatUIView,
11858
12150
  {
11859
12151
  state: props.chatState,
@@ -11878,7 +12170,7 @@ var ChatUI = (props) => {
11878
12170
  }
11879
12171
  );
11880
12172
  }
11881
- return /* @__PURE__ */ jsx21(ChatUIWithHook, { ...props });
12173
+ return /* @__PURE__ */ jsx22(ChatUIWithHook, { ...props });
11882
12174
  };
11883
12175
 
11884
12176
  // src/react/hooks/useDeepResearch.ts
@@ -12196,7 +12488,7 @@ var useDeepResearch = (options) => {
12196
12488
  };
12197
12489
 
12198
12490
  // src/react/components/EmptyState.tsx
12199
- import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
12491
+ import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
12200
12492
  var EmptyState = ({
12201
12493
  greeting,
12202
12494
  templates = [],
@@ -12214,7 +12506,7 @@ var EmptyState = ({
12214
12506
  return iconMap[icon] || "sparkling-line";
12215
12507
  };
12216
12508
  const hasContent = actions.length > 0 || templates.length > 0;
12217
- return /* @__PURE__ */ jsxs21(
12509
+ return /* @__PURE__ */ jsxs22(
12218
12510
  "div",
12219
12511
  {
12220
12512
  className: "chatllm-empty-state",
@@ -12229,7 +12521,7 @@ var EmptyState = ({
12229
12521
  textAlign: "center"
12230
12522
  },
12231
12523
  children: [
12232
- /* @__PURE__ */ jsx22(
12524
+ /* @__PURE__ */ jsx23(
12233
12525
  "div",
12234
12526
  {
12235
12527
  className: "chatllm-sheet",
@@ -12243,10 +12535,10 @@ var EmptyState = ({
12243
12535
  marginBottom: "32px",
12244
12536
  color: "var(--chatllm-primary)"
12245
12537
  },
12246
- children: /* @__PURE__ */ jsx22(IconSvg, { name: "chat-1-line", size: 40 })
12538
+ children: /* @__PURE__ */ jsx23(IconSvg, { name: "chat-1-line", size: 40 })
12247
12539
  }
12248
12540
  ),
12249
- /* @__PURE__ */ jsx22(
12541
+ /* @__PURE__ */ jsx23(
12250
12542
  "h1",
12251
12543
  {
12252
12544
  style: {
@@ -12259,7 +12551,7 @@ var EmptyState = ({
12259
12551
  children: "How can I help you today?"
12260
12552
  }
12261
12553
  ),
12262
- (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ jsxs21(
12554
+ (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ jsxs22(
12263
12555
  "div",
12264
12556
  {
12265
12557
  style: {
@@ -12271,7 +12563,7 @@ var EmptyState = ({
12271
12563
  marginBottom: "48px"
12272
12564
  },
12273
12565
  children: [
12274
- actions.map((action) => /* @__PURE__ */ jsxs21(
12566
+ actions.map((action) => /* @__PURE__ */ jsxs22(
12275
12567
  "button",
12276
12568
  {
12277
12569
  onClick: () => onActionSelect?.(action),
@@ -12285,7 +12577,7 @@ var EmptyState = ({
12285
12577
  fontWeight: 500
12286
12578
  },
12287
12579
  children: [
12288
- /* @__PURE__ */ jsx22(
12580
+ /* @__PURE__ */ jsx23(
12289
12581
  IconSvg,
12290
12582
  {
12291
12583
  name: getActionIcon(action.icon),
@@ -12298,7 +12590,7 @@ var EmptyState = ({
12298
12590
  },
12299
12591
  action.id
12300
12592
  )),
12301
- templates.slice(0, 4).map((template) => /* @__PURE__ */ jsxs21(
12593
+ templates.slice(0, 4).map((template) => /* @__PURE__ */ jsxs22(
12302
12594
  "button",
12303
12595
  {
12304
12596
  onClick: () => onTemplateClick(template),
@@ -12312,7 +12604,7 @@ var EmptyState = ({
12312
12604
  fontWeight: 500
12313
12605
  },
12314
12606
  children: [
12315
- /* @__PURE__ */ jsx22(
12607
+ /* @__PURE__ */ jsx23(
12316
12608
  IconSvg,
12317
12609
  {
12318
12610
  name: "sparkling-line",
@@ -12335,7 +12627,7 @@ var EmptyState = ({
12335
12627
 
12336
12628
  // src/react/components/MemoryPanel.tsx
12337
12629
  import { useState as useState20 } from "react";
12338
- import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
12630
+ import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
12339
12631
  var categoryLabels = {
12340
12632
  fact: "\uC0AC\uC6A9\uC790 \uC815\uBCF4",
12341
12633
  skill: "\uC804\uBB38 \uBD84\uC57C/\uAE30\uC220",
@@ -12367,7 +12659,7 @@ var MemoryPanel = ({
12367
12659
  });
12368
12660
  };
12369
12661
  if (!isOpen) {
12370
- return /* @__PURE__ */ jsx23(
12662
+ return /* @__PURE__ */ jsx24(
12371
12663
  "button",
12372
12664
  {
12373
12665
  onClick: onToggle,
@@ -12387,11 +12679,11 @@ var MemoryPanel = ({
12387
12679
  justifyContent: "center",
12388
12680
  zIndex: 100
12389
12681
  },
12390
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
12682
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
12391
12683
  }
12392
12684
  );
12393
12685
  }
12394
- return /* @__PURE__ */ jsxs22(
12686
+ return /* @__PURE__ */ jsxs23(
12395
12687
  "div",
12396
12688
  {
12397
12689
  className: "chatllm-memory-panel",
@@ -12411,7 +12703,7 @@ var MemoryPanel = ({
12411
12703
  zIndex: 100
12412
12704
  },
12413
12705
  children: [
12414
- /* @__PURE__ */ jsxs22(
12706
+ /* @__PURE__ */ jsxs23(
12415
12707
  "div",
12416
12708
  {
12417
12709
  style: {
@@ -12422,8 +12714,8 @@ var MemoryPanel = ({
12422
12714
  borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
12423
12715
  },
12424
12716
  children: [
12425
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
12426
- /* @__PURE__ */ jsx23(
12717
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
12718
+ /* @__PURE__ */ jsx24(
12427
12719
  "div",
12428
12720
  {
12429
12721
  style: {
@@ -12435,19 +12727,19 @@ var MemoryPanel = ({
12435
12727
  alignItems: "center",
12436
12728
  justifyContent: "center"
12437
12729
  },
12438
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
12730
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
12439
12731
  }
12440
12732
  ),
12441
- /* @__PURE__ */ jsxs22("div", { children: [
12442
- /* @__PURE__ */ jsx23("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
12443
- /* @__PURE__ */ jsxs22("div", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
12733
+ /* @__PURE__ */ jsxs23("div", { children: [
12734
+ /* @__PURE__ */ jsx24("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
12735
+ /* @__PURE__ */ jsxs23("div", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
12444
12736
  items.length,
12445
12737
  "\uAC1C \uD56D\uBAA9"
12446
12738
  ] })
12447
12739
  ] })
12448
12740
  ] }),
12449
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", gap: "4px" }, children: [
12450
- onClearAll && items.length > 0 && /* @__PURE__ */ jsx23(
12741
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", gap: "4px" }, children: [
12742
+ onClearAll && items.length > 0 && /* @__PURE__ */ jsx24(
12451
12743
  "button",
12452
12744
  {
12453
12745
  onClick: onClearAll,
@@ -12459,10 +12751,10 @@ var MemoryPanel = ({
12459
12751
  cursor: "pointer"
12460
12752
  },
12461
12753
  title: "\uC804\uCCB4 \uC0AD\uC81C",
12462
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12754
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12463
12755
  }
12464
12756
  ),
12465
- /* @__PURE__ */ jsx23(
12757
+ /* @__PURE__ */ jsx24(
12466
12758
  "button",
12467
12759
  {
12468
12760
  onClick: onToggle,
@@ -12473,14 +12765,14 @@ var MemoryPanel = ({
12473
12765
  borderRadius: "8px",
12474
12766
  cursor: "pointer"
12475
12767
  },
12476
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12768
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12477
12769
  }
12478
12770
  )
12479
12771
  ] })
12480
12772
  ]
12481
12773
  }
12482
12774
  ),
12483
- /* @__PURE__ */ jsx23(
12775
+ /* @__PURE__ */ jsx24(
12484
12776
  "div",
12485
12777
  {
12486
12778
  style: {
@@ -12490,7 +12782,7 @@ var MemoryPanel = ({
12490
12782
  borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)",
12491
12783
  overflowX: "auto"
12492
12784
  },
12493
- children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx23(
12785
+ children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx24(
12494
12786
  "button",
12495
12787
  {
12496
12788
  onClick: () => setActiveTab(tab),
@@ -12511,8 +12803,8 @@ var MemoryPanel = ({
12511
12803
  ))
12512
12804
  }
12513
12805
  ),
12514
- /* @__PURE__ */ jsxs22("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
12515
- contextSummary && activeTab === "all" && /* @__PURE__ */ jsxs22(
12806
+ /* @__PURE__ */ jsxs23("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
12807
+ contextSummary && activeTab === "all" && /* @__PURE__ */ jsxs23(
12516
12808
  "div",
12517
12809
  {
12518
12810
  style: {
@@ -12523,7 +12815,7 @@ var MemoryPanel = ({
12523
12815
  borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
12524
12816
  },
12525
12817
  children: [
12526
- /* @__PURE__ */ jsxs22(
12818
+ /* @__PURE__ */ jsxs23(
12527
12819
  "div",
12528
12820
  {
12529
12821
  style: {
@@ -12533,12 +12825,12 @@ var MemoryPanel = ({
12533
12825
  marginBottom: "8px"
12534
12826
  },
12535
12827
  children: [
12536
- /* @__PURE__ */ jsx23(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12537
- /* @__PURE__ */ jsx23("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
12828
+ /* @__PURE__ */ jsx24(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12829
+ /* @__PURE__ */ jsx24("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
12538
12830
  ]
12539
12831
  }
12540
12832
  ),
12541
- /* @__PURE__ */ jsx23(
12833
+ /* @__PURE__ */ jsx24(
12542
12834
  "p",
12543
12835
  {
12544
12836
  style: {
@@ -12553,7 +12845,7 @@ var MemoryPanel = ({
12553
12845
  ]
12554
12846
  }
12555
12847
  ),
12556
- filteredItems.length === 0 ? /* @__PURE__ */ jsxs22(
12848
+ filteredItems.length === 0 ? /* @__PURE__ */ jsxs23(
12557
12849
  "div",
12558
12850
  {
12559
12851
  style: {
@@ -12562,11 +12854,11 @@ var MemoryPanel = ({
12562
12854
  color: "var(--chatllm-text-muted, #9ca3af)"
12563
12855
  },
12564
12856
  children: [
12565
- /* @__PURE__ */ jsx23(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
12566
- /* @__PURE__ */ jsx23("p", { style: { fontSize: "14px", marginTop: "12px" }, children: "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" })
12857
+ /* @__PURE__ */ jsx24(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
12858
+ /* @__PURE__ */ jsx24("p", { style: { fontSize: "14px", marginTop: "12px" }, children: "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" })
12567
12859
  ]
12568
12860
  }
12569
- ) : /* @__PURE__ */ jsx23("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ jsxs22(
12861
+ ) : /* @__PURE__ */ jsx24("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ jsxs23(
12570
12862
  "div",
12571
12863
  {
12572
12864
  style: {
@@ -12579,10 +12871,10 @@ var MemoryPanel = ({
12579
12871
  },
12580
12872
  onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
12581
12873
  children: [
12582
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
12583
- /* @__PURE__ */ jsxs22("div", { style: { flex: 1, minWidth: 0 }, children: [
12584
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
12585
- item.category && /* @__PURE__ */ jsx23(
12874
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
12875
+ /* @__PURE__ */ jsxs23("div", { style: { flex: 1, minWidth: 0 }, children: [
12876
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
12877
+ item.category && /* @__PURE__ */ jsx24(
12586
12878
  "span",
12587
12879
  {
12588
12880
  style: {
@@ -12596,9 +12888,9 @@ var MemoryPanel = ({
12596
12888
  children: categoryLabels[item.category]
12597
12889
  }
12598
12890
  ),
12599
- /* @__PURE__ */ jsx23("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
12891
+ /* @__PURE__ */ jsx24("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
12600
12892
  ] }),
12601
- /* @__PURE__ */ jsx23(
12893
+ /* @__PURE__ */ jsx24(
12602
12894
  "div",
12603
12895
  {
12604
12896
  style: {
@@ -12610,8 +12902,8 @@ var MemoryPanel = ({
12610
12902
  }
12611
12903
  )
12612
12904
  ] }),
12613
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12614
- onDelete && /* @__PURE__ */ jsx23(
12905
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12906
+ onDelete && /* @__PURE__ */ jsx24(
12615
12907
  "button",
12616
12908
  {
12617
12909
  onClick: (e) => {
@@ -12626,10 +12918,10 @@ var MemoryPanel = ({
12626
12918
  cursor: "pointer",
12627
12919
  opacity: 0.5
12628
12920
  },
12629
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
12921
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
12630
12922
  }
12631
12923
  ),
12632
- /* @__PURE__ */ jsx23(
12924
+ /* @__PURE__ */ jsx24(
12633
12925
  IconSvg,
12634
12926
  {
12635
12927
  name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
@@ -12639,7 +12931,7 @@ var MemoryPanel = ({
12639
12931
  )
12640
12932
  ] })
12641
12933
  ] }),
12642
- expandedId === item.id && /* @__PURE__ */ jsx23(
12934
+ expandedId === item.id && /* @__PURE__ */ jsx24(
12643
12935
  "div",
12644
12936
  {
12645
12937
  style: {
@@ -12647,7 +12939,7 @@ var MemoryPanel = ({
12647
12939
  paddingTop: "12px",
12648
12940
  borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
12649
12941
  },
12650
- children: /* @__PURE__ */ jsx23(
12942
+ children: /* @__PURE__ */ jsx24(
12651
12943
  "p",
12652
12944
  {
12653
12945
  style: {
@@ -12677,6 +12969,8 @@ export {
12677
12969
  ChatSidebar,
12678
12970
  ChatUI,
12679
12971
  ChecklistCard,
12972
+ ChecklistMiniIndicator,
12973
+ ChecklistPanel,
12680
12974
  ContentPartRenderer,
12681
12975
  DEFAULT_PROJECT_ID,
12682
12976
  DEFAULT_PROJECT_TITLE,