@qredence/fleet 0.9.0 → 0.10.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 (50) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/bin/prime-runtime.d.mts +19 -0
  3. package/bin/prime-runtime.mjs +42 -5
  4. package/dist/web/client/assets/{agents-CGjUBYX7.js → agents-BMQXA18L.js} +2 -2
  5. package/dist/web/client/assets/{agents-page-CTuFJL9H.js → agents-page-D2soW46O.js} +1 -1
  6. package/dist/web/client/assets/{chat-queries-CfZiupub.js → chat-queries-ty76G6rK.js} +1 -1
  7. package/dist/web/client/assets/{connectors-CFxLqG2x.js → connectors-E4KW6hBL.js} +2 -2
  8. package/dist/web/client/assets/{connectors-page-DQJdoAnl.js → connectors-page-CDzzjCIJ.js} +1 -1
  9. package/dist/web/client/assets/globals-DDDleTbS.css +2 -0
  10. package/dist/web/client/assets/{index-C9FHZDGw.js → index-CEZTSuLf.js} +2 -2
  11. package/dist/web/client/assets/{mcp-connections-section-DEo6Kemv.js → mcp-connections-section-BsNhp1b2.js} +2 -2
  12. package/dist/web/client/assets/routes-EKRITFZz.js +14 -0
  13. package/dist/web/client/assets/settings-dialog-BomLOETY.js +3 -0
  14. package/dist/web/client/bundle-budget.json +5 -5
  15. package/dist/web/server/{_tanstack-start-manifest_v-B6ne-00G-OFX7UD4K.js → _tanstack-start-manifest_v-BiMhF9NX-QUZEGAB6.js} +7 -7
  16. package/dist/web/server/{agents-BwzqhPjK-ANFHE5AG.js → agents-DOgCHixY-KUZP2VDO.js} +2 -2
  17. package/dist/web/server/{agents-page-DEqPV-eG-BR5MR74O.js → agents-page-BdiR9H8w-M6X6SXMF.js} +3 -3
  18. package/dist/web/server/{artifacts-panel-DLO8OfXb-B2ZWCDFP.js → artifacts-panel-BNiaRF83-HDC6VQ66.js} +5 -5
  19. package/dist/web/server/{chat-command-palette-CaDQAMAu-KDH7BTDS.js → chat-command-palette-CT9aJAWG-LV26BDEW.js} +5 -5
  20. package/dist/web/server/{chunk-UDUG3MYZ.js → chunk-27J2LPAW.js} +2 -2
  21. package/dist/web/server/{chunk-V2GCVTDP.js → chunk-3CU2ITG7.js} +33 -48
  22. package/dist/web/server/{chunk-B5FKCW75.js → chunk-3R7XCOWI.js} +4 -4
  23. package/dist/web/server/{chunk-6AFVCERK.js → chunk-4TKPOOIG.js} +4 -4
  24. package/dist/web/server/{chunk-HUHUPGHT.js → chunk-4YQ7RBB7.js} +5 -5
  25. package/dist/web/server/{chunk-5IE54MRG.js → chunk-5XRESJQR.js} +3 -3
  26. package/dist/web/server/{chunk-TOJA3X5N.js → chunk-BLGKLQJG.js} +16 -5
  27. package/dist/web/server/{chunk-TQ2RECTH.js → chunk-C5XHGLET.js} +1 -1
  28. package/dist/web/server/{chunk-TTNONWZZ.js → chunk-LEZMRXSP.js} +923 -697
  29. package/dist/web/server/{chunk-KDCSEISZ.js → chunk-NZCEQWK2.js} +2 -1
  30. package/dist/web/server/{chunk-VM3U6PUU.js → chunk-QOZCYKMA.js} +2 -2
  31. package/dist/web/server/{connectors-C0xm91Ss-DJVBGD73.js → connectors-Dv_uPdv0-2X5VWQXK.js} +2 -2
  32. package/dist/web/server/{connectors-page-B6tJNZ6c-R5K4NSAT.js → connectors-page-DW75T-uH-EKRHUZ6K.js} +4 -4
  33. package/dist/web/server/{create-project-dialog-PFPHHWIV-GH7JR5IK.js → create-project-dialog-EwieT1Vw-X5MYQSZM.js} +5 -5
  34. package/dist/web/server/{openui-renderer-B9D8-Av--LFZP4U5V.js → openui-renderer-DCkg_JoD-4QCKSVY5.js} +4 -4
  35. package/dist/web/server/{resources-panel-CTzOOKPz-5G6RS2D6.js → resources-panel-s0mgyvgQ-FVMBBLJJ.js} +6 -6
  36. package/dist/web/server/{router-CnBux_Ld-YTVBMJFL.js → router-DXxChQOI-B7VVEX3H.js} +2 -2
  37. package/dist/web/server/{routes-BUGzvQoO-WW43X7W2.js → routes-D-g2ILNg-LDYCQ4NU.js} +4 -4
  38. package/dist/web/server/server.js +2 -2
  39. package/dist/web/server/{session-activity-panel-f0d3fCm7-I6L5IKFQ.js → session-activity-panel-wC0jAJvs-QAHJXPAM.js} +6 -6
  40. package/dist/web/server/{session-reasoning-panel-QIt_xjP0-FKJWMNHO.js → session-reasoning-panel-B_K8YgF5-AQPMFM3Y.js} +5 -5
  41. package/dist/web/server/{session-tool-renderer-Cg_ZPHxS-BNQKNJNZ.js → session-tool-renderer-D96BACVh-CH5CV3TS.js} +5 -5
  42. package/dist/web/server/{session-tree-panel-B--el8O5-NZOZJM5L.js → session-tree-panel-CZGXNZIP-FBB3XGMN.js} +5 -5
  43. package/dist/web/server/{settings-dialog-D_eJN2ia-W47Y474K.js → settings-dialog-BrjqiTVe-H7WOTB4I.js} +145 -66
  44. package/dist/web/server/{subagent-chat-panel-C9nWP21E-D5C2TTYD.js → subagent-chat-panel-Dz62jo_m-X4ZRN5KI.js} +8 -8
  45. package/dist/web/server/{subagents-panel-fAKvBNRG-O7QHXNE2.js → subagents-panel-CwpbzJJz-N3ISHODM.js} +8 -8
  46. package/dist/web/server/{workspace-panel-CZMNMU63-SYOSM3B7.js → workspace-panel-C7akv5b9-XUKEHPOP.js} +6 -6
  47. package/package.json +1 -1
  48. package/dist/web/client/assets/globals-DJhWyayo.css +0 -2
  49. package/dist/web/client/assets/routes-ja_liP8Z.js +0 -14
  50. package/dist/web/client/assets/settings-dialog-DiikSLhF.js +0 -1
@@ -4,7 +4,7 @@ import {
4
4
  RowSurface,
5
5
  SettingsCommitActions,
6
6
  SettingsPane
7
- } from "./chunk-TOJA3X5N.js";
7
+ } from "./chunk-BLGKLQJG.js";
8
8
  import {
9
9
  Spinner
10
10
  } from "./chunk-AXN2OBPF.js";
@@ -50,11 +50,11 @@ import {
50
50
  formatProviderLabel,
51
51
  useChatPanelDataContext,
52
52
  useSettingsActionsContext
53
- } from "./chunk-V2GCVTDP.js";
54
- import "./chunk-VM3U6PUU.js";
53
+ } from "./chunk-3CU2ITG7.js";
54
+ import "./chunk-QOZCYKMA.js";
55
55
  import "./chunk-5MOXRFX6.js";
56
56
  import "./chunk-RX2ZJARF.js";
57
- import "./chunk-TQ2RECTH.js";
57
+ import "./chunk-C5XHGLET.js";
58
58
  import "./chunk-CE7U5QB2.js";
59
59
  import {
60
60
  applyUiPreferencesToDocument,
@@ -64,7 +64,7 @@ import {
64
64
  readUiPreferences,
65
65
  writeUiPreferences
66
66
  } from "./chunk-6GYLXDX3.js";
67
- import "./chunk-KDCSEISZ.js";
67
+ import "./chunk-NZCEQWK2.js";
68
68
  import "./chunk-7DQQMT5V.js";
69
69
  import "./chunk-BD7YKYWL.js";
70
70
  import {
@@ -133,7 +133,7 @@ import {
133
133
  __export
134
134
  } from "./chunk-CZ7CSFO4.js";
135
135
 
136
- // web/app/dist/server/assets/settings-dialog-D_eJN2ia.js
136
+ // web/app/dist/server/assets/settings-dialog-BrjqiTVe.js
137
137
  import { createContext as createContext4, forwardRef as forwardRef7, useCallback, useContext as useContext4, useEffect as useEffect2, useId, useMemo as useMemo3, useRef as useRef4, useState as useState2 } from "react";
138
138
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
139
139
 
@@ -1100,7 +1100,7 @@ var ScrollAreaCorner = /* @__PURE__ */ React9.forwardRef(function ScrollAreaCorn
1100
1100
  });
1101
1101
  if (process.env.NODE_ENV !== "production") ScrollAreaCorner.displayName = "ScrollAreaCorner";
1102
1102
 
1103
- // web/app/dist/server/assets/settings-dialog-D_eJN2ia.js
1103
+ // web/app/dist/server/assets/settings-dialog-BrjqiTVe.js
1104
1104
  function isFieldInvalid(value, attemptedSave, required = true) {
1105
1105
  return attemptedSave && required && value.trim().length === 0;
1106
1106
  }
@@ -1360,6 +1360,46 @@ function AddModelsDialog({ configuredProviderIds, discoverableProviderIds, disco
1360
1360
  const [filter, setFilter] = useState2("");
1361
1361
  const [selectedKeys, setSelectedKeys] = useState2(/* @__PURE__ */ new Set());
1362
1362
  const normalizedFilter = filter.trim().toLowerCase();
1363
+ const [discovery, setDiscovery] = useState2({});
1364
+ const discoveryRef = useRef4(discovery);
1365
+ const discoverCallback = useRef4(onDiscoverProvider);
1366
+ useEffect2(() => {
1367
+ discoverCallback.current = onDiscoverProvider;
1368
+ }, [onDiscoverProvider]);
1369
+ const refreshProvider = useCallback(async (id, force = false) => {
1370
+ const previous = discoveryRef.current[id];
1371
+ if (previous?.loading || !force && previous?.updatedAt && Date.now() - previous.updatedAt < 6e4) return;
1372
+ const update = (value) => {
1373
+ discoveryRef.current = {
1374
+ ...discoveryRef.current,
1375
+ [id]: value ?? {}
1376
+ };
1377
+ setDiscovery(discoveryRef.current);
1378
+ };
1379
+ update({
1380
+ ...previous,
1381
+ loading: true,
1382
+ error: false
1383
+ });
1384
+ try {
1385
+ await discoverCallback.current(id);
1386
+ update({ updatedAt: Date.now() });
1387
+ } catch {
1388
+ update({
1389
+ loading: false,
1390
+ error: true
1391
+ });
1392
+ }
1393
+ }, []);
1394
+ const discoveryIds = [...discoverableProviderIds ?? []].filter((id) => configuredProviderIds.has(id)).sort((a, b) => a.localeCompare(b)).join("\n");
1395
+ useEffect2(() => {
1396
+ if (!open) return;
1397
+ for (const id of discoveryIds.split("\n").filter(Boolean)) refreshProvider(id);
1398
+ }, [
1399
+ open,
1400
+ discoveryIds,
1401
+ refreshProvider
1402
+ ]);
1363
1403
  const candidateModels = useMemo3(() => {
1364
1404
  return modelOptions.filter((model) => {
1365
1405
  if (!configuredProviderIds.has(model.provider)) return false;
@@ -1405,49 +1445,61 @@ function AddModelsDialog({ configuredProviderIds, discoverableProviderIds, disco
1405
1445
  const confirmAdd = () => {
1406
1446
  const selected = candidateModels.filter((model) => selectedKeys.has(model.id));
1407
1447
  if (selected.length > 0) onAddModels(selected);
1448
+ setSelectedKeys(/* @__PURE__ */ new Set());
1408
1449
  onOpenChange(false);
1409
1450
  };
1410
1451
  return /* @__PURE__ */ jsx(Dialog$1, {
1411
1452
  open,
1412
- onOpenChange,
1453
+ onOpenChange: (next) => {
1454
+ if (!next) setSelectedKeys(/* @__PURE__ */ new Set());
1455
+ onOpenChange(next);
1456
+ },
1413
1457
  children: /* @__PURE__ */ jsxs(DialogContent, {
1414
- className: "max-w-lg",
1458
+ className: "flex max-h-[calc(100dvh-2rem)] min-w-0 max-w-[calc(100%-2rem)] sm:max-w-lg flex-col overflow-hidden",
1415
1459
  children: [
1416
- /* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: "Add models" }), /* @__PURE__ */ jsxs(DialogDescription, { children: [
1417
- "Pick models discovered from your configured providers. For OpenAI Chat Completions, refresh runs",
1418
- " ",
1419
- /* @__PURE__ */ jsxs("span", {
1420
- className: "font-medium",
1421
- children: ["GET ", "{baseUrl}/models"]
1422
- }),
1423
- "."
1424
- ] })] }),
1460
+ /* @__PURE__ */ jsxs(DialogHeader, {
1461
+ className: "shrink-0",
1462
+ children: [/* @__PURE__ */ jsx(DialogTitle, { children: "Add models" }), /* @__PURE__ */ jsxs(DialogDescription, { children: [
1463
+ "Pick models discovered from your configured providers. For OpenAI Chat Completions, refresh runs",
1464
+ " ",
1465
+ /* @__PURE__ */ jsxs("span", {
1466
+ className: "font-medium",
1467
+ children: ["GET ", "{baseUrl}/models"]
1468
+ }),
1469
+ "."
1470
+ ] })]
1471
+ }),
1425
1472
  /* @__PURE__ */ jsx("div", {
1426
- className: "flex flex-wrap gap-1.5",
1427
- children: discoverableProviders.map((providerId) => {
1428
- const discovering = discoveringProviderId === providerId;
1429
- const activeCount = activeCountByProvider.get(providerId) ?? 0;
1430
- return /* @__PURE__ */ jsxs(Button$1, {
1431
- type: "button",
1432
- variant: "outline",
1433
- size: "compact",
1434
- disabled: discoveringProviderId !== null,
1435
- onClick: () => {
1436
- onDiscoverProvider(providerId);
1437
- },
1438
- children: [
1439
- discovering ? /* @__PURE__ */ jsx(Spinner, { "data-icon": "inline-start" }) : /* @__PURE__ */ jsx(RefreshCw, { "data-icon": "inline-start" }),
1440
- providerLabel(providerId),
1441
- activeCount > 0 ? /* @__PURE__ */ jsxs("span", {
1442
- className: "tabular-nums text-muted-foreground",
1443
- children: [
1444
- "\xB7 ",
1445
- activeCount,
1446
- " active"
1447
- ]
1448
- }) : null
1449
- ]
1450
- }, providerId);
1473
+ className: "max-h-28 shrink-0 overflow-y-auto",
1474
+ children: /* @__PURE__ */ jsx("div", {
1475
+ className: "flex min-w-0 flex-wrap gap-1.5 [&_button]:max-w-full [&_button]:h-auto [&_button]:whitespace-normal [&_button]:break-words",
1476
+ children: discoverableProviders.map((providerId) => {
1477
+ const discovering = discovery[providerId]?.loading ?? discoveringProviderId === providerId;
1478
+ const activeCount = activeCountByProvider.get(providerId) ?? 0;
1479
+ return /* @__PURE__ */ jsxs(Button$1, {
1480
+ type: "button",
1481
+ variant: "outline",
1482
+ size: "compact",
1483
+ disabled: discovering,
1484
+ onClick: () => {
1485
+ refreshProvider(providerId, true);
1486
+ },
1487
+ children: [
1488
+ discovering ? /* @__PURE__ */ jsx(Spinner, { "data-icon": "inline-start" }) : /* @__PURE__ */ jsx(RefreshCw, { "data-icon": "inline-start" }),
1489
+ "Refresh ",
1490
+ providerLabel(providerId),
1491
+ discovery[providerId]?.error ? " \xB7 Refresh failed (stale)" : "",
1492
+ activeCount > 0 ? /* @__PURE__ */ jsxs("span", {
1493
+ className: "tabular-nums text-muted-foreground",
1494
+ children: [
1495
+ "\xB7 ",
1496
+ activeCount,
1497
+ " active"
1498
+ ]
1499
+ }) : null
1500
+ ]
1501
+ }, providerId);
1502
+ })
1451
1503
  })
1452
1504
  }),
1453
1505
  /* @__PURE__ */ jsxs(InputGroup, { children: [/* @__PURE__ */ jsx(InputGroupAddon, {
@@ -1460,10 +1512,11 @@ function AddModelsDialog({ configuredProviderIds, discoverableProviderIds, disco
1460
1512
  placeholder: "Search discovered models\u2026"
1461
1513
  })] }),
1462
1514
  /* @__PURE__ */ jsx("div", {
1463
- className: "max-h-72 overflow-y-auto overscroll-contain",
1515
+ className: "min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden overscroll-contain",
1516
+ "aria-live": "polite",
1464
1517
  children: groupedCandidates.length === 0 ? /* @__PURE__ */ jsx("p", {
1465
1518
  className: "py-6 text-center text-xs text-pretty text-muted-foreground",
1466
- children: candidateModels.length === 0 && !normalizedFilter ? "All discovered models are already in your list, or none are available yet." : "No models match your search."
1519
+ children: Object.values(discovery).some((state) => state.loading) ? "Loading models\u2026" : candidateModels.length === 0 && !normalizedFilter ? "No additional models available. Providers may have returned an empty list or all models are already enabled." : "No models match your search."
1467
1520
  }) : /* @__PURE__ */ jsx("div", {
1468
1521
  className: "flex flex-col gap-3",
1469
1522
  children: groupedCandidates.map(([provider, models]) => /* @__PURE__ */ jsxs("div", {
@@ -1514,7 +1567,7 @@ function AddModelsDialog({ configuredProviderIds, discoverableProviderIds, disco
1514
1567
  })
1515
1568
  }),
1516
1569
  /* @__PURE__ */ jsxs("div", {
1517
- className: "flex items-center justify-end gap-1.5",
1570
+ className: "flex shrink-0 items-center justify-end gap-1.5",
1518
1571
  children: [/* @__PURE__ */ jsx(Button$1, {
1519
1572
  type: "button",
1520
1573
  variant: "ghost",
@@ -1824,9 +1877,22 @@ function ProviderOAuthTerminalFallback({ provider }) {
1824
1877
  children: /* @__PURE__ */ jsxs(AlertDescription, {
1825
1878
  className: "text-xs text-pretty",
1826
1879
  children: [
1827
- "OAuth sign-in from Fleet settings is unavailable. Launch Prime Agent in a terminal using the same configuration directory as Fleet and complete ",
1880
+ "Sign-in has to run inside Prime Agent. In a terminal, start Prime Agent against the same account as Fleet, then run ",
1881
+ /* @__PURE__ */ jsx("code", {
1882
+ className: "rounded bg-muted px-1 py-0.5 font-mono text-caption text-foreground",
1883
+ children: "/login"
1884
+ }),
1885
+ " ",
1886
+ "and choose ",
1828
1887
  provider.name,
1829
- " sign-in there. Restart Fleet afterward to reload the credentials."
1888
+ ". Fleet reads the stored credential on every request, so a restart is not needed. If Fleet uses a non-default account directory, start Prime Agent with the same",
1889
+ " ",
1890
+ /* @__PURE__ */ jsx("code", {
1891
+ className: "rounded bg-muted px-1 py-0.5 font-mono text-caption text-foreground",
1892
+ children: "PRIME_AGENT_CODING_AGENT_DIR"
1893
+ }),
1894
+ " ",
1895
+ "it uses."
1830
1896
  ]
1831
1897
  })
1832
1898
  });
@@ -1868,7 +1934,7 @@ function useProviderCredentialsController({ onRemoveProvider, onUpdateProvider,
1868
1934
  }, [activeProviders, searchQuery]);
1869
1935
  const filteredPickerAvailable = useMemo3(() => {
1870
1936
  const query = addPickerQuery.trim().toLowerCase();
1871
- return unconfiguredProviders.filter((provider) => providerMatchesQuery(provider, query));
1937
+ return unconfiguredProviders.filter((provider) => providerMatchesQuery(provider, query)).sort((a, b) => a.id === "custom" ? -1 : b.id === "custom" ? 1 : a.name.localeCompare(b.name));
1872
1938
  }, [addPickerQuery, unconfiguredProviders]);
1873
1939
  const filteredPickerConfigured = useMemo3(() => {
1874
1940
  const query = addPickerQuery.trim().toLowerCase();
@@ -2075,7 +2141,7 @@ function AddProviderPickerPanel({ addPickerQuery, credentialProvidersLength, fil
2075
2141
  children: "Add provider"
2076
2142
  }), /* @__PURE__ */ jsx("p", {
2077
2143
  className: "text-xs text-pretty text-muted-foreground",
2078
- children: "Choose a provider to store encrypted credentials for this account."
2144
+ children: "Choose a provider to save credentials in Prime Agent\u2019s auth.json."
2079
2145
  })]
2080
2146
  })]
2081
2147
  }),
@@ -2408,13 +2474,13 @@ function ProviderCredentialsSection({ isLoading, isPending, onRemoveProvider, on
2408
2474
  return /* @__PURE__ */ jsxs(SettingsPane, {
2409
2475
  title: "Providers",
2410
2476
  description: /* @__PURE__ */ jsxs(Fragment$1, { children: [
2411
- "Locally, API keys are stored in",
2477
+ "Provider credentials are stored in Prime Agent\u2019s",
2412
2478
  " ",
2413
2479
  /* @__PURE__ */ jsx("code", {
2414
2480
  className: "rounded bg-muted px-1 py-0.5 font-mono text-caption text-foreground",
2415
- children: ".env.local"
2481
+ children: "auth.json"
2416
2482
  }),
2417
- ". When deployed, they are stored encrypted in your account."
2483
+ ". Custom providers and model definitions are stored in models.json. Enabled models and defaults are saved in settings.json, or the existing project settings file."
2418
2484
  ] }),
2419
2485
  children: [addPickerOpen ? /* @__PURE__ */ jsx(AddProviderPickerPanel, {
2420
2486
  addPickerQuery,
@@ -2608,7 +2674,7 @@ function sanitizeStringList(values) {
2608
2674
  }
2609
2675
  function useModelDefaultsForm({ draft, setDraft, updateDraft, settings, providers, models, modelCatalog, onDiscoverModels, saveSettings, setSavingSection }) {
2610
2676
  const [modelFilter, setModelFilter] = useState2("");
2611
- const [discoveredModels, setDiscoveredModels] = useState2([]);
2677
+ const [discoveredModels, setDiscoveredModels] = useState2({});
2612
2678
  const [discoveringProviderId, setDiscoveringProviderId] = useState2(null);
2613
2679
  const lastCommittedModelSettings = useRef4(null);
2614
2680
  const configuredProviderIds = useMemo3(() => {
@@ -2619,13 +2685,24 @@ function useModelDefaultsForm({ draft, setDraft, updateDraft, settings, provider
2619
2685
  const catalogModels = modelCatalog ?? models;
2620
2686
  const modelOptions = useMemo3(() => {
2621
2687
  const byId = /* @__PURE__ */ new Map();
2622
- for (const model of catalogModels) if (configuredProviderIds.has(model.provider) && model.available !== false) byId.set(model.id, model);
2623
- for (const model of discoveredModels) if (configuredProviderIds.has(model.provider) && model.available !== false) byId.set(model.id, model);
2688
+ const catalogById = new Map(catalogModels.map((model) => [model.id, model]));
2689
+ for (const model of catalogModels) {
2690
+ if (Object.hasOwn(discoveredModels, model.provider) && !isModelEnabled(model, draft?.enabledModels)) continue;
2691
+ if (configuredProviderIds.has(model.provider) && model.available !== false) byId.set(model.id, model);
2692
+ }
2693
+ for (const model of Object.values(discoveredModels).flat()) if (configuredProviderIds.has(model.provider) && model.available !== false) {
2694
+ const existing = catalogById.get(model.id);
2695
+ byId.set(model.id, existing ? {
2696
+ ...model,
2697
+ ...existing
2698
+ } : model);
2699
+ }
2624
2700
  return [...byId.values()];
2625
2701
  }, [
2626
2702
  catalogModels,
2627
2703
  configuredProviderIds,
2628
- discoveredModels
2704
+ discoveredModels,
2705
+ draft?.enabledModels
2629
2706
  ]);
2630
2707
  const modelBaseline = lastCommittedModelSettings.current ?? (settings ? comparableModelSettings(settings.effective) : null);
2631
2708
  const modelDirty = !!draft && !!modelBaseline && !sameJson(comparableModelSettings(draft), modelBaseline);
@@ -2701,11 +2778,10 @@ function useModelDefaultsForm({ draft, setDraft, updateDraft, settings, provider
2701
2778
  setDiscoveringProviderId(providerId);
2702
2779
  try {
2703
2780
  const discovered = await onDiscoverModels(providerId);
2704
- setDiscoveredModels((current) => {
2705
- const byId = new Map(current.map((model) => [model.id, model]));
2706
- for (const model of discovered) byId.set(model.id, model);
2707
- return [...byId.values()];
2708
- });
2781
+ setDiscoveredModels((current) => ({
2782
+ ...current,
2783
+ [providerId]: discovered
2784
+ }));
2709
2785
  } finally {
2710
2786
  setDiscoveringProviderId(null);
2711
2787
  }
@@ -3412,7 +3488,7 @@ var ScrollArea$1 = forwardRef7(({ className, children, viewportClassName, orient
3412
3488
  "data-slot": "scroll-area-viewport",
3413
3489
  className: cn("size-full rounded-[inherit]", viewportClassName),
3414
3490
  children: /* @__PURE__ */ jsx(index_parts_exports.Content, {
3415
- className: cn(orientation2 === "vertical" && "w-full min-w-full"),
3491
+ className: cn(orientation2 === "vertical" && "block! w-full min-w-0! max-w-full"),
3416
3492
  children
3417
3493
  })
3418
3494
  }),
@@ -3444,6 +3520,7 @@ function useSettingsForm() {
3444
3520
  const { models, resources } = useChatPanelDataContext();
3445
3521
  const [draft, setDraft] = useState2(null);
3446
3522
  const [savingSection, setSavingSection] = useState2(null);
3523
+ const syncedSettings = useRef4(void 0);
3447
3524
  const resourceSummary = summarizeResources(resources);
3448
3525
  const updateDraft = (updater) => {
3449
3526
  setDraft((current) => current ? updater(current) : current);
@@ -3471,9 +3548,10 @@ function useSettingsForm() {
3471
3548
  setDraft(settings.effective);
3472
3549
  };
3473
3550
  useEffect2(() => {
3474
- if (!settings) return;
3551
+ if (!settings || syncedSettings.current === settings) return;
3475
3552
  const nextDraft = settings.effective;
3476
3553
  if (draft && hasUnsavedChanges) return;
3554
+ syncedSettings.current = settings;
3477
3555
  if (draft && sameJson(draft, nextDraft)) return;
3478
3556
  setDraft(nextDraft);
3479
3557
  }, [
@@ -3931,13 +4009,14 @@ function SettingsDialogBody({ initialTab, onCloseAttemptRef, onOpenChange }) {
3931
4009
  })
3932
4010
  }),
3933
4011
  /* @__PURE__ */ jsx(ScrollArea$1, {
3934
- className: "min-h-0 w-full flex-1",
4012
+ className: "min-h-0 min-w-0 w-full flex-1",
4013
+ viewportClassName: "overflow-x-hidden",
3935
4014
  children: /* @__PURE__ */ jsx("div", {
3936
4015
  id: `panel-${activeTab}`,
3937
4016
  role: "tabpanel",
3938
4017
  "aria-label": activeSection.title,
3939
4018
  tabIndex: 0,
3940
- className: "w-full p-6 outline-none",
4019
+ className: "min-w-0 w-full max-w-full p-4 outline-none [overflow-wrap:anywhere] sm:p-6",
3941
4020
  children: paneContent
3942
4021
  })
3943
4022
  })
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  SubagentTranscriptView
3
- } from "./chunk-6AFVCERK.js";
4
- import "./chunk-5IE54MRG.js";
5
- import "./chunk-B5FKCW75.js";
3
+ } from "./chunk-4TKPOOIG.js";
4
+ import "./chunk-5XRESJQR.js";
5
+ import "./chunk-3R7XCOWI.js";
6
6
  import "./chunk-R4BS3KYI.js";
7
7
  import "./chunk-KBMRRJQN.js";
8
8
  import {
9
9
  PromptInput
10
- } from "./chunk-V2GCVTDP.js";
11
- import "./chunk-VM3U6PUU.js";
10
+ } from "./chunk-3CU2ITG7.js";
11
+ import "./chunk-QOZCYKMA.js";
12
12
  import "./chunk-5MOXRFX6.js";
13
13
  import "./chunk-RX2ZJARF.js";
14
- import "./chunk-TQ2RECTH.js";
14
+ import "./chunk-C5XHGLET.js";
15
15
  import "./chunk-CE7U5QB2.js";
16
16
  import "./chunk-6GYLXDX3.js";
17
- import "./chunk-KDCSEISZ.js";
17
+ import "./chunk-NZCEQWK2.js";
18
18
  import "./chunk-7DQQMT5V.js";
19
19
  import "./chunk-BD7YKYWL.js";
20
20
  import "./chunk-TXZDDJCT.js";
@@ -32,7 +32,7 @@ import "./chunk-DP65WGRD.js";
32
32
  import "./chunk-IGN54DHU.js";
33
33
  import "./chunk-CZ7CSFO4.js";
34
34
 
35
- // web/app/dist/server/assets/subagent-chat-panel-C9nWP21E.js
35
+ // web/app/dist/server/assets/subagent-chat-panel-Dz62jo_m.js
36
36
  import { jsx, jsxs } from "react/jsx-runtime";
37
37
  function SubagentComposer({ disabled, sending, onSend, onStop, placeholder = "Message this subagent\u2026 (Enter to steer)" }) {
38
38
  return /* @__PURE__ */ jsx("div", {
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  SubagentTranscriptView
3
- } from "./chunk-6AFVCERK.js";
4
- import "./chunk-5IE54MRG.js";
5
- import "./chunk-B5FKCW75.js";
3
+ } from "./chunk-4TKPOOIG.js";
4
+ import "./chunk-5XRESJQR.js";
5
+ import "./chunk-3R7XCOWI.js";
6
6
  import "./chunk-R4BS3KYI.js";
7
7
  import "./chunk-KBMRRJQN.js";
8
8
  import {
9
9
  orderedRlmChildren,
10
10
  rlmStatusIcon
11
- } from "./chunk-V2GCVTDP.js";
12
- import "./chunk-VM3U6PUU.js";
11
+ } from "./chunk-3CU2ITG7.js";
12
+ import "./chunk-QOZCYKMA.js";
13
13
  import "./chunk-5MOXRFX6.js";
14
14
  import "./chunk-RX2ZJARF.js";
15
- import "./chunk-TQ2RECTH.js";
15
+ import "./chunk-C5XHGLET.js";
16
16
  import "./chunk-CE7U5QB2.js";
17
17
  import "./chunk-6GYLXDX3.js";
18
- import "./chunk-KDCSEISZ.js";
18
+ import "./chunk-NZCEQWK2.js";
19
19
  import "./chunk-7DQQMT5V.js";
20
20
  import "./chunk-BD7YKYWL.js";
21
21
  import "./chunk-TXZDDJCT.js";
@@ -39,7 +39,7 @@ import "./chunk-DP65WGRD.js";
39
39
  import "./chunk-IGN54DHU.js";
40
40
  import "./chunk-CZ7CSFO4.js";
41
41
 
42
- // web/app/dist/server/assets/subagents-panel-fAKvBNRG.js
42
+ // web/app/dist/server/assets/subagents-panel-CwpbzJJz.js
43
43
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
44
44
  import { jsx, jsxs } from "react/jsx-runtime";
45
45
  function SubagentsPanelContent({ agents, loadSession, onOpenTab, parentSessionId, tree }) {
@@ -3,7 +3,7 @@ import {
3
3
  ResourceNotice,
4
4
  WorkspacePreviewSkeleton,
5
5
  WorkspaceSkeleton
6
- } from "./chunk-UDUG3MYZ.js";
6
+ } from "./chunk-27J2LPAW.js";
7
7
  import {
8
8
  LazyMarkdown,
9
9
  WORKSPACE_SPLIT_GAP_RESET,
@@ -14,18 +14,18 @@ import {
14
14
  readStoredWidth,
15
15
  startHorizontalResize,
16
16
  storeStoredWidth
17
- } from "./chunk-V2GCVTDP.js";
18
- import "./chunk-VM3U6PUU.js";
17
+ } from "./chunk-3CU2ITG7.js";
18
+ import "./chunk-QOZCYKMA.js";
19
19
  import "./chunk-5MOXRFX6.js";
20
20
  import {
21
21
  EASE_OUT,
22
22
  SPRING_LAYOUT,
23
23
  SPRING_SWAP
24
24
  } from "./chunk-RX2ZJARF.js";
25
- import "./chunk-TQ2RECTH.js";
25
+ import "./chunk-C5XHGLET.js";
26
26
  import "./chunk-CE7U5QB2.js";
27
27
  import "./chunk-6GYLXDX3.js";
28
- import "./chunk-KDCSEISZ.js";
28
+ import "./chunk-NZCEQWK2.js";
29
29
  import {
30
30
  AnimatePresence,
31
31
  m,
@@ -51,7 +51,7 @@ import "./chunk-35RIM6VP.js";
51
51
  import "./chunk-NXAVRSI5.js";
52
52
  import "./chunk-CZ7CSFO4.js";
53
53
 
54
- // web/app/dist/server/assets/workspace-panel-CZMNMU63.js
54
+ // web/app/dist/server/assets/workspace-panel-C7akv5b9.js
55
55
  import { Children, Fragment, cloneElement, forwardRef, isValidElement, useCallback, useEffect, useId, useMemo, useRef, useState, useSyncExternalStore } from "react";
56
56
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
57
57
  var variants = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qredence/fleet",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
4
4
  "description": "Fleet Prime: local web interface and launcher using the pinned Prime Agent Rust runtime",
5
5
  "license": "MIT",
6
6
  "type": "module",