@trops/dash-core 0.1.61 → 0.1.63

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
@@ -1161,12 +1161,13 @@ var ElectronDashboardApi = /*#__PURE__*/function () {
1161
1161
  if (this.api !== null) {
1162
1162
  try {
1163
1163
  // Handle the promise returned by the IPC call
1164
- // Note: providerData should contain providerType, credentials, and optionally providerClass/mcpConfig
1164
+ // Note: providerData should contain providerType, credentials, and optionally providerClass/mcpConfig/allowedTools
1165
1165
  var providerType = providerData.providerType,
1166
1166
  credentials = providerData.credentials,
1167
1167
  providerClass = providerData.providerClass,
1168
- mcpConfig = providerData.mcpConfig;
1169
- this.api.providers.saveProvider(appId, providerName, providerType, credentials, providerClass, mcpConfig).then(function (result) {
1168
+ mcpConfig = providerData.mcpConfig,
1169
+ allowedTools = providerData.allowedTools;
1170
+ this.api.providers.saveProvider(appId, providerName, providerType, credentials, providerClass, mcpConfig, allowedTools).then(function (result) {
1170
1171
  onSuccess(_this12.events.PROVIDER_SAVE_COMPLETE, result);
1171
1172
  })["catch"](function (error) {
1172
1173
  onError(_this12.events.PROVIDER_SAVE_ERROR, error);
@@ -2689,9 +2690,9 @@ var LayoutContainer = function LayoutContainer(_ref) {
2689
2690
 
2690
2691
  function ownKeys$v(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2691
2692
  function _objectSpread$v(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$v(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$v(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2692
- function _createForOfIteratorHelper$9(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$9(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
2693
- function _unsupportedIterableToArray$9(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$9(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$9(r, a) : void 0; } }
2694
- function _arrayLikeToArray$9(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
2693
+ function _createForOfIteratorHelper$a(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$a(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
2694
+ function _unsupportedIterableToArray$a(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$a(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$a(r, a) : void 0; } }
2695
+ function _arrayLikeToArray$a(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
2695
2696
  /**
2696
2697
  * Layout template definitions for the dashboard template picker.
2697
2698
  *
@@ -2927,7 +2928,7 @@ function createLayoutFromTemplate(template) {
2927
2928
  cols: template.cols,
2928
2929
  gap: "gap-2"
2929
2930
  };
2930
- var _iterator = _createForOfIteratorHelper$9(template.cells),
2931
+ var _iterator = _createForOfIteratorHelper$a(template.cells),
2931
2932
  _step;
2932
2933
  try {
2933
2934
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -4439,9 +4440,9 @@ var PanelEditItem = function PanelEditItem(_ref) {
4439
4440
  };
4440
4441
 
4441
4442
  var _excluded$5 = ["rows", "cols"];
4442
- function _createForOfIteratorHelper$8(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$8(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
4443
- function _unsupportedIterableToArray$8(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$8(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$8(r, a) : void 0; } }
4444
- function _arrayLikeToArray$8(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
4443
+ function _createForOfIteratorHelper$9(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$9(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
4444
+ function _unsupportedIterableToArray$9(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$9(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$9(r, a) : void 0; } }
4445
+ function _arrayLikeToArray$9(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
4445
4446
  function ownKeys$t(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4446
4447
  function _objectSpread$t(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$t(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$t(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4447
4448
  var defaultGrid = {
@@ -4594,7 +4595,7 @@ function GridEditor(_ref) {
4594
4595
  function sortObjectByKeys(obj) {
4595
4596
  var sortedKeys = Object.keys(obj).sort();
4596
4597
  var sortedObj = {};
4597
- var _iterator = _createForOfIteratorHelper$8(sortedKeys),
4598
+ var _iterator = _createForOfIteratorHelper$9(sortedKeys),
4598
4599
  _step;
4599
4600
  try {
4600
4601
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -7318,9 +7319,9 @@ var ProviderForm = function ProviderForm(_ref) {
7318
7319
  });
7319
7320
  };
7320
7321
 
7321
- function _createForOfIteratorHelper$7(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$7(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
7322
- function _unsupportedIterableToArray$7(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$7(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$7(r, a) : void 0; } }
7323
- function _arrayLikeToArray$7(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
7322
+ function _createForOfIteratorHelper$8(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$8(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
7323
+ function _unsupportedIterableToArray$8(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$8(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$8(r, a) : void 0; } }
7324
+ function _arrayLikeToArray$8(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
7324
7325
  function ownKeys$r(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7325
7326
  function _objectSpread$r(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$r(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$r(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7326
7327
  var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
@@ -7529,11 +7530,11 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7529
7530
 
7530
7531
  // Flatten all widgets from all packages for the widget list
7531
7532
  flatWidgets = [];
7532
- _iterator = _createForOfIteratorHelper$7(result.packages || []);
7533
+ _iterator = _createForOfIteratorHelper$8(result.packages || []);
7533
7534
  try {
7534
7535
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
7535
7536
  pkg = _step.value;
7536
- _iterator2 = _createForOfIteratorHelper$7(pkg.widgets || []);
7537
+ _iterator2 = _createForOfIteratorHelper$8(pkg.widgets || []);
7537
7538
  try {
7538
7539
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
7539
7540
  widget = _step2.value;
@@ -8699,9 +8700,9 @@ var ProviderBadge = function ProviderBadge(_ref) {
8699
8700
  });
8700
8701
  };
8701
8702
 
8702
- function _createForOfIteratorHelper$6(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$6(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
8703
- function _unsupportedIterableToArray$6(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$6(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$6(r, a) : void 0; } }
8704
- function _arrayLikeToArray$6(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
8703
+ function _createForOfIteratorHelper$7(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$7(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
8704
+ function _unsupportedIterableToArray$7(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$7(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$7(r, a) : void 0; } }
8705
+ function _arrayLikeToArray$7(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
8705
8706
  var WidgetCardHeader = function WidgetCardHeader(_ref) {
8706
8707
  var item = _ref.item,
8707
8708
  widget = _ref.widget,
@@ -8745,7 +8746,7 @@ var WidgetCardHeader = function WidgetCardHeader(_ref) {
8745
8746
  var el = headerRef.current;
8746
8747
  if (!el) return;
8747
8748
  var observer = new ResizeObserver(function (entries) {
8748
- var _iterator = _createForOfIteratorHelper$6(entries),
8749
+ var _iterator = _createForOfIteratorHelper$7(entries),
8749
8750
  _step;
8750
8751
  try {
8751
8752
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -13658,9 +13659,9 @@ var ExternalWidget = function ExternalWidget(_ref) {
13658
13659
  var GRID_CELL_WIDGET_TYPE = "grid-cell-widget";
13659
13660
  var SIDEBAR_WIDGET_TYPE = "sidebar-widget";
13660
13661
 
13661
- function _createForOfIteratorHelper$5(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$5(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
13662
- function _unsupportedIterableToArray$5(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$5(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$5(r, a) : void 0; } }
13663
- function _arrayLikeToArray$5(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
13662
+ function _createForOfIteratorHelper$6(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$6(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
13663
+ function _unsupportedIterableToArray$6(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$6(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$6(r, a) : void 0; } }
13664
+ function _arrayLikeToArray$6(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
13664
13665
  function ownKeys$j(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13665
13666
  function _objectSpread$j(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$j(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$j(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13666
13667
  var DraggableCellBody = function DraggableCellBody(_ref) {
@@ -14008,7 +14009,7 @@ var LayoutGridContainer = /*#__PURE__*/memo(function (_ref3) {
14008
14009
  return selectable["delete"](cn);
14009
14010
  });
14010
14011
  var resolved = new Set();
14011
- var _iterator = _createForOfIteratorHelper$5(selectable),
14012
+ var _iterator = _createForOfIteratorHelper$6(selectable),
14012
14013
  _step;
14013
14014
  try {
14014
14015
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -16114,9 +16115,9 @@ function isWidgetResolvable(componentKey) {
16114
16115
 
16115
16116
  function ownKeys$i(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
16116
16117
  function _objectSpread$i(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$i(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$i(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16117
- function _createForOfIteratorHelper$4(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$4(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
16118
- function _unsupportedIterableToArray$4(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$4(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$4(r, a) : void 0; } }
16119
- function _arrayLikeToArray$4(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
16118
+ function _createForOfIteratorHelper$5(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$5(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
16119
+ function _unsupportedIterableToArray$5(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$5(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$5(r, a) : void 0; } }
16120
+ function _arrayLikeToArray$5(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
16120
16121
  /**
16121
16122
  * The model for all layout components used primarily in the renderLayout method
16122
16123
  * @param {Object} layoutItem an object containing various attributes of the layout item
@@ -16128,7 +16129,7 @@ function _arrayLikeToArray$4(r, a) { (null == a || a > r.length) && (a = r.lengt
16128
16129
  function sortObjectByKeys(obj) {
16129
16130
  var sortedKeys = Object.keys(obj).sort();
16130
16131
  var sortedObj = {};
16131
- var _iterator = _createForOfIteratorHelper$4(sortedKeys),
16132
+ var _iterator = _createForOfIteratorHelper$5(sortedKeys),
16132
16133
  _step;
16133
16134
  try {
16134
16135
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -19302,9 +19303,9 @@ var useDashboard = function useDashboard() {
19302
19303
  });
19303
19304
  };
19304
19305
 
19305
- function _createForOfIteratorHelper$3(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$3(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
19306
- function _unsupportedIterableToArray$3(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$3(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$3(r, a) : void 0; } }
19307
- function _arrayLikeToArray$3(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
19306
+ function _createForOfIteratorHelper$4(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$4(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
19307
+ function _unsupportedIterableToArray$4(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$4(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$4(r, a) : void 0; } }
19308
+ function _arrayLikeToArray$4(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
19308
19309
 
19309
19310
  /**
19310
19311
  * useWidgetProviders Hook
@@ -19355,7 +19356,7 @@ var useWidgetProviders = function useWidgetProviders() {
19355
19356
  // 1. Widget-level: stored directly on the layout item by handleSelectProvider
19356
19357
  // 2. Workspace-level: stored as workspace.selectedProviders[widgetId][providerType]
19357
19358
  var providers = {};
19358
- var _iterator = _createForOfIteratorHelper$3(providerDeclarations),
19359
+ var _iterator = _createForOfIteratorHelper$4(providerDeclarations),
19359
19360
  _step;
19360
19361
  try {
19361
19362
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -19482,15 +19483,8 @@ var useMcpProvider = function useMcpProvider(providerType) {
19482
19483
  var mountedRef = useRef(true);
19483
19484
  var dashApi = app === null || app === void 0 ? void 0 : app.dashApi;
19484
19485
 
19485
- // Get the widget's allowed tools from its provider declaration
19486
+ // Get the widget data and compute effective allowed tools
19486
19487
  var widgetData = widgetContext === null || widgetContext === void 0 ? void 0 : widgetContext.widgetData;
19487
- var allowedTools = function () {
19488
- if (!(widgetData !== null && widgetData !== void 0 && widgetData.providers)) return null;
19489
- var mcpProvider = widgetData.providers.find(function (p) {
19490
- return p.type === providerType && p.providerClass === "mcp";
19491
- });
19492
- return (mcpProvider === null || mcpProvider === void 0 ? void 0 : mcpProvider.allowedTools) || null;
19493
- }();
19494
19488
 
19495
19489
  // Get the selected MCP provider for this widget
19496
19490
  // First check widget-level selectedProviders (set by handleSelectProvider on the layout item),
@@ -19513,16 +19507,37 @@ var useMcpProvider = function useMcpProvider(providerType) {
19513
19507
  // issue where providers don't flow through from AppWrapper)
19514
19508
  var provider = selectedProviderName ? app === null || app === void 0 || (_app$providers = app.providers) === null || _app$providers === void 0 ? void 0 : _app$providers[selectedProviderName] : null;
19515
19509
 
19510
+ // Merge widget-declared allowedTools with user-configured allowedTools (intersection)
19511
+ var effectiveAllowedTools = function () {
19512
+ // Widget-declared (from .dash.js providers[].allowedTools)
19513
+ var widgetAllowed = function () {
19514
+ if (!(widgetData !== null && widgetData !== void 0 && widgetData.providers)) return null;
19515
+ var p = widgetData.providers.find(function (p) {
19516
+ return p.type === providerType && p.providerClass === "mcp";
19517
+ });
19518
+ return (p === null || p === void 0 ? void 0 : p.allowedTools) || null;
19519
+ }();
19520
+ // User-configured (from saved provider object)
19521
+ var userAllowed = (provider === null || provider === void 0 ? void 0 : provider.allowedTools) || null;
19522
+ // Intersection
19523
+ if (!widgetAllowed && !userAllowed) return null;
19524
+ if (!widgetAllowed) return userAllowed;
19525
+ if (!userAllowed) return widgetAllowed;
19526
+ return widgetAllowed.filter(function (t) {
19527
+ return userAllowed.includes(t);
19528
+ });
19529
+ }();
19530
+
19516
19531
  /**
19517
19532
  * Apply connection result to this hook instance's local state.
19518
- * Filters tools by allowedTools if specified.
19533
+ * Filters tools by effectiveAllowedTools if specified.
19519
19534
  */
19520
19535
  var applyResult = useCallback(function (result) {
19521
19536
  if (!mountedRef.current) return;
19522
19537
  var serverTools = result.tools || [];
19523
- if (allowedTools) {
19538
+ if (effectiveAllowedTools) {
19524
19539
  serverTools = serverTools.filter(function (tool) {
19525
- return allowedTools.includes(tool.name);
19540
+ return effectiveAllowedTools.includes(tool.name);
19526
19541
  });
19527
19542
  }
19528
19543
  setTools(serverTools);
@@ -19531,7 +19546,7 @@ var useMcpProvider = function useMcpProvider(providerType) {
19531
19546
  setIsConnecting(false);
19532
19547
  setStatus("connected");
19533
19548
  connectedRef.current = true;
19534
- }, [allowedTools]);
19549
+ }, [effectiveAllowedTools]);
19535
19550
 
19536
19551
  /**
19537
19552
  * Connect to the MCP server.
@@ -19788,6 +19803,8 @@ var useMcpProvider = function useMcpProvider(providerType) {
19788
19803
  var callTool = useCallback(/*#__PURE__*/function () {
19789
19804
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(toolName) {
19790
19805
  var args,
19806
+ widgetRequiredTools,
19807
+ isRequired,
19791
19808
  _args3 = arguments;
19792
19809
  return _regeneratorRuntime.wrap(function (_context3) {
19793
19810
  while (1) switch (_context3.prev = _context3.next) {
@@ -19799,17 +19816,26 @@ var useMcpProvider = function useMcpProvider(providerType) {
19799
19816
  }
19800
19817
  throw new Error("MCP server not connected");
19801
19818
  case 1:
19802
- if (!(allowedTools && !allowedTools.includes(toolName))) {
19819
+ if (!(effectiveAllowedTools && !effectiveAllowedTools.includes(toolName))) {
19803
19820
  _context3.next = 2;
19804
19821
  break;
19805
19822
  }
19806
- throw new Error("Tool \"".concat(toolName, "\" is not allowed for this widget. Allowed tools: ").concat(allowedTools.join(", ")));
19823
+ // Provide enhanced error if the tool is in widget's requiredTools
19824
+ widgetRequiredTools = function () {
19825
+ if (!(widgetData !== null && widgetData !== void 0 && widgetData.providers)) return null;
19826
+ var p = widgetData.providers.find(function (p) {
19827
+ return p.type === providerType && p.providerClass === "mcp";
19828
+ });
19829
+ return (p === null || p === void 0 ? void 0 : p.requiredTools) || null;
19830
+ }();
19831
+ isRequired = widgetRequiredTools === null || widgetRequiredTools === void 0 ? void 0 : widgetRequiredTools.includes(toolName);
19832
+ throw new Error("Tool \"".concat(toolName, "\" is not allowed for this widget. Allowed tools: ").concat(effectiveAllowedTools.join(", ")).concat(isRequired ? ". Note: \"".concat(toolName, "\" is declared as a required tool by this widget \u2014 update the provider's allowed tools in Settings \u2192 Providers.") : ""));
19807
19833
  case 2:
19808
19834
  return _context3.abrupt("return", new Promise(function (resolve, reject) {
19809
19835
  var timeout = setTimeout(function () {
19810
19836
  reject(new Error("Tool call \"".concat(toolName, "\" timed out after 30s")));
19811
19837
  }, 30000);
19812
- dashApi.mcpCallTool(selectedProviderName, toolName, args, allowedTools, function (event, result) {
19838
+ dashApi.mcpCallTool(selectedProviderName, toolName, args, effectiveAllowedTools, function (event, result) {
19813
19839
  clearTimeout(timeout);
19814
19840
  if (result.error) {
19815
19841
  reject(new Error(result.message));
@@ -19830,7 +19856,7 @@ var useMcpProvider = function useMcpProvider(providerType) {
19830
19856
  return function (_x) {
19831
19857
  return _ref3.apply(this, arguments);
19832
19858
  };
19833
- }(), [dashApi, selectedProviderName, allowedTools]);
19859
+ }(), [dashApi, selectedProviderName, effectiveAllowedTools, widgetData, providerType]);
19834
19860
 
19835
19861
  /**
19836
19862
  * Read a resource from the MCP server
@@ -22185,9 +22211,9 @@ var resolveIcon = function resolveIcon(iconName) {
22185
22211
  return FALLBACK;
22186
22212
  };
22187
22213
 
22188
- function _createForOfIteratorHelper$2(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$2(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
22189
- function _unsupportedIterableToArray$2(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$2(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$2(r, a) : void 0; } }
22190
- function _arrayLikeToArray$2(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
22214
+ function _createForOfIteratorHelper$3(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$3(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
22215
+ function _unsupportedIterableToArray$3(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$3(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$3(r, a) : void 0; } }
22216
+ function _arrayLikeToArray$3(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
22191
22217
  /**
22192
22218
  * Validation utilities for grid-first dashboard architecture
22193
22219
  *
@@ -22426,7 +22452,7 @@ var validateCellMerge = function validateCellMerge(cellNumbers, grid) {
22426
22452
 
22427
22453
  // Validate each cell
22428
22454
  var cells = [];
22429
- var _iterator = _createForOfIteratorHelper$2(cellNumbers),
22455
+ var _iterator = _createForOfIteratorHelper$3(cellNumbers),
22430
22456
  _step;
22431
22457
  try {
22432
22458
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -25928,6 +25954,82 @@ var FoldersSection = function FoldersSection(_ref) {
25928
25954
  });
25929
25955
  };
25930
25956
 
25957
+ var ToolSelector = function ToolSelector(_ref) {
25958
+ var _ref$tools = _ref.tools,
25959
+ tools = _ref$tools === void 0 ? [] : _ref$tools,
25960
+ _ref$selectedTools = _ref.selectedTools,
25961
+ selectedTools = _ref$selectedTools === void 0 ? [] : _ref$selectedTools,
25962
+ onSelectionChange = _ref.onSelectionChange;
25963
+ if (!tools || tools.length === 0) return null;
25964
+ var allSelected = selectedTools.length === tools.length;
25965
+ var handleToggleAll = function handleToggleAll() {
25966
+ if (allSelected) {
25967
+ onSelectionChange([]);
25968
+ } else {
25969
+ onSelectionChange(tools.map(function (t) {
25970
+ return t.name;
25971
+ }));
25972
+ }
25973
+ };
25974
+ var handleToggle = function handleToggle(toolName) {
25975
+ if (selectedTools.includes(toolName)) {
25976
+ onSelectionChange(selectedTools.filter(function (t) {
25977
+ return t !== toolName;
25978
+ }));
25979
+ } else {
25980
+ onSelectionChange([].concat(_toConsumableArray(selectedTools), [toolName]));
25981
+ }
25982
+ };
25983
+ return /*#__PURE__*/jsxs("div", {
25984
+ className: "space-y-2",
25985
+ children: [/*#__PURE__*/jsxs("div", {
25986
+ className: "flex items-center justify-between",
25987
+ children: [/*#__PURE__*/jsx("p", {
25988
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
25989
+ children: "Allowed Tools"
25990
+ }), /*#__PURE__*/jsx("button", {
25991
+ onClick: handleToggleAll,
25992
+ className: "text-xs text-blue-400 hover:text-blue-300 transition-colors",
25993
+ children: allSelected ? "Deselect All" : "Select All"
25994
+ })]
25995
+ }), /*#__PURE__*/jsx("p", {
25996
+ className: "text-sm opacity-50",
25997
+ children: "Choose which tools this provider can expose to widgets"
25998
+ }), /*#__PURE__*/jsx("div", {
25999
+ className: "space-y-1 max-h-64 overflow-y-auto",
26000
+ children: tools.map(function (tool) {
26001
+ var checked = selectedTools.includes(tool.name);
26002
+ return /*#__PURE__*/jsxs("label", {
26003
+ className: "flex items-start gap-2 p-1.5 rounded hover:bg-white/5 cursor-pointer",
26004
+ children: [/*#__PURE__*/jsx("input", {
26005
+ type: "checkbox",
26006
+ checked: checked,
26007
+ onChange: function onChange() {
26008
+ return handleToggle(tool.name);
26009
+ },
26010
+ className: "mt-0.5 rounded border-white/20 bg-white/5 text-blue-500 focus:ring-blue-500/30"
26011
+ }), /*#__PURE__*/jsxs("div", {
26012
+ className: "flex-1 min-w-0",
26013
+ children: [/*#__PURE__*/jsx("span", {
26014
+ className: "text-xs font-mono",
26015
+ children: tool.name
26016
+ }), tool.description && /*#__PURE__*/jsxs("span", {
26017
+ className: "text-xs opacity-50 ml-2",
26018
+ children: ["\u2014 ", tool.description]
26019
+ })]
26020
+ })]
26021
+ }, tool.name);
26022
+ })
26023
+ }), /*#__PURE__*/jsxs("p", {
26024
+ className: "text-xs opacity-40",
26025
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
26026
+ icon: "shield-halved",
26027
+ className: "mr-1"
26028
+ }), selectedTools.length, " of ", tools.length, " tools selected"]
26029
+ })]
26030
+ });
26031
+ };
26032
+
25931
26033
  function ownKeys$6(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25932
26034
  function _objectSpread$6(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$6(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$6(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25933
26035
  var ProviderDetail = function ProviderDetail(_ref) {
@@ -25954,6 +26056,7 @@ var ProviderDetail = function ProviderDetail(_ref) {
25954
26056
  onStartEdit = _ref.onStartEdit,
25955
26057
  onCreate = _ref.onCreate,
25956
26058
  onDelete = _ref.onDelete,
26059
+ onSaveAllowedTools = _ref.onSaveAllowedTools,
25957
26060
  _ref$catalogAuthComma = _ref.catalogAuthCommand,
25958
26061
  catalogAuthCommand = _ref$catalogAuthComma === void 0 ? null : _ref$catalogAuthComma;
25959
26062
  var appContext = useContext(AppContext);
@@ -25969,16 +26072,20 @@ var ProviderDetail = function ProviderDetail(_ref) {
25969
26072
  _useState4 = _slicedToArray(_useState3, 2),
25970
26073
  testResult = _useState4[0],
25971
26074
  setTestResult = _useState4[1];
26075
+ var _useState5 = useState(null),
26076
+ _useState6 = _slicedToArray(_useState5, 2),
26077
+ selectedTools = _useState6[0],
26078
+ setSelectedTools = _useState6[1];
25972
26079
 
25973
26080
  // MCP auth state
25974
- var _useState5 = useState(false),
25975
- _useState6 = _slicedToArray(_useState5, 2),
25976
- isAuthorizing = _useState6[0],
25977
- setIsAuthorizing = _useState6[1];
25978
- var _useState7 = useState(null),
26081
+ var _useState7 = useState(false),
25979
26082
  _useState8 = _slicedToArray(_useState7, 2),
25980
- authResult = _useState8[0],
25981
- setAuthResult = _useState8[1];
26083
+ isAuthorizing = _useState8[0],
26084
+ setIsAuthorizing = _useState8[1];
26085
+ var _useState9 = useState(null),
26086
+ _useState0 = _slicedToArray(_useState9, 2),
26087
+ authResult = _useState0[0],
26088
+ setAuthResult = _useState0[1];
25982
26089
 
25983
26090
  // Resolve authCommand: provider.mcpConfig.authCommand > catalogAuthCommand prop
25984
26091
  var resolvedAuthCommand = (provider === null || provider === void 0 || (_provider$mcpConfig = provider.mcpConfig) === null || _provider$mcpConfig === void 0 ? void 0 : _provider$mcpConfig.authCommand) || catalogAuthCommand || null;
@@ -25996,14 +26103,14 @@ var ProviderDetail = function ProviderDetail(_ref) {
25996
26103
  }, [isMcp, provider]);
25997
26104
 
25998
26105
  // Dynamic credential fields for create mode
25999
- var _useState9 = useState(isCreating ? [{
26106
+ var _useState1 = useState(isCreating ? [{
26000
26107
  id: "default_apiKey",
26001
26108
  key: "apiKey",
26002
26109
  secret: true
26003
26110
  }] : []),
26004
- _useState0 = _slicedToArray(_useState9, 2),
26005
- credentialFields = _useState0[0],
26006
- setCredentialFields = _useState0[1];
26111
+ _useState10 = _slicedToArray(_useState1, 2),
26112
+ credentialFields = _useState10[0],
26113
+ setCredentialFields = _useState10[1];
26007
26114
  var fieldIdRef = useRef(0);
26008
26115
  var handleFieldKeyChange = function handleFieldKeyChange(id, newKey) {
26009
26116
  setCredentialFields(function (prev) {
@@ -26095,6 +26202,18 @@ var ProviderDetail = function ProviderDetail(_ref) {
26095
26202
  message: "Connected! Found ".concat((result.tools || []).length, " tools.")
26096
26203
  });
26097
26204
 
26205
+ // Pre-select: intersect with existing allowedTools, or select all
26206
+ var allToolNames = (result.tools || []).map(function (t) {
26207
+ return t.name;
26208
+ });
26209
+ if (provider !== null && provider !== void 0 && provider.allowedTools) {
26210
+ setSelectedTools(allToolNames.filter(function (t) {
26211
+ return provider.allowedTools.includes(t);
26212
+ }));
26213
+ } else {
26214
+ setSelectedTools(allToolNames);
26215
+ }
26216
+
26098
26217
  // Stop after test
26099
26218
  dashApi.mcpStopServer(providerName, function () {}, function () {});
26100
26219
  setIsTesting(false);
@@ -26453,29 +26572,36 @@ var ProviderDetail = function ProviderDetail(_ref) {
26453
26572
  children: authResult.message
26454
26573
  })]
26455
26574
  })
26456
- }), testResult && /*#__PURE__*/jsxs("div", {
26575
+ }), testResult && /*#__PURE__*/jsx("div", {
26457
26576
  className: "p-3 rounded-lg text-sm ".concat(testResult.success ? "bg-green-900/30 border border-green-700 text-green-300" : "bg-red-900/30 border border-red-700 text-red-300"),
26458
- children: [/*#__PURE__*/jsxs("div", {
26577
+ children: /*#__PURE__*/jsxs("div", {
26459
26578
  className: "flex items-center gap-2",
26460
26579
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
26461
26580
  icon: testResult.success ? "circle-check" : "circle-exclamation"
26462
26581
  }), /*#__PURE__*/jsx("span", {
26463
26582
  children: testResult.message
26464
26583
  })]
26465
- }), testResult.success && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && /*#__PURE__*/jsx("div", {
26466
- className: "mt-2 ml-6 space-y-1",
26467
- children: testResult.tools.map(function (tool) {
26468
- return /*#__PURE__*/jsxs("div", {
26469
- className: "text-xs",
26470
- children: [/*#__PURE__*/jsx("span", {
26471
- className: "font-mono",
26472
- children: tool.name
26473
- }), tool.description && /*#__PURE__*/jsxs("span", {
26474
- className: "opacity-60 ml-2",
26475
- children: ["- ", tool.description]
26476
- })]
26477
- }, tool.name);
26584
+ })
26585
+ }), (testResult === null || testResult === void 0 ? void 0 : testResult.success) && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && selectedTools && /*#__PURE__*/jsx(ToolSelector, {
26586
+ tools: testResult.tools,
26587
+ selectedTools: selectedTools,
26588
+ onSelectionChange: setSelectedTools
26589
+ }), !testResult && (provider === null || provider === void 0 ? void 0 : provider.allowedTools) && provider.allowedTools.length > 0 && /*#__PURE__*/jsxs("div", {
26590
+ className: "space-y-2",
26591
+ children: [/*#__PURE__*/jsx("p", {
26592
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26593
+ children: "Allowed Tools"
26594
+ }), /*#__PURE__*/jsx("div", {
26595
+ className: "flex flex-wrap gap-1",
26596
+ children: provider.allowedTools.map(function (tool) {
26597
+ return /*#__PURE__*/jsx("span", {
26598
+ className: "text-xs font-mono px-2 py-0.5 rounded bg-white/5 opacity-70",
26599
+ children: tool
26600
+ }, tool);
26478
26601
  })
26602
+ }), /*#__PURE__*/jsxs("p", {
26603
+ className: "text-xs opacity-40",
26604
+ children: [provider.allowedTools.length, " tool", provider.allowedTools.length !== 1 ? "s" : "", " allowed \u2014 test connection to modify"]
26479
26605
  })]
26480
26606
  })]
26481
26607
  })]
@@ -26489,6 +26615,12 @@ var ProviderDetail = function ProviderDetail(_ref) {
26489
26615
  title: isTesting ? "Testing..." : "Test Connection",
26490
26616
  onClick: handleTestConnection,
26491
26617
  size: "sm"
26618
+ }), isMcp && selectedTools && onSaveAllowedTools && /*#__PURE__*/jsx(Button, {
26619
+ title: "Update Allowed Tools",
26620
+ onClick: function onClick() {
26621
+ return onSaveAllowedTools(providerName, selectedTools);
26622
+ },
26623
+ size: "sm"
26492
26624
  }), /*#__PURE__*/jsx(Button, {
26493
26625
  title: "Edit",
26494
26626
  onClick: function onClick() {
@@ -26602,7 +26734,9 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26602
26734
  _ref2$initialHeaderRo = _ref2.initialHeaderRows,
26603
26735
  initialHeaderRows = _ref2$initialHeaderRo === void 0 ? [] : _ref2$initialHeaderRo,
26604
26736
  _ref2$initialCredenti2 = _ref2.initialCredentials,
26605
- initialCredentials = _ref2$initialCredenti2 === void 0 ? {} : _ref2$initialCredenti2;
26737
+ initialCredentials = _ref2$initialCredenti2 === void 0 ? {} : _ref2$initialCredenti2,
26738
+ _ref2$initialAllowedT = _ref2.initialAllowedTools,
26739
+ initialAllowedTools = _ref2$initialAllowedT === void 0 ? null : _ref2$initialAllowedT;
26606
26740
  var appContext = useContext(AppContext);
26607
26741
  var dashApi = appContext === null || appContext === void 0 ? void 0 : appContext.dashApi;
26608
26742
 
@@ -26658,19 +26792,25 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26658
26792
  headerRows = _useState20[0],
26659
26793
  setHeaderRows = _useState20[1];
26660
26794
 
26661
- // JSON editor state
26662
- var _useState21 = useState("form"),
26795
+ // Tool selection state
26796
+ var _useState21 = useState(initialAllowedTools),
26663
26797
  _useState22 = _slicedToArray(_useState21, 2),
26664
- viewMode = _useState22[0],
26665
- setViewMode = _useState22[1]; // "form" | "json"
26666
- var _useState23 = useState(""),
26798
+ selectedTools = _useState22[0],
26799
+ setSelectedTools = _useState22[1];
26800
+
26801
+ // JSON editor state
26802
+ var _useState23 = useState("form"),
26667
26803
  _useState24 = _slicedToArray(_useState23, 2),
26668
- jsonText = _useState24[0],
26669
- setJsonText = _useState24[1];
26670
- var _useState25 = useState(null),
26804
+ viewMode = _useState24[0],
26805
+ setViewMode = _useState24[1]; // "form" | "json"
26806
+ var _useState25 = useState(""),
26671
26807
  _useState26 = _slicedToArray(_useState25, 2),
26672
- jsonError = _useState26[0],
26673
- setJsonError = _useState26[1];
26808
+ jsonText = _useState26[0],
26809
+ setJsonText = _useState26[1];
26810
+ var _useState27 = useState(null),
26811
+ _useState28 = _slicedToArray(_useState27, 2),
26812
+ jsonError = _useState28[0],
26813
+ setJsonError = _useState28[1];
26674
26814
 
26675
26815
  // Clear credential data when transport changes (derived fields change entirely)
26676
26816
  // Only in create mode — in edit mode the initial transport is set correctly
@@ -26839,6 +26979,18 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26839
26979
  resources: result.resources || [],
26840
26980
  message: "Connected! Found ".concat((result.tools || []).length, " tools.")
26841
26981
  });
26982
+
26983
+ // Pre-select tools: intersect with existing allowedTools if editing, or select all
26984
+ var allToolNames = (result.tools || []).map(function (t) {
26985
+ return t.name;
26986
+ });
26987
+ if (initialAllowedTools) {
26988
+ setSelectedTools(allToolNames.filter(function (t) {
26989
+ return initialAllowedTools.includes(t);
26990
+ }));
26991
+ } else {
26992
+ setSelectedTools(allToolNames);
26993
+ }
26842
26994
  dashApi.mcpStopServer(testName, function () {}, function () {});
26843
26995
  setIsTesting(false);
26844
26996
  }, function (event, err) {
@@ -26871,11 +27023,11 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26871
27023
  url: result.url,
26872
27024
  headerRows: result.headerRows
26873
27025
  });
26874
- onSave(name, initialProviderType, result.credentialData, config);
27026
+ onSave(name, initialProviderType, result.credentialData, config, selectedTools);
26875
27027
  return;
26876
27028
  }
26877
27029
  if (!validateForm()) return;
26878
- onSave(providerName.trim(), initialProviderType, credentialData, mcpConfig);
27030
+ onSave(providerName.trim(), initialProviderType, credentialData, mcpConfig, selectedTools);
26879
27031
  };
26880
27032
  return /*#__PURE__*/jsxs("div", {
26881
27033
  className: "flex flex-col flex-1 min-h-0",
@@ -27259,30 +27411,20 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
27259
27411
  }, field.key);
27260
27412
  })]
27261
27413
  })]
27262
- }), testResult && /*#__PURE__*/jsxs("div", {
27414
+ }), testResult && /*#__PURE__*/jsx("div", {
27263
27415
  className: "p-3 rounded-lg text-sm ".concat(testResult.success ? "bg-green-900/30 border border-green-700 text-green-300" : "bg-red-900/30 border border-red-700 text-red-300"),
27264
- children: [/*#__PURE__*/jsxs("div", {
27416
+ children: /*#__PURE__*/jsxs("div", {
27265
27417
  className: "flex items-center gap-2",
27266
27418
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
27267
27419
  icon: testResult.success ? "circle-check" : "circle-exclamation"
27268
27420
  }), /*#__PURE__*/jsx("span", {
27269
27421
  children: testResult.message
27270
27422
  })]
27271
- }), testResult.success && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && /*#__PURE__*/jsx("div", {
27272
- className: "mt-2 ml-6 space-y-1",
27273
- children: testResult.tools.map(function (tool) {
27274
- return /*#__PURE__*/jsxs("div", {
27275
- className: "text-xs",
27276
- children: [/*#__PURE__*/jsx("span", {
27277
- className: "font-mono",
27278
- children: tool.name
27279
- }), tool.description && /*#__PURE__*/jsxs("span", {
27280
- className: "opacity-60 ml-2",
27281
- children: ["- ", tool.description]
27282
- })]
27283
- }, tool.name);
27284
- })
27285
- })]
27423
+ })
27424
+ }), (testResult === null || testResult === void 0 ? void 0 : testResult.success) && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && selectedTools && /*#__PURE__*/jsx(ToolSelector, {
27425
+ tools: testResult.tools,
27426
+ selectedTools: selectedTools,
27427
+ onSelectionChange: setSelectedTools
27286
27428
  })]
27287
27429
  }), /*#__PURE__*/jsxs("div", {
27288
27430
  className: "flex-shrink-0 flex flex-row justify-end gap-2 px-6 py-4 border-t border-white/10",
@@ -27380,30 +27522,34 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27380
27522
  _useState18 = _slicedToArray(_useState17, 2),
27381
27523
  authResult = _useState18[0],
27382
27524
  setAuthResult = _useState18[1];
27525
+ var _useState19 = useState(null),
27526
+ _useState20 = _slicedToArray(_useState19, 2),
27527
+ selectedTools = _useState20[0],
27528
+ setSelectedTools = _useState20[1];
27383
27529
 
27384
27530
  // Configuration form state
27385
- var _useState19 = useState(""),
27386
- _useState20 = _slicedToArray(_useState19, 2),
27387
- providerName = _useState20[0],
27388
- setProviderName = _useState20[1];
27389
- var _useState21 = useState({}),
27531
+ var _useState21 = useState(""),
27390
27532
  _useState22 = _slicedToArray(_useState21, 2),
27391
- credentialData = _useState22[0],
27392
- setCredentialData = _useState22[1];
27533
+ providerName = _useState22[0],
27534
+ setProviderName = _useState22[1];
27393
27535
  var _useState23 = useState({}),
27394
27536
  _useState24 = _slicedToArray(_useState23, 2),
27395
- formErrors = _useState24[0],
27396
- setFormErrors = _useState24[1];
27537
+ credentialData = _useState24[0],
27538
+ setCredentialData = _useState24[1];
27539
+ var _useState25 = useState({}),
27540
+ _useState26 = _slicedToArray(_useState25, 2),
27541
+ formErrors = _useState26[0],
27542
+ setFormErrors = _useState26[1];
27397
27543
 
27398
27544
  // Advanced config row state
27399
- var _useState25 = useState([]),
27400
- _useState26 = _slicedToArray(_useState25, 2),
27401
- envMappingRows = _useState26[0],
27402
- setEnvMappingRows = _useState26[1];
27403
27545
  var _useState27 = useState([]),
27404
27546
  _useState28 = _slicedToArray(_useState27, 2),
27405
- headerRows = _useState28[0],
27406
- setHeaderRows = _useState28[1];
27547
+ envMappingRows = _useState28[0],
27548
+ setEnvMappingRows = _useState28[1];
27549
+ var _useState29 = useState([]),
27550
+ _useState30 = _slicedToArray(_useState29, 2),
27551
+ headerRows = _useState30[0],
27552
+ setHeaderRows = _useState30[1];
27407
27553
  var rowIdRef = useRef(0);
27408
27554
  var nextRowId = function nextRowId() {
27409
27555
  return "cat_".concat(++rowIdRef.current);
@@ -27510,6 +27656,11 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27510
27656
  message: "Connected! Found ".concat((result.tools || []).length, " tools.")
27511
27657
  });
27512
27658
 
27659
+ // Pre-select all tools
27660
+ setSelectedTools((result.tools || []).map(function (t) {
27661
+ return t.name;
27662
+ }));
27663
+
27513
27664
  // Stop the test server
27514
27665
  dashApi.mcpStopServer(testName, function () {}, function () {});
27515
27666
  setIsTesting(false);
@@ -27552,7 +27703,7 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27552
27703
  // Handle save
27553
27704
  var handleSaveProvider = function handleSaveProvider() {
27554
27705
  if (!selectedServer || !validateForm()) return;
27555
- onSave(providerName.trim(), selectedServer.id, credentialData, effectiveMcpConfig);
27706
+ onSave(providerName.trim(), selectedServer.id, credentialData, effectiveMcpConfig, selectedTools);
27556
27707
  };
27557
27708
 
27558
27709
  // Select custom server option
@@ -27573,6 +27724,7 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27573
27724
  setIsCustom(false);
27574
27725
  setTestResult(null);
27575
27726
  setAuthResult(null);
27727
+ setSelectedTools(null);
27576
27728
  setProviderName("");
27577
27729
  setCredentialData({});
27578
27730
  setFormErrors({});
@@ -27771,30 +27923,20 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27771
27923
  children: authResult.message
27772
27924
  })]
27773
27925
  })
27774
- }), testResult && /*#__PURE__*/jsxs("div", {
27926
+ }), testResult && /*#__PURE__*/jsx("div", {
27775
27927
  className: "p-3 rounded-lg text-sm ".concat(testResult.success ? "bg-green-900/30 border border-green-700 text-green-300" : "bg-red-900/30 border border-red-700 text-red-300"),
27776
- children: [/*#__PURE__*/jsxs("div", {
27928
+ children: /*#__PURE__*/jsxs("div", {
27777
27929
  className: "flex items-center gap-2",
27778
27930
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
27779
27931
  icon: testResult.success ? "circle-check" : "circle-exclamation"
27780
27932
  }), /*#__PURE__*/jsx("span", {
27781
27933
  children: testResult.message
27782
27934
  })]
27783
- }), testResult.success && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && /*#__PURE__*/jsx("div", {
27784
- className: "mt-2 ml-6 space-y-1",
27785
- children: testResult.tools.map(function (tool) {
27786
- return /*#__PURE__*/jsxs("div", {
27787
- className: "text-xs",
27788
- children: [/*#__PURE__*/jsx("span", {
27789
- className: "font-mono",
27790
- children: tool.name
27791
- }), tool.description && /*#__PURE__*/jsxs("span", {
27792
- className: "opacity-60 ml-2",
27793
- children: ["- ", tool.description]
27794
- })]
27795
- }, tool.name);
27796
- })
27797
- })]
27935
+ })
27936
+ }), (testResult === null || testResult === void 0 ? void 0 : testResult.success) && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && selectedTools && /*#__PURE__*/jsx(ToolSelector, {
27937
+ tools: testResult.tools,
27938
+ selectedTools: selectedTools,
27939
+ onSelectionChange: setSelectedTools
27798
27940
  })]
27799
27941
  }), /*#__PURE__*/jsxs("div", {
27800
27942
  className: "flex-shrink-0 flex flex-row justify-end gap-2 px-6 py-4 border-t border-white/10",
@@ -28065,12 +28207,14 @@ var ProvidersSection = function ProvidersSection(_ref) {
28065
28207
 
28066
28208
  // Handle MCP provider creation from catalog picker
28067
28209
  function handleMcpSave(providerName, providerType, mcpCredentials, mcpConfig) {
28210
+ var allowedTools = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
28068
28211
  if (!dashApi || !appId) return;
28069
28212
  dashApi.saveProvider(appId, providerName, {
28070
28213
  providerType: providerType,
28071
28214
  credentials: mcpCredentials,
28072
28215
  providerClass: "mcp",
28073
- mcpConfig: mcpConfig
28216
+ mcpConfig: mcpConfig,
28217
+ allowedTools: allowedTools
28074
28218
  }, function () {
28075
28219
  setIsAddingMcp(false);
28076
28220
  refreshProviders && refreshProviders();
@@ -28083,6 +28227,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
28083
28227
 
28084
28228
  // Handle MCP provider editing via CustomMcpServerForm
28085
28229
  function handleMcpEditSave(providerName, providerType, mcpCredentials, mcpConfig) {
28230
+ var allowedTools = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
28086
28231
  if (!dashApi || !appId) return;
28087
28232
  var originalName = selectedName;
28088
28233
 
@@ -28094,7 +28239,8 @@ var ProvidersSection = function ProvidersSection(_ref) {
28094
28239
  providerType: providerType,
28095
28240
  credentials: mcpCredentials,
28096
28241
  providerClass: "mcp",
28097
- mcpConfig: mcpConfig
28242
+ mcpConfig: mcpConfig,
28243
+ allowedTools: allowedTools
28098
28244
  }, function () {
28099
28245
  setSelectedName(providerName);
28100
28246
  setProviderTab("mcp");
@@ -28106,6 +28252,24 @@ var ProvidersSection = function ProvidersSection(_ref) {
28106
28252
  });
28107
28253
  }
28108
28254
 
28255
+ // Handle saving just allowedTools for an existing MCP provider
28256
+ function handleSaveAllowedTools(providerName, allowedTools) {
28257
+ if (!dashApi || !appId) return;
28258
+ var existingProvider = providers[providerName];
28259
+ if (!existingProvider) return;
28260
+ dashApi.saveProvider(appId, providerName, {
28261
+ providerType: existingProvider.type,
28262
+ credentials: existingProvider.credentials,
28263
+ providerClass: "mcp",
28264
+ mcpConfig: existingProvider.mcpConfig,
28265
+ allowedTools: allowedTools
28266
+ }, function () {
28267
+ refreshProviders && refreshProviders();
28268
+ }, function (e, err) {
28269
+ return (void 0);
28270
+ });
28271
+ }
28272
+
28109
28273
  // Respond to external create trigger from header
28110
28274
  var prevCreateRequested = useRef(false);
28111
28275
  useEffect(function () {
@@ -28232,6 +28396,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
28232
28396
  initialUrl: mc.url || "",
28233
28397
  initialHeaderRows: headerTemplateToRows(mc.headerTemplate, nextRowId),
28234
28398
  initialCredentials: selectedProvider.credentials || {},
28399
+ initialAllowedTools: selectedProvider.allowedTools || null,
28235
28400
  onSave: handleMcpEditSave,
28236
28401
  onBack: function onBack() {
28237
28402
  return setIsEditingMcp(false);
@@ -28258,6 +28423,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
28258
28423
  onDelete: function onDelete(name) {
28259
28424
  return setDeleteTarget(name);
28260
28425
  },
28426
+ onSaveAllowedTools: handleSaveAllowedTools,
28261
28427
  catalogAuthCommand: (catalogEntry === null || catalogEntry === void 0 ? void 0 : catalogEntry.authCommand) || null
28262
28428
  });
28263
28429
  }
@@ -28990,9 +29156,20 @@ var InstalledWidgetDetail = function InstalledWidgetDetail(_ref) {
28990
29156
  }), /*#__PURE__*/jsx("div", {
28991
29157
  className: "flex flex-wrap gap-1.5",
28992
29158
  children: widget.providers.map(function (p, i) {
28993
- return /*#__PURE__*/jsxs("span", {
28994
- className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"] || "bg-white/10", " opacity-70"),
28995
- children: [p.type, p.providerClass === "mcp" ? " (MCP)" : ""]
29159
+ return /*#__PURE__*/jsxs("div", {
29160
+ className: "flex flex-col gap-1",
29161
+ children: [/*#__PURE__*/jsxs("span", {
29162
+ className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"] || "bg-white/10", " opacity-70 w-fit"),
29163
+ children: [p.type, p.providerClass === "mcp" ? " (MCP)" : ""]
29164
+ }), p.requiredTools && p.requiredTools.length > 0 && /*#__PURE__*/jsx("div", {
29165
+ className: "flex flex-wrap gap-1 ml-2",
29166
+ children: p.requiredTools.map(function (tool) {
29167
+ return /*#__PURE__*/jsx("span", {
29168
+ className: "text-[10px] font-mono px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
29169
+ children: tool
29170
+ }, tool);
29171
+ })
29172
+ })]
28996
29173
  }, i);
28997
29174
  })
28998
29175
  })]
@@ -29177,14 +29354,33 @@ var RegistryPackageDetail = function RegistryPackageDetail(_ref) {
29177
29354
  }), w.description && /*#__PURE__*/jsx("div", {
29178
29355
  className: "text-xs opacity-50 mt-0.5",
29179
29356
  children: w.description
29180
- }), w.providers && w.providers.length > 0 && /*#__PURE__*/jsx("div", {
29181
- className: "flex gap-1 mt-1",
29182
- children: w.providers.map(function (p, pidx) {
29183
- return /*#__PURE__*/jsxs("span", {
29184
- className: "text-xs px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
29185
- children: [p.type, p.required ? " *" : ""]
29186
- }, pidx);
29187
- })
29357
+ }), w.providers && w.providers.length > 0 && /*#__PURE__*/jsxs("div", {
29358
+ className: "space-y-1 mt-1",
29359
+ children: [/*#__PURE__*/jsx("div", {
29360
+ className: "flex gap-1 flex-wrap",
29361
+ children: w.providers.map(function (p, pidx) {
29362
+ return /*#__PURE__*/jsxs("span", {
29363
+ className: "text-xs px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
29364
+ children: [p.type, p.required ? " *" : ""]
29365
+ }, pidx);
29366
+ })
29367
+ }), w.providers.some(function (p) {
29368
+ var _p$requiredTools;
29369
+ return ((_p$requiredTools = p.requiredTools) === null || _p$requiredTools === void 0 ? void 0 : _p$requiredTools.length) > 0;
29370
+ }) && /*#__PURE__*/jsx("div", {
29371
+ className: "flex flex-wrap gap-1 ml-1",
29372
+ children: w.providers.filter(function (p) {
29373
+ var _p$requiredTools2;
29374
+ return ((_p$requiredTools2 = p.requiredTools) === null || _p$requiredTools2 === void 0 ? void 0 : _p$requiredTools2.length) > 0;
29375
+ }).flatMap(function (p) {
29376
+ return p.requiredTools.map(function (tool) {
29377
+ return /*#__PURE__*/jsx("span", {
29378
+ className: "text-[10px] font-mono px-1.5 py-0.5 rounded bg-white/5 opacity-60",
29379
+ children: tool
29380
+ }, "".concat(p.type, "-").concat(tool));
29381
+ });
29382
+ })
29383
+ })]
29188
29384
  })]
29189
29385
  }, idx);
29190
29386
  })
@@ -29224,9 +29420,9 @@ var RegistryPackageDetail = function RegistryPackageDetail(_ref) {
29224
29420
  });
29225
29421
  };
29226
29422
 
29227
- function _createForOfIteratorHelper$1(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$1(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
29228
- function _unsupportedIterableToArray$1(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$1(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$1(r, a) : void 0; } }
29229
- function _arrayLikeToArray$1(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
29423
+ function _createForOfIteratorHelper$2(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$2(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
29424
+ function _unsupportedIterableToArray$2(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$2(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$2(r, a) : void 0; } }
29425
+ function _arrayLikeToArray$2(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
29230
29426
 
29231
29427
  /**
29232
29428
  * useRegistrySearch — shared hook for browsing and installing registry packages.
@@ -29301,11 +29497,11 @@ var useRegistrySearch = function useRegistrySearch() {
29301
29497
 
29302
29498
  // Flatten packages into widget entries
29303
29499
  widgets = [];
29304
- _iterator = _createForOfIteratorHelper$1(pkgs);
29500
+ _iterator = _createForOfIteratorHelper$2(pkgs);
29305
29501
  try {
29306
29502
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
29307
29503
  pkg = _step.value;
29308
- _iterator2 = _createForOfIteratorHelper$1(pkg.widgets || []);
29504
+ _iterator2 = _createForOfIteratorHelper$2(pkg.widgets || []);
29309
29505
  try {
29310
29506
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
29311
29507
  widget = _step2.value;
@@ -29432,10 +29628,15 @@ var useRegistrySearch = function useRegistrySearch() {
29432
29628
  };
29433
29629
  };
29434
29630
 
29631
+ function _createForOfIteratorHelper$1(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$1(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
29632
+ function _unsupportedIterableToArray$1(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$1(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$1(r, a) : void 0; } }
29633
+ function _arrayLikeToArray$1(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
29435
29634
  var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
29436
29635
  var onBack = _ref.onBack;
29437
29636
  var _useContext = useContext(ThemeContext),
29438
29637
  currentTheme = _useContext.currentTheme;
29638
+ var appContext = useContext(AppContext);
29639
+ var providers = (appContext === null || appContext === void 0 ? void 0 : appContext.providers) || {};
29439
29640
  var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
29440
29641
  grow: false
29441
29642
  });
@@ -29454,10 +29655,90 @@ var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
29454
29655
  _useState2 = _slicedToArray(_useState, 2),
29455
29656
  selectedPackageName = _useState2[0],
29456
29657
  setSelectedPackageName = _useState2[1];
29658
+ var _useState3 = useState(null),
29659
+ _useState4 = _slicedToArray(_useState3, 2),
29660
+ toolConflictWarning = _useState4[0],
29661
+ setToolConflictWarning = _useState4[1];
29457
29662
  var selectedWidget = selectedPackageName ? flatWidgets.find(function (w) {
29458
29663
  return w.packageName === selectedPackageName;
29459
29664
  }) : null;
29665
+
29666
+ // Check if widget's requiredTools conflict with user's provider allowedTools
29667
+ var checkToolConflicts = function checkToolConflicts(widget) {
29668
+ var conflicts = [];
29669
+ var packageWidgets = widget.packageWidgets || [];
29670
+ var _iterator = _createForOfIteratorHelper$1(packageWidgets),
29671
+ _step;
29672
+ try {
29673
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
29674
+ var w = _step.value;
29675
+ var _iterator2 = _createForOfIteratorHelper$1(w.providers || []),
29676
+ _step2;
29677
+ try {
29678
+ var _loop = function _loop() {
29679
+ var _p$requiredTools;
29680
+ var p = _step2.value;
29681
+ if (!((_p$requiredTools = p.requiredTools) !== null && _p$requiredTools !== void 0 && _p$requiredTools.length) || p.providerClass !== "mcp") return 1; // continue
29682
+ // Find matching user provider
29683
+ var matchingProviders = Object.entries(providers).filter(function (_ref2) {
29684
+ var _ref3 = _slicedToArray(_ref2, 2),
29685
+ prov = _ref3[1];
29686
+ return prov.type === p.type && prov.providerClass === "mcp" && prov.allowedTools;
29687
+ });
29688
+ var _iterator3 = _createForOfIteratorHelper$1(matchingProviders),
29689
+ _step3;
29690
+ try {
29691
+ var _loop2 = function _loop2() {
29692
+ var _step3$value = _slicedToArray(_step3.value, 2),
29693
+ provName = _step3$value[0],
29694
+ prov = _step3$value[1];
29695
+ var blocked = p.requiredTools.filter(function (t) {
29696
+ return !prov.allowedTools.includes(t);
29697
+ });
29698
+ if (blocked.length > 0) {
29699
+ conflicts.push({
29700
+ widgetName: w.displayName || w.name,
29701
+ providerName: provName,
29702
+ blockedTools: blocked
29703
+ });
29704
+ }
29705
+ };
29706
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
29707
+ _loop2();
29708
+ }
29709
+ } catch (err) {
29710
+ _iterator3.e(err);
29711
+ } finally {
29712
+ _iterator3.f();
29713
+ }
29714
+ };
29715
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
29716
+ if (_loop()) continue;
29717
+ }
29718
+ } catch (err) {
29719
+ _iterator2.e(err);
29720
+ } finally {
29721
+ _iterator2.f();
29722
+ }
29723
+ }
29724
+ } catch (err) {
29725
+ _iterator.e(err);
29726
+ } finally {
29727
+ _iterator.f();
29728
+ }
29729
+ return conflicts;
29730
+ };
29460
29731
  var handleInstall = function handleInstall() {
29732
+ if (!selectedWidget) return;
29733
+ var conflicts = checkToolConflicts(selectedWidget);
29734
+ if (conflicts.length > 0) {
29735
+ setToolConflictWarning(conflicts);
29736
+ } else {
29737
+ installPackage(selectedWidget);
29738
+ }
29739
+ };
29740
+ var handleConfirmInstall = function handleConfirmInstall() {
29741
+ setToolConflictWarning(null);
29461
29742
  if (selectedWidget) {
29462
29743
  installPackage(selectedWidget);
29463
29744
  }
@@ -29577,6 +29858,20 @@ var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
29577
29858
  }), !isLoading && !error && packages.length > 0 && /*#__PURE__*/jsxs("div", {
29578
29859
  className: "flex-shrink-0 px-4 py-2 text-[10px] opacity-40 border-t border-white/10",
29579
29860
  children: [packages.length, " package", packages.length !== 1 ? "s" : ""]
29861
+ }), /*#__PURE__*/jsx(ConfirmationModal, {
29862
+ isOpen: !!toolConflictWarning,
29863
+ setIsOpen: function setIsOpen() {
29864
+ return setToolConflictWarning(null);
29865
+ },
29866
+ title: "Tool Access Conflict",
29867
+ message: toolConflictWarning ? "This widget requires tools that are blocked by your provider settings:\n\n".concat(toolConflictWarning.map(function (c) {
29868
+ return "\u2022 ".concat(c.widgetName, " needs ").concat(c.blockedTools.join(", "), " (blocked by \"").concat(c.providerName, "\")");
29869
+ }).join("\n"), "\n\nYou can update allowed tools in Settings \u2192 Providers after installing.") : "",
29870
+ confirmLabel: "Install Anyway",
29871
+ onConfirm: handleConfirmInstall,
29872
+ onCancel: function onCancel() {
29873
+ return setToolConflictWarning(null);
29874
+ }
29580
29875
  })]
29581
29876
  });
29582
29877
  };