@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.
- 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/{chunk-SGOR4YXZ.js → chunk-OVOZQHYQ.js} +101 -67
- package/dist/chunk-OVOZQHYQ.js.map +1 -0
- 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/dist/style.css +1 -1
- 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
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
getSessionFilePath,
|
|
7
7
|
resolveSessionFilePreviewTarget
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-LVWRKH45.js";
|
|
9
9
|
import {
|
|
10
10
|
formatToolName,
|
|
11
11
|
getAuthedUrl,
|
|
12
12
|
useUiStore
|
|
13
|
-
} from "./chunk-
|
|
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-
|
|
1936
|
+
//# sourceMappingURL=chunk-IRHXGYY3.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useSessionStore
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
30
|
+
//# sourceMappingURL=chunk-KSYNFNF4.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
apiFetchResponse,
|
|
3
3
|
getAuthedUrl
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
120
|
+
//# sourceMappingURL=chunk-LVWRKH45.js.map
|
|
@@ -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";
|
|
@@ -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
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
6616
|
+
const loopToolCalls = useMemo15(
|
|
6583
6617
|
() => childMessages.flatMap((message) => message.tool_calls ?? []),
|
|
6584
6618
|
[childMessages]
|
|
6585
6619
|
);
|
|
6586
|
-
const visibleLoopToolCalls =
|
|
6620
|
+
const visibleLoopToolCalls = useMemo15(
|
|
6587
6621
|
() => loopToolCalls.filter((childToolCall) => formatToolName(childToolCall.name) !== "Agent"),
|
|
6588
6622
|
[loopToolCalls]
|
|
6589
6623
|
);
|
|
6590
|
-
const hasAwaitingAnswer =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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 =
|
|
7087
|
-
const hasAgentToolCall =
|
|
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 =
|
|
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 =
|
|
7147
|
+
const turnMessages = useMemo16(
|
|
7114
7148
|
() => hasAgentToolCall ? collectTurnMessages({ rootMessages: messages, sessionMessages, agentLoops }) : messages,
|
|
7115
7149
|
[agentLoops, hasAgentToolCall, messages, sessionMessages]
|
|
7116
7150
|
);
|
|
7117
|
-
const resourceBlocks =
|
|
7118
|
-
const finalMessage =
|
|
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(
|
|
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 =
|
|
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
|
|
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 =
|
|
7886
|
+
const startedAt = useMemo17(() => getTurnStartedAt(events), [events]);
|
|
7853
7887
|
const elapsedDuration = useElapsedDuration(startedAt, isStreaming && isLastTurn);
|
|
7854
|
-
const action =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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-
|
|
8616
|
+
//# sourceMappingURL=chunk-OVOZQHYQ.js.map
|