@qredence/fleet 0.6.6 → 0.7.1

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 (101) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/web/client/assets/{action-swap-roll-Dbquwd1Y.js → action-swap-roll-BfVrBOVd.js} +1 -1
  3. package/dist/web/client/assets/{alert-dialog-C6Dkg1x6.js → alert-dialog-FCppNafx.js} +1 -1
  4. package/dist/web/client/assets/{artifacts-panel-8a_tn7Yb.js → artifacts-panel-C69vz-oo.js} +1 -1
  5. package/dist/web/client/assets/{badge-BjFxrtmB.js → badge-DOGhnsYk.js} +7 -7
  6. package/dist/web/client/assets/button-BJyg7l5W.js +1 -0
  7. package/dist/web/client/assets/{chat-command-palette-DhidLnw7.js → chat-command-palette-wyZjTNa8.js} +1 -1
  8. package/dist/web/client/assets/{chunk-YOKDWASO-C8deEx7Z.js → chunk-YOKDWASO-Dego39cu.js} +4 -4
  9. package/dist/web/client/assets/{citations-BYiDBo21.js → citations-BhyqbxcZ.js} +1 -1
  10. package/dist/web/client/assets/{command-Cre9BsOI.js → command-Bo31U-UD.js} +1 -1
  11. package/dist/web/client/assets/create-project-dialog-SDyXTpl-.js +1 -0
  12. package/dist/web/client/assets/{dialog-0KDCsqw0.js → dialog-DLIPvl1s.js} +1 -1
  13. package/dist/web/client/assets/{dist-CZDnnosQ.js → dist-QgsZ1U9l.js} +1 -1
  14. package/dist/web/client/assets/ease-DKi-MOH5.js +1 -0
  15. package/dist/web/client/assets/{fork-picker-dialog-BPSqUjKu.js → fork-picker-dialog-BDleMADF.js} +1 -1
  16. package/dist/web/client/assets/globals-DZbMyHfg.css +2 -0
  17. package/dist/web/client/assets/{highlighted-body-KPVGNVTW-CZcNaoxi.js → highlighted-body-KPVGNVTW-CSgDVUQp.js} +1 -1
  18. package/dist/web/client/assets/index-BARp0bjW.js +13 -0
  19. package/dist/web/client/assets/input-Ce8yLnXY.js +1 -0
  20. package/dist/web/client/assets/{input-group-Fky3fte_.js → input-group-BZLQiZOA.js} +1 -1
  21. package/dist/web/client/assets/is-ref-object-BD8OGh9C.js +1 -0
  22. package/dist/web/client/assets/{layout-constants-CC0ANQOP.js → layout-constants-Bl6XCvhY.js} +1 -1
  23. package/dist/web/client/assets/{markdown-code-BqFVdovL.js → markdown-code-DfJbKhL9.js} +1 -1
  24. package/dist/web/client/assets/{markdown-C-Y9gskI.js → markdown-yn-nhRzB.js} +2 -2
  25. package/dist/web/client/assets/mermaid-HWGCJPDP-BpEVCu9T.js +1 -0
  26. package/dist/web/client/assets/{message-queue-BUJK6bPQ.js → message-queue-CiptKSb6.js} +1 -1
  27. package/dist/web/client/assets/{model-selector-list-yOj8BeKr.js → model-selector-list-BHQ-Q8b9.js} +1 -1
  28. package/dist/web/client/assets/{notify-GSsGEKtR.js → notify-BC0a76VJ.js} +1 -1
  29. package/dist/web/client/assets/{openui-renderer-xe2-ekvP.js → openui-renderer-DrfHxs1t.js} +3 -3
  30. package/dist/web/client/assets/{preload-helper-Czpn1I53.js → preload-helper-BZ1Pz5am.js} +1 -1
  31. package/dist/web/client/assets/{prompt-input-BhVQxoyh.js → prompt-input-IwZOepG7.js} +1 -1
  32. package/dist/web/client/assets/{provider-label-BW_awXvw.js → provider-label-DNZOLldn.js} +1 -1
  33. package/dist/web/client/assets/{right-panel-registry-BpfG1iZV.js → right-panel-registry-CF7GLJrk.js} +2 -2
  34. package/dist/web/client/assets/routes-DCP1DP1g.js +16 -0
  35. package/dist/web/client/assets/select-COK0Kaq2.js +1 -0
  36. package/dist/web/client/assets/session-tool-renderer-Yu4G1165.js +1389 -0
  37. package/dist/web/client/assets/{session-tree-panel-BIEUJ1Zs.js → session-tree-panel-deGRKAhX.js} +1 -1
  38. package/dist/web/client/assets/settings-dialog-BU1Tw0CQ.js +2 -0
  39. package/dist/web/client/assets/{subagent-chat-panel-DA1GvHt8.js → subagent-chat-panel-bVnkDkgs.js} +1 -1
  40. package/dist/web/client/assets/{subagent-transcript-BGctBTbY.js → subagent-transcript-D_L-8PQi.js} +1 -1
  41. package/dist/web/client/assets/{subagent-utils-HbymlalM.js → subagent-utils-D7sXbLsS.js} +2 -2
  42. package/dist/web/client/assets/{subagents-panel-BJIdWRcV.js → subagents-panel-i5-12E1U.js} +1 -1
  43. package/dist/web/client/assets/surface-context-DWplCCcO.js +1 -0
  44. package/dist/web/client/assets/{switch-DIbInrPR.js → switch-DQETDDJT.js} +1 -1
  45. package/dist/web/client/assets/toast-BFeqSeaR.js +1 -0
  46. package/dist/web/client/assets/{tool-result-PSnAt_3f.js → tool-result-D7HtJ_yg.js} +2 -2
  47. package/dist/web/client/assets/{use-presence-D2YmRKr3.js → use-presence-rcUnm8Z7.js} +1 -1
  48. package/dist/web/client/assets/use-reduced-motion-BgG7f9xw.js +9 -0
  49. package/dist/web/client/assets/{workspace-panel-D3CMFw8W.js → workspace-panel-Clbmrdza.js} +1 -1
  50. package/dist/web/client/assets/{workspace-path-nav-DmxBrMV6.js → workspace-path-nav-eVT0rYvv.js} +2 -2
  51. package/dist/web/client/bundle-budget.json +5 -5
  52. package/dist/web/server/{_tanstack-start-manifest_v-MhCuqEzO-S6MEB7L5.js → _tanstack-start-manifest_v-CaT-3S-N-VAOGUHEJ.js} +26 -26
  53. package/dist/web/server/{artifacts-panel-BVfcZuA2-PB4RCSHV.js → artifacts-panel-BuAqeJzj-6DYYLKUW.js} +10 -10
  54. package/dist/web/server/{chat-command-palette-DlJDToBH-MVI6V743.js → chat-command-palette-Ca8gXVi2-P6EOQ43G.js} +6 -6
  55. package/dist/web/server/{chunk-KUBURZOL.js → chunk-35AFSKDX.js} +4 -4
  56. package/dist/web/server/{chunk-WBPESYPV.js → chunk-COWE2EJ6.js} +3 -3
  57. package/dist/web/server/{chunk-JT53AAM5.js → chunk-E4YWFQX5.js} +1442 -1063
  58. package/dist/web/server/{chunk-MM4HQ5EO.js → chunk-FPPKECLB.js} +7 -7
  59. package/dist/web/server/{chunk-VF3NJAD6.js → chunk-GCDOYNXR.js} +585 -634
  60. package/dist/web/server/{chunk-RWQWBZNI.js → chunk-ITKXE2Q5.js} +253 -215
  61. package/dist/web/server/{chunk-4QFOBBX5.js → chunk-J4Y2Z3XM.js} +2 -2
  62. package/dist/web/server/{chunk-SAIH5YPC.js → chunk-JFAUSHBI.js} +4 -4
  63. package/dist/web/server/{chunk-RQHQK66C.js → chunk-K4KN3QBT.js} +2 -2
  64. package/dist/web/server/{chunk-3VMFSSWK.js → chunk-M7BTY55G.js} +2 -2
  65. package/dist/web/server/{chunk-44MTKAFZ.js → chunk-PHHC52CO.js} +5 -5
  66. package/dist/web/server/{chunk-MSXGQVHG.js → chunk-UTV66W5H.js} +5 -5
  67. package/dist/web/server/{chunk-F5DJQ3PQ.js → chunk-WPSI5TBE.js} +1528 -2185
  68. package/dist/web/server/{create-project-dialog-UPz5_Ysf-FS6BL74M.js → create-project-dialog-DCvdysey-IZUGGDAN.js} +76 -15
  69. package/dist/web/server/{empty-plugin-adapters-Cqtvkauv-ILKI7W7V.js → empty-plugin-adapters-DOl-E2pL-RKRSN75W.js} +1 -1
  70. package/dist/web/server/{fork-picker-dialog-CZBpezXS-64KP23PO.js → fork-picker-dialog-QH00XmqX-6YLU5REF.js} +4 -4
  71. package/dist/web/server/{message-queue-D_Q3coUY-I3EJZXWR.js → message-queue-BzEFQR8k-2W53EW32.js} +4 -4
  72. package/dist/web/server/{model-selector-list-q6WkkOwQ-OT46QU5P.js → model-selector-list-BjoXmw92-TEKBPB3E.js} +6 -6
  73. package/dist/web/server/{openui-renderer-BqI6m6VI-HXEIYIYZ.js → openui-renderer-CJ7Q2zZ_-FPXKZPSO.js} +6 -6
  74. package/dist/web/server/{resources-panel-BKZ0M0RP-CMATPQQP.js → resources-panel-yVB4xF_K-OHFHXVU4.js} +5 -5
  75. package/dist/web/server/{router-BfuEp_JW-DNQ33L5J.js → router-UgU5vJxm-R33FGTXY.js} +3 -3
  76. package/dist/web/server/{routes-NdG3DsXJ-QKZT7TKM.js → routes-Cbbo-jh9-ZUPH4SJD.js} +37 -35
  77. package/dist/web/server/server.js +2410 -1672
  78. package/dist/web/server/{session-reasoning-panel-Dc-AnjdD-7KAZLD74.js → session-reasoning-panel-C50VbaQ8-4YLMVVY6.js} +5 -5
  79. package/dist/web/server/{session-tool-renderer-DaR8U5rb-TXWACWT7.js → session-tool-renderer-QcAkYD-V-6RXRKDH6.js} +6 -6
  80. package/dist/web/server/{session-tree-panel-V3l8WdmE-YBRDLHWU.js → session-tree-panel-CL49XSTK-4ZPK6AIV.js} +6 -6
  81. package/dist/web/server/{settings-dialog-C8U1VX75-6A2V6HSW.js → settings-dialog-DG9HEZeP-TWDRDGMN.js} +191 -120
  82. package/dist/web/server/{start-QK6aG02q-EMREW2SB.js → start-DEejK9Uj-FODAOTAO.js} +1 -1
  83. package/dist/web/server/{subagent-chat-panel-B9CtFTP5-6QDZ4RQY.js → subagent-chat-panel-Cg2CxshI-WWGFHTIF.js} +8 -8
  84. package/dist/web/server/{subagents-panel-Dw6yP5X4-BMN45GDD.js → subagents-panel-aC3Eo-MR-RNIPLCZQ.js} +9 -9
  85. package/dist/web/server/{workspace-panel-C246J-eO-2WGJWVE6.js → workspace-panel-DfdFkgHU-6HIOXRBX.js} +5 -5
  86. package/package.json +2 -2
  87. package/dist/web/client/assets/button-BrwYi6QP.js +0 -1
  88. package/dist/web/client/assets/create-project-dialog-DVOaxTzt.js +0 -1
  89. package/dist/web/client/assets/ease-2UPBQU5v.js +0 -1
  90. package/dist/web/client/assets/globals-CD6JXJJh.css +0 -2
  91. package/dist/web/client/assets/index-BEG-7vN-.js +0 -12
  92. package/dist/web/client/assets/input-tWLSIxES.js +0 -1
  93. package/dist/web/client/assets/is-ref-object-CEXqIz6L.js +0 -1
  94. package/dist/web/client/assets/mermaid-HWGCJPDP-CVNXPao6.js +0 -1
  95. package/dist/web/client/assets/routes-BIp_deev.js +0 -16
  96. package/dist/web/client/assets/select-Buvrx1fi.js +0 -1
  97. package/dist/web/client/assets/session-tool-renderer-CNcxpGsk.js +0 -1389
  98. package/dist/web/client/assets/settings-dialog-DAB6RL4u.js +0 -2
  99. package/dist/web/client/assets/surface-context-A-BjVzO_.js +0 -1
  100. package/dist/web/client/assets/toast-CS0pnDlS.js +0 -1
  101. package/dist/web/client/assets/use-reduced-motion-CaQBb3Qc.js +0 -9
@@ -170,7 +170,7 @@ import {
170
170
  visuallyHidden,
171
171
  visuallyHiddenInput,
172
172
  writeStoredValue
173
- } from "./chunk-JT53AAM5.js";
173
+ } from "./chunk-E4YWFQX5.js";
174
174
  import {
175
175
  CHAT_COLUMN_CLASS,
176
176
  CHAT_HEADER_LAYER_CLASS,
@@ -270,7 +270,7 @@ import {
270
270
  } from "./chunk-B5Y7XOIJ.js";
271
271
  import {
272
272
  useNavigate
273
- } from "./chunk-F5DJQ3PQ.js";
273
+ } from "./chunk-WPSI5TBE.js";
274
274
  import {
275
275
  __export
276
276
  } from "./chunk-CZ7CSFO4.js";
@@ -447,16 +447,28 @@ function derivePrimeAgentArtifactRuns(messages, presentation, chatStatus) {
447
447
  // web/app/dist/server/assets/badge-BQThUEv3.js
448
448
  import { jsx, jsxs } from "react/jsx-runtime";
449
449
 
450
- // node_modules/.pnpm/react-error-boundary@6.1.5_@types+react@19.3.0_react@19.3.0/node_modules/react-error-boundary/dist/react-error-boundary.js
451
- import { createContext as y, Component as f, createElement as d, useContext as l, useState as p, useMemo as E, forwardRef as B } from "react";
452
- var h = y(null);
453
- var c = {
450
+ // node_modules/.pnpm/react-error-boundary@6.1.6_@types+react@19.3.0_react@19.3.0/node_modules/react-error-boundary/dist/react-error-boundary.js
451
+ import { createContext as l, useMemo as h, createElement as i, Component as y, useContext as p, useState as E, forwardRef as B } from "react";
452
+ var f = l(null);
453
+ function m2({
454
+ children: r,
455
+ didCatch: e,
456
+ error: t,
457
+ resetErrorBoundary: o
458
+ }) {
459
+ const n = h(
460
+ () => ({ didCatch: e, error: t, resetErrorBoundary: o }),
461
+ [e, t, o]
462
+ );
463
+ return i(f.Provider, { value: n }, r);
464
+ }
465
+ var d = {
454
466
  didCatch: false,
455
467
  error: null
456
468
  };
457
- var m2 = class extends f {
469
+ var C = class extends y {
458
470
  constructor(e) {
459
- super(e), this.resetErrorBoundary = this.resetErrorBoundary.bind(this), this.state = c;
471
+ super(e), this.resetErrorBoundary = this.resetErrorBoundary.bind(this), this.state = d;
460
472
  }
461
473
  static getDerivedStateFromError(e) {
462
474
  return { didCatch: true, error: e };
@@ -466,50 +478,48 @@ var m2 = class extends f {
466
478
  t && (this.props.onReset?.({
467
479
  args: e,
468
480
  reason: "imperative-api"
469
- }), this.setState(c));
481
+ }), this.setState(d));
470
482
  }
471
483
  componentDidCatch(e, t) {
472
484
  this.props.onError?.(e, t);
473
485
  }
474
486
  componentDidUpdate(e, t) {
475
- const { didCatch: o } = this.state, { resetKeys: s } = this.props;
476
- o && t.didCatch && C(e.resetKeys, s) && (this.props.onReset?.({
477
- next: s,
487
+ const { didCatch: o } = this.state, { resetKeys: n } = this.props;
488
+ o && t.didCatch && g(e.resetKeys, n) && (this.props.onReset?.({
489
+ next: n,
478
490
  prev: e.resetKeys,
479
491
  reason: "keys"
480
- }), this.setState(c));
492
+ }), this.setState(d));
481
493
  }
482
494
  render() {
483
- const { children: e, fallbackRender: t, FallbackComponent: o, fallback: s } = this.props, { didCatch: n, error: a } = this.state;
484
- let i = e;
485
- if (n) {
495
+ const { children: e, fallbackRender: t, FallbackComponent: o, fallback: n } = this.props, { didCatch: s, error: a } = this.state;
496
+ let c = e;
497
+ if (s) {
486
498
  const u = {
487
499
  error: a,
488
500
  resetErrorBoundary: this.resetErrorBoundary
489
501
  };
490
502
  if (typeof t == "function")
491
- i = t(u);
503
+ c = t(u);
492
504
  else if (o)
493
- i = d(o, u);
494
- else if (s !== void 0)
495
- i = s;
505
+ c = i(o, u);
506
+ else if ("fallback" in this.props)
507
+ c = n;
496
508
  else
497
509
  throw a;
498
510
  }
499
- return d(
500
- h.Provider,
511
+ return i(
512
+ m2,
501
513
  {
502
- value: {
503
- didCatch: n,
504
- error: a,
505
- resetErrorBoundary: this.resetErrorBoundary
506
- }
514
+ didCatch: s,
515
+ error: a,
516
+ resetErrorBoundary: this.resetErrorBoundary
507
517
  },
508
- i
518
+ c
509
519
  );
510
520
  }
511
521
  };
512
- function C(r = [], e = []) {
522
+ function g(r = [], e = []) {
513
523
  return r.length !== e.length || r.some((t, o) => !Object.is(t, e[o]));
514
524
  }
515
525
 
@@ -542,7 +552,7 @@ function DefaultFallback({ error: error2, resetErrorBoundary }) {
542
552
  });
543
553
  }
544
554
  function UiErrorBoundary({ children, fallback, onReset, resetKeys }) {
545
- return /* @__PURE__ */ jsx(m2, {
555
+ return /* @__PURE__ */ jsx(C, {
546
556
  FallbackComponent: fallback ? () => fallback : DefaultFallback,
547
557
  onReset,
548
558
  resetKeys,
@@ -584,7 +594,7 @@ function Badge({ className, variant = "default", render, ...props }) {
584
594
  });
585
595
  }
586
596
 
587
- // web/app/dist/server/assets/surface-context-Bh1J3Pm9.js
597
+ // web/app/dist/server/assets/surface-context-zH57tA54.js
588
598
  import { createContext, useContext } from "react";
589
599
  import { jsx as jsx2 } from "react/jsx-runtime";
590
600
  var SURFACE_BG = {
@@ -901,12 +911,12 @@ function ActionSwapText({ value, children, animation = "blur", className }) {
901
911
  animate: "animate",
902
912
  exit: "exit",
903
913
  className: "absolute left-0 top-0 inline-block whitespace-pre",
904
- children: label.split("").map((char, i) => /* @__PURE__ */ jsx3(m.span, {
905
- custom: i * CASCADE_STAGGER,
914
+ children: label.split("").map((char, i2) => /* @__PURE__ */ jsx3(m.span, {
915
+ custom: i2 * CASCADE_STAGGER,
906
916
  variants: CASCADE_LETTER_VARIANTS,
907
917
  className: "inline-block whitespace-pre",
908
918
  children: char
909
- }, i))
919
+ }, i2))
910
920
  }, `cascade-${value}`) : /* @__PURE__ */ jsx3(m.span, {
911
921
  variants: TEXT_VARIANTS[coreAnimation],
912
922
  initial: reduce ? false : "initial",
@@ -1142,8 +1152,8 @@ var BasePopupHandle = class {
1142
1152
  }
1143
1153
  let triggerElement;
1144
1154
  if (triggerId) {
1145
- for (let i = this.attachedStores.length - 1; i >= 0 && !triggerElement; i -= 1) {
1146
- triggerElement = this.attachedStores[i].context.triggerElements.getById(triggerId);
1155
+ for (let i2 = this.attachedStores.length - 1; i2 >= 0 && !triggerElement; i2 -= 1) {
1156
+ triggerElement = this.attachedStores[i2].context.triggerElements.getById(triggerId);
1147
1157
  }
1148
1158
  triggerElement ??= this.fallbackStore.context.triggerElements.getById(triggerId);
1149
1159
  }
@@ -1733,7 +1743,7 @@ function isDaytonaNotConnectedError(error2) {
1733
1743
  return error2.status === 403;
1734
1744
  }
1735
1745
 
1736
- // web/app/dist/server/assets/routes-NdG3DsXJ.js
1746
+ // web/app/dist/server/assets/routes-Cbbo-jh9.js
1737
1747
  import { Children, Fragment as Fragment7, Suspense as Suspense2, cloneElement, createContext as createContext27, createElement, forwardRef as forwardRef54, isValidElement, lazy as lazy2, memo as memo4, useCallback as useCallback12, useContext as useContext27, useEffect as useEffect8, useEffectEvent, useId as useId2, useLayoutEffect as useLayoutEffect2, useMemo as useMemo22, useReducer, useRef as useRef39, useState as useState23, useSyncExternalStore as useSyncExternalStore3 } from "react";
1738
1748
  import { Fragment as Fragment$1, jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
1739
1749
 
@@ -4421,8 +4431,8 @@ function areArraysEqual(array1, array2, itemComparer = Object.is) {
4421
4431
  if (length !== array2.length) {
4422
4432
  return false;
4423
4433
  }
4424
- for (let i = 0; i < length; i += 1) {
4425
- if (!itemComparer(array1[i], array2[i])) {
4434
+ for (let i2 = 0; i2 < length; i2 += 1) {
4435
+ if (!itemComparer(array1[i2], array2[i2])) {
4426
4436
  return false;
4427
4437
  }
4428
4438
  }
@@ -5557,8 +5567,8 @@ function CompositeList(props) {
5557
5567
  });
5558
5568
  mutationObserverRef.current = mutationObserver;
5559
5569
  const roots = /* @__PURE__ */ new Set();
5560
- for (let i = 1; i < sortedNodes.length; i += 1) {
5561
- const root = getCommonAncestor(sortedNodes[i - 1], sortedNodes[i]);
5570
+ for (let i2 = 1; i2 < sortedNodes.length; i2 += 1) {
5571
+ const root = getCommonAncestor(sortedNodes[i2 - 1], sortedNodes[i2]);
5562
5572
  if (root) {
5563
5573
  roots.add(root);
5564
5574
  }
@@ -5674,8 +5684,8 @@ function getCommonAncestor(firstNode, lastNode) {
5674
5684
  }
5675
5685
  function hasMovedNode(entries) {
5676
5686
  for (const entry of entries) {
5677
- for (let i = 0; i < entry.removedNodes.length; i += 1) {
5678
- if (entry.removedNodes[i].isConnected) {
5687
+ for (let i2 = 0; i2 < entry.removedNodes.length; i2 += 1) {
5688
+ if (entry.removedNodes[i2].isConnected) {
5679
5689
  return true;
5680
5690
  }
5681
5691
  }
@@ -6362,9 +6372,9 @@ function useCompositeListItem(params = {}) {
6362
6372
  return void 0;
6363
6373
  }
6364
6374
  return subscribeMapChange((map) => {
6365
- const i = componentRef.current ? map.get(componentRef.current)?.index : null;
6366
- if (i != null) {
6367
- setInternalIndex(i);
6375
+ const i2 = componentRef.current ? map.get(componentRef.current)?.index : null;
6376
+ if (i2 != null) {
6377
+ setInternalIndex(i2);
6368
6378
  }
6369
6379
  });
6370
6380
  }, [externalIndex, subscribeMapChange]);
@@ -6810,10 +6820,10 @@ function getTargetScrollTop(items, isUp, scrollTop, clientHeight, scrollArrowHei
6810
6820
  if (isUp) {
6811
6821
  let firstVisibleIndex = 0;
6812
6822
  const visibleTop = scrollTop + scrollArrowHeight - SCROLL_EDGE_TOLERANCE_PX;
6813
- for (let i = 0; i < items.length; i += 1) {
6814
- const item = items[i];
6823
+ for (let i2 = 0; i2 < items.length; i2 += 1) {
6824
+ const item = items[i2];
6815
6825
  if (item && item.offsetTop >= visibleTop) {
6816
- firstVisibleIndex = i;
6826
+ firstVisibleIndex = i2;
6817
6827
  break;
6818
6828
  }
6819
6829
  }
@@ -6823,10 +6833,10 @@ function getTargetScrollTop(items, isUp, scrollTop, clientHeight, scrollArrowHei
6823
6833
  }
6824
6834
  let lastVisibleIndex = items.length - 1;
6825
6835
  const visibleBottom = scrollTop + clientHeight - scrollArrowHeight + SCROLL_EDGE_TOLERANCE_PX;
6826
- for (let i = 0; i < items.length; i += 1) {
6827
- const item = items[i];
6836
+ for (let i2 = 0; i2 < items.length; i2 += 1) {
6837
+ const item = items[i2];
6828
6838
  if (item && item.offsetTop + item.offsetHeight > visibleBottom) {
6829
- lastVisibleIndex = Math.max(0, i - 1);
6839
+ lastVisibleIndex = Math.max(0, i2 - 1);
6830
6840
  break;
6831
6841
  }
6832
6842
  }
@@ -6958,7 +6968,7 @@ if (process.env.NODE_ENV !== "production") ListboxSeparator.displayName = "Listb
6958
6968
  // node_modules/.pnpm/@base-ui+react@1.8.0_@date-fns+tz@1.5.0_@types+react@19.3.0_date-fns@4.4.0_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@base-ui/react/select/separator/SelectSeparator.mjs
6959
6969
  var SelectSeparator = ListboxSeparator;
6960
6970
 
6961
- // web/app/dist/server/assets/routes-NdG3DsXJ.js
6971
+ // web/app/dist/server/assets/routes-Cbbo-jh9.js
6962
6972
  import { createPortal } from "react-dom";
6963
6973
 
6964
6974
  // node_modules/.pnpm/@base-ui+react@1.8.0_@date-fns+tz@1.5.0_@types+react@19.3.0_date-fns@4.4.0_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@base-ui/react/alert-dialog/index.parts.mjs
@@ -10444,7 +10454,7 @@ var TabsList = /* @__PURE__ */ React112.forwardRef(function TabsList2(componentP
10444
10454
  });
10445
10455
  if (process.env.NODE_ENV !== "production") TabsList.displayName = "TabsList";
10446
10456
 
10447
- // web/app/dist/server/assets/routes-NdG3DsXJ.js
10457
+ // web/app/dist/server/assets/routes-Cbbo-jh9.js
10448
10458
  function isChatTextPart(part) {
10449
10459
  return part.type === "text";
10450
10460
  }
@@ -10489,7 +10499,7 @@ function DialogContent({ className, children, showCloseButton = true, overlayCla
10489
10499
  render: /* @__PURE__ */ jsx7(Button$1, {
10490
10500
  variant: "ghost",
10491
10501
  className: "absolute top-2 right-2",
10492
- size: "icon-sm"
10502
+ size: "icon-compact"
10493
10503
  }),
10494
10504
  children: [/* @__PURE__ */ jsx7(X, {}), /* @__PURE__ */ jsx7("span", {
10495
10505
  className: "sr-only",
@@ -10846,7 +10856,7 @@ function PromptInput({ value, defaultValue = "", onValueChange, onSubmit, loadin
10846
10856
  ]
10847
10857
  });
10848
10858
  }
10849
- var LazyGenerativeTextRenderer = lazy2(() => import("./openui-renderer-BqI6m6VI-HXEIYIYZ.js").then((n) => n.n).then(({ GenerativeTextRenderer }) => ({ default: GenerativeTextRenderer })));
10859
+ var LazyGenerativeTextRenderer = lazy2(() => import("./openui-renderer-CJ7Q2zZ_-FPXKZPSO.js").then((n) => n.n).then(({ GenerativeTextRenderer }) => ({ default: GenerativeTextRenderer })));
10850
10860
  function PlainTextFallback({ className, content }) {
10851
10861
  return /* @__PURE__ */ jsx7("div", {
10852
10862
  className: className ? `${className} whitespace-pre-wrap` : "whitespace-pre-wrap",
@@ -11792,8 +11802,8 @@ memo4(function AssistantTurn(props) {
11792
11802
  className: "group/assistant-turn",
11793
11803
  children: [/* @__PURE__ */ jsx7("div", {
11794
11804
  className: "flex flex-col gap-3",
11795
- children: assistantMsgs.map((msg, i) => {
11796
- const isLastMsg = isLastTurn && i === assistantMsgs.length - 1;
11805
+ children: assistantMsgs.map((msg, i2) => {
11806
+ const isLastMsg = isLastTurn && i2 === assistantMsgs.length - 1;
11797
11807
  return /* @__PURE__ */ jsx7(AssistantParts, {
11798
11808
  msg,
11799
11809
  isLast: isLastMsg,
@@ -11842,17 +11852,17 @@ function buildAssistantElements(parts, opts) {
11842
11852
  nestedToolsMap.get(parentId).push(part);
11843
11853
  nestedToolIds.add(part.toolCallId);
11844
11854
  }
11845
- let i = 0;
11846
- while (i < parts.length) {
11847
- const part = parts[i];
11855
+ let i2 = 0;
11856
+ while (i2 < parts.length) {
11857
+ const part = parts[i2];
11848
11858
  if (isV5ToolPart(part) && part.type === "tool-TaskOutput") {
11849
- i++;
11859
+ i2++;
11850
11860
  continue;
11851
11861
  }
11852
11862
  if (isTextPart(part)) {
11853
11863
  const text2 = part.text;
11854
11864
  if (text2 && !hasPlanWritePresentation) textChunks.push(text2);
11855
- i++;
11865
+ i2++;
11856
11866
  continue;
11857
11867
  }
11858
11868
  if (isErrorPart(part)) {
@@ -11860,21 +11870,21 @@ function buildAssistantElements(parts, opts) {
11860
11870
  title: part.title,
11861
11871
  message: part.message
11862
11872
  }, `${messageId}-error-${part.title}-${part.message}`));
11863
- i++;
11873
+ i2++;
11864
11874
  continue;
11865
11875
  }
11866
11876
  if (isPayloadPart(part)) {
11867
- elems.push(/* @__PURE__ */ jsx7(PayloadPart, { part }, `${messageId}-payload-${i}`));
11868
- i++;
11877
+ elems.push(/* @__PURE__ */ jsx7(PayloadPart, { part }, `${messageId}-payload-${i2}`));
11878
+ i2++;
11869
11879
  continue;
11870
11880
  }
11871
11881
  if (isV5ToolPart(part)) {
11872
11882
  if (suppressQuestionTool && part.type === "tool-Question") {
11873
- i++;
11883
+ i2++;
11874
11884
  continue;
11875
11885
  }
11876
11886
  if (part.toolCallId && nestedToolIds.has(part.toolCallId)) {
11877
- i++;
11887
+ i2++;
11878
11888
  continue;
11879
11889
  }
11880
11890
  const chatStreamingStatus = isLast && isStreaming ? "streaming" : void 0;
@@ -11888,10 +11898,10 @@ function buildAssistantElements(parts, opts) {
11888
11898
  chatStatus: chatStreamingStatus,
11889
11899
  toolRenderers
11890
11900
  }, getAssistantToolElementKey(messageId, part, occurrence)));
11891
- i++;
11901
+ i2++;
11892
11902
  continue;
11893
11903
  }
11894
- i++;
11904
+ i2++;
11895
11905
  }
11896
11906
  const text = textChunks.join("\n\n");
11897
11907
  if (text) elems.push(/* @__PURE__ */ jsx7("div", {
@@ -12256,23 +12266,23 @@ var UserMessage = memo4(function UserMessage2({ message, className, enableImageP
12256
12266
  for (const att of message.experimental_attachments) if (att.contentType?.startsWith("image/") && att.url) images.push(att.url);
12257
12267
  }
12258
12268
  if (!text && images.length === 0 && files.length === 0) return null;
12259
- const lightboxImages = images.map((url, i) => ({
12260
- id: `${message.id}-img-${i}`,
12269
+ const lightboxImages = images.map((url, i2) => ({
12270
+ id: `${message.id}-img-${i2}`,
12261
12271
  url,
12262
- filename: `image-${i + 1}`
12272
+ filename: `image-${i2 + 1}`
12263
12273
  }));
12264
12274
  return /* @__PURE__ */ jsxs3("div", {
12265
12275
  className: cn("flex flex-col items-end gap-1", className),
12266
12276
  children: [
12267
- images.length > 0 && images.map((url, i) => /* @__PURE__ */ jsx7("div", {
12277
+ images.length > 0 && images.map((url, i2) => /* @__PURE__ */ jsx7("div", {
12268
12278
  className: cn("max-w-[200px] rounded-chat-message bg-foreground/4 p-1.5", enableImagePreview && "cursor-pointer"),
12269
- onClick: enableImagePreview ? () => setLightboxIndex(i) : void 0,
12279
+ onClick: enableImagePreview ? () => setLightboxIndex(i2) : void 0,
12270
12280
  role: enableImagePreview ? "button" : void 0,
12271
12281
  tabIndex: enableImagePreview ? 0 : void 0,
12272
12282
  onKeyDown: enableImagePreview ? (event) => {
12273
12283
  if (event.key === "Enter" || event.key === " ") {
12274
12284
  event.preventDefault();
12275
- setLightboxIndex(i);
12285
+ setLightboxIndex(i2);
12276
12286
  }
12277
12287
  } : void 0,
12278
12288
  children: /* @__PURE__ */ jsx7("img", {
@@ -12291,8 +12301,8 @@ var UserMessage = memo4(function UserMessage2({ message, className, enableImageP
12291
12301
  }),
12292
12302
  files.length > 0 && /* @__PURE__ */ jsx7("div", {
12293
12303
  className: "flex flex-col items-end gap-2",
12294
- children: files.map((file, i) => /* @__PURE__ */ jsx7(FileAttachment, {
12295
- id: `${file.filename}-${i}`,
12304
+ children: files.map((file, i2) => /* @__PURE__ */ jsx7(FileAttachment, {
12305
+ id: `${file.filename}-${i2}`,
12296
12306
  filename: file.filename,
12297
12307
  size: file.size
12298
12308
  }, `${file.filename}-${file.size}`))
@@ -12737,13 +12747,13 @@ function rlmStatusIcon(status) {
12737
12747
  if (status === "recovering") return /* @__PURE__ */ jsx7(RotateCw, { className: "size-3.5 animate-spin text-amber-500 dark:text-amber-400" });
12738
12748
  return /* @__PURE__ */ jsx7(LoaderCircle, { className: "size-3.5 animate-spin text-primary" });
12739
12749
  }
12740
- var LazyArtifactsPanel = lazy2(() => import("./artifacts-panel-BVfcZuA2-PB4RCSHV.js").then(({ ArtifactsPanelContent }) => ({ default: ArtifactsPanelContent })));
12741
- var LazyResourcesPanel = lazy2(() => import("./resources-panel-BKZ0M0RP-CMATPQQP.js").then(({ ResourcesPanelContent }) => ({ default: ResourcesPanelContent })));
12750
+ var LazyArtifactsPanel = lazy2(() => import("./artifacts-panel-BuAqeJzj-6DYYLKUW.js").then(({ ArtifactsPanelContent }) => ({ default: ArtifactsPanelContent })));
12751
+ var LazyResourcesPanel = lazy2(() => import("./resources-panel-yVB4xF_K-OHFHXVU4.js").then(({ ResourcesPanelContent }) => ({ default: ResourcesPanelContent })));
12742
12752
  var LazySessionInsightsPanel = lazy2(() => import("./session-insights-panel-CWmY-2NA-ZSWW6NIO.js").then(({ SessionInsightsPanel }) => ({ default: SessionInsightsPanel })));
12743
12753
  var LazyReplPanel = lazy2(() => import("./repl-panel-DOyUyuQR-IMYO4FKX.js").then(({ ReplPanelContent }) => ({ default: ReplPanelContent })));
12744
- var LazySubagentsPanel = lazy2(() => import("./subagents-panel-Dw6yP5X4-BMN45GDD.js").then(({ SubagentsPanelContent }) => ({ default: SubagentsPanelContent })));
12745
- var LazyWorkspacePanel = lazy2(() => import("./workspace-panel-C246J-eO-2WGJWVE6.js").then(({ WorkspacePanelContent }) => ({ default: WorkspacePanelContent })));
12746
- var LazySessionTreePanel = lazy2(() => import("./session-tree-panel-V3l8WdmE-YBRDLHWU.js").then(({ SessionTreePanel }) => ({ default: SessionTreePanel })));
12754
+ var LazySubagentsPanel = lazy2(() => import("./subagents-panel-aC3Eo-MR-RNIPLCZQ.js").then(({ SubagentsPanelContent }) => ({ default: SubagentsPanelContent })));
12755
+ var LazyWorkspacePanel = lazy2(() => import("./workspace-panel-DfdFkgHU-6HIOXRBX.js").then(({ WorkspacePanelContent }) => ({ default: WorkspacePanelContent })));
12756
+ var LazySessionTreePanel = lazy2(() => import("./session-tree-panel-CL49XSTK-4ZPK6AIV.js").then(({ SessionTreePanel }) => ({ default: SessionTreePanel })));
12747
12757
  function PanelFallback() {
12748
12758
  return /* @__PURE__ */ jsxs3("div", {
12749
12759
  className: "flex min-h-32 flex-col gap-3 p-4",
@@ -13496,9 +13506,14 @@ function resolveChatApiUrl(path) {
13496
13506
  if (!isChatRuntimePath(pathname)) return path;
13497
13507
  return `${base}${path}`;
13498
13508
  }
13499
- function getChatAuthBearerToken$1() {
13509
+ function useOptionalUser() {
13510
+ return null;
13511
+ }
13512
+ function getChatAuthBearerToken() {
13500
13513
  return null;
13501
13514
  }
13515
+ async function signOut() {
13516
+ }
13502
13517
  var ChatRequestError = class extends Error {
13503
13518
  status;
13504
13519
  body;
@@ -13558,7 +13573,7 @@ function chatErrorFromStreamEvent(event) {
13558
13573
  }
13559
13574
  async function withChatRequestHeaders(init) {
13560
13575
  const headers = new Headers(init?.headers);
13561
- const bearer = await getChatAuthBearerToken$1();
13576
+ const bearer = await getChatAuthBearerToken();
13562
13577
  if (bearer) headers.set("Authorization", `Bearer ${bearer}`);
13563
13578
  return headers;
13564
13579
  }
@@ -13712,7 +13727,7 @@ function ChatWelcome({ disabled, onSelect }) {
13712
13727
  children: WELCOME_TASKS.map((item) => /* @__PURE__ */ jsx7(Button$1, {
13713
13728
  type: "button",
13714
13729
  variant: "outline",
13715
- size: "sm",
13730
+ size: "compact",
13716
13731
  disabled: disabled || item.disabled,
13717
13732
  onClick: () => onSelect(item),
13718
13733
  className: SUGGESTION_ITEM_CLASS,
@@ -14476,7 +14491,7 @@ function ApprovalCard({ title = "Approval required", description, children, ques
14476
14491
  className: "mt-4 flex flex-wrap items-center gap-2",
14477
14492
  children: [
14478
14493
  /* @__PURE__ */ jsx7(Button$1, {
14479
- size: "sm",
14494
+ size: "compact",
14480
14495
  disabled: busy,
14481
14496
  onClick: onApprove,
14482
14497
  className: "rounded-full",
@@ -14484,7 +14499,7 @@ function ApprovalCard({ title = "Approval required", description, children, ques
14484
14499
  }),
14485
14500
  onRequestChanges ? /* @__PURE__ */ jsx7(Button$1, {
14486
14501
  variant: "secondary",
14487
- size: "sm",
14502
+ size: "compact",
14488
14503
  disabled: busy,
14489
14504
  onClick: onRequestChanges,
14490
14505
  className: "rounded-full",
@@ -14492,7 +14507,7 @@ function ApprovalCard({ title = "Approval required", description, children, ques
14492
14507
  }) : null,
14493
14508
  onReject ? /* @__PURE__ */ jsx7(Button$1, {
14494
14509
  variant: "ghost",
14495
- size: "sm",
14510
+ size: "compact",
14496
14511
  disabled: busy,
14497
14512
  onClick: onReject,
14498
14513
  className: "rounded-full text-muted-foreground hover:text-rose-600 dark:hover:text-rose-400",
@@ -15113,7 +15128,7 @@ function useInputBarState({ models, status, thinkingLevel, onModelChange, onThin
15113
15128
  value
15114
15129
  };
15115
15130
  }
15116
- var LazyModelSelectorList = lazy2(() => import("./model-selector-list-q6WkkOwQ-OT46QU5P.js").then(({ ModelSelectorList: ModelSelectorList2 }) => ({ default: ModelSelectorList2 })));
15131
+ var LazyModelSelectorList = lazy2(() => import("./model-selector-list-BjoXmw92-TEKBPB3E.js").then(({ ModelSelectorList: ModelSelectorList2 }) => ({ default: ModelSelectorList2 })));
15117
15132
  function ModelSelectorList(props) {
15118
15133
  return /* @__PURE__ */ jsx7(Suspense2, {
15119
15134
  fallback: /* @__PURE__ */ jsx7("div", {
@@ -15224,7 +15239,7 @@ function InputBarContent({ modelKey, models, status, infoDescription, chatMode =
15224
15239
  }), /* @__PURE__ */ jsx7(Button$1, {
15225
15240
  type: "button",
15226
15241
  variant: "outline",
15227
- size: "icon-xs",
15242
+ size: "icon-compact",
15228
15243
  "aria-label": `Remove ${image.filename}`,
15229
15244
  onClick: () => attachments?.onRemoveImage?.(image.id),
15230
15245
  className: cn(HIT_AREA_EXPAND_CLASS, "absolute -end-1 -top-1 size-6 rounded-full bg-background opacity-0 shadow-sm transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100 [@media(hover:none)]:opacity-100"),
@@ -15675,7 +15690,7 @@ function iconFor(kind) {
15675
15690
  return kind;
15676
15691
  }
15677
15692
  }
15678
- var LazySessionToolRenderer = lazy2(() => import("./session-tool-renderer-DaR8U5rb-TXWACWT7.js").then((n) => n.n).then(({ SessionToolRenderer: SessionToolRenderer2 }) => ({ default: SessionToolRenderer2 })));
15693
+ var LazySessionToolRenderer = lazy2(() => import("./session-tool-renderer-QcAkYD-V-6RXRKDH6.js").then((n) => n.n).then(({ SessionToolRenderer: SessionToolRenderer2 }) => ({ default: SessionToolRenderer2 })));
15679
15694
  function SessionToolRenderer(props) {
15680
15695
  return /* @__PURE__ */ jsx7(Suspense2, {
15681
15696
  fallback: /* @__PURE__ */ jsx7("div", {
@@ -15686,7 +15701,7 @@ function SessionToolRenderer(props) {
15686
15701
  children: /* @__PURE__ */ jsx7(LazySessionToolRenderer, { ...props })
15687
15702
  });
15688
15703
  }
15689
- var LazySessionReasoningPanel = lazy2(() => import("./session-reasoning-panel-Dc-AnjdD-7KAZLD74.js").then(({ SessionReasoningPanel: SessionReasoningPanel2 }) => ({ default: SessionReasoningPanel2 })));
15704
+ var LazySessionReasoningPanel = lazy2(() => import("./session-reasoning-panel-C50VbaQ8-4YLMVVY6.js").then(({ SessionReasoningPanel: SessionReasoningPanel2 }) => ({ default: SessionReasoningPanel2 })));
15690
15705
  function SessionReasoningPanel(props) {
15691
15706
  return /* @__PURE__ */ jsx7(Suspense2, {
15692
15707
  fallback: /* @__PURE__ */ jsx7("div", {
@@ -15722,7 +15737,7 @@ function PromptSuggestions(props) {
15722
15737
  })
15723
15738
  });
15724
15739
  }
15725
- var LazyMessageQueue = lazy2(() => import("./message-queue-D_Q3coUY-I3EJZXWR.js").then(({ MessageQueue: MessageQueue2 }) => ({ default: MessageQueue2 })));
15740
+ var LazyMessageQueue = lazy2(() => import("./message-queue-BzEFQR8k-2W53EW32.js").then(({ MessageQueue: MessageQueue2 }) => ({ default: MessageQueue2 })));
15726
15741
  function MessageQueue(props) {
15727
15742
  return /* @__PURE__ */ jsx7(Suspense2, {
15728
15743
  fallback: null,
@@ -16180,14 +16195,6 @@ function useChatInputBarProps(composer, activeSessionId) {
16180
16195
  workspaceReferenceSuggestions
16181
16196
  ]);
16182
16197
  }
16183
- function useOptionalUser() {
16184
- return null;
16185
- }
16186
- function getChatAuthBearerToken() {
16187
- return null;
16188
- }
16189
- async function signOut() {
16190
- }
16191
16198
  var ProjectResponseSchema = external_exports.object({ project: ProjectSummarySchema });
16192
16199
  var chatClient = {
16193
16200
  async abortSession(metadata) {
@@ -17514,8 +17521,8 @@ function usePendingQuestionBar({ messages, answerQuestion }) {
17514
17521
  }, [messages, answerQuestion]);
17515
17522
  }
17516
17523
  function findPendingQuestionPart(messages) {
17517
- for (let i = messages.length - 1; i >= 0; i--) {
17518
- const msg = messages[i];
17524
+ for (let i2 = messages.length - 1; i2 >= 0; i2--) {
17525
+ const msg = messages[i2];
17519
17526
  if (msg.role !== "assistant" || !Array.isArray(msg.parts)) continue;
17520
17527
  for (let j = msg.parts.length - 1; j >= 0; j--) {
17521
17528
  const part = msg.parts[j];
@@ -17900,8 +17907,8 @@ function flattenForkCandidates(nodes) {
17900
17907
  return users.length > 0 ? users : all;
17901
17908
  }
17902
17909
  function lastAssistantCopyText(messages) {
17903
- for (let i = messages.length - 1; i >= 0; i -= 1) {
17904
- const message = messages[i];
17910
+ for (let i2 = messages.length - 1; i2 >= 0; i2 -= 1) {
17911
+ const message = messages[i2];
17905
17912
  if (message?.role !== "assistant" || message.source === "local") continue;
17906
17913
  const text = assistantTextFromMessage(message).trim();
17907
17914
  if (text) return text;
@@ -19857,19 +19864,18 @@ function usePiChat(model, options) {
19857
19864
  }
19858
19865
  var RESOURCE_CANVAS_WIDTH_STORAGE_KEY = "fleet-prime:v1:right-panel-width";
19859
19866
  var THEME_PREFERENCE_STORAGE_KEY = "fleet-prime:v1:theme-preference";
19860
- var RESOURCE_CANVAS_MIN_WIDTH = 320;
19861
19867
  function getResourceCanvasInitialWidth() {
19862
- if (typeof window === "undefined") return RESOURCE_CANVAS_MIN_WIDTH;
19868
+ if (typeof window === "undefined") return 320;
19863
19869
  return clampResourceCanvasWidth(Math.floor(window.innerWidth * RESOURCE_CANVAS_DEFAULT_VIEWPORT_RATIO));
19864
19870
  }
19865
19871
  function getResourceCanvasMaxWidth() {
19866
- if (typeof window === "undefined") return RESOURCE_CANVAS_MIN_WIDTH;
19872
+ if (typeof window === "undefined") return 320;
19867
19873
  const computedRootFontSizePx = Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize);
19868
19874
  const sessionSidebarWidthPx = getResourceCanvasSessionSidebarWidthPx(Number.isFinite(computedRootFontSizePx) && computedRootFontSizePx > 0 ? computedRootFontSizePx : 16);
19869
- return Math.max(RESOURCE_CANVAS_MIN_WIDTH, window.innerWidth - sessionSidebarWidthPx - 360);
19875
+ return Math.max(320, window.innerWidth - sessionSidebarWidthPx - 360);
19870
19876
  }
19871
19877
  function clampResourceCanvasWidth(width) {
19872
- return Math.min(getResourceCanvasMaxWidth(), Math.max(RESOURCE_CANVAS_MIN_WIDTH, Math.round(width)));
19878
+ return Math.min(getResourceCanvasMaxWidth(), Math.max(320, Math.round(width)));
19873
19879
  }
19874
19880
  function readStoredResourceCanvasWidth() {
19875
19881
  return readStoredWidth(RESOURCE_CANVAS_WIDTH_STORAGE_KEY, getResourceCanvasInitialWidth(), clampResourceCanvasWidth);
@@ -19968,6 +19974,11 @@ function useChatShellState(modelsData, storage) {
19968
19974
  storeThemePreference(preference);
19969
19975
  applyThemePreference(preference);
19970
19976
  }, []);
19977
+ const handleResourceCanvasWidthChange = useCallback12((nextWidth) => {
19978
+ const clamped = clampResourceCanvasWidth(nextWidth);
19979
+ setResourceCanvasWidth(clamped);
19980
+ storeResourceCanvasWidth(clamped);
19981
+ }, []);
19971
19982
  const handleResourceCanvasResizeStart = useCallback12((event) => {
19972
19983
  startHorizontalResize({
19973
19984
  event,
@@ -20027,6 +20038,7 @@ function useChatShellState(modelsData, storage) {
20027
20038
  return {
20028
20039
  commandPaletteOpen,
20029
20040
  handleResourceCanvasResizeStart,
20041
+ handleResourceCanvasWidthChange,
20030
20042
  handleThemePreferenceChange,
20031
20043
  initialSessionMetadata: storedSessionMetadata,
20032
20044
  modelKey,
@@ -20398,7 +20410,7 @@ var AnimatedSidebarTrigger = forwardRef54(function AnimatedSidebarTrigger2({ cla
20398
20410
  },
20399
20411
  type,
20400
20412
  variant: "ghost",
20401
- size: "icon-lg",
20413
+ size: "icon",
20402
20414
  "aria-label": props["aria-label"] ?? "Toggle sidebar",
20403
20415
  "aria-expanded": expanded,
20404
20416
  "data-slot": "sidebar-trigger",
@@ -20417,7 +20429,7 @@ forwardRef54(function AnimatedSidebarClose({ className, onClick, type = "button"
20417
20429
  ref: forwardedRef,
20418
20430
  type,
20419
20431
  variant: "ghost",
20420
- size: "icon-lg",
20432
+ size: "icon",
20421
20433
  "aria-label": props["aria-label"] ?? "Close sidebar",
20422
20434
  onClick: (event) => {
20423
20435
  onClick?.(event);
@@ -20562,7 +20574,7 @@ function ChromePillButton({ active = false, ariaLabel, className, title, ...prop
20562
20574
  ...props,
20563
20575
  type: "button",
20564
20576
  variant: "ghost",
20565
- size: "sm",
20577
+ size: "compact",
20566
20578
  className: cn(CHROME_PILL_CLASS, active ? CHROME_PILL_ACTIVE_CLASS : CHROME_PILL_INACTIVE_CLASS, className),
20567
20579
  "aria-label": ariaLabel,
20568
20580
  title: title ?? ariaLabel
@@ -20758,7 +20770,7 @@ function AgentTabBar({ tabs, value, onValueChange, onClose, onNewSession }) {
20758
20770
  onClick: () => onValueChange(tab.id),
20759
20771
  onKeyDown: (event) => handleKeyDown(event, tab.id),
20760
20772
  role: "tab",
20761
- size: "sm",
20773
+ size: "compact",
20762
20774
  tabIndex: active ? 0 : -1,
20763
20775
  type: "button",
20764
20776
  variant: "ghost",
@@ -20779,7 +20791,7 @@ function AgentTabBar({ tabs, value, onValueChange, onClose, onNewSession }) {
20779
20791
  event.stopPropagation();
20780
20792
  onClose(tab.id);
20781
20793
  },
20782
- size: "icon-xs",
20794
+ size: "icon-compact",
20783
20795
  title: `Close ${tab.label} tab`,
20784
20796
  type: "button",
20785
20797
  variant: "ghost",
@@ -20799,7 +20811,7 @@ function AgentTabBar({ tabs, value, onValueChange, onClose, onNewSession }) {
20799
20811
  event.stopPropagation();
20800
20812
  onNewSession();
20801
20813
  },
20802
- size: "icon-sm",
20814
+ size: "icon-compact",
20803
20815
  title: "New chat",
20804
20816
  type: "button",
20805
20817
  variant: "ghost",
@@ -20862,9 +20874,9 @@ function useProximityHover(containerRef, options = {}) {
20862
20874
  });
20863
20875
  const prev = itemRectsRef.current;
20864
20876
  let changed = prev.length !== rects.length;
20865
- for (let i = 0; !changed && i < rects.length; i++) {
20866
- const p2 = prev[i];
20867
- const r = rects[i];
20877
+ for (let i2 = 0; !changed && i2 < rects.length; i2++) {
20878
+ const p2 = prev[i2];
20879
+ const r = rects[i2];
20868
20880
  if (p2 === r) continue;
20869
20881
  changed = !p2 || !r || p2.top !== r.top || p2.left !== r.left || p2.width !== r.width || p2.height !== r.height;
20870
20882
  }
@@ -21469,7 +21481,7 @@ function MobilePanel({ children, dataTestid, headerActions, icon: Icon, onClose,
21469
21481
  type: "button",
21470
21482
  onClick: handleHeaderClose,
21471
21483
  variant: "ghost",
21472
- size: "icon-sm",
21484
+ size: "icon-compact",
21473
21485
  className: `relative after:absolute after:top-1/2 after:left-1/2 after:size-10 after:-translate-x-1/2 after:-translate-y-1/2 text-foreground/40 hover:text-foreground/70`,
21474
21486
  "aria-label": "Close panel",
21475
21487
  title: "Close panel",
@@ -22366,7 +22378,7 @@ function useChatWorkspaceData() {
22366
22378
  projectId: activeProjectId
22367
22379
  });
22368
22380
  const discoverModelsMutation = useDiscoverChatModels();
22369
- const { commandPaletteOpen, handleResourceCanvasResizeStart, handleThemePreferenceChange, initialSessionMetadata, modelKey, modelSelection, models, openArtifact, openWorkspacePath, openPanelAction, persistSession, reopenRightPanel, resourceCanvasWidth, rightPanel, selectedArtifactId, selectedWorkspacePath, setCommandPaletteOpen, setModelKey, setRightPanel, setSelectedWorkspacePath, setThinkingLevel, themePreference, thinkingLevel } = useChatShellState(modelsData, storage);
22381
+ const { commandPaletteOpen, handleResourceCanvasResizeStart, handleResourceCanvasWidthChange, handleThemePreferenceChange, initialSessionMetadata, modelKey, modelSelection, models, openArtifact, openWorkspacePath, openPanelAction, persistSession, reopenRightPanel, resourceCanvasWidth, rightPanel, selectedArtifactId, selectedWorkspacePath, setCommandPaletteOpen, setModelKey, setRightPanel, setSelectedWorkspacePath, setThinkingLevel, themePreference, thinkingLevel } = useChatShellState(modelsData, storage);
22370
22382
  useEffect8(() => {
22371
22383
  if (initialSessionMetadata.projectId && initialSessionMetadata.projectId !== activeProjectId) {
22372
22384
  setActiveProjectId(initialSessionMetadata.projectId);
@@ -22734,7 +22746,7 @@ function useChatWorkspaceData() {
22734
22746
  }, [composerIntentAvailability]);
22735
22747
  const setComposerIntentKey = useCallback12(async (apiKey) => {
22736
22748
  try {
22737
- await fetch(resolveChatApiUrl("/api/chat/intent"), {
22749
+ await fetchJson("/api/chat/intent", {
22738
22750
  method: "PUT",
22739
22751
  headers: { "Content-Type": "application/json" },
22740
22752
  body: JSON.stringify({ apiKey })
@@ -22911,6 +22923,7 @@ function useChatWorkspaceData() {
22911
22923
  panels: {
22912
22924
  chatPanelData,
22913
22925
  handleResourceCanvasResizeStart,
22926
+ handleResourceCanvasWidthChange,
22914
22927
  resourceCanvasWidth,
22915
22928
  rightPanel,
22916
22929
  setRightPanel,
@@ -22946,9 +22959,9 @@ function ChatApp({ children, className, sidebarWidth = SESSION_SIDEBAR_WIDTH_CSS
22946
22959
  children
22947
22960
  });
22948
22961
  }
22949
- var LazyChatCommandPalette = lazy2(() => import("./chat-command-palette-DlJDToBH-MVI6V743.js").then(({ ChatCommandPalette }) => ({ default: ChatCommandPalette })));
22950
- var LazySettingsDialog = lazy2(() => import("./settings-dialog-C8U1VX75-6A2V6HSW.js").then(({ SettingsDialog }) => ({ default: SettingsDialog })));
22951
- var LazyForkPickerDialog = lazy2(() => import("./fork-picker-dialog-CZBpezXS-64KP23PO.js").then(({ ForkPickerDialog }) => ({ default: ForkPickerDialog })));
22962
+ var LazyChatCommandPalette = lazy2(() => import("./chat-command-palette-Ca8gXVi2-P6EOQ43G.js").then(({ ChatCommandPalette }) => ({ default: ChatCommandPalette })));
22963
+ var LazySettingsDialog = lazy2(() => import("./settings-dialog-DG9HEZeP-TWDRDGMN.js").then(({ SettingsDialog }) => ({ default: SettingsDialog })));
22964
+ var LazyForkPickerDialog = lazy2(() => import("./fork-picker-dialog-QH00XmqX-6YLU5REF.js").then(({ ForkPickerDialog }) => ({ default: ForkPickerDialog })));
22952
22965
  function ChatCommandPaletteOverlay({ chrome, conversation, dialogs, panels, session }) {
22953
22966
  return /* @__PURE__ */ jsx7(Fragment$1, { children: dialogs.commandPaletteOpen ? /* @__PURE__ */ jsx7(Suspense2, {
22954
22967
  fallback: null,
@@ -23000,7 +23013,7 @@ function ChatWorkspaceOverlayDialogs({ dialogs }) {
23000
23013
  }
23001
23014
  var layoutStyle = {
23002
23015
  "--chat-chrome-top": `52px`,
23003
- "--chat-header-height": `44px`,
23016
+ "--chat-header-height": `var(--density-header-height, 44px)`,
23004
23017
  "--chat-header-top": `0px`
23005
23018
  };
23006
23019
  function ChatWorkspaceLayout({ children, headerCenter, headerLeft, headerRight, panel }) {
@@ -23132,13 +23145,15 @@ function usePanelKeybindings({ onCommandPaletteToggle, onClosePanel, rightPanel,
23132
23145
  setRightPanel
23133
23146
  ]);
23134
23147
  }
23135
- function ResizableCanvas({ children, dataTestid, headerLeading, loading, onClose, onRefresh, onResizeStart, open: open2, headerActions, title, titleIcon: TitleIcon, width }) {
23148
+ function ResizableCanvas({ children, dataTestid, headerLeading, loading, onClose, onRefresh, onResizeStart, onWidthChange, open: open2, headerActions, title, titleIcon: TitleIcon, width }) {
23136
23149
  const reduceMotion = useReducedMotion();
23137
23150
  const panelRef = useRef39(null);
23138
23151
  useEffect8(() => {
23139
23152
  if (!open2) return;
23140
23153
  panelRef.current?.focus({ preventScroll: true });
23141
23154
  }, [open2]);
23155
+ const minWidth = 320;
23156
+ const maxWidth = getResourceCanvasMaxWidth();
23142
23157
  return /* @__PURE__ */ jsx7(AnimatePresence, { children: open2 && /* @__PURE__ */ jsxs3(m.aside, {
23143
23158
  ref: panelRef,
23144
23159
  initial: reduceMotion ? false : {
@@ -23173,14 +23188,36 @@ function ResizableCanvas({ children, dataTestid, headerLeading, loading, onClose
23173
23188
  },
23174
23189
  children: [/* @__PURE__ */ jsx7("button", {
23175
23190
  type: "button",
23191
+ role: "separator",
23192
+ "aria-orientation": "vertical",
23176
23193
  "aria-label": `Resize ${title} panel`,
23177
- className: "absolute top-0 bottom-0 left-0 z-10 w-2 -translate-x-1 cursor-col-resize touch-none bg-transparent transition-colors outline-none hover:bg-foreground/10 focus-visible:bg-foreground/10",
23194
+ "aria-valuenow": Math.round(width),
23195
+ "aria-valuemin": minWidth,
23196
+ "aria-valuemax": maxWidth,
23197
+ tabIndex: 0,
23198
+ className: "absolute top-0 bottom-0 left-0 z-10 w-2 -translate-x-1 cursor-col-resize touch-none bg-transparent transition-colors outline-none hover:bg-foreground/10 focus-visible:bg-foreground/10 focus-visible:ring-1 focus-visible:ring-ring",
23178
23199
  "data-testid": "pi-resources-resize-handle",
23179
- onPointerDown: onResizeStart
23200
+ onPointerDown: onResizeStart,
23201
+ onKeyDown: (event) => {
23202
+ const step = 16;
23203
+ if (event.key === "ArrowLeft") {
23204
+ event.preventDefault();
23205
+ onWidthChange?.(clampResourceCanvasWidth(width + step));
23206
+ } else if (event.key === "ArrowRight") {
23207
+ event.preventDefault();
23208
+ onWidthChange?.(clampResourceCanvasWidth(width - step));
23209
+ } else if (event.key === "Home") {
23210
+ event.preventDefault();
23211
+ onWidthChange?.(minWidth);
23212
+ } else if (event.key === "End") {
23213
+ event.preventDefault();
23214
+ onWidthChange?.(maxWidth);
23215
+ }
23216
+ }
23180
23217
  }), /* @__PURE__ */ jsxs3("div", {
23181
23218
  className: "flex h-full min-w-0 flex-1 flex-col overflow-hidden",
23182
23219
  children: [/* @__PURE__ */ jsxs3("div", {
23183
- className: "flex h-[var(--chat-header-height,44px)] min-h-[var(--chat-header-height,44px)] min-w-0 shrink-0 items-center justify-between gap-2 border-b border-border/60 px-[var(--density-pad-x)] py-1",
23220
+ className: "flex h-[var(--chat-header-height,var(--density-header-height,44px))] min-h-[var(--chat-header-height,var(--density-header-height,44px))] min-w-0 shrink-0 items-center justify-between gap-2 border-b border-border/60 px-[var(--density-pad-x)] py-1",
23184
23221
  children: [/* @__PURE__ */ jsx7("div", {
23185
23222
  className: "min-w-0 flex-1",
23186
23223
  children: headerLeading ?? /* @__PURE__ */ jsxs3("div", {
@@ -23196,7 +23233,7 @@ function ResizableCanvas({ children, dataTestid, headerLeading, loading, onClose
23196
23233
  onClick: onRefresh,
23197
23234
  disabled: !onRefresh,
23198
23235
  variant: "ghost",
23199
- size: "icon-sm",
23236
+ size: "icon-compact",
23200
23237
  className: `relative after:absolute after:inset-x-0 after:-top-1.5 after:-bottom-1.5 text-foreground/40 hover:text-foreground/70 disabled:cursor-not-allowed disabled:opacity-35`,
23201
23238
  "aria-label": `Refresh ${title}`,
23202
23239
  title: `Refresh ${title}`,
@@ -23209,7 +23246,7 @@ function ResizableCanvas({ children, dataTestid, headerLeading, loading, onClose
23209
23246
  type: "button",
23210
23247
  onClick: onClose,
23211
23248
  variant: "ghost",
23212
- size: "icon-sm",
23249
+ size: "icon-compact",
23213
23250
  className: `relative after:absolute after:inset-x-0 after:-top-1.5 after:-bottom-1.5 text-foreground/40 hover:text-foreground/70`,
23214
23251
  "aria-label": "Close panel",
23215
23252
  title: "Close panel",
@@ -23243,7 +23280,7 @@ function getServerDesktopPanelSnapshot() {
23243
23280
  function useIsDesktopPanel() {
23244
23281
  return useSyncExternalStore3(subscribeToDesktopPanel, getDesktopPanelSnapshot, getServerDesktopPanelSnapshot);
23245
23282
  }
23246
- function RightPanelShell({ handleResourceCanvasResizeStart, onClose, resourceCanvasWidth }) {
23283
+ function RightPanelShell({ handleResourceCanvasResizeStart, onClose, resourceCanvasWidth, onResourceCanvasWidthChange }) {
23247
23284
  const chat = useChatPanelDataContext();
23248
23285
  const workspace = useWorkspaceTreeContext();
23249
23286
  const { rightPanel } = chat;
@@ -23263,6 +23300,7 @@ function RightPanelShell({ handleResourceCanvasResizeStart, onClose, resourceCan
23263
23300
  onClose,
23264
23301
  onRefresh,
23265
23302
  onResizeStart: handleResourceCanvasResizeStart,
23303
+ onWidthChange: onResourceCanvasWidthChange,
23266
23304
  open: panelOpen,
23267
23305
  title: definition?.title ?? "",
23268
23306
  titleIcon: definition?.icon ?? Library,
@@ -23277,129 +23315,189 @@ function RightPanelShell({ handleResourceCanvasResizeStart, onClose, resourceCan
23277
23315
  children: PanelContent ? /* @__PURE__ */ jsx7(PanelContent, {}) : null
23278
23316
  }) });
23279
23317
  }
23280
- function SessionSidebarActionDialogs({ projects, onRenameSession, onDeleteSession, onRenameProject, onUnregisterProject, onForkSessionIntoProject, renameTarget, setRenameTarget, renameTitle, setRenameTitle, renameProjectTarget, setRenameProjectTarget, renameProjectName, setRenameProjectName, deleteTarget, setDeleteTarget, unregisterTarget, setUnregisterTarget, forkTarget, setForkTarget, forkProjectId, setForkProjectId }) {
23281
- const forkProjectOptions = useMemo22(() => projects.flatMap((project) => project.projectId === forkTarget?.projectId ? [] : [{
23318
+ function RenameSessionDialog({ session, onClose, onRenameSession }) {
23319
+ const [renameTitle, setRenameTitle] = useState23(() => sessionLabel(session));
23320
+ return /* @__PURE__ */ jsx7(AlertDialog$1, {
23321
+ open: true,
23322
+ onOpenChange: (open2) => !open2 && onClose(),
23323
+ children: /* @__PURE__ */ jsxs3(AlertDialogContent, { children: [
23324
+ /* @__PURE__ */ jsx7(AlertDialogTitle, { children: "Rename session" }),
23325
+ /* @__PURE__ */ jsx7(AlertDialogDescription, { children: "Choose a local display title for this Fleet Prime session." }),
23326
+ /* @__PURE__ */ jsx7(Input$1, {
23327
+ value: renameTitle,
23328
+ onChange: (event) => setRenameTitle(event.target.value),
23329
+ "aria-label": "Session title",
23330
+ autoFocus: true
23331
+ }),
23332
+ /* @__PURE__ */ jsxs3(AlertDialogFooter, { children: [/* @__PURE__ */ jsx7(AlertDialogCancel, {
23333
+ onClick: onClose,
23334
+ children: "Cancel"
23335
+ }), /* @__PURE__ */ jsx7(AlertDialogAction, {
23336
+ disabled: !renameTitle.trim(),
23337
+ onClick: () => {
23338
+ if (renameTitle.trim()) {
23339
+ onRenameSession(session.sessionId, renameTitle.trim());
23340
+ onClose();
23341
+ }
23342
+ },
23343
+ children: "Rename"
23344
+ })] })
23345
+ ] })
23346
+ });
23347
+ }
23348
+ function RenameProjectDialog({ project, onClose, onRenameProject }) {
23349
+ const [renameProjectName, setRenameProjectName] = useState23(project.name);
23350
+ return /* @__PURE__ */ jsx7(AlertDialog$1, {
23351
+ open: true,
23352
+ onOpenChange: (open2) => !open2 && onClose(),
23353
+ children: /* @__PURE__ */ jsxs3(AlertDialogContent, { children: [
23354
+ /* @__PURE__ */ jsx7(AlertDialogTitle, { children: "Rename project" }),
23355
+ /* @__PURE__ */ jsx7(AlertDialogDescription, { children: "This changes the display name only. The registered directory stays the same." }),
23356
+ /* @__PURE__ */ jsx7(Input$1, {
23357
+ value: renameProjectName,
23358
+ onChange: (event) => setRenameProjectName(event.target.value),
23359
+ "aria-label": "Project name",
23360
+ autoFocus: true
23361
+ }),
23362
+ /* @__PURE__ */ jsxs3(AlertDialogFooter, { children: [/* @__PURE__ */ jsx7(AlertDialogCancel, {
23363
+ onClick: onClose,
23364
+ children: "Cancel"
23365
+ }), /* @__PURE__ */ jsx7(AlertDialogAction, {
23366
+ disabled: !renameProjectName.trim() || !onRenameProject,
23367
+ onClick: () => {
23368
+ if (renameProjectName.trim()) {
23369
+ onRenameProject?.(project.projectId, renameProjectName.trim());
23370
+ onClose();
23371
+ }
23372
+ },
23373
+ children: "Rename"
23374
+ })] })
23375
+ ] })
23376
+ });
23377
+ }
23378
+ function DeleteSessionDialog({ session, onClose, onDeleteSession }) {
23379
+ return /* @__PURE__ */ jsx7(AlertDialog$1, {
23380
+ open: true,
23381
+ onOpenChange: (open2) => !open2 && onClose(),
23382
+ children: /* @__PURE__ */ jsxs3(AlertDialogContent, { children: [
23383
+ /* @__PURE__ */ jsx7(AlertDialogTitle, { children: "Delete session?" }),
23384
+ /* @__PURE__ */ jsx7(AlertDialogDescription, { children: "This removes the Fleet Prime session and its managed session artifacts. This cannot be undone." }),
23385
+ /* @__PURE__ */ jsxs3(AlertDialogFooter, { children: [/* @__PURE__ */ jsx7(AlertDialogCancel, {
23386
+ onClick: onClose,
23387
+ children: "Cancel"
23388
+ }), /* @__PURE__ */ jsx7(AlertDialogAction, {
23389
+ className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
23390
+ onClick: () => {
23391
+ onDeleteSession(session.sessionId);
23392
+ onClose();
23393
+ },
23394
+ children: "Delete"
23395
+ })] })
23396
+ ] })
23397
+ });
23398
+ }
23399
+ function UnregisterProjectDialog({ project, onClose, onUnregisterProject }) {
23400
+ return /* @__PURE__ */ jsx7(AlertDialog$1, {
23401
+ open: true,
23402
+ onOpenChange: (open2) => !open2 && onClose(),
23403
+ children: /* @__PURE__ */ jsxs3(AlertDialogContent, { children: [
23404
+ /* @__PURE__ */ jsx7(AlertDialogTitle, { children: "Unregister project?" }),
23405
+ /* @__PURE__ */ jsx7(AlertDialogDescription, { children: "The directory and its sessions remain intact. Existing sessions will move to Unassigned until the directory is registered again." }),
23406
+ /* @__PURE__ */ jsxs3(AlertDialogFooter, { children: [/* @__PURE__ */ jsx7(AlertDialogCancel, {
23407
+ onClick: onClose,
23408
+ children: "Cancel"
23409
+ }), /* @__PURE__ */ jsx7(AlertDialogAction, {
23410
+ className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
23411
+ onClick: () => {
23412
+ onUnregisterProject?.(project.projectId);
23413
+ onClose();
23414
+ },
23415
+ children: "Unregister"
23416
+ })] })
23417
+ ] })
23418
+ });
23419
+ }
23420
+ function ForkSessionDialog({ session, projects, onClose, onForkSessionIntoProject }) {
23421
+ const initialProjectId = projects.find((project) => project.projectId !== session.projectId)?.projectId;
23422
+ const [forkProjectId, setForkProjectId] = useState23(initialProjectId);
23423
+ const forkProjectOptions = useMemo22(() => projects.flatMap((project) => project.projectId === session.projectId ? [] : [{
23282
23424
  value: project.projectId,
23283
23425
  label: `${project.name} \u2014 ${project.pathLabel}`,
23284
23426
  icon: Folder
23285
- }]), [forkTarget?.projectId, projects]);
23286
- return /* @__PURE__ */ jsxs3(Fragment$1, { children: [
23287
- /* @__PURE__ */ jsx7(AlertDialog$1, {
23288
- open: renameTarget !== null,
23289
- onOpenChange: (open2) => !open2 && setRenameTarget(null),
23290
- children: /* @__PURE__ */ jsxs3(AlertDialogContent, { children: [
23291
- /* @__PURE__ */ jsx7(AlertDialogTitle, { children: "Rename session" }),
23292
- /* @__PURE__ */ jsx7(AlertDialogDescription, { children: "Choose a local display title for this Fleet Prime session." }),
23293
- /* @__PURE__ */ jsx7(Input$1, {
23294
- value: renameTitle,
23295
- onChange: (event) => setRenameTitle(event.target.value),
23296
- "aria-label": "Session title",
23297
- autoFocus: true
23298
- }),
23299
- /* @__PURE__ */ jsxs3(AlertDialogFooter, { children: [/* @__PURE__ */ jsx7(AlertDialogCancel, { children: "Cancel" }), /* @__PURE__ */ jsx7(AlertDialogAction, {
23300
- disabled: !renameTitle.trim(),
23301
- onClick: () => {
23302
- if (renameTarget && renameTitle.trim()) {
23303
- onRenameSession(renameTarget.sessionId, renameTitle.trim());
23304
- setRenameTarget(null);
23305
- }
23306
- },
23307
- children: "Rename"
23308
- })] })
23309
- ] })
23310
- }),
23311
- /* @__PURE__ */ jsx7(AlertDialog$1, {
23312
- open: renameProjectTarget !== null,
23313
- onOpenChange: (open2) => !open2 && setRenameProjectTarget(null),
23314
- children: /* @__PURE__ */ jsxs3(AlertDialogContent, { children: [
23315
- /* @__PURE__ */ jsx7(AlertDialogTitle, { children: "Rename project" }),
23316
- /* @__PURE__ */ jsx7(AlertDialogDescription, { children: "This changes the display name only. The registered directory stays the same." }),
23317
- /* @__PURE__ */ jsx7(Input$1, {
23318
- value: renameProjectName,
23319
- onChange: (event) => setRenameProjectName(event.target.value),
23320
- "aria-label": "Project name",
23321
- autoFocus: true
23427
+ }]), [session.projectId, projects]);
23428
+ return /* @__PURE__ */ jsx7(Dialog$1, {
23429
+ open: true,
23430
+ onOpenChange: (open2) => !open2 && onClose(),
23431
+ children: /* @__PURE__ */ jsxs3(DialogContent, {
23432
+ className: "sm:max-w-md",
23433
+ children: [
23434
+ /* @__PURE__ */ jsxs3(DialogHeader, { children: [/* @__PURE__ */ jsx7(DialogTitle3, { children: "Fork session into project" }), /* @__PURE__ */ jsx7(DialogDescription3, { children: "Create a new Fleet Prime session in another registered project." })] }),
23435
+ /* @__PURE__ */ jsx7("div", {
23436
+ className: "py-2",
23437
+ children: /* @__PURE__ */ jsx7(Select$1, {
23438
+ value: forkProjectId ?? null,
23439
+ onValueChange: (value) => setForkProjectId(value),
23440
+ options: forkProjectOptions,
23441
+ placeholder: "Select a project\u2026",
23442
+ "aria-label": "Target project"
23443
+ })
23322
23444
  }),
23323
- /* @__PURE__ */ jsxs3(AlertDialogFooter, { children: [/* @__PURE__ */ jsx7(AlertDialogCancel, { children: "Cancel" }), /* @__PURE__ */ jsx7(AlertDialogAction, {
23324
- disabled: !renameProjectName.trim() || !onRenameProject,
23325
- onClick: () => {
23326
- if (renameProjectTarget && renameProjectName.trim()) {
23327
- onRenameProject?.(renameProjectTarget.projectId, renameProjectName.trim());
23328
- setRenameProjectTarget(null);
23329
- }
23330
- },
23331
- children: "Rename"
23332
- })] })
23333
- ] })
23334
- }),
23335
- /* @__PURE__ */ jsx7(AlertDialog$1, {
23336
- open: deleteTarget !== null,
23337
- onOpenChange: (open2) => !open2 && setDeleteTarget(null),
23338
- children: /* @__PURE__ */ jsxs3(AlertDialogContent, { children: [
23339
- /* @__PURE__ */ jsx7(AlertDialogTitle, { children: "Delete session?" }),
23340
- /* @__PURE__ */ jsx7(AlertDialogDescription, { children: "This removes the Fleet Prime session and its managed session artifacts. This cannot be undone." }),
23341
- /* @__PURE__ */ jsxs3(AlertDialogFooter, { children: [/* @__PURE__ */ jsx7(AlertDialogCancel, { children: "Cancel" }), /* @__PURE__ */ jsx7(AlertDialogAction, {
23342
- className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
23343
- onClick: () => {
23344
- if (deleteTarget) onDeleteSession(deleteTarget.sessionId);
23345
- setDeleteTarget(null);
23346
- },
23347
- children: "Delete"
23348
- })] })
23349
- ] })
23350
- }),
23351
- /* @__PURE__ */ jsx7(AlertDialog$1, {
23352
- open: unregisterTarget !== null,
23353
- onOpenChange: (open2) => !open2 && setUnregisterTarget(null),
23354
- children: /* @__PURE__ */ jsxs3(AlertDialogContent, { children: [
23355
- /* @__PURE__ */ jsx7(AlertDialogTitle, { children: "Unregister project?" }),
23356
- /* @__PURE__ */ jsx7(AlertDialogDescription, { children: "The directory and its sessions remain intact. Existing sessions will move to Unassigned until the directory is registered again." }),
23357
- /* @__PURE__ */ jsxs3(AlertDialogFooter, { children: [/* @__PURE__ */ jsx7(AlertDialogCancel, { children: "Cancel" }), /* @__PURE__ */ jsx7(AlertDialogAction, {
23358
- className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
23445
+ /* @__PURE__ */ jsxs3(DialogFooter, { children: [/* @__PURE__ */ jsx7(Button$1, {
23446
+ type: "button",
23447
+ variant: "outline",
23448
+ onClick: onClose,
23449
+ children: "Cancel"
23450
+ }), /* @__PURE__ */ jsx7(Button$1, {
23451
+ type: "button",
23452
+ disabled: !forkProjectId || !onForkSessionIntoProject,
23359
23453
  onClick: () => {
23360
- if (unregisterTarget) onUnregisterProject?.(unregisterTarget.projectId);
23361
- setUnregisterTarget(null);
23454
+ if (!forkProjectId) return;
23455
+ onForkSessionIntoProject?.(session.sessionId, forkProjectId);
23456
+ onClose();
23362
23457
  },
23363
- children: "Unregister"
23458
+ children: "Fork session"
23364
23459
  })] })
23365
- ] })
23366
- }),
23367
- /* @__PURE__ */ jsx7(Dialog$1, {
23368
- open: forkTarget !== null,
23369
- onOpenChange: (open2) => !open2 && setForkTarget(null),
23370
- children: /* @__PURE__ */ jsxs3(DialogContent, {
23371
- className: "sm:max-w-md",
23372
- children: [
23373
- /* @__PURE__ */ jsxs3(DialogHeader, { children: [/* @__PURE__ */ jsx7(DialogTitle3, { children: "Fork session into project" }), /* @__PURE__ */ jsx7(DialogDescription3, { children: "Create a new Fleet Prime session in another registered project." })] }),
23374
- /* @__PURE__ */ jsx7("div", {
23375
- className: "py-2",
23376
- children: /* @__PURE__ */ jsx7(Select$1, {
23377
- value: forkProjectId ?? null,
23378
- onValueChange: (value) => setForkProjectId(value),
23379
- options: forkProjectOptions,
23380
- placeholder: "Select a project\u2026",
23381
- "aria-label": "Target project"
23382
- })
23383
- }),
23384
- /* @__PURE__ */ jsxs3(DialogFooter, { children: [/* @__PURE__ */ jsx7(Button$1, {
23385
- type: "button",
23386
- variant: "outline",
23387
- onClick: () => setForkTarget(null),
23388
- children: "Cancel"
23389
- }), /* @__PURE__ */ jsx7(Button$1, {
23390
- type: "button",
23391
- disabled: !forkTarget || !forkProjectId || !onForkSessionIntoProject,
23392
- onClick: () => {
23393
- if (!forkTarget || !forkProjectId) return;
23394
- onForkSessionIntoProject?.(forkTarget.sessionId, forkProjectId);
23395
- setForkTarget(null);
23396
- },
23397
- children: "Fork session"
23398
- })] })
23399
- ]
23400
- })
23460
+ ]
23401
23461
  })
23402
- ] });
23462
+ });
23463
+ }
23464
+ function SessionSidebarActionDialogs({ activeDialog, onClose, projects, onRenameSession, onDeleteSession, onRenameProject, onUnregisterProject, onForkSessionIntoProject }) {
23465
+ if (!activeDialog) return null;
23466
+ switch (activeDialog.kind) {
23467
+ case "rename-session":
23468
+ return /* @__PURE__ */ jsx7(RenameSessionDialog, {
23469
+ session: activeDialog.session,
23470
+ onClose,
23471
+ onRenameSession
23472
+ });
23473
+ case "rename-project":
23474
+ return /* @__PURE__ */ jsx7(RenameProjectDialog, {
23475
+ project: activeDialog.project,
23476
+ onClose,
23477
+ onRenameProject
23478
+ });
23479
+ case "delete-session":
23480
+ return /* @__PURE__ */ jsx7(DeleteSessionDialog, {
23481
+ session: activeDialog.session,
23482
+ onClose,
23483
+ onDeleteSession
23484
+ });
23485
+ case "unregister-project":
23486
+ return /* @__PURE__ */ jsx7(UnregisterProjectDialog, {
23487
+ project: activeDialog.project,
23488
+ onClose,
23489
+ onUnregisterProject
23490
+ });
23491
+ case "fork-session":
23492
+ return /* @__PURE__ */ jsx7(ForkSessionDialog, {
23493
+ session: activeDialog.session,
23494
+ projects,
23495
+ onClose,
23496
+ onForkSessionIntoProject
23497
+ });
23498
+ case "create-project":
23499
+ return null;
23500
+ }
23403
23501
  }
23404
23502
  var ROW_REVEAL = {
23405
23503
  duration: 0.16,
@@ -24460,7 +24558,7 @@ function sessionStatusIcon(session) {
24460
24558
  if (session?.status === "interrupted") return /* @__PURE__ */ jsx7(CircleStop, { className: "size-3.5 text-muted-foreground" });
24461
24559
  return null;
24462
24560
  }
24463
- function SessionSidebarProjectList({ projectActionsOpen, setProjectActionsOpen, expandedProjectIds, setExpandedProjectIds, setCreateOpen, projects, projectSessions, sidebarItems, activeProjectId, activeSessionId, onNewSession, onNewSessionInProject, onProjectSelect, onRenameSession, onCreateProject, resumeResource, toggleProjectResource, renderMenu }) {
24561
+ function SessionSidebarProjectList({ projectActionsOpen, setProjectActionsOpen, expandedProjectIds, setExpandedProjectIds, onOpenCreateProject, projects, projectSessions, sidebarItems, activeProjectId, activeSessionId, onNewSession, onNewSessionInProject, onProjectSelect, onRenameSession, onCreateProject, resumeResource, toggleProjectResource, renderMenu }) {
24464
24562
  return /* @__PURE__ */ jsx7(AnimatedSidebarContent, {
24465
24563
  className: "gap-0 px-2.5 pb-1 pt-2",
24466
24564
  children: /* @__PURE__ */ jsxs3(AnimatedSidebarGroup, {
@@ -24492,7 +24590,7 @@ function SessionSidebarProjectList({ projectActionsOpen, setProjectActionsOpen,
24492
24590
  type: "button",
24493
24591
  onClick: () => {
24494
24592
  setProjectActionsOpen(false);
24495
- setCreateOpen(true);
24593
+ onOpenCreateProject();
24496
24594
  },
24497
24595
  className: "flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs outline-none hover:bg-muted focus-visible:bg-muted",
24498
24596
  children: [/* @__PURE__ */ jsx7(FolderPlus, {
@@ -24515,7 +24613,7 @@ function SessionSidebarProjectList({ projectActionsOpen, setProjectActionsOpen,
24515
24613
  type: "button",
24516
24614
  "aria-label": "Add project",
24517
24615
  title: "Add project",
24518
- onClick: () => setCreateOpen(true),
24616
+ onClick: onOpenCreateProject,
24519
24617
  className: cn(HIT_AREA_EXPAND_DENSE_CLASS, "inline-flex size-8 items-center justify-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-sidebar-ring"),
24520
24618
  children: /* @__PURE__ */ jsx7(Plus, {
24521
24619
  "aria-hidden": "true",
@@ -24534,7 +24632,7 @@ function SessionSidebarProjectList({ projectActionsOpen, setProjectActionsOpen,
24534
24632
  id: "empty-project",
24535
24633
  content: /* @__PURE__ */ jsx7(FolderPlus, { className: "size-5 text-muted-foreground" })
24536
24634
  }],
24537
- onClick: () => setCreateOpen(true),
24635
+ onClick: onOpenCreateProject,
24538
24636
  ariaLabel: "Add a project",
24539
24637
  className: "w-full"
24540
24638
  })
@@ -24611,7 +24709,7 @@ function DiscordIcon({ className, ...props }) {
24611
24709
  }
24612
24710
  function fleetVersion() {
24613
24711
  try {
24614
- return "0.6.6";
24712
+ return "0.7.1";
24615
24713
  } catch {
24616
24714
  return "dev";
24617
24715
  }
@@ -24767,7 +24865,7 @@ function KbdHint({ children }) {
24767
24865
  children
24768
24866
  });
24769
24867
  }
24770
- function SessionSidebarNavigation({ brandMenuOpen, setBrandMenuOpen, searchOpen, setSearchOpen, query, setQuery, projectActionsOpen, setProjectActionsOpen, expandedProjectIds, setExpandedProjectIds, setCreateOpen, projects, projectSessions, sidebarItems, sortedProjects, projectById, activeProjectId, activeSessionId, onNewSession, onNewSessionInProject, onProjectSelect, onRenameSession, onCreateProject, onOpenSettings, accountMenu, resumeResource, toggleProjectResource, selectSearchResult, renderMenu }) {
24868
+ function SessionSidebarNavigation({ brandMenuOpen, setBrandMenuOpen, searchOpen, setSearchOpen, query, setQuery, projectActionsOpen, setProjectActionsOpen, expandedProjectIds, setExpandedProjectIds, onOpenCreateProject, projects, projectSessions, sidebarItems, sortedProjects, projectById, activeProjectId, activeSessionId, onNewSession, onNewSessionInProject, onProjectSelect, onRenameSession, onCreateProject, onOpenSettings, accountMenu, resumeResource, toggleProjectResource, selectSearchResult, renderMenu }) {
24771
24869
  const searchThreads = useMemo22(() => sortSessions(projectSessions).map((session) => ({
24772
24870
  id: session.sessionId,
24773
24871
  title: sessionLabel(session, projectSessions),
@@ -24812,7 +24910,7 @@ function SessionSidebarNavigation({ brandMenuOpen, setBrandMenuOpen, searchOpen,
24812
24910
  label: "Add project",
24813
24911
  onClick: () => {
24814
24912
  setBrandMenuOpen(false);
24815
- setCreateOpen(true);
24913
+ onOpenCreateProject();
24816
24914
  }
24817
24915
  }) : null,
24818
24916
  /* @__PURE__ */ jsx7(SidebarMenuItem, {
@@ -24926,7 +25024,7 @@ function SessionSidebarNavigation({ brandMenuOpen, setBrandMenuOpen, searchOpen,
24926
25024
  setProjectActionsOpen,
24927
25025
  expandedProjectIds,
24928
25026
  setExpandedProjectIds,
24929
- setCreateOpen,
25027
+ onOpenCreateProject,
24930
25028
  projects,
24931
25029
  projectSessions,
24932
25030
  sidebarItems,
@@ -25002,23 +25100,7 @@ function useSessionSidebarState(activeProjectId) {
25002
25100
  query: "",
25003
25101
  expandedProjectIds: readExpandedProjects(initialActiveProjectId),
25004
25102
  revealedProjectIds: /* @__PURE__ */ new Set(),
25005
- renameTarget: null,
25006
- renameTitle: "",
25007
- renameProjectTarget: null,
25008
- renameProjectName: "",
25009
- deleteTarget: null,
25010
- unregisterTarget: null,
25011
- createOpen: false,
25012
- createPath: "",
25013
- createName: "",
25014
- directoryToken: void 0,
25015
- directoryBrowser: null,
25016
- directoryBrowseLoading: false,
25017
- directoryBrowseError: null,
25018
- createSubmitting: false,
25019
- createSubmitError: null,
25020
- forkTarget: null,
25021
- forkProjectId: void 0
25103
+ activeDialog: null
25022
25104
  }));
25023
25105
  const setField = useCallback12(function setSidebarField(key, value) {
25024
25106
  dispatch({
@@ -25044,23 +25126,8 @@ function useSessionSidebarState(activeProjectId) {
25044
25126
  const setQuery = useCallback12((value) => setField("query", value), [setField]);
25045
25127
  const setExpandedProjectIds = useCallback12((value) => typeof value === "function" ? updateField("expandedProjectIds", value) : setField("expandedProjectIds", value), [setField, updateField]);
25046
25128
  const setRevealedProjectIds = useCallback12((value) => typeof value === "function" ? updateField("revealedProjectIds", value) : setField("revealedProjectIds", value), [setField, updateField]);
25047
- const setRenameTarget = useCallback12((value) => setField("renameTarget", value), [setField]);
25048
- const setRenameTitle = useCallback12((value) => setField("renameTitle", value), [setField]);
25049
- const setRenameProjectTarget = useCallback12((value) => setField("renameProjectTarget", value), [setField]);
25050
- const setRenameProjectName = useCallback12((value) => setField("renameProjectName", value), [setField]);
25051
- const setDeleteTarget = useCallback12((value) => setField("deleteTarget", value), [setField]);
25052
- const setUnregisterTarget = useCallback12((value) => setField("unregisterTarget", value), [setField]);
25053
- const setCreateOpen = useCallback12((value) => setField("createOpen", value), [setField]);
25054
- const setCreatePath = useCallback12((value) => setField("createPath", value), [setField]);
25055
- const setCreateName = useCallback12((value) => setField("createName", value), [setField]);
25056
- const setDirectoryToken = useCallback12((value) => setField("directoryToken", value), [setField]);
25057
- const setDirectoryBrowser = useCallback12((value) => setField("directoryBrowser", value), [setField]);
25058
- const setDirectoryBrowseLoading = useCallback12((value) => setField("directoryBrowseLoading", value), [setField]);
25059
- const setDirectoryBrowseError = useCallback12((value) => setField("directoryBrowseError", value), [setField]);
25060
- const setCreateSubmitting = useCallback12((value) => setField("createSubmitting", value), [setField]);
25061
- const setCreateSubmitError = useCallback12((value) => setField("createSubmitError", value), [setField]);
25062
- const setForkTarget = useCallback12((value) => setField("forkTarget", value), [setField]);
25063
- const setForkProjectId = useCallback12((value) => setField("forkProjectId", value), [setField]);
25129
+ const setActiveDialog = useCallback12((value) => setField("activeDialog", value), [setField]);
25130
+ const closeDialog = useCallback12(() => setField("activeDialog", null), [setField]);
25064
25131
  return {
25065
25132
  ...state,
25066
25133
  setBrandMenuOpen,
@@ -25069,23 +25136,8 @@ function useSessionSidebarState(activeProjectId) {
25069
25136
  setQuery,
25070
25137
  setExpandedProjectIds,
25071
25138
  setRevealedProjectIds,
25072
- setRenameTarget,
25073
- setRenameTitle,
25074
- setRenameProjectTarget,
25075
- setRenameProjectName,
25076
- setDeleteTarget,
25077
- setUnregisterTarget,
25078
- setCreateOpen,
25079
- setCreatePath,
25080
- setCreateName,
25081
- setDirectoryToken,
25082
- setDirectoryBrowser,
25083
- setDirectoryBrowseLoading,
25084
- setDirectoryBrowseError,
25085
- setCreateSubmitting,
25086
- setCreateSubmitError,
25087
- setForkTarget,
25088
- setForkProjectId
25139
+ setActiveDialog,
25140
+ closeDialog
25089
25141
  };
25090
25142
  }
25091
25143
  var PANEL_ACTIONS = [
@@ -25113,42 +25165,7 @@ function MenuItem({ icon: Icon, label, destructive = false, onClick }) {
25113
25165
  children: [/* @__PURE__ */ jsx7(Icon, { className: "size-3.5" }), label]
25114
25166
  });
25115
25167
  }
25116
- function useSessionSidebarViewModel({ sessions, projects = EMPTY_PROJECTS, projectSessions = sessions, activeProjectId, activeSessionId, onNewSession, onNewSessionInProject, onProjectSelect, onResumeSession, onCreateProject, onForkSessionIntoProject, onOpenPanelAction, onBrowseDirectories, createOpen, expandedProjectIds, revealedProjectIds, setExpandedProjectIds, setRevealedProjectIds, setSearchOpen, setDirectoryBrowser, setDirectoryBrowseLoading, setDirectoryBrowseError, setDirectoryToken, setCreatePath, setRenameTarget, setRenameTitle, setForkTarget, setForkProjectId, setDeleteTarget, setRenameProjectTarget, setRenameProjectName, setUnregisterTarget, createPath, directoryToken, createName, setCreateName, setCreateOpen, setCreateSubmitError, setCreateSubmitting }) {
25117
- const createOpenRef = useRef39(false);
25118
- const loadDirectories = useCallback12(async (input) => {
25119
- if (!onBrowseDirectories) return false;
25120
- setDirectoryBrowseLoading(true);
25121
- setDirectoryBrowseError(null);
25122
- try {
25123
- const response = await onBrowseDirectories(input);
25124
- setDirectoryBrowser(response);
25125
- setDirectoryToken(response.directoryToken);
25126
- setCreatePath(response.pathLabel);
25127
- return true;
25128
- } catch (error2) {
25129
- setDirectoryBrowseError(directoryErrorMessage(error2, "Could not browse this directory."));
25130
- return false;
25131
- } finally {
25132
- setDirectoryBrowseLoading(false);
25133
- }
25134
- }, [
25135
- onBrowseDirectories,
25136
- setCreatePath,
25137
- setDirectoryBrowseError,
25138
- setDirectoryBrowseLoading,
25139
- setDirectoryBrowser,
25140
- setDirectoryToken
25141
- ]);
25142
- useEffect8(() => {
25143
- const opened = createOpen && !createOpenRef.current;
25144
- createOpenRef.current = createOpen;
25145
- if (!opened || !onBrowseDirectories) return;
25146
- loadDirectories({});
25147
- }, [
25148
- createOpen,
25149
- loadDirectories,
25150
- onBrowseDirectories
25151
- ]);
25168
+ function useSessionSidebarViewModel({ sessions, projects = EMPTY_PROJECTS, projectSessions = sessions, activeProjectId, activeSessionId, onNewSession, onNewSessionInProject, onProjectSelect, onResumeSession, onForkSessionIntoProject, onOpenPanelAction, expandedProjectIds, revealedProjectIds, setExpandedProjectIds, setRevealedProjectIds, setSearchOpen, setActiveDialog }) {
25152
25169
  const projectById = useMemo22(() => new Map(projects.map((project) => [project.projectId, project])), [projects]);
25153
25170
  const sortedProjects = useMemo22(() => sortProjectsByActivity(projects, projectSessions), [projectSessions, projects]);
25154
25171
  useEffect8(() => {
@@ -25233,203 +25250,173 @@ function useSessionSidebarViewModel({ sessions, projects = EMPTY_PROJECTS, proje
25233
25250
  onNewSessionInProject,
25234
25251
  onProjectSelect
25235
25252
  ]);
25236
- const resumeResource = useCallback12((id) => {
25237
- const toggleProjectId = idValue(id, "toggle:");
25238
- if (toggleProjectId) {
25239
- setRevealedProjectIds((current) => {
25240
- const next = new Set(current);
25241
- if (next.has(toggleProjectId)) next.delete(toggleProjectId);
25242
- else next.add(toggleProjectId);
25243
- return next;
25244
- });
25245
- return;
25246
- }
25247
- const newSessionProjectId = idValue(id, NEW_SESSION_PREFIX);
25248
- if (newSessionProjectId) {
25249
- openSessionInProject(newSessionProjectId);
25250
- return;
25251
- }
25252
- const sessionId = idValue(id, SESSION_PREFIX);
25253
- if (!sessionId) return;
25254
- const session = projectSessions.find((entry) => entry.sessionId === sessionId);
25255
- if (session) onResumeSession(session);
25256
- }, [
25257
- openSessionInProject,
25258
- onResumeSession,
25259
- projectSessions,
25260
- setRevealedProjectIds
25261
- ]);
25262
- const toggleProjectResource = useCallback12((id) => {
25263
- setExpandedProjectIds((current) => current.includes(id) ? current.filter((entry) => entry !== id) : [...current, id]);
25264
- }, [setExpandedProjectIds]);
25265
- const selectSearchResult = useCallback12((value) => {
25266
- const projectId = idValue(value, "search-project:");
25267
- if (projectId) {
25268
- const resourceId = projectResourceId(projectId);
25269
- setExpandedProjectIds((current) => current.includes(resourceId) ? current : [...current, resourceId]);
25270
- onProjectSelect?.(projectId);
25271
- setSearchOpen(false);
25272
- return;
25273
- }
25274
- const sessionId = idValue(value, "search-session:");
25275
- const session = sessionId ? projectSessions.find((entry) => entry.sessionId === sessionId) : void 0;
25276
- if (!session) return;
25277
- if (session.projectId) {
25278
- const resourceId = projectResourceId(session.projectId);
25279
- setExpandedProjectIds((current) => current.includes(resourceId) ? current : [...current, resourceId]);
25280
- }
25281
- onResumeSession(session);
25282
- setSearchOpen(false);
25283
- }, [
25284
- onProjectSelect,
25285
- onResumeSession,
25286
- projectSessions,
25287
- setExpandedProjectIds,
25288
- setSearchOpen
25289
- ]);
25290
- const renderMenu = useCallback12((item, controls) => {
25291
- const sessionId = idValue(item.id, SESSION_PREFIX);
25292
- const projectId = idValue(item.id, "project:");
25293
- if (sessionId) {
25294
- const session = projectSessions.find((entry) => entry.sessionId === sessionId);
25295
- if (!session) return null;
25296
- const sessionProjectId = session.projectId ?? void 0;
25297
- return /* @__PURE__ */ jsxs3(Fragment$1, { children: [
25298
- /* @__PURE__ */ jsx7(MenuItem, {
25299
- icon: Pencil,
25300
- label: "Rename",
25301
- onClick: () => {
25302
- controls.close();
25303
- setRenameTarget(session);
25304
- setRenameTitle(sessionLabel(session));
25305
- }
25306
- }),
25307
- onForkSessionIntoProject && projects.length > 1 ? /* @__PURE__ */ jsx7(MenuItem, {
25308
- icon: FolderTree,
25309
- label: "Fork into project",
25310
- onClick: () => {
25311
- controls.close();
25312
- setForkTarget(session);
25313
- setForkProjectId(projects.find((project) => project.projectId !== session.projectId)?.projectId);
25314
- }
25315
- }) : null,
25316
- onOpenPanelAction && sessionProjectId ? /* @__PURE__ */ jsxs3(Fragment$1, { children: [/* @__PURE__ */ jsx7("div", { className: "my-1 border-t" }), PANEL_ACTIONS.map(([panel, label, Icon]) => /* @__PURE__ */ jsx7(MenuItem, {
25317
- icon: Icon,
25318
- label,
25319
- onClick: () => {
25320
- controls.close();
25321
- onOpenPanelAction({
25322
- panel,
25323
- projectId: sessionProjectId,
25324
- focus: true
25325
- });
25326
- }
25327
- }, panel))] }) : null,
25328
- /* @__PURE__ */ jsx7(MenuItem, {
25329
- icon: Trash,
25330
- label: "Delete",
25331
- destructive: true,
25332
- onClick: () => {
25333
- controls.close();
25334
- setDeleteTarget(session);
25335
- }
25336
- })
25337
- ] });
25338
- }
25339
- if (projectId && projectId !== "unassigned") {
25340
- const project = projectById.get(projectId);
25341
- if (!project) return null;
25342
- return /* @__PURE__ */ jsxs3(Fragment$1, { children: [
25343
- /* @__PURE__ */ jsx7(MenuItem, {
25344
- icon: Pencil,
25345
- label: "Rename project",
25346
- onClick: () => {
25347
- controls.close();
25348
- setRenameProjectTarget(project);
25349
- setRenameProjectName(project.name);
25350
- }
25351
- }),
25352
- /* @__PURE__ */ jsx7(MenuItem, {
25353
- icon: Unplug,
25354
- label: "Unregister project",
25355
- destructive: true,
25356
- onClick: () => {
25357
- controls.close();
25358
- setUnregisterTarget(project);
25359
- }
25360
- }),
25361
- onOpenPanelAction ? /* @__PURE__ */ jsxs3(Fragment$1, { children: [/* @__PURE__ */ jsx7("div", { className: "my-1 border-t" }), PANEL_ACTIONS.map(([panel, label, Icon]) => /* @__PURE__ */ jsx7(MenuItem, {
25362
- icon: Icon,
25363
- label,
25364
- onClick: () => {
25365
- controls.close();
25366
- onOpenPanelAction({
25367
- panel,
25368
- projectId,
25369
- focus: true
25370
- });
25371
- }
25372
- }, panel))] }) : null
25373
- ] });
25374
- }
25375
- return null;
25376
- }, [
25377
- onForkSessionIntoProject,
25378
- onOpenPanelAction,
25379
- projectById,
25380
- projectSessions,
25381
- projects,
25382
- setDeleteTarget,
25383
- setForkProjectId,
25384
- setForkTarget,
25385
- setRenameProjectName,
25386
- setRenameProjectTarget,
25387
- setRenameTarget,
25388
- setRenameTitle,
25389
- setUnregisterTarget
25390
- ]);
25391
- const submitCreate = async () => {
25392
- const path = createPath.trim();
25393
- if (!onCreateProject || !path && !directoryToken) return;
25394
- setCreateSubmitting(true);
25395
- setCreateSubmitError(null);
25396
- try {
25397
- await onCreateProject({
25398
- path: directoryToken ? void 0 : path,
25399
- directoryToken,
25400
- name: createName.trim() || void 0
25401
- });
25402
- setCreateOpen(false);
25403
- setCreatePath("");
25404
- setCreateName("");
25405
- setDirectoryToken(void 0);
25406
- setDirectoryBrowser(null);
25407
- setDirectoryBrowseError(null);
25408
- } catch (error2) {
25409
- setCreateSubmitError(directoryErrorMessage(error2, "Could not add this project."));
25410
- } finally {
25411
- setCreateSubmitting(false);
25412
- }
25413
- };
25414
25253
  return {
25415
- loadDirectories,
25416
25254
  projectById,
25417
25255
  sortedProjects,
25418
25256
  sidebarItems,
25419
- resumeResource,
25420
- toggleProjectResource,
25421
- selectSearchResult,
25422
- renderMenu,
25423
- submitCreate
25257
+ resumeResource: useCallback12((id) => {
25258
+ const toggleProjectId = idValue(id, "toggle:");
25259
+ if (toggleProjectId) {
25260
+ setRevealedProjectIds((current) => {
25261
+ const next = new Set(current);
25262
+ if (next.has(toggleProjectId)) next.delete(toggleProjectId);
25263
+ else next.add(toggleProjectId);
25264
+ return next;
25265
+ });
25266
+ return;
25267
+ }
25268
+ const newSessionProjectId = idValue(id, NEW_SESSION_PREFIX);
25269
+ if (newSessionProjectId) {
25270
+ openSessionInProject(newSessionProjectId);
25271
+ return;
25272
+ }
25273
+ const sessionId = idValue(id, SESSION_PREFIX);
25274
+ if (!sessionId) return;
25275
+ const session = projectSessions.find((entry) => entry.sessionId === sessionId);
25276
+ if (session) onResumeSession(session);
25277
+ }, [
25278
+ openSessionInProject,
25279
+ onResumeSession,
25280
+ projectSessions,
25281
+ setRevealedProjectIds
25282
+ ]),
25283
+ toggleProjectResource: useCallback12((id) => {
25284
+ setExpandedProjectIds((current) => current.includes(id) ? current.filter((entry) => entry !== id) : [...current, id]);
25285
+ }, [setExpandedProjectIds]),
25286
+ selectSearchResult: useCallback12((value) => {
25287
+ const projectId = idValue(value, "search-project:");
25288
+ if (projectId) {
25289
+ const resourceId = projectResourceId(projectId);
25290
+ setExpandedProjectIds((current) => current.includes(resourceId) ? current : [...current, resourceId]);
25291
+ onProjectSelect?.(projectId);
25292
+ setSearchOpen(false);
25293
+ return;
25294
+ }
25295
+ const sessionId = idValue(value, "search-session:");
25296
+ const session = sessionId ? projectSessions.find((entry) => entry.sessionId === sessionId) : void 0;
25297
+ if (!session) return;
25298
+ if (session.projectId) {
25299
+ const resourceId = projectResourceId(session.projectId);
25300
+ setExpandedProjectIds((current) => current.includes(resourceId) ? current : [...current, resourceId]);
25301
+ }
25302
+ onResumeSession(session);
25303
+ setSearchOpen(false);
25304
+ }, [
25305
+ onProjectSelect,
25306
+ onResumeSession,
25307
+ projectSessions,
25308
+ setExpandedProjectIds,
25309
+ setSearchOpen
25310
+ ]),
25311
+ renderMenu: useCallback12((item, controls) => {
25312
+ const sessionId = idValue(item.id, SESSION_PREFIX);
25313
+ const projectId = idValue(item.id, "project:");
25314
+ if (sessionId) {
25315
+ const session = projectSessions.find((entry) => entry.sessionId === sessionId);
25316
+ if (!session) return null;
25317
+ const sessionProjectId = session.projectId ?? void 0;
25318
+ return /* @__PURE__ */ jsxs3(Fragment$1, { children: [
25319
+ /* @__PURE__ */ jsx7(MenuItem, {
25320
+ icon: Pencil,
25321
+ label: "Rename",
25322
+ onClick: () => {
25323
+ controls.close();
25324
+ setActiveDialog({
25325
+ kind: "rename-session",
25326
+ session
25327
+ });
25328
+ }
25329
+ }),
25330
+ onForkSessionIntoProject && projects.length > 1 ? /* @__PURE__ */ jsx7(MenuItem, {
25331
+ icon: FolderTree,
25332
+ label: "Fork into project",
25333
+ onClick: () => {
25334
+ controls.close();
25335
+ setActiveDialog({
25336
+ kind: "fork-session",
25337
+ session
25338
+ });
25339
+ }
25340
+ }) : null,
25341
+ onOpenPanelAction && sessionProjectId ? /* @__PURE__ */ jsxs3(Fragment$1, { children: [/* @__PURE__ */ jsx7("div", { className: "my-1 border-t" }), PANEL_ACTIONS.map(([panel, label, Icon]) => /* @__PURE__ */ jsx7(MenuItem, {
25342
+ icon: Icon,
25343
+ label,
25344
+ onClick: () => {
25345
+ controls.close();
25346
+ onOpenPanelAction({
25347
+ panel,
25348
+ projectId: sessionProjectId,
25349
+ focus: true
25350
+ });
25351
+ }
25352
+ }, panel))] }) : null,
25353
+ /* @__PURE__ */ jsx7(MenuItem, {
25354
+ icon: Trash,
25355
+ label: "Delete",
25356
+ destructive: true,
25357
+ onClick: () => {
25358
+ controls.close();
25359
+ setActiveDialog({
25360
+ kind: "delete-session",
25361
+ session
25362
+ });
25363
+ }
25364
+ })
25365
+ ] });
25366
+ }
25367
+ if (projectId && projectId !== "unassigned") {
25368
+ const project = projectById.get(projectId);
25369
+ if (!project) return null;
25370
+ return /* @__PURE__ */ jsxs3(Fragment$1, { children: [
25371
+ /* @__PURE__ */ jsx7(MenuItem, {
25372
+ icon: Pencil,
25373
+ label: "Rename project",
25374
+ onClick: () => {
25375
+ controls.close();
25376
+ setActiveDialog({
25377
+ kind: "rename-project",
25378
+ project
25379
+ });
25380
+ }
25381
+ }),
25382
+ /* @__PURE__ */ jsx7(MenuItem, {
25383
+ icon: Unplug,
25384
+ label: "Unregister project",
25385
+ destructive: true,
25386
+ onClick: () => {
25387
+ controls.close();
25388
+ setActiveDialog({
25389
+ kind: "unregister-project",
25390
+ project
25391
+ });
25392
+ }
25393
+ }),
25394
+ onOpenPanelAction ? /* @__PURE__ */ jsxs3(Fragment$1, { children: [/* @__PURE__ */ jsx7("div", { className: "my-1 border-t" }), PANEL_ACTIONS.map(([panel, label, Icon]) => /* @__PURE__ */ jsx7(MenuItem, {
25395
+ icon: Icon,
25396
+ label,
25397
+ onClick: () => {
25398
+ controls.close();
25399
+ onOpenPanelAction({
25400
+ panel,
25401
+ projectId,
25402
+ focus: true
25403
+ });
25404
+ }
25405
+ }, panel))] }) : null
25406
+ ] });
25407
+ }
25408
+ return null;
25409
+ }, [
25410
+ onForkSessionIntoProject,
25411
+ onOpenPanelAction,
25412
+ projectById,
25413
+ projectSessions,
25414
+ projects.length,
25415
+ setActiveDialog
25416
+ ])
25424
25417
  };
25425
25418
  }
25426
- var LazySessionSidebarCreateDialog = lazy2(() => import("./create-project-dialog-UPz5_Ysf-FS6BL74M.js").then(({ SessionSidebarCreateDialog }) => ({ default: SessionSidebarCreateDialog })));
25427
- function SessionSidebarDialogs(props) {
25428
- return /* @__PURE__ */ jsxs3(Fragment$1, { children: [props.createOpen ? /* @__PURE__ */ jsx7(Suspense2, {
25429
- fallback: null,
25430
- children: /* @__PURE__ */ jsx7(LazySessionSidebarCreateDialog, { ...props })
25431
- }) : null, /* @__PURE__ */ jsx7(SessionSidebarActionDialogs, { ...props })] });
25432
- }
25419
+ var LazySessionSidebarCreateDialog = lazy2(() => import("./create-project-dialog-DCvdysey-IZUGGDAN.js").then(({ SessionSidebarCreateDialog }) => ({ default: SessionSidebarCreateDialog })));
25433
25420
  function SessionSidebar({ data, sessionActions, projectActions = {}, navigationActions = {}, slots = {} }) {
25434
25421
  const { sessions, projects = EMPTY_PROJECTS, projectSessions = sessions, activeProjectId, activeSessionId } = data;
25435
25422
  const { onNewSession, onNewSessionInProject, onResumeSession, onRenameSession, onDeleteSession } = sessionActions;
@@ -25437,7 +25424,7 @@ function SessionSidebar({ data, sessionActions, projectActions = {}, navigationA
25437
25424
  const { onOpenPanelAction, onBrowseDirectories, onOpenSettings } = navigationActions;
25438
25425
  const { accountMenu } = slots;
25439
25426
  const state = useSessionSidebarState(activeProjectId);
25440
- const { loadDirectories, projectById, sortedProjects, sidebarItems, resumeResource, toggleProjectResource, selectSearchResult, renderMenu, submitCreate } = useSessionSidebarViewModel({
25427
+ const { projectById, sortedProjects, sidebarItems, resumeResource, toggleProjectResource, selectSearchResult, renderMenu } = useSessionSidebarViewModel({
25441
25428
  sessions,
25442
25429
  projects,
25443
25430
  projectSessions,
@@ -25447,112 +25434,74 @@ function SessionSidebar({ data, sessionActions, projectActions = {}, navigationA
25447
25434
  onNewSessionInProject,
25448
25435
  onProjectSelect,
25449
25436
  onResumeSession,
25450
- onCreateProject,
25451
25437
  onForkSessionIntoProject,
25452
25438
  onOpenPanelAction,
25453
- onBrowseDirectories,
25454
- createOpen: state.createOpen,
25455
25439
  expandedProjectIds: state.expandedProjectIds,
25456
25440
  revealedProjectIds: state.revealedProjectIds,
25457
25441
  setExpandedProjectIds: state.setExpandedProjectIds,
25458
25442
  setRevealedProjectIds: state.setRevealedProjectIds,
25459
25443
  setSearchOpen: state.setSearchOpen,
25460
- setDirectoryBrowser: state.setDirectoryBrowser,
25461
- setDirectoryBrowseLoading: state.setDirectoryBrowseLoading,
25462
- setDirectoryBrowseError: state.setDirectoryBrowseError,
25463
- setDirectoryToken: state.setDirectoryToken,
25464
- setCreatePath: state.setCreatePath,
25465
- setRenameTarget: state.setRenameTarget,
25466
- setRenameTitle: state.setRenameTitle,
25467
- setForkTarget: state.setForkTarget,
25468
- setForkProjectId: state.setForkProjectId,
25469
- setDeleteTarget: state.setDeleteTarget,
25470
- setRenameProjectTarget: state.setRenameProjectTarget,
25471
- setRenameProjectName: state.setRenameProjectName,
25472
- setUnregisterTarget: state.setUnregisterTarget,
25473
- createPath: state.createPath,
25474
- directoryToken: state.directoryToken,
25475
- createName: state.createName,
25476
- setCreateName: state.setCreateName,
25477
- setCreateOpen: state.setCreateOpen,
25478
- setCreateSubmitError: state.setCreateSubmitError,
25479
- setCreateSubmitting: state.setCreateSubmitting
25480
- });
25481
- return /* @__PURE__ */ jsxs3(Fragment$1, { children: [/* @__PURE__ */ jsx7(SessionSidebarNavigation, {
25482
- brandMenuOpen: state.brandMenuOpen,
25483
- setBrandMenuOpen: state.setBrandMenuOpen,
25484
- searchOpen: state.searchOpen,
25485
- setSearchOpen: state.setSearchOpen,
25486
- query: state.query,
25487
- setQuery: state.setQuery,
25488
- projectActionsOpen: state.projectActionsOpen,
25489
- setProjectActionsOpen: state.setProjectActionsOpen,
25490
- expandedProjectIds: state.expandedProjectIds,
25491
- setExpandedProjectIds: state.setExpandedProjectIds,
25492
- setCreateOpen: state.setCreateOpen,
25493
- projects,
25494
- projectSessions,
25495
- sidebarItems,
25496
- sortedProjects,
25497
- projectById,
25498
- activeProjectId,
25499
- activeSessionId,
25500
- onNewSession,
25501
- onNewSessionInProject,
25502
- onProjectSelect,
25503
- onRenameSession,
25504
- onCreateProject,
25505
- onOpenSettings,
25506
- accountMenu,
25507
- resumeResource,
25508
- toggleProjectResource,
25509
- selectSearchResult,
25510
- renderMenu
25511
- }), /* @__PURE__ */ jsx7(SessionSidebarDialogs, {
25512
- projects,
25513
- onRenameSession,
25514
- onDeleteSession,
25515
- onRenameProject,
25516
- onUnregisterProject,
25517
- onForkSessionIntoProject,
25518
- onBrowseDirectories,
25519
- createOpen: state.createOpen,
25520
- setCreateOpen: state.setCreateOpen,
25521
- directoryBrowser: state.directoryBrowser,
25522
- setDirectoryBrowser: state.setDirectoryBrowser,
25523
- directoryBrowseLoading: state.directoryBrowseLoading,
25524
- directoryBrowseError: state.directoryBrowseError,
25525
- setDirectoryBrowseError: state.setDirectoryBrowseError,
25526
- directoryToken: state.directoryToken,
25527
- setDirectoryToken: state.setDirectoryToken,
25528
- createName: state.createName,
25529
- setCreateName: state.setCreateName,
25530
- createPath: state.createPath,
25531
- setCreatePath: state.setCreatePath,
25532
- renameTarget: state.renameTarget,
25533
- setRenameTarget: state.setRenameTarget,
25534
- renameTitle: state.renameTitle,
25535
- setRenameTitle: state.setRenameTitle,
25536
- renameProjectTarget: state.renameProjectTarget,
25537
- setRenameProjectTarget: state.setRenameProjectTarget,
25538
- renameProjectName: state.renameProjectName,
25539
- setRenameProjectName: state.setRenameProjectName,
25540
- deleteTarget: state.deleteTarget,
25541
- setDeleteTarget: state.setDeleteTarget,
25542
- unregisterTarget: state.unregisterTarget,
25543
- setUnregisterTarget: state.setUnregisterTarget,
25544
- forkTarget: state.forkTarget,
25545
- setForkTarget: state.setForkTarget,
25546
- forkProjectId: state.forkProjectId,
25547
- setForkProjectId: state.setForkProjectId,
25548
- createSubmitting: state.createSubmitting,
25549
- createSubmitError: state.createSubmitError,
25550
- setCreateSubmitError: state.setCreateSubmitError,
25551
- loadDirectories,
25552
- submitCreate
25553
- })] });
25444
+ setActiveDialog: state.setActiveDialog
25445
+ });
25446
+ const setActiveDialog = state.setActiveDialog;
25447
+ const handleOpenCreateProject = useCallback12(() => {
25448
+ setActiveDialog({ kind: "create-project" });
25449
+ }, [setActiveDialog]);
25450
+ const isCreateOpen = state.activeDialog?.kind === "create-project";
25451
+ return /* @__PURE__ */ jsxs3(Fragment$1, { children: [
25452
+ /* @__PURE__ */ jsx7(SessionSidebarNavigation, {
25453
+ brandMenuOpen: state.brandMenuOpen,
25454
+ setBrandMenuOpen: state.setBrandMenuOpen,
25455
+ searchOpen: state.searchOpen,
25456
+ setSearchOpen: state.setSearchOpen,
25457
+ query: state.query,
25458
+ setQuery: state.setQuery,
25459
+ projectActionsOpen: state.projectActionsOpen,
25460
+ setProjectActionsOpen: state.setProjectActionsOpen,
25461
+ expandedProjectIds: state.expandedProjectIds,
25462
+ setExpandedProjectIds: state.setExpandedProjectIds,
25463
+ onOpenCreateProject: handleOpenCreateProject,
25464
+ projects,
25465
+ projectSessions,
25466
+ sidebarItems,
25467
+ sortedProjects,
25468
+ projectById,
25469
+ activeProjectId,
25470
+ activeSessionId,
25471
+ onNewSession,
25472
+ onNewSessionInProject,
25473
+ onProjectSelect,
25474
+ onRenameSession,
25475
+ onCreateProject,
25476
+ onOpenSettings,
25477
+ accountMenu,
25478
+ resumeResource,
25479
+ toggleProjectResource,
25480
+ selectSearchResult,
25481
+ renderMenu
25482
+ }),
25483
+ isCreateOpen ? /* @__PURE__ */ jsx7(Suspense2, {
25484
+ fallback: null,
25485
+ children: /* @__PURE__ */ jsx7(LazySessionSidebarCreateDialog, {
25486
+ open: isCreateOpen,
25487
+ onClose: state.closeDialog,
25488
+ onBrowseDirectories,
25489
+ onCreateProject
25490
+ })
25491
+ }) : null,
25492
+ /* @__PURE__ */ jsx7(SessionSidebarActionDialogs, {
25493
+ activeDialog: state.activeDialog,
25494
+ onClose: state.closeDialog,
25495
+ projects,
25496
+ onRenameSession,
25497
+ onDeleteSession,
25498
+ onRenameProject,
25499
+ onUnregisterProject,
25500
+ onForkSessionIntoProject
25501
+ })
25502
+ ] });
25554
25503
  }
25555
- var LazySubagentChatPanel = lazy2(() => import("./subagent-chat-panel-B9CtFTP5-6QDZ4RQY.js").then(({ SubagentChatPanel }) => ({ default: SubagentChatPanel })));
25504
+ var LazySubagentChatPanel = lazy2(() => import("./subagent-chat-panel-Cg2CxshI-WWGFHTIF.js").then(({ SubagentChatPanel }) => ({ default: SubagentChatPanel })));
25556
25505
  function ChatWorkspaceShell() {
25557
25506
  const { session, conversation, composer, panels, dialogs, chrome, agentTabs } = useChatWorkspaceData();
25558
25507
  const toggleCommandPalette = useCallback12(() => {
@@ -25746,6 +25695,7 @@ function ChatWorkspaceShell() {
25746
25695
  panel: /* @__PURE__ */ jsx7(UiErrorBoundary, { children: /* @__PURE__ */ jsx7(RightPanelShell, {
25747
25696
  handleResourceCanvasResizeStart: panels.handleResourceCanvasResizeStart,
25748
25697
  onClose: closeRightPanel,
25698
+ onResourceCanvasWidthChange: panels.handleResourceCanvasWidthChange,
25749
25699
  resourceCanvasWidth: panels.resourceCanvasWidth
25750
25700
  }) }),
25751
25701
  children: /* @__PURE__ */ jsx7("div", {
@@ -25834,6 +25784,7 @@ export {
25834
25784
  rlmStatusIcon,
25835
25785
  RIGHT_PANEL_LAUNCHER_DEFINITIONS,
25836
25786
  pathEntryLabel,
25787
+ directoryErrorMessage,
25837
25788
  AlertDialog$1,
25838
25789
  AlertDialogContent,
25839
25790
  AlertDialogTitle,