@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.
- package/dist/{chunk-SGOR4YXZ.js → chunk-7TS36PDU.js} +85 -66
- package/dist/chunk-7TS36PDU.js.map +1 -0
- package/dist/{chunk-EBTZAB6X.js → chunk-II2PTBJI.js} +10 -2
- package/dist/chunk-II2PTBJI.js.map +1 -0
- package/dist/{chunk-MGXPILAM.js → chunk-IRHXGYY3.js} +3 -3
- package/dist/{chunk-UR6C4AJB.js → chunk-KSYNFNF4.js} +2 -2
- package/dist/{chunk-PMG4N3JO.js → chunk-LVWRKH45.js} +2 -2
- package/dist/react/api/vibe-coding.js +1 -1
- package/dist/react/components/chat/index.js +4 -4
- package/dist/react/components/plan/index.js +3 -3
- package/dist/react/components/session/index.js +2 -2
- package/dist/react/components/workspace/index.js +2 -2
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-EBTZAB6X.js.map +0 -1
- package/dist/chunk-SGOR4YXZ.js.map +0 -1
- /package/dist/{chunk-MGXPILAM.js.map → chunk-IRHXGYY3.js.map} +0 -0
- /package/dist/{chunk-UR6C4AJB.js.map → chunk-KSYNFNF4.js.map} +0 -0
- /package/dist/{chunk-PMG4N3JO.js.map → chunk-LVWRKH45.js.map} +0 -0
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
getCodeLanguageFromFilename,
|
|
9
9
|
parseAskUserQuestion,
|
|
10
10
|
useHighlightedCodeHtml
|
|
11
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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
|
-
|
|
1384
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
4283
|
-
import { memo as memo3, useCallback as useCallback11, useEffect as useEffect15, useMemo as
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
4565
|
-
import { useEffect as useEffect14, useMemo as
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
6601
|
+
const loopToolCalls = useMemo15(
|
|
6583
6602
|
() => childMessages.flatMap((message) => message.tool_calls ?? []),
|
|
6584
6603
|
[childMessages]
|
|
6585
6604
|
);
|
|
6586
|
-
const visibleLoopToolCalls =
|
|
6605
|
+
const visibleLoopToolCalls = useMemo15(
|
|
6587
6606
|
() => loopToolCalls.filter((childToolCall) => formatToolName(childToolCall.name) !== "Agent"),
|
|
6588
6607
|
[loopToolCalls]
|
|
6589
6608
|
);
|
|
6590
|
-
const hasAwaitingAnswer =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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 =
|
|
7087
|
-
const hasAgentToolCall =
|
|
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 =
|
|
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 =
|
|
7132
|
+
const turnMessages = useMemo16(
|
|
7114
7133
|
() => hasAgentToolCall ? collectTurnMessages({ rootMessages: messages, sessionMessages, agentLoops }) : messages,
|
|
7115
7134
|
[agentLoops, hasAgentToolCall, messages, sessionMessages]
|
|
7116
7135
|
);
|
|
7117
|
-
const resourceBlocks =
|
|
7118
|
-
const finalMessage =
|
|
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(
|
|
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 =
|
|
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
|
|
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 =
|
|
7871
|
+
const startedAt = useMemo17(() => getTurnStartedAt(events), [events]);
|
|
7853
7872
|
const elapsedDuration = useElapsedDuration(startedAt, isStreaming && isLastTurn);
|
|
7854
|
-
const action =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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-
|
|
8601
|
+
//# sourceMappingURL=chunk-7TS36PDU.js.map
|