@blade-hq/agent-kit 0.4.7 → 0.4.10
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/{SkillStatusBar-DQyipdzn.d.ts → SkillStatusBar-BnDtYUf9.d.ts} +2 -2
- package/dist/{blade-client-nOsdVlb1.d.ts → blade-client-n7fiBaFk.d.ts} +60 -2
- package/dist/{chunk-I3FFV63W.js → chunk-5ZFK62RQ.js} +2 -2
- package/dist/{chunk-OKQWPNE3.js → chunk-C3KSHIRA.js} +86 -5
- package/dist/chunk-C3KSHIRA.js.map +1 -0
- package/dist/{chunk-X6MEYCU7.js → chunk-CK7JMN5S.js} +228 -82
- package/dist/chunk-CK7JMN5S.js.map +1 -0
- package/dist/{chunk-4VWLTG5L.js → chunk-EDMS2G5P.js} +88 -17
- package/dist/chunk-EDMS2G5P.js.map +1 -0
- package/dist/{chunk-TC5BBLWO.js → chunk-EFNGK46B.js} +2 -2
- package/dist/{chunk-VD4CKRMT.js → chunk-FYPS4SFF.js} +2 -2
- package/dist/{chunk-CGOQI7ZL.js → chunk-TYCA6WYX.js} +98 -81
- package/dist/chunk-TYCA6WYX.js.map +1 -0
- package/dist/client/index.d.ts +395 -29
- package/dist/client/index.js +1 -1
- package/dist/{licenses-Cxl1xGVy.d.ts → licenses-BZpFl0qG.d.ts} +1 -1
- package/dist/react/api/licenses.d.ts +3 -3
- package/dist/react/api/licenses.js +3 -3
- package/dist/react/api/vibe-coding.d.ts +3 -3
- package/dist/react/api/vibe-coding.js +2 -2
- package/dist/react/components/chat/index.d.ts +4 -4
- package/dist/react/components/chat/index.js +5 -5
- package/dist/react/components/plan/index.js +3 -3
- package/dist/react/components/session/index.d.ts +1 -1
- package/dist/react/components/session/index.js +3 -3
- package/dist/react/components/workspace/index.js +3 -3
- package/dist/react/index.d.ts +64 -12
- package/dist/react/index.js +100 -63
- package/dist/react/index.js.map +1 -1
- package/dist/{session-CDeiO81j.d.ts → session-BKOc2lsz.d.ts} +9 -1
- package/dist/style.css +1 -1
- package/package.json +2 -1
- package/dist/chunk-4VWLTG5L.js.map +0 -1
- package/dist/chunk-CGOQI7ZL.js.map +0 -1
- package/dist/chunk-OKQWPNE3.js.map +0 -1
- package/dist/chunk-X6MEYCU7.js.map +0 -1
- /package/dist/{chunk-I3FFV63W.js.map → chunk-5ZFK62RQ.js.map} +0 -0
- /package/dist/{chunk-TC5BBLWO.js.map → chunk-EFNGK46B.js.map} +0 -0
- /package/dist/{chunk-VD4CKRMT.js.map → chunk-FYPS4SFF.js.map} +0 -0
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
CollapsibleContent,
|
|
4
4
|
CollapsibleTrigger,
|
|
5
5
|
resolveSessionFilePreviewTarget
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-FYPS4SFF.js";
|
|
7
7
|
import {
|
|
8
8
|
AskUserQuestionBlock,
|
|
9
9
|
CardCodeBlock,
|
|
@@ -11,9 +11,10 @@ import {
|
|
|
11
11
|
MarkdownContent,
|
|
12
12
|
PlanSummaryCard,
|
|
13
13
|
extractLatestPlanMessages,
|
|
14
|
+
getCodeLanguageFromFilename,
|
|
14
15
|
parseAskUserQuestion,
|
|
15
16
|
useHighlightedCodeHtml
|
|
16
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-CK7JMN5S.js";
|
|
17
18
|
import {
|
|
18
19
|
buildMessageContent,
|
|
19
20
|
buildToolPreviewKey,
|
|
@@ -55,7 +56,7 @@ import {
|
|
|
55
56
|
useUiBridgeStore,
|
|
56
57
|
useUiStore,
|
|
57
58
|
writeFile
|
|
58
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-EDMS2G5P.js";
|
|
59
60
|
import {
|
|
60
61
|
registerBridgeIframe,
|
|
61
62
|
tapBridgeEvent
|
|
@@ -64,7 +65,7 @@ import {
|
|
|
64
65
|
ModelOption,
|
|
65
66
|
ModelsConfig,
|
|
66
67
|
ModelsResource
|
|
67
|
-
} from "./chunk-
|
|
68
|
+
} from "./chunk-C3KSHIRA.js";
|
|
68
69
|
import {
|
|
69
70
|
cn,
|
|
70
71
|
copyToClipboard
|
|
@@ -177,7 +178,7 @@ import { useQueryClient as useQueryClient2 } from "@tanstack/react-query";
|
|
|
177
178
|
import {
|
|
178
179
|
useEffect as useEffect7,
|
|
179
180
|
useEffectEvent as useEffectEvent2,
|
|
180
|
-
useMemo as
|
|
181
|
+
useMemo as useMemo7,
|
|
181
182
|
useRef as useRef4,
|
|
182
183
|
useState as useState6
|
|
183
184
|
} from "react";
|
|
@@ -636,12 +637,18 @@ var getModelsConfig = (...args) => r().getModelsConfig(...args);
|
|
|
636
637
|
// src/react/api/user-preferences.ts
|
|
637
638
|
var user_preferences_exports = {};
|
|
638
639
|
__export(user_preferences_exports, {
|
|
640
|
+
getPersistentDefault: () => getPersistentDefault,
|
|
639
641
|
getUserPreference: () => getUserPreference,
|
|
642
|
+
resetComputer: () => resetComputer,
|
|
643
|
+
setPersistentDefault: () => setPersistentDefault,
|
|
640
644
|
setUserPreference: () => setUserPreference
|
|
641
645
|
});
|
|
642
646
|
var r2 = () => getClient().userPreferences;
|
|
643
647
|
var getUserPreference = (...args) => r2().getUserPreference(...args);
|
|
644
648
|
var setUserPreference = (...args) => r2().setUserPreference(...args);
|
|
649
|
+
var getPersistentDefault = (...args) => r2().getPersistentDefault(...args);
|
|
650
|
+
var setPersistentDefault = (...args) => r2().setPersistentDefault(...args);
|
|
651
|
+
var resetComputer = (...args) => r2().resetComputer(...args);
|
|
645
652
|
|
|
646
653
|
// src/react/hooks/use-model-preferences.ts
|
|
647
654
|
var PREFERRED_MODEL_KEY = "preferred_model";
|
|
@@ -723,7 +730,7 @@ function ModelSelector({
|
|
|
723
730
|
const canSelect = models.length > 0;
|
|
724
731
|
const selectedLabel = models.find((model) => model.id === value)?.label;
|
|
725
732
|
const defaultLabel = models.find((model) => model.id === defaultModel)?.label;
|
|
726
|
-
const label = isLoading ? "\u6B63\u5728\u52A0\u8F7D\u6A21\u578B..." : selectedLabel || defaultLabel || value.trim() ||
|
|
733
|
+
const label = isLoading ? "\u6B63\u5728\u52A0\u8F7D\u6A21\u578B..." : models.length === 0 ? "\u65E0\u53EF\u7528\u6A21\u578B" : selectedLabel || defaultLabel || value.trim() || "\u672A\u8FDE\u63A5\u5230\u6A21\u578B";
|
|
727
734
|
const dropdownPosition = placement === "top" ? "bottom-[calc(100%+8px)]" : "top-[calc(100%+8px)]";
|
|
728
735
|
if (!canSelect) {
|
|
729
736
|
return /* @__PURE__ */ jsxs(
|
|
@@ -885,6 +892,38 @@ function useInputHistory(sessionId) {
|
|
|
885
892
|
};
|
|
886
893
|
}
|
|
887
894
|
|
|
895
|
+
// src/react/hooks/use-resolved-model.ts
|
|
896
|
+
import { useMemo as useMemo3 } from "react";
|
|
897
|
+
function useResolvedModel(activeSessionModel) {
|
|
898
|
+
const { models, defaultModel, isLoading } = useModelConfig();
|
|
899
|
+
const { preferredModel } = usePreferredModel();
|
|
900
|
+
return useMemo3(() => {
|
|
901
|
+
if (isLoading) {
|
|
902
|
+
const optimistic = activeSessionModel || preferredModel || defaultModel || "";
|
|
903
|
+
return {
|
|
904
|
+
resolvedModel: optimistic,
|
|
905
|
+
hasAvailableModel: !!optimistic,
|
|
906
|
+
isLoading
|
|
907
|
+
};
|
|
908
|
+
}
|
|
909
|
+
const ids = models.map((model) => model.id);
|
|
910
|
+
const inList = (id) => !!id && ids.includes(id);
|
|
911
|
+
if (inList(activeSessionModel)) {
|
|
912
|
+
return { resolvedModel: activeSessionModel, hasAvailableModel: true, isLoading };
|
|
913
|
+
}
|
|
914
|
+
if (inList(preferredModel)) {
|
|
915
|
+
return { resolvedModel: preferredModel, hasAvailableModel: true, isLoading };
|
|
916
|
+
}
|
|
917
|
+
if (inList(defaultModel)) {
|
|
918
|
+
return { resolvedModel: defaultModel, hasAvailableModel: true, isLoading };
|
|
919
|
+
}
|
|
920
|
+
if (ids.length > 0) {
|
|
921
|
+
return { resolvedModel: ids[0], hasAvailableModel: true, isLoading };
|
|
922
|
+
}
|
|
923
|
+
return { resolvedModel: "", hasAvailableModel: false, isLoading };
|
|
924
|
+
}, [activeSessionModel, preferredModel, defaultModel, models, isLoading]);
|
|
925
|
+
}
|
|
926
|
+
|
|
888
927
|
// src/react/lib/attachment-upload.ts
|
|
889
928
|
var ATTACHMENT_SIZE_LIMIT_BYTES = 1e3 * 1024 * 1024;
|
|
890
929
|
function formatFileSize(size) {
|
|
@@ -923,7 +962,7 @@ function skillDisplayName(skill) {
|
|
|
923
962
|
|
|
924
963
|
// src/react/components/chat/FileCompletionMenu.tsx
|
|
925
964
|
import { ChevronRight, File, Folder } from "lucide-react";
|
|
926
|
-
import { forwardRef, useCallback as useCallback5, useImperativeHandle, useMemo as
|
|
965
|
+
import { forwardRef, useCallback as useCallback5, useImperativeHandle, useMemo as useMemo4, useState as useState4 } from "react";
|
|
927
966
|
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
928
967
|
var ROOT_DIR = ".";
|
|
929
968
|
function isVisibleEntry(entry) {
|
|
@@ -1009,7 +1048,7 @@ var FileCompletionMenu = forwardRef(
|
|
|
1009
1048
|
function FileCompletionMenu2({ command, editor, items, onExit, query, range, sessionId: sessionIdProp }, ref) {
|
|
1010
1049
|
const activeSessionId = useSessionStore((state) => state.activeSessionId);
|
|
1011
1050
|
const sessionId = sessionIdProp ?? activeSessionId;
|
|
1012
|
-
const { dirPath, filterQuery } =
|
|
1051
|
+
const { dirPath, filterQuery } = useMemo4(() => parseSuggestionQuery(query), [query]);
|
|
1013
1052
|
return /* @__PURE__ */ jsx3(
|
|
1014
1053
|
FileCompletionMenuContent,
|
|
1015
1054
|
{
|
|
@@ -1028,7 +1067,7 @@ var FileCompletionMenu = forwardRef(
|
|
|
1028
1067
|
);
|
|
1029
1068
|
var FileCompletionMenuContent = forwardRef(function FileCompletionMenuContent2({ command, editor, filterQuery, items, onExit, range, sessionId }, ref) {
|
|
1030
1069
|
const [rawSelectedIndex, setRawSelectedIndex] = useState4(0);
|
|
1031
|
-
const filteredEntries =
|
|
1070
|
+
const filteredEntries = useMemo4(() => filterEntries(items, filterQuery), [filterQuery, items]);
|
|
1032
1071
|
const selectedIndex = filteredEntries.length === 0 ? 0 : Math.min(rawSelectedIndex, filteredEntries.length - 1);
|
|
1033
1072
|
const handleSelect = useCallback5(
|
|
1034
1073
|
(entry) => {
|
|
@@ -1313,7 +1352,7 @@ function FileSizeLimitDialog({
|
|
|
1313
1352
|
// src/react/components/chat/SkillStatusBar.tsx
|
|
1314
1353
|
import { useQuery as useQuery5 } from "@tanstack/react-query";
|
|
1315
1354
|
import { RefreshCw } from "lucide-react";
|
|
1316
|
-
import { useMemo as
|
|
1355
|
+
import { useMemo as useMemo6 } from "react";
|
|
1317
1356
|
|
|
1318
1357
|
// src/react/hooks/use-background-tasks.ts
|
|
1319
1358
|
import { useQuery as useQuery2 } from "@tanstack/react-query";
|
|
@@ -1384,7 +1423,7 @@ function useSkillStats(sessionId) {
|
|
|
1384
1423
|
}
|
|
1385
1424
|
|
|
1386
1425
|
// src/react/hooks/use-token-pressure.ts
|
|
1387
|
-
import { useMemo as
|
|
1426
|
+
import { useMemo as useMemo5 } from "react";
|
|
1388
1427
|
function clampRatio(value) {
|
|
1389
1428
|
return Math.min(1, Math.max(0, value));
|
|
1390
1429
|
}
|
|
@@ -1402,7 +1441,7 @@ function resolveLevel(ratio, compactionRatio) {
|
|
|
1402
1441
|
}
|
|
1403
1442
|
function useTokenPressure(sessionId) {
|
|
1404
1443
|
const { data } = useContextStats(sessionId);
|
|
1405
|
-
return
|
|
1444
|
+
return useMemo5(() => {
|
|
1406
1445
|
const ratio = data.context_window > 0 ? clampRatio(data.tokens_used / data.context_window) : 0;
|
|
1407
1446
|
return {
|
|
1408
1447
|
ratio,
|
|
@@ -1558,7 +1597,7 @@ function SkillStatusBar({
|
|
|
1558
1597
|
const runningTasks = runningTaskItems.length;
|
|
1559
1598
|
const statsReady = !loading && !error;
|
|
1560
1599
|
const skillStoreConnected = statsReady && skillStats.remote_connected;
|
|
1561
|
-
const connectionMeta =
|
|
1600
|
+
const connectionMeta = useMemo6(
|
|
1562
1601
|
() => getConnectionMeta(
|
|
1563
1602
|
connectionStatus,
|
|
1564
1603
|
reconnectAttempt,
|
|
@@ -1583,7 +1622,7 @@ function SkillStatusBar({
|
|
|
1583
1622
|
text: skillStoreConnected ? `\u5DF2\u5B89\u88C5 ${skillStats.installed_skill_count} \u4E2A\u6280\u80FD` : "\u5C1A\u672A\u767B\u5F55\u6280\u80FD\u5546\u5E97"
|
|
1584
1623
|
}
|
|
1585
1624
|
].filter((item) => item.key !== "total" || skillStats.remote_configured);
|
|
1586
|
-
const tokenSummary =
|
|
1625
|
+
const tokenSummary = useMemo6(() => {
|
|
1587
1626
|
return {
|
|
1588
1627
|
detail: /* @__PURE__ */ jsxs6("div", { className: "space-y-1", children: [
|
|
1589
1628
|
/* @__PURE__ */ jsxs6("div", { className: "flex items-center justify-between gap-3 border-t border-slate-800 pt-1", children: [
|
|
@@ -2440,7 +2479,6 @@ function ChatInput({
|
|
|
2440
2479
|
const [isEditorFocused, setIsEditorFocused] = useState6(false);
|
|
2441
2480
|
const [oversizedFiles, setOversizedFiles] = useState6([]);
|
|
2442
2481
|
const [selectedModel, setSelectedModel] = useState6("");
|
|
2443
|
-
const { defaultModel } = useModelConfig();
|
|
2444
2482
|
const { setPreferredModel } = usePreferredModel();
|
|
2445
2483
|
const queryClient = useQueryClient2();
|
|
2446
2484
|
const actionMenuRef = useRef4(null);
|
|
@@ -2450,7 +2488,7 @@ function ChatInput({
|
|
|
2450
2488
|
const localImageUrlsRef = useRef4(/* @__PURE__ */ new Map());
|
|
2451
2489
|
const activeSessionId = useSessionStore((state) => state.activeSessionId);
|
|
2452
2490
|
const sessions = useSessionStore((state) => state.sessions);
|
|
2453
|
-
const activeSessionModel =
|
|
2491
|
+
const activeSessionModel = useMemo7(
|
|
2454
2492
|
() => sessions.find((session) => session.id === activeSessionId)?.model ?? null,
|
|
2455
2493
|
[activeSessionId, sessions]
|
|
2456
2494
|
);
|
|
@@ -2465,9 +2503,10 @@ function ChatInput({
|
|
|
2465
2503
|
const draftAppends = useUiBridgeStore(
|
|
2466
2504
|
(state) => activeSessionId ? state.draftAppends[activeSessionId] : void 0
|
|
2467
2505
|
);
|
|
2506
|
+
const { resolvedModel } = useResolvedModel(activeSessionModel);
|
|
2468
2507
|
useEffect7(() => {
|
|
2469
|
-
setSelectedModel(
|
|
2470
|
-
}, [
|
|
2508
|
+
setSelectedModel(resolvedModel);
|
|
2509
|
+
}, [resolvedModel]);
|
|
2471
2510
|
const sendRequests = useUiBridgeStore(
|
|
2472
2511
|
(state) => activeSessionId ? state.sendRequests[activeSessionId] : void 0
|
|
2473
2512
|
);
|
|
@@ -3458,13 +3497,13 @@ import {
|
|
|
3458
3497
|
useCallback as useCallback12,
|
|
3459
3498
|
useEffect as useEffect16,
|
|
3460
3499
|
useEffectEvent as useEffectEvent4,
|
|
3461
|
-
useMemo as
|
|
3500
|
+
useMemo as useMemo17,
|
|
3462
3501
|
useRef as useRef11,
|
|
3463
3502
|
useState as useState19
|
|
3464
3503
|
} from "react";
|
|
3465
3504
|
|
|
3466
3505
|
// ../../node_modules/.pnpm/use-stick-to-bottom@1.1.3_react@19.2.4/node_modules/use-stick-to-bottom/dist/useStickToBottom.js
|
|
3467
|
-
import { useCallback as useCallback7, useMemo as
|
|
3506
|
+
import { useCallback as useCallback7, useMemo as useMemo8, useRef as useRef5, useState as useState7 } from "react";
|
|
3468
3507
|
var DEFAULT_SPRING_ANIMATION = {
|
|
3469
3508
|
/**
|
|
3470
3509
|
* A value from 0 to 1, on how much to damp the animation.
|
|
@@ -3525,7 +3564,7 @@ var useStickToBottom = (options = {}) => {
|
|
|
3525
3564
|
state.escapedFromLock = escapedFromLock2;
|
|
3526
3565
|
updateEscapedFromLock(escapedFromLock2);
|
|
3527
3566
|
}, []);
|
|
3528
|
-
const state =
|
|
3567
|
+
const state = useMemo8(() => {
|
|
3529
3568
|
let lastCalculation;
|
|
3530
3569
|
return {
|
|
3531
3570
|
escapedFromLock,
|
|
@@ -3808,7 +3847,7 @@ function mergeAnimations(...animations) {
|
|
|
3808
3847
|
|
|
3809
3848
|
// ../../node_modules/.pnpm/use-stick-to-bottom@1.1.3_react@19.2.4/node_modules/use-stick-to-bottom/dist/StickToBottom.js
|
|
3810
3849
|
import * as React from "react";
|
|
3811
|
-
import { createContext, useContext, useEffect as useEffect8, useImperativeHandle as useImperativeHandle3, useLayoutEffect, useMemo as
|
|
3850
|
+
import { createContext, useContext, useEffect as useEffect8, useImperativeHandle as useImperativeHandle3, useLayoutEffect, useMemo as useMemo9, useRef as useRef6 } from "react";
|
|
3812
3851
|
var StickToBottomContext = createContext(null);
|
|
3813
3852
|
var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect8;
|
|
3814
3853
|
function StickToBottom({ instance, children, resize, initial, mass, damping, stiffness, targetScrollTop: currentTargetScrollTop, contextRef, ...props }) {
|
|
@@ -3826,7 +3865,7 @@ function StickToBottom({ instance, children, resize, initial, mass, damping, sti
|
|
|
3826
3865
|
targetScrollTop
|
|
3827
3866
|
});
|
|
3828
3867
|
const { scrollRef, contentRef, scrollToBottom, stopScroll, isAtBottom, escapedFromLock, state } = instance ?? defaultInstance;
|
|
3829
|
-
const context =
|
|
3868
|
+
const context = useMemo9(() => ({
|
|
3830
3869
|
scrollToBottom,
|
|
3831
3870
|
stopScroll,
|
|
3832
3871
|
scrollRef,
|
|
@@ -3889,7 +3928,7 @@ function useStickToBottomContext() {
|
|
|
3889
3928
|
|
|
3890
3929
|
// src/react/components/chat/AssistantTurnBlock.tsx
|
|
3891
3930
|
import { AlertCircle, BookOpen, Check as Check4, ChevronRight as ChevronRight5 } from "lucide-react";
|
|
3892
|
-
import { useCallback as useCallback11, useEffect as useEffect14, useMemo as
|
|
3931
|
+
import { useCallback as useCallback11, useEffect as useEffect14, useMemo as useMemo15, useRef as useRef10, useState as useState16 } from "react";
|
|
3893
3932
|
|
|
3894
3933
|
// src/react/routes.ts
|
|
3895
3934
|
var MEMORIES_ROUTE = "/memories";
|
|
@@ -3906,7 +3945,7 @@ import {
|
|
|
3906
3945
|
useCallback as useCallback9,
|
|
3907
3946
|
useContext as useContext2,
|
|
3908
3947
|
useEffect as useEffect9,
|
|
3909
|
-
useMemo as
|
|
3948
|
+
useMemo as useMemo11,
|
|
3910
3949
|
useRef as useRef7,
|
|
3911
3950
|
useState as useState8
|
|
3912
3951
|
} from "react";
|
|
@@ -3915,7 +3954,7 @@ import { Streamdown } from "streamdown";
|
|
|
3915
3954
|
|
|
3916
3955
|
// src/react/components/ai-elements/shimmer.tsx
|
|
3917
3956
|
import { motion } from "motion/react";
|
|
3918
|
-
import { memo, useMemo as
|
|
3957
|
+
import { memo, useMemo as useMemo10 } from "react";
|
|
3919
3958
|
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
3920
3959
|
var motionComponentCache = /* @__PURE__ */ new Map();
|
|
3921
3960
|
var getMotionComponent = (element) => {
|
|
@@ -3936,7 +3975,7 @@ var ShimmerComponent = ({
|
|
|
3936
3975
|
const MotionComponent = getMotionComponent(
|
|
3937
3976
|
Component2
|
|
3938
3977
|
);
|
|
3939
|
-
const dynamicSpread =
|
|
3978
|
+
const dynamicSpread = useMemo10(
|
|
3940
3979
|
() => (children?.length ?? 0) * spread,
|
|
3941
3980
|
[children, spread]
|
|
3942
3981
|
);
|
|
@@ -4033,7 +4072,7 @@ var Reasoning = memo2(
|
|
|
4033
4072
|
},
|
|
4034
4073
|
[setIsOpen]
|
|
4035
4074
|
);
|
|
4036
|
-
const contextValue =
|
|
4075
|
+
const contextValue = useMemo11(
|
|
4037
4076
|
() => ({ duration, isOpen, isStreaming, setIsOpen }),
|
|
4038
4077
|
[duration, isOpen, isStreaming, setIsOpen]
|
|
4039
4078
|
);
|
|
@@ -4193,7 +4232,7 @@ ReasoningContent.displayName = "ReasoningContent";
|
|
|
4193
4232
|
|
|
4194
4233
|
// src/react/components/chat/AgentLoopBlock.tsx
|
|
4195
4234
|
import { Bot, Check as Check3, ChevronRight as ChevronRight4, FileText as FileText5, Loader2 as Loader24, MessageSquareMore as MessageSquareMore2 } from "lucide-react";
|
|
4196
|
-
import { useEffect as useEffect13, useMemo as
|
|
4235
|
+
import { useEffect as useEffect13, useMemo as useMemo14, useState as useState15 } from "react";
|
|
4197
4236
|
|
|
4198
4237
|
// src/react/components/chat/ResourceIframe.tsx
|
|
4199
4238
|
import { useEffect as useEffect10, useEffectEvent as useEffectEvent3, useRef as useRef8, useState as useState9 } from "react";
|
|
@@ -4325,30 +4364,10 @@ function ResourceIframe({ ui, sessionId }) {
|
|
|
4325
4364
|
|
|
4326
4365
|
// src/react/components/chat/ToolCallBlock.tsx
|
|
4327
4366
|
import { Check, ChevronRight as ChevronRight3, Loader2 as Loader23, MessageSquareMore, PanelRightOpen, X as X4 } from "lucide-react";
|
|
4328
|
-
import { useMemo as
|
|
4367
|
+
import { useMemo as useMemo12, useState as useState12 } from "react";
|
|
4329
4368
|
|
|
4330
4369
|
// src/react/components/chat/tool-renderers/shared.tsx
|
|
4331
4370
|
import { jsx as jsx13 } from "react/jsx-runtime";
|
|
4332
|
-
var EXT_TO_LANG = {
|
|
4333
|
-
".bash": "bash",
|
|
4334
|
-
".css": "css",
|
|
4335
|
-
".go": "go",
|
|
4336
|
-
".htm": "html",
|
|
4337
|
-
".html": "html",
|
|
4338
|
-
".js": "javascript",
|
|
4339
|
-
".json": "json",
|
|
4340
|
-
".jsx": "jsx",
|
|
4341
|
-
".md": "markdown",
|
|
4342
|
-
".py": "python",
|
|
4343
|
-
".rs": "rust",
|
|
4344
|
-
".scss": "css",
|
|
4345
|
-
".sh": "bash",
|
|
4346
|
-
".ts": "typescript",
|
|
4347
|
-
".tsx": "tsx",
|
|
4348
|
-
".yaml": "yaml",
|
|
4349
|
-
".yml": "yaml",
|
|
4350
|
-
".zsh": "bash"
|
|
4351
|
-
};
|
|
4352
4371
|
function getResultText(result) {
|
|
4353
4372
|
if (typeof result === "string") return result;
|
|
4354
4373
|
if (Array.isArray(result)) {
|
|
@@ -4399,10 +4418,7 @@ function getFileName(filePath) {
|
|
|
4399
4418
|
return filePath.split("/").pop() ?? filePath;
|
|
4400
4419
|
}
|
|
4401
4420
|
function getCodeLanguage(filePath) {
|
|
4402
|
-
|
|
4403
|
-
const dotIndex = filePath.lastIndexOf(".");
|
|
4404
|
-
if (dotIndex < 0) return null;
|
|
4405
|
-
return EXT_TO_LANG[filePath.slice(dotIndex).toLowerCase()] ?? null;
|
|
4421
|
+
return getCodeLanguageFromFilename(filePath);
|
|
4406
4422
|
}
|
|
4407
4423
|
function formatBytes(size) {
|
|
4408
4424
|
if (typeof size !== "number" || !Number.isFinite(size) || size < 0) return null;
|
|
@@ -5290,7 +5306,7 @@ function ToolCallBlock({
|
|
|
5290
5306
|
const resolvedAnswerData = answerData ?? storedAnswerData;
|
|
5291
5307
|
const resolvedAnswered = answered ?? (!!resolvedAnswerData && resolvedSessionStatus !== "waiting_for_input");
|
|
5292
5308
|
const resolvedOnAnswer = onAnswer ?? answerCallback;
|
|
5293
|
-
const uiMeta =
|
|
5309
|
+
const uiMeta = useMemo12(() => {
|
|
5294
5310
|
const block = turnBlocks?.find(
|
|
5295
5311
|
(item) => item.type === "tool_ui" && item.tool_call_id === toolCall.id && isUiMeta(item.content)
|
|
5296
5312
|
);
|
|
@@ -5884,14 +5900,14 @@ function TextAttachmentPills({ attachments, onPreview }) {
|
|
|
5884
5900
|
import { RefreshCcw } from "lucide-react";
|
|
5885
5901
|
|
|
5886
5902
|
// src/react/components/chat/whatif-quote-context.tsx
|
|
5887
|
-
import { createContext as createContext3, useContext as useContext3, useMemo as
|
|
5903
|
+
import { createContext as createContext3, useContext as useContext3, useMemo as useMemo13 } from "react";
|
|
5888
5904
|
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
5889
5905
|
var WhatIfQuoteContext = createContext3({});
|
|
5890
5906
|
function WhatIfQuoteProvider({
|
|
5891
5907
|
onJumpToStep,
|
|
5892
5908
|
children
|
|
5893
5909
|
}) {
|
|
5894
|
-
const value =
|
|
5910
|
+
const value = useMemo13(() => ({ onJumpToStep }), [onJumpToStep]);
|
|
5895
5911
|
return /* @__PURE__ */ jsx25(WhatIfQuoteContext.Provider, { value, children });
|
|
5896
5912
|
}
|
|
5897
5913
|
function useWhatIfQuoteContext() {
|
|
@@ -6148,7 +6164,7 @@ function stripFileExtension(fileName) {
|
|
|
6148
6164
|
function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
|
|
6149
6165
|
const agentLoops = useChatStore((state) => state.agentLoops[sessionId] ?? EMPTY_AGENT_LOOPS);
|
|
6150
6166
|
const messages = useChatStore((state) => state.messages[sessionId] ?? EMPTY_MESSAGES2);
|
|
6151
|
-
const loopEntry =
|
|
6167
|
+
const loopEntry = useMemo14(() => {
|
|
6152
6168
|
for (const [loopName, info] of Object.entries(agentLoops)) {
|
|
6153
6169
|
if (info.toolCallId === toolCall.id) {
|
|
6154
6170
|
return { loopName, info };
|
|
@@ -6156,24 +6172,24 @@ function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
|
|
|
6156
6172
|
}
|
|
6157
6173
|
return null;
|
|
6158
6174
|
}, [agentLoops, toolCall.id]);
|
|
6159
|
-
const childMessages =
|
|
6175
|
+
const childMessages = useMemo14(() => {
|
|
6160
6176
|
if (!loopEntry) return [];
|
|
6161
6177
|
return messages.filter((message) => (message.loop_name ?? "root") === loopEntry.loopName);
|
|
6162
6178
|
}, [loopEntry, messages]);
|
|
6163
|
-
const loopToolCalls =
|
|
6179
|
+
const loopToolCalls = useMemo14(
|
|
6164
6180
|
() => childMessages.flatMap((message) => message.tool_calls ?? []),
|
|
6165
6181
|
[childMessages]
|
|
6166
6182
|
);
|
|
6167
|
-
const visibleLoopToolCalls =
|
|
6183
|
+
const visibleLoopToolCalls = useMemo14(
|
|
6168
6184
|
() => loopToolCalls.filter((childToolCall) => formatToolName(childToolCall.name) !== "Agent"),
|
|
6169
6185
|
[loopToolCalls]
|
|
6170
6186
|
);
|
|
6171
|
-
const hasAwaitingAnswer =
|
|
6187
|
+
const hasAwaitingAnswer = useMemo14(
|
|
6172
6188
|
() => visibleLoopToolCalls.some((childToolCall) => childToolCall.status === "awaiting_answer"),
|
|
6173
6189
|
[visibleLoopToolCalls]
|
|
6174
6190
|
);
|
|
6175
6191
|
const [expanded, setExpanded] = useState15(hasAwaitingAnswer);
|
|
6176
|
-
const completedToolLabels =
|
|
6192
|
+
const completedToolLabels = useMemo14(
|
|
6177
6193
|
() => visibleLoopToolCalls.flatMap((childToolCall) => {
|
|
6178
6194
|
const isCompleted = childToolCall.status === "done" || childToolCall.status !== "pending" && childToolCall.status !== "awaiting_answer" && childToolCall.status !== "error" && childToolCall.status !== "cancelled";
|
|
6179
6195
|
if (!isCompleted) return [];
|
|
@@ -6201,7 +6217,7 @@ function AgentLoopBlock({ toolCall, sessionId, reasoning }) {
|
|
|
6201
6217
|
}),
|
|
6202
6218
|
[visibleLoopToolCalls]
|
|
6203
6219
|
);
|
|
6204
|
-
const inlineToolUiBlocks =
|
|
6220
|
+
const inlineToolUiBlocks = useMemo14(
|
|
6205
6221
|
() => childMessages.flatMap(
|
|
6206
6222
|
(message) => (message.blocks ?? []).flatMap(
|
|
6207
6223
|
(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 }] : []
|
|
@@ -6662,8 +6678,8 @@ function AssistantTurnBlock({
|
|
|
6662
6678
|
customization
|
|
6663
6679
|
}) {
|
|
6664
6680
|
const messages = Array.isArray(rawMessages) ? rawMessages : [];
|
|
6665
|
-
const allToolCalls =
|
|
6666
|
-
const hasActionableToolCall =
|
|
6681
|
+
const allToolCalls = useMemo15(() => messages.flatMap((m) => m.tool_calls ?? []), [messages]);
|
|
6682
|
+
const hasActionableToolCall = useMemo15(
|
|
6667
6683
|
() => allToolCalls.some(
|
|
6668
6684
|
(tc) => tc.status === "error" || tc.status === "cancelled" || formatToolName(tc.name) === "AskUserQuestion" && tc.status === "awaiting_answer"
|
|
6669
6685
|
),
|
|
@@ -6681,12 +6697,12 @@ function AssistantTurnBlock({
|
|
|
6681
6697
|
}, [forceExpanded, isStreaming]);
|
|
6682
6698
|
const sessionMessages = useChatStore((state) => state.messages[sessionId] ?? []);
|
|
6683
6699
|
const agentLoops = useChatStore((state) => state.agentLoops[sessionId] ?? {});
|
|
6684
|
-
const turnMessages =
|
|
6700
|
+
const turnMessages = useMemo15(
|
|
6685
6701
|
() => collectTurnMessages({ rootMessages: messages, sessionMessages, agentLoops }),
|
|
6686
6702
|
[agentLoops, messages, sessionMessages]
|
|
6687
6703
|
);
|
|
6688
|
-
const resourceBlocks =
|
|
6689
|
-
const finalMessage =
|
|
6704
|
+
const resourceBlocks = useMemo15(() => getInlineResourceBlocks(turnMessages), [turnMessages]);
|
|
6705
|
+
const finalMessage = useMemo15(() => getLastTextMessage(turnMessages), [turnMessages]);
|
|
6690
6706
|
const hasInterruptedState = messages.some((message) => message.status === "interrupted");
|
|
6691
6707
|
const effectiveMode = isStreaming ? "detail" : displayMode === "compact" && hasActionableToolCall ? "detail" : displayMode;
|
|
6692
6708
|
const memoryRefs = Array.isArray(messages[0]?.memory_refs) ? messages[0].memory_refs : [];
|
|
@@ -7042,7 +7058,7 @@ function AssistantText({
|
|
|
7042
7058
|
},
|
|
7043
7059
|
[sessionId]
|
|
7044
7060
|
);
|
|
7045
|
-
const cardCtx =
|
|
7061
|
+
const cardCtx = useMemo15(
|
|
7046
7062
|
() => ({ sessionId, messageId, sendMessage }),
|
|
7047
7063
|
[sessionId, messageId, sendMessage]
|
|
7048
7064
|
);
|
|
@@ -7331,7 +7347,7 @@ import {
|
|
|
7331
7347
|
TerminalSquare,
|
|
7332
7348
|
WandSparkles
|
|
7333
7349
|
} from "lucide-react";
|
|
7334
|
-
import { useEffect as useEffect15, useMemo as
|
|
7350
|
+
import { useEffect as useEffect15, useMemo as useMemo16, useState as useState18 } from "react";
|
|
7335
7351
|
import { jsx as jsx32, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
7336
7352
|
var EMPTY_EVENTS = [];
|
|
7337
7353
|
function formatElapsedDuration(durationMs) {
|
|
@@ -7434,9 +7450,9 @@ function StickyStatusBar({
|
|
|
7434
7450
|
onJumpToLatest
|
|
7435
7451
|
}) {
|
|
7436
7452
|
const events = useRuntimeStore((state) => state.events[sessionId] ?? EMPTY_EVENTS);
|
|
7437
|
-
const startedAt =
|
|
7453
|
+
const startedAt = useMemo16(() => getTurnStartedAt(events), [events]);
|
|
7438
7454
|
const elapsedDuration = useElapsedDuration(startedAt, isStreaming && isLastTurn);
|
|
7439
|
-
const action =
|
|
7455
|
+
const action = useMemo16(() => getCurrentAction(messages), [messages]);
|
|
7440
7456
|
if (!isStreaming || !isLastTurn) {
|
|
7441
7457
|
return null;
|
|
7442
7458
|
}
|
|
@@ -7612,8 +7628,8 @@ function MessageList({
|
|
|
7612
7628
|
const messages = Array.isArray(rawMessages) ? rawMessages : [];
|
|
7613
7629
|
const agentLoops = useChatStore((state) => state.agentLoops[sessionId]);
|
|
7614
7630
|
const askAnswers = useChatStore((state) => state.askAnswers[sessionId]);
|
|
7615
|
-
const agentLoopNameSet =
|
|
7616
|
-
const renderBlocks =
|
|
7631
|
+
const agentLoopNameSet = useMemo17(() => new Set(Object.keys(agentLoops ?? {})), [agentLoops]);
|
|
7632
|
+
const renderBlocks = useMemo17(() => {
|
|
7617
7633
|
const visible = messages.filter((message) => {
|
|
7618
7634
|
const loopName = message.loop_name ?? "root";
|
|
7619
7635
|
if (loopName !== "root") return false;
|
|
@@ -7678,13 +7694,13 @@ function MessageList({
|
|
|
7678
7694
|
flushAssistant();
|
|
7679
7695
|
return blocks;
|
|
7680
7696
|
}, [agentLoopNameSet, messages]);
|
|
7681
|
-
const hasInterruptedTurn =
|
|
7697
|
+
const hasInterruptedTurn = useMemo17(
|
|
7682
7698
|
() => renderBlocks.some(
|
|
7683
7699
|
(block) => block.type === "assistant_turn" && block.messages.some((message) => message.status === "interrupted")
|
|
7684
7700
|
),
|
|
7685
7701
|
[renderBlocks]
|
|
7686
7702
|
);
|
|
7687
|
-
const lastTurnId =
|
|
7703
|
+
const lastTurnId = useMemo17(() => {
|
|
7688
7704
|
for (let index = renderBlocks.length - 1; index >= 0; index -= 1) {
|
|
7689
7705
|
const block = renderBlocks[index];
|
|
7690
7706
|
if (block.type === "assistant_turn") return block.anchorId;
|
|
@@ -7692,14 +7708,14 @@ function MessageList({
|
|
|
7692
7708
|
}
|
|
7693
7709
|
return null;
|
|
7694
7710
|
}, [renderBlocks]);
|
|
7695
|
-
const turnNavItems =
|
|
7711
|
+
const turnNavItems = useMemo17(
|
|
7696
7712
|
() => renderBlocks.filter((block) => block.type === "assistant_turn").map((block) => ({
|
|
7697
7713
|
id: block.anchorId,
|
|
7698
7714
|
title: block.railTitle
|
|
7699
7715
|
})),
|
|
7700
7716
|
[renderBlocks]
|
|
7701
7717
|
);
|
|
7702
|
-
const stickyTurn =
|
|
7718
|
+
const stickyTurn = useMemo17(
|
|
7703
7719
|
() => renderBlocks.find(
|
|
7704
7720
|
(block) => block.type === "assistant_turn" && block.anchorId === lastTurnId && block.isStreaming
|
|
7705
7721
|
) ?? null,
|
|
@@ -7709,7 +7725,7 @@ function MessageList({
|
|
|
7709
7725
|
const scrollContainerRef = useRef11(null);
|
|
7710
7726
|
const frameRef = useRef11(null);
|
|
7711
7727
|
const [activeTurnId, setActiveTurnId] = useState19(lastTurnId);
|
|
7712
|
-
const layoutSignature =
|
|
7728
|
+
const layoutSignature = useMemo17(
|
|
7713
7729
|
() => getMessagesMeasureSignature(messages),
|
|
7714
7730
|
[messages]
|
|
7715
7731
|
);
|
|
@@ -8079,6 +8095,7 @@ export {
|
|
|
8079
8095
|
useInputHistory,
|
|
8080
8096
|
useModelConfig,
|
|
8081
8097
|
usePreferredModel,
|
|
8098
|
+
useResolvedModel,
|
|
8082
8099
|
buildVoiceInputUnavailableError,
|
|
8083
8100
|
useVoiceInput,
|
|
8084
8101
|
useTiptapVoiceInput,
|
|
@@ -8121,4 +8138,4 @@ use-stick-to-bottom/dist/StickToBottom.js:
|
|
|
8121
8138
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
8122
8139
|
*--------------------------------------------------------------------------------------------*)
|
|
8123
8140
|
*/
|
|
8124
|
-
//# sourceMappingURL=chunk-
|
|
8141
|
+
//# sourceMappingURL=chunk-TYCA6WYX.js.map
|