@gendive/chatllm 0.17.27 → 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.
@@ -4079,7 +4079,13 @@ ${result.content}
4079
4079
  /** @Todo vibecode - 체크리스트 error 항목 재시도 */
4080
4080
  handleChecklistRetry,
4081
4081
  /** @Todo vibecode - 체크리스트 pending 항목 건너뛰기 */
4082
- 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
4083
4089
  };
4084
4090
  };
4085
4091
 
@@ -8877,6 +8883,80 @@ var ChecklistCard = ({
8877
8883
  }
8878
8884
  );
8879
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
+ };
8880
8960
 
8881
8961
  // src/react/components/MessageBubble.tsx
8882
8962
  import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
@@ -9234,14 +9314,10 @@ var MessageBubble = ({
9234
9314
  }
9235
9315
  ),
9236
9316
  message.checklistBlock && message.checklistBlock.items.length > 0 && /* @__PURE__ */ jsx16(
9237
- ChecklistCard,
9317
+ ChecklistMiniIndicator,
9238
9318
  {
9239
9319
  items: message.checklistBlock.items,
9240
- currentStep: message.checklistBlock.currentStep,
9241
- completed: message.checklistBlock.completed,
9242
- onAbort: onChecklistAbort,
9243
- onRetryStep: onChecklistRetry,
9244
- onSkipStep: onChecklistSkip
9320
+ completed: message.checklistBlock.completed
9245
9321
  }
9246
9322
  ),
9247
9323
  !isLoading && !displayContent && !message.pollBlock && !message.checklistBlock && !message.contentParts?.length && /* @__PURE__ */ jsx16(
@@ -11059,8 +11135,169 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
11059
11135
  );
11060
11136
  };
11061
11137
 
11062
- // src/react/ChatUI.tsx
11138
+ // src/react/components/ChecklistPanel.tsx
11063
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";
11064
11301
  var DEFAULT_ACTIONS = [];
11065
11302
  var DEFAULT_TEMPLATES = [];
11066
11303
  var DEFAULT_MODELS = [
@@ -11399,9 +11636,33 @@ var ChatUIView = ({
11399
11636
  // Checklist
11400
11637
  handleChecklistAbort,
11401
11638
  handleChecklistRetry,
11402
- handleChecklistSkip
11639
+ handleChecklistSkip,
11640
+ activeChecklistMessage
11403
11641
  } = state;
11404
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]);
11405
11666
  const [welcomeExiting, setWelcomeExiting] = React16.useState(false);
11406
11667
  const prevMessageCountRef = React16.useRef(messages.length);
11407
11668
  React16.useEffect(() => {
@@ -11457,7 +11718,7 @@ var ChatUIView = ({
11457
11718
  return items;
11458
11719
  }, [projectMemory?.state.entries]);
11459
11720
  const themeClass = theme?.mode === "dark" ? "chatllm-dark" : "";
11460
- return /* @__PURE__ */ jsxs20(
11721
+ return /* @__PURE__ */ jsxs21(
11461
11722
  "div",
11462
11723
  {
11463
11724
  className: `chatllm-root ${themeClass} ${className}`,
@@ -11470,7 +11731,7 @@ var ChatUIView = ({
11470
11731
  position: "relative"
11471
11732
  },
11472
11733
  children: [
11473
- showSidebar && /* @__PURE__ */ jsx21(
11734
+ showSidebar && /* @__PURE__ */ jsx22(
11474
11735
  ChatSidebar,
11475
11736
  {
11476
11737
  sessions,
@@ -11502,7 +11763,7 @@ var ChatUIView = ({
11502
11763
  isLoading: isSessionsLoading
11503
11764
  }
11504
11765
  ),
11505
- /* @__PURE__ */ jsxs20(
11766
+ /* @__PURE__ */ jsxs21(
11506
11767
  "main",
11507
11768
  {
11508
11769
  style: {
@@ -11514,7 +11775,7 @@ var ChatUIView = ({
11514
11775
  minWidth: 0
11515
11776
  },
11516
11777
  children: [
11517
- /* @__PURE__ */ jsx21(
11778
+ /* @__PURE__ */ jsx22(
11518
11779
  ChatHeader,
11519
11780
  {
11520
11781
  title: currentSession?.title || "\uC0C8 \uB300\uD654",
@@ -11528,7 +11789,7 @@ var ChatUIView = ({
11528
11789
  showSettings
11529
11790
  }
11530
11791
  ),
11531
- (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ jsxs20(
11792
+ (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ jsxs21(
11532
11793
  "div",
11533
11794
  {
11534
11795
  style: {
@@ -11543,7 +11804,7 @@ var ChatUIView = ({
11543
11804
  pointerEvents: welcomeExiting ? "none" : "auto"
11544
11805
  },
11545
11806
  children: [
11546
- /* @__PURE__ */ jsx21(
11807
+ /* @__PURE__ */ jsx22(
11547
11808
  "h1",
11548
11809
  {
11549
11810
  style: {
@@ -11557,7 +11818,7 @@ var ChatUIView = ({
11557
11818
  children: greeting ? `${greeting} \u273A` : "\u273A \uBB34\uC5C7\uC744 \uC0DD\uAC01\uD574 \uBCFC\uAE4C\uC694?"
11558
11819
  }
11559
11820
  ),
11560
- /* @__PURE__ */ jsx21("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ jsx21(
11821
+ /* @__PURE__ */ jsx22("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ jsx22(
11561
11822
  ChatInput,
11562
11823
  {
11563
11824
  value: input,
@@ -11585,7 +11846,7 @@ var ChatUIView = ({
11585
11846
  inline: true
11586
11847
  }
11587
11848
  ) }),
11588
- suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx21(
11849
+ suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx22(
11589
11850
  "div",
11590
11851
  {
11591
11852
  style: {
@@ -11595,7 +11856,7 @@ var ChatUIView = ({
11595
11856
  justifyContent: "center",
11596
11857
  maxWidth: "680px"
11597
11858
  },
11598
- children: suggestedPrompts.map((sp) => /* @__PURE__ */ jsxs20(
11859
+ children: suggestedPrompts.map((sp) => /* @__PURE__ */ jsxs21(
11599
11860
  "button",
11600
11861
  {
11601
11862
  onClick: () => setInput(sp.prompt),
@@ -11614,7 +11875,7 @@ var ChatUIView = ({
11614
11875
  transition: "all 0.2s"
11615
11876
  },
11616
11877
  children: [
11617
- 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)" }),
11618
11879
  sp.label
11619
11880
  ]
11620
11881
  },
@@ -11625,8 +11886,8 @@ var ChatUIView = ({
11625
11886
  ]
11626
11887
  }
11627
11888
  ),
11628
- messages.length > 0 && /* @__PURE__ */ jsxs20(Fragment8, { children: [
11629
- /* @__PURE__ */ jsx21(
11889
+ messages.length > 0 && /* @__PURE__ */ jsxs21(Fragment9, { children: [
11890
+ /* @__PURE__ */ jsx22(
11630
11891
  MessageList,
11631
11892
  {
11632
11893
  messages,
@@ -11651,7 +11912,7 @@ var ChatUIView = ({
11651
11912
  onChecklistSkip: handleChecklistSkip
11652
11913
  }
11653
11914
  ),
11654
- /* @__PURE__ */ jsx21(
11915
+ /* @__PURE__ */ jsx22(
11655
11916
  ChatInput,
11656
11917
  {
11657
11918
  value: input,
@@ -11682,7 +11943,19 @@ var ChatUIView = ({
11682
11943
  ]
11683
11944
  }
11684
11945
  ),
11685
- 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(
11686
11959
  SettingsModal,
11687
11960
  {
11688
11961
  isOpen: settingsOpen,
@@ -11709,7 +11982,7 @@ var ChatUIView = ({
11709
11982
  currentProjectTitle: currentProject?.title
11710
11983
  }
11711
11984
  ),
11712
- /* @__PURE__ */ jsx21(
11985
+ /* @__PURE__ */ jsx22(
11713
11986
  ProjectSettingsModal,
11714
11987
  {
11715
11988
  isOpen: projectSettingsOpen,
@@ -11721,7 +11994,7 @@ var ChatUIView = ({
11721
11994
  onDeleteProject: deleteProject
11722
11995
  }
11723
11996
  ),
11724
- /* @__PURE__ */ jsx21(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
11997
+ /* @__PURE__ */ jsx22(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
11725
11998
  ]
11726
11999
  }
11727
12000
  );
@@ -11824,7 +12097,7 @@ var ChatUIWithHook = ({
11824
12097
  onDeleteProjectFile
11825
12098
  };
11826
12099
  const state = useChatUI(hookOptions);
11827
- return /* @__PURE__ */ jsx21(
12100
+ return /* @__PURE__ */ jsx22(
11828
12101
  ChatUIView,
11829
12102
  {
11830
12103
  state,
@@ -11872,7 +12145,7 @@ var ChatUI = (props) => {
11872
12145
  deepResearch,
11873
12146
  suggestedPrompts: chatStateSuggestedPrompts
11874
12147
  } = props;
11875
- return /* @__PURE__ */ jsx21(
12148
+ return /* @__PURE__ */ jsx22(
11876
12149
  ChatUIView,
11877
12150
  {
11878
12151
  state: props.chatState,
@@ -11897,7 +12170,7 @@ var ChatUI = (props) => {
11897
12170
  }
11898
12171
  );
11899
12172
  }
11900
- return /* @__PURE__ */ jsx21(ChatUIWithHook, { ...props });
12173
+ return /* @__PURE__ */ jsx22(ChatUIWithHook, { ...props });
11901
12174
  };
11902
12175
 
11903
12176
  // src/react/hooks/useDeepResearch.ts
@@ -12215,7 +12488,7 @@ var useDeepResearch = (options) => {
12215
12488
  };
12216
12489
 
12217
12490
  // src/react/components/EmptyState.tsx
12218
- import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
12491
+ import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
12219
12492
  var EmptyState = ({
12220
12493
  greeting,
12221
12494
  templates = [],
@@ -12233,7 +12506,7 @@ var EmptyState = ({
12233
12506
  return iconMap[icon] || "sparkling-line";
12234
12507
  };
12235
12508
  const hasContent = actions.length > 0 || templates.length > 0;
12236
- return /* @__PURE__ */ jsxs21(
12509
+ return /* @__PURE__ */ jsxs22(
12237
12510
  "div",
12238
12511
  {
12239
12512
  className: "chatllm-empty-state",
@@ -12248,7 +12521,7 @@ var EmptyState = ({
12248
12521
  textAlign: "center"
12249
12522
  },
12250
12523
  children: [
12251
- /* @__PURE__ */ jsx22(
12524
+ /* @__PURE__ */ jsx23(
12252
12525
  "div",
12253
12526
  {
12254
12527
  className: "chatllm-sheet",
@@ -12262,10 +12535,10 @@ var EmptyState = ({
12262
12535
  marginBottom: "32px",
12263
12536
  color: "var(--chatllm-primary)"
12264
12537
  },
12265
- children: /* @__PURE__ */ jsx22(IconSvg, { name: "chat-1-line", size: 40 })
12538
+ children: /* @__PURE__ */ jsx23(IconSvg, { name: "chat-1-line", size: 40 })
12266
12539
  }
12267
12540
  ),
12268
- /* @__PURE__ */ jsx22(
12541
+ /* @__PURE__ */ jsx23(
12269
12542
  "h1",
12270
12543
  {
12271
12544
  style: {
@@ -12278,7 +12551,7 @@ var EmptyState = ({
12278
12551
  children: "How can I help you today?"
12279
12552
  }
12280
12553
  ),
12281
- (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ jsxs21(
12554
+ (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ jsxs22(
12282
12555
  "div",
12283
12556
  {
12284
12557
  style: {
@@ -12290,7 +12563,7 @@ var EmptyState = ({
12290
12563
  marginBottom: "48px"
12291
12564
  },
12292
12565
  children: [
12293
- actions.map((action) => /* @__PURE__ */ jsxs21(
12566
+ actions.map((action) => /* @__PURE__ */ jsxs22(
12294
12567
  "button",
12295
12568
  {
12296
12569
  onClick: () => onActionSelect?.(action),
@@ -12304,7 +12577,7 @@ var EmptyState = ({
12304
12577
  fontWeight: 500
12305
12578
  },
12306
12579
  children: [
12307
- /* @__PURE__ */ jsx22(
12580
+ /* @__PURE__ */ jsx23(
12308
12581
  IconSvg,
12309
12582
  {
12310
12583
  name: getActionIcon(action.icon),
@@ -12317,7 +12590,7 @@ var EmptyState = ({
12317
12590
  },
12318
12591
  action.id
12319
12592
  )),
12320
- templates.slice(0, 4).map((template) => /* @__PURE__ */ jsxs21(
12593
+ templates.slice(0, 4).map((template) => /* @__PURE__ */ jsxs22(
12321
12594
  "button",
12322
12595
  {
12323
12596
  onClick: () => onTemplateClick(template),
@@ -12331,7 +12604,7 @@ var EmptyState = ({
12331
12604
  fontWeight: 500
12332
12605
  },
12333
12606
  children: [
12334
- /* @__PURE__ */ jsx22(
12607
+ /* @__PURE__ */ jsx23(
12335
12608
  IconSvg,
12336
12609
  {
12337
12610
  name: "sparkling-line",
@@ -12354,7 +12627,7 @@ var EmptyState = ({
12354
12627
 
12355
12628
  // src/react/components/MemoryPanel.tsx
12356
12629
  import { useState as useState20 } from "react";
12357
- import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
12630
+ import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
12358
12631
  var categoryLabels = {
12359
12632
  fact: "\uC0AC\uC6A9\uC790 \uC815\uBCF4",
12360
12633
  skill: "\uC804\uBB38 \uBD84\uC57C/\uAE30\uC220",
@@ -12386,7 +12659,7 @@ var MemoryPanel = ({
12386
12659
  });
12387
12660
  };
12388
12661
  if (!isOpen) {
12389
- return /* @__PURE__ */ jsx23(
12662
+ return /* @__PURE__ */ jsx24(
12390
12663
  "button",
12391
12664
  {
12392
12665
  onClick: onToggle,
@@ -12406,11 +12679,11 @@ var MemoryPanel = ({
12406
12679
  justifyContent: "center",
12407
12680
  zIndex: 100
12408
12681
  },
12409
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
12682
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
12410
12683
  }
12411
12684
  );
12412
12685
  }
12413
- return /* @__PURE__ */ jsxs22(
12686
+ return /* @__PURE__ */ jsxs23(
12414
12687
  "div",
12415
12688
  {
12416
12689
  className: "chatllm-memory-panel",
@@ -12430,7 +12703,7 @@ var MemoryPanel = ({
12430
12703
  zIndex: 100
12431
12704
  },
12432
12705
  children: [
12433
- /* @__PURE__ */ jsxs22(
12706
+ /* @__PURE__ */ jsxs23(
12434
12707
  "div",
12435
12708
  {
12436
12709
  style: {
@@ -12441,8 +12714,8 @@ var MemoryPanel = ({
12441
12714
  borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
12442
12715
  },
12443
12716
  children: [
12444
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
12445
- /* @__PURE__ */ jsx23(
12717
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
12718
+ /* @__PURE__ */ jsx24(
12446
12719
  "div",
12447
12720
  {
12448
12721
  style: {
@@ -12454,19 +12727,19 @@ var MemoryPanel = ({
12454
12727
  alignItems: "center",
12455
12728
  justifyContent: "center"
12456
12729
  },
12457
- 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)" })
12458
12731
  }
12459
12732
  ),
12460
- /* @__PURE__ */ jsxs22("div", { children: [
12461
- /* @__PURE__ */ jsx23("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
12462
- /* @__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: [
12463
12736
  items.length,
12464
12737
  "\uAC1C \uD56D\uBAA9"
12465
12738
  ] })
12466
12739
  ] })
12467
12740
  ] }),
12468
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", gap: "4px" }, children: [
12469
- onClearAll && items.length > 0 && /* @__PURE__ */ jsx23(
12741
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", gap: "4px" }, children: [
12742
+ onClearAll && items.length > 0 && /* @__PURE__ */ jsx24(
12470
12743
  "button",
12471
12744
  {
12472
12745
  onClick: onClearAll,
@@ -12478,10 +12751,10 @@ var MemoryPanel = ({
12478
12751
  cursor: "pointer"
12479
12752
  },
12480
12753
  title: "\uC804\uCCB4 \uC0AD\uC81C",
12481
- 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)" })
12482
12755
  }
12483
12756
  ),
12484
- /* @__PURE__ */ jsx23(
12757
+ /* @__PURE__ */ jsx24(
12485
12758
  "button",
12486
12759
  {
12487
12760
  onClick: onToggle,
@@ -12492,14 +12765,14 @@ var MemoryPanel = ({
12492
12765
  borderRadius: "8px",
12493
12766
  cursor: "pointer"
12494
12767
  },
12495
- 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)" })
12496
12769
  }
12497
12770
  )
12498
12771
  ] })
12499
12772
  ]
12500
12773
  }
12501
12774
  ),
12502
- /* @__PURE__ */ jsx23(
12775
+ /* @__PURE__ */ jsx24(
12503
12776
  "div",
12504
12777
  {
12505
12778
  style: {
@@ -12509,7 +12782,7 @@ var MemoryPanel = ({
12509
12782
  borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)",
12510
12783
  overflowX: "auto"
12511
12784
  },
12512
- children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx23(
12785
+ children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx24(
12513
12786
  "button",
12514
12787
  {
12515
12788
  onClick: () => setActiveTab(tab),
@@ -12530,8 +12803,8 @@ var MemoryPanel = ({
12530
12803
  ))
12531
12804
  }
12532
12805
  ),
12533
- /* @__PURE__ */ jsxs22("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
12534
- contextSummary && activeTab === "all" && /* @__PURE__ */ jsxs22(
12806
+ /* @__PURE__ */ jsxs23("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
12807
+ contextSummary && activeTab === "all" && /* @__PURE__ */ jsxs23(
12535
12808
  "div",
12536
12809
  {
12537
12810
  style: {
@@ -12542,7 +12815,7 @@ var MemoryPanel = ({
12542
12815
  borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
12543
12816
  },
12544
12817
  children: [
12545
- /* @__PURE__ */ jsxs22(
12818
+ /* @__PURE__ */ jsxs23(
12546
12819
  "div",
12547
12820
  {
12548
12821
  style: {
@@ -12552,12 +12825,12 @@ var MemoryPanel = ({
12552
12825
  marginBottom: "8px"
12553
12826
  },
12554
12827
  children: [
12555
- /* @__PURE__ */ jsx23(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12556
- /* @__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" })
12557
12830
  ]
12558
12831
  }
12559
12832
  ),
12560
- /* @__PURE__ */ jsx23(
12833
+ /* @__PURE__ */ jsx24(
12561
12834
  "p",
12562
12835
  {
12563
12836
  style: {
@@ -12572,7 +12845,7 @@ var MemoryPanel = ({
12572
12845
  ]
12573
12846
  }
12574
12847
  ),
12575
- filteredItems.length === 0 ? /* @__PURE__ */ jsxs22(
12848
+ filteredItems.length === 0 ? /* @__PURE__ */ jsxs23(
12576
12849
  "div",
12577
12850
  {
12578
12851
  style: {
@@ -12581,11 +12854,11 @@ var MemoryPanel = ({
12581
12854
  color: "var(--chatllm-text-muted, #9ca3af)"
12582
12855
  },
12583
12856
  children: [
12584
- /* @__PURE__ */ jsx23(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
12585
- /* @__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" })
12586
12859
  ]
12587
12860
  }
12588
- ) : /* @__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(
12589
12862
  "div",
12590
12863
  {
12591
12864
  style: {
@@ -12598,10 +12871,10 @@ var MemoryPanel = ({
12598
12871
  },
12599
12872
  onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
12600
12873
  children: [
12601
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
12602
- /* @__PURE__ */ jsxs22("div", { style: { flex: 1, minWidth: 0 }, children: [
12603
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
12604
- 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(
12605
12878
  "span",
12606
12879
  {
12607
12880
  style: {
@@ -12615,9 +12888,9 @@ var MemoryPanel = ({
12615
12888
  children: categoryLabels[item.category]
12616
12889
  }
12617
12890
  ),
12618
- /* @__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) })
12619
12892
  ] }),
12620
- /* @__PURE__ */ jsx23(
12893
+ /* @__PURE__ */ jsx24(
12621
12894
  "div",
12622
12895
  {
12623
12896
  style: {
@@ -12629,8 +12902,8 @@ var MemoryPanel = ({
12629
12902
  }
12630
12903
  )
12631
12904
  ] }),
12632
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12633
- onDelete && /* @__PURE__ */ jsx23(
12905
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12906
+ onDelete && /* @__PURE__ */ jsx24(
12634
12907
  "button",
12635
12908
  {
12636
12909
  onClick: (e) => {
@@ -12645,10 +12918,10 @@ var MemoryPanel = ({
12645
12918
  cursor: "pointer",
12646
12919
  opacity: 0.5
12647
12920
  },
12648
- 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)" })
12649
12922
  }
12650
12923
  ),
12651
- /* @__PURE__ */ jsx23(
12924
+ /* @__PURE__ */ jsx24(
12652
12925
  IconSvg,
12653
12926
  {
12654
12927
  name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
@@ -12658,7 +12931,7 @@ var MemoryPanel = ({
12658
12931
  )
12659
12932
  ] })
12660
12933
  ] }),
12661
- expandedId === item.id && /* @__PURE__ */ jsx23(
12934
+ expandedId === item.id && /* @__PURE__ */ jsx24(
12662
12935
  "div",
12663
12936
  {
12664
12937
  style: {
@@ -12666,7 +12939,7 @@ var MemoryPanel = ({
12666
12939
  paddingTop: "12px",
12667
12940
  borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
12668
12941
  },
12669
- children: /* @__PURE__ */ jsx23(
12942
+ children: /* @__PURE__ */ jsx24(
12670
12943
  "p",
12671
12944
  {
12672
12945
  style: {
@@ -12696,6 +12969,8 @@ export {
12696
12969
  ChatSidebar,
12697
12970
  ChatUI,
12698
12971
  ChecklistCard,
12972
+ ChecklistMiniIndicator,
12973
+ ChecklistPanel,
12699
12974
  ContentPartRenderer,
12700
12975
  DEFAULT_PROJECT_ID,
12701
12976
  DEFAULT_PROJECT_TITLE,