@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.esm.js CHANGED
@@ -47798,6 +47798,93 @@ function providerUsage(name, _ref2) {
47798
47798
  count: dashboards.length + usedBy.length
47799
47799
  };
47800
47800
  }
47801
+ var MAX_NAMES = 3;
47802
+ var plural$7 = function plural(n, word) {
47803
+ return "".concat(n, " ").concat(word).concat(n === 1 ? "" : "s");
47804
+ };
47805
+ var nameList = function nameList(names) {
47806
+ return names.length > MAX_NAMES ? "".concat(names.slice(0, MAX_NAMES).join(", "), " and ").concat(names.length - MAX_NAMES, " more") : names.join(", ");
47807
+ };
47808
+
47809
+ /** "1 dashboard (Sales) and 2 bots (Digest, Loose)", or "" when unused. */
47810
+ function providerUsedByText(usage) {
47811
+ var parts = [];
47812
+ var dashboards = usage && usage.dashboards || [];
47813
+ var bots = usage && usage.bots || [];
47814
+ if (dashboards.length) {
47815
+ parts.push("".concat(plural$7(dashboards.length, "dashboard"), " (").concat(nameList(dashboards.map(function (d) {
47816
+ return d.workspaceName;
47817
+ })), ")"));
47818
+ }
47819
+ if (bots.length) {
47820
+ parts.push("".concat(plural$7(bots.length, "bot"), " (").concat(nameList(bots.map(function (b) {
47821
+ return b.name;
47822
+ })), ")"));
47823
+ }
47824
+ return parts.join(" and ");
47825
+ }
47826
+
47827
+ // Who's affected, worded for one bot, one dashboard, or several.
47828
+ function affected(usage) {
47829
+ var dashboards = usage && usage.dashboards || [];
47830
+ var bots = usage && usage.bots || [];
47831
+ if (bots.length === 1 && !dashboards.length) {
47832
+ return {
47833
+ subject: "that bot",
47834
+ s: "s",
47835
+ them: "it"
47836
+ };
47837
+ }
47838
+ if (dashboards.length === 1 && !bots.length) {
47839
+ return {
47840
+ subject: "that dashboard's widgets",
47841
+ s: "",
47842
+ them: "them"
47843
+ };
47844
+ }
47845
+ return {
47846
+ subject: "they",
47847
+ s: "",
47848
+ them: "them"
47849
+ };
47850
+ }
47851
+
47852
+ /**
47853
+ * The Delete confirm (QA 2026-10-22: it never said what uses it). Null
47854
+ * usage = not known yet (bots still loading, or no dashboards given).
47855
+ */
47856
+ function providerDeleteMessage(name, usage) {
47857
+ if (!usage) {
47858
+ return "Widgets and bots that use ".concat(name, " will need another provider picked before they work again. This can't be undone.");
47859
+ }
47860
+ var usedBy = providerUsedByText(usage);
47861
+ if (!usedBy) return "Nothing uses ".concat(name, ". This can't be undone.");
47862
+ var _affected = affected(usage),
47863
+ subject = _affected.subject,
47864
+ s = _affected.s;
47865
+ var it = s ? "it" : "they";
47866
+ 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.");
47867
+ }
47868
+
47869
+ /**
47870
+ * The Rename confirm: widgets and bots find a provider by its name, so a
47871
+ * rename leaves them without it. Null when nothing uses it (no confirm);
47872
+ * null usage = not known yet, so it still asks.
47873
+ */
47874
+ function providerRenameMessage(from, to, usage) {
47875
+ if (!usage) {
47876
+ 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.");
47877
+ }
47878
+ var usedBy = providerUsedByText(usage);
47879
+ if (!usedBy) return null;
47880
+ var _affected2 = affected(usage),
47881
+ subject = _affected2.subject,
47882
+ s = _affected2.s,
47883
+ them = _affected2.them;
47884
+ var Subject = subject[0].toUpperCase() + subject.slice(1);
47885
+ var it = s ? "it" : "they";
47886
+ 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, ".");
47887
+ }
47801
47888
  var GROUPS$1 = [{
47802
47889
  cls: "mcp",
47803
47890
  label: "Tools (MCP)"
@@ -47911,6 +47998,12 @@ function useProviderStatus(_ref) {
47911
47998
  _useState6 = _slicedToArray(_useState5, 2),
47912
47999
  bots = _useState6[0],
47913
48000
  setBots = _useState6[1];
48001
+ // False until the bots list has loaded (and if it fails): until then, who
48002
+ // uses a provider isn't known.
48003
+ var _useState7 = useState(false),
48004
+ _useState8 = _slicedToArray(_useState7, 2),
48005
+ botsLoaded = _useState8[0],
48006
+ setBotsLoaded = _useState8[1];
47914
48007
  var mcpNames = useMemo(function () {
47915
48008
  return Object.entries(providers || {}).filter(function (_ref2) {
47916
48009
  var _ref3 = _slicedToArray(_ref2, 2),
@@ -47964,7 +48057,9 @@ function useProviderStatus(_ref) {
47964
48057
  var alive = true;
47965
48058
  var load = function load() {
47966
48059
  return Promise.resolve(api.list()).then(function (list) {
47967
- if (alive) setBots(Array.isArray(list) ? list : []);
48060
+ if (!alive) return;
48061
+ setBots(Array.isArray(list) ? list : []);
48062
+ setBotsLoaded(true);
47968
48063
  })["catch"](function () {});
47969
48064
  };
47970
48065
  load();
@@ -48011,9 +48106,10 @@ function useProviderStatus(_ref) {
48011
48106
  },
48012
48107
  // The bot definitions (Choose where to use… saves them).
48013
48108
  bots: bots,
48109
+ botsLoaded: botsLoaded,
48014
48110
  refresh: checkRunning
48015
48111
  };
48016
- }, [providers, running, catalog, workspaces, bots, bindingsFor, checkRunning]);
48112
+ }, [providers, running, catalog, workspaces, bots, botsLoaded, bindingsFor, checkRunning]);
48017
48113
  }
48018
48114
 
48019
48115
  /** How many providers need setup — the Providers item's left-nav dot. */
@@ -53199,7 +53295,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
53199
53295
  _ref$onCreateAcknowle = _ref.onCreateAcknowledged,
53200
53296
  onCreateAcknowledged = _ref$onCreateAcknowle === void 0 ? null : _ref$onCreateAcknowle,
53201
53297
  _ref$workspaces = _ref.workspaces,
53202
- workspaces = _ref$workspaces === void 0 ? [] : _ref$workspaces,
53298
+ workspacesProp = _ref$workspaces === void 0 ? null : _ref$workspaces,
53203
53299
  _ref$onOpenWorkspace = _ref.onOpenWorkspace,
53204
53300
  onOpenWorkspace = _ref$onOpenWorkspace === void 0 ? null : _ref$onOpenWorkspace,
53205
53301
  _ref$onOpenBotInBotsV = _ref.onOpenBotInBotsView,
@@ -53224,12 +53320,17 @@ var ProvidersSection = function ProvidersSection(_ref) {
53224
53320
  selectedBorder = _useConfigTokens.selectedBorder;
53225
53321
  // MCP catalog: authCommand / credentialSchema lookups and status.
53226
53322
  var catalog = useMcpCatalog(dashApi);
53323
+ var workspaces = workspacesProp || [];
53227
53324
  var status = useProviderStatus({
53228
53325
  providers: providers,
53229
53326
  workspaces: workspaces,
53230
53327
  dashApi: dashApi,
53231
53328
  catalog: catalog
53232
53329
  });
53330
+ // Who uses a provider, or null while that isn't known.
53331
+ var knownUsage = function knownUsage(name) {
53332
+ return workspacesProp && status.botsLoaded ? status.usageOf(name) : null;
53333
+ };
53233
53334
  var _useState = useState(false),
53234
53335
  _useState2 = _slicedToArray(_useState, 2),
53235
53336
  needsSetupOnly = _useState2[0],
@@ -53287,32 +53388,38 @@ var ProvidersSection = function ProvidersSection(_ref) {
53287
53388
  _useState22 = _slicedToArray(_useState21, 2),
53288
53389
  deleteTarget = _useState22[0],
53289
53390
  setDeleteTarget = _useState22[1];
53290
- var _useState23 = useState(false),
53391
+ // A rename of a provider something uses waits here for a confirm:
53392
+ // { from, to, message, save }.
53393
+ var _useState23 = useState(null),
53291
53394
  _useState24 = _slicedToArray(_useState23, 2),
53292
- isAddingMcp = _useState24[0],
53293
- setIsAddingMcp = _useState24[1];
53395
+ renameConfirm = _useState24[0],
53396
+ setRenameConfirm = _useState24[1];
53294
53397
  var _useState25 = useState(false),
53295
53398
  _useState26 = _slicedToArray(_useState25, 2),
53296
- isEditingMcp = _useState26[0],
53297
- setIsEditingMcp = _useState26[1];
53399
+ isAddingMcp = _useState26[0],
53400
+ setIsAddingMcp = _useState26[1];
53298
53401
  var _useState27 = useState(false),
53299
53402
  _useState28 = _slicedToArray(_useState27, 2),
53300
- isAddingWs = _useState28[0],
53301
- setIsAddingWs = _useState28[1];
53403
+ isEditingMcp = _useState28[0],
53404
+ setIsEditingMcp = _useState28[1];
53302
53405
  var _useState29 = useState(false),
53303
53406
  _useState30 = _slicedToArray(_useState29, 2),
53304
- isEditingWs = _useState30[0],
53305
- setIsEditingWs = _useState30[1];
53407
+ isAddingWs = _useState30[0],
53408
+ setIsAddingWs = _useState30[1];
53409
+ var _useState31 = useState(false),
53410
+ _useState32 = _slicedToArray(_useState31, 2),
53411
+ isEditingWs = _useState32[0],
53412
+ setIsEditingWs = _useState32[1];
53306
53413
  // NAV-015 "Choose where to use…": the provider whose dialog is open, and
53307
53414
  // the rows worked out when it opened (kept fixed while the user ticks).
53308
- var _useState31 = useState(null),
53309
- _useState32 = _slicedToArray(_useState31, 2),
53310
- useTarget = _useState32[0],
53311
- setUseTarget = _useState32[1];
53312
53415
  var _useState33 = useState(null),
53313
53416
  _useState34 = _slicedToArray(_useState33, 2),
53314
- useModel = _useState34[0],
53315
- setUseModel = _useState34[1];
53417
+ useTarget = _useState34[0],
53418
+ setUseTarget = _useState34[1];
53419
+ var _useState35 = useState(null),
53420
+ _useState36 = _slicedToArray(_useState35, 2),
53421
+ useModel = _useState36[0],
53422
+ setUseModel = _useState36[1];
53316
53423
  var openChooseWhereToUse = function openChooseWhereToUse(name) {
53317
53424
  setUseModel(providerUseModel({
53318
53425
  providerName: name,
@@ -53419,8 +53526,23 @@ var ProvidersSection = function ProvidersSection(_ref) {
53419
53526
  setIsEditingWs(false);
53420
53527
  }
53421
53528
  }
53529
+
53530
+ // Widgets and bots find a provider by name: renaming one that's in use
53531
+ // asks first (QA 2026-10-22).
53532
+ function confirmRename(from, to, save) {
53533
+ var message = from && to && from !== to ? providerRenameMessage(from, to, knownUsage(from)) : null;
53534
+ if (message) setRenameConfirm({
53535
+ from: from,
53536
+ to: to,
53537
+ message: message,
53538
+ save: save
53539
+ });else save();
53540
+ }
53422
53541
  function handleSaveEdit() {
53423
53542
  if (!formName.trim() || !dashApi || !appId) return;
53543
+ confirmRename(selectedName, formName.trim(), saveEdit);
53544
+ }
53545
+ function saveEdit() {
53424
53546
  var originalName = selectedName;
53425
53547
  var originalProvider = providers[originalName];
53426
53548
  // Delete old if name changed, then save new
@@ -53494,9 +53616,17 @@ var ProvidersSection = function ProvidersSection(_ref) {
53494
53616
  }
53495
53617
 
53496
53618
  // Handle MCP provider editing via CustomMcpServerForm
53497
- function handleMcpEditSave(providerName, providerType, mcpCredentials, mcpConfig) {
53498
- var allowedTools = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
53619
+ function handleMcpEditSave() {
53620
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
53621
+ args[_key] = arguments[_key];
53622
+ }
53499
53623
  if (!dashApi || !appId) return;
53624
+ confirmRename(selectedName, args[0], function () {
53625
+ return saveMcpEdit.apply(void 0, args);
53626
+ });
53627
+ }
53628
+ function saveMcpEdit(providerName, providerType, mcpCredentials, mcpConfig) {
53629
+ var allowedTools = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
53500
53630
  var originalName = selectedName;
53501
53631
 
53502
53632
  // Delete old if name changed
@@ -53598,8 +53728,16 @@ var ProvidersSection = function ProvidersSection(_ref) {
53598
53728
  }
53599
53729
 
53600
53730
  // Handle WebSocket provider editing
53601
- function handleWsEditSave(providerName, wsConfig, wsCredentials) {
53731
+ function handleWsEditSave() {
53732
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
53733
+ args[_key2] = arguments[_key2];
53734
+ }
53602
53735
  if (!dashApi || !appId) return;
53736
+ confirmRename(selectedName, args[0], function () {
53737
+ return saveWsEdit.apply(void 0, args);
53738
+ });
53739
+ }
53740
+ function saveWsEdit(providerName, wsConfig, wsCredentials) {
53603
53741
  var originalName = selectedName;
53604
53742
 
53605
53743
  // Delete old if name changed
@@ -53981,20 +54119,37 @@ var ProvidersSection = function ProvidersSection(_ref) {
53981
54119
  }),
53982
54120
  list: listContent,
53983
54121
  detail: detailContent,
53984
- children: [/*#__PURE__*/jsx(ConfirmationModal, {
53985
- isOpen: !!deleteTarget,
54122
+ children: [deleteTarget ? /*#__PURE__*/jsx(ConfirmationModal, {
54123
+ isOpen: true,
53986
54124
  setIsOpen: function setIsOpen() {
53987
54125
  return setDeleteTarget(null);
53988
54126
  },
53989
- title: "Delete Provider",
53990
- message: "Are you sure you want to delete \"".concat(deleteTarget, "\"? This action cannot be undone."),
54127
+ title: "Delete ".concat(deleteTarget, "?"),
54128
+ message: providerDeleteMessage(deleteTarget, knownUsage(deleteTarget)),
53991
54129
  confirmLabel: "Delete",
53992
54130
  variant: "danger",
53993
54131
  onConfirm: handleConfirmDelete,
53994
54132
  onCancel: function onCancel() {
53995
54133
  return setDeleteTarget(null);
53996
54134
  }
53997
- }), /*#__PURE__*/jsx(ProviderUseDialog, {
54135
+ }) : null, renameConfirm ? /*#__PURE__*/jsx(ConfirmationModal, {
54136
+ isOpen: true,
54137
+ setIsOpen: function setIsOpen() {
54138
+ return setRenameConfirm(null);
54139
+ },
54140
+ title: "Rename ".concat(renameConfirm.from, "?"),
54141
+ message: renameConfirm.message,
54142
+ confirmLabel: "Rename",
54143
+ variant: "danger",
54144
+ onConfirm: function onConfirm() {
54145
+ var save = renameConfirm.save;
54146
+ setRenameConfirm(null);
54147
+ save();
54148
+ },
54149
+ onCancel: function onCancel() {
54150
+ return setRenameConfirm(null);
54151
+ }
54152
+ }) : null, /*#__PURE__*/jsx(ProviderUseDialog, {
53998
54153
  isOpen: !!useTarget,
53999
54154
  model: useModel,
54000
54155
  onSave: saveProviderUse,