@trops/dash-core 0.1.815 → 0.1.816

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.
package/dist/index.js CHANGED
@@ -47816,6 +47816,93 @@ function providerUsage(name, _ref2) {
47816
47816
  count: dashboards.length + usedBy.length
47817
47817
  };
47818
47818
  }
47819
+ var MAX_NAMES = 3;
47820
+ var plural$7 = function plural(n, word) {
47821
+ return "".concat(n, " ").concat(word).concat(n === 1 ? "" : "s");
47822
+ };
47823
+ var nameList = function nameList(names) {
47824
+ return names.length > MAX_NAMES ? "".concat(names.slice(0, MAX_NAMES).join(", "), " and ").concat(names.length - MAX_NAMES, " more") : names.join(", ");
47825
+ };
47826
+
47827
+ /** "1 dashboard (Sales) and 2 bots (Digest, Loose)", or "" when unused. */
47828
+ function providerUsedByText(usage) {
47829
+ var parts = [];
47830
+ var dashboards = usage && usage.dashboards || [];
47831
+ var bots = usage && usage.bots || [];
47832
+ if (dashboards.length) {
47833
+ parts.push("".concat(plural$7(dashboards.length, "dashboard"), " (").concat(nameList(dashboards.map(function (d) {
47834
+ return d.workspaceName;
47835
+ })), ")"));
47836
+ }
47837
+ if (bots.length) {
47838
+ parts.push("".concat(plural$7(bots.length, "bot"), " (").concat(nameList(bots.map(function (b) {
47839
+ return b.name;
47840
+ })), ")"));
47841
+ }
47842
+ return parts.join(" and ");
47843
+ }
47844
+
47845
+ // Who's affected, worded for one bot, one dashboard, or several.
47846
+ function affected(usage) {
47847
+ var dashboards = usage && usage.dashboards || [];
47848
+ var bots = usage && usage.bots || [];
47849
+ if (bots.length === 1 && !dashboards.length) {
47850
+ return {
47851
+ subject: "that bot",
47852
+ s: "s",
47853
+ them: "it"
47854
+ };
47855
+ }
47856
+ if (dashboards.length === 1 && !bots.length) {
47857
+ return {
47858
+ subject: "that dashboard's widgets",
47859
+ s: "",
47860
+ them: "them"
47861
+ };
47862
+ }
47863
+ return {
47864
+ subject: "they",
47865
+ s: "",
47866
+ them: "them"
47867
+ };
47868
+ }
47869
+
47870
+ /**
47871
+ * The Delete confirm (QA 2026-10-22: it never said what uses it). Null
47872
+ * usage = not known yet (bots still loading, or no dashboards given).
47873
+ */
47874
+ function providerDeleteMessage(name, usage) {
47875
+ if (!usage) {
47876
+ return "Widgets and bots that use ".concat(name, " will need another provider picked before they work again. This can't be undone.");
47877
+ }
47878
+ var usedBy = providerUsedByText(usage);
47879
+ if (!usedBy) return "Nothing uses ".concat(name, ". This can't be undone.");
47880
+ var _affected = affected(usage),
47881
+ subject = _affected.subject,
47882
+ s = _affected.s;
47883
+ var it = s ? "it" : "they";
47884
+ return "".concat(name, " is used by ").concat(usedBy, ". Once it's deleted, ").concat(subject, " need").concat(s, " another provider picked before ").concat(it, " work").concat(s, " again. This can't be undone.");
47885
+ }
47886
+
47887
+ /**
47888
+ * The Rename confirm: widgets and bots find a provider by its name, so a
47889
+ * rename leaves them without it. Null when nothing uses it (no confirm);
47890
+ * null usage = not known yet, so it still asks.
47891
+ */
47892
+ function providerRenameMessage(from, to, usage) {
47893
+ if (!usage) {
47894
+ return "Widgets and bots find ".concat(from, " by name, so any that use it won't find it after it's renamed to ").concat(to, " until you pick ").concat(to, " for them.");
47895
+ }
47896
+ var usedBy = providerUsedByText(usage);
47897
+ if (!usedBy) return null;
47898
+ var _affected2 = affected(usage),
47899
+ subject = _affected2.subject,
47900
+ s = _affected2.s,
47901
+ them = _affected2.them;
47902
+ var Subject = subject[0].toUpperCase() + subject.slice(1);
47903
+ var it = s ? "it" : "they";
47904
+ return "".concat(from, " is used by ").concat(usedBy, ". ").concat(Subject, " find").concat(s, " providers by name, so after the rename to ").concat(to, " ").concat(it, " won't work until you pick ").concat(to, " for ").concat(them, ".");
47905
+ }
47819
47906
  var GROUPS$1 = [{
47820
47907
  cls: "mcp",
47821
47908
  label: "Tools (MCP)"
@@ -47929,6 +48016,12 @@ function useProviderStatus(_ref) {
47929
48016
  _useState6 = _slicedToArray(_useState5, 2),
47930
48017
  bots = _useState6[0],
47931
48018
  setBots = _useState6[1];
48019
+ // False until the bots list has loaded (and if it fails): until then, who
48020
+ // uses a provider isn't known.
48021
+ var _useState7 = React.useState(false),
48022
+ _useState8 = _slicedToArray(_useState7, 2),
48023
+ botsLoaded = _useState8[0],
48024
+ setBotsLoaded = _useState8[1];
47932
48025
  var mcpNames = React.useMemo(function () {
47933
48026
  return Object.entries(providers || {}).filter(function (_ref2) {
47934
48027
  var _ref3 = _slicedToArray(_ref2, 2),
@@ -47982,7 +48075,9 @@ function useProviderStatus(_ref) {
47982
48075
  var alive = true;
47983
48076
  var load = function load() {
47984
48077
  return Promise.resolve(api.list()).then(function (list) {
47985
- if (alive) setBots(Array.isArray(list) ? list : []);
48078
+ if (!alive) return;
48079
+ setBots(Array.isArray(list) ? list : []);
48080
+ setBotsLoaded(true);
47986
48081
  })["catch"](function () {});
47987
48082
  };
47988
48083
  load();
@@ -48029,9 +48124,10 @@ function useProviderStatus(_ref) {
48029
48124
  },
48030
48125
  // The bot definitions (Choose where to use… saves them).
48031
48126
  bots: bots,
48127
+ botsLoaded: botsLoaded,
48032
48128
  refresh: checkRunning
48033
48129
  };
48034
- }, [providers, running, catalog, workspaces, bots, bindingsFor, checkRunning]);
48130
+ }, [providers, running, catalog, workspaces, bots, botsLoaded, bindingsFor, checkRunning]);
48035
48131
  }
48036
48132
 
48037
48133
  /** How many providers need setup — the Providers item's left-nav dot. */
@@ -53217,7 +53313,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
53217
53313
  _ref$onCreateAcknowle = _ref.onCreateAcknowledged,
53218
53314
  onCreateAcknowledged = _ref$onCreateAcknowle === void 0 ? null : _ref$onCreateAcknowle,
53219
53315
  _ref$workspaces = _ref.workspaces,
53220
- workspaces = _ref$workspaces === void 0 ? [] : _ref$workspaces,
53316
+ workspacesProp = _ref$workspaces === void 0 ? null : _ref$workspaces,
53221
53317
  _ref$onOpenWorkspace = _ref.onOpenWorkspace,
53222
53318
  onOpenWorkspace = _ref$onOpenWorkspace === void 0 ? null : _ref$onOpenWorkspace,
53223
53319
  _ref$onOpenBotInBotsV = _ref.onOpenBotInBotsView,
@@ -53242,12 +53338,17 @@ var ProvidersSection = function ProvidersSection(_ref) {
53242
53338
  selectedBorder = _useConfigTokens.selectedBorder;
53243
53339
  // MCP catalog: authCommand / credentialSchema lookups and status.
53244
53340
  var catalog = useMcpCatalog(dashApi);
53341
+ var workspaces = workspacesProp || [];
53245
53342
  var status = useProviderStatus({
53246
53343
  providers: providers,
53247
53344
  workspaces: workspaces,
53248
53345
  dashApi: dashApi,
53249
53346
  catalog: catalog
53250
53347
  });
53348
+ // Who uses a provider, or null while that isn't known.
53349
+ var knownUsage = function knownUsage(name) {
53350
+ return workspacesProp && status.botsLoaded ? status.usageOf(name) : null;
53351
+ };
53251
53352
  var _useState = React.useState(false),
53252
53353
  _useState2 = _slicedToArray(_useState, 2),
53253
53354
  needsSetupOnly = _useState2[0],
@@ -53305,32 +53406,38 @@ var ProvidersSection = function ProvidersSection(_ref) {
53305
53406
  _useState22 = _slicedToArray(_useState21, 2),
53306
53407
  deleteTarget = _useState22[0],
53307
53408
  setDeleteTarget = _useState22[1];
53308
- var _useState23 = React.useState(false),
53409
+ // A rename of a provider something uses waits here for a confirm:
53410
+ // { from, to, message, save }.
53411
+ var _useState23 = React.useState(null),
53309
53412
  _useState24 = _slicedToArray(_useState23, 2),
53310
- isAddingMcp = _useState24[0],
53311
- setIsAddingMcp = _useState24[1];
53413
+ renameConfirm = _useState24[0],
53414
+ setRenameConfirm = _useState24[1];
53312
53415
  var _useState25 = React.useState(false),
53313
53416
  _useState26 = _slicedToArray(_useState25, 2),
53314
- isEditingMcp = _useState26[0],
53315
- setIsEditingMcp = _useState26[1];
53417
+ isAddingMcp = _useState26[0],
53418
+ setIsAddingMcp = _useState26[1];
53316
53419
  var _useState27 = React.useState(false),
53317
53420
  _useState28 = _slicedToArray(_useState27, 2),
53318
- isAddingWs = _useState28[0],
53319
- setIsAddingWs = _useState28[1];
53421
+ isEditingMcp = _useState28[0],
53422
+ setIsEditingMcp = _useState28[1];
53320
53423
  var _useState29 = React.useState(false),
53321
53424
  _useState30 = _slicedToArray(_useState29, 2),
53322
- isEditingWs = _useState30[0],
53323
- setIsEditingWs = _useState30[1];
53425
+ isAddingWs = _useState30[0],
53426
+ setIsAddingWs = _useState30[1];
53427
+ var _useState31 = React.useState(false),
53428
+ _useState32 = _slicedToArray(_useState31, 2),
53429
+ isEditingWs = _useState32[0],
53430
+ setIsEditingWs = _useState32[1];
53324
53431
  // NAV-015 "Choose where to use…": the provider whose dialog is open, and
53325
53432
  // the rows worked out when it opened (kept fixed while the user ticks).
53326
- var _useState31 = React.useState(null),
53327
- _useState32 = _slicedToArray(_useState31, 2),
53328
- useTarget = _useState32[0],
53329
- setUseTarget = _useState32[1];
53330
53433
  var _useState33 = React.useState(null),
53331
53434
  _useState34 = _slicedToArray(_useState33, 2),
53332
- useModel = _useState34[0],
53333
- setUseModel = _useState34[1];
53435
+ useTarget = _useState34[0],
53436
+ setUseTarget = _useState34[1];
53437
+ var _useState35 = React.useState(null),
53438
+ _useState36 = _slicedToArray(_useState35, 2),
53439
+ useModel = _useState36[0],
53440
+ setUseModel = _useState36[1];
53334
53441
  var openChooseWhereToUse = function openChooseWhereToUse(name) {
53335
53442
  setUseModel(providerUseModel({
53336
53443
  providerName: name,
@@ -53437,8 +53544,23 @@ var ProvidersSection = function ProvidersSection(_ref) {
53437
53544
  setIsEditingWs(false);
53438
53545
  }
53439
53546
  }
53547
+
53548
+ // Widgets and bots find a provider by name: renaming one that's in use
53549
+ // asks first (QA 2026-10-22).
53550
+ function confirmRename(from, to, save) {
53551
+ var message = from && to && from !== to ? providerRenameMessage(from, to, knownUsage(from)) : null;
53552
+ if (message) setRenameConfirm({
53553
+ from: from,
53554
+ to: to,
53555
+ message: message,
53556
+ save: save
53557
+ });else save();
53558
+ }
53440
53559
  function handleSaveEdit() {
53441
53560
  if (!formName.trim() || !dashApi || !appId) return;
53561
+ confirmRename(selectedName, formName.trim(), saveEdit);
53562
+ }
53563
+ function saveEdit() {
53442
53564
  var originalName = selectedName;
53443
53565
  var originalProvider = providers[originalName];
53444
53566
  // Delete old if name changed, then save new
@@ -53512,9 +53634,17 @@ var ProvidersSection = function ProvidersSection(_ref) {
53512
53634
  }
53513
53635
 
53514
53636
  // Handle MCP provider editing via CustomMcpServerForm
53515
- function handleMcpEditSave(providerName, providerType, mcpCredentials, mcpConfig) {
53516
- var allowedTools = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
53637
+ function handleMcpEditSave() {
53638
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
53639
+ args[_key] = arguments[_key];
53640
+ }
53517
53641
  if (!dashApi || !appId) return;
53642
+ confirmRename(selectedName, args[0], function () {
53643
+ return saveMcpEdit.apply(void 0, args);
53644
+ });
53645
+ }
53646
+ function saveMcpEdit(providerName, providerType, mcpCredentials, mcpConfig) {
53647
+ var allowedTools = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
53518
53648
  var originalName = selectedName;
53519
53649
 
53520
53650
  // Delete old if name changed
@@ -53616,8 +53746,16 @@ var ProvidersSection = function ProvidersSection(_ref) {
53616
53746
  }
53617
53747
 
53618
53748
  // Handle WebSocket provider editing
53619
- function handleWsEditSave(providerName, wsConfig, wsCredentials) {
53749
+ function handleWsEditSave() {
53750
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
53751
+ args[_key2] = arguments[_key2];
53752
+ }
53620
53753
  if (!dashApi || !appId) return;
53754
+ confirmRename(selectedName, args[0], function () {
53755
+ return saveWsEdit.apply(void 0, args);
53756
+ });
53757
+ }
53758
+ function saveWsEdit(providerName, wsConfig, wsCredentials) {
53621
53759
  var originalName = selectedName;
53622
53760
 
53623
53761
  // Delete old if name changed
@@ -53999,20 +54137,37 @@ var ProvidersSection = function ProvidersSection(_ref) {
53999
54137
  }),
54000
54138
  list: listContent,
54001
54139
  detail: detailContent,
54002
- children: [/*#__PURE__*/jsxRuntime.jsx(DashReact.ConfirmationModal, {
54003
- isOpen: !!deleteTarget,
54140
+ children: [deleteTarget ? /*#__PURE__*/jsxRuntime.jsx(DashReact.ConfirmationModal, {
54141
+ isOpen: true,
54004
54142
  setIsOpen: function setIsOpen() {
54005
54143
  return setDeleteTarget(null);
54006
54144
  },
54007
- title: "Delete Provider",
54008
- message: "Are you sure you want to delete \"".concat(deleteTarget, "\"? This action cannot be undone."),
54145
+ title: "Delete ".concat(deleteTarget, "?"),
54146
+ message: providerDeleteMessage(deleteTarget, knownUsage(deleteTarget)),
54009
54147
  confirmLabel: "Delete",
54010
54148
  variant: "danger",
54011
54149
  onConfirm: handleConfirmDelete,
54012
54150
  onCancel: function onCancel() {
54013
54151
  return setDeleteTarget(null);
54014
54152
  }
54015
- }), /*#__PURE__*/jsxRuntime.jsx(ProviderUseDialog, {
54153
+ }) : null, renameConfirm ? /*#__PURE__*/jsxRuntime.jsx(DashReact.ConfirmationModal, {
54154
+ isOpen: true,
54155
+ setIsOpen: function setIsOpen() {
54156
+ return setRenameConfirm(null);
54157
+ },
54158
+ title: "Rename ".concat(renameConfirm.from, "?"),
54159
+ message: renameConfirm.message,
54160
+ confirmLabel: "Rename",
54161
+ variant: "danger",
54162
+ onConfirm: function onConfirm() {
54163
+ var save = renameConfirm.save;
54164
+ setRenameConfirm(null);
54165
+ save();
54166
+ },
54167
+ onCancel: function onCancel() {
54168
+ return setRenameConfirm(null);
54169
+ }
54170
+ }) : null, /*#__PURE__*/jsxRuntime.jsx(ProviderUseDialog, {
54016
54171
  isOpen: !!useTarget,
54017
54172
  model: useModel,
54018
54173
  onSave: saveProviderUse,