@qredence/fleet 0.5.10 → 0.5.11

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 (103) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/web/client/assets/agent-activity-CwMDU7aP.js +1 -0
  3. package/dist/web/client/assets/artifacts-panel-CQmFEF_H.js +1 -0
  4. package/dist/web/client/assets/{chat-command-palette-DfYSPPXI.js → chat-command-palette-CmHTS3rs.js} +1 -1
  5. package/dist/web/client/assets/{chat-C8XDWWXz.js → chat-yh02zgA7.js} +1 -1
  6. package/dist/web/client/assets/{citations-BQ_pr_9_.js → citations-C_tPOJE_.js} +1 -1
  7. package/dist/web/client/assets/{fleet-message-queue-zWM5-y18.js → fleet-message-queue-DUz6Hfrf.js} +1 -1
  8. package/dist/web/client/assets/{fleet-pi-tool-renderer-AJoMbXBa.js → fleet-pi-tool-renderer-BEDIO3al.js} +4 -4
  9. package/dist/web/client/assets/fleet-reasoning-panel-CbkO7u-v.js +1 -0
  10. package/dist/web/client/assets/{fleet-subagent-list-BnRnrWKS.js → fleet-subagent-list-iKUtLJKZ.js} +1 -1
  11. package/dist/web/client/assets/fleet-tool-timeline-C8heL7ae.js +1 -0
  12. package/dist/web/client/assets/{fork-picker-dialog-CkcSekBl.js → fork-picker-dialog-ByBOGVsa.js} +1 -1
  13. package/dist/web/client/assets/globals-B_I1Eq1u.css +2 -0
  14. package/dist/web/client/assets/horizontal-resize-qK6eRhIG.js +1 -0
  15. package/dist/web/client/assets/{index-DlnHLDpx.js → index-C1zOjrMK.js} +3 -3
  16. package/dist/web/client/assets/{ipython-tool-BrMePqD-.js → ipython-tool-ldJ9F1Cw.js} +1 -1
  17. package/dist/web/client/assets/model-selector-list-DsKTuAgS.js +1 -0
  18. package/dist/web/client/assets/{openui-renderer-DwYFJdbe.js → openui-renderer-J3dhPpL4.js} +5 -5
  19. package/dist/web/client/assets/prompt-input-qPIXZ-Rb.js +1 -0
  20. package/dist/web/client/assets/prompt-suggestions-Cc--lSNR.js +1 -0
  21. package/dist/web/client/assets/{provider-label-BCJh04J5.js → provider-label-Dpr7djG9.js} +1 -1
  22. package/dist/web/client/assets/repl-panel-DsPX04Xr.js +1 -0
  23. package/dist/web/client/assets/{resources-panel-Bo8dfUdm.js → resources-panel-D867-goy.js} +1 -1
  24. package/dist/web/client/assets/right-panel-registry-DewpBWHM.js +2 -0
  25. package/dist/web/client/assets/routes-vNkVToAF.js +16 -0
  26. package/dist/web/client/assets/safe-storage-s25GrfpH.js +1 -0
  27. package/dist/web/client/assets/session-insights-panel-YnaXvTpi.js +1 -0
  28. package/dist/web/client/assets/settings-dialog-B-v4me3Y.js +1 -0
  29. package/dist/web/client/assets/skeleton-loaders-C9vHwAYV.js +1 -0
  30. package/dist/web/client/assets/{subagent-chat-panel-DseoO31p.js → subagent-chat-panel-DkVUumrP.js} +1 -1
  31. package/dist/web/client/assets/subagent-transcript-D8wmQxXe.js +1 -0
  32. package/dist/web/client/assets/subagents-panel-BMp2Ego0.js +1 -0
  33. package/dist/web/client/assets/{surfaces-cW-gp56p.js → surfaces-DI-U-_2a.js} +1 -1
  34. package/dist/web/client/assets/tool-result-DfnPN0FQ.js +4 -0
  35. package/dist/web/client/assets/ui-preferences-CImQGZm_.js +1 -0
  36. package/dist/web/client/assets/virtualized-turn-list-DMJENRY0.js +6 -0
  37. package/dist/web/client/assets/{workspace-panel-DI1W3ce9.js → workspace-panel-G6yMpKJ8.js} +1 -1
  38. package/dist/web/client/bundle-budget.json +6 -6
  39. package/dist/web/server/{_tanstack-start-manifest_v-Cdx6hy2i-I7A5YJRU.js → _tanstack-start-manifest_v-po4woX6g-AUGCOEZ2.js} +14 -13
  40. package/dist/web/server/{agent-activity-B-JMvecd-SLE3GGY2.js → agent-activity-CS2rbF_C-A3R26CYH.js} +2 -2
  41. package/dist/web/server/{artifacts-panel-DLMK1O8P-42T45JMA.js → artifacts-panel-8GGUCtOd-X5TNKTY2.js} +12 -12
  42. package/dist/web/server/{chat-command-palette-CdYwoTMe-4LBAZF7K.js → chat-command-palette-Dgl5tqWn-72LLEWUD.js} +2 -2
  43. package/dist/web/server/{chunk-K5ESTT4A.js → chunk-7MDZVLIY.js} +11 -3
  44. package/dist/web/server/{chunk-EBCYJSBR.js → chunk-7SD2ZSEA.js} +3 -3
  45. package/dist/web/server/{chunk-M564UIEY.js → chunk-ABBWBBSS.js} +8 -8
  46. package/dist/web/server/{chunk-KNJUSMBT.js → chunk-BXWAUTTH.js} +2 -2
  47. package/dist/web/server/{chunk-54II5QXQ.js → chunk-ETTDO4UO.js} +6 -3
  48. package/dist/web/server/{chunk-EHNIN245.js → chunk-GETSIVNU.js} +5 -5
  49. package/dist/web/server/{chunk-NRDG2ISJ.js → chunk-GGT2ZKDB.js} +49 -49
  50. package/dist/web/server/{chunk-X2R5YPQZ.js → chunk-IJPCV6DH.js} +3 -2
  51. package/dist/web/server/{chunk-AJJ2S5FF.js → chunk-JQDLJ7KI.js} +20 -20
  52. package/dist/web/server/{chunk-VHBFU4TG.js → chunk-JUROEEWM.js} +43 -14
  53. package/dist/web/server/{chunk-TCH3U26B.js → chunk-MIW4LJTV.js} +2 -2
  54. package/dist/web/server/{chunk-2TRF62K5.js → chunk-N6NOTURM.js} +3 -3
  55. package/dist/web/server/{chunk-5XX7RKJ6.js → chunk-NXJ32VFR.js} +5 -5
  56. package/dist/web/server/{chunk-EOVMHQ2H.js → chunk-O4OTWWPF.js} +7 -7
  57. package/dist/web/server/{chunk-OB5OSYJK.js → chunk-RNOJACWQ.js} +53 -29
  58. package/dist/web/server/chunk-SZJUXVWG.js +40 -0
  59. package/dist/web/server/{chunk-6AW2XFTZ.js → chunk-WILCIZYU.js} +194 -10
  60. package/dist/web/server/{chunk-FED63ZHU.js → chunk-WKV2Z4KO.js} +10 -5
  61. package/dist/web/server/{chunk-ANL4B775.js → chunk-XLNCWZMZ.js} +2 -2
  62. package/dist/web/server/{chunk-GM32R7JW.js → chunk-YKVGQBZA.js} +10 -8
  63. package/dist/web/server/{chunk-3PIUR75R.js → chunk-YXXRP3NS.js} +9 -9
  64. package/dist/web/server/{fleet-message-queue-BxycG26e-2XLOTCLP.js → fleet-message-queue-j0DCU5Xy-5HKBHMPV.js} +2 -2
  65. package/dist/web/server/{fleet-pi-tool-renderer-RIeVlM9J-D6MISCQC.js → fleet-pi-tool-renderer-umKunT3K-O4GBH35V.js} +5 -5
  66. package/dist/web/server/{fleet-reasoning-panel-D_K48UOT-GN2PA6KT.js → fleet-reasoning-panel-BxC2COxi-GPLMQSTT.js} +9 -9
  67. package/dist/web/server/{fleet-subagent-list-5luKtpds-3OTVFHJQ.js → fleet-subagent-list-CpSYzCIq-JDH2LHSS.js} +1 -1
  68. package/dist/web/server/{fleet-tool-timeline-DwRqQgOj-HUFLGMDV.js → fleet-tool-timeline-IB36_PB2-XJENTO6I.js} +1 -1
  69. package/dist/web/server/{fork-picker-dialog-B9yGc8Au-IL63F2DN.js → fork-picker-dialog-DlINz9UQ-UWIXFDJX.js} +3 -3
  70. package/dist/web/server/{model-selector-list-cb2-ewoA-KIVU6LD3.js → model-selector-list-OYnzNbyu-HBGCNF2L.js} +5 -5
  71. package/dist/web/server/{openui-renderer-Czy5Vo2L-BLXPJD65.js → openui-renderer-Cj7kfqyL-EKJ6JTTQ.js} +4 -4
  72. package/dist/web/server/{prompt-suggestions-BOmHi4-J-C563CHFU.js → prompt-suggestions-D4AEEY7K-RZSP7PWV.js} +3 -3
  73. package/dist/web/server/{repl-panel-yyxhwe4c-7U6HXYPS.js → repl-panel-D5KsoJik-BQKO53JO.js} +9 -9
  74. package/dist/web/server/{resources-panel-j4fAIi9g-5C267IXV.js → resources-panel-CE5pD4vy-V5FXBTYC.js} +2 -2
  75. package/dist/web/server/{router-CgSWrAYc-5UBYSZTJ.js → router-Ci1wxI7I-E2AYMNON.js} +253 -76
  76. package/dist/web/server/{routes-CP_BBhD0-BAWQYGKY.js → routes-CRpm9-Sa-IYK6MUJO.js} +705 -537
  77. package/dist/web/server/server.js +2 -2
  78. package/dist/web/server/{session-insights-panel-BHZyKDTo-LRMAMA3O.js → session-insights-panel-CUhdgvRt-VB2HUCQP.js} +4 -4
  79. package/dist/web/server/{settings-dialog-CxHe8nym-KKXDPTIW.js → settings-dialog-BvkgNflv-GPJ6COQO.js} +14 -10
  80. package/dist/web/server/{subagent-chat-panel-DlSsM59d-DBW7DI3T.js → subagent-chat-panel-CMuvW9Sd-M5TEEGQW.js} +11 -11
  81. package/dist/web/server/{subagents-panel-Txzk8oDb-NRKLASYN.js → subagents-panel-DgfB6_Yy-4INEPE3Y.js} +13 -13
  82. package/dist/web/server/{workspace-panel-BOs-58Cv-SWQBMZSB.js → workspace-panel-bpwj-Veu-Q2CEJMN4.js} +4 -3
  83. package/package.json +1 -1
  84. package/dist/web/client/assets/agent-activity-CDcDNVC6.js +0 -1
  85. package/dist/web/client/assets/artifacts-panel-CObI-DMt.js +0 -1
  86. package/dist/web/client/assets/fleet-reasoning-panel-MtbSdoCv.js +0 -1
  87. package/dist/web/client/assets/fleet-tool-timeline-COzPrwr8.js +0 -1
  88. package/dist/web/client/assets/generative-text-renderer-CDKHv-v_.js +0 -6
  89. package/dist/web/client/assets/globals-DisQPFtV.css +0 -2
  90. package/dist/web/client/assets/horizontal-resize-Bl3AyBJg.js +0 -1
  91. package/dist/web/client/assets/model-selector-list-DQaPFUYt.js +0 -1
  92. package/dist/web/client/assets/prompt-input-DZ4cho_e.js +0 -1
  93. package/dist/web/client/assets/prompt-suggestions-CXM6knMK.js +0 -1
  94. package/dist/web/client/assets/repl-panel-BDQ5MEgV.js +0 -1
  95. package/dist/web/client/assets/right-panel-registry-VVRPktV3.js +0 -2
  96. package/dist/web/client/assets/routes-DAikUNzO.js +0 -16
  97. package/dist/web/client/assets/session-insights-panel-CQdT90Op.js +0 -1
  98. package/dist/web/client/assets/settings-dialog-DS64KmwC.js +0 -1
  99. package/dist/web/client/assets/skeleton-loaders-DjGv9LLA.js +0 -1
  100. package/dist/web/client/assets/subagent-transcript-cxVKYnh9.js +0 -1
  101. package/dist/web/client/assets/subagents-panel-CHC96I68.js +0 -1
  102. package/dist/web/client/assets/tool-result-Baj3CdL_.js +0 -4
  103. package/dist/web/client/assets/ui-preferences-DUEFuJFj.js +0 -1
@@ -6,14 +6,14 @@ import {
6
6
  MessageCircleQuestionMark,
7
7
  PI_TOOL_RENDERERS,
8
8
  useHoverCapable
9
- } from "./chunk-2TRF62K5.js";
9
+ } from "./chunk-N6NOTURM.js";
10
10
  import {
11
11
  pct,
12
12
  progressOf
13
13
  } from "./chunk-V3S6BVXO.js";
14
14
  import {
15
15
  mono
16
- } from "./chunk-ANL4B775.js";
16
+ } from "./chunk-XLNCWZMZ.js";
17
17
  import {
18
18
  Eye
19
19
  } from "./chunk-2ST2ULW7.js";
@@ -47,7 +47,7 @@ import {
47
47
  FileDiff,
48
48
  ToolResult,
49
49
  ToolResultOutput
50
- } from "./chunk-3PIUR75R.js";
50
+ } from "./chunk-YXXRP3NS.js";
51
51
  import {
52
52
  ActionSwapRollText,
53
53
  FileCodeCorner
@@ -115,7 +115,7 @@ import {
115
115
  ToolTextShimmer,
116
116
  adaptToolPart,
117
117
  useToolComplete
118
- } from "./chunk-5XX7RKJ6.js";
118
+ } from "./chunk-NXJ32VFR.js";
119
119
  import {
120
120
  createLucideIcon
121
121
  } from "./chunk-4ZIEVI5O.js";
@@ -126,7 +126,7 @@ import {
126
126
  __exportAll
127
127
  } from "./chunk-L547YHC4.js";
128
128
 
129
- // web/app/dist/server/assets/fleet-pi-tool-renderer-RIeVlM9J.js
129
+ // web/app/dist/server/assets/fleet-pi-tool-renderer-umKunT3K.js
130
130
  import React, { createContext, memo, useCallback, useContext, useEffect, useId, useInsertionEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
131
131
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
132
132
  var ChevronsDown = createLucideIcon("chevrons-down", [["path", {
@@ -503,7 +503,7 @@ function QuestionTool({ part }) {
503
503
  className: "flex h-7 items-center justify-between border-b border-border px-3 text-xs text-an-tool-color-muted",
504
504
  children: [/* @__PURE__ */ jsxs("div", {
505
505
  className: "inline-flex items-center gap-1.5",
506
- children: [/* @__PURE__ */ jsx(MessageCircleQuestionMark, { className: "h-3.5 w-3.5" }), "Question"]
506
+ children: [/* @__PURE__ */ jsx(MessageCircleQuestionMark, { className: "size-3.5" }), "Question"]
507
507
  }), showNavigation && /* @__PURE__ */ jsxs("div", {
508
508
  className: "inline-flex items-center gap-1",
509
509
  children: [
@@ -513,7 +513,7 @@ function QuestionTool({ part }) {
513
513
  disabled: !canGoPrev,
514
514
  className: "inline-flex size-5 items-center justify-center rounded-[4px] hover:bg-an-background-secondary disabled:opacity-40",
515
515
  "aria-label": "Previous question",
516
- children: /* @__PURE__ */ jsx(ChevronUp, { className: "h-3.5 w-3.5" })
516
+ children: /* @__PURE__ */ jsx(ChevronUp, { className: "size-3.5" })
517
517
  }),
518
518
  /* @__PURE__ */ jsxs("span", { children: [
519
519
  clampedIndex,
@@ -526,7 +526,7 @@ function QuestionTool({ part }) {
526
526
  disabled: !canGoNext,
527
527
  className: "inline-flex size-5 items-center justify-center rounded-[4px] hover:bg-an-background-secondary disabled:opacity-40",
528
528
  "aria-label": "Next question",
529
- children: /* @__PURE__ */ jsx(ChevronDown, { className: "h-3.5 w-3.5" })
529
+ children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-3.5" })
530
530
  })
531
531
  ]
532
532
  })]
@@ -994,7 +994,7 @@ function BashToolTerminalCard({ step, state, onComplete, approval }) {
994
994
  })]
995
995
  }),
996
996
  /* @__PURE__ */ jsxs("div", {
997
- className: "overflow-hidden border-t border-border bg-background px-2.5 py-1.5 font-mono text-[12px] leading-[16px]",
997
+ className: "overflow-hidden border-t border-border bg-background px-2.5 py-1.5 font-mono text-[0.75rem] leading-[16px]",
998
998
  children: [/* @__PURE__ */ jsxs("div", {
999
999
  className: "break-all",
1000
1000
  children: [/* @__PURE__ */ jsxs("span", {
@@ -11944,7 +11944,7 @@ function EditToolDiffCard({ step, state, onComplete, input, output, isCollapsibl
11944
11944
  ]
11945
11945
  })]
11946
11946
  }), step.diffStats && !isPending && /* @__PURE__ */ jsx("span", {
11947
- className: "inline-flex gap-2 font-mono text-[11px] text-an-tool-color-muted",
11947
+ className: "inline-flex gap-2 font-mono text-[0.6875rem] text-an-tool-color-muted",
11948
11948
  children: step.diffStats.split(" ").map((token) => /* @__PURE__ */ jsx("span", {
11949
11949
  className: token.startsWith("+") ? "text-an-diff-added-text" : token.startsWith("-") ? "text-an-diff-removed-text" : void 0,
11950
11950
  children: token
@@ -11952,7 +11952,7 @@ function EditToolDiffCard({ step, state, onComplete, input, output, isCollapsibl
11952
11952
  })]
11953
11953
  }),
11954
11954
  diffFiles ? /* @__PURE__ */ jsx("div", {
11955
- className: `${diffClassName} text-[12px]`,
11955
+ className: `${diffClassName} text-[0.75rem]`,
11956
11956
  style: diffCssVars,
11957
11957
  children: /* @__PURE__ */ jsxs("div", {
11958
11958
  className: isCollapsible ? "group/edit-diff relative" : "relative",
@@ -12239,7 +12239,7 @@ var PlanTool = memo(function PlanTool2({ part, chatStatus }) {
12239
12239
  className: "text-sm text-an-tool-color",
12240
12240
  children: plan.title
12241
12241
  }), actionLabel ? /* @__PURE__ */ jsx("div", {
12242
- className: "rounded-full border border-border px-2 py-0.5 text-[11px] text-an-tool-color-muted",
12242
+ className: "rounded-full border border-border px-2 py-0.5 text-[0.6875rem] text-an-tool-color-muted",
12243
12243
  children: actionLabel
12244
12244
  }) : null]
12245
12245
  }), hasSummary ? /* @__PURE__ */ jsxs("div", {
@@ -12275,10 +12275,10 @@ var PlanTool = memo(function PlanTool2({ part, chatStatus }) {
12275
12275
  className: "-mx-2 h-5 rounded-[4px] px-1.5 text-xs text-muted-foreground hover:text-an-tool-color",
12276
12276
  children: isExpanded ? "Hide detailed plan" : "Read detailed plan"
12277
12277
  }), canAct ? /* @__PURE__ */ jsx("div", {
12278
- className: "text-[11px] text-an-tool-color-muted",
12278
+ className: "text-[0.6875rem] text-an-tool-color-muted",
12279
12279
  children: "Choose what to do with this plan."
12280
12280
  }) : isAlreadyApproved ? /* @__PURE__ */ jsx("div", {
12281
- className: "text-[11px] text-an-tool-color-muted",
12281
+ className: "text-[0.6875rem] text-an-tool-color-muted",
12282
12282
  children: "Approved"
12283
12283
  }) : null]
12284
12284
  }),
@@ -12711,7 +12711,7 @@ ${displayOutput}
12711
12711
  expandable: hasExpandableContent,
12712
12712
  defaultOpen,
12713
12713
  children: codeBlock && /* @__PURE__ */ jsx(LazyMarkdown, {
12714
- className: "text-[12px]",
12714
+ className: "text-[0.75rem]",
12715
12715
  codeControls: false,
12716
12716
  content: codeBlock
12717
12717
  })
@@ -13183,7 +13183,7 @@ function ImageGeneration({ children, status = "generating", label, prompt, resol
13183
13183
  }, "dither-field") : null
13184
13184
  }),
13185
13185
  resolution ? /* @__PURE__ */ jsx("span", {
13186
- className: "absolute top-2 right-2 z-10 rounded-full bg-background/75 px-2 py-0.5 font-mono text-[10px] tabular-nums text-muted-foreground",
13186
+ className: "absolute top-2 right-2 z-10 rounded-full bg-background/75 px-2 py-0.5 font-mono text-[0.625rem] tabular-nums text-muted-foreground",
13187
13187
  children: resolution
13188
13188
  }) : null
13189
13189
  ]
@@ -13492,7 +13492,7 @@ function TodoList({ items, title = "To-dos", open, defaultOpen = true, onOpenCha
13492
13492
  className: "scrollbar-hide overflow-y-auto px-2 pb-2",
13493
13493
  style: { maxHeight },
13494
13494
  children: [/* @__PURE__ */ jsx("ol", {
13495
- "aria-live": "polite",
13495
+ "aria-live": allComplete ? "polite" : "off",
13496
13496
  className: "space-y-0",
13497
13497
  children: /* @__PURE__ */ jsx(AnimatePresence, {
13498
13498
  initial: false,
@@ -13580,7 +13580,7 @@ function AgentPlan({ steps, activeIndex, className, ...props }) {
13580
13580
  /* @__PURE__ */ jsxs("div", {
13581
13581
  className: "flex items-center justify-between",
13582
13582
  children: [/* @__PURE__ */ jsx("span", {
13583
- className: "text-[13.5px] font-medium",
13583
+ className: "text-[0.84375rem] font-medium",
13584
13584
  children: "Plan"
13585
13585
  }), /* @__PURE__ */ jsxs("span", {
13586
13586
  className: cn(mono, "text-foreground/35 tabular-nums"),
@@ -13604,7 +13604,7 @@ function AgentPlan({ steps, activeIndex, className, ...props }) {
13604
13604
  const done = allDone || i < completed;
13605
13605
  const active = !allDone && i === completed;
13606
13606
  return /* @__PURE__ */ jsxs("li", {
13607
- className: "flex items-center gap-2.5 text-[13.5px]",
13607
+ className: "flex items-center gap-2.5 text-[0.84375rem]",
13608
13608
  children: [/* @__PURE__ */ jsx("span", {
13609
13609
  className: "flex size-4 shrink-0 items-center justify-center",
13610
13610
  children: done ? /* @__PURE__ */ jsx(Check, { className: "text-foreground/35 size-3.5" }) : active ? /* @__PURE__ */ jsx(LoaderCircle, { className: "text-foreground/90 size-3.5 animate-spin motion-reduce:animate-none" }) : /* @__PURE__ */ jsx("span", {
@@ -13702,7 +13702,7 @@ function ToolApproval({ tool, title = "Allow this tool to run?", description, pa
13702
13702
  children: tool
13703
13703
  })]
13704
13704
  }), /* @__PURE__ */ jsx("span", {
13705
- className: cn("shrink-0 rounded-full border px-2 py-0.5 text-[11px] font-medium transition-colors", getStatusBadgeClass(status)),
13705
+ className: cn("shrink-0 rounded-full border px-2 py-0.5 text-[0.6875rem] font-medium transition-colors", getStatusBadgeClass(status)),
13706
13706
  children: getStatusCopy(status)
13707
13707
  })]
13708
13708
  }),
@@ -7,16 +7,15 @@ import {
7
7
  } from "./chunk-FAGDMGLK.js";
8
8
  import {
9
9
  ChatDeliveryModeSchema,
10
- ChatPackageSourceSchema,
11
10
  ChatThinkingLevelSchema,
12
11
  ChatTransportSchema,
13
12
  external_exports,
14
13
  nonEmptyStringSchema,
15
14
  nonNegativeIntSchema,
16
15
  positiveIntSchema
17
- } from "./chunk-NRDG2ISJ.js";
16
+ } from "./chunk-GGT2ZKDB.js";
18
17
 
19
- // web/app/dist/server/assets/chat-protocol.zod-BfIk7Wuj.js
18
+ // web/app/dist/server/assets/chat-protocol.zod-B9cCCMrC.js
20
19
  import { useEffect, useRef, useState } from "react";
21
20
  import { jsx } from "react/jsx-runtime";
22
21
  function LazyMotion({ children, features, strict = false }) {
@@ -371,6 +370,19 @@ var ChatCommandsResponseSchema = external_exports.object({
371
370
  }).openapi({ description: "Chat slash commands response" });
372
371
  external_exports.object({ message: external_exports.string() }).openapi({ description: "Error response" });
373
372
  external_exports.object({ status: external_exports.literal("ok") }).openapi({ description: "Health check response" });
373
+ var chatResourcePathSchema = nonEmptyStringSchema.max(1024);
374
+ var chatResourcePathArraySchema = external_exports.array(chatResourcePathSchema);
375
+ var chatResourcePathUpdateArraySchema = chatResourcePathArraySchema.max(100);
376
+ var ChatPackageSourceObjectSchema = external_exports.object({
377
+ source: nonEmptyStringSchema,
378
+ extensions: external_exports.array(nonEmptyStringSchema).optional(),
379
+ skills: external_exports.array(nonEmptyStringSchema).optional(),
380
+ prompts: external_exports.array(nonEmptyStringSchema).optional(),
381
+ themes: external_exports.array(nonEmptyStringSchema).optional()
382
+ });
383
+ var ChatPackageSourceSettingsSchema = external_exports.union([nonEmptyStringSchema, ChatPackageSourceObjectSchema]);
384
+ var chatPackageSourceArraySchema = external_exports.array(ChatPackageSourceSettingsSchema);
385
+ var chatPackageSourceUpdateArraySchema = chatPackageSourceArraySchema.max(100);
374
386
  var ChatPiSettingsSchema = external_exports.object({
375
387
  compaction: external_exports.object({
376
388
  enabled: external_exports.boolean(),
@@ -382,18 +394,18 @@ var ChatPiSettingsSchema = external_exports.object({
382
394
  defaultThinkingLevel: ChatThinkingLevelSchema.optional(),
383
395
  enableSkillCommands: external_exports.boolean(),
384
396
  enabledModels: external_exports.array(nonEmptyStringSchema).optional(),
385
- extensions: external_exports.array(nonEmptyStringSchema),
397
+ extensions: chatResourcePathArraySchema,
386
398
  followUpMode: ChatDeliveryModeSchema,
387
- packages: external_exports.array(ChatPackageSourceSchema),
388
- prompts: external_exports.array(nonEmptyStringSchema),
399
+ packages: chatPackageSourceArraySchema,
400
+ prompts: chatResourcePathArraySchema,
389
401
  retry: external_exports.object({
390
402
  enabled: external_exports.boolean(),
391
403
  maxRetries: nonNegativeIntSchema,
392
404
  baseDelayMs: nonNegativeIntSchema
393
405
  }),
394
- skills: external_exports.array(nonEmptyStringSchema),
406
+ skills: chatResourcePathArraySchema,
395
407
  steeringMode: ChatDeliveryModeSchema,
396
- themes: external_exports.array(nonEmptyStringSchema),
408
+ themes: chatResourcePathArraySchema,
397
409
  transport: ChatTransportSchema
398
410
  }).openapi({ description: "Editable Pi settings" });
399
411
  var ChatPiSettingsUpdateSchema = external_exports.object({
@@ -403,21 +415,38 @@ var ChatPiSettingsUpdateSchema = external_exports.object({
403
415
  defaultThinkingLevel: ChatThinkingLevelSchema.optional(),
404
416
  enableSkillCommands: external_exports.boolean().optional(),
405
417
  enabledModels: external_exports.array(nonEmptyStringSchema).nullable().optional(),
406
- extensions: external_exports.array(nonEmptyStringSchema).optional(),
418
+ extensions: chatResourcePathUpdateArraySchema.optional(),
407
419
  followUpMode: ChatDeliveryModeSchema.optional(),
408
- packages: external_exports.array(ChatPackageSourceSchema).optional(),
409
- prompts: external_exports.array(nonEmptyStringSchema).optional(),
420
+ packages: chatPackageSourceUpdateArraySchema.optional(),
421
+ prompts: chatResourcePathUpdateArraySchema.optional(),
410
422
  retry: ChatPiSettingsSchema.shape.retry.partial().optional(),
411
- skills: external_exports.array(nonEmptyStringSchema).optional(),
423
+ skills: chatResourcePathUpdateArraySchema.optional(),
412
424
  steeringMode: ChatDeliveryModeSchema.optional(),
413
- themes: external_exports.array(nonEmptyStringSchema).optional(),
425
+ themes: chatResourcePathUpdateArraySchema.optional(),
414
426
  transport: ChatTransportSchema.optional()
415
427
  }).strict().openapi({ description: "Pi settings update" });
428
+ var chatPiSettingsProjectResponseSchema = external_exports.object({
429
+ compaction: ChatPiSettingsSchema.shape.compaction.partial().optional(),
430
+ defaultModel: external_exports.string().optional(),
431
+ defaultProvider: external_exports.string().optional(),
432
+ defaultThinkingLevel: ChatThinkingLevelSchema.optional(),
433
+ enableSkillCommands: external_exports.boolean().optional(),
434
+ enabledModels: external_exports.array(nonEmptyStringSchema).nullable().optional(),
435
+ extensions: chatResourcePathArraySchema.optional(),
436
+ followUpMode: ChatDeliveryModeSchema.optional(),
437
+ packages: chatPackageSourceArraySchema.optional(),
438
+ prompts: chatResourcePathArraySchema.optional(),
439
+ retry: ChatPiSettingsSchema.shape.retry.partial().optional(),
440
+ skills: chatResourcePathArraySchema.optional(),
441
+ steeringMode: ChatDeliveryModeSchema.optional(),
442
+ themes: chatResourcePathArraySchema.optional(),
443
+ transport: ChatTransportSchema.optional()
444
+ }).strict();
416
445
  var ChatSettingsUpdateRequestSchema = external_exports.object({ settings: ChatPiSettingsUpdateSchema }).openapi({ description: "Pi settings update request" });
417
446
  var ChatSettingsResponseSchema = external_exports.object({
418
447
  diagnostics: external_exports.array(external_exports.string()),
419
448
  effective: ChatPiSettingsSchema,
420
- project: ChatPiSettingsUpdateSchema,
449
+ project: chatPiSettingsProjectResponseSchema,
421
450
  projectPath: external_exports.string(),
422
451
  updateImpact: external_exports.object({
423
452
  newSessionRecommended: external_exports.boolean(),
@@ -70,7 +70,7 @@ import {
70
70
  cn
71
71
  } from "./chunk-DJMHPJBP.js";
72
72
 
73
- // web/app/dist/server/assets/provider-label-CD_I7WvM.js
73
+ // web/app/dist/server/assets/provider-label-CnEydH8K.js
74
74
  import * as React$1 from "react";
75
75
  import { jsx, jsxs } from "react/jsx-runtime";
76
76
  import * as ReactDOM from "react-dom";
@@ -908,7 +908,7 @@ function safePolygon(options = {}) {
908
908
  };
909
909
  return fn;
910
910
  }
911
- var COMPACT_ACTION_BUTTON_CLASS = "h-8 shrink-0 cursor-pointer rounded-full border-border/45 bg-background/65 px-3 text-[11px] font-semibold text-foreground/75 shadow-sm transition-[background-color,border-color,box-shadow,opacity,transform] duration-150 hover:bg-foreground/5 active:scale-[0.96] disabled:opacity-50";
911
+ var COMPACT_ACTION_BUTTON_CLASS = "h-8 shrink-0 cursor-pointer rounded-full border-border/45 bg-background/65 px-3 text-[0.6875rem] font-semibold text-foreground/75 shadow-sm transition-[background-color,border-color,box-shadow,opacity,transform] duration-150 hover:bg-foreground/5 active:scale-[0.96] disabled:opacity-50";
912
912
  var HIT_AREA_EXPAND_CLASS = "relative after:absolute after:top-1/2 after:left-1/2 after:size-10 after:-translate-x-1/2 after:-translate-y-1/2";
913
913
  var HIT_AREA_EXPAND_DENSE_CLASS = "relative after:absolute after:inset-x-0 after:-top-1.5 after:-bottom-1.5";
914
914
  var CHROME_PILL_CLASS = "relative inline-flex h-9 items-center gap-1.5 rounded-[10px] border border-border/70 px-3 text-label font-medium whitespace-nowrap shadow-sm backdrop-blur transition-colors";
@@ -30,7 +30,7 @@ import {
30
30
  cn
31
31
  } from "./chunk-DJMHPJBP.js";
32
32
 
33
- // web/app/dist/server/assets/citations-UswwFSUx.js
33
+ // web/app/dist/server/assets/citations-CYHZanjq.js
34
34
  import { Suspense, lazy, useCallback, useEffect, useId, useState } from "react";
35
35
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
36
36
  var BookOpenText = createLucideIcon("book-open-text", [
@@ -191,7 +191,7 @@ function CitationRow({ citation, index, idPrefix }) {
191
191
  /* @__PURE__ */ jsxs("span", {
192
192
  className: "flex shrink-0 items-center gap-1.5",
193
193
  children: [/* @__PURE__ */ jsx("span", {
194
- className: "grid size-5 place-items-center rounded-md bg-foreground/[0.05] text-[10px] font-semibold tabular-nums text-muted-foreground",
194
+ className: "grid size-5 place-items-center rounded-md bg-foreground/[0.05] text-[0.625rem] font-semibold tabular-nums text-muted-foreground",
195
195
  children: index
196
196
  }), safeUrl ? /* @__PURE__ */ jsx(ExternalLink, { className: "size-3.5 text-muted-foreground/40 transition-colors group-hover/citation:text-muted-foreground" }) : null]
197
197
  })
@@ -276,7 +276,7 @@ function Citations({ citations, title = "Sources", open, defaultOpen = false, on
276
276
  children: title
277
277
  }),
278
278
  /* @__PURE__ */ jsx("span", {
279
- className: "rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-semibold tabular-nums",
279
+ className: "rounded-full bg-muted px-1.5 py-0.5 text-[0.625rem] font-semibold tabular-nums",
280
280
  children: citations.length
281
281
  }),
282
282
  /* @__PURE__ */ jsx(m.span, {
@@ -5,7 +5,7 @@ import {
5
5
  cn
6
6
  } from "./chunk-DJMHPJBP.js";
7
7
 
8
- // web/app/dist/server/assets/ipython-tool-DHKjxYuT.js
8
+ // web/app/dist/server/assets/ipython-tool-XRT6nQzr.js
9
9
  import React, { memo, useEffect, useMemo, useRef, useState } from "react";
10
10
  import { jsx, jsxs } from "react/jsx-runtime";
11
11
  var CodeXml = createLucideIcon("code-xml", [
@@ -273,7 +273,7 @@ function IpythonCardHeader({ isPending, isBashCell, hasError, kernelRestarted })
273
273
  children: [/* @__PURE__ */ jsxs("div", {
274
274
  className: "flex min-w-0 items-center gap-1.5 overflow-hidden",
275
275
  children: [/* @__PURE__ */ jsxs("span", {
276
- className: "inline-flex items-center gap-1 rounded-sm bg-muted px-1.5 py-0.5 font-mono text-[10px] leading-none text-muted-foreground uppercase",
276
+ className: "inline-flex items-center gap-1 rounded-sm bg-muted px-1.5 py-0.5 font-mono text-[0.625rem] leading-none text-muted-foreground uppercase",
277
277
  children: [/* @__PURE__ */ jsx(CodeXml, { className: "h-3 w-3" }), isBashCell ? "shell" : "python"]
278
278
  }), isPending ? /* @__PURE__ */ jsx(ToolTextShimmer, {
279
279
  as: "span",
@@ -303,9 +303,9 @@ function IpythonCardHeader({ isPending, isBashCell, hasError, kernelRestarted })
303
303
  }
304
304
  function IpythonBackgroundOutput({ output }) {
305
305
  return /* @__PURE__ */ jsxs("div", {
306
- className: "mt-1.5 border-t border-dashed border-border/70 pt-1.5 font-mono text-[11px] leading-[15px]",
306
+ className: "mt-1.5 border-t border-dashed border-border/70 pt-1.5 font-mono text-[0.6875rem] leading-[15px]",
307
307
  children: [/* @__PURE__ */ jsx("span", {
308
- className: "text-[10px] font-semibold uppercase tracking-wider text-amber-600/90 dark:text-amber-400/90",
308
+ className: "text-[0.625rem] font-semibold uppercase tracking-wider text-amber-600/90 dark:text-amber-400/90",
309
309
  children: "Unattributed background output:"
310
310
  }), /* @__PURE__ */ jsx("div", {
311
311
  className: "mt-0.5 max-h-[140px] overflow-auto whitespace-pre-wrap rounded bg-muted/40 p-1.5 text-muted-foreground",
@@ -333,7 +333,7 @@ function IpythonCellCard({ step, state, onComplete, approval, cellIndex, part })
333
333
  kernelRestarted: details?.kernelRestarted
334
334
  }),
335
335
  /* @__PURE__ */ jsxs("div", {
336
- className: "overflow-hidden border-t border-border bg-background px-2.5 py-1.5 font-mono text-[12px] leading-[16px]",
336
+ className: "overflow-hidden border-t border-border bg-background px-2.5 py-1.5 font-mono text-[0.75rem] leading-[16px]",
337
337
  children: [
338
338
  /* @__PURE__ */ jsxs("div", {
339
339
  className: "break-all whitespace-pre-wrap",
@@ -21,7 +21,7 @@ import {
21
21
  createLucideIcon
22
22
  } from "./chunk-4ZIEVI5O.js";
23
23
 
24
- // web/app/dist/server/assets/right-panel-registry-Belw-Qdn.js
24
+ // web/app/dist/server/assets/right-panel-registry-BSPaXYPC.js
25
25
  import { Suspense, lazy } from "react";
26
26
  import { jsx, jsxs } from "react/jsx-runtime";
27
27
  var Activity = createLucideIcon("activity", [["path", {
@@ -46,12 +46,12 @@ var Library = createLucideIcon("library", [
46
46
  key: "6qkkli"
47
47
  }]
48
48
  ]);
49
- var LazyArtifactsPanel = lazy(() => import("./artifacts-panel-DLMK1O8P-42T45JMA.js").then(({ ArtifactsPanelContent }) => ({ default: ArtifactsPanelContent })));
50
- var LazyResourcesPanel = lazy(() => import("./resources-panel-j4fAIi9g-5C267IXV.js").then(({ ResourcesPanelContent }) => ({ default: ResourcesPanelContent })));
51
- var LazySessionInsightsPanel = lazy(() => import("./session-insights-panel-BHZyKDTo-LRMAMA3O.js").then(({ SessionInsightsPanel }) => ({ default: SessionInsightsPanel })));
52
- var LazyReplPanel = lazy(() => import("./repl-panel-yyxhwe4c-7U6HXYPS.js").then(({ ReplPanelContent }) => ({ default: ReplPanelContent })));
53
- var LazySubagentsPanel = lazy(() => import("./subagents-panel-Txzk8oDb-NRKLASYN.js").then(({ SubagentsPanelContent }) => ({ default: SubagentsPanelContent })));
54
- var LazyWorkspacePanel = lazy(() => import("./workspace-panel-BOs-58Cv-SWQBMZSB.js").then(({ WorkspacePanelContent }) => ({ default: WorkspacePanelContent })));
49
+ var LazyArtifactsPanel = lazy(() => import("./artifacts-panel-8GGUCtOd-X5TNKTY2.js").then(({ ArtifactsPanelContent }) => ({ default: ArtifactsPanelContent })));
50
+ var LazyResourcesPanel = lazy(() => import("./resources-panel-CE5pD4vy-V5FXBTYC.js").then(({ ResourcesPanelContent }) => ({ default: ResourcesPanelContent })));
51
+ var LazySessionInsightsPanel = lazy(() => import("./session-insights-panel-CUhdgvRt-VB2HUCQP.js").then(({ SessionInsightsPanel }) => ({ default: SessionInsightsPanel })));
52
+ var LazyReplPanel = lazy(() => import("./repl-panel-D5KsoJik-BQKO53JO.js").then(({ ReplPanelContent }) => ({ default: ReplPanelContent })));
53
+ var LazySubagentsPanel = lazy(() => import("./subagents-panel-DgfB6_Yy-4INEPE3Y.js").then(({ SubagentsPanelContent }) => ({ default: SubagentsPanelContent })));
54
+ var LazyWorkspacePanel = lazy(() => import("./workspace-panel-bpwj-Veu-Q2CEJMN4.js").then(({ WorkspacePanelContent }) => ({ default: WorkspacePanelContent })));
55
55
  function PanelFallback() {
56
56
  return /* @__PURE__ */ jsxs("div", {
57
57
  className: "flex min-h-32 flex-col gap-3 p-4",
@@ -6,10 +6,11 @@ import {
6
6
  MessageContent,
7
7
  MessageScroller,
8
8
  UserMessage,
9
+ VirtualizedTurnList,
9
10
  buildAssistantElements,
10
11
  groupMessages,
11
12
  normalizeAssistantToolParts
12
- } from "./chunk-6AW2XFTZ.js";
13
+ } from "./chunk-WILCIZYU.js";
13
14
  import {
14
15
  RefreshCw
15
16
  } from "./chunk-OKL5ZRVB.js";
@@ -18,16 +19,16 @@ import {
18
19
  } from "./chunk-UCA4WN66.js";
19
20
  import {
20
21
  FleetPiToolRenderer
21
- } from "./chunk-AJJ2S5FF.js";
22
+ } from "./chunk-JQDLJ7KI.js";
22
23
  import {
23
24
  PI_TOOL_RENDERERS
24
- } from "./chunk-2TRF62K5.js";
25
+ } from "./chunk-N6NOTURM.js";
25
26
  import {
26
27
  FleetToolTimeline
27
- } from "./chunk-X2R5YPQZ.js";
28
+ } from "./chunk-IJPCV6DH.js";
28
29
  import {
29
30
  FleetSubagentList
30
- } from "./chunk-EBCYJSBR.js";
31
+ } from "./chunk-7SD2ZSEA.js";
31
32
  import {
32
33
  derivePrimeAgentArtifactRuns
33
34
  } from "./chunk-4UBOIY2S.js";
@@ -41,8 +42,8 @@ import {
41
42
  cn
42
43
  } from "./chunk-DJMHPJBP.js";
43
44
 
44
- // web/app/dist/server/assets/subagent-transcript-ByIAMEmN.js
45
- import { useMemo } from "react";
45
+ // web/app/dist/server/assets/subagent-transcript-CMFc5Jn2.js
46
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
46
47
  import { jsx, jsxs } from "react/jsx-runtime";
47
48
  function transcriptStatus(child) {
48
49
  if (child.status === "running" || child.status === "recovering") return "streaming";
@@ -86,20 +87,44 @@ function SubagentTurnView({ turn, isLast, isStreaming, artifacts, presentation }
86
87
  children: assistantElements
87
88
  }),
88
89
  isLast && presentation ? /* @__PURE__ */ jsx(FleetSubagentList, {
89
- children: presentation.rlmChildren,
90
- tree: presentation.rlmTree
90
+ tree: presentation.rlmTree,
91
+ children: presentation.rlmChildren
91
92
  }) : null
92
93
  ] })
93
94
  }) })
94
95
  }) : null]
95
96
  });
96
97
  }
98
+ function getSubagentTurnKey(turn, index) {
99
+ return turn.user?.id ?? turn.assistants[0]?.id ?? `subagent-turn-${index}`;
100
+ }
97
101
  function SubagentTranscriptView({ child, parentSessionId, transcript, onRefresh, fullWidth = false, status: statusOverride }) {
98
102
  const turns = useMemo(() => transcript?.status !== "loading" ? groupMessages(transcript?.messages ?? []) : [], [transcript]);
99
103
  const childStatus = statusOverride ?? transcriptStatus(child);
100
104
  const artifactRuns = useMemo(() => transcript?.status !== "loading" ? derivePrimeAgentArtifactRuns(transcript?.messages ?? [], transcript?.presentation, childStatus) : [], [childStatus, transcript]);
101
105
  const artifacts = useMemo(() => artifactRuns.flatMap((run) => run.artifacts), [artifactRuns]);
106
+ const presentation = transcript?.presentation;
107
+ const renderSubagentTurn = useCallback((turn, index) => {
108
+ const isLast = index === turns.length - 1;
109
+ return /* @__PURE__ */ jsx(SubagentTurnView, {
110
+ turn,
111
+ isLast,
112
+ isStreaming: isLast && childStatus === "streaming",
113
+ artifacts: isLast ? artifacts : [],
114
+ presentation: isLast ? presentation : void 0
115
+ });
116
+ }, [
117
+ artifacts,
118
+ childStatus,
119
+ presentation,
120
+ turns.length
121
+ ]);
102
122
  const title = child.sessionName || child.label;
123
+ const [heartbeatLabel, setHeartbeatLabel] = useState(null);
124
+ useEffect(() => {
125
+ setHeartbeatLabel(child.lastHeardFrom ? new Date(child.lastHeardFrom).toLocaleTimeString() : null);
126
+ }, [child.lastHeardFrom]);
127
+ const viewportRef = useRef(null);
103
128
  return /* @__PURE__ */ jsxs("section", {
104
129
  "aria-label": `Subagent thread: ${child.label}`,
105
130
  className: cn(fullWidth ? "flex min-h-0 min-w-0 flex-1 flex-col" : "space-y-2", "min-w-0"),
@@ -117,20 +142,20 @@ function SubagentTranscriptView({ child, parentSessionId, transcript, onRefresh,
117
142
  className: "min-w-0 flex-1 truncate text-xs font-medium text-foreground/80",
118
143
  children: title
119
144
  }), /* @__PURE__ */ jsx("span", {
120
- className: "shrink-0 text-[10px] capitalize text-foreground/45",
145
+ className: "shrink-0 text-[0.625rem] capitalize text-foreground/45",
121
146
  children: child.status
122
147
  })]
123
148
  }),
124
149
  child.model ? /* @__PURE__ */ jsx("p", {
125
- className: "truncate font-mono text-[10px] text-foreground/40",
150
+ className: "truncate font-mono text-[0.625rem] text-foreground/40",
126
151
  children: child.model
127
152
  }) : null,
128
- child.lastHeardFrom ? /* @__PURE__ */ jsxs("p", {
129
- className: "truncate text-[10px] text-foreground/40",
130
- children: ["Heartbeat: ", new Date(child.lastHeardFrom).toLocaleTimeString()]
153
+ heartbeatLabel ? /* @__PURE__ */ jsxs("p", {
154
+ className: "truncate text-[0.625rem] text-foreground/40",
155
+ children: ["Heartbeat: ", heartbeatLabel]
131
156
  }) : null,
132
157
  child.answerPreview || child.recap ? /* @__PURE__ */ jsx("p", {
133
- className: "mt-1 line-clamp-3 whitespace-pre-wrap text-[11px] leading-4 text-foreground/55",
158
+ className: "mt-1 line-clamp-3 whitespace-pre-wrap text-[0.6875rem] leading-4 text-foreground/55",
134
159
  children: child.answerPreview ?? child.recap
135
160
  }) : null
136
161
  ]
@@ -147,23 +172,23 @@ function SubagentTranscriptView({ child, parentSessionId, transcript, onRefresh,
147
172
  }) : null
148
173
  ]
149
174
  }), !parentSessionId ? /* @__PURE__ */ jsx("p", {
150
- className: "rounded-md border border-dashed border-border/70 px-3 py-3 text-[11px] leading-4 text-foreground/45",
175
+ className: "rounded-md border border-dashed border-border/70 p-3 text-[0.6875rem] leading-4 text-foreground/45",
151
176
  children: "This subagent thread is unavailable until the parent session is active."
152
177
  }) : transcript?.status === "loading" ? /* @__PURE__ */ jsx("div", {
153
- className: cn("flex items-center justify-center rounded-md border border-dashed border-border/70 text-[11px] text-foreground/45", fullWidth ? "min-h-32 flex-1" : "min-h-32"),
178
+ className: cn("flex items-center justify-center rounded-md border border-dashed border-border/70 text-[0.6875rem] text-foreground/45", fullWidth ? "min-h-32 flex-1" : "min-h-32"),
154
179
  children: "Loading subagent thread\u2026"
155
180
  }) : transcript?.status === "error" && turns.length === 0 ? /* @__PURE__ */ jsxs("div", {
156
181
  role: "alert",
157
- className: "flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[11px] leading-4 text-destructive",
182
+ className: "flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[0.6875rem] leading-4 text-destructive",
158
183
  children: [/* @__PURE__ */ jsx(CircleAlert, { className: "mt-0.5 size-3.5 shrink-0" }), /* @__PURE__ */ jsx("span", { children: transcript.error?.message ?? "Unable to load this subagent thread." })]
159
184
  }) : turns.length === 0 ? /* @__PURE__ */ jsx("p", {
160
- className: "rounded-md border border-dashed border-border/70 px-3 py-3 text-[11px] leading-4 text-foreground/45",
185
+ className: "rounded-md border border-dashed border-border/70 p-3 text-[0.6875rem] leading-4 text-foreground/45",
161
186
  children: "This subagent thread has no messages yet."
162
187
  }) : /* @__PURE__ */ jsxs("div", {
163
188
  className: "flex min-h-0 flex-1 flex-col",
164
189
  children: [transcript?.error ? /* @__PURE__ */ jsxs("div", {
165
190
  role: "alert",
166
- className: "mx-4 mt-2 flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[11px] leading-4 text-destructive sm:mx-6",
191
+ className: "mx-4 mt-2 flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[0.6875rem] leading-4 text-destructive sm:mx-6",
167
192
  children: [/* @__PURE__ */ jsx(CircleAlert, { className: "mt-0.5 size-3.5 shrink-0" }), /* @__PURE__ */ jsx("span", { children: transcript.error.message })]
168
193
  }) : null, /* @__PURE__ */ jsx("div", {
169
194
  className: cn("min-h-0 rounded-md border border-border/60 bg-background", fullWidth ? "flex min-h-0 flex-1 flex-col border-x-0 rounded-none border-b-0" : "h-96 max-h-[calc(100svh-18rem)]"),
@@ -173,17 +198,16 @@ function SubagentTranscriptView({ child, parentSessionId, transcript, onRefresh,
173
198
  followOutput: childStatus === "streaming",
174
199
  label: `Transcript for ${child.label}`,
175
200
  smooth: childStatus === "streaming",
201
+ viewportRef,
176
202
  viewportClassName: fullWidth ? "px-0" : void 0,
177
203
  contentClassName: cn("flex flex-col gap-4", fullWidth ? "mx-auto w-full max-w-3xl px-4 py-6 sm:px-6" : "px-2.5 py-3"),
178
- children: turns.map((turn, index) => {
179
- const isLast = index === turns.length - 1;
180
- return /* @__PURE__ */ jsx(SubagentTurnView, {
181
- turn,
182
- isLast,
183
- isStreaming: isLast && childStatus === "streaming",
184
- artifacts: isLast ? artifacts : [],
185
- presentation: isLast ? transcript?.presentation : void 0
186
- }, turn.user?.id ?? `subagent-turn-${index}`);
204
+ children: /* @__PURE__ */ jsx(VirtualizedTurnList, {
205
+ estimateSize: 320,
206
+ getItemKey: getSubagentTurnKey,
207
+ itemGap: 16,
208
+ items: turns,
209
+ renderItem: renderSubagentTurn,
210
+ viewportRef
187
211
  })
188
212
  })
189
213
  })]
@@ -0,0 +1,40 @@
1
+ // web/app/dist/server/assets/safe-storage-BmW7IjhZ.js
2
+ function getStorage(kind) {
3
+ if (typeof window === "undefined") return null;
4
+ try {
5
+ return kind === "local" ? window.localStorage : window.sessionStorage;
6
+ } catch {
7
+ return null;
8
+ }
9
+ }
10
+ function readStoredValue(key, kind = "local") {
11
+ const storage = getStorage(kind);
12
+ if (!storage) return null;
13
+ try {
14
+ return storage.getItem(key);
15
+ } catch {
16
+ return null;
17
+ }
18
+ }
19
+ function writeStoredValue(key, value, kind = "local") {
20
+ const storage = getStorage(kind);
21
+ if (!storage) return;
22
+ try {
23
+ storage.setItem(key, value);
24
+ } catch {
25
+ }
26
+ }
27
+ function removeStoredValue(key, kind = "local") {
28
+ const storage = getStorage(kind);
29
+ if (!storage) return;
30
+ try {
31
+ storage.removeItem(key);
32
+ } catch {
33
+ }
34
+ }
35
+
36
+ export {
37
+ readStoredValue,
38
+ writeStoredValue,
39
+ removeStoredValue
40
+ };