@qredence/fleet 0.10.1 → 0.10.3

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 (60) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/runtime-manifest.json +14 -14
  3. package/dist/web/client/assets/{artifacts-panel-6JEdy6jU.js → artifacts-panel-CfWH5cQn.js} +1 -1
  4. package/dist/web/client/assets/{chat-command-palette-Bxr5EkO6.js → chat-command-palette-CKGrP-Ke.js} +1 -1
  5. package/dist/web/client/assets/{ease-DYVhTl2n.js → ease-nNJMFgD_.js} +1 -1
  6. package/dist/web/client/assets/globals-C6h6fq-s.css +2 -0
  7. package/dist/web/client/assets/index-DJDQWCGd.js +12 -0
  8. package/dist/web/client/assets/{model-selector-list-CbDAT0Rw.js → model-selector-list-CIJArf3L.js} +1 -1
  9. package/dist/web/client/assets/{prompt-input-CoV1gTUQ.js → prompt-input-0kaw0ekd.js} +1 -1
  10. package/dist/web/client/assets/{right-panel-registry-BAJ6TuEY.js → right-panel-registry-BkBAryPm.js} +2 -2
  11. package/dist/web/client/assets/routes-C6C0y-oH.js +14 -0
  12. package/dist/web/client/assets/{session-activity-panel-DwaXiSrS.js → session-activity-panel-BloVPsLJ.js} +1 -1
  13. package/dist/web/client/assets/{session-tool-renderer-DEABxZG3.js → session-tool-renderer-CGMatufW.js} +1 -1
  14. package/dist/web/client/assets/{subagent-chat-panel-R2RoX1Yt.js → subagent-chat-panel-xm-zBsFL.js} +1 -1
  15. package/dist/web/client/assets/{subagent-transcript-DVZhMo7a.js → subagent-transcript-BzToBVWk.js} +1 -1
  16. package/dist/web/client/assets/{subagents-panel-CMMRUP8F.js → subagents-panel-B5ooG4sS.js} +1 -1
  17. package/dist/web/client/assets/{tool-part-normalizer-CF6bmJ0s.js → tool-part-normalizer-CJ2sY87r.js} +1 -1
  18. package/dist/web/client/assets/{tool-result-7qREIVv_.js → tool-result-C_RIixge.js} +4 -4
  19. package/dist/web/client/assets/{tool-timeline-CGhwMeNl.js → tool-timeline-BVY5VQ3a.js} +2 -2
  20. package/dist/web/client/assets/{use-reduced-motion-CFEp5oKr.js → use-reduced-motion-69Ji0Qlf.js} +1 -1
  21. package/dist/web/client/assets/workspace-panel-DsZZnfkm.js +1 -0
  22. package/dist/web/client/bundle-budget.json +5 -5
  23. package/dist/web/server/{_tanstack-start-manifest_v-BiMhF9NX-QUZEGAB6.js → _tanstack-start-manifest_v-Cs4JeecK-7Q7PABV3.js} +9 -9
  24. package/dist/web/server/{agents-DOgCHixY-KUZP2VDO.js → agents-DOgCHixY-TU7YLWS2.js} +1 -1
  25. package/dist/web/server/{agents-page-BdiR9H8w-M6X6SXMF.js → agents-page-BdiR9H8w-UXB7T3LH.js} +2 -2
  26. package/dist/web/server/{artifacts-panel-BNiaRF83-HDC6VQ66.js → artifacts-panel-DjaLT-MS-DAPJTA2V.js} +6 -6
  27. package/dist/web/server/{chat-command-palette-CT9aJAWG-LV26BDEW.js → chat-command-palette-CGCsCr9E-U5PCLXNE.js} +4 -4
  28. package/dist/web/server/{chunk-5XRESJQR.js → chunk-2Y2543CV.js} +3 -3
  29. package/dist/web/server/{chunk-4YQ7RBB7.js → chunk-3LAD2C43.js} +3 -3
  30. package/dist/web/server/{chunk-RX2ZJARF.js → chunk-4OLRCVML.js} +2 -21
  31. package/dist/web/server/{chunk-35RIM6VP.js → chunk-CPB76YQU.js} +1251 -740
  32. package/dist/web/server/{chunk-2ETDIMNM.js → chunk-ETVLY2KE.js} +1 -1
  33. package/dist/web/server/{chunk-4TKPOOIG.js → chunk-MEAWBN4N.js} +4 -4
  34. package/dist/web/server/{chunk-KBMRRJQN.js → chunk-PBNUO4IN.js} +2 -2
  35. package/dist/web/server/{chunk-LEZMRXSP.js → chunk-QWJE6ES6.js} +37 -24
  36. package/dist/web/server/{chunk-3CU2ITG7.js → chunk-UULUKSQD.js} +170 -529
  37. package/dist/web/server/{chunk-3R7XCOWI.js → chunk-UZ2KHDSW.js} +5 -5
  38. package/dist/web/server/{chunk-27J2LPAW.js → chunk-VBCFQNR3.js} +2 -2
  39. package/dist/web/server/{connectors-Dv_uPdv0-2X5VWQXK.js → connectors-Dv_uPdv0-2TCNQ3TU.js} +1 -1
  40. package/dist/web/server/{connectors-page-DW75T-uH-EKRHUZ6K.js → connectors-page-DW75T-uH-BR36R6FT.js} +2 -2
  41. package/dist/web/server/{create-project-dialog-EwieT1Vw-X5MYQSZM.js → create-project-dialog-aCD1v__i-37Y2AYF7.js} +4 -4
  42. package/dist/web/server/{model-selector-list-By_G7_Hr-GXT27BZO.js → model-selector-list-q8bMnmhy-SPFJGUBT.js} +2 -2
  43. package/dist/web/server/{openui-renderer-DCkg_JoD-4QCKSVY5.js → openui-renderer-DNl7TU3v-LAP3OM5H.js} +3 -3
  44. package/dist/web/server/{resources-panel-s0mgyvgQ-FVMBBLJJ.js → resources-panel-Dtm8nlrt-PMS7NWKW.js} +5 -5
  45. package/dist/web/server/{router-DXxChQOI-B7VVEX3H.js → router-CFtn3QOM-3WK4R4UB.js} +2 -2
  46. package/dist/web/server/{routes-D-g2ILNg-LDYCQ4NU.js → routes-CpT-KFt7-F6WEPWF6.js} +3 -3
  47. package/dist/web/server/server.js +1415 -1004
  48. package/dist/web/server/{session-activity-panel-wC0jAJvs-QAHJXPAM.js → session-activity-panel-Dr9Q0Wmd-2F7ZYCAY.js} +5 -5
  49. package/dist/web/server/{session-reasoning-panel-B_K8YgF5-AQPMFM3Y.js → session-reasoning-panel-BFyfdmnZ-AQBC4WAL.js} +4 -4
  50. package/dist/web/server/{session-tool-renderer-D96BACVh-CH5CV3TS.js → session-tool-renderer-DHu5tv0A-YFP7I2UC.js} +5 -5
  51. package/dist/web/server/{session-tree-panel-CZGXNZIP-FBB3XGMN.js → session-tree-panel-BkMTm2QF-K56UQR2K.js} +4 -4
  52. package/dist/web/server/{settings-dialog-BrjqiTVe-H7WOTB4I.js → settings-dialog-1Zr_EiEd-GDE4IXK2.js} +5 -5
  53. package/dist/web/server/{subagent-chat-panel-Dz62jo_m-X4ZRN5KI.js → subagent-chat-panel-BCm1x_mR-HY6QEHEF.js} +8 -8
  54. package/dist/web/server/{subagents-panel-CwpbzJJz-N3ISHODM.js → subagents-panel-3gfZLsTx-7D53UO7K.js} +8 -8
  55. package/dist/web/server/{workspace-panel-C7akv5b9-XUKEHPOP.js → workspace-panel-BeSOuvp7-7N3CAG2K.js} +5 -5
  56. package/package.json +1 -1
  57. package/dist/web/client/assets/globals-DDDleTbS.css +0 -2
  58. package/dist/web/client/assets/index-CEZTSuLf.js +0 -13
  59. package/dist/web/client/assets/routes-EKRITFZz.js +0 -14
  60. package/dist/web/client/assets/workspace-panel-Da5I4p_t.js +0 -1
@@ -39,9 +39,8 @@ import {
39
39
  EASE_OUT,
40
40
  SPRING_LAYOUT,
41
41
  SPRING_PRESS,
42
- SPRING_SWAP,
43
- spring
44
- } from "./chunk-RX2ZJARF.js";
42
+ SPRING_SWAP
43
+ } from "./chunk-4OLRCVML.js";
45
44
  import {
46
45
  UiErrorBoundary,
47
46
  decodeOpenPanelActionMessage,
@@ -318,7 +317,7 @@ import {
318
317
  import {
319
318
  Link,
320
319
  useNavigate
321
- } from "./chunk-35RIM6VP.js";
320
+ } from "./chunk-CPB76YQU.js";
322
321
  import {
323
322
  __export
324
323
  } from "./chunk-CZ7CSFO4.js";
@@ -525,7 +524,7 @@ function isDaytonaNotConnectedError(error) {
525
524
  return error.status === 403;
526
525
  }
527
526
 
528
- // web/app/dist/server/assets/routes-D-g2ILNg.js
527
+ // web/app/dist/server/assets/routes-CpT-KFt7.js
529
528
  import { Fragment as Fragment4, Suspense as Suspense2, createContext as createContext8, forwardRef as forwardRef15, isValidElement, lazy as lazy2, memo, useCallback as useCallback3, useContext as useContext8, useEffect as useEffect3, useEffectEvent, useId, useLayoutEffect, useMemo as useMemo8, useReducer, useRef as useRef12, useState as useState7, useSyncExternalStore as useSyncExternalStore2 } from "react";
530
529
  import { Fragment as Fragment$1, jsx as jsx4, jsxs } from "react/jsx-runtime";
531
530
  import { createPortal } from "react-dom";
@@ -3233,7 +3232,7 @@ var TabsList = /* @__PURE__ */ React31.forwardRef(function TabsList2(componentPr
3233
3232
  });
3234
3233
  if (process.env.NODE_ENV !== "production") TabsList.displayName = "TabsList";
3235
3234
 
3236
- // web/app/dist/server/assets/routes-D-g2ILNg.js
3235
+ // web/app/dist/server/assets/routes-CpT-KFt7.js
3237
3236
  function isChatTextPart(part) {
3238
3237
  return part.type === "text";
3239
3238
  }
@@ -3485,7 +3484,7 @@ function PromptInput({ value, defaultValue = "", onValueChange, onSubmit, loadin
3485
3484
  ]
3486
3485
  });
3487
3486
  }
3488
- var LazyGenerativeTextRenderer = lazy2(() => import("./openui-renderer-DCkg_JoD-4QCKSVY5.js").then(({ GenerativeTextRenderer }) => ({ default: GenerativeTextRenderer })));
3487
+ var LazyGenerativeTextRenderer = lazy2(() => import("./openui-renderer-DNl7TU3v-LAP3OM5H.js").then(({ GenerativeTextRenderer }) => ({ default: GenerativeTextRenderer })));
3489
3488
  function PlainTextFallback({ className, content }) {
3490
3489
  return /* @__PURE__ */ jsx4("div", {
3491
3490
  className: className ? `${className} whitespace-pre-wrap` : "whitespace-pre-wrap",
@@ -5479,13 +5478,13 @@ function normalizeAssistantToolParts(parts) {
5479
5478
  });
5480
5479
  return changed ? normalizedParts : parts;
5481
5480
  }
5482
- var LazyArtifactsPanel = lazy2(() => import("./artifacts-panel-BNiaRF83-HDC6VQ66.js").then(({ ArtifactsPanelContent }) => ({ default: ArtifactsPanelContent })));
5483
- var LazyResourcesPanel = lazy2(() => import("./resources-panel-s0mgyvgQ-FVMBBLJJ.js").then(({ ResourcesPanelContent }) => ({ default: ResourcesPanelContent })));
5481
+ var LazyArtifactsPanel = lazy2(() => import("./artifacts-panel-DjaLT-MS-DAPJTA2V.js").then(({ ArtifactsPanelContent }) => ({ default: ArtifactsPanelContent })));
5482
+ var LazyResourcesPanel = lazy2(() => import("./resources-panel-Dtm8nlrt-PMS7NWKW.js").then(({ ResourcesPanelContent }) => ({ default: ResourcesPanelContent })));
5484
5483
  var LazySessionInsightsPanel = lazy2(() => import("./session-insights-panel-BiVObm_6-AP4FITT7.js").then(({ SessionInsightsPanel }) => ({ default: SessionInsightsPanel })));
5485
5484
  var LazyReplPanel = lazy2(() => import("./repl-panel-1kSS1UGd-POXRYDDJ.js").then(({ ReplPanelContent }) => ({ default: ReplPanelContent })));
5486
- var LazySubagentsPanel = lazy2(() => import("./subagents-panel-CwpbzJJz-N3ISHODM.js").then(({ SubagentsPanelContent }) => ({ default: SubagentsPanelContent })));
5487
- var LazyWorkspacePanel = lazy2(() => import("./workspace-panel-C7akv5b9-XUKEHPOP.js").then(({ WorkspacePanelContent }) => ({ default: WorkspacePanelContent })));
5488
- var LazySessionTreePanel = lazy2(() => import("./session-tree-panel-CZGXNZIP-FBB3XGMN.js").then(({ SessionTreePanel }) => ({ default: SessionTreePanel })));
5485
+ var LazySubagentsPanel = lazy2(() => import("./subagents-panel-3gfZLsTx-7D53UO7K.js").then(({ SubagentsPanelContent }) => ({ default: SubagentsPanelContent })));
5486
+ var LazyWorkspacePanel = lazy2(() => import("./workspace-panel-BeSOuvp7-7N3CAG2K.js").then(({ WorkspacePanelContent }) => ({ default: WorkspacePanelContent })));
5487
+ var LazySessionTreePanel = lazy2(() => import("./session-tree-panel-BkMTm2QF-K56UQR2K.js").then(({ SessionTreePanel }) => ({ default: SessionTreePanel })));
5489
5488
  function PanelFallback() {
5490
5489
  return /* @__PURE__ */ jsxs("div", {
5491
5490
  className: "flex min-h-32 flex-col gap-3 p-4",
@@ -7124,7 +7123,7 @@ function useInputBarState({ models, status, thinkingLevel, onModelChange, onThin
7124
7123
  value
7125
7124
  };
7126
7125
  }
7127
- var LazyModelSelectorList = lazy2(() => import("./model-selector-list-By_G7_Hr-GXT27BZO.js").then(({ ModelSelectorList: ModelSelectorList2 }) => ({ default: ModelSelectorList2 })));
7126
+ var LazyModelSelectorList = lazy2(() => import("./model-selector-list-q8bMnmhy-SPFJGUBT.js").then(({ ModelSelectorList: ModelSelectorList2 }) => ({ default: ModelSelectorList2 })));
7128
7127
  function ModelSelectorList(props) {
7129
7128
  return /* @__PURE__ */ jsx4(Suspense2, {
7130
7129
  fallback: /* @__PURE__ */ jsx4("div", {
@@ -7624,7 +7623,7 @@ function iconFor(kind) {
7624
7623
  return kind;
7625
7624
  }
7626
7625
  }
7627
- var LazySessionToolRenderer = lazy2(() => import("./session-tool-renderer-D96BACVh-CH5CV3TS.js").then((n) => n.n).then(({ SessionToolRenderer: SessionToolRenderer2 }) => ({ default: SessionToolRenderer2 })));
7626
+ var LazySessionToolRenderer = lazy2(() => import("./session-tool-renderer-DHu5tv0A-YFP7I2UC.js").then((n) => n.n).then(({ SessionToolRenderer: SessionToolRenderer2 }) => ({ default: SessionToolRenderer2 })));
7628
7627
  function SessionToolRenderer(props) {
7629
7628
  return /* @__PURE__ */ jsx4(Suspense2, {
7630
7629
  fallback: /* @__PURE__ */ jsx4("div", {
@@ -7635,7 +7634,7 @@ function SessionToolRenderer(props) {
7635
7634
  children: /* @__PURE__ */ jsx4(LazySessionToolRenderer, { ...props })
7636
7635
  });
7637
7636
  }
7638
- var LazySessionReasoningPanel = lazy2(() => import("./session-reasoning-panel-B_K8YgF5-AQPMFM3Y.js").then(({ SessionReasoningPanel: SessionReasoningPanel2 }) => ({ default: SessionReasoningPanel2 })));
7637
+ var LazySessionReasoningPanel = lazy2(() => import("./session-reasoning-panel-BFyfdmnZ-AQBC4WAL.js").then(({ SessionReasoningPanel: SessionReasoningPanel2 }) => ({ default: SessionReasoningPanel2 })));
7639
7638
  function SessionReasoningPanel(props) {
7640
7639
  return /* @__PURE__ */ jsx4(Suspense2, {
7641
7640
  fallback: /* @__PURE__ */ jsx4("div", {
@@ -12122,376 +12121,96 @@ function TabsTrigger({ className, ...props }) {
12122
12121
  ...props
12123
12122
  });
12124
12123
  }
12125
- function useProximityHover(containerRef, options = {}) {
12126
- const { axis = "y" } = options;
12127
- const itemsRef = useRef12(/* @__PURE__ */ new Map());
12128
- const itemObserversRef = useRef12(/* @__PURE__ */ new Map());
12129
- const [activeIndex, setActiveIndex] = useState7(null);
12130
- const [itemRects, setItemRects] = useState7([]);
12131
- const itemRectsRef = useRef12([]);
12132
- const rafIdRef = useRef12(null);
12133
- const remeasureRafIdRef = useRef12(null);
12134
- const measureItems = useCallback3(() => {
12135
- if (!containerRef.current) return;
12136
- const rects = [];
12137
- itemsRef.current.forEach((element, index2) => {
12138
- rects[index2] = {
12139
- top: element.offsetTop,
12140
- height: element.offsetHeight,
12141
- left: element.offsetLeft,
12142
- width: element.offsetWidth
12143
- };
12144
- });
12145
- const prev = itemRectsRef.current;
12146
- let changed = prev.length !== rects.length;
12147
- for (let i = 0; !changed && i < rects.length; i++) {
12148
- const p = prev[i];
12149
- const r = rects[i];
12150
- if (p === r) continue;
12151
- changed = !p || !r || p.top !== r.top || p.left !== r.left || p.width !== r.width || p.height !== r.height;
12152
- }
12153
- if (!changed) return;
12154
- itemRectsRef.current = rects;
12155
- setItemRects(rects);
12156
- }, [containerRef]);
12157
- const scheduleRemeasure = useCallback3(() => {
12158
- if (remeasureRafIdRef.current !== null) cancelAnimationFrame(remeasureRafIdRef.current);
12159
- remeasureRafIdRef.current = requestAnimationFrame(() => {
12160
- remeasureRafIdRef.current = null;
12161
- measureItems();
12162
- });
12163
- }, [measureItems]);
12164
- const registerItem = useCallback3((index2, element) => {
12165
- const existingObserver = itemObserversRef.current.get(index2);
12166
- if (existingObserver) {
12167
- existingObserver.disconnect();
12168
- itemObserversRef.current.delete(index2);
12169
- }
12170
- if (element) {
12171
- itemsRef.current.set(index2, element);
12172
- if (typeof ResizeObserver !== "undefined") {
12173
- const observer = new ResizeObserver(() => scheduleRemeasure());
12174
- observer.observe(element);
12175
- itemObserversRef.current.set(index2, observer);
12176
- }
12177
- } else itemsRef.current.delete(index2);
12178
- scheduleRemeasure();
12179
- }, [scheduleRemeasure]);
12180
- const onMouseMove = useCallback3((e) => {
12181
- const mouseX = e.clientX;
12182
- const mouseY = e.clientY;
12183
- if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current);
12184
- rafIdRef.current = requestAnimationFrame(() => {
12185
- rafIdRef.current = null;
12186
- const container = containerRef.current;
12187
- if (!container) return;
12188
- const containerRect = container.getBoundingClientRect();
12189
- const mousePos = axis === "x" ? mouseX : mouseY;
12190
- let closestIndex = null;
12191
- let closestDistance = Infinity;
12192
- let containingIndex = null;
12193
- const rects = itemRectsRef.current;
12194
- const scrollOffset = axis === "x" ? container.scrollLeft : container.scrollTop;
12195
- const borderOffset = axis === "x" ? container.clientLeft : container.clientTop;
12196
- const containerEdge = axis === "x" ? containerRect.left : containerRect.top;
12197
- const layoutSize = axis === "x" ? container.offsetWidth : container.offsetHeight;
12198
- const visualSize = axis === "x" ? containerRect.width : containerRect.height;
12199
- const scale = layoutSize > 0 ? visualSize / layoutSize : 1;
12200
- for (let index2 = 0; index2 < rects.length; index2++) {
12201
- const r = rects[index2];
12202
- if (!r) continue;
12203
- const itemStart = containerEdge + (borderOffset + (axis === "x" ? r.left : r.top) - scrollOffset) * scale;
12204
- const itemSize = (axis === "x" ? r.width : r.height) * scale;
12205
- const itemEnd = itemStart + itemSize;
12206
- if (mousePos >= itemStart && mousePos <= itemEnd) containingIndex = index2;
12207
- const itemCenter = itemStart + itemSize / 2;
12208
- const distance = Math.abs(mousePos - itemCenter);
12209
- if (distance < closestDistance) {
12210
- closestDistance = distance;
12211
- closestIndex = index2;
12212
- }
12213
- }
12214
- setActiveIndex(containingIndex ?? closestIndex);
12215
- });
12216
- }, [axis, containerRef]);
12217
- const onMouseLeave = useCallback3(() => {
12218
- if (rafIdRef.current !== null) {
12219
- cancelAnimationFrame(rafIdRef.current);
12220
- rafIdRef.current = null;
12221
- }
12222
- setActiveIndex(null);
12223
- }, []);
12224
- useEffect3(() => {
12225
- const container = containerRef.current;
12226
- if (!container || typeof ResizeObserver === "undefined") return;
12227
- const ro = new ResizeObserver(() => scheduleRemeasure());
12228
- ro.observe(container);
12229
- return () => ro.disconnect();
12230
- }, [containerRef, scheduleRemeasure]);
12231
- useEffect3(() => {
12232
- return () => {
12233
- if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current);
12234
- if (remeasureRafIdRef.current !== null) cancelAnimationFrame(remeasureRafIdRef.current);
12235
- itemObserversRef.current.forEach((observer) => {
12236
- observer.disconnect();
12237
- });
12238
- itemObserversRef.current.clear();
12239
- };
12240
- }, []);
12241
- return {
12242
- activeIndex,
12243
- setActiveIndex,
12244
- itemRects,
12245
- onMouseMove,
12246
- onMouseLeave,
12247
- registerItem,
12248
- measureItems
12249
- };
12250
- }
12251
- var ACTIVE_PILL_CLASS = "bg-background shadow-sm";
12252
- var PILL_TRACK_CLASS = "rounded-full border border-border/70 bg-sidebar p-0.5 shadow-sm backdrop-blur";
12253
- var PILL_RADIUS = "rounded-full";
12254
- function chromeTone(isPill, isActive) {
12255
- if (isActive) return isPill ? "text-foreground/75" : "text-foreground";
12256
- return isPill ? "text-foreground/55" : "text-muted-foreground";
12257
- }
12258
- var TabsSubtleContext = createContext8(null);
12259
- function useTabsSubtle() {
12260
- const ctx = useContext8(TabsSubtleContext);
12261
- if (!ctx) throw new Error("useTabsSubtle must be used within a TabsSubtle");
12262
- return ctx;
12263
- }
12264
- function TabsSubtleIndicators({ selectedRect, hoverRect, focusRect, isHovering, isHoveringSelected }) {
12265
- const instant = useReducedMotion() ? { duration: 0 } : void 0;
12266
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
12267
- selectedRect ? /* @__PURE__ */ jsx4(m.div, {
12268
- className: cn("pointer-events-none absolute", ACTIVE_PILL_CLASS, PILL_RADIUS),
12269
- layout: true,
12270
- initial: false,
12271
- style: {
12272
- left: selectedRect.left,
12273
- top: selectedRect.top,
12274
- width: selectedRect.width,
12275
- height: selectedRect.height
12276
- },
12277
- animate: { opacity: isHovering ? 0.8 : 1 },
12278
- transition: instant ?? {
12279
- ...spring.moderate.enter,
12280
- opacity: { duration: 0.08 }
12281
- }
12282
- }) : null,
12283
- /* @__PURE__ */ jsx4(AnimatePresence, { children: hoverRect && !isHoveringSelected ? /* @__PURE__ */ jsx4(m.div, {
12284
- className: cn("pointer-events-none absolute", ACTIVE_PILL_CLASS, PILL_RADIUS),
12285
- layout: true,
12286
- style: {
12287
- left: hoverRect.left,
12288
- top: hoverRect.top,
12289
- width: hoverRect.width,
12290
- height: hoverRect.height
12291
- },
12292
- initial: { opacity: 0 },
12293
- animate: { opacity: 0.4 },
12294
- exit: {
12295
- opacity: 0,
12296
- transition: instant ?? spring.fast.exit
12297
- },
12298
- transition: instant ?? {
12299
- ...spring.fast.enter,
12300
- opacity: { duration: 0.08 }
12301
- }
12302
- }) : null }),
12303
- /* @__PURE__ */ jsx4(AnimatePresence, { children: focusRect ? /* @__PURE__ */ jsx4(m.div, {
12304
- className: cn("pointer-events-none absolute z-20 border border-ring", PILL_RADIUS),
12305
- layout: true,
12306
- initial: false,
12307
- style: {
12308
- left: focusRect.left - 2,
12309
- top: focusRect.top - 2,
12310
- width: focusRect.width + 4,
12311
- height: focusRect.height + 4
12312
- },
12313
- exit: {
12314
- opacity: 0,
12315
- transition: instant ?? spring.fast.exit
12316
- },
12317
- transition: instant ?? {
12318
- ...spring.fast.enter,
12319
- opacity: { duration: 0.08 }
12320
- }
12321
- }) : null })
12322
- ] });
12323
- }
12324
- var TabsSubtle = forwardRef15(({ children, selectedIndex, onSelect, idPrefix, activeLabel = false, variant = "default", className, ...props }, ref) => {
12325
- const containerRef = useRef12(null);
12326
- const isMouseInside = useRef12(false);
12327
- const isPill = variant === "pill";
12328
- const { activeIndex: hoveredIndex, setActiveIndex: setHoveredIndex, itemRects: tabRects, onMouseMove: proximityMouseMove, onMouseLeave: proximityMouseLeave, registerItem } = useProximityHover(containerRef, { axis: "x" });
12329
- const registerTab = useCallback3((index2, element) => {
12330
- registerItem(index2, element);
12331
- }, [registerItem]);
12332
- const handleMouseMove = useCallback3((e) => {
12333
- isMouseInside.current = true;
12334
- proximityMouseMove(e);
12335
- }, [proximityMouseMove]);
12336
- const handleMouseLeave = useCallback3(() => {
12337
- isMouseInside.current = false;
12338
- proximityMouseLeave();
12339
- }, [proximityMouseLeave]);
12340
- const [focusedIndex, setFocusedIndex] = useState7(null);
12341
- const selectedRect = selectedIndex >= 0 ? tabRects[selectedIndex] : void 0;
12342
- const hoverRect = hoveredIndex !== null ? tabRects[hoveredIndex] : null;
12343
- const focusRect = focusedIndex !== null ? tabRects[focusedIndex] : null;
12344
- const isHoveringSelected = hoveredIndex === selectedIndex;
12345
- const isHovering = hoveredIndex !== null && !isHoveringSelected;
12346
- const tabsSubtleContextValue = useMemo8(() => ({
12347
- registerTab,
12348
- hoveredIndex,
12349
- selectedIndex,
12350
- idPrefix,
12351
- activeLabel,
12352
- variant,
12353
- onSelect
12354
- }), [
12355
- registerTab,
12356
- hoveredIndex,
12357
- selectedIndex,
12358
- idPrefix,
12359
- activeLabel,
12360
- variant,
12361
- onSelect
12362
- ]);
12363
- return /* @__PURE__ */ jsx4(TabsSubtleContext.Provider, {
12364
- value: tabsSubtleContextValue,
12365
- children: /* @__PURE__ */ jsx4(Tabs$1, {
12366
- className: "data-horizontal:!flex-row !gap-0.5",
12367
- value: selectedIndex >= 0 ? selectedIndex : null,
12368
- onValueChange: (value) => {
12369
- const index2 = typeof value === "number" ? value : Number(value);
12370
- if (Number.isInteger(index2)) onSelect(index2);
12124
+ function TabStrip({ tabs, value, onValueChange, onClose, onNewSession, ariaLabel = "Tabs", width = "fill", density = "default", idPrefix, className, dataTestid }) {
12125
+ const compact = density === "compact";
12126
+ const fill = width === "fill";
12127
+ return /* @__PURE__ */ jsxs("div", {
12128
+ className: cn("flex min-w-0 max-w-full items-center", compact ? "gap-0.5" : "gap-1", className),
12129
+ "data-testid": dataTestid,
12130
+ children: [/* @__PURE__ */ jsx4(Tabs$1, {
12131
+ className: cn("!flex-row !gap-0 min-w-0", fill ? "flex-1" : "w-fit"),
12132
+ onValueChange: (next) => {
12133
+ if (typeof next === "string") onValueChange(next);
12371
12134
  },
12372
- render: /* @__PURE__ */ jsxs(TabsList3, {
12373
- activateOnFocus: false,
12135
+ value,
12136
+ children: /* @__PURE__ */ jsx4(TabsList3, {
12137
+ "aria-label": ariaLabel,
12138
+ activateOnFocus: true,
12139
+ className: cn("!h-auto !w-fit !max-w-full !justify-start !rounded-none !bg-transparent !p-0", fill ? "min-w-0 flex-1" : "flex-none", compact ? "!gap-0.5" : "!gap-1", "overflow-x-auto overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"),
12374
12140
  variant: "line",
12375
- ref: (node) => {
12376
- containerRef.current = node;
12377
- if (typeof ref === "function") ref(node);
12378
- else if (ref) ref.current = node;
12379
- },
12380
- onMouseMove: handleMouseMove,
12381
- onMouseLeave: handleMouseLeave,
12382
- onFocus: (e) => {
12383
- const indexAttr = e.target.closest("[data-proximity-index]")?.getAttribute("data-proximity-index");
12384
- if (indexAttr != null) {
12385
- const idx = Number(indexAttr);
12386
- setHoveredIndex(idx);
12387
- setFocusedIndex(e.target.matches(":focus-visible") ? idx : null);
12388
- }
12389
- },
12390
- onBlur: (e) => {
12391
- if (containerRef.current?.contains(e.relatedTarget)) return;
12392
- setFocusedIndex(null);
12393
- if (isMouseInside.current) return;
12394
- setHoveredIndex(null);
12395
- },
12396
- className: cn("relative flex max-w-full [scrollbar-width:none] items-center gap-0.5 overflow-x-auto select-none [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden", isPill ? PILL_TRACK_CLASS : "-mx-1 -my-1 px-1 py-1", className),
12397
- ...props,
12398
- children: [/* @__PURE__ */ jsx4(TabsSubtleIndicators, {
12399
- selectedRect,
12400
- hoverRect,
12401
- focusRect,
12402
- isHovering,
12403
- isHoveringSelected
12404
- }), children]
12141
+ children: tabs.map((tab) => {
12142
+ const active = tab.id === value;
12143
+ const Icon = tab.icon;
12144
+ const accessibleName = tab.ariaLabel ?? (tab.statusLabel ? `${tab.label}, ${tab.statusLabel}` : tab.label);
12145
+ const tabId = idPrefix ? `${idPrefix}-${encodeURIComponent(tab.id)}` : void 0;
12146
+ const panelId = idPrefix ? `${idPrefix}-panel-${encodeURIComponent(tab.id)}` : void 0;
12147
+ return /* @__PURE__ */ jsxs("div", {
12148
+ className: cn("group/tab relative", fill ? "min-w-0 max-w-[164px] flex-1 basis-[164px]" : "shrink-0"),
12149
+ "data-tab-id": tab.id,
12150
+ children: [/* @__PURE__ */ jsxs(TabsTrigger, {
12151
+ "aria-controls": panelId,
12152
+ "aria-label": accessibleName,
12153
+ className: cn("h-7 w-full min-w-0 justify-start text-start text-label font-medium leading-none", "rounded-[7px] !shadow-none after:hidden", compact ? "gap-0.5 !px-1.5" : "gap-1.5 !px-2", active ? "!bg-surface-4 !text-foreground" : "!bg-transparent !text-foreground/45 hover:!bg-foreground/5 hover:!text-foreground/75", tab.closable && onClose && "pe-7"),
12154
+ id: tabId,
12155
+ onClick: () => {
12156
+ if (active) onValueChange(tab.id);
12157
+ },
12158
+ value: tab.id,
12159
+ children: [Icon ? /* @__PURE__ */ jsxs("span", {
12160
+ className: cn("flex shrink-0 items-center", compact ? "gap-0.5" : "gap-1"),
12161
+ children: [/* @__PURE__ */ jsx4(Icon, {
12162
+ "aria-hidden": "true",
12163
+ className: "size-3.5 shrink-0"
12164
+ }), tab.badge !== void 0 ? /* @__PURE__ */ jsx4("span", {
12165
+ className: "text-caption tabular-nums",
12166
+ children: tab.badge
12167
+ }) : null]
12168
+ }) : tab.dotClassName ? /* @__PURE__ */ jsx4("span", {
12169
+ "aria-hidden": "true",
12170
+ className: cn("size-1.5 shrink-0 rounded-full", tab.dotClassName)
12171
+ }) : null, /* @__PURE__ */ jsx4("span", {
12172
+ className: "min-w-0 flex-1 truncate text-start",
12173
+ children: tab.label
12174
+ })]
12175
+ }), tab.closable && onClose ? /* @__PURE__ */ jsx4(Button$1, {
12176
+ "aria-label": `Close ${tab.label} tab`,
12177
+ className: "absolute top-1/2 left-auto size-5 -translate-y-1/2 rounded-[5px] p-0 text-foreground/35 opacity-0 transition-opacity motion-reduce:transition-none hover:bg-foreground/10 hover:text-foreground/75 focus-visible:opacity-100 group-hover/tab:opacity-100 [inset-inline-start:auto] [inset-inline-end:0.25rem]",
12178
+ onClick: (event) => {
12179
+ event.stopPropagation();
12180
+ onClose(tab.id);
12181
+ },
12182
+ size: "icon-compact",
12183
+ title: `Close ${tab.label} tab`,
12184
+ type: "button",
12185
+ variant: "ghost",
12186
+ children: /* @__PURE__ */ jsx4(X, {
12187
+ "aria-hidden": "true",
12188
+ className: "size-3"
12189
+ })
12190
+ }) : null]
12191
+ }, tab.id);
12192
+ })
12405
12193
  })
12406
- })
12407
- });
12408
- });
12409
- TabsSubtle.displayName = "TabsSubtle";
12410
- var TabsSubtleItem = forwardRef15(({ icon: Icon, label, index: index2, badge, className, "aria-label": ariaLabelProp, onClick, ...props }, ref) => {
12411
- const internalRef = useRef12(null);
12412
- const { registerTab, hoveredIndex, selectedIndex, idPrefix, activeLabel, variant, onSelect } = useTabsSubtle();
12413
- useEffect3(() => {
12414
- registerTab(index2, internalRef.current);
12415
- return () => registerTab(index2, null);
12416
- }, [index2, registerTab]);
12417
- const isSelected = selectedIndex === index2;
12418
- const isActive = hoveredIndex === index2 || isSelected;
12419
- const collapseLabel = activeLabel && !!Icon;
12420
- const showLabel = !collapseLabel || isSelected;
12421
- const isPill = variant === "pill";
12422
- const tone = chromeTone(isPill, isActive);
12423
- const ariaLabel = ariaLabelProp ?? (collapseLabel && !showLabel ? label : void 0);
12424
- const labelContent = /* @__PURE__ */ jsxs("span", {
12425
- className: cn("inline-grid whitespace-nowrap", isPill ? "text-label font-medium" : "text-title"),
12426
- children: [/* @__PURE__ */ jsx4("span", {
12427
- className: "invisible col-start-1 row-start-1 font-[550] [text-box:trim-both_cap_alphabetic]",
12428
- "aria-hidden": "true",
12429
- children: label
12430
- }), /* @__PURE__ */ jsx4("span", {
12431
- className: cn("col-start-1 row-start-1 transition-[color,font-weight] duration-80 [text-box:trim-both_cap_alphabetic]", isSelected ? "font-[550]" : "font-normal", tone),
12432
- children: label
12433
- })]
12434
- });
12435
- return /* @__PURE__ */ jsxs(TabsTrigger, {
12436
- ref: (node) => {
12437
- const button = node;
12438
- internalRef.current = button;
12439
- if (typeof ref === "function") ref(button);
12440
- else if (ref) ref.current = button;
12441
- },
12442
- value: index2,
12443
- "data-proximity-index": index2,
12444
- id: idPrefix ? `${idPrefix}-tab-${index2}` : void 0,
12445
- "aria-controls": idPrefix ? `${idPrefix}-panel-${index2}` : void 0,
12446
- "aria-label": ariaLabel,
12447
- className: cn("relative z-10 flex flex-none cursor-pointer items-center border-none !bg-transparent !shadow-none outline-none after:hidden", isPill ? "h-8 px-2.5" : collapseLabel ? "h-8 px-3" : "h-9 gap-2 px-3", PILL_RADIUS, className),
12448
- ...props,
12449
- onClick: (event) => {
12450
- onClick?.(event);
12451
- if (isSelected) onSelect(index2);
12452
- },
12453
- children: [
12454
- Icon ? /* @__PURE__ */ jsxs("span", {
12455
- className: "flex shrink-0 items-center gap-1",
12456
- children: [/* @__PURE__ */ jsx4(Icon, {
12457
- "data-icon": "inline-start",
12458
- size: isPill ? 14 : 16,
12459
- strokeWidth: isActive ? 2 : 1.5,
12460
- className: cn("shrink-0 transition-[color,stroke-width] duration-80", tone)
12461
- }), badge !== void 0 ? /* @__PURE__ */ jsx4("span", {
12462
- className: cn("text-caption tabular-nums transition-colors duration-80", tone),
12463
- children: badge
12464
- }) : null]
12465
- }) : null,
12466
- collapseLabel ? null : labelContent,
12467
- /* @__PURE__ */ jsx4(AnimatePresence, {
12468
- initial: false,
12469
- children: collapseLabel && showLabel ? /* @__PURE__ */ jsx4(m.span, {
12470
- className: "ml-2 overflow-hidden",
12471
- initial: {
12472
- clipPath: "inset(0 100% 0 0)",
12473
- opacity: 0
12474
- },
12475
- animate: {
12476
- clipPath: "inset(0 0% 0 0)",
12477
- opacity: 1
12478
- },
12479
- exit: {
12480
- clipPath: "inset(0 100% 0 0)",
12481
- opacity: 0
12482
- },
12483
- transition: {
12484
- ...spring.fast.enter,
12485
- opacity: { duration: 0.06 }
12486
- },
12487
- children: labelContent
12488
- }, "label") : null
12194
+ }), onNewSession ? /* @__PURE__ */ jsx4(Button$1, {
12195
+ "aria-label": "New chat",
12196
+ className: cn(HIT_AREA_EXPAND_DENSE_CLASS, "relative z-10 size-7 shrink-0 rounded-[7px] text-foreground/50 hover:bg-foreground/7 hover:text-foreground/85"),
12197
+ "data-testid": "new-chat-tab",
12198
+ onClick: (event) => {
12199
+ event.preventDefault();
12200
+ event.stopPropagation();
12201
+ onNewSession();
12202
+ },
12203
+ size: "icon-compact",
12204
+ title: "New chat",
12205
+ type: "button",
12206
+ variant: "ghost",
12207
+ children: /* @__PURE__ */ jsx4(Plus, {
12208
+ "aria-hidden": "true",
12209
+ className: "size-3.5"
12489
12210
  })
12490
- ]
12211
+ }) : null]
12491
12212
  });
12492
- });
12493
- TabsSubtleItem.displayName = "TabsSubtleItem";
12494
- var COMPACT_TABS_CLASS = "[&_[data-proximity-index]]:!h-7 [&_[data-proximity-index]]:!px-2 [&_[data-proximity-index]]:!text-caption";
12213
+ }
12495
12214
  function RightPanelLauncherFromContext({ compact = false } = {}) {
12496
12215
  const { reopenRightPanel, rightPanel } = useChatPanelDataContext();
12497
12216
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx4("div", {
@@ -12603,6 +12322,13 @@ function ResponsivePanelLauncher({ activePanel, className, compact = false, idPr
12603
12322
  const nextIndex = panelOptions.findIndex((panel) => panel.id === nextPanel);
12604
12323
  if (nextIndex >= 0) onSelect(nextIndex);
12605
12324
  }, [onSelect, panelOptions]);
12325
+ const panelTabs = useMemo8(() => panelOptions.map((panel) => ({
12326
+ id: panel.id,
12327
+ label: panel.title,
12328
+ icon: panel.icon,
12329
+ badge: panel.badge,
12330
+ ariaLabel: panel.ariaLabel
12331
+ })), [panelOptions]);
12606
12332
  return /* @__PURE__ */ jsxs("div", {
12607
12333
  ref: containerRef,
12608
12334
  className: `relative ${isDropdown ? "w-full" : "w-fit"} min-w-0 max-w-full overflow-hidden ${className ?? ""}`,
@@ -12615,38 +12341,29 @@ function ResponsivePanelLauncher({ activePanel, className, compact = false, idPr
12615
12341
  options,
12616
12342
  placeholder: "Open panel",
12617
12343
  value: activePanel
12618
- }) : /* @__PURE__ */ jsx4(TabsSubtle, {
12619
- activeLabel: true,
12620
- className: `w-fit max-w-full ${compact ? COMPACT_TABS_CLASS : ""}`,
12621
- idPrefix,
12622
- selectedIndex,
12623
- onSelect,
12624
- children: panelOptions.map((panel, index2) => /* @__PURE__ */ jsx4(TabsSubtleItem, {
12625
- index: index2,
12626
- icon: panel.icon,
12627
- label: panel.title,
12628
- badge: panel.badge,
12629
- "aria-label": panel.ariaLabel
12630
- }, panel.id))
12344
+ }) : /* @__PURE__ */ jsx4(TabStrip, {
12345
+ ariaLabel: "Panel views",
12346
+ className: "w-fit max-w-full",
12347
+ dataTestid: `${idPrefix}-tabs`,
12348
+ density: "compact",
12349
+ onValueChange: selectPanel,
12350
+ tabs: panelTabs,
12351
+ value: activePanel,
12352
+ width: "fit"
12631
12353
  }), /* @__PURE__ */ jsx4("div", {
12632
12354
  ref: measurementRef,
12633
12355
  "aria-hidden": "true",
12634
12356
  className: "pointer-events-none invisible absolute top-0 left-0 -z-10 w-max max-w-none",
12635
12357
  "data-panel-launcher-measurement": true,
12636
12358
  inert: true,
12637
- children: /* @__PURE__ */ jsx4(TabsSubtle, {
12638
- activeLabel: true,
12639
- className: `w-max max-w-none ${compact ? COMPACT_TABS_CLASS : ""}`,
12640
- idPrefix: `${idPrefix}-measurement`,
12641
- selectedIndex,
12642
- onSelect: () => void 0,
12643
- children: panelOptions.map((panel, index2) => /* @__PURE__ */ jsx4(TabsSubtleItem, {
12644
- index: index2,
12645
- icon: panel.icon,
12646
- label: panel.title,
12647
- badge: panel.badge,
12648
- "aria-label": panel.ariaLabel
12649
- }, panel.id))
12359
+ children: /* @__PURE__ */ jsx4(TabStrip, {
12360
+ ariaLabel: "Panel views",
12361
+ className: "w-max max-w-none",
12362
+ density: "compact",
12363
+ onValueChange: () => void 0,
12364
+ tabs: panelTabs,
12365
+ value: activePanel,
12366
+ width: "fit"
12650
12367
  })
12651
12368
  })]
12652
12369
  });
@@ -12754,11 +12471,12 @@ function MobilePanel({ children, dataTestid, headerActions, icon: Icon, onClose,
12754
12471
  })
12755
12472
  });
12756
12473
  }
12474
+ var AGENT_TAB_ID_PREFIX = "agent-tab";
12757
12475
  function agentTabTriggerId(tabId) {
12758
- return `agent-tab-${encodeURIComponent(tabId)}`;
12476
+ return `${AGENT_TAB_ID_PREFIX}-${encodeURIComponent(tabId)}`;
12759
12477
  }
12760
12478
  function agentTabPanelId(tabId) {
12761
- return `agent-tab-panel-${encodeURIComponent(tabId)}`;
12479
+ return `${AGENT_TAB_ID_PREFIX}-panel-${encodeURIComponent(tabId)}`;
12762
12480
  }
12763
12481
  function statusLabel(status) {
12764
12482
  switch (status) {
@@ -12795,109 +12513,23 @@ function statusDotClass(status) {
12795
12513
  }
12796
12514
  }
12797
12515
  function AgentTabBar({ tabs, value, onValueChange, onClose, onNewSession }) {
12798
- const tabRefs = useRef12(/* @__PURE__ */ new Map());
12799
- const setTabRef = useCallback3((tabId, node) => {
12800
- if (node) tabRefs.current.set(tabId, node);
12801
- else tabRefs.current.delete(tabId);
12802
- }, []);
12803
- useEffect3(() => {
12804
- for (const tabId of tabRefs.current.keys()) if (!tabs.some((tab) => tab.id === tabId)) tabRefs.current.delete(tabId);
12805
- }, [tabs]);
12806
- const focusTab = useCallback3((index2) => {
12807
- const tab = tabs[index2];
12808
- if (!tab) return;
12809
- tabRefs.current.get(tab.id)?.focus();
12810
- onValueChange(tab.id);
12811
- }, [onValueChange, tabs]);
12812
- const handleKeyDown = useCallback3((event, tabId) => {
12813
- const index2 = tabs.findIndex((tab) => tab.id === tabId);
12814
- if (index2 < 0) return;
12815
- let nextIndex;
12816
- if (event.key === "ArrowRight") nextIndex = (index2 + 1) % tabs.length;
12817
- if (event.key === "ArrowLeft") nextIndex = (index2 - 1 + tabs.length) % tabs.length;
12818
- if (event.key === "Home") nextIndex = 0;
12819
- if (event.key === "End") nextIndex = tabs.length - 1;
12820
- if (nextIndex === void 0) return;
12821
- event.preventDefault();
12822
- focusTab(nextIndex);
12823
- }, [focusTab, tabs]);
12824
- return /* @__PURE__ */ jsxs("div", {
12825
- className: "flex min-w-0 max-w-full items-center gap-1",
12826
- "data-testid": "agent-tab-bar",
12827
- children: [/* @__PURE__ */ jsx4("div", {
12828
- "aria-label": "Agent conversations",
12829
- className: "flex min-w-0 flex-1 items-center gap-1 overflow-x-auto overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
12830
- role: "tablist",
12831
- children: tabs.map((tab) => {
12832
- const active = tab.id === value;
12833
- const status = statusLabel(tab.status);
12834
- return /* @__PURE__ */ jsxs("div", {
12835
- className: "group/tab relative min-w-0 flex-1 max-w-[164px] basis-[164px]",
12836
- "data-tab-id": tab.id,
12837
- children: [/* @__PURE__ */ jsxs(Button$1, {
12838
- ref: (node) => setTabRef(tab.id, node),
12839
- "aria-controls": agentTabPanelId(tab.id),
12840
- "aria-selected": active,
12841
- "aria-label": `${tab.label}, ${status}`,
12842
- className: cn("h-7 w-full min-w-0 justify-start text-start gap-1.5 rounded-[7px] border border-transparent px-2 text-label font-medium leading-none transition-colors motion-reduce:transition-none", active ? "bg-surface-4 text-foreground shadow-none" : "bg-transparent text-foreground/45 hover:bg-foreground/5 hover:text-foreground/75", tab.kind === "subagent" && onClose && "pe-7"),
12843
- "data-state": active ? "active" : "inactive",
12844
- id: agentTabTriggerId(tab.id),
12845
- onClick: () => onValueChange(tab.id),
12846
- onKeyDown: (event) => handleKeyDown(event, tab.id),
12847
- role: "tab",
12848
- size: "compact",
12849
- tabIndex: active ? 0 : -1,
12850
- type: "button",
12851
- variant: "ghost",
12852
- children: [tab.kind === "activity" ? /* @__PURE__ */ jsx4(Activity, {
12853
- "aria-hidden": "true",
12854
- className: "size-3.5 shrink-0"
12855
- }) : tab.kind === "main" ? /* @__PURE__ */ jsx4(Bot, {
12856
- "aria-hidden": "true",
12857
- className: "size-3.5 shrink-0"
12858
- }) : /* @__PURE__ */ jsx4("span", {
12859
- "aria-hidden": "true",
12860
- className: cn("size-1.5 shrink-0 rounded-full", statusDotClass(tab.status))
12861
- }), /* @__PURE__ */ jsx4("span", {
12862
- className: "min-w-0 flex-1 truncate text-start",
12863
- children: tab.label
12864
- })]
12865
- }), tab.kind === "subagent" && onClose ? /* @__PURE__ */ jsx4(Button$1, {
12866
- "aria-label": `Close ${tab.label} tab`,
12867
- className: "absolute top-1/2 left-auto size-5 -translate-y-1/2 rounded-[5px] p-0 text-foreground/35 opacity-0 transition-opacity motion-reduce:transition-none hover:bg-foreground/10 hover:text-foreground/75 focus-visible:opacity-100 group-hover/tab:opacity-100 [inset-inline-start:auto] [inset-inline-end:0.25rem]",
12868
- onClick: (event) => {
12869
- event.stopPropagation();
12870
- onClose(tab.id);
12871
- },
12872
- size: "icon-compact",
12873
- title: `Close ${tab.label} tab`,
12874
- type: "button",
12875
- variant: "ghost",
12876
- children: /* @__PURE__ */ jsx4(X, {
12877
- "aria-hidden": "true",
12878
- className: "size-3"
12879
- })
12880
- }) : null]
12881
- }, tab.id);
12882
- })
12883
- }), onNewSession ? /* @__PURE__ */ jsx4(Button$1, {
12884
- "aria-label": "New chat",
12885
- className: cn(HIT_AREA_EXPAND_DENSE_CLASS, "relative z-10 size-7 shrink-0 rounded-[7px] text-foreground/50 hover:bg-foreground/7 hover:text-foreground/85"),
12886
- "data-testid": "new-chat-tab",
12887
- onClick: (event) => {
12888
- event.preventDefault();
12889
- event.stopPropagation();
12890
- onNewSession();
12891
- },
12892
- size: "icon-compact",
12893
- title: "New chat",
12894
- type: "button",
12895
- variant: "ghost",
12896
- children: /* @__PURE__ */ jsx4(Plus, {
12897
- "aria-hidden": "true",
12898
- className: "size-3.5"
12899
- })
12900
- }) : null]
12516
+ const items = useMemo8(() => tabs.map((tab) => ({
12517
+ id: tab.id,
12518
+ label: tab.label,
12519
+ icon: tab.kind === "activity" ? Activity : tab.kind === "main" ? Bot : void 0,
12520
+ dotClassName: tab.kind === "subagent" ? statusDotClass(tab.status) : void 0,
12521
+ statusLabel: statusLabel(tab.status),
12522
+ closable: tab.kind === "subagent" && Boolean(onClose)
12523
+ })), [tabs, onClose]);
12524
+ return /* @__PURE__ */ jsx4(TabStrip, {
12525
+ ariaLabel: "Agent conversations",
12526
+ dataTestid: "agent-tab-bar",
12527
+ idPrefix: AGENT_TAB_ID_PREFIX,
12528
+ onClose,
12529
+ onNewSession,
12530
+ onValueChange,
12531
+ tabs: items,
12532
+ value
12901
12533
  });
12902
12534
  }
12903
12535
  var DOCUMENTATION_URL = "https://docs.qredence.ai";
@@ -12998,8 +12630,8 @@ function useChatWorkspaceDialogs() {
12998
12630
  settingsInitialTab
12999
12631
  };
13000
12632
  }
13001
- var LazyChatCommandPalette = lazy2(() => import("./chat-command-palette-CT9aJAWG-LV26BDEW.js").then(({ ChatCommandPalette }) => ({ default: ChatCommandPalette })));
13002
- var LazySettingsDialog = lazy2(() => import("./settings-dialog-BrjqiTVe-H7WOTB4I.js").then(({ SettingsDialog }) => ({ default: SettingsDialog })));
12633
+ var LazyChatCommandPalette = lazy2(() => import("./chat-command-palette-CGCsCr9E-U5PCLXNE.js").then(({ ChatCommandPalette }) => ({ default: ChatCommandPalette })));
12634
+ var LazySettingsDialog = lazy2(() => import("./settings-dialog-1Zr_EiEd-GDE4IXK2.js").then(({ SettingsDialog }) => ({ default: SettingsDialog })));
13003
12635
  var LazyForkPickerDialog = lazy2(() => import("./fork-picker-dialog-DFpKOdAw-JPLJSYYU.js").then(({ ForkPickerDialog }) => ({ default: ForkPickerDialog })));
13004
12636
  function ChatCommandPaletteOverlay({ chrome, conversation, dialogs, panels, session }) {
13005
12637
  return /* @__PURE__ */ jsx4(Fragment$1, { children: dialogs.commandPaletteOpen ? /* @__PURE__ */ jsx4(Suspense2, {
@@ -14805,6 +14437,15 @@ function ResizableCanvas({ children, dataTestid, headerLeading, loading, onClose
14805
14437
  }) });
14806
14438
  }
14807
14439
  var DESKTOP_PANEL_QUERY = `(min-width: 960px)`;
14440
+ var GROUP_VIEW_LABELS = {
14441
+ resources: "Skills",
14442
+ workspace: "Files",
14443
+ artifacts: "Artifacts",
14444
+ repl: "REPL",
14445
+ subagents: "Subagents",
14446
+ "session-insights": "Insights",
14447
+ "session-tree": "Tree"
14448
+ };
14808
14449
  function subscribeToDesktopPanel(onChange) {
14809
14450
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return () => void 0;
14810
14451
  const media = window.matchMedia(DESKTOP_PANEL_QUERY);
@@ -14829,20 +14470,20 @@ function RightPanelShell({ handleResourceCanvasResizeStart, onClose, resourceCan
14829
14470
  const definition = rightPanel ? getRightPanelDefinition(rightPanel) : null;
14830
14471
  const PanelContent = definition?.component;
14831
14472
  const panelGroup = rightPanel ? getRightPanelGroup(rightPanel) : void 0;
14832
- const currentGroupPanelIndex = panelGroup && rightPanel ? panelGroup.panels.indexOf(rightPanel) : -1;
14833
- const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [panelGroup && panelGroup.panels.length > 1 ? /* @__PURE__ */ jsx4(TabsSubtle, {
14834
- "aria-label": `${panelGroup.title} views`,
14473
+ const groupTabs = useMemo8(() => panelGroup && panelGroup.panels.length > 1 ? panelGroup.panels.map((panel) => ({
14474
+ id: panel,
14475
+ label: GROUP_VIEW_LABELS[panel]
14476
+ })) : [], [panelGroup]);
14477
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [groupTabs.length > 0 ? /* @__PURE__ */ jsx4(TabStrip, {
14478
+ ariaLabel: `${panelGroup?.title ?? "Panel"} views`,
14835
14479
  className: "mb-3 w-fit",
14836
- idPrefix: `right-panel-${panelGroup.id}-views`,
14837
- selectedIndex: currentGroupPanelIndex,
14838
- onSelect: (index2) => {
14839
- const nextPanel = panelGroup.panels[index2];
14840
- if (nextPanel) setRightPanel(nextPanel);
14480
+ onValueChange: (nextPanel) => {
14481
+ const next = groupTabs.find((tab) => tab.id === nextPanel)?.id;
14482
+ if (next) setRightPanel(next);
14841
14483
  },
14842
- children: panelGroup.panels.map((panel, index2) => /* @__PURE__ */ jsx4(TabsSubtleItem, {
14843
- index: index2,
14844
- label: panel === "workspace" ? "Files" : panel === "session-insights" ? "Insights" : panel === "session-tree" ? "Tree" : panel === "resources" ? "Skills" : "Artifacts"
14845
- }, panel))
14484
+ tabs: groupTabs,
14485
+ value: rightPanel,
14486
+ width: "fit"
14846
14487
  }) : null, PanelContent ? /* @__PURE__ */ jsx4(PanelContent, {}) : null] });
14847
14488
  const loading = definition?.loadingSource === "resources" ? chat.resourcesLoading : definition?.loadingSource === "workspace" ? workspace.workspaceLoading : false;
14848
14489
  const onRefresh = definition?.refreshSource === "resources" ? chat.refreshResources : definition?.refreshSource === "workspace" ? workspace.refreshWorkspace : void 0;
@@ -15861,7 +15502,7 @@ function DiscordIcon({ className, ...props }) {
15861
15502
  }
15862
15503
  function fleetVersion() {
15863
15504
  try {
15864
- return "0.10.1";
15505
+ return "0.10.3";
15865
15506
  } catch {
15866
15507
  return "dev";
15867
15508
  }
@@ -16569,7 +16210,7 @@ function useSessionSidebarViewModel({ sessions, projects = EMPTY_PROJECTS, proje
16569
16210
  ])
16570
16211
  };
16571
16212
  }
16572
- var LazySessionSidebarCreateDialog = lazy2(() => import("./create-project-dialog-EwieT1Vw-X5MYQSZM.js").then(({ SessionSidebarCreateDialog }) => ({ default: SessionSidebarCreateDialog })));
16213
+ var LazySessionSidebarCreateDialog = lazy2(() => import("./create-project-dialog-aCD1v__i-37Y2AYF7.js").then(({ SessionSidebarCreateDialog }) => ({ default: SessionSidebarCreateDialog })));
16573
16214
  function SessionSidebar({ data, sessionActions, projectActions = {}, navigationActions = {}, slots = {} }) {
16574
16215
  const { sessions, projects = EMPTY_PROJECTS, projectSessions = sessions, activeProjectId, activeSessionId } = data;
16575
16216
  const { onNewSession, onNewSessionInProject, onResumeSession, onRenameSession, onDeleteSession } = sessionActions;
@@ -16651,8 +16292,8 @@ function SessionSidebar({ data, sessionActions, projectActions = {}, navigationA
16651
16292
  })
16652
16293
  ] });
16653
16294
  }
16654
- var LazySubagentChatPanel = lazy2(() => import("./subagent-chat-panel-Dz62jo_m-X4ZRN5KI.js").then(({ SubagentChatPanel }) => ({ default: SubagentChatPanel })));
16655
- var LazySessionActivityPanel = lazy2(() => import("./session-activity-panel-wC0jAJvs-QAHJXPAM.js").then(({ SessionActivityPanel }) => ({ default: SessionActivityPanel })));
16295
+ var LazySubagentChatPanel = lazy2(() => import("./subagent-chat-panel-BCm1x_mR-HY6QEHEF.js").then(({ SubagentChatPanel }) => ({ default: SubagentChatPanel })));
16296
+ var LazySessionActivityPanel = lazy2(() => import("./session-activity-panel-Dr9Q0Wmd-2F7ZYCAY.js").then(({ SessionActivityPanel }) => ({ default: SessionActivityPanel })));
16656
16297
  function ChatWorkspaceShell() {
16657
16298
  const { session, conversation, composer, panels, dialogs, chrome, agentTabs } = useChatWorkspaceData();
16658
16299
  const toggleCommandPalette = useCallback3(() => {