@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.
@@ -35,6 +35,8 @@ __export(index_exports, {
35
35
  ChatSidebar: () => ChatSidebar,
36
36
  ChatUI: () => ChatUI,
37
37
  ChecklistCard: () => ChecklistCard,
38
+ ChecklistMiniIndicator: () => ChecklistMiniIndicator,
39
+ ChecklistPanel: () => ChecklistPanel,
38
40
  ContentPartRenderer: () => ContentPartRenderer,
39
41
  DEFAULT_PROJECT_ID: () => DEFAULT_PROJECT_ID,
40
42
  DEFAULT_PROJECT_TITLE: () => DEFAULT_PROJECT_TITLE,
@@ -4146,7 +4148,13 @@ ${result.content}
4146
4148
  /** @Todo vibecode - 체크리스트 error 항목 재시도 */
4147
4149
  handleChecklistRetry,
4148
4150
  /** @Todo vibecode - 체크리스트 pending 항목 건너뛰기 */
4149
- handleChecklistSkip
4151
+ handleChecklistSkip,
4152
+ /** @Todo vibecode - 활성 체크리스트가 포함된 메시지 (패널 자동 열기 트리거용) */
4153
+ activeChecklistMessage: messages.find(
4154
+ (m) => m.checklistBlock && !m.checklistBlock.completed
4155
+ ) || messages.find(
4156
+ (m) => m.checklistBlock?.completed
4157
+ ) || null
4150
4158
  };
4151
4159
  };
4152
4160
 
@@ -8944,6 +8952,80 @@ var ChecklistCard = ({
8944
8952
  }
8945
8953
  );
8946
8954
  };
8955
+ var ChecklistMiniIndicator = ({
8956
+ items,
8957
+ completed
8958
+ }) => {
8959
+ const doneCount = items.filter((it) => it.status === "done").length;
8960
+ const isRunning = items.some((it) => it.status === "in_progress");
8961
+ const hasError = items.some((it) => it.status === "error");
8962
+ const progressPercent = doneCount / items.length * 100;
8963
+ 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}`;
8964
+ const statusColor = completed ? "var(--chatllm-success, #22c55e)" : hasError ? "var(--chatllm-error, #ef4444)" : "var(--chatllm-primary, #3584FA)";
8965
+ const barColor = completed ? "var(--chatllm-success, #22c55e)" : "var(--chatllm-primary, #3584FA)";
8966
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
8967
+ "div",
8968
+ {
8969
+ style: {
8970
+ display: "flex",
8971
+ alignItems: "center",
8972
+ gap: "10px",
8973
+ padding: "10px 14px",
8974
+ border: "1px solid var(--chatllm-border, #e5e7eb)",
8975
+ borderRadius: "10px",
8976
+ backgroundColor: "var(--chatllm-content-bg, #fff)",
8977
+ marginTop: "8px"
8978
+ },
8979
+ children: [
8980
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
8981
+ IconSvg,
8982
+ {
8983
+ name: completed ? "checkbox-circle-line" : "list-check",
8984
+ size: 16,
8985
+ color: statusColor
8986
+ }
8987
+ ),
8988
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
8989
+ "span",
8990
+ {
8991
+ style: {
8992
+ fontSize: "13px",
8993
+ fontWeight: 500,
8994
+ color: statusColor,
8995
+ whiteSpace: "nowrap"
8996
+ },
8997
+ children: statusText
8998
+ }
8999
+ ),
9000
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
9001
+ "div",
9002
+ {
9003
+ style: {
9004
+ flex: 1,
9005
+ height: "3px",
9006
+ backgroundColor: "var(--chatllm-bg-secondary, #f1f5f9)",
9007
+ borderRadius: "2px",
9008
+ overflow: "hidden",
9009
+ minWidth: "60px"
9010
+ },
9011
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
9012
+ "div",
9013
+ {
9014
+ style: {
9015
+ height: "100%",
9016
+ width: `${progressPercent}%`,
9017
+ backgroundColor: barColor,
9018
+ borderRadius: "2px",
9019
+ transition: "width 0.6s cubic-bezier(0.25, 1, 0.5, 1)"
9020
+ }
9021
+ }
9022
+ )
9023
+ }
9024
+ )
9025
+ ]
9026
+ }
9027
+ );
9028
+ };
8947
9029
 
8948
9030
  // src/react/components/MessageBubble.tsx
8949
9031
  var import_jsx_runtime16 = require("react/jsx-runtime");
@@ -9301,14 +9383,10 @@ var MessageBubble = ({
9301
9383
  }
9302
9384
  ),
9303
9385
  message.checklistBlock && message.checklistBlock.items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9304
- ChecklistCard,
9386
+ ChecklistMiniIndicator,
9305
9387
  {
9306
9388
  items: message.checklistBlock.items,
9307
- currentStep: message.checklistBlock.currentStep,
9308
- completed: message.checklistBlock.completed,
9309
- onAbort: onChecklistAbort,
9310
- onRetryStep: onChecklistRetry,
9311
- onSkipStep: onChecklistSkip
9389
+ completed: message.checklistBlock.completed
9312
9390
  }
9313
9391
  ),
9314
9392
  !isLoading && !displayContent && !message.pollBlock && !message.checklistBlock && !message.contentParts?.length && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
@@ -11126,8 +11204,169 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
11126
11204
  );
11127
11205
  };
11128
11206
 
11129
- // src/react/ChatUI.tsx
11207
+ // src/react/components/ChecklistPanel.tsx
11130
11208
  var import_jsx_runtime21 = require("react/jsx-runtime");
11209
+ var ChecklistPanel = ({
11210
+ message,
11211
+ isOpen,
11212
+ onClose,
11213
+ onAbort,
11214
+ onRetry,
11215
+ onSkip,
11216
+ width = 360,
11217
+ isMobileOverlay = false
11218
+ }) => {
11219
+ const block = message?.checklistBlock;
11220
+ if (isMobileOverlay) {
11221
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
11222
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11223
+ "div",
11224
+ {
11225
+ onClick: onClose,
11226
+ style: {
11227
+ position: "fixed",
11228
+ inset: 0,
11229
+ backgroundColor: "rgba(0, 0, 0, 0.4)",
11230
+ zIndex: 999,
11231
+ opacity: isOpen ? 1 : 0,
11232
+ pointerEvents: isOpen ? "auto" : "none",
11233
+ transition: "opacity 0.3s ease"
11234
+ }
11235
+ }
11236
+ ),
11237
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11238
+ "aside",
11239
+ {
11240
+ style: {
11241
+ position: "fixed",
11242
+ top: 0,
11243
+ right: 0,
11244
+ bottom: 0,
11245
+ width: "85vw",
11246
+ maxWidth: "400px",
11247
+ backgroundColor: "var(--chatllm-bg, #F5F5F5)",
11248
+ zIndex: 1e3,
11249
+ transform: isOpen ? "translateX(0)" : "translateX(100%)",
11250
+ transition: "transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
11251
+ display: "flex",
11252
+ flexDirection: "column",
11253
+ boxShadow: isOpen ? "-4px 0 20px rgba(0, 0, 0, 0.1)" : "none"
11254
+ },
11255
+ children: renderPanelContent()
11256
+ }
11257
+ )
11258
+ ] });
11259
+ }
11260
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11261
+ "aside",
11262
+ {
11263
+ style: {
11264
+ width: isOpen ? typeof width === "number" ? `${width}px` : width : "0px",
11265
+ minWidth: 0,
11266
+ overflow: "hidden",
11267
+ transition: "width 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
11268
+ borderLeft: isOpen ? "1px solid var(--chatllm-border, #e2e8f0)" : "none",
11269
+ backgroundColor: "var(--chatllm-bg, #F5F5F5)",
11270
+ display: "flex",
11271
+ flexDirection: "column",
11272
+ flexShrink: 0
11273
+ },
11274
+ children: isOpen && renderPanelContent()
11275
+ }
11276
+ );
11277
+ function renderPanelContent() {
11278
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
11279
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
11280
+ "div",
11281
+ {
11282
+ style: {
11283
+ display: "flex",
11284
+ alignItems: "center",
11285
+ justifyContent: "space-between",
11286
+ padding: "16px",
11287
+ borderBottom: "1px solid var(--chatllm-border, #e2e8f0)",
11288
+ flexShrink: 0
11289
+ },
11290
+ children: [
11291
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
11292
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(IconSvg, { name: "list-check", size: 18, color: "var(--chatllm-primary, #3584FA)" }),
11293
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11294
+ "span",
11295
+ {
11296
+ style: {
11297
+ fontSize: "14px",
11298
+ fontWeight: 600,
11299
+ color: "var(--chatllm-text, #1e293b)"
11300
+ },
11301
+ children: "\uCCB4\uD06C\uB9AC\uC2A4\uD2B8"
11302
+ }
11303
+ )
11304
+ ] }),
11305
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11306
+ "button",
11307
+ {
11308
+ onClick: onClose,
11309
+ "aria-label": "\uD328\uB110 \uB2EB\uAE30",
11310
+ style: {
11311
+ width: "28px",
11312
+ height: "28px",
11313
+ display: "flex",
11314
+ alignItems: "center",
11315
+ justifyContent: "center",
11316
+ borderRadius: "6px",
11317
+ border: "none",
11318
+ backgroundColor: "transparent",
11319
+ cursor: "pointer",
11320
+ color: "var(--chatllm-text-muted, #94a3b8)",
11321
+ transition: "background-color 0.15s ease"
11322
+ },
11323
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(IconSvg, { name: "close-line", size: 18, color: "currentColor" })
11324
+ }
11325
+ )
11326
+ ]
11327
+ }
11328
+ ),
11329
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11330
+ "div",
11331
+ {
11332
+ className: "chatllm-scrollbar",
11333
+ style: {
11334
+ flex: 1,
11335
+ overflowY: "auto",
11336
+ padding: "16px"
11337
+ },
11338
+ children: block && block.items.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11339
+ ChecklistCard,
11340
+ {
11341
+ items: block.items,
11342
+ currentStep: block.currentStep,
11343
+ completed: block.completed,
11344
+ onAbort,
11345
+ onRetryStep: onRetry,
11346
+ onSkipStep: onSkip
11347
+ }
11348
+ ) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11349
+ "div",
11350
+ {
11351
+ style: {
11352
+ display: "flex",
11353
+ alignItems: "center",
11354
+ justifyContent: "center",
11355
+ height: "100%",
11356
+ color: "var(--chatllm-text-muted, #94a3b8)",
11357
+ fontSize: "13px"
11358
+ },
11359
+ children: "\uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4"
11360
+ }
11361
+ )
11362
+ }
11363
+ )
11364
+ ] });
11365
+ }
11366
+ };
11367
+
11368
+ // src/react/ChatUI.tsx
11369
+ var import_jsx_runtime22 = require("react/jsx-runtime");
11131
11370
  var DEFAULT_ACTIONS = [];
11132
11371
  var DEFAULT_TEMPLATES = [];
11133
11372
  var DEFAULT_MODELS = [
@@ -11466,9 +11705,33 @@ var ChatUIView = ({
11466
11705
  // Checklist
11467
11706
  handleChecklistAbort,
11468
11707
  handleChecklistRetry,
11469
- handleChecklistSkip
11708
+ handleChecklistSkip,
11709
+ activeChecklistMessage
11470
11710
  } = state;
11471
11711
  const [disclaimerOpen, setDisclaimerOpen] = import_react21.default.useState(false);
11712
+ const [isMobile, setIsMobile] = import_react21.default.useState(false);
11713
+ import_react21.default.useEffect(() => {
11714
+ if (typeof window === "undefined") return;
11715
+ const check = () => setIsMobile(window.innerWidth < 768);
11716
+ check();
11717
+ window.addEventListener("resize", check);
11718
+ return () => window.removeEventListener("resize", check);
11719
+ }, []);
11720
+ const [checklistPanelDismissed, setChecklistPanelDismissed] = import_react21.default.useState(false);
11721
+ const isChecklistPanelOpen = !!activeChecklistMessage && !checklistPanelDismissed;
11722
+ const prevChecklistIdRef = import_react21.default.useRef(void 0);
11723
+ import_react21.default.useEffect(() => {
11724
+ const currentId = activeChecklistMessage?.checklistBlock?.id;
11725
+ if (currentId && currentId !== prevChecklistIdRef.current && !activeChecklistMessage?.checklistBlock?.completed) {
11726
+ setChecklistPanelDismissed(false);
11727
+ }
11728
+ prevChecklistIdRef.current = currentId;
11729
+ }, [activeChecklistMessage?.checklistBlock?.id, activeChecklistMessage?.checklistBlock?.completed]);
11730
+ import_react21.default.useEffect(() => {
11731
+ if (!activeChecklistMessage?.checklistBlock?.completed) return;
11732
+ const timer = setTimeout(() => setChecklistPanelDismissed(true), 2e3);
11733
+ return () => clearTimeout(timer);
11734
+ }, [activeChecklistMessage?.checklistBlock?.completed]);
11472
11735
  const [welcomeExiting, setWelcomeExiting] = import_react21.default.useState(false);
11473
11736
  const prevMessageCountRef = import_react21.default.useRef(messages.length);
11474
11737
  import_react21.default.useEffect(() => {
@@ -11524,7 +11787,7 @@ var ChatUIView = ({
11524
11787
  return items;
11525
11788
  }, [projectMemory?.state.entries]);
11526
11789
  const themeClass = theme?.mode === "dark" ? "chatllm-dark" : "";
11527
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
11790
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
11528
11791
  "div",
11529
11792
  {
11530
11793
  className: `chatllm-root ${themeClass} ${className}`,
@@ -11537,7 +11800,7 @@ var ChatUIView = ({
11537
11800
  position: "relative"
11538
11801
  },
11539
11802
  children: [
11540
- showSidebar && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11803
+ showSidebar && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11541
11804
  ChatSidebar,
11542
11805
  {
11543
11806
  sessions,
@@ -11569,7 +11832,7 @@ var ChatUIView = ({
11569
11832
  isLoading: isSessionsLoading
11570
11833
  }
11571
11834
  ),
11572
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
11835
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
11573
11836
  "main",
11574
11837
  {
11575
11838
  style: {
@@ -11581,7 +11844,7 @@ var ChatUIView = ({
11581
11844
  minWidth: 0
11582
11845
  },
11583
11846
  children: [
11584
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11847
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11585
11848
  ChatHeader,
11586
11849
  {
11587
11850
  title: currentSession?.title || "\uC0C8 \uB300\uD654",
@@ -11595,7 +11858,7 @@ var ChatUIView = ({
11595
11858
  showSettings
11596
11859
  }
11597
11860
  ),
11598
- (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
11861
+ (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
11599
11862
  "div",
11600
11863
  {
11601
11864
  style: {
@@ -11610,7 +11873,7 @@ var ChatUIView = ({
11610
11873
  pointerEvents: welcomeExiting ? "none" : "auto"
11611
11874
  },
11612
11875
  children: [
11613
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11876
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11614
11877
  "h1",
11615
11878
  {
11616
11879
  style: {
@@ -11624,7 +11887,7 @@ var ChatUIView = ({
11624
11887
  children: greeting ? `${greeting} \u273A` : "\u273A \uBB34\uC5C7\uC744 \uC0DD\uAC01\uD574 \uBCFC\uAE4C\uC694?"
11625
11888
  }
11626
11889
  ),
11627
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11890
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11628
11891
  ChatInput,
11629
11892
  {
11630
11893
  value: input,
@@ -11652,7 +11915,7 @@ var ChatUIView = ({
11652
11915
  inline: true
11653
11916
  }
11654
11917
  ) }),
11655
- suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11918
+ suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11656
11919
  "div",
11657
11920
  {
11658
11921
  style: {
@@ -11662,7 +11925,7 @@ var ChatUIView = ({
11662
11925
  justifyContent: "center",
11663
11926
  maxWidth: "680px"
11664
11927
  },
11665
- children: suggestedPrompts.map((sp) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
11928
+ children: suggestedPrompts.map((sp) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
11666
11929
  "button",
11667
11930
  {
11668
11931
  onClick: () => setInput(sp.prompt),
@@ -11681,7 +11944,7 @@ var ChatUIView = ({
11681
11944
  transition: "all 0.2s"
11682
11945
  },
11683
11946
  children: [
11684
- sp.icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
11947
+ sp.icon && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
11685
11948
  sp.label
11686
11949
  ]
11687
11950
  },
@@ -11692,8 +11955,8 @@ var ChatUIView = ({
11692
11955
  ]
11693
11956
  }
11694
11957
  ),
11695
- messages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
11696
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11958
+ messages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
11959
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11697
11960
  MessageList,
11698
11961
  {
11699
11962
  messages,
@@ -11718,7 +11981,7 @@ var ChatUIView = ({
11718
11981
  onChecklistSkip: handleChecklistSkip
11719
11982
  }
11720
11983
  ),
11721
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
11984
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11722
11985
  ChatInput,
11723
11986
  {
11724
11987
  value: input,
@@ -11749,7 +12012,19 @@ var ChatUIView = ({
11749
12012
  ]
11750
12013
  }
11751
12014
  ),
11752
- showSettings && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
12015
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
12016
+ ChecklistPanel,
12017
+ {
12018
+ message: activeChecklistMessage,
12019
+ isOpen: isChecklistPanelOpen,
12020
+ onClose: () => setChecklistPanelDismissed(true),
12021
+ onAbort: handleChecklistAbort,
12022
+ onRetry: activeChecklistMessage ? (stepIndex) => handleChecklistRetry(activeChecklistMessage.id, stepIndex) : void 0,
12023
+ onSkip: activeChecklistMessage ? (stepIndex) => handleChecklistSkip(activeChecklistMessage.id, stepIndex) : void 0,
12024
+ isMobileOverlay: isMobile
12025
+ }
12026
+ ),
12027
+ showSettings && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11753
12028
  SettingsModal,
11754
12029
  {
11755
12030
  isOpen: settingsOpen,
@@ -11776,7 +12051,7 @@ var ChatUIView = ({
11776
12051
  currentProjectTitle: currentProject?.title
11777
12052
  }
11778
12053
  ),
11779
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
12054
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11780
12055
  ProjectSettingsModal,
11781
12056
  {
11782
12057
  isOpen: projectSettingsOpen,
@@ -11788,7 +12063,7 @@ var ChatUIView = ({
11788
12063
  onDeleteProject: deleteProject
11789
12064
  }
11790
12065
  ),
11791
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
12066
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
11792
12067
  ]
11793
12068
  }
11794
12069
  );
@@ -11891,7 +12166,7 @@ var ChatUIWithHook = ({
11891
12166
  onDeleteProjectFile
11892
12167
  };
11893
12168
  const state = useChatUI(hookOptions);
11894
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
12169
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11895
12170
  ChatUIView,
11896
12171
  {
11897
12172
  state,
@@ -11939,7 +12214,7 @@ var ChatUI = (props) => {
11939
12214
  deepResearch,
11940
12215
  suggestedPrompts: chatStateSuggestedPrompts
11941
12216
  } = props;
11942
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
12217
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11943
12218
  ChatUIView,
11944
12219
  {
11945
12220
  state: props.chatState,
@@ -11964,7 +12239,7 @@ var ChatUI = (props) => {
11964
12239
  }
11965
12240
  );
11966
12241
  }
11967
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ChatUIWithHook, { ...props });
12242
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ChatUIWithHook, { ...props });
11968
12243
  };
11969
12244
 
11970
12245
  // src/react/hooks/useDeepResearch.ts
@@ -12282,7 +12557,7 @@ var useDeepResearch = (options) => {
12282
12557
  };
12283
12558
 
12284
12559
  // src/react/components/EmptyState.tsx
12285
- var import_jsx_runtime22 = require("react/jsx-runtime");
12560
+ var import_jsx_runtime23 = require("react/jsx-runtime");
12286
12561
  var EmptyState = ({
12287
12562
  greeting,
12288
12563
  templates = [],
@@ -12300,7 +12575,7 @@ var EmptyState = ({
12300
12575
  return iconMap[icon] || "sparkling-line";
12301
12576
  };
12302
12577
  const hasContent = actions.length > 0 || templates.length > 0;
12303
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
12578
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12304
12579
  "div",
12305
12580
  {
12306
12581
  className: "chatllm-empty-state",
@@ -12315,7 +12590,7 @@ var EmptyState = ({
12315
12590
  textAlign: "center"
12316
12591
  },
12317
12592
  children: [
12318
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
12593
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12319
12594
  "div",
12320
12595
  {
12321
12596
  className: "chatllm-sheet",
@@ -12329,10 +12604,10 @@ var EmptyState = ({
12329
12604
  marginBottom: "32px",
12330
12605
  color: "var(--chatllm-primary)"
12331
12606
  },
12332
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(IconSvg, { name: "chat-1-line", size: 40 })
12607
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "chat-1-line", size: 40 })
12333
12608
  }
12334
12609
  ),
12335
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
12610
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12336
12611
  "h1",
12337
12612
  {
12338
12613
  style: {
@@ -12345,7 +12620,7 @@ var EmptyState = ({
12345
12620
  children: "How can I help you today?"
12346
12621
  }
12347
12622
  ),
12348
- (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
12623
+ (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12349
12624
  "div",
12350
12625
  {
12351
12626
  style: {
@@ -12357,7 +12632,7 @@ var EmptyState = ({
12357
12632
  marginBottom: "48px"
12358
12633
  },
12359
12634
  children: [
12360
- actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
12635
+ actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12361
12636
  "button",
12362
12637
  {
12363
12638
  onClick: () => onActionSelect?.(action),
@@ -12371,7 +12646,7 @@ var EmptyState = ({
12371
12646
  fontWeight: 500
12372
12647
  },
12373
12648
  children: [
12374
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
12649
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12375
12650
  IconSvg,
12376
12651
  {
12377
12652
  name: getActionIcon(action.icon),
@@ -12384,7 +12659,7 @@ var EmptyState = ({
12384
12659
  },
12385
12660
  action.id
12386
12661
  )),
12387
- templates.slice(0, 4).map((template) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
12662
+ templates.slice(0, 4).map((template) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12388
12663
  "button",
12389
12664
  {
12390
12665
  onClick: () => onTemplateClick(template),
@@ -12398,7 +12673,7 @@ var EmptyState = ({
12398
12673
  fontWeight: 500
12399
12674
  },
12400
12675
  children: [
12401
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
12676
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12402
12677
  IconSvg,
12403
12678
  {
12404
12679
  name: "sparkling-line",
@@ -12421,7 +12696,7 @@ var EmptyState = ({
12421
12696
 
12422
12697
  // src/react/components/MemoryPanel.tsx
12423
12698
  var import_react23 = require("react");
12424
- var import_jsx_runtime23 = require("react/jsx-runtime");
12699
+ var import_jsx_runtime24 = require("react/jsx-runtime");
12425
12700
  var categoryLabels = {
12426
12701
  fact: "\uC0AC\uC6A9\uC790 \uC815\uBCF4",
12427
12702
  skill: "\uC804\uBB38 \uBD84\uC57C/\uAE30\uC220",
@@ -12453,7 +12728,7 @@ var MemoryPanel = ({
12453
12728
  });
12454
12729
  };
12455
12730
  if (!isOpen) {
12456
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12731
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12457
12732
  "button",
12458
12733
  {
12459
12734
  onClick: onToggle,
@@ -12473,11 +12748,11 @@ var MemoryPanel = ({
12473
12748
  justifyContent: "center",
12474
12749
  zIndex: 100
12475
12750
  },
12476
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
12751
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
12477
12752
  }
12478
12753
  );
12479
12754
  }
12480
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12755
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
12481
12756
  "div",
12482
12757
  {
12483
12758
  className: "chatllm-memory-panel",
@@ -12497,7 +12772,7 @@ var MemoryPanel = ({
12497
12772
  zIndex: 100
12498
12773
  },
12499
12774
  children: [
12500
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12775
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
12501
12776
  "div",
12502
12777
  {
12503
12778
  style: {
@@ -12508,8 +12783,8 @@ var MemoryPanel = ({
12508
12783
  borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
12509
12784
  },
12510
12785
  children: [
12511
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
12512
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12786
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
12787
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12513
12788
  "div",
12514
12789
  {
12515
12790
  style: {
@@ -12521,19 +12796,19 @@ var MemoryPanel = ({
12521
12796
  alignItems: "center",
12522
12797
  justifyContent: "center"
12523
12798
  },
12524
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
12799
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
12525
12800
  }
12526
12801
  ),
12527
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
12528
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
12529
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
12802
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { children: [
12803
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
12804
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
12530
12805
  items.length,
12531
12806
  "\uAC1C \uD56D\uBAA9"
12532
12807
  ] })
12533
12808
  ] })
12534
12809
  ] }),
12535
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", gap: "4px" }, children: [
12536
- onClearAll && items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12810
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { display: "flex", gap: "4px" }, children: [
12811
+ onClearAll && items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12537
12812
  "button",
12538
12813
  {
12539
12814
  onClick: onClearAll,
@@ -12545,10 +12820,10 @@ var MemoryPanel = ({
12545
12820
  cursor: "pointer"
12546
12821
  },
12547
12822
  title: "\uC804\uCCB4 \uC0AD\uC81C",
12548
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12823
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12549
12824
  }
12550
12825
  ),
12551
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12826
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12552
12827
  "button",
12553
12828
  {
12554
12829
  onClick: onToggle,
@@ -12559,14 +12834,14 @@ var MemoryPanel = ({
12559
12834
  borderRadius: "8px",
12560
12835
  cursor: "pointer"
12561
12836
  },
12562
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12837
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12563
12838
  }
12564
12839
  )
12565
12840
  ] })
12566
12841
  ]
12567
12842
  }
12568
12843
  ),
12569
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12844
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12570
12845
  "div",
12571
12846
  {
12572
12847
  style: {
@@ -12576,7 +12851,7 @@ var MemoryPanel = ({
12576
12851
  borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)",
12577
12852
  overflowX: "auto"
12578
12853
  },
12579
- children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12854
+ children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12580
12855
  "button",
12581
12856
  {
12582
12857
  onClick: () => setActiveTab(tab),
@@ -12597,8 +12872,8 @@ var MemoryPanel = ({
12597
12872
  ))
12598
12873
  }
12599
12874
  ),
12600
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
12601
- contextSummary && activeTab === "all" && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12875
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
12876
+ contextSummary && activeTab === "all" && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
12602
12877
  "div",
12603
12878
  {
12604
12879
  style: {
@@ -12609,7 +12884,7 @@ var MemoryPanel = ({
12609
12884
  borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
12610
12885
  },
12611
12886
  children: [
12612
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12887
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
12613
12888
  "div",
12614
12889
  {
12615
12890
  style: {
@@ -12619,12 +12894,12 @@ var MemoryPanel = ({
12619
12894
  marginBottom: "8px"
12620
12895
  },
12621
12896
  children: [
12622
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12623
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
12897
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12898
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
12624
12899
  ]
12625
12900
  }
12626
12901
  ),
12627
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12902
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12628
12903
  "p",
12629
12904
  {
12630
12905
  style: {
@@ -12639,7 +12914,7 @@ var MemoryPanel = ({
12639
12914
  ]
12640
12915
  }
12641
12916
  ),
12642
- filteredItems.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12917
+ filteredItems.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
12643
12918
  "div",
12644
12919
  {
12645
12920
  style: {
@@ -12648,11 +12923,11 @@ var MemoryPanel = ({
12648
12923
  color: "var(--chatllm-text-muted, #9ca3af)"
12649
12924
  },
12650
12925
  children: [
12651
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
12652
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { style: { fontSize: "14px", marginTop: "12px" }, children: "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" })
12926
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
12927
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { style: { fontSize: "14px", marginTop: "12px" }, children: "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" })
12653
12928
  ]
12654
12929
  }
12655
- ) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
12930
+ ) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
12656
12931
  "div",
12657
12932
  {
12658
12933
  style: {
@@ -12665,10 +12940,10 @@ var MemoryPanel = ({
12665
12940
  },
12666
12941
  onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
12667
12942
  children: [
12668
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
12669
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
12670
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
12671
- item.category && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12943
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
12944
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
12945
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
12946
+ item.category && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12672
12947
  "span",
12673
12948
  {
12674
12949
  style: {
@@ -12682,9 +12957,9 @@ var MemoryPanel = ({
12682
12957
  children: categoryLabels[item.category]
12683
12958
  }
12684
12959
  ),
12685
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
12960
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
12686
12961
  ] }),
12687
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12962
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12688
12963
  "div",
12689
12964
  {
12690
12965
  style: {
@@ -12696,8 +12971,8 @@ var MemoryPanel = ({
12696
12971
  }
12697
12972
  )
12698
12973
  ] }),
12699
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12700
- onDelete && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12974
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12975
+ onDelete && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12701
12976
  "button",
12702
12977
  {
12703
12978
  onClick: (e) => {
@@ -12712,10 +12987,10 @@ var MemoryPanel = ({
12712
12987
  cursor: "pointer",
12713
12988
  opacity: 0.5
12714
12989
  },
12715
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
12990
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
12716
12991
  }
12717
12992
  ),
12718
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
12993
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12719
12994
  IconSvg,
12720
12995
  {
12721
12996
  name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
@@ -12725,7 +13000,7 @@ var MemoryPanel = ({
12725
13000
  )
12726
13001
  ] })
12727
13002
  ] }),
12728
- expandedId === item.id && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
13003
+ expandedId === item.id && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12729
13004
  "div",
12730
13005
  {
12731
13006
  style: {
@@ -12733,7 +13008,7 @@ var MemoryPanel = ({
12733
13008
  paddingTop: "12px",
12734
13009
  borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
12735
13010
  },
12736
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
13011
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12737
13012
  "p",
12738
13013
  {
12739
13014
  style: {
@@ -12764,6 +13039,8 @@ var MemoryPanel = ({
12764
13039
  ChatSidebar,
12765
13040
  ChatUI,
12766
13041
  ChecklistCard,
13042
+ ChecklistMiniIndicator,
13043
+ ChecklistPanel,
12767
13044
  ContentPartRenderer,
12768
13045
  DEFAULT_PROJECT_ID,
12769
13046
  DEFAULT_PROJECT_TITLE,