@qredence/fleet 0.5.10 → 0.6.0

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 (115) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/web/client/assets/agent-activity-CwMDU7aP.js +1 -0
  3. package/dist/web/client/assets/artifacts-panel-CJ75gQub.js +1 -0
  4. package/dist/web/client/assets/chat-Ci2cEQrR.js +52 -0
  5. package/dist/web/client/assets/{chat-command-palette-DfYSPPXI.js → chat-command-palette-CkISHfKE.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/{command-DPfiaYUL.js → command-_WjnervL.js} +1 -1
  8. package/dist/web/client/assets/fleet-message-queue-BCno4XP-.js +1 -0
  9. package/dist/web/client/assets/{fleet-pi-tool-renderer-AJoMbXBa.js → fleet-pi-tool-renderer-BEDIO3al.js} +4 -4
  10. package/dist/web/client/assets/fleet-reasoning-panel-CbkO7u-v.js +1 -0
  11. package/dist/web/client/assets/{fleet-subagent-list-BnRnrWKS.js → fleet-subagent-list-iKUtLJKZ.js} +1 -1
  12. package/dist/web/client/assets/fleet-tool-timeline-C8heL7ae.js +1 -0
  13. package/dist/web/client/assets/{fork-picker-dialog-CkcSekBl.js → fork-picker-dialog-ByBOGVsa.js} +1 -1
  14. package/dist/web/client/assets/globals-B_I1Eq1u.css +2 -0
  15. package/dist/web/client/assets/horizontal-resize-CwoDojST.js +1 -0
  16. package/dist/web/client/assets/{index-DlnHLDpx.js → index-DJ1fFbQu.js} +3 -3
  17. package/dist/web/client/assets/input-group-Tb5TYbzi.js +1 -0
  18. package/dist/web/client/assets/{ipython-tool-BrMePqD-.js → ipython-tool-ldJ9F1Cw.js} +1 -1
  19. package/dist/web/client/assets/model-selector-list-Ch05B2nZ.js +1 -0
  20. package/dist/web/client/assets/{openui-renderer-DwYFJdbe.js → openui-renderer-Bf60nxNi.js} +4 -4
  21. package/dist/web/client/assets/pencil-DcUwsKLn.js +1 -0
  22. package/dist/web/client/assets/prompt-input-qPIXZ-Rb.js +1 -0
  23. package/dist/web/client/assets/prompt-suggestions-Cc--lSNR.js +1 -0
  24. package/dist/web/client/assets/{provider-label-BCJh04J5.js → provider-label-DDLRnZyC.js} +1 -1
  25. package/dist/web/client/assets/repl-panel-DsPX04Xr.js +1 -0
  26. package/dist/web/client/assets/{resources-panel-Bo8dfUdm.js → resources-panel-D867-goy.js} +1 -1
  27. package/dist/web/client/assets/right-panel-registry-Dp8yX-oL.js +2 -0
  28. package/dist/web/client/assets/routes-DpgMJZ5n.js +16 -0
  29. package/dist/web/client/assets/safe-storage-s25GrfpH.js +1 -0
  30. package/dist/web/client/assets/session-insights-panel-YnaXvTpi.js +1 -0
  31. package/dist/web/client/assets/settings-dialog-YJkvt5EB.js +2 -0
  32. package/dist/web/client/assets/skeleton-loaders-C9vHwAYV.js +1 -0
  33. package/dist/web/client/assets/{subagent-chat-panel-DseoO31p.js → subagent-chat-panel-Yujplxpb.js} +1 -1
  34. package/dist/web/client/assets/subagent-transcript-CnI-mqN0.js +1 -0
  35. package/dist/web/client/assets/subagents-panel-CjXEdimj.js +1 -0
  36. package/dist/web/client/assets/{surfaces-cW-gp56p.js → surfaces-DI-U-_2a.js} +1 -1
  37. package/dist/web/client/assets/tool-result-DfnPN0FQ.js +4 -0
  38. package/dist/web/client/assets/ui-preferences-CImQGZm_.js +1 -0
  39. package/dist/web/client/assets/virtualized-turn-list--Vynre4D.js +6 -0
  40. package/dist/web/client/assets/{workspace-panel-DI1W3ce9.js → workspace-panel-CPPIznT9.js} +1 -1
  41. package/dist/web/client/bundle-budget.json +6 -6
  42. package/dist/web/server/{_tanstack-start-manifest_v-Cdx6hy2i-I7A5YJRU.js → _tanstack-start-manifest_v-DS_CSIFQ-WB3VTKF3.js} +15 -13
  43. package/dist/web/server/{agent-activity-B-JMvecd-SLE3GGY2.js → agent-activity-CS2rbF_C-A3R26CYH.js} +2 -2
  44. package/dist/web/server/{artifacts-panel-DLMK1O8P-42T45JMA.js → artifacts-panel-CaKrX2XC-R37I4BHF.js} +12 -12
  45. package/dist/web/server/{chat-command-palette-CdYwoTMe-4LBAZF7K.js → chat-command-palette-7gbqEnm9-6XICQZN7.js} +4 -4
  46. package/dist/web/server/{chunk-EBCYJSBR.js → chunk-7SD2ZSEA.js} +3 -3
  47. package/dist/web/server/{chunk-6AW2XFTZ.js → chunk-BBBS5AS7.js} +194 -10
  48. package/dist/web/server/{chunk-EOVMHQ2H.js → chunk-CNXJN5HN.js} +7 -7
  49. package/dist/web/server/{chunk-XKKXXG6N.js → chunk-DI7XRK2H.js} +2 -2
  50. package/dist/web/server/{chunk-KNJUSMBT.js → chunk-DZ2IC3FH.js} +2 -2
  51. package/dist/web/server/{chunk-K5ESTT4A.js → chunk-EAE2QXRK.js} +11 -3
  52. package/dist/web/server/{chunk-VHBFU4TG.js → chunk-EH4BZ6QM.js} +123 -16
  53. package/dist/web/server/{chunk-54II5QXQ.js → chunk-ETTDO4UO.js} +6 -3
  54. package/dist/web/server/{chunk-EHNIN245.js → chunk-GETSIVNU.js} +5 -5
  55. package/dist/web/server/{chunk-X2R5YPQZ.js → chunk-IJPCV6DH.js} +3 -2
  56. package/dist/web/server/{chunk-AJJ2S5FF.js → chunk-JQDLJ7KI.js} +20 -20
  57. package/dist/web/server/{chunk-M564UIEY.js → chunk-KELEYPVK.js} +8 -8
  58. package/dist/web/server/{chunk-OB5OSYJK.js → chunk-LXJD6IGW.js} +53 -29
  59. package/dist/web/server/chunk-M5RSPNYN.js +22 -0
  60. package/dist/web/server/{chunk-2TRF62K5.js → chunk-N6NOTURM.js} +3 -3
  61. package/dist/web/server/{chunk-5XX7RKJ6.js → chunk-NXJ32VFR.js} +5 -5
  62. package/dist/web/server/{chunk-P7H2OPKF.js → chunk-PIOFZUOU.js} +9 -1
  63. package/dist/web/server/chunk-PTCKOR23.js +39 -0
  64. package/dist/web/server/chunk-SZJUXVWG.js +40 -0
  65. package/dist/web/server/{chunk-TCH3U26B.js → chunk-TWYHHG5N.js} +2 -10
  66. package/dist/web/server/{chunk-FED63ZHU.js → chunk-WHBVQJ4K.js} +11 -6
  67. package/dist/web/server/{chunk-ANL4B775.js → chunk-XLNCWZMZ.js} +2 -2
  68. package/dist/web/server/{chunk-GM32R7JW.js → chunk-YKVGQBZA.js} +10 -8
  69. package/dist/web/server/{chunk-NRDG2ISJ.js → chunk-YNUWKMNQ.js} +59 -52
  70. package/dist/web/server/{chunk-3PIUR75R.js → chunk-YXXRP3NS.js} +9 -9
  71. package/dist/web/server/fleet-message-queue-BS-cZ56r-GLZXUKDF.js +152 -0
  72. package/dist/web/server/{fleet-pi-tool-renderer-RIeVlM9J-D6MISCQC.js → fleet-pi-tool-renderer-umKunT3K-O4GBH35V.js} +5 -5
  73. package/dist/web/server/{fleet-reasoning-panel-D_K48UOT-GN2PA6KT.js → fleet-reasoning-panel-BxC2COxi-GPLMQSTT.js} +9 -9
  74. package/dist/web/server/{fleet-subagent-list-5luKtpds-3OTVFHJQ.js → fleet-subagent-list-CpSYzCIq-JDH2LHSS.js} +1 -1
  75. package/dist/web/server/{fleet-tool-timeline-DwRqQgOj-HUFLGMDV.js → fleet-tool-timeline-IB36_PB2-XJENTO6I.js} +1 -1
  76. package/dist/web/server/{fork-picker-dialog-B9yGc8Au-IL63F2DN.js → fork-picker-dialog-DlINz9UQ-UWIXFDJX.js} +3 -3
  77. package/dist/web/server/{model-selector-list-cb2-ewoA-KIVU6LD3.js → model-selector-list-jBTZc2Mu-OXJOS5NA.js} +7 -7
  78. package/dist/web/server/{openui-renderer-Czy5Vo2L-BLXPJD65.js → openui-renderer-Biyyjhjn-SJOEKPTJ.js} +4 -4
  79. package/dist/web/server/{prompt-suggestions-BOmHi4-J-C563CHFU.js → prompt-suggestions-D4AEEY7K-RZSP7PWV.js} +3 -3
  80. package/dist/web/server/{repl-panel-yyxhwe4c-7U6HXYPS.js → repl-panel-D5KsoJik-BQKO53JO.js} +9 -9
  81. package/dist/web/server/{resources-panel-j4fAIi9g-5C267IXV.js → resources-panel-CE5pD4vy-V5FXBTYC.js} +2 -2
  82. package/dist/web/server/{router-CgSWrAYc-5UBYSZTJ.js → router-DWALoX_M-I5CBL7FQ.js} +1461 -515
  83. package/dist/web/server/{routes-CP_BBhD0-BAWQYGKY.js → routes-BBVirYfL-5WXMOT7M.js} +908 -566
  84. package/dist/web/server/server.js +2 -2
  85. package/dist/web/server/{session-insights-panel-BHZyKDTo-LRMAMA3O.js → session-insights-panel-CUhdgvRt-VB2HUCQP.js} +4 -4
  86. package/dist/web/server/{settings-dialog-CxHe8nym-KKXDPTIW.js → settings-dialog-DndPbM-v-RFNXXEAN.js} +902 -575
  87. package/dist/web/server/{subagent-chat-panel-DlSsM59d-DBW7DI3T.js → subagent-chat-panel-C0RpnXav-J7VYO7QY.js} +11 -11
  88. package/dist/web/server/{subagents-panel-Txzk8oDb-NRKLASYN.js → subagents-panel-jDqIn9Nh-YEV6QLUY.js} +13 -13
  89. package/dist/web/server/{workspace-panel-BOs-58Cv-SWQBMZSB.js → workspace-panel-CX_Vo6As-EWO6AMPI.js} +5 -4
  90. package/package.json +1 -1
  91. package/dist/web/client/assets/agent-activity-CDcDNVC6.js +0 -1
  92. package/dist/web/client/assets/artifacts-panel-CObI-DMt.js +0 -1
  93. package/dist/web/client/assets/chat-C8XDWWXz.js +0 -52
  94. package/dist/web/client/assets/fleet-message-queue-zWM5-y18.js +0 -1
  95. package/dist/web/client/assets/fleet-reasoning-panel-MtbSdoCv.js +0 -1
  96. package/dist/web/client/assets/fleet-tool-timeline-COzPrwr8.js +0 -1
  97. package/dist/web/client/assets/generative-text-renderer-CDKHv-v_.js +0 -6
  98. package/dist/web/client/assets/globals-DisQPFtV.css +0 -2
  99. package/dist/web/client/assets/horizontal-resize-Bl3AyBJg.js +0 -1
  100. package/dist/web/client/assets/input-group-BFDsCVS9.js +0 -1
  101. package/dist/web/client/assets/model-selector-list-DQaPFUYt.js +0 -1
  102. package/dist/web/client/assets/prompt-input-DZ4cho_e.js +0 -1
  103. package/dist/web/client/assets/prompt-suggestions-CXM6knMK.js +0 -1
  104. package/dist/web/client/assets/repl-panel-BDQ5MEgV.js +0 -1
  105. package/dist/web/client/assets/right-panel-registry-VVRPktV3.js +0 -2
  106. package/dist/web/client/assets/routes-DAikUNzO.js +0 -16
  107. package/dist/web/client/assets/session-insights-panel-CQdT90Op.js +0 -1
  108. package/dist/web/client/assets/settings-dialog-DS64KmwC.js +0 -1
  109. package/dist/web/client/assets/skeleton-loaders-DjGv9LLA.js +0 -1
  110. package/dist/web/client/assets/subagent-transcript-cxVKYnh9.js +0 -1
  111. package/dist/web/client/assets/subagents-panel-CHC96I68.js +0 -1
  112. package/dist/web/client/assets/tool-result-Baj3CdL_.js +0 -4
  113. package/dist/web/client/assets/ui-preferences-DUEFuJFj.js +0 -1
  114. package/dist/web/server/chunk-QK4CHLVV.js +0 -17
  115. package/dist/web/server/fleet-message-queue-BxycG26e-2XLOTCLP.js +0 -75
@@ -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-BBBS5AS7.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-D4VGGQxn.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,22 @@
1
+ import {
2
+ createLucideIcon
3
+ } from "./chunk-4ZIEVI5O.js";
4
+
5
+ // web/app/dist/server/assets/pencil-BbtQVrFg.js
6
+ var Pencil = createLucideIcon("pencil", [["path", {
7
+ d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",
8
+ key: "1a8usu"
9
+ }], ["path", {
10
+ d: "m15 5 4 4",
11
+ key: "1mk7zo"
12
+ }]]);
13
+
14
+ export {
15
+ Pencil
16
+ };
17
+ /**
18
+ * @license lucide-react v1.38.0 - ISC
19
+ *
20
+ * This source code is licensed under the ISC license.
21
+ * See the LICENSE file in the root directory of this source tree.
22
+ */
@@ -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",
@@ -9,9 +9,16 @@ import {
9
9
  cn
10
10
  } from "./chunk-DJMHPJBP.js";
11
11
 
12
- // web/app/dist/server/assets/input-group-BcYuKbrc.js
12
+ // web/app/dist/server/assets/input-group-TQw1asH2.js
13
13
  import "react";
14
14
  import { jsx } from "react/jsx-runtime";
15
+ function Textarea({ className, ...props }) {
16
+ return /* @__PURE__ */ jsx("textarea", {
17
+ "data-slot": "textarea",
18
+ className: cn("flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", className),
19
+ ...props
20
+ });
21
+ }
15
22
  function InputGroup({ className, ...props }) {
16
23
  return /* @__PURE__ */ jsx("div", {
17
24
  "data-slot": "input-group",
@@ -69,6 +76,7 @@ function InputGroupInput({ className, ...props }) {
69
76
  }
70
77
 
71
78
  export {
79
+ Textarea,
72
80
  InputGroup,
73
81
  InputGroupAddon,
74
82
  InputGroupButton,
@@ -0,0 +1,39 @@
1
+ // web/app/dist/server/assets/session-label-DAwGAfxA.js
2
+ var SECRET_VALUE_PATTERNS = [
3
+ /\bsk-[A-Za-z0-9._-]{8,}\b/g,
4
+ /\b(?:github_pat_|gh[pousr]_)[A-Za-z0-9_]{8,}\b/g,
5
+ /\bxox[baprs]-[A-Za-z0-9-]{8,}\b/g,
6
+ /\bAIza[A-Za-z0-9_-]{20,}\b/g
7
+ ];
8
+ var NAMED_SECRET_PATTERN = /\b(api[ _-]?key|access[ _-]?token|auth[ _-]?token|bearer|password|secret)\s*([:=])\s*(?:"[^"]*"|'[^']*'|[^\s,;]+)/gi;
9
+ function redactSessionLabelSecrets(label) {
10
+ let redacted = label.replace(NAMED_SECRET_PATTERN, (_match, name, separator) => `${name}${separator} [redacted]`);
11
+ for (const pattern of SECRET_VALUE_PATTERNS) redacted = redacted.replace(pattern, "[redacted]");
12
+ return redacted;
13
+ }
14
+ function meaningfulSessionLabel(value) {
15
+ const trimmed = value?.trim();
16
+ if (!trimmed || trimmed === "(no messages)") return void 0;
17
+ const redacted = redactSessionLabelSecrets(trimmed).trim();
18
+ return redacted.length > 0 ? redacted : void 0;
19
+ }
20
+ function fallbackSessionLabel(sessionId) {
21
+ return sessionId.slice(0, 8);
22
+ }
23
+ function sessionListTitle(input) {
24
+ return meaningfulSessionLabel(input.title) ?? meaningfulSessionLabel(input.firstMessage) ?? fallbackSessionLabel(input.sessionId);
25
+ }
26
+ function disambiguateSessionLabel(base, sessionId, collidingCount) {
27
+ if (collidingCount <= 1) return base;
28
+ const suffix = sessionId.slice(-4);
29
+ if (base.endsWith(suffix)) return base;
30
+ return `${base} \xB7 ${suffix}`;
31
+ }
32
+
33
+ export {
34
+ redactSessionLabelSecrets,
35
+ meaningfulSessionLabel,
36
+ fallbackSessionLabel,
37
+ sessionListTitle,
38
+ disambiguateSessionLabel
39
+ };
@@ -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
+ };
@@ -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-Bp5Y1v8Y.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";
@@ -181,13 +181,6 @@ var Cpu = createLucideIcon("cpu", [
181
181
  key: "z9xiuo"
182
182
  }]
183
183
  ]);
184
- var Pencil = createLucideIcon("pencil", [["path", {
185
- d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",
186
- key: "1a8usu"
187
- }], ["path", {
188
- d: "m15 5 4 4",
189
- key: "1mk7zo"
190
- }]]);
191
184
  var Server = createLucideIcon("server", [
192
185
  ["rect", {
193
186
  width: "20",
@@ -908,7 +901,7 @@ function safePolygon(options = {}) {
908
901
  };
909
902
  return fn;
910
903
  }
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";
904
+ 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
905
  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
906
  var HIT_AREA_EXPAND_DENSE_CLASS = "relative after:absolute after:inset-x-0 after:-top-1.5 after:-bottom-1.5";
914
907
  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";
@@ -1166,7 +1159,6 @@ function formatProviderLabel(provider) {
1166
1159
  export {
1167
1160
  ArrowLeft,
1168
1161
  Cpu,
1169
- Pencil,
1170
1162
  Settings,
1171
1163
  Trash2,
1172
1164
  getDelay,
@@ -1,6 +1,10 @@
1
1
  import {
2
2
  redactSessionLabelSecrets
3
- } from "./chunk-QK4CHLVV.js";
3
+ } from "./chunk-PTCKOR23.js";
4
+ import {
5
+ readStoredValue,
6
+ writeStoredValue
7
+ } from "./chunk-SZJUXVWG.js";
4
8
  import {
5
9
  AnimatePresence,
6
10
  useReducedMotion
@@ -16,7 +20,7 @@ import {
16
20
  cn
17
21
  } from "./chunk-DJMHPJBP.js";
18
22
 
19
- // web/app/dist/server/assets/horizontal-resize-Dy1Vuw1s.js
23
+ // web/app/dist/server/assets/horizontal-resize-By86nXcf.js
20
24
  import { Children, cloneElement, forwardRef, isValidElement, useId, useState } from "react";
21
25
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
22
26
  var File = createLucideIcon("file", [["path", {
@@ -30,7 +34,7 @@ var FolderOpen = createLucideIcon("folder-open", [["path", {
30
34
  d: "m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",
31
35
  key: "usdka0"
32
36
  }]]);
33
- var RESOURCE_CANVAS_VIEWPORT_RATIO = 0.5;
37
+ var RESOURCE_CANVAS_VIEWPORT_RATIO = 0.4;
34
38
  var DESKTOP_PANEL_ONLY = "min-[960px]:hidden";
35
39
  var WORKSPACE_SPLIT_HIDDEN_BLOCK = "hidden min-[640px]:block";
36
40
  var WORKSPACE_SPLIT_GAP_RESET = "min-[640px]:gap-0";
@@ -184,12 +188,13 @@ function isDaytonaNotConnectedError(error) {
184
188
  }
185
189
  function readStoredWidth(storageKey, defaultWidth, clamp) {
186
190
  if (typeof window === "undefined") return defaultWidth;
187
- const value = Number(window.localStorage.getItem(storageKey));
191
+ const stored = readStoredValue(storageKey);
192
+ if (stored === null) return defaultWidth;
193
+ const value = Number(stored);
188
194
  return Number.isFinite(value) ? clamp(value) : defaultWidth;
189
195
  }
190
196
  function storeStoredWidth(storageKey, width) {
191
- if (typeof window === "undefined") return;
192
- window.localStorage.setItem(storageKey, String(Math.round(width)));
197
+ writeStoredValue(storageKey, String(Math.round(width)));
193
198
  }
194
199
  function startHorizontalResize({ event, getNextWidth, onWidthChange, startWidth, startX }) {
195
200
  event.preventDefault();
@@ -2,7 +2,7 @@ import {
2
2
  cn
3
3
  } from "./chunk-DJMHPJBP.js";
4
4
 
5
- // web/app/dist/server/assets/surfaces-BwzRUxHG.js
5
+ // web/app/dist/server/assets/surfaces-DlT92b6L.js
6
6
  import { useLayoutEffect, useRef, useState } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  var paper = "bg-background shadow-[0_1px_2px_rgba(0,0,0,0.04),0_12px_32px_-16px_rgba(0,0,0,0.12)] dark:bg-popover dark:shadow-none";
@@ -12,7 +12,7 @@ var labelSwap = "col-start-1 row-start-1 flex w-max items-center gap-1.5 leading
12
12
  var labelSwapIn = "opacity-100 blur-none";
13
13
  var labelSwapOut = "pointer-events-none select-none opacity-0 blur-[2px]";
14
14
  var collapsePanel = "h-(--collapsible-panel-height) overflow-hidden transition-[height] duration-200 ease-[cubic-bezier(0.32,0.72,0,1)] data-[ending-style]:h-0 data-[starting-style]:h-0 motion-reduce:transition-none";
15
- var mono = "font-mono text-[11px] tracking-tight";
15
+ var mono = "font-mono text-[0.6875rem] tracking-tight";
16
16
  function ShimmerLabel({ active = true, className, ...props }) {
17
17
  return /* @__PURE__ */ jsx("span", {
18
18
  className: cn(active && "shimmer motion-reduce:animate-none", className),
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-PVJCTQFK.js";
7
7
  import {
8
8
  useHoverCapable
9
- } from "./chunk-2TRF62K5.js";
9
+ } from "./chunk-N6NOTURM.js";
10
10
  import {
11
11
  LoaderCircle
12
12
  } from "./chunk-TNL4YV63.js";
@@ -50,7 +50,7 @@ import {
50
50
  cn
51
51
  } from "./chunk-DJMHPJBP.js";
52
52
 
53
- // web/app/dist/server/assets/prompt-input-JtVsQDA2.js
53
+ // web/app/dist/server/assets/prompt-input-CQuyIgBz.js
54
54
  import { cloneElement, createContext, forwardRef, isValidElement, useCallback, useContext, useEffect, useEffectEvent, useId, useInsertionEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
55
55
  import { jsx, jsxs } from "react/jsx-runtime";
56
56
  import { createPortal } from "react-dom";
@@ -498,15 +498,15 @@ forwardRef(function StatefulButton({ state = "idle", children, loadingText = "Lo
498
498
  children: [
499
499
  state === "loading" ? /* @__PURE__ */ jsx(IconSlot, {
500
500
  keyId: "loading-icon",
501
- children: /* @__PURE__ */ jsx(LoaderCircle, { className: "h-4 w-4 animate-spin" })
501
+ children: /* @__PURE__ */ jsx(LoaderCircle, { className: "size-4 animate-spin" })
502
502
  }) : null,
503
503
  state === "success" ? /* @__PURE__ */ jsx(IconSlot, {
504
504
  keyId: "success-icon",
505
- children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" })
505
+ children: /* @__PURE__ */ jsx(Check, { className: "size-4" })
506
506
  }) : null,
507
507
  state === "error" ? /* @__PURE__ */ jsx(IconSlot, {
508
508
  keyId: "error-icon",
509
- children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
509
+ children: /* @__PURE__ */ jsx(X, { className: "size-4" })
510
510
  }) : null
511
511
  ]
512
512
  }),
@@ -894,7 +894,7 @@ function AnimatedSelectTrigger({ className, children }) {
894
894
  animate: { rotate: ctx.open ? 180 : 0 },
895
895
  transition: ctx.reduce ? { duration: 0 } : CHEVRON_TRANSITION,
896
896
  className: "text-muted-foreground",
897
- children: /* @__PURE__ */ jsx(ChevronDown, { className: "h-4 w-4" })
897
+ children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-4" })
898
898
  })]
899
899
  });
900
900
  }
@@ -1028,7 +1028,7 @@ function AnimatedSelectItem({ value, disabled = false, className, children }) {
1028
1028
  disabled,
1029
1029
  onClick: () => ctx.select(value),
1030
1030
  className: cn("flex w-full items-center justify-between gap-2 rounded-lg px-2.5 py-1.5 text-left text-sm outline-none transition-colors", selected ? "bg-muted text-foreground" : "text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:bg-muted", "disabled:pointer-events-none disabled:opacity-50", className),
1031
- children: [children, selected ? /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 shrink-0" }) : null]
1031
+ children: [children, selected ? /* @__PURE__ */ jsx(Check, { className: "size-3.5 shrink-0" }) : null]
1032
1032
  })
1033
1033
  });
1034
1034
  }
@@ -1059,7 +1059,9 @@ function PromptInput({ value, defaultValue = "", onValueChange, models = [], mod
1059
1059
  resizeTextarea();
1060
1060
  }, [resizeTextarea]);
1061
1061
  const resizeRef = useRef(resizeTextarea);
1062
- resizeRef.current = resizeTextarea;
1062
+ useEffect(() => {
1063
+ resizeRef.current = resizeTextarea;
1064
+ });
1063
1065
  useEffect(() => {
1064
1066
  const textarea = textareaRef.current;
1065
1067
  if (!textarea || typeof ResizeObserver === "undefined") return;