@blade-hq/agent-kit 0.5.33 → 0.5.35

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.
@@ -5,12 +5,12 @@ import {
5
5
  import {
6
6
  getSessionFilePath,
7
7
  resolveSessionFilePreviewTarget
8
- } from "./chunk-PMG4N3JO.js";
8
+ } from "./chunk-LVWRKH45.js";
9
9
  import {
10
10
  formatToolName,
11
11
  getAuthedUrl,
12
12
  useUiStore
13
- } from "./chunk-EBTZAB6X.js";
13
+ } from "./chunk-II2PTBJI.js";
14
14
  import {
15
15
  cn,
16
16
  copyToClipboard
@@ -1933,4 +1933,4 @@ export {
1933
1933
  PlanSummaryCard,
1934
1934
  extractLatestPlanMessages
1935
1935
  };
1936
- //# sourceMappingURL=chunk-MGXPILAM.js.map
1936
+ //# sourceMappingURL=chunk-IRHXGYY3.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useSessionStore
3
- } from "./chunk-EBTZAB6X.js";
3
+ } from "./chunk-II2PTBJI.js";
4
4
 
5
5
  // src/react/hooks/use-session.ts
6
6
  function useSession() {
@@ -27,4 +27,4 @@ function useSession() {
27
27
  export {
28
28
  useSession
29
29
  };
30
- //# sourceMappingURL=chunk-UR6C4AJB.js.map
30
+ //# sourceMappingURL=chunk-KSYNFNF4.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  apiFetchResponse,
3
3
  getAuthedUrl
4
- } from "./chunk-EBTZAB6X.js";
4
+ } from "./chunk-II2PTBJI.js";
5
5
 
6
6
  // src/react/lib/session-file-preview.ts
7
7
  var IMAGE_EXTS = /* @__PURE__ */ new Set(["png", "jpg", "jpeg", "gif", "svg", "webp", "ico", "bmp"]);
@@ -117,4 +117,4 @@ export {
117
117
  resolveTextPreviewType,
118
118
  resolveSessionFilePreviewTarget
119
119
  };
120
- //# sourceMappingURL=chunk-PMG4N3JO.js.map
120
+ //# sourceMappingURL=chunk-LVWRKH45.js.map
@@ -8,7 +8,7 @@ import {
8
8
  getCodeLanguageFromFilename,
9
9
  parseAskUserQuestion,
10
10
  useHighlightedCodeHtml
11
- } from "./chunk-MGXPILAM.js";
11
+ } from "./chunk-IRHXGYY3.js";
12
12
  import {
13
13
  Collapsible,
14
14
  CollapsibleContent,
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-H62LH2AG.js";
17
17
  import {
18
18
  resolveSessionFilePreviewTarget
19
- } from "./chunk-PMG4N3JO.js";
19
+ } from "./chunk-LVWRKH45.js";
20
20
  import {
21
21
  apiFetchResponse,
22
22
  buildMessageContent,
@@ -60,7 +60,7 @@ import {
60
60
  useUiBridgeStore,
61
61
  useUiStore,
62
62
  writeFile
63
- } from "./chunk-EBTZAB6X.js";
63
+ } from "./chunk-II2PTBJI.js";
64
64
  import {
65
65
  registerBridgeIframe,
66
66
  tapBridgeEvent
@@ -81,7 +81,7 @@ import {
81
81
  // src/react/components/chat/ChatView.tsx
82
82
  import { CircleAlert as CircleAlert2 } from "lucide-react";
83
83
  import { Eye } from "lucide-react";
84
- import { useCallback as useCallback13, useMemo as useMemo18 } from "react";
84
+ import { useCallback as useCallback13, useMemo as useMemo19 } from "react";
85
85
 
86
86
  // src/react/hooks/use-chat.ts
87
87
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -210,7 +210,7 @@ import { useQueryClient as useQueryClient2 } from "@tanstack/react-query";
210
210
  import {
211
211
  useEffect as useEffect7,
212
212
  useEffectEvent as useEffectEvent2,
213
- useMemo as useMemo7,
213
+ useMemo as useMemo8,
214
214
  useRef as useRef5,
215
215
  useState as useState8
216
216
  } from "react";
@@ -1328,8 +1328,8 @@ var SkillCompletionMenu = forwardRef2(
1328
1328
  );
1329
1329
 
1330
1330
  // src/react/components/chat/BackgroundTasksPill.tsx
1331
- import { FileText, Square, Terminal } from "lucide-react";
1332
- import { useState as useState7 } from "react";
1331
+ import { Check, FileText, Square, Terminal } from "lucide-react";
1332
+ import { useMemo as useMemo5, useState as useState7 } from "react";
1333
1333
 
1334
1334
  // src/react/hooks/use-background-tasks.ts
1335
1335
  import { useQuery as useQuery2 } from "@tanstack/react-query";
@@ -1355,6 +1355,8 @@ function useBackgroundTasks(sessionId) {
1355
1355
 
1356
1356
  // src/react/components/chat/BackgroundTasksPill.tsx
1357
1357
  import { Fragment, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1358
+ var FAILED_STATES = /* @__PURE__ */ new Set(["failed", "timeout", "lost"]);
1359
+ var EMPTY_IDS = [];
1358
1360
  function formatStartedAt(value) {
1359
1361
  if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
1360
1362
  return "\u542F\u52A8\u65F6\u95F4\u672A\u77E5";
@@ -1378,10 +1380,16 @@ function statusClass(status) {
1378
1380
  }
1379
1381
  function BackgroundTasksPill({ sessionId }) {
1380
1382
  const { data: tasks } = useBackgroundTasks(sessionId);
1383
+ const dismissed = useBackgroundStore((s) => s.dismissedTaskIds[sessionId] ?? EMPTY_IDS);
1384
+ const dismissTask = useBackgroundStore((s) => s.dismissTask);
1381
1385
  const [open, setOpen] = useState7(false);
1382
1386
  const [logTask, setLogTask] = useState7(null);
1383
- if (tasks.length === 0) return null;
1384
- const runningCount = tasks.filter((task) => task.status === "running").length;
1387
+ const visibleTasks = useMemo5(
1388
+ () => tasks.filter((task) => !dismissed.includes(task.id)),
1389
+ [tasks, dismissed]
1390
+ );
1391
+ if (visibleTasks.length === 0) return null;
1392
+ const runningCount = visibleTasks.filter((task) => task.status === "running").length;
1385
1393
  const openTaskLog = async (task) => {
1386
1394
  const title = `${task.id} ${task.description || task.command || "\u540E\u53F0\u4EFB\u52A1"}`;
1387
1395
  setLogTask({ id: task.id, title, output: "", loading: true, error: null });
@@ -1445,7 +1453,7 @@ function BackgroundTasksPill({ sessionId }) {
1445
1453
  children: [
1446
1454
  /* @__PURE__ */ jsx5(Terminal, { size: 13 }),
1447
1455
  "\u540E\u53F0\u4EFB\u52A1 ",
1448
- tasks.length,
1456
+ visibleTasks.length,
1449
1457
  runningCount > 0 ? /* @__PURE__ */ jsxs4("span", { children: [
1450
1458
  "\u8FD0\u884C\u4E2D ",
1451
1459
  runningCount
@@ -1453,7 +1461,7 @@ function BackgroundTasksPill({ sessionId }) {
1453
1461
  ]
1454
1462
  }
1455
1463
  ),
1456
- open ? /* @__PURE__ */ jsx5("div", { className: "absolute bottom-full left-0 z-40 mb-2 w-[min(24rem,calc(100vw-2rem))] rounded-xl border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-2 text-xs text-[hsl(var(--popover-foreground))] shadow-xl", children: /* @__PURE__ */ jsx5("div", { className: "max-h-72 space-y-2 overflow-y-auto", children: tasks.map((task) => /* @__PURE__ */ jsxs4("div", { className: "rounded-lg border border-[hsl(var(--border))] p-2", children: [
1464
+ open ? /* @__PURE__ */ jsx5("div", { className: "absolute bottom-full left-0 z-40 mb-2 w-[min(24rem,calc(100vw-2rem))] rounded-xl border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-2 text-xs text-[hsl(var(--popover-foreground))] shadow-xl", children: /* @__PURE__ */ jsx5("div", { className: "max-h-72 space-y-2 overflow-y-auto", children: visibleTasks.map((task) => /* @__PURE__ */ jsxs4("div", { className: "rounded-lg border border-[hsl(var(--border))] p-2", children: [
1457
1465
  /* @__PURE__ */ jsx5("div", { className: "flex items-start justify-between gap-2", children: /* @__PURE__ */ jsxs4("div", { className: "min-w-0", children: [
1458
1466
  /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2", children: [
1459
1467
  /* @__PURE__ */ jsx5("span", { className: "font-mono font-semibold", children: task.id }),
@@ -1486,6 +1494,17 @@ function BackgroundTasksPill({ sessionId }) {
1486
1494
  "\u505C\u6B62"
1487
1495
  ]
1488
1496
  }
1497
+ ) : FAILED_STATES.has(task.status) ? /* @__PURE__ */ jsxs4(
1498
+ "button",
1499
+ {
1500
+ type: "button",
1501
+ onClick: () => dismissTask(sessionId, task.id),
1502
+ className: "inline-flex h-6 items-center gap-1 rounded-md border border-[hsl(var(--border))] px-2 text-[11px] hover:bg-[hsl(var(--accent))]",
1503
+ children: [
1504
+ /* @__PURE__ */ jsx5(Check, { size: 11 }),
1505
+ "\u786E\u8BA4"
1506
+ ]
1507
+ }
1489
1508
  ) : null
1490
1509
  ] })
1491
1510
  ] }, task.id)) }) }) : null
@@ -1591,7 +1610,7 @@ function FileSizeLimitDialog({
1591
1610
  // src/react/components/chat/SkillStatusBar.tsx
1592
1611
  import { useQuery as useQuery5 } from "@tanstack/react-query";
1593
1612
  import { RefreshCw } from "lucide-react";
1594
- import { useMemo as useMemo6 } from "react";
1613
+ import { useMemo as useMemo7 } from "react";
1595
1614
 
1596
1615
  // src/react/hooks/use-context-stats.ts
1597
1616
  import { useQuery as useQuery3 } from "@tanstack/react-query";
@@ -1640,7 +1659,7 @@ function useSkillStats(sessionId) {
1640
1659
  }
1641
1660
 
1642
1661
  // src/react/hooks/use-token-pressure.ts
1643
- import { useMemo as useMemo5 } from "react";
1662
+ import { useMemo as useMemo6 } from "react";
1644
1663
  function clampRatio(value) {
1645
1664
  return Math.min(1, Math.max(0, value));
1646
1665
  }
@@ -1658,7 +1677,7 @@ function resolveLevel(ratio, compactionRatio) {
1658
1677
  }
1659
1678
  function useTokenPressure(sessionId) {
1660
1679
  const { data } = useContextStats(sessionId);
1661
- return useMemo5(() => {
1680
+ return useMemo6(() => {
1662
1681
  const ratio = data.context_window > 0 ? clampRatio(data.tokens_used / data.context_window) : 0;
1663
1682
  return {
1664
1683
  ratio,
@@ -1811,7 +1830,7 @@ function SkillStatusBar({
1811
1830
  const hasEverConnected = useConnectionStore((state) => state.hasEverConnected);
1812
1831
  const statsReady = !loading && !error;
1813
1832
  const skillStoreConnected = statsReady && skillStats.remote_connected;
1814
- const connectionMeta = useMemo6(
1833
+ const connectionMeta = useMemo7(
1815
1834
  () => getConnectionMeta(
1816
1835
  connectionStatus,
1817
1836
  reconnectAttempt,
@@ -1831,7 +1850,7 @@ function SkillStatusBar({
1831
1850
  text: skillStoreConnected ? `\u5DF2\u5B89\u88C5 ${skillStats.installed_skill_count} \u4E2A\u6280\u80FD` : "\u5C1A\u672A\u767B\u5F55\u6280\u80FD\u5546\u5E97"
1832
1851
  }
1833
1852
  ].filter((item) => item.key !== "total" || skillStats.remote_configured);
1834
- const tokenSummary = useMemo6(() => {
1853
+ const tokenSummary = useMemo7(() => {
1835
1854
  return {
1836
1855
  detail: /* @__PURE__ */ jsxs7("div", { className: "space-y-1", children: [
1837
1856
  /* @__PURE__ */ jsxs7("div", { className: "flex items-center justify-between gap-3 border-t border-slate-800 pt-1", children: [
@@ -2742,7 +2761,7 @@ function ChatInput({
2742
2761
  const localImageUrlsRef = useRef5(/* @__PURE__ */ new Map());
2743
2762
  const activeSessionId = useSessionStore((state) => state.activeSessionId);
2744
2763
  const sessions = useSessionStore((state) => state.sessions);
2745
- const activeSessionModel = useMemo7(
2764
+ const activeSessionModel = useMemo8(
2746
2765
  () => sessions.find((session) => session.id === activeSessionId)?.model ?? null,
2747
2766
  [activeSessionId, sessions]
2748
2767
  );
@@ -3849,13 +3868,13 @@ import {
3849
3868
  useCallback as useCallback12,
3850
3869
  useEffect as useEffect17,
3851
3870
  useEffectEvent as useEffectEvent4,
3852
- useMemo as useMemo17,
3871
+ useMemo as useMemo18,
3853
3872
  useRef as useRef13,
3854
3873
  useState as useState21
3855
3874
  } from "react";
3856
3875
 
3857
3876
  // ../../node_modules/.pnpm/use-stick-to-bottom@1.1.3_react@19.2.4/node_modules/use-stick-to-bottom/dist/useStickToBottom.js
3858
- import { useCallback as useCallback7, useMemo as useMemo8, useRef as useRef6, useState as useState9 } from "react";
3877
+ import { useCallback as useCallback7, useMemo as useMemo9, useRef as useRef6, useState as useState9 } from "react";
3859
3878
  var DEFAULT_SPRING_ANIMATION = {
3860
3879
  /**
3861
3880
  * A value from 0 to 1, on how much to damp the animation.
@@ -3916,7 +3935,7 @@ var useStickToBottom = (options = {}) => {
3916
3935
  state.escapedFromLock = escapedFromLock2;
3917
3936
  updateEscapedFromLock(escapedFromLock2);
3918
3937
  }, []);
3919
- const state = useMemo8(() => {
3938
+ const state = useMemo9(() => {
3920
3939
  let lastCalculation;
3921
3940
  return {
3922
3941
  escapedFromLock,
@@ -4199,7 +4218,7 @@ function mergeAnimations(...animations) {
4199
4218
 
4200
4219
  // ../../node_modules/.pnpm/use-stick-to-bottom@1.1.3_react@19.2.4/node_modules/use-stick-to-bottom/dist/StickToBottom.js
4201
4220
  import * as React from "react";
4202
- import { createContext, useContext, useEffect as useEffect8, useImperativeHandle as useImperativeHandle3, useLayoutEffect, useMemo as useMemo9, useRef as useRef7 } from "react";
4221
+ import { createContext, useContext, useEffect as useEffect8, useImperativeHandle as useImperativeHandle3, useLayoutEffect, useMemo as useMemo10, useRef as useRef7 } from "react";
4203
4222
  var StickToBottomContext = createContext(null);
4204
4223
  var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect8;
4205
4224
  function StickToBottom({ instance, children, resize, initial, mass, damping, stiffness, targetScrollTop: currentTargetScrollTop, contextRef, ...props }) {
@@ -4217,7 +4236,7 @@ function StickToBottom({ instance, children, resize, initial, mass, damping, sti
4217
4236
  targetScrollTop
4218
4237
  });
4219
4238
  const { scrollRef, contentRef, scrollToBottom, stopScroll, isAtBottom, escapedFromLock, state } = instance ?? defaultInstance;
4220
- const context = useMemo9(() => ({
4239
+ const context = useMemo10(() => ({
4221
4240
  scrollToBottom,
4222
4241
  stopScroll,
4223
4242
  scrollRef,
@@ -4279,8 +4298,8 @@ function useStickToBottomContext() {
4279
4298
  }
4280
4299
 
4281
4300
  // src/react/components/chat/AssistantTurnBlock.tsx
4282
- import { AlertCircle, BookOpen, Check as Check4, ChevronRight as ChevronRight5 } from "lucide-react";
4283
- import { memo as memo3, useCallback as useCallback11, useEffect as useEffect15, useMemo as useMemo15, useRef as useRef12, useState as useState18 } from "react";
4301
+ import { AlertCircle, BookOpen, Check as Check5, ChevronRight as ChevronRight5 } from "lucide-react";
4302
+ import { memo as memo3, useCallback as useCallback11, useEffect as useEffect15, useMemo as useMemo16, useRef as useRef12, useState as useState18 } from "react";
4284
4303
 
4285
4304
  // src/react/routes.ts
4286
4305
  var MEMORIES_ROUTE = "/memories";
@@ -4297,7 +4316,7 @@ import {
4297
4316
  useCallback as useCallback9,
4298
4317
  useContext as useContext2,
4299
4318
  useEffect as useEffect9,
4300
- useMemo as useMemo11,
4319
+ useMemo as useMemo12,
4301
4320
  useRef as useRef8,
4302
4321
  useState as useState10
4303
4322
  } from "react";
@@ -4306,7 +4325,7 @@ import { Streamdown } from "streamdown";
4306
4325
 
4307
4326
  // src/react/components/ai-elements/shimmer.tsx
4308
4327
  import { motion } from "motion/react";
4309
- import { memo, useMemo as useMemo10 } from "react";
4328
+ import { memo, useMemo as useMemo11 } from "react";
4310
4329
  import { jsx as jsx11 } from "react/jsx-runtime";
4311
4330
  var motionComponentCache = /* @__PURE__ */ new Map();
4312
4331
  var getMotionComponent = (element) => {
@@ -4327,7 +4346,7 @@ var ShimmerComponent = ({
4327
4346
  const MotionComponent = getMotionComponent(
4328
4347
  Component2
4329
4348
  );
4330
- const dynamicSpread = useMemo10(
4349
+ const dynamicSpread = useMemo11(
4331
4350
  () => (children?.length ?? 0) * spread,
4332
4351
  [children, spread]
4333
4352
  );
@@ -4404,7 +4423,7 @@ var Reasoning = memo2(
4404
4423
  },
4405
4424
  [setIsOpen]
4406
4425
  );
4407
- const contextValue = useMemo11(
4426
+ const contextValue = useMemo12(
4408
4427
  () => ({ duration, isOpen, isStreaming, setIsOpen }),
4409
4428
  [duration, isOpen, isStreaming, setIsOpen]
4410
4429
  );
@@ -4561,8 +4580,8 @@ ReasoningTrigger.displayName = "ReasoningTrigger";
4561
4580
  ReasoningContent.displayName = "ReasoningContent";
4562
4581
 
4563
4582
  // src/react/components/chat/AgentLoopBlock.tsx
4564
- import { Bot, Check as Check3, ChevronRight as ChevronRight4, FileText as FileText6, Loader2 as Loader25, MessageSquareMore as MessageSquareMore2 } from "lucide-react";
4565
- import { useEffect as useEffect14, useMemo as useMemo14, useState as useState17 } from "react";
4583
+ import { Bot, Check as Check4, ChevronRight as ChevronRight4, FileText as FileText6, Loader2 as Loader25, MessageSquareMore as MessageSquareMore2 } from "lucide-react";
4584
+ import { useEffect as useEffect14, useMemo as useMemo15, useState as useState17 } from "react";
4566
4585
 
4567
4586
  // src/react/components/chat/ResourceIframe.tsx
4568
4587
  import { useEffect as useEffect10, useEffectEvent as useEffectEvent3, useRef as useRef9, useState as useState11 } from "react";
@@ -4672,13 +4691,14 @@ function ResourceIframe({ ui, sessionId }) {
4672
4691
  }
4673
4692
  const inlineHeight = autoHeight ?? ui.height;
4674
4693
  const sandbox = resourceUri ? "allow-scripts allow-same-origin" : "allow-scripts";
4694
+ const srcDoc = ui.resourceHTML ? injectBaseTag(ui.resourceHTML) : void 0;
4675
4695
  return /* @__PURE__ */ jsx13(
4676
4696
  "iframe",
4677
4697
  {
4678
4698
  ref: iframeRef,
4679
4699
  title: ui.title ?? "\u5DE5\u5177\u754C\u9762",
4680
4700
  src: resourceUri,
4681
- srcDoc: ui.resourceHTML,
4701
+ srcDoc,
4682
4702
  sandbox,
4683
4703
  loading: "lazy",
4684
4704
  scrolling: ui.target === "preview" ? void 0 : "no",
@@ -4691,10 +4711,24 @@ function ResourceIframe({ ui, sessionId }) {
4691
4711
  }
4692
4712
  );
4693
4713
  }
4714
+ function injectBaseTag(html) {
4715
+ const base = `<base href="${window.location.origin}/">`;
4716
+ const headIdx = html.toLowerCase().indexOf("<head");
4717
+ if (headIdx >= 0) {
4718
+ const closeIdx = html.indexOf(">", headIdx);
4719
+ if (closeIdx >= 0) {
4720
+ return `${html.slice(0, closeIdx + 1)}
4721
+ ${base}
4722
+ ${html.slice(closeIdx + 1)}`;
4723
+ }
4724
+ }
4725
+ return `${base}
4726
+ ${html}`;
4727
+ }
4694
4728
 
4695
4729
  // src/react/components/chat/ToolCallBlock.tsx
4696
- import { Check, ChevronRight as ChevronRight3, Loader2 as Loader23, MessageSquareMore, PanelRightOpen, X as X4 } from "lucide-react";
4697
- import { useMemo as useMemo12, useState as useState14 } from "react";
4730
+ import { Check as Check2, ChevronRight as ChevronRight3, Loader2 as Loader23, MessageSquareMore, PanelRightOpen, X as X4 } from "lucide-react";
4731
+ import { useMemo as useMemo13, useState as useState14 } from "react";
4698
4732
 
4699
4733
  // src/react/components/chat/tool-renderers/shared.tsx
4700
4734
  import { jsx as jsx14 } from "react/jsx-runtime";
@@ -5705,7 +5739,7 @@ function ToolCallBlock({
5705
5739
  const resolvedAnswerData = answerData ?? storedAnswerData;
5706
5740
  const resolvedAnswered = answered ?? (!!resolvedAnswerData && resolvedSessionStatus !== "waiting_for_input");
5707
5741
  const resolvedOnAnswer = onAnswer ?? answerCallback;
5708
- const uiMeta = useMemo12(() => {
5742
+ const uiMeta = useMemo13(() => {
5709
5743
  const block = turnBlocks?.find(
5710
5744
  (item) => item.type === "tool_ui" && item.tool_call_id === toolCall.id && isUiMeta(item.content)
5711
5745
  );
@@ -5743,7 +5777,7 @@ function ToolCallBlock({
5743
5777
  const borderWidthClass = level === 2 ? "border-l-[2px]" : "border-l-[3px]";
5744
5778
  const indentClass = level === 2 ? "ml-3" : "ml-4";
5745
5779
  const toneClass = tone === "red" ? "border-l-[hsl(var(--muted-foreground)/0.5)]" : tone === "amber" ? "border-l-amber-400" : tone === "blue" ? "border-l-blue-500" : "border-l-[hsl(var(--primary))]";
5746
- const statusIcon = toolCall.status === "pending" ? /* @__PURE__ */ jsx21(Loader23, { size: 11, className: "animate-spin" }) : toolCall.status === "awaiting_answer" ? /* @__PURE__ */ jsx21(MessageSquareMore, { size: 11 }) : toolCall.status === "cancelled" || toolCall.status === "error" ? /* @__PURE__ */ jsx21(X4, { size: 11 }) : /* @__PURE__ */ jsx21(Check, { size: 11 });
5780
+ const statusIcon = toolCall.status === "pending" ? /* @__PURE__ */ jsx21(Loader23, { size: 11, className: "animate-spin" }) : toolCall.status === "awaiting_answer" ? /* @__PURE__ */ jsx21(MessageSquareMore, { size: 11 }) : toolCall.status === "cancelled" || toolCall.status === "error" ? /* @__PURE__ */ jsx21(X4, { size: 11 }) : /* @__PURE__ */ jsx21(Check2, { size: 11 });
5747
5781
  const statusTextClass = tone === "red" ? "text-[hsl(var(--muted-foreground))]" : tone === "amber" ? "text-amber-300" : tone === "blue" ? "text-blue-300" : "text-[hsl(var(--primary))]";
5748
5782
  return /* @__PURE__ */ jsxs17("div", { className: cn(indentClass, "text-xs", customization?.classNames?.toolCall), children: [
5749
5783
  /* @__PURE__ */ jsxs17("div", { className: cn(borderWidthClass, toneClass, "flex items-center gap-2 px-3 py-2"), children: [
@@ -6189,7 +6223,7 @@ function MessageFileAttachmentList({
6189
6223
  }
6190
6224
 
6191
6225
  // src/react/components/chat/MessageActions.tsx
6192
- import { Check as Check2, Copy } from "lucide-react";
6226
+ import { Check as Check3, Copy } from "lucide-react";
6193
6227
  import { useState as useState15 } from "react";
6194
6228
  import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
6195
6229
  function MessageActions({ content, className }) {
@@ -6211,7 +6245,7 @@ function MessageActions({ content, className }) {
6211
6245
  copied ? "text-[hsl(var(--primary))]" : "text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))]"
6212
6246
  ),
6213
6247
  children: [
6214
- copied ? /* @__PURE__ */ jsx25(Check2, { size: 12 }) : /* @__PURE__ */ jsx25(Copy, { size: 12 }),
6248
+ copied ? /* @__PURE__ */ jsx25(Check3, { size: 12 }) : /* @__PURE__ */ jsx25(Copy, { size: 12 }),
6215
6249
  /* @__PURE__ */ jsx25("span", { children: copied ? "\u5DF2\u590D\u5236" : "\u590D\u5236" })
6216
6250
  ]
6217
6251
  }
@@ -6263,14 +6297,14 @@ function TextAttachmentPills({ attachments, onPreview }) {
6263
6297
  import { RefreshCcw } from "lucide-react";
6264
6298
 
6265
6299
  // src/react/components/chat/whatif-quote-context.tsx
6266
- import { createContext as createContext3, useContext as useContext3, useMemo as useMemo13 } from "react";
6300
+ import { createContext as createContext3, useContext as useContext3, useMemo as useMemo14 } from "react";
6267
6301
  import { jsx as jsx27 } from "react/jsx-runtime";
6268
6302
  var WhatIfQuoteContext = createContext3({});
6269
6303
  function WhatIfQuoteProvider({
6270
6304
  onJumpToStep,
6271
6305
  children
6272
6306
  }) {
6273
- const value = useMemo13(() => ({ onJumpToStep }), [onJumpToStep]);
6307
+ const value = useMemo14(() => ({ onJumpToStep }), [onJumpToStep]);
6274
6308
  return /* @__PURE__ */ jsx27(WhatIfQuoteContext.Provider, { value, children });
6275
6309
  }
6276
6310
  function useWhatIfQuoteContext() {
@@ -6567,7 +6601,7 @@ function stripFileExtension(fileName) {
6567
6601
  function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
6568
6602
  const agentLoops = useChatStore((state) => state.agentLoops[sessionId] ?? EMPTY_AGENT_LOOPS);
6569
6603
  const messages = useChatStore((state) => state.messages[sessionId] ?? EMPTY_MESSAGES2);
6570
- const loopEntry = useMemo14(() => {
6604
+ const loopEntry = useMemo15(() => {
6571
6605
  for (const [loopName, info] of Object.entries(agentLoops)) {
6572
6606
  if (info.toolCallId === toolCall.id) {
6573
6607
  return { loopName, info };
@@ -6575,24 +6609,24 @@ function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
6575
6609
  }
6576
6610
  return null;
6577
6611
  }, [agentLoops, toolCall.id]);
6578
- const childMessages = useMemo14(() => {
6612
+ const childMessages = useMemo15(() => {
6579
6613
  if (!loopEntry) return [];
6580
6614
  return messages.filter((message) => (message.loop_name ?? "root") === loopEntry.loopName);
6581
6615
  }, [loopEntry, messages]);
6582
- const loopToolCalls = useMemo14(
6616
+ const loopToolCalls = useMemo15(
6583
6617
  () => childMessages.flatMap((message) => message.tool_calls ?? []),
6584
6618
  [childMessages]
6585
6619
  );
6586
- const visibleLoopToolCalls = useMemo14(
6620
+ const visibleLoopToolCalls = useMemo15(
6587
6621
  () => loopToolCalls.filter((childToolCall) => formatToolName(childToolCall.name) !== "Agent"),
6588
6622
  [loopToolCalls]
6589
6623
  );
6590
- const hasAwaitingAnswer = useMemo14(
6624
+ const hasAwaitingAnswer = useMemo15(
6591
6625
  () => visibleLoopToolCalls.some((childToolCall) => childToolCall.status === "awaiting_answer"),
6592
6626
  [visibleLoopToolCalls]
6593
6627
  );
6594
6628
  const [expanded, setExpanded] = useState17(hasAwaitingAnswer);
6595
- const completedToolLabels = useMemo14(
6629
+ const completedToolLabels = useMemo15(
6596
6630
  () => visibleLoopToolCalls.flatMap((childToolCall) => {
6597
6631
  const isCompleted = childToolCall.status === "done" || childToolCall.status !== "pending" && childToolCall.status !== "awaiting_answer" && childToolCall.status !== "error" && childToolCall.status !== "cancelled";
6598
6632
  if (!isCompleted) return [];
@@ -6620,7 +6654,7 @@ function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
6620
6654
  }),
6621
6655
  [visibleLoopToolCalls]
6622
6656
  );
6623
- const inlineToolUiBlocks = useMemo14(
6657
+ const inlineToolUiBlocks = useMemo15(
6624
6658
  () => childMessages.flatMap(
6625
6659
  (message) => (message.blocks ?? []).flatMap(
6626
6660
  (block, index) => block.type === "tool_ui" && block.tool_call_id && isUiMeta(block.content) && block.content.target === "inline" ? [{ key: `${message.entry_id ?? message.timestamp ?? "message"}-${block.tool_call_id}-${index}`, ui: block.content }] : []
@@ -6730,7 +6764,7 @@ function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
6730
6764
  "aria-expanded": expanded,
6731
6765
  className: "flex min-w-0 flex-1 items-center gap-2 text-left focus-visible:ring-1 focus-visible:ring-[hsl(var(--ring))] focus:outline-none",
6732
6766
  children: /* @__PURE__ */ jsxs25("span", { className: "min-w-0 flex items-center gap-2", children: [
6733
- /* @__PURE__ */ jsx30(Check3, { size: 14, className: "shrink-0 text-emerald-500" }),
6767
+ /* @__PURE__ */ jsx30(Check4, { size: 14, className: "shrink-0 text-emerald-500" }),
6734
6768
  /* @__PURE__ */ jsx30("span", { className: "truncate text-sm font-medium text-[hsl(var(--foreground))]", children: description })
6735
6769
  ] })
6736
6770
  }
@@ -7083,12 +7117,12 @@ function AssistantTurnBlockBase({
7083
7117
  customization
7084
7118
  }) {
7085
7119
  const messages = Array.isArray(rawMessages) ? rawMessages : [];
7086
- const allToolCalls = useMemo15(() => messages.flatMap((m) => m.tool_calls ?? []), [messages]);
7087
- const hasAgentToolCall = useMemo15(
7120
+ const allToolCalls = useMemo16(() => messages.flatMap((m) => m.tool_calls ?? []), [messages]);
7121
+ const hasAgentToolCall = useMemo16(
7088
7122
  () => allToolCalls.some((toolCall) => formatToolName(toolCall.name) === "Agent"),
7089
7123
  [allToolCalls]
7090
7124
  );
7091
- const hasActionableToolCall = useMemo15(
7125
+ const hasActionableToolCall = useMemo16(
7092
7126
  () => allToolCalls.some(
7093
7127
  (tc) => tc.status === "error" || tc.status === "cancelled" || formatToolName(tc.name) === "AskUserQuestion" && tc.status === "awaiting_answer"
7094
7128
  ),
@@ -7110,12 +7144,12 @@ function AssistantTurnBlockBase({
7110
7144
  const agentLoops = useChatStore(
7111
7145
  (state) => hasAgentToolCall ? state.agentLoops[sessionId] ?? EMPTY_AGENT_LOOPS2 : EMPTY_AGENT_LOOPS2
7112
7146
  );
7113
- const turnMessages = useMemo15(
7147
+ const turnMessages = useMemo16(
7114
7148
  () => hasAgentToolCall ? collectTurnMessages({ rootMessages: messages, sessionMessages, agentLoops }) : messages,
7115
7149
  [agentLoops, hasAgentToolCall, messages, sessionMessages]
7116
7150
  );
7117
- const resourceBlocks = useMemo15(() => getInlineResourceBlocks(turnMessages), [turnMessages]);
7118
- const finalMessage = useMemo15(() => getLastTextMessage(turnMessages), [turnMessages]);
7151
+ const resourceBlocks = useMemo16(() => getInlineResourceBlocks(turnMessages), [turnMessages]);
7152
+ const finalMessage = useMemo16(() => getLastTextMessage(turnMessages), [turnMessages]);
7119
7153
  const hasInterruptedState = messages.some((message) => message.status === "interrupted");
7120
7154
  const effectiveMode = resolveTurnDisplayMode({ isStreaming, displayMode });
7121
7155
  const memoryRefs = Array.isArray(messages[0]?.memory_refs) ? messages[0].memory_refs : [];
@@ -7363,7 +7397,7 @@ function CompactToolGroupBlock({
7363
7397
  /* @__PURE__ */ jsx31(AlertCircle, { size: 11 }),
7364
7398
  /* @__PURE__ */ jsx31("span", { children: "\u5931\u8D25" })
7365
7399
  ] }) : /* @__PURE__ */ jsxs26("span", { className: "flex shrink-0 items-center gap-1 text-[10px] text-[hsl(var(--primary))]", children: [
7366
- /* @__PURE__ */ jsx31(Check4, { size: 11 }),
7400
+ /* @__PURE__ */ jsx31(Check5, { size: 11 }),
7367
7401
  /* @__PURE__ */ jsx31("span", { children: "\u5B8C\u6210" })
7368
7402
  ] }),
7369
7403
  /* @__PURE__ */ jsx31("span", { className: "min-w-0 shrink-0 font-medium text-[hsl(var(--foreground))]", children: title })
@@ -7467,7 +7501,7 @@ function AssistantText({
7467
7501
  },
7468
7502
  [sessionId]
7469
7503
  );
7470
- const cardCtx = useMemo15(
7504
+ const cardCtx = useMemo16(
7471
7505
  () => ({ sessionId, messageId, sendMessage }),
7472
7506
  [sessionId, messageId, sendMessage]
7473
7507
  );
@@ -7746,7 +7780,7 @@ import {
7746
7780
  TerminalSquare,
7747
7781
  WandSparkles
7748
7782
  } from "lucide-react";
7749
- import { useEffect as useEffect16, useMemo as useMemo16, useState as useState20 } from "react";
7783
+ import { useEffect as useEffect16, useMemo as useMemo17, useState as useState20 } from "react";
7750
7784
  import { jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
7751
7785
  var EMPTY_EVENTS = [];
7752
7786
  function formatElapsedDuration(durationMs) {
@@ -7849,9 +7883,9 @@ function StickyStatusBar({
7849
7883
  onJumpToLatest
7850
7884
  }) {
7851
7885
  const events = useRuntimeStore((state) => state.events[sessionId] ?? EMPTY_EVENTS);
7852
- const startedAt = useMemo16(() => getTurnStartedAt(events), [events]);
7886
+ const startedAt = useMemo17(() => getTurnStartedAt(events), [events]);
7853
7887
  const elapsedDuration = useElapsedDuration(startedAt, isStreaming && isLastTurn);
7854
- const action = useMemo16(() => getCurrentAction(messages), [messages]);
7888
+ const action = useMemo17(() => getCurrentAction(messages), [messages]);
7855
7889
  if (!isStreaming || !isLastTurn) {
7856
7890
  return null;
7857
7891
  }
@@ -8014,10 +8048,10 @@ function MessageList({
8014
8048
  const agentLoops = useChatStore((state) => state.agentLoops[sessionId]);
8015
8049
  const askAnswers = useChatStore((state) => state.askAnswers[sessionId]);
8016
8050
  const sessionIsStreaming = useChatStore((state) => !!state.isStreaming[sessionId]);
8017
- const agentLoopNameSet = useMemo17(() => new Set(Object.keys(agentLoops ?? {})), [agentLoops]);
8051
+ const agentLoopNameSet = useMemo18(() => new Set(Object.keys(agentLoops ?? {})), [agentLoops]);
8018
8052
  const assistantMessagesCacheRef = useRef13(/* @__PURE__ */ new Map());
8019
8053
  const stickContextRef = useRef13(null);
8020
- const renderBlocks = useMemo17(() => {
8054
+ const renderBlocks = useMemo18(() => {
8021
8055
  const stableAssistantMessages = (key, buffer) => {
8022
8056
  const previous = assistantMessagesCacheRef.current.get(key);
8023
8057
  if (previous && previous.length === buffer.length && previous.every((message, index) => message === buffer[index])) {
@@ -8108,13 +8142,13 @@ function MessageList({
8108
8142
  }
8109
8143
  return blocks;
8110
8144
  }, [agentLoopNameSet, messages, sessionIsStreaming]);
8111
- const hasInterruptedTurn = useMemo17(
8145
+ const hasInterruptedTurn = useMemo18(
8112
8146
  () => renderBlocks.some(
8113
8147
  (block) => block.type === "assistant_turn" && block.messages.some((message) => message.status === "interrupted")
8114
8148
  ),
8115
8149
  [renderBlocks]
8116
8150
  );
8117
- const lastTurnId = useMemo17(() => {
8151
+ const lastTurnId = useMemo18(() => {
8118
8152
  for (let index = renderBlocks.length - 1; index >= 0; index -= 1) {
8119
8153
  const block = renderBlocks[index];
8120
8154
  if (block.type === "assistant_turn") return block.anchorId;
@@ -8122,14 +8156,14 @@ function MessageList({
8122
8156
  }
8123
8157
  return null;
8124
8158
  }, [renderBlocks]);
8125
- const turnNavItems = useMemo17(
8159
+ const turnNavItems = useMemo18(
8126
8160
  () => renderBlocks.filter((block) => block.type === "assistant_turn").map((block) => ({
8127
8161
  id: block.anchorId,
8128
8162
  title: block.railTitle
8129
8163
  })),
8130
8164
  [renderBlocks]
8131
8165
  );
8132
- const stickyTurn = useMemo17(
8166
+ const stickyTurn = useMemo18(
8133
8167
  () => renderBlocks.find(
8134
8168
  (block) => block.type === "assistant_turn" && block.anchorId === lastTurnId && block.isStreaming
8135
8169
  ) ?? null,
@@ -8139,7 +8173,7 @@ function MessageList({
8139
8173
  const scrollContainerRef = useRef13(null);
8140
8174
  const frameRef = useRef13(null);
8141
8175
  const [activeTurnId, setActiveTurnId] = useState21(lastTurnId);
8142
- const layoutSignature = useMemo17(
8176
+ const layoutSignature = useMemo18(
8143
8177
  () => getMessagesMeasureSignature(messages),
8144
8178
  [messages]
8145
8179
  );
@@ -8472,7 +8506,7 @@ function ChatView({
8472
8506
  },
8473
8507
  [send]
8474
8508
  );
8475
- const customization = useMemo18(
8509
+ const customization = useMemo19(
8476
8510
  () => ({ classNames, components, renderers }),
8477
8511
  [classNames, components, renderers]
8478
8512
  );
@@ -8579,4 +8613,4 @@ use-stick-to-bottom/dist/StickToBottom.js:
8579
8613
  * Licensed under the MIT License. See License.txt in the project root for license information.
8580
8614
  *--------------------------------------------------------------------------------------------*)
8581
8615
  */
8582
- //# sourceMappingURL=chunk-SGOR4YXZ.js.map
8616
+ //# sourceMappingURL=chunk-OVOZQHYQ.js.map