@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.
Files changed (39) hide show
  1. package/dist/{SkillStatusBar-DQyipdzn.d.ts → SkillStatusBar-BnDtYUf9.d.ts} +2 -2
  2. package/dist/{blade-client-nOsdVlb1.d.ts → blade-client-n7fiBaFk.d.ts} +60 -2
  3. package/dist/{chunk-I3FFV63W.js → chunk-5ZFK62RQ.js} +2 -2
  4. package/dist/{chunk-OKQWPNE3.js → chunk-C3KSHIRA.js} +86 -5
  5. package/dist/chunk-C3KSHIRA.js.map +1 -0
  6. package/dist/{chunk-X6MEYCU7.js → chunk-CK7JMN5S.js} +228 -82
  7. package/dist/chunk-CK7JMN5S.js.map +1 -0
  8. package/dist/{chunk-4VWLTG5L.js → chunk-EDMS2G5P.js} +88 -17
  9. package/dist/chunk-EDMS2G5P.js.map +1 -0
  10. package/dist/{chunk-TC5BBLWO.js → chunk-EFNGK46B.js} +2 -2
  11. package/dist/{chunk-VD4CKRMT.js → chunk-FYPS4SFF.js} +2 -2
  12. package/dist/{chunk-CGOQI7ZL.js → chunk-TYCA6WYX.js} +98 -81
  13. package/dist/chunk-TYCA6WYX.js.map +1 -0
  14. package/dist/client/index.d.ts +395 -29
  15. package/dist/client/index.js +1 -1
  16. package/dist/{licenses-Cxl1xGVy.d.ts → licenses-BZpFl0qG.d.ts} +1 -1
  17. package/dist/react/api/licenses.d.ts +3 -3
  18. package/dist/react/api/licenses.js +3 -3
  19. package/dist/react/api/vibe-coding.d.ts +3 -3
  20. package/dist/react/api/vibe-coding.js +2 -2
  21. package/dist/react/components/chat/index.d.ts +4 -4
  22. package/dist/react/components/chat/index.js +5 -5
  23. package/dist/react/components/plan/index.js +3 -3
  24. package/dist/react/components/session/index.d.ts +1 -1
  25. package/dist/react/components/session/index.js +3 -3
  26. package/dist/react/components/workspace/index.js +3 -3
  27. package/dist/react/index.d.ts +64 -12
  28. package/dist/react/index.js +100 -63
  29. package/dist/react/index.js.map +1 -1
  30. package/dist/{session-CDeiO81j.d.ts → session-BKOc2lsz.d.ts} +9 -1
  31. package/dist/style.css +1 -1
  32. package/package.json +2 -1
  33. package/dist/chunk-4VWLTG5L.js.map +0 -1
  34. package/dist/chunk-CGOQI7ZL.js.map +0 -1
  35. package/dist/chunk-OKQWPNE3.js.map +0 -1
  36. package/dist/chunk-X6MEYCU7.js.map +0 -1
  37. /package/dist/{chunk-I3FFV63W.js.map → chunk-5ZFK62RQ.js.map} +0 -0
  38. /package/dist/{chunk-TC5BBLWO.js.map → chunk-EFNGK46B.js.map} +0 -0
  39. /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-VD4CKRMT.js";
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-X6MEYCU7.js";
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-4VWLTG5L.js";
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-OKQWPNE3.js";
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 useMemo6,
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() || defaultModel || "\u672A\u8FDE\u63A5\u5230\u6A21\u578B";
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 useMemo3, useState as useState4 } from "react";
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 } = useMemo3(() => parseSuggestionQuery(query), [query]);
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 = useMemo3(() => filterEntries(items, filterQuery), [filterQuery, items]);
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 useMemo5 } from "react";
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 useMemo4 } from "react";
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 useMemo4(() => {
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 = useMemo5(
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 = useMemo5(() => {
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 = useMemo6(
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(activeSessionModel || defaultModel);
2470
- }, [activeSessionModel, defaultModel]);
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 useMemo16,
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 useMemo7, useRef as useRef5, useState as useState7 } from "react";
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 = useMemo7(() => {
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 useMemo8, useRef as useRef6 } from "react";
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 = useMemo8(() => ({
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 useMemo14, useRef as useRef10, useState as useState16 } from "react";
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 useMemo10,
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 useMemo9 } from "react";
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 = useMemo9(
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 = useMemo10(
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 useMemo13, useState as useState15 } from "react";
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 useMemo11, useState as useState12 } from "react";
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
- if (!filePath) return null;
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 = useMemo11(() => {
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 useMemo12 } from "react";
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 = useMemo12(() => ({ onJumpToStep }), [onJumpToStep]);
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 = useMemo13(() => {
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 = useMemo13(() => {
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 = useMemo13(
6179
+ const loopToolCalls = useMemo14(
6164
6180
  () => childMessages.flatMap((message) => message.tool_calls ?? []),
6165
6181
  [childMessages]
6166
6182
  );
6167
- const visibleLoopToolCalls = useMemo13(
6183
+ const visibleLoopToolCalls = useMemo14(
6168
6184
  () => loopToolCalls.filter((childToolCall) => formatToolName(childToolCall.name) !== "Agent"),
6169
6185
  [loopToolCalls]
6170
6186
  );
6171
- const hasAwaitingAnswer = useMemo13(
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 = useMemo13(
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 = useMemo13(
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 = useMemo14(() => messages.flatMap((m) => m.tool_calls ?? []), [messages]);
6666
- const hasActionableToolCall = useMemo14(
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 = useMemo14(
6700
+ const turnMessages = useMemo15(
6685
6701
  () => collectTurnMessages({ rootMessages: messages, sessionMessages, agentLoops }),
6686
6702
  [agentLoops, messages, sessionMessages]
6687
6703
  );
6688
- const resourceBlocks = useMemo14(() => getInlineResourceBlocks(turnMessages), [turnMessages]);
6689
- const finalMessage = useMemo14(() => getLastTextMessage(turnMessages), [turnMessages]);
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 = useMemo14(
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 useMemo15, useState as useState18 } from "react";
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 = useMemo15(() => getTurnStartedAt(events), [events]);
7453
+ const startedAt = useMemo16(() => getTurnStartedAt(events), [events]);
7438
7454
  const elapsedDuration = useElapsedDuration(startedAt, isStreaming && isLastTurn);
7439
- const action = useMemo15(() => getCurrentAction(messages), [messages]);
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 = useMemo16(() => new Set(Object.keys(agentLoops ?? {})), [agentLoops]);
7616
- const renderBlocks = useMemo16(() => {
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 = useMemo16(
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 = useMemo16(() => {
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 = useMemo16(
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 = useMemo16(
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 = useMemo16(
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-CGOQI7ZL.js.map
8141
+ //# sourceMappingURL=chunk-TYCA6WYX.js.map