@blade-hq/agent-kit 0.5.33 → 0.5.34

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.
@@ -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";
@@ -4693,8 +4712,8 @@ function ResourceIframe({ ui, sessionId }) {
4693
4712
  }
4694
4713
 
4695
4714
  // 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";
4715
+ import { Check as Check2, ChevronRight as ChevronRight3, Loader2 as Loader23, MessageSquareMore, PanelRightOpen, X as X4 } from "lucide-react";
4716
+ import { useMemo as useMemo13, useState as useState14 } from "react";
4698
4717
 
4699
4718
  // src/react/components/chat/tool-renderers/shared.tsx
4700
4719
  import { jsx as jsx14 } from "react/jsx-runtime";
@@ -5705,7 +5724,7 @@ function ToolCallBlock({
5705
5724
  const resolvedAnswerData = answerData ?? storedAnswerData;
5706
5725
  const resolvedAnswered = answered ?? (!!resolvedAnswerData && resolvedSessionStatus !== "waiting_for_input");
5707
5726
  const resolvedOnAnswer = onAnswer ?? answerCallback;
5708
- const uiMeta = useMemo12(() => {
5727
+ const uiMeta = useMemo13(() => {
5709
5728
  const block = turnBlocks?.find(
5710
5729
  (item) => item.type === "tool_ui" && item.tool_call_id === toolCall.id && isUiMeta(item.content)
5711
5730
  );
@@ -5743,7 +5762,7 @@ function ToolCallBlock({
5743
5762
  const borderWidthClass = level === 2 ? "border-l-[2px]" : "border-l-[3px]";
5744
5763
  const indentClass = level === 2 ? "ml-3" : "ml-4";
5745
5764
  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 });
5765
+ 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
5766
  const statusTextClass = tone === "red" ? "text-[hsl(var(--muted-foreground))]" : tone === "amber" ? "text-amber-300" : tone === "blue" ? "text-blue-300" : "text-[hsl(var(--primary))]";
5748
5767
  return /* @__PURE__ */ jsxs17("div", { className: cn(indentClass, "text-xs", customization?.classNames?.toolCall), children: [
5749
5768
  /* @__PURE__ */ jsxs17("div", { className: cn(borderWidthClass, toneClass, "flex items-center gap-2 px-3 py-2"), children: [
@@ -6189,7 +6208,7 @@ function MessageFileAttachmentList({
6189
6208
  }
6190
6209
 
6191
6210
  // src/react/components/chat/MessageActions.tsx
6192
- import { Check as Check2, Copy } from "lucide-react";
6211
+ import { Check as Check3, Copy } from "lucide-react";
6193
6212
  import { useState as useState15 } from "react";
6194
6213
  import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
6195
6214
  function MessageActions({ content, className }) {
@@ -6211,7 +6230,7 @@ function MessageActions({ content, className }) {
6211
6230
  copied ? "text-[hsl(var(--primary))]" : "text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))]"
6212
6231
  ),
6213
6232
  children: [
6214
- copied ? /* @__PURE__ */ jsx25(Check2, { size: 12 }) : /* @__PURE__ */ jsx25(Copy, { size: 12 }),
6233
+ copied ? /* @__PURE__ */ jsx25(Check3, { size: 12 }) : /* @__PURE__ */ jsx25(Copy, { size: 12 }),
6215
6234
  /* @__PURE__ */ jsx25("span", { children: copied ? "\u5DF2\u590D\u5236" : "\u590D\u5236" })
6216
6235
  ]
6217
6236
  }
@@ -6263,14 +6282,14 @@ function TextAttachmentPills({ attachments, onPreview }) {
6263
6282
  import { RefreshCcw } from "lucide-react";
6264
6283
 
6265
6284
  // src/react/components/chat/whatif-quote-context.tsx
6266
- import { createContext as createContext3, useContext as useContext3, useMemo as useMemo13 } from "react";
6285
+ import { createContext as createContext3, useContext as useContext3, useMemo as useMemo14 } from "react";
6267
6286
  import { jsx as jsx27 } from "react/jsx-runtime";
6268
6287
  var WhatIfQuoteContext = createContext3({});
6269
6288
  function WhatIfQuoteProvider({
6270
6289
  onJumpToStep,
6271
6290
  children
6272
6291
  }) {
6273
- const value = useMemo13(() => ({ onJumpToStep }), [onJumpToStep]);
6292
+ const value = useMemo14(() => ({ onJumpToStep }), [onJumpToStep]);
6274
6293
  return /* @__PURE__ */ jsx27(WhatIfQuoteContext.Provider, { value, children });
6275
6294
  }
6276
6295
  function useWhatIfQuoteContext() {
@@ -6567,7 +6586,7 @@ function stripFileExtension(fileName) {
6567
6586
  function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
6568
6587
  const agentLoops = useChatStore((state) => state.agentLoops[sessionId] ?? EMPTY_AGENT_LOOPS);
6569
6588
  const messages = useChatStore((state) => state.messages[sessionId] ?? EMPTY_MESSAGES2);
6570
- const loopEntry = useMemo14(() => {
6589
+ const loopEntry = useMemo15(() => {
6571
6590
  for (const [loopName, info] of Object.entries(agentLoops)) {
6572
6591
  if (info.toolCallId === toolCall.id) {
6573
6592
  return { loopName, info };
@@ -6575,24 +6594,24 @@ function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
6575
6594
  }
6576
6595
  return null;
6577
6596
  }, [agentLoops, toolCall.id]);
6578
- const childMessages = useMemo14(() => {
6597
+ const childMessages = useMemo15(() => {
6579
6598
  if (!loopEntry) return [];
6580
6599
  return messages.filter((message) => (message.loop_name ?? "root") === loopEntry.loopName);
6581
6600
  }, [loopEntry, messages]);
6582
- const loopToolCalls = useMemo14(
6601
+ const loopToolCalls = useMemo15(
6583
6602
  () => childMessages.flatMap((message) => message.tool_calls ?? []),
6584
6603
  [childMessages]
6585
6604
  );
6586
- const visibleLoopToolCalls = useMemo14(
6605
+ const visibleLoopToolCalls = useMemo15(
6587
6606
  () => loopToolCalls.filter((childToolCall) => formatToolName(childToolCall.name) !== "Agent"),
6588
6607
  [loopToolCalls]
6589
6608
  );
6590
- const hasAwaitingAnswer = useMemo14(
6609
+ const hasAwaitingAnswer = useMemo15(
6591
6610
  () => visibleLoopToolCalls.some((childToolCall) => childToolCall.status === "awaiting_answer"),
6592
6611
  [visibleLoopToolCalls]
6593
6612
  );
6594
6613
  const [expanded, setExpanded] = useState17(hasAwaitingAnswer);
6595
- const completedToolLabels = useMemo14(
6614
+ const completedToolLabels = useMemo15(
6596
6615
  () => visibleLoopToolCalls.flatMap((childToolCall) => {
6597
6616
  const isCompleted = childToolCall.status === "done" || childToolCall.status !== "pending" && childToolCall.status !== "awaiting_answer" && childToolCall.status !== "error" && childToolCall.status !== "cancelled";
6598
6617
  if (!isCompleted) return [];
@@ -6620,7 +6639,7 @@ function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
6620
6639
  }),
6621
6640
  [visibleLoopToolCalls]
6622
6641
  );
6623
- const inlineToolUiBlocks = useMemo14(
6642
+ const inlineToolUiBlocks = useMemo15(
6624
6643
  () => childMessages.flatMap(
6625
6644
  (message) => (message.blocks ?? []).flatMap(
6626
6645
  (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 +6749,7 @@ function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
6730
6749
  "aria-expanded": expanded,
6731
6750
  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
6751
  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" }),
6752
+ /* @__PURE__ */ jsx30(Check4, { size: 14, className: "shrink-0 text-emerald-500" }),
6734
6753
  /* @__PURE__ */ jsx30("span", { className: "truncate text-sm font-medium text-[hsl(var(--foreground))]", children: description })
6735
6754
  ] })
6736
6755
  }
@@ -7083,12 +7102,12 @@ function AssistantTurnBlockBase({
7083
7102
  customization
7084
7103
  }) {
7085
7104
  const messages = Array.isArray(rawMessages) ? rawMessages : [];
7086
- const allToolCalls = useMemo15(() => messages.flatMap((m) => m.tool_calls ?? []), [messages]);
7087
- const hasAgentToolCall = useMemo15(
7105
+ const allToolCalls = useMemo16(() => messages.flatMap((m) => m.tool_calls ?? []), [messages]);
7106
+ const hasAgentToolCall = useMemo16(
7088
7107
  () => allToolCalls.some((toolCall) => formatToolName(toolCall.name) === "Agent"),
7089
7108
  [allToolCalls]
7090
7109
  );
7091
- const hasActionableToolCall = useMemo15(
7110
+ const hasActionableToolCall = useMemo16(
7092
7111
  () => allToolCalls.some(
7093
7112
  (tc) => tc.status === "error" || tc.status === "cancelled" || formatToolName(tc.name) === "AskUserQuestion" && tc.status === "awaiting_answer"
7094
7113
  ),
@@ -7110,12 +7129,12 @@ function AssistantTurnBlockBase({
7110
7129
  const agentLoops = useChatStore(
7111
7130
  (state) => hasAgentToolCall ? state.agentLoops[sessionId] ?? EMPTY_AGENT_LOOPS2 : EMPTY_AGENT_LOOPS2
7112
7131
  );
7113
- const turnMessages = useMemo15(
7132
+ const turnMessages = useMemo16(
7114
7133
  () => hasAgentToolCall ? collectTurnMessages({ rootMessages: messages, sessionMessages, agentLoops }) : messages,
7115
7134
  [agentLoops, hasAgentToolCall, messages, sessionMessages]
7116
7135
  );
7117
- const resourceBlocks = useMemo15(() => getInlineResourceBlocks(turnMessages), [turnMessages]);
7118
- const finalMessage = useMemo15(() => getLastTextMessage(turnMessages), [turnMessages]);
7136
+ const resourceBlocks = useMemo16(() => getInlineResourceBlocks(turnMessages), [turnMessages]);
7137
+ const finalMessage = useMemo16(() => getLastTextMessage(turnMessages), [turnMessages]);
7119
7138
  const hasInterruptedState = messages.some((message) => message.status === "interrupted");
7120
7139
  const effectiveMode = resolveTurnDisplayMode({ isStreaming, displayMode });
7121
7140
  const memoryRefs = Array.isArray(messages[0]?.memory_refs) ? messages[0].memory_refs : [];
@@ -7363,7 +7382,7 @@ function CompactToolGroupBlock({
7363
7382
  /* @__PURE__ */ jsx31(AlertCircle, { size: 11 }),
7364
7383
  /* @__PURE__ */ jsx31("span", { children: "\u5931\u8D25" })
7365
7384
  ] }) : /* @__PURE__ */ jsxs26("span", { className: "flex shrink-0 items-center gap-1 text-[10px] text-[hsl(var(--primary))]", children: [
7366
- /* @__PURE__ */ jsx31(Check4, { size: 11 }),
7385
+ /* @__PURE__ */ jsx31(Check5, { size: 11 }),
7367
7386
  /* @__PURE__ */ jsx31("span", { children: "\u5B8C\u6210" })
7368
7387
  ] }),
7369
7388
  /* @__PURE__ */ jsx31("span", { className: "min-w-0 shrink-0 font-medium text-[hsl(var(--foreground))]", children: title })
@@ -7467,7 +7486,7 @@ function AssistantText({
7467
7486
  },
7468
7487
  [sessionId]
7469
7488
  );
7470
- const cardCtx = useMemo15(
7489
+ const cardCtx = useMemo16(
7471
7490
  () => ({ sessionId, messageId, sendMessage }),
7472
7491
  [sessionId, messageId, sendMessage]
7473
7492
  );
@@ -7746,7 +7765,7 @@ import {
7746
7765
  TerminalSquare,
7747
7766
  WandSparkles
7748
7767
  } from "lucide-react";
7749
- import { useEffect as useEffect16, useMemo as useMemo16, useState as useState20 } from "react";
7768
+ import { useEffect as useEffect16, useMemo as useMemo17, useState as useState20 } from "react";
7750
7769
  import { jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
7751
7770
  var EMPTY_EVENTS = [];
7752
7771
  function formatElapsedDuration(durationMs) {
@@ -7849,9 +7868,9 @@ function StickyStatusBar({
7849
7868
  onJumpToLatest
7850
7869
  }) {
7851
7870
  const events = useRuntimeStore((state) => state.events[sessionId] ?? EMPTY_EVENTS);
7852
- const startedAt = useMemo16(() => getTurnStartedAt(events), [events]);
7871
+ const startedAt = useMemo17(() => getTurnStartedAt(events), [events]);
7853
7872
  const elapsedDuration = useElapsedDuration(startedAt, isStreaming && isLastTurn);
7854
- const action = useMemo16(() => getCurrentAction(messages), [messages]);
7873
+ const action = useMemo17(() => getCurrentAction(messages), [messages]);
7855
7874
  if (!isStreaming || !isLastTurn) {
7856
7875
  return null;
7857
7876
  }
@@ -8014,10 +8033,10 @@ function MessageList({
8014
8033
  const agentLoops = useChatStore((state) => state.agentLoops[sessionId]);
8015
8034
  const askAnswers = useChatStore((state) => state.askAnswers[sessionId]);
8016
8035
  const sessionIsStreaming = useChatStore((state) => !!state.isStreaming[sessionId]);
8017
- const agentLoopNameSet = useMemo17(() => new Set(Object.keys(agentLoops ?? {})), [agentLoops]);
8036
+ const agentLoopNameSet = useMemo18(() => new Set(Object.keys(agentLoops ?? {})), [agentLoops]);
8018
8037
  const assistantMessagesCacheRef = useRef13(/* @__PURE__ */ new Map());
8019
8038
  const stickContextRef = useRef13(null);
8020
- const renderBlocks = useMemo17(() => {
8039
+ const renderBlocks = useMemo18(() => {
8021
8040
  const stableAssistantMessages = (key, buffer) => {
8022
8041
  const previous = assistantMessagesCacheRef.current.get(key);
8023
8042
  if (previous && previous.length === buffer.length && previous.every((message, index) => message === buffer[index])) {
@@ -8108,13 +8127,13 @@ function MessageList({
8108
8127
  }
8109
8128
  return blocks;
8110
8129
  }, [agentLoopNameSet, messages, sessionIsStreaming]);
8111
- const hasInterruptedTurn = useMemo17(
8130
+ const hasInterruptedTurn = useMemo18(
8112
8131
  () => renderBlocks.some(
8113
8132
  (block) => block.type === "assistant_turn" && block.messages.some((message) => message.status === "interrupted")
8114
8133
  ),
8115
8134
  [renderBlocks]
8116
8135
  );
8117
- const lastTurnId = useMemo17(() => {
8136
+ const lastTurnId = useMemo18(() => {
8118
8137
  for (let index = renderBlocks.length - 1; index >= 0; index -= 1) {
8119
8138
  const block = renderBlocks[index];
8120
8139
  if (block.type === "assistant_turn") return block.anchorId;
@@ -8122,14 +8141,14 @@ function MessageList({
8122
8141
  }
8123
8142
  return null;
8124
8143
  }, [renderBlocks]);
8125
- const turnNavItems = useMemo17(
8144
+ const turnNavItems = useMemo18(
8126
8145
  () => renderBlocks.filter((block) => block.type === "assistant_turn").map((block) => ({
8127
8146
  id: block.anchorId,
8128
8147
  title: block.railTitle
8129
8148
  })),
8130
8149
  [renderBlocks]
8131
8150
  );
8132
- const stickyTurn = useMemo17(
8151
+ const stickyTurn = useMemo18(
8133
8152
  () => renderBlocks.find(
8134
8153
  (block) => block.type === "assistant_turn" && block.anchorId === lastTurnId && block.isStreaming
8135
8154
  ) ?? null,
@@ -8139,7 +8158,7 @@ function MessageList({
8139
8158
  const scrollContainerRef = useRef13(null);
8140
8159
  const frameRef = useRef13(null);
8141
8160
  const [activeTurnId, setActiveTurnId] = useState21(lastTurnId);
8142
- const layoutSignature = useMemo17(
8161
+ const layoutSignature = useMemo18(
8143
8162
  () => getMessagesMeasureSignature(messages),
8144
8163
  [messages]
8145
8164
  );
@@ -8472,7 +8491,7 @@ function ChatView({
8472
8491
  },
8473
8492
  [send]
8474
8493
  );
8475
- const customization = useMemo18(
8494
+ const customization = useMemo19(
8476
8495
  () => ({ classNames, components, renderers }),
8477
8496
  [classNames, components, renderers]
8478
8497
  );
@@ -8579,4 +8598,4 @@ use-stick-to-bottom/dist/StickToBottom.js:
8579
8598
  * Licensed under the MIT License. See License.txt in the project root for license information.
8580
8599
  *--------------------------------------------------------------------------------------------*)
8581
8600
  */
8582
- //# sourceMappingURL=chunk-SGOR4YXZ.js.map
8601
+ //# sourceMappingURL=chunk-7TS36PDU.js.map