@gendive/chatllm 0.17.27 → 0.17.29

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.
@@ -1684,6 +1684,8 @@ var useChatUI = (options) => {
1684
1684
  deepResearch,
1685
1685
  // Poll options
1686
1686
  enablePoll = true,
1687
+ // Checklist options
1688
+ enableChecklist = true,
1687
1689
  // Skills options
1688
1690
  skills,
1689
1691
  // Tool options
@@ -2049,9 +2051,40 @@ ${projectMemoryContext}`);
2049
2051
  - \uAC01 \uC9C8\uBB38\uC740 \uC11C\uB85C \uB2E4\uB978 \uB0B4\uC6A9
2050
2052
  - \uC635\uC158\uB9C8\uB2E4 \uC9E7\uC740 \uC124\uBA85 \uD3EC\uD568
2051
2053
  - \uC0AC\uC6A9\uC790\uAC00 \uBAA8\uB450 \uC120\uD0DD \uD6C4 \uC9C4\uD589`);
2054
+ }
2055
+ if (enableChecklist) {
2056
+ parts.push("");
2057
+ parts.push(`## \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uC790\uB3D9 \uC2E4\uD589 \uAE30\uB2A5
2058
+
2059
+ \uBCF5\uD569 \uC791\uC5C5(\uC870\uC0AC, \uBE44\uAD50 \uBD84\uC11D, \uB2E4\uB2E8\uACC4 \uC791\uC5C5)\uC744 \uC694\uCCAD\uBC1B\uC73C\uBA74 <checklist> \uD0DC\uADF8\uB85C \uC2E4\uD589 \uACC4\uD68D\uC744 \uC791\uC131\uD558\uC138\uC694.
2060
+ \uC2DC\uC2A4\uD15C\uC774 \uAC01 \uB2E8\uACC4\uB97C \uC790\uB3D9\uC73C\uB85C \uD558\uB098\uC529 \uC2E4\uD589\uD569\uB2C8\uB2E4.
2061
+
2062
+ **\uD615\uC2DD:**
2063
+ <checklist>
2064
+ <step>1\uB2E8\uACC4 \uC81C\uBAA9</step>
2065
+ <step>2\uB2E8\uACC4 \uC81C\uBAA9</step>
2066
+ <step>3\uB2E8\uACC4 \uC81C\uBAA9</step>
2067
+ </checklist>
2068
+
2069
+ **\uC608\uC2DC - "A\uC0AC\uC640 B\uC0AC \uBE44\uAD50 \uBD84\uC11D\uD574\uC918":**
2070
+ \uB124, \uBE44\uAD50 \uBD84\uC11D\uC744 \uC9C4\uD589\uD558\uACA0\uC2B5\uB2C8\uB2E4.
2071
+
2072
+ <checklist>
2073
+ <step>A\uC0AC \uC815\uBCF4 \uC870\uC0AC</step>
2074
+ <step>B\uC0AC \uC815\uBCF4 \uC870\uC0AC</step>
2075
+ <step>\uB450 \uD68C\uC0AC \uBE44\uAD50 \uBD84\uC11D\uD45C \uC791\uC131</step>
2076
+ <step>\uC885\uD569 \uACB0\uB860 \uBC0F \uCD94\uCC9C</step>
2077
+ </checklist>
2078
+
2079
+ **\uADDC\uCE59:**
2080
+ - 2~8\uB2E8\uACC4\uAC00 \uC801\uC808 (\uB108\uBB34 \uC801\uAC70\uB098 \uB9CE\uC73C\uBA74 \uC548 \uB428)
2081
+ - \uAC01 \uB2E8\uACC4\uB294 \uAD6C\uCCB4\uC801\uC774\uACE0 \uC2E4\uD589 \uAC00\uB2A5\uD55C \uC791\uC5C5
2082
+ - \uB2E8\uC21C \uC9C8\uBB38\uC774\uB098 \uD55C \uBC88\uC5D0 \uB2F5\uD560 \uC218 \uC788\uB294 \uC694\uCCAD\uC5D0\uB294 \uC0AC\uC6A9 \uAE08\uC9C0
2083
+ - <checklist> \uD0DC\uADF8 \uC55E\uC5D0 \uC9E7\uC740 \uC548\uB0B4 \uBA54\uC2DC\uC9C0\uB97C \uD3EC\uD568
2084
+ - \uAC80\uC0C9/\uC870\uC0AC, \uBE44\uAD50 \uBD84\uC11D, \uBCF4\uACE0\uC11C \uC791\uC131, \uB2E4\uB2E8\uACC4 \uC791\uC5C5\uC5D0 \uC801\uADF9 \uC0AC\uC6A9`);
2052
2085
  }
2053
2086
  return parts.length > 0 ? parts.join("\n") : "";
2054
- }, [personalization, globalMemory, useGlobalMemoryEnabled, enablePoll, buildSkillsPrompt, enableProjects, projectHook.currentProject, projectMemory]);
2087
+ }, [personalization, globalMemory, useGlobalMemoryEnabled, enablePoll, enableChecklist, buildSkillsPrompt, enableProjects, projectHook.currentProject, projectMemory]);
2055
2088
  const compressContext = useCallback5(async (messagesToCompress, model) => {
2056
2089
  const conversationText = messagesToCompress.map((m) => `${m.role === "user" ? "\uC0AC\uC6A9\uC790" : "AI"}: ${m.content}`).join("\n\n");
2057
2090
  const summaryPrompt = `\uB2E4\uC74C \uB300\uD654 \uB0B4\uC6A9\uC744 \uD575\uC2EC \uC815\uBCF4\uB9CC \uC720\uC9C0\uD558\uBA74\uC11C \uAC04\uACB0\uD558\uAC8C \uC694\uC57D\uD574\uC8FC\uC138\uC694.
@@ -4079,7 +4112,13 @@ ${result.content}
4079
4112
  /** @Todo vibecode - 체크리스트 error 항목 재시도 */
4080
4113
  handleChecklistRetry,
4081
4114
  /** @Todo vibecode - 체크리스트 pending 항목 건너뛰기 */
4082
- handleChecklistSkip
4115
+ handleChecklistSkip,
4116
+ /** @Todo vibecode - 활성 체크리스트가 포함된 메시지 (패널 자동 열기 트리거용) */
4117
+ activeChecklistMessage: messages.find(
4118
+ (m) => m.checklistBlock && !m.checklistBlock.completed
4119
+ ) || messages.find(
4120
+ (m) => m.checklistBlock?.completed
4121
+ ) || null
4083
4122
  };
4084
4123
  };
4085
4124
 
@@ -8877,6 +8916,80 @@ var ChecklistCard = ({
8877
8916
  }
8878
8917
  );
8879
8918
  };
8919
+ var ChecklistMiniIndicator = ({
8920
+ items,
8921
+ completed
8922
+ }) => {
8923
+ const doneCount = items.filter((it) => it.status === "done").length;
8924
+ const isRunning = items.some((it) => it.status === "in_progress");
8925
+ const hasError = items.some((it) => it.status === "error");
8926
+ const progressPercent = doneCount / items.length * 100;
8927
+ 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}`;
8928
+ const statusColor = completed ? "var(--chatllm-success, #22c55e)" : hasError ? "var(--chatllm-error, #ef4444)" : "var(--chatllm-primary, #3584FA)";
8929
+ const barColor = completed ? "var(--chatllm-success, #22c55e)" : "var(--chatllm-primary, #3584FA)";
8930
+ return /* @__PURE__ */ jsxs14(
8931
+ "div",
8932
+ {
8933
+ style: {
8934
+ display: "flex",
8935
+ alignItems: "center",
8936
+ gap: "10px",
8937
+ padding: "10px 14px",
8938
+ border: "1px solid var(--chatllm-border, #e5e7eb)",
8939
+ borderRadius: "10px",
8940
+ backgroundColor: "var(--chatllm-content-bg, #fff)",
8941
+ marginTop: "8px"
8942
+ },
8943
+ children: [
8944
+ /* @__PURE__ */ jsx15(
8945
+ IconSvg,
8946
+ {
8947
+ name: completed ? "checkbox-circle-line" : "list-check",
8948
+ size: 16,
8949
+ color: statusColor
8950
+ }
8951
+ ),
8952
+ /* @__PURE__ */ jsx15(
8953
+ "span",
8954
+ {
8955
+ style: {
8956
+ fontSize: "13px",
8957
+ fontWeight: 500,
8958
+ color: statusColor,
8959
+ whiteSpace: "nowrap"
8960
+ },
8961
+ children: statusText
8962
+ }
8963
+ ),
8964
+ /* @__PURE__ */ jsx15(
8965
+ "div",
8966
+ {
8967
+ style: {
8968
+ flex: 1,
8969
+ height: "3px",
8970
+ backgroundColor: "var(--chatllm-bg-secondary, #f1f5f9)",
8971
+ borderRadius: "2px",
8972
+ overflow: "hidden",
8973
+ minWidth: "60px"
8974
+ },
8975
+ children: /* @__PURE__ */ jsx15(
8976
+ "div",
8977
+ {
8978
+ style: {
8979
+ height: "100%",
8980
+ width: `${progressPercent}%`,
8981
+ backgroundColor: barColor,
8982
+ borderRadius: "2px",
8983
+ transition: "width 0.6s cubic-bezier(0.25, 1, 0.5, 1)"
8984
+ }
8985
+ }
8986
+ )
8987
+ }
8988
+ )
8989
+ ]
8990
+ }
8991
+ );
8992
+ };
8880
8993
 
8881
8994
  // src/react/components/MessageBubble.tsx
8882
8995
  import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
@@ -9234,14 +9347,10 @@ var MessageBubble = ({
9234
9347
  }
9235
9348
  ),
9236
9349
  message.checklistBlock && message.checklistBlock.items.length > 0 && /* @__PURE__ */ jsx16(
9237
- ChecklistCard,
9350
+ ChecklistMiniIndicator,
9238
9351
  {
9239
9352
  items: message.checklistBlock.items,
9240
- currentStep: message.checklistBlock.currentStep,
9241
- completed: message.checklistBlock.completed,
9242
- onAbort: onChecklistAbort,
9243
- onRetryStep: onChecklistRetry,
9244
- onSkipStep: onChecklistSkip
9353
+ completed: message.checklistBlock.completed
9245
9354
  }
9246
9355
  ),
9247
9356
  !isLoading && !displayContent && !message.pollBlock && !message.checklistBlock && !message.contentParts?.length && /* @__PURE__ */ jsx16(
@@ -11059,8 +11168,169 @@ var DisclaimerModal = ({ isOpen, onClose }) => {
11059
11168
  );
11060
11169
  };
11061
11170
 
11062
- // src/react/ChatUI.tsx
11171
+ // src/react/components/ChecklistPanel.tsx
11063
11172
  import { Fragment as Fragment8, jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
11173
+ var ChecklistPanel = ({
11174
+ message,
11175
+ isOpen,
11176
+ onClose,
11177
+ onAbort,
11178
+ onRetry,
11179
+ onSkip,
11180
+ width = 360,
11181
+ isMobileOverlay = false
11182
+ }) => {
11183
+ const block = message?.checklistBlock;
11184
+ if (isMobileOverlay) {
11185
+ return /* @__PURE__ */ jsxs20(Fragment8, { children: [
11186
+ /* @__PURE__ */ jsx21(
11187
+ "div",
11188
+ {
11189
+ onClick: onClose,
11190
+ style: {
11191
+ position: "fixed",
11192
+ inset: 0,
11193
+ backgroundColor: "rgba(0, 0, 0, 0.4)",
11194
+ zIndex: 999,
11195
+ opacity: isOpen ? 1 : 0,
11196
+ pointerEvents: isOpen ? "auto" : "none",
11197
+ transition: "opacity 0.3s ease"
11198
+ }
11199
+ }
11200
+ ),
11201
+ /* @__PURE__ */ jsx21(
11202
+ "aside",
11203
+ {
11204
+ style: {
11205
+ position: "fixed",
11206
+ top: 0,
11207
+ right: 0,
11208
+ bottom: 0,
11209
+ width: "85vw",
11210
+ maxWidth: "400px",
11211
+ backgroundColor: "var(--chatllm-bg, #F5F5F5)",
11212
+ zIndex: 1e3,
11213
+ transform: isOpen ? "translateX(0)" : "translateX(100%)",
11214
+ transition: "transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
11215
+ display: "flex",
11216
+ flexDirection: "column",
11217
+ boxShadow: isOpen ? "-4px 0 20px rgba(0, 0, 0, 0.1)" : "none"
11218
+ },
11219
+ children: renderPanelContent()
11220
+ }
11221
+ )
11222
+ ] });
11223
+ }
11224
+ return /* @__PURE__ */ jsx21(
11225
+ "aside",
11226
+ {
11227
+ style: {
11228
+ width: isOpen ? typeof width === "number" ? `${width}px` : width : "0px",
11229
+ minWidth: 0,
11230
+ overflow: "hidden",
11231
+ transition: "width 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
11232
+ borderLeft: isOpen ? "1px solid var(--chatllm-border, #e2e8f0)" : "none",
11233
+ backgroundColor: "var(--chatllm-bg, #F5F5F5)",
11234
+ display: "flex",
11235
+ flexDirection: "column",
11236
+ flexShrink: 0
11237
+ },
11238
+ children: isOpen && renderPanelContent()
11239
+ }
11240
+ );
11241
+ function renderPanelContent() {
11242
+ return /* @__PURE__ */ jsxs20(Fragment8, { children: [
11243
+ /* @__PURE__ */ jsxs20(
11244
+ "div",
11245
+ {
11246
+ style: {
11247
+ display: "flex",
11248
+ alignItems: "center",
11249
+ justifyContent: "space-between",
11250
+ padding: "16px",
11251
+ borderBottom: "1px solid var(--chatllm-border, #e2e8f0)",
11252
+ flexShrink: 0
11253
+ },
11254
+ children: [
11255
+ /* @__PURE__ */ jsxs20("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
11256
+ /* @__PURE__ */ jsx21(IconSvg, { name: "list-check", size: 18, color: "var(--chatllm-primary, #3584FA)" }),
11257
+ /* @__PURE__ */ jsx21(
11258
+ "span",
11259
+ {
11260
+ style: {
11261
+ fontSize: "14px",
11262
+ fontWeight: 600,
11263
+ color: "var(--chatllm-text, #1e293b)"
11264
+ },
11265
+ children: "\uCCB4\uD06C\uB9AC\uC2A4\uD2B8"
11266
+ }
11267
+ )
11268
+ ] }),
11269
+ /* @__PURE__ */ jsx21(
11270
+ "button",
11271
+ {
11272
+ onClick: onClose,
11273
+ "aria-label": "\uD328\uB110 \uB2EB\uAE30",
11274
+ style: {
11275
+ width: "28px",
11276
+ height: "28px",
11277
+ display: "flex",
11278
+ alignItems: "center",
11279
+ justifyContent: "center",
11280
+ borderRadius: "6px",
11281
+ border: "none",
11282
+ backgroundColor: "transparent",
11283
+ cursor: "pointer",
11284
+ color: "var(--chatllm-text-muted, #94a3b8)",
11285
+ transition: "background-color 0.15s ease"
11286
+ },
11287
+ children: /* @__PURE__ */ jsx21(IconSvg, { name: "close-line", size: 18, color: "currentColor" })
11288
+ }
11289
+ )
11290
+ ]
11291
+ }
11292
+ ),
11293
+ /* @__PURE__ */ jsx21(
11294
+ "div",
11295
+ {
11296
+ className: "chatllm-scrollbar",
11297
+ style: {
11298
+ flex: 1,
11299
+ overflowY: "auto",
11300
+ padding: "16px"
11301
+ },
11302
+ children: block && block.items.length > 0 ? /* @__PURE__ */ jsx21(
11303
+ ChecklistCard,
11304
+ {
11305
+ items: block.items,
11306
+ currentStep: block.currentStep,
11307
+ completed: block.completed,
11308
+ onAbort,
11309
+ onRetryStep: onRetry,
11310
+ onSkipStep: onSkip
11311
+ }
11312
+ ) : /* @__PURE__ */ jsx21(
11313
+ "div",
11314
+ {
11315
+ style: {
11316
+ display: "flex",
11317
+ alignItems: "center",
11318
+ justifyContent: "center",
11319
+ height: "100%",
11320
+ color: "var(--chatllm-text-muted, #94a3b8)",
11321
+ fontSize: "13px"
11322
+ },
11323
+ children: "\uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4"
11324
+ }
11325
+ )
11326
+ }
11327
+ )
11328
+ ] });
11329
+ }
11330
+ };
11331
+
11332
+ // src/react/ChatUI.tsx
11333
+ import { Fragment as Fragment9, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
11064
11334
  var DEFAULT_ACTIONS = [];
11065
11335
  var DEFAULT_TEMPLATES = [];
11066
11336
  var DEFAULT_MODELS = [
@@ -11399,9 +11669,33 @@ var ChatUIView = ({
11399
11669
  // Checklist
11400
11670
  handleChecklistAbort,
11401
11671
  handleChecklistRetry,
11402
- handleChecklistSkip
11672
+ handleChecklistSkip,
11673
+ activeChecklistMessage
11403
11674
  } = state;
11404
11675
  const [disclaimerOpen, setDisclaimerOpen] = React16.useState(false);
11676
+ const [isMobile, setIsMobile] = React16.useState(false);
11677
+ React16.useEffect(() => {
11678
+ if (typeof window === "undefined") return;
11679
+ const check = () => setIsMobile(window.innerWidth < 768);
11680
+ check();
11681
+ window.addEventListener("resize", check);
11682
+ return () => window.removeEventListener("resize", check);
11683
+ }, []);
11684
+ const [checklistPanelDismissed, setChecklistPanelDismissed] = React16.useState(false);
11685
+ const isChecklistPanelOpen = !!activeChecklistMessage && !checklistPanelDismissed;
11686
+ const prevChecklistIdRef = React16.useRef(void 0);
11687
+ React16.useEffect(() => {
11688
+ const currentId = activeChecklistMessage?.checklistBlock?.id;
11689
+ if (currentId && currentId !== prevChecklistIdRef.current && !activeChecklistMessage?.checklistBlock?.completed) {
11690
+ setChecklistPanelDismissed(false);
11691
+ }
11692
+ prevChecklistIdRef.current = currentId;
11693
+ }, [activeChecklistMessage?.checklistBlock?.id, activeChecklistMessage?.checklistBlock?.completed]);
11694
+ React16.useEffect(() => {
11695
+ if (!activeChecklistMessage?.checklistBlock?.completed) return;
11696
+ const timer = setTimeout(() => setChecklistPanelDismissed(true), 2e3);
11697
+ return () => clearTimeout(timer);
11698
+ }, [activeChecklistMessage?.checklistBlock?.completed]);
11405
11699
  const [welcomeExiting, setWelcomeExiting] = React16.useState(false);
11406
11700
  const prevMessageCountRef = React16.useRef(messages.length);
11407
11701
  React16.useEffect(() => {
@@ -11457,7 +11751,7 @@ var ChatUIView = ({
11457
11751
  return items;
11458
11752
  }, [projectMemory?.state.entries]);
11459
11753
  const themeClass = theme?.mode === "dark" ? "chatllm-dark" : "";
11460
- return /* @__PURE__ */ jsxs20(
11754
+ return /* @__PURE__ */ jsxs21(
11461
11755
  "div",
11462
11756
  {
11463
11757
  className: `chatllm-root ${themeClass} ${className}`,
@@ -11470,7 +11764,7 @@ var ChatUIView = ({
11470
11764
  position: "relative"
11471
11765
  },
11472
11766
  children: [
11473
- showSidebar && /* @__PURE__ */ jsx21(
11767
+ showSidebar && /* @__PURE__ */ jsx22(
11474
11768
  ChatSidebar,
11475
11769
  {
11476
11770
  sessions,
@@ -11502,7 +11796,7 @@ var ChatUIView = ({
11502
11796
  isLoading: isSessionsLoading
11503
11797
  }
11504
11798
  ),
11505
- /* @__PURE__ */ jsxs20(
11799
+ /* @__PURE__ */ jsxs21(
11506
11800
  "main",
11507
11801
  {
11508
11802
  style: {
@@ -11514,7 +11808,7 @@ var ChatUIView = ({
11514
11808
  minWidth: 0
11515
11809
  },
11516
11810
  children: [
11517
- /* @__PURE__ */ jsx21(
11811
+ /* @__PURE__ */ jsx22(
11518
11812
  ChatHeader,
11519
11813
  {
11520
11814
  title: currentSession?.title || "\uC0C8 \uB300\uD654",
@@ -11528,7 +11822,7 @@ var ChatUIView = ({
11528
11822
  showSettings
11529
11823
  }
11530
11824
  ),
11531
- (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ jsxs20(
11825
+ (messages.length === 0 || welcomeExiting) && /* @__PURE__ */ jsxs21(
11532
11826
  "div",
11533
11827
  {
11534
11828
  style: {
@@ -11543,7 +11837,7 @@ var ChatUIView = ({
11543
11837
  pointerEvents: welcomeExiting ? "none" : "auto"
11544
11838
  },
11545
11839
  children: [
11546
- /* @__PURE__ */ jsx21(
11840
+ /* @__PURE__ */ jsx22(
11547
11841
  "h1",
11548
11842
  {
11549
11843
  style: {
@@ -11557,7 +11851,7 @@ var ChatUIView = ({
11557
11851
  children: greeting ? `${greeting} \u273A` : "\u273A \uBB34\uC5C7\uC744 \uC0DD\uAC01\uD574 \uBCFC\uAE4C\uC694?"
11558
11852
  }
11559
11853
  ),
11560
- /* @__PURE__ */ jsx21("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ jsx21(
11854
+ /* @__PURE__ */ jsx22("div", { style: { width: "100%", maxWidth: "680px" }, children: /* @__PURE__ */ jsx22(
11561
11855
  ChatInput,
11562
11856
  {
11563
11857
  value: input,
@@ -11585,7 +11879,7 @@ var ChatUIView = ({
11585
11879
  inline: true
11586
11880
  }
11587
11881
  ) }),
11588
- suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx21(
11882
+ suggestedPrompts && suggestedPrompts.length > 0 && /* @__PURE__ */ jsx22(
11589
11883
  "div",
11590
11884
  {
11591
11885
  style: {
@@ -11595,7 +11889,7 @@ var ChatUIView = ({
11595
11889
  justifyContent: "center",
11596
11890
  maxWidth: "680px"
11597
11891
  },
11598
- children: suggestedPrompts.map((sp) => /* @__PURE__ */ jsxs20(
11892
+ children: suggestedPrompts.map((sp) => /* @__PURE__ */ jsxs21(
11599
11893
  "button",
11600
11894
  {
11601
11895
  onClick: () => setInput(sp.prompt),
@@ -11614,7 +11908,7 @@ var ChatUIView = ({
11614
11908
  transition: "all 0.2s"
11615
11909
  },
11616
11910
  children: [
11617
- sp.icon && /* @__PURE__ */ jsx21(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
11911
+ sp.icon && /* @__PURE__ */ jsx22(IconSvg, { name: sp.icon, size: 16, color: "var(--chatllm-text-muted)" }),
11618
11912
  sp.label
11619
11913
  ]
11620
11914
  },
@@ -11625,8 +11919,8 @@ var ChatUIView = ({
11625
11919
  ]
11626
11920
  }
11627
11921
  ),
11628
- messages.length > 0 && /* @__PURE__ */ jsxs20(Fragment8, { children: [
11629
- /* @__PURE__ */ jsx21(
11922
+ messages.length > 0 && /* @__PURE__ */ jsxs21(Fragment9, { children: [
11923
+ /* @__PURE__ */ jsx22(
11630
11924
  MessageList,
11631
11925
  {
11632
11926
  messages,
@@ -11651,7 +11945,7 @@ var ChatUIView = ({
11651
11945
  onChecklistSkip: handleChecklistSkip
11652
11946
  }
11653
11947
  ),
11654
- /* @__PURE__ */ jsx21(
11948
+ /* @__PURE__ */ jsx22(
11655
11949
  ChatInput,
11656
11950
  {
11657
11951
  value: input,
@@ -11682,7 +11976,19 @@ var ChatUIView = ({
11682
11976
  ]
11683
11977
  }
11684
11978
  ),
11685
- showSettings && /* @__PURE__ */ jsx21(
11979
+ /* @__PURE__ */ jsx22(
11980
+ ChecklistPanel,
11981
+ {
11982
+ message: activeChecklistMessage,
11983
+ isOpen: isChecklistPanelOpen,
11984
+ onClose: () => setChecklistPanelDismissed(true),
11985
+ onAbort: handleChecklistAbort,
11986
+ onRetry: activeChecklistMessage ? (stepIndex) => handleChecklistRetry(activeChecklistMessage.id, stepIndex) : void 0,
11987
+ onSkip: activeChecklistMessage ? (stepIndex) => handleChecklistSkip(activeChecklistMessage.id, stepIndex) : void 0,
11988
+ isMobileOverlay: isMobile
11989
+ }
11990
+ ),
11991
+ showSettings && /* @__PURE__ */ jsx22(
11686
11992
  SettingsModal,
11687
11993
  {
11688
11994
  isOpen: settingsOpen,
@@ -11709,7 +12015,7 @@ var ChatUIView = ({
11709
12015
  currentProjectTitle: currentProject?.title
11710
12016
  }
11711
12017
  ),
11712
- /* @__PURE__ */ jsx21(
12018
+ /* @__PURE__ */ jsx22(
11713
12019
  ProjectSettingsModal,
11714
12020
  {
11715
12021
  isOpen: projectSettingsOpen,
@@ -11721,7 +12027,7 @@ var ChatUIView = ({
11721
12027
  onDeleteProject: deleteProject
11722
12028
  }
11723
12029
  ),
11724
- /* @__PURE__ */ jsx21(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
12030
+ /* @__PURE__ */ jsx22(DisclaimerModal, { isOpen: disclaimerOpen, onClose: () => setDisclaimerOpen(false) })
11725
12031
  ]
11726
12032
  }
11727
12033
  );
@@ -11824,7 +12130,7 @@ var ChatUIWithHook = ({
11824
12130
  onDeleteProjectFile
11825
12131
  };
11826
12132
  const state = useChatUI(hookOptions);
11827
- return /* @__PURE__ */ jsx21(
12133
+ return /* @__PURE__ */ jsx22(
11828
12134
  ChatUIView,
11829
12135
  {
11830
12136
  state,
@@ -11872,7 +12178,7 @@ var ChatUI = (props) => {
11872
12178
  deepResearch,
11873
12179
  suggestedPrompts: chatStateSuggestedPrompts
11874
12180
  } = props;
11875
- return /* @__PURE__ */ jsx21(
12181
+ return /* @__PURE__ */ jsx22(
11876
12182
  ChatUIView,
11877
12183
  {
11878
12184
  state: props.chatState,
@@ -11897,7 +12203,7 @@ var ChatUI = (props) => {
11897
12203
  }
11898
12204
  );
11899
12205
  }
11900
- return /* @__PURE__ */ jsx21(ChatUIWithHook, { ...props });
12206
+ return /* @__PURE__ */ jsx22(ChatUIWithHook, { ...props });
11901
12207
  };
11902
12208
 
11903
12209
  // src/react/hooks/useDeepResearch.ts
@@ -12215,7 +12521,7 @@ var useDeepResearch = (options) => {
12215
12521
  };
12216
12522
 
12217
12523
  // src/react/components/EmptyState.tsx
12218
- import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
12524
+ import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
12219
12525
  var EmptyState = ({
12220
12526
  greeting,
12221
12527
  templates = [],
@@ -12233,7 +12539,7 @@ var EmptyState = ({
12233
12539
  return iconMap[icon] || "sparkling-line";
12234
12540
  };
12235
12541
  const hasContent = actions.length > 0 || templates.length > 0;
12236
- return /* @__PURE__ */ jsxs21(
12542
+ return /* @__PURE__ */ jsxs22(
12237
12543
  "div",
12238
12544
  {
12239
12545
  className: "chatllm-empty-state",
@@ -12248,7 +12554,7 @@ var EmptyState = ({
12248
12554
  textAlign: "center"
12249
12555
  },
12250
12556
  children: [
12251
- /* @__PURE__ */ jsx22(
12557
+ /* @__PURE__ */ jsx23(
12252
12558
  "div",
12253
12559
  {
12254
12560
  className: "chatllm-sheet",
@@ -12262,10 +12568,10 @@ var EmptyState = ({
12262
12568
  marginBottom: "32px",
12263
12569
  color: "var(--chatllm-primary)"
12264
12570
  },
12265
- children: /* @__PURE__ */ jsx22(IconSvg, { name: "chat-1-line", size: 40 })
12571
+ children: /* @__PURE__ */ jsx23(IconSvg, { name: "chat-1-line", size: 40 })
12266
12572
  }
12267
12573
  ),
12268
- /* @__PURE__ */ jsx22(
12574
+ /* @__PURE__ */ jsx23(
12269
12575
  "h1",
12270
12576
  {
12271
12577
  style: {
@@ -12278,7 +12584,7 @@ var EmptyState = ({
12278
12584
  children: "How can I help you today?"
12279
12585
  }
12280
12586
  ),
12281
- (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ jsxs21(
12587
+ (actions.length > 0 || templates.length > 0) && /* @__PURE__ */ jsxs22(
12282
12588
  "div",
12283
12589
  {
12284
12590
  style: {
@@ -12290,7 +12596,7 @@ var EmptyState = ({
12290
12596
  marginBottom: "48px"
12291
12597
  },
12292
12598
  children: [
12293
- actions.map((action) => /* @__PURE__ */ jsxs21(
12599
+ actions.map((action) => /* @__PURE__ */ jsxs22(
12294
12600
  "button",
12295
12601
  {
12296
12602
  onClick: () => onActionSelect?.(action),
@@ -12304,7 +12610,7 @@ var EmptyState = ({
12304
12610
  fontWeight: 500
12305
12611
  },
12306
12612
  children: [
12307
- /* @__PURE__ */ jsx22(
12613
+ /* @__PURE__ */ jsx23(
12308
12614
  IconSvg,
12309
12615
  {
12310
12616
  name: getActionIcon(action.icon),
@@ -12317,7 +12623,7 @@ var EmptyState = ({
12317
12623
  },
12318
12624
  action.id
12319
12625
  )),
12320
- templates.slice(0, 4).map((template) => /* @__PURE__ */ jsxs21(
12626
+ templates.slice(0, 4).map((template) => /* @__PURE__ */ jsxs22(
12321
12627
  "button",
12322
12628
  {
12323
12629
  onClick: () => onTemplateClick(template),
@@ -12331,7 +12637,7 @@ var EmptyState = ({
12331
12637
  fontWeight: 500
12332
12638
  },
12333
12639
  children: [
12334
- /* @__PURE__ */ jsx22(
12640
+ /* @__PURE__ */ jsx23(
12335
12641
  IconSvg,
12336
12642
  {
12337
12643
  name: "sparkling-line",
@@ -12354,7 +12660,7 @@ var EmptyState = ({
12354
12660
 
12355
12661
  // src/react/components/MemoryPanel.tsx
12356
12662
  import { useState as useState20 } from "react";
12357
- import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
12663
+ import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
12358
12664
  var categoryLabels = {
12359
12665
  fact: "\uC0AC\uC6A9\uC790 \uC815\uBCF4",
12360
12666
  skill: "\uC804\uBB38 \uBD84\uC57C/\uAE30\uC220",
@@ -12386,7 +12692,7 @@ var MemoryPanel = ({
12386
12692
  });
12387
12693
  };
12388
12694
  if (!isOpen) {
12389
- return /* @__PURE__ */ jsx23(
12695
+ return /* @__PURE__ */ jsx24(
12390
12696
  "button",
12391
12697
  {
12392
12698
  onClick: onToggle,
@@ -12406,11 +12712,11 @@ var MemoryPanel = ({
12406
12712
  justifyContent: "center",
12407
12713
  zIndex: 100
12408
12714
  },
12409
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
12715
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "robot-line", size: 24, color: "#ffffff" })
12410
12716
  }
12411
12717
  );
12412
12718
  }
12413
- return /* @__PURE__ */ jsxs22(
12719
+ return /* @__PURE__ */ jsxs23(
12414
12720
  "div",
12415
12721
  {
12416
12722
  className: "chatllm-memory-panel",
@@ -12430,7 +12736,7 @@ var MemoryPanel = ({
12430
12736
  zIndex: 100
12431
12737
  },
12432
12738
  children: [
12433
- /* @__PURE__ */ jsxs22(
12739
+ /* @__PURE__ */ jsxs23(
12434
12740
  "div",
12435
12741
  {
12436
12742
  style: {
@@ -12441,8 +12747,8 @@ var MemoryPanel = ({
12441
12747
  borderBottom: "1px solid var(--chatllm-border, #e5e7eb)"
12442
12748
  },
12443
12749
  children: [
12444
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
12445
- /* @__PURE__ */ jsx23(
12750
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "center", gap: "10px" }, children: [
12751
+ /* @__PURE__ */ jsx24(
12446
12752
  "div",
12447
12753
  {
12448
12754
  style: {
@@ -12454,19 +12760,19 @@ var MemoryPanel = ({
12454
12760
  alignItems: "center",
12455
12761
  justifyContent: "center"
12456
12762
  },
12457
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
12763
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "robot-line", size: 18, color: "var(--chatllm-primary, #3584FA)" })
12458
12764
  }
12459
12765
  ),
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: [
12766
+ /* @__PURE__ */ jsxs23("div", { children: [
12767
+ /* @__PURE__ */ jsx24("div", { style: { fontSize: "15px", fontWeight: 600, color: "var(--chatllm-text, #1f2937)" }, children: "AI \uBA54\uBAA8\uB9AC" }),
12768
+ /* @__PURE__ */ jsxs23("div", { style: { fontSize: "12px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: [
12463
12769
  items.length,
12464
12770
  "\uAC1C \uD56D\uBAA9"
12465
12771
  ] })
12466
12772
  ] })
12467
12773
  ] }),
12468
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", gap: "4px" }, children: [
12469
- onClearAll && items.length > 0 && /* @__PURE__ */ jsx23(
12774
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", gap: "4px" }, children: [
12775
+ onClearAll && items.length > 0 && /* @__PURE__ */ jsx24(
12470
12776
  "button",
12471
12777
  {
12472
12778
  onClick: onClearAll,
@@ -12478,10 +12784,10 @@ var MemoryPanel = ({
12478
12784
  cursor: "pointer"
12479
12785
  },
12480
12786
  title: "\uC804\uCCB4 \uC0AD\uC81C",
12481
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12787
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "delete-bin-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12482
12788
  }
12483
12789
  ),
12484
- /* @__PURE__ */ jsx23(
12790
+ /* @__PURE__ */ jsx24(
12485
12791
  "button",
12486
12792
  {
12487
12793
  onClick: onToggle,
@@ -12492,14 +12798,14 @@ var MemoryPanel = ({
12492
12798
  borderRadius: "8px",
12493
12799
  cursor: "pointer"
12494
12800
  },
12495
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12801
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "close-line", size: 18, color: "var(--chatllm-text-muted, #9ca3af)" })
12496
12802
  }
12497
12803
  )
12498
12804
  ] })
12499
12805
  ]
12500
12806
  }
12501
12807
  ),
12502
- /* @__PURE__ */ jsx23(
12808
+ /* @__PURE__ */ jsx24(
12503
12809
  "div",
12504
12810
  {
12505
12811
  style: {
@@ -12509,7 +12815,7 @@ var MemoryPanel = ({
12509
12815
  borderBottom: "1px solid var(--chatllm-border-light, #f3f4f6)",
12510
12816
  overflowX: "auto"
12511
12817
  },
12512
- children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx23(
12818
+ children: ["all", "fact", "skill", "preference"].map((tab) => /* @__PURE__ */ jsx24(
12513
12819
  "button",
12514
12820
  {
12515
12821
  onClick: () => setActiveTab(tab),
@@ -12530,8 +12836,8 @@ var MemoryPanel = ({
12530
12836
  ))
12531
12837
  }
12532
12838
  ),
12533
- /* @__PURE__ */ jsxs22("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
12534
- contextSummary && activeTab === "all" && /* @__PURE__ */ jsxs22(
12839
+ /* @__PURE__ */ jsxs23("div", { style: { flex: 1, overflow: "auto", padding: "12px" }, children: [
12840
+ contextSummary && activeTab === "all" && /* @__PURE__ */ jsxs23(
12535
12841
  "div",
12536
12842
  {
12537
12843
  style: {
@@ -12542,7 +12848,7 @@ var MemoryPanel = ({
12542
12848
  borderLeft: "3px solid var(--chatllm-primary, #3584FA)"
12543
12849
  },
12544
12850
  children: [
12545
- /* @__PURE__ */ jsxs22(
12851
+ /* @__PURE__ */ jsxs23(
12546
12852
  "div",
12547
12853
  {
12548
12854
  style: {
@@ -12552,12 +12858,12 @@ var MemoryPanel = ({
12552
12858
  marginBottom: "8px"
12553
12859
  },
12554
12860
  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" })
12861
+ /* @__PURE__ */ jsx24(IconSvg, { name: "file-text-line", size: 14, color: "var(--chatllm-primary, #3584FA)" }),
12862
+ /* @__PURE__ */ jsx24("span", { style: { fontSize: "12px", fontWeight: 500, color: "var(--chatllm-primary, #3584FA)" }, children: "\uB300\uD654 \uC694\uC57D" })
12557
12863
  ]
12558
12864
  }
12559
12865
  ),
12560
- /* @__PURE__ */ jsx23(
12866
+ /* @__PURE__ */ jsx24(
12561
12867
  "p",
12562
12868
  {
12563
12869
  style: {
@@ -12572,7 +12878,7 @@ var MemoryPanel = ({
12572
12878
  ]
12573
12879
  }
12574
12880
  ),
12575
- filteredItems.length === 0 ? /* @__PURE__ */ jsxs22(
12881
+ filteredItems.length === 0 ? /* @__PURE__ */ jsxs23(
12576
12882
  "div",
12577
12883
  {
12578
12884
  style: {
@@ -12581,11 +12887,11 @@ var MemoryPanel = ({
12581
12887
  color: "var(--chatllm-text-muted, #9ca3af)"
12582
12888
  },
12583
12889
  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" })
12890
+ /* @__PURE__ */ jsx24(IconSvg, { name: "robot-line", size: 32, color: "var(--chatllm-text-muted, #d1d5db)" }),
12891
+ /* @__PURE__ */ jsx24("p", { style: { fontSize: "14px", marginTop: "12px" }, children: "\uC800\uC7A5\uB41C \uBA54\uBAA8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" })
12586
12892
  ]
12587
12893
  }
12588
- ) : /* @__PURE__ */ jsx23("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ jsxs22(
12894
+ ) : /* @__PURE__ */ jsx24("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: filteredItems.map((item) => /* @__PURE__ */ jsxs23(
12589
12895
  "div",
12590
12896
  {
12591
12897
  style: {
@@ -12598,10 +12904,10 @@ var MemoryPanel = ({
12598
12904
  },
12599
12905
  onClick: () => setExpandedId(expandedId === item.id ? null : item.id),
12600
12906
  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(
12907
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }, children: [
12908
+ /* @__PURE__ */ jsxs23("div", { style: { flex: 1, minWidth: 0 }, children: [
12909
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "4px" }, children: [
12910
+ item.category && /* @__PURE__ */ jsx24(
12605
12911
  "span",
12606
12912
  {
12607
12913
  style: {
@@ -12615,9 +12921,9 @@ var MemoryPanel = ({
12615
12921
  children: categoryLabels[item.category]
12616
12922
  }
12617
12923
  ),
12618
- /* @__PURE__ */ jsx23("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
12924
+ /* @__PURE__ */ jsx24("span", { style: { fontSize: "11px", color: "var(--chatllm-text-muted, #9ca3af)" }, children: formatDate(item.timestamp) })
12619
12925
  ] }),
12620
- /* @__PURE__ */ jsx23(
12926
+ /* @__PURE__ */ jsx24(
12621
12927
  "div",
12622
12928
  {
12623
12929
  style: {
@@ -12629,8 +12935,8 @@ var MemoryPanel = ({
12629
12935
  }
12630
12936
  )
12631
12937
  ] }),
12632
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12633
- onDelete && /* @__PURE__ */ jsx23(
12938
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
12939
+ onDelete && /* @__PURE__ */ jsx24(
12634
12940
  "button",
12635
12941
  {
12636
12942
  onClick: (e) => {
@@ -12645,10 +12951,10 @@ var MemoryPanel = ({
12645
12951
  cursor: "pointer",
12646
12952
  opacity: 0.5
12647
12953
  },
12648
- children: /* @__PURE__ */ jsx23(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
12954
+ children: /* @__PURE__ */ jsx24(IconSvg, { name: "delete-bin-line", size: 14, color: "var(--chatllm-text-muted, #9ca3af)" })
12649
12955
  }
12650
12956
  ),
12651
- /* @__PURE__ */ jsx23(
12957
+ /* @__PURE__ */ jsx24(
12652
12958
  IconSvg,
12653
12959
  {
12654
12960
  name: expandedId === item.id ? "arrow-up-s-line" : "arrow-down-s-line",
@@ -12658,7 +12964,7 @@ var MemoryPanel = ({
12658
12964
  )
12659
12965
  ] })
12660
12966
  ] }),
12661
- expandedId === item.id && /* @__PURE__ */ jsx23(
12967
+ expandedId === item.id && /* @__PURE__ */ jsx24(
12662
12968
  "div",
12663
12969
  {
12664
12970
  style: {
@@ -12666,7 +12972,7 @@ var MemoryPanel = ({
12666
12972
  paddingTop: "12px",
12667
12973
  borderTop: "1px solid var(--chatllm-border-light, #f3f4f6)"
12668
12974
  },
12669
- children: /* @__PURE__ */ jsx23(
12975
+ children: /* @__PURE__ */ jsx24(
12670
12976
  "p",
12671
12977
  {
12672
12978
  style: {
@@ -12696,6 +13002,8 @@ export {
12696
13002
  ChatSidebar,
12697
13003
  ChatUI,
12698
13004
  ChecklistCard,
13005
+ ChecklistMiniIndicator,
13006
+ ChecklistPanel,
12699
13007
  ContentPartRenderer,
12700
13008
  DEFAULT_PROJECT_ID,
12701
13009
  DEFAULT_PROJECT_TITLE,