@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.js CHANGED
@@ -1180,12 +1180,13 @@ var ElectronDashboardApi = /*#__PURE__*/function () {
1180
1180
  if (this.api !== null) {
1181
1181
  try {
1182
1182
  // Handle the promise returned by the IPC call
1183
- // Note: providerData should contain providerType, credentials, and optionally providerClass/mcpConfig
1183
+ // Note: providerData should contain providerType, credentials, and optionally providerClass/mcpConfig/allowedTools
1184
1184
  var providerType = providerData.providerType,
1185
1185
  credentials = providerData.credentials,
1186
1186
  providerClass = providerData.providerClass,
1187
- mcpConfig = providerData.mcpConfig;
1188
- this.api.providers.saveProvider(appId, providerName, providerType, credentials, providerClass, mcpConfig).then(function (result) {
1187
+ mcpConfig = providerData.mcpConfig,
1188
+ allowedTools = providerData.allowedTools;
1189
+ this.api.providers.saveProvider(appId, providerName, providerType, credentials, providerClass, mcpConfig, allowedTools).then(function (result) {
1189
1190
  onSuccess(_this12.events.PROVIDER_SAVE_COMPLETE, result);
1190
1191
  })["catch"](function (error) {
1191
1192
  onError(_this12.events.PROVIDER_SAVE_ERROR, error);
@@ -2708,9 +2709,9 @@ var LayoutContainer = function LayoutContainer(_ref) {
2708
2709
 
2709
2710
  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; }
2710
2711
  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; }
2711
- 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; } } }; }
2712
- 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; } }
2713
- 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; }
2712
+ 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; } } }; }
2713
+ 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; } }
2714
+ 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; }
2714
2715
  /**
2715
2716
  * Layout template definitions for the dashboard template picker.
2716
2717
  *
@@ -2946,7 +2947,7 @@ function createLayoutFromTemplate(template) {
2946
2947
  cols: template.cols,
2947
2948
  gap: "gap-2"
2948
2949
  };
2949
- var _iterator = _createForOfIteratorHelper$9(template.cells),
2950
+ var _iterator = _createForOfIteratorHelper$a(template.cells),
2950
2951
  _step;
2951
2952
  try {
2952
2953
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -4458,9 +4459,9 @@ var PanelEditItem = function PanelEditItem(_ref) {
4458
4459
  };
4459
4460
 
4460
4461
  var _excluded$5 = ["rows", "cols"];
4461
- 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; } } }; }
4462
- 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; } }
4463
- 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; }
4462
+ 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; } } }; }
4463
+ 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; } }
4464
+ 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; }
4464
4465
  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; }
4465
4466
  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; }
4466
4467
  var defaultGrid = {
@@ -4613,7 +4614,7 @@ function GridEditor(_ref) {
4613
4614
  function sortObjectByKeys(obj) {
4614
4615
  var sortedKeys = Object.keys(obj).sort();
4615
4616
  var sortedObj = {};
4616
- var _iterator = _createForOfIteratorHelper$8(sortedKeys),
4617
+ var _iterator = _createForOfIteratorHelper$9(sortedKeys),
4617
4618
  _step;
4618
4619
  try {
4619
4620
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -7337,9 +7338,9 @@ var ProviderForm = function ProviderForm(_ref) {
7337
7338
  });
7338
7339
  };
7339
7340
 
7340
- 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; } } }; }
7341
- 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; } }
7342
- 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; }
7341
+ 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; } } }; }
7342
+ 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; } }
7343
+ 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; }
7343
7344
  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; }
7344
7345
  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; }
7345
7346
  var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
@@ -7548,11 +7549,11 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7548
7549
 
7549
7550
  // Flatten all widgets from all packages for the widget list
7550
7551
  flatWidgets = [];
7551
- _iterator = _createForOfIteratorHelper$7(result.packages || []);
7552
+ _iterator = _createForOfIteratorHelper$8(result.packages || []);
7552
7553
  try {
7553
7554
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
7554
7555
  pkg = _step.value;
7555
- _iterator2 = _createForOfIteratorHelper$7(pkg.widgets || []);
7556
+ _iterator2 = _createForOfIteratorHelper$8(pkg.widgets || []);
7556
7557
  try {
7557
7558
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
7558
7559
  widget = _step2.value;
@@ -8718,9 +8719,9 @@ var ProviderBadge = function ProviderBadge(_ref) {
8718
8719
  });
8719
8720
  };
8720
8721
 
8721
- 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; } } }; }
8722
- 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; } }
8723
- 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; }
8722
+ 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; } } }; }
8723
+ 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; } }
8724
+ 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; }
8724
8725
  var WidgetCardHeader = function WidgetCardHeader(_ref) {
8725
8726
  var item = _ref.item,
8726
8727
  widget = _ref.widget,
@@ -8764,7 +8765,7 @@ var WidgetCardHeader = function WidgetCardHeader(_ref) {
8764
8765
  var el = headerRef.current;
8765
8766
  if (!el) return;
8766
8767
  var observer = new ResizeObserver(function (entries) {
8767
- var _iterator = _createForOfIteratorHelper$6(entries),
8768
+ var _iterator = _createForOfIteratorHelper$7(entries),
8768
8769
  _step;
8769
8770
  try {
8770
8771
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -13677,9 +13678,9 @@ var ExternalWidget = function ExternalWidget(_ref) {
13677
13678
  var GRID_CELL_WIDGET_TYPE = "grid-cell-widget";
13678
13679
  var SIDEBAR_WIDGET_TYPE = "sidebar-widget";
13679
13680
 
13680
- 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; } } }; }
13681
- 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; } }
13682
- 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; }
13681
+ 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; } } }; }
13682
+ 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; } }
13683
+ 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; }
13683
13684
  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; }
13684
13685
  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; }
13685
13686
  var DraggableCellBody = function DraggableCellBody(_ref) {
@@ -14027,7 +14028,7 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
14027
14028
  return selectable["delete"](cn);
14028
14029
  });
14029
14030
  var resolved = new Set();
14030
- var _iterator = _createForOfIteratorHelper$5(selectable),
14031
+ var _iterator = _createForOfIteratorHelper$6(selectable),
14031
14032
  _step;
14032
14033
  try {
14033
14034
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -16133,9 +16134,9 @@ function isWidgetResolvable(componentKey) {
16133
16134
 
16134
16135
  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; }
16135
16136
  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; }
16136
- 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; } } }; }
16137
- 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; } }
16138
- 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; }
16137
+ 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; } } }; }
16138
+ 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; } }
16139
+ 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; }
16139
16140
  /**
16140
16141
  * The model for all layout components used primarily in the renderLayout method
16141
16142
  * @param {Object} layoutItem an object containing various attributes of the layout item
@@ -16147,7 +16148,7 @@ function _arrayLikeToArray$4(r, a) { (null == a || a > r.length) && (a = r.lengt
16147
16148
  function sortObjectByKeys(obj) {
16148
16149
  var sortedKeys = Object.keys(obj).sort();
16149
16150
  var sortedObj = {};
16150
- var _iterator = _createForOfIteratorHelper$4(sortedKeys),
16151
+ var _iterator = _createForOfIteratorHelper$5(sortedKeys),
16151
16152
  _step;
16152
16153
  try {
16153
16154
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -19321,9 +19322,9 @@ var useDashboard = function useDashboard() {
19321
19322
  });
19322
19323
  };
19323
19324
 
19324
- 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; } } }; }
19325
- 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; } }
19326
- 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; }
19325
+ 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; } } }; }
19326
+ 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; } }
19327
+ 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; }
19327
19328
 
19328
19329
  /**
19329
19330
  * useWidgetProviders Hook
@@ -19374,7 +19375,7 @@ var useWidgetProviders = function useWidgetProviders() {
19374
19375
  // 1. Widget-level: stored directly on the layout item by handleSelectProvider
19375
19376
  // 2. Workspace-level: stored as workspace.selectedProviders[widgetId][providerType]
19376
19377
  var providers = {};
19377
- var _iterator = _createForOfIteratorHelper$3(providerDeclarations),
19378
+ var _iterator = _createForOfIteratorHelper$4(providerDeclarations),
19378
19379
  _step;
19379
19380
  try {
19380
19381
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -19501,15 +19502,8 @@ var useMcpProvider = function useMcpProvider(providerType) {
19501
19502
  var mountedRef = React.useRef(true);
19502
19503
  var dashApi = app === null || app === void 0 ? void 0 : app.dashApi;
19503
19504
 
19504
- // Get the widget's allowed tools from its provider declaration
19505
+ // Get the widget data and compute effective allowed tools
19505
19506
  var widgetData = widgetContext === null || widgetContext === void 0 ? void 0 : widgetContext.widgetData;
19506
- var allowedTools = function () {
19507
- if (!(widgetData !== null && widgetData !== void 0 && widgetData.providers)) return null;
19508
- var mcpProvider = widgetData.providers.find(function (p) {
19509
- return p.type === providerType && p.providerClass === "mcp";
19510
- });
19511
- return (mcpProvider === null || mcpProvider === void 0 ? void 0 : mcpProvider.allowedTools) || null;
19512
- }();
19513
19507
 
19514
19508
  // Get the selected MCP provider for this widget
19515
19509
  // First check widget-level selectedProviders (set by handleSelectProvider on the layout item),
@@ -19532,16 +19526,37 @@ var useMcpProvider = function useMcpProvider(providerType) {
19532
19526
  // issue where providers don't flow through from AppWrapper)
19533
19527
  var provider = selectedProviderName ? app === null || app === void 0 || (_app$providers = app.providers) === null || _app$providers === void 0 ? void 0 : _app$providers[selectedProviderName] : null;
19534
19528
 
19529
+ // Merge widget-declared allowedTools with user-configured allowedTools (intersection)
19530
+ var effectiveAllowedTools = function () {
19531
+ // Widget-declared (from .dash.js providers[].allowedTools)
19532
+ var widgetAllowed = function () {
19533
+ if (!(widgetData !== null && widgetData !== void 0 && widgetData.providers)) return null;
19534
+ var p = widgetData.providers.find(function (p) {
19535
+ return p.type === providerType && p.providerClass === "mcp";
19536
+ });
19537
+ return (p === null || p === void 0 ? void 0 : p.allowedTools) || null;
19538
+ }();
19539
+ // User-configured (from saved provider object)
19540
+ var userAllowed = (provider === null || provider === void 0 ? void 0 : provider.allowedTools) || null;
19541
+ // Intersection
19542
+ if (!widgetAllowed && !userAllowed) return null;
19543
+ if (!widgetAllowed) return userAllowed;
19544
+ if (!userAllowed) return widgetAllowed;
19545
+ return widgetAllowed.filter(function (t) {
19546
+ return userAllowed.includes(t);
19547
+ });
19548
+ }();
19549
+
19535
19550
  /**
19536
19551
  * Apply connection result to this hook instance's local state.
19537
- * Filters tools by allowedTools if specified.
19552
+ * Filters tools by effectiveAllowedTools if specified.
19538
19553
  */
19539
19554
  var applyResult = React.useCallback(function (result) {
19540
19555
  if (!mountedRef.current) return;
19541
19556
  var serverTools = result.tools || [];
19542
- if (allowedTools) {
19557
+ if (effectiveAllowedTools) {
19543
19558
  serverTools = serverTools.filter(function (tool) {
19544
- return allowedTools.includes(tool.name);
19559
+ return effectiveAllowedTools.includes(tool.name);
19545
19560
  });
19546
19561
  }
19547
19562
  setTools(serverTools);
@@ -19550,7 +19565,7 @@ var useMcpProvider = function useMcpProvider(providerType) {
19550
19565
  setIsConnecting(false);
19551
19566
  setStatus("connected");
19552
19567
  connectedRef.current = true;
19553
- }, [allowedTools]);
19568
+ }, [effectiveAllowedTools]);
19554
19569
 
19555
19570
  /**
19556
19571
  * Connect to the MCP server.
@@ -19807,6 +19822,8 @@ var useMcpProvider = function useMcpProvider(providerType) {
19807
19822
  var callTool = React.useCallback(/*#__PURE__*/function () {
19808
19823
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(toolName) {
19809
19824
  var args,
19825
+ widgetRequiredTools,
19826
+ isRequired,
19810
19827
  _args3 = arguments;
19811
19828
  return _regeneratorRuntime.wrap(function (_context3) {
19812
19829
  while (1) switch (_context3.prev = _context3.next) {
@@ -19818,17 +19835,26 @@ var useMcpProvider = function useMcpProvider(providerType) {
19818
19835
  }
19819
19836
  throw new Error("MCP server not connected");
19820
19837
  case 1:
19821
- if (!(allowedTools && !allowedTools.includes(toolName))) {
19838
+ if (!(effectiveAllowedTools && !effectiveAllowedTools.includes(toolName))) {
19822
19839
  _context3.next = 2;
19823
19840
  break;
19824
19841
  }
19825
- throw new Error("Tool \"".concat(toolName, "\" is not allowed for this widget. Allowed tools: ").concat(allowedTools.join(", ")));
19842
+ // Provide enhanced error if the tool is in widget's requiredTools
19843
+ widgetRequiredTools = function () {
19844
+ if (!(widgetData !== null && widgetData !== void 0 && widgetData.providers)) return null;
19845
+ var p = widgetData.providers.find(function (p) {
19846
+ return p.type === providerType && p.providerClass === "mcp";
19847
+ });
19848
+ return (p === null || p === void 0 ? void 0 : p.requiredTools) || null;
19849
+ }();
19850
+ isRequired = widgetRequiredTools === null || widgetRequiredTools === void 0 ? void 0 : widgetRequiredTools.includes(toolName);
19851
+ 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.") : ""));
19826
19852
  case 2:
19827
19853
  return _context3.abrupt("return", new Promise(function (resolve, reject) {
19828
19854
  var timeout = setTimeout(function () {
19829
19855
  reject(new Error("Tool call \"".concat(toolName, "\" timed out after 30s")));
19830
19856
  }, 30000);
19831
- dashApi.mcpCallTool(selectedProviderName, toolName, args, allowedTools, function (event, result) {
19857
+ dashApi.mcpCallTool(selectedProviderName, toolName, args, effectiveAllowedTools, function (event, result) {
19832
19858
  clearTimeout(timeout);
19833
19859
  if (result.error) {
19834
19860
  reject(new Error(result.message));
@@ -19849,7 +19875,7 @@ var useMcpProvider = function useMcpProvider(providerType) {
19849
19875
  return function (_x) {
19850
19876
  return _ref3.apply(this, arguments);
19851
19877
  };
19852
- }(), [dashApi, selectedProviderName, allowedTools]);
19878
+ }(), [dashApi, selectedProviderName, effectiveAllowedTools, widgetData, providerType]);
19853
19879
 
19854
19880
  /**
19855
19881
  * Read a resource from the MCP server
@@ -22204,9 +22230,9 @@ var resolveIcon = function resolveIcon(iconName) {
22204
22230
  return FALLBACK;
22205
22231
  };
22206
22232
 
22207
- 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; } } }; }
22208
- 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; } }
22209
- 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; }
22233
+ 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; } } }; }
22234
+ 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; } }
22235
+ 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; }
22210
22236
  /**
22211
22237
  * Validation utilities for grid-first dashboard architecture
22212
22238
  *
@@ -22445,7 +22471,7 @@ var validateCellMerge = function validateCellMerge(cellNumbers, grid) {
22445
22471
 
22446
22472
  // Validate each cell
22447
22473
  var cells = [];
22448
- var _iterator = _createForOfIteratorHelper$2(cellNumbers),
22474
+ var _iterator = _createForOfIteratorHelper$3(cellNumbers),
22449
22475
  _step;
22450
22476
  try {
22451
22477
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -25947,6 +25973,82 @@ var FoldersSection = function FoldersSection(_ref) {
25947
25973
  });
25948
25974
  };
25949
25975
 
25976
+ var ToolSelector = function ToolSelector(_ref) {
25977
+ var _ref$tools = _ref.tools,
25978
+ tools = _ref$tools === void 0 ? [] : _ref$tools,
25979
+ _ref$selectedTools = _ref.selectedTools,
25980
+ selectedTools = _ref$selectedTools === void 0 ? [] : _ref$selectedTools,
25981
+ onSelectionChange = _ref.onSelectionChange;
25982
+ if (!tools || tools.length === 0) return null;
25983
+ var allSelected = selectedTools.length === tools.length;
25984
+ var handleToggleAll = function handleToggleAll() {
25985
+ if (allSelected) {
25986
+ onSelectionChange([]);
25987
+ } else {
25988
+ onSelectionChange(tools.map(function (t) {
25989
+ return t.name;
25990
+ }));
25991
+ }
25992
+ };
25993
+ var handleToggle = function handleToggle(toolName) {
25994
+ if (selectedTools.includes(toolName)) {
25995
+ onSelectionChange(selectedTools.filter(function (t) {
25996
+ return t !== toolName;
25997
+ }));
25998
+ } else {
25999
+ onSelectionChange([].concat(_toConsumableArray(selectedTools), [toolName]));
26000
+ }
26001
+ };
26002
+ return /*#__PURE__*/jsxRuntime.jsxs("div", {
26003
+ className: "space-y-2",
26004
+ children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
26005
+ className: "flex items-center justify-between",
26006
+ children: [/*#__PURE__*/jsxRuntime.jsx("p", {
26007
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26008
+ children: "Allowed Tools"
26009
+ }), /*#__PURE__*/jsxRuntime.jsx("button", {
26010
+ onClick: handleToggleAll,
26011
+ className: "text-xs text-blue-400 hover:text-blue-300 transition-colors",
26012
+ children: allSelected ? "Deselect All" : "Select All"
26013
+ })]
26014
+ }), /*#__PURE__*/jsxRuntime.jsx("p", {
26015
+ className: "text-sm opacity-50",
26016
+ children: "Choose which tools this provider can expose to widgets"
26017
+ }), /*#__PURE__*/jsxRuntime.jsx("div", {
26018
+ className: "space-y-1 max-h-64 overflow-y-auto",
26019
+ children: tools.map(function (tool) {
26020
+ var checked = selectedTools.includes(tool.name);
26021
+ return /*#__PURE__*/jsxRuntime.jsxs("label", {
26022
+ className: "flex items-start gap-2 p-1.5 rounded hover:bg-white/5 cursor-pointer",
26023
+ children: [/*#__PURE__*/jsxRuntime.jsx("input", {
26024
+ type: "checkbox",
26025
+ checked: checked,
26026
+ onChange: function onChange() {
26027
+ return handleToggle(tool.name);
26028
+ },
26029
+ className: "mt-0.5 rounded border-white/20 bg-white/5 text-blue-500 focus:ring-blue-500/30"
26030
+ }), /*#__PURE__*/jsxRuntime.jsxs("div", {
26031
+ className: "flex-1 min-w-0",
26032
+ children: [/*#__PURE__*/jsxRuntime.jsx("span", {
26033
+ className: "text-xs font-mono",
26034
+ children: tool.name
26035
+ }), tool.description && /*#__PURE__*/jsxRuntime.jsxs("span", {
26036
+ className: "text-xs opacity-50 ml-2",
26037
+ children: ["\u2014 ", tool.description]
26038
+ })]
26039
+ })]
26040
+ }, tool.name);
26041
+ })
26042
+ }), /*#__PURE__*/jsxRuntime.jsxs("p", {
26043
+ className: "text-xs opacity-40",
26044
+ children: [/*#__PURE__*/jsxRuntime.jsx(DashReact.FontAwesomeIcon, {
26045
+ icon: "shield-halved",
26046
+ className: "mr-1"
26047
+ }), selectedTools.length, " of ", tools.length, " tools selected"]
26048
+ })]
26049
+ });
26050
+ };
26051
+
25950
26052
  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; }
25951
26053
  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; }
25952
26054
  var ProviderDetail = function ProviderDetail(_ref) {
@@ -25973,6 +26075,7 @@ var ProviderDetail = function ProviderDetail(_ref) {
25973
26075
  onStartEdit = _ref.onStartEdit,
25974
26076
  onCreate = _ref.onCreate,
25975
26077
  onDelete = _ref.onDelete,
26078
+ onSaveAllowedTools = _ref.onSaveAllowedTools,
25976
26079
  _ref$catalogAuthComma = _ref.catalogAuthCommand,
25977
26080
  catalogAuthCommand = _ref$catalogAuthComma === void 0 ? null : _ref$catalogAuthComma;
25978
26081
  var appContext = React.useContext(AppContext);
@@ -25988,16 +26091,20 @@ var ProviderDetail = function ProviderDetail(_ref) {
25988
26091
  _useState4 = _slicedToArray(_useState3, 2),
25989
26092
  testResult = _useState4[0],
25990
26093
  setTestResult = _useState4[1];
26094
+ var _useState5 = React.useState(null),
26095
+ _useState6 = _slicedToArray(_useState5, 2),
26096
+ selectedTools = _useState6[0],
26097
+ setSelectedTools = _useState6[1];
25991
26098
 
25992
26099
  // MCP auth state
25993
- var _useState5 = React.useState(false),
25994
- _useState6 = _slicedToArray(_useState5, 2),
25995
- isAuthorizing = _useState6[0],
25996
- setIsAuthorizing = _useState6[1];
25997
- var _useState7 = React.useState(null),
26100
+ var _useState7 = React.useState(false),
25998
26101
  _useState8 = _slicedToArray(_useState7, 2),
25999
- authResult = _useState8[0],
26000
- setAuthResult = _useState8[1];
26102
+ isAuthorizing = _useState8[0],
26103
+ setIsAuthorizing = _useState8[1];
26104
+ var _useState9 = React.useState(null),
26105
+ _useState0 = _slicedToArray(_useState9, 2),
26106
+ authResult = _useState0[0],
26107
+ setAuthResult = _useState0[1];
26001
26108
 
26002
26109
  // Resolve authCommand: provider.mcpConfig.authCommand > catalogAuthCommand prop
26003
26110
  var resolvedAuthCommand = (provider === null || provider === void 0 || (_provider$mcpConfig = provider.mcpConfig) === null || _provider$mcpConfig === void 0 ? void 0 : _provider$mcpConfig.authCommand) || catalogAuthCommand || null;
@@ -26015,14 +26122,14 @@ var ProviderDetail = function ProviderDetail(_ref) {
26015
26122
  }, [isMcp, provider]);
26016
26123
 
26017
26124
  // Dynamic credential fields for create mode
26018
- var _useState9 = React.useState(isCreating ? [{
26125
+ var _useState1 = React.useState(isCreating ? [{
26019
26126
  id: "default_apiKey",
26020
26127
  key: "apiKey",
26021
26128
  secret: true
26022
26129
  }] : []),
26023
- _useState0 = _slicedToArray(_useState9, 2),
26024
- credentialFields = _useState0[0],
26025
- setCredentialFields = _useState0[1];
26130
+ _useState10 = _slicedToArray(_useState1, 2),
26131
+ credentialFields = _useState10[0],
26132
+ setCredentialFields = _useState10[1];
26026
26133
  var fieldIdRef = React.useRef(0);
26027
26134
  var handleFieldKeyChange = function handleFieldKeyChange(id, newKey) {
26028
26135
  setCredentialFields(function (prev) {
@@ -26114,6 +26221,18 @@ var ProviderDetail = function ProviderDetail(_ref) {
26114
26221
  message: "Connected! Found ".concat((result.tools || []).length, " tools.")
26115
26222
  });
26116
26223
 
26224
+ // Pre-select: intersect with existing allowedTools, or select all
26225
+ var allToolNames = (result.tools || []).map(function (t) {
26226
+ return t.name;
26227
+ });
26228
+ if (provider !== null && provider !== void 0 && provider.allowedTools) {
26229
+ setSelectedTools(allToolNames.filter(function (t) {
26230
+ return provider.allowedTools.includes(t);
26231
+ }));
26232
+ } else {
26233
+ setSelectedTools(allToolNames);
26234
+ }
26235
+
26117
26236
  // Stop after test
26118
26237
  dashApi.mcpStopServer(providerName, function () {}, function () {});
26119
26238
  setIsTesting(false);
@@ -26472,29 +26591,36 @@ var ProviderDetail = function ProviderDetail(_ref) {
26472
26591
  children: authResult.message
26473
26592
  })]
26474
26593
  })
26475
- }), testResult && /*#__PURE__*/jsxRuntime.jsxs("div", {
26594
+ }), testResult && /*#__PURE__*/jsxRuntime.jsx("div", {
26476
26595
  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"),
26477
- children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
26596
+ children: /*#__PURE__*/jsxRuntime.jsxs("div", {
26478
26597
  className: "flex items-center gap-2",
26479
26598
  children: [/*#__PURE__*/jsxRuntime.jsx(DashReact.FontAwesomeIcon, {
26480
26599
  icon: testResult.success ? "circle-check" : "circle-exclamation"
26481
26600
  }), /*#__PURE__*/jsxRuntime.jsx("span", {
26482
26601
  children: testResult.message
26483
26602
  })]
26484
- }), testResult.success && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && /*#__PURE__*/jsxRuntime.jsx("div", {
26485
- className: "mt-2 ml-6 space-y-1",
26486
- children: testResult.tools.map(function (tool) {
26487
- return /*#__PURE__*/jsxRuntime.jsxs("div", {
26488
- className: "text-xs",
26489
- children: [/*#__PURE__*/jsxRuntime.jsx("span", {
26490
- className: "font-mono",
26491
- children: tool.name
26492
- }), tool.description && /*#__PURE__*/jsxRuntime.jsxs("span", {
26493
- className: "opacity-60 ml-2",
26494
- children: ["- ", tool.description]
26495
- })]
26496
- }, tool.name);
26603
+ })
26604
+ }), (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__*/jsxRuntime.jsx(ToolSelector, {
26605
+ tools: testResult.tools,
26606
+ selectedTools: selectedTools,
26607
+ onSelectionChange: setSelectedTools
26608
+ }), !testResult && (provider === null || provider === void 0 ? void 0 : provider.allowedTools) && provider.allowedTools.length > 0 && /*#__PURE__*/jsxRuntime.jsxs("div", {
26609
+ className: "space-y-2",
26610
+ children: [/*#__PURE__*/jsxRuntime.jsx("p", {
26611
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26612
+ children: "Allowed Tools"
26613
+ }), /*#__PURE__*/jsxRuntime.jsx("div", {
26614
+ className: "flex flex-wrap gap-1",
26615
+ children: provider.allowedTools.map(function (tool) {
26616
+ return /*#__PURE__*/jsxRuntime.jsx("span", {
26617
+ className: "text-xs font-mono px-2 py-0.5 rounded bg-white/5 opacity-70",
26618
+ children: tool
26619
+ }, tool);
26497
26620
  })
26621
+ }), /*#__PURE__*/jsxRuntime.jsxs("p", {
26622
+ className: "text-xs opacity-40",
26623
+ children: [provider.allowedTools.length, " tool", provider.allowedTools.length !== 1 ? "s" : "", " allowed \u2014 test connection to modify"]
26498
26624
  })]
26499
26625
  })]
26500
26626
  })]
@@ -26508,6 +26634,12 @@ var ProviderDetail = function ProviderDetail(_ref) {
26508
26634
  title: isTesting ? "Testing..." : "Test Connection",
26509
26635
  onClick: handleTestConnection,
26510
26636
  size: "sm"
26637
+ }), isMcp && selectedTools && onSaveAllowedTools && /*#__PURE__*/jsxRuntime.jsx(DashReact.Button, {
26638
+ title: "Update Allowed Tools",
26639
+ onClick: function onClick() {
26640
+ return onSaveAllowedTools(providerName, selectedTools);
26641
+ },
26642
+ size: "sm"
26511
26643
  }), /*#__PURE__*/jsxRuntime.jsx(DashReact.Button, {
26512
26644
  title: "Edit",
26513
26645
  onClick: function onClick() {
@@ -26621,7 +26753,9 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26621
26753
  _ref2$initialHeaderRo = _ref2.initialHeaderRows,
26622
26754
  initialHeaderRows = _ref2$initialHeaderRo === void 0 ? [] : _ref2$initialHeaderRo,
26623
26755
  _ref2$initialCredenti2 = _ref2.initialCredentials,
26624
- initialCredentials = _ref2$initialCredenti2 === void 0 ? {} : _ref2$initialCredenti2;
26756
+ initialCredentials = _ref2$initialCredenti2 === void 0 ? {} : _ref2$initialCredenti2,
26757
+ _ref2$initialAllowedT = _ref2.initialAllowedTools,
26758
+ initialAllowedTools = _ref2$initialAllowedT === void 0 ? null : _ref2$initialAllowedT;
26625
26759
  var appContext = React.useContext(AppContext);
26626
26760
  var dashApi = appContext === null || appContext === void 0 ? void 0 : appContext.dashApi;
26627
26761
 
@@ -26677,19 +26811,25 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26677
26811
  headerRows = _useState20[0],
26678
26812
  setHeaderRows = _useState20[1];
26679
26813
 
26680
- // JSON editor state
26681
- var _useState21 = React.useState("form"),
26814
+ // Tool selection state
26815
+ var _useState21 = React.useState(initialAllowedTools),
26682
26816
  _useState22 = _slicedToArray(_useState21, 2),
26683
- viewMode = _useState22[0],
26684
- setViewMode = _useState22[1]; // "form" | "json"
26685
- var _useState23 = React.useState(""),
26817
+ selectedTools = _useState22[0],
26818
+ setSelectedTools = _useState22[1];
26819
+
26820
+ // JSON editor state
26821
+ var _useState23 = React.useState("form"),
26686
26822
  _useState24 = _slicedToArray(_useState23, 2),
26687
- jsonText = _useState24[0],
26688
- setJsonText = _useState24[1];
26689
- var _useState25 = React.useState(null),
26823
+ viewMode = _useState24[0],
26824
+ setViewMode = _useState24[1]; // "form" | "json"
26825
+ var _useState25 = React.useState(""),
26690
26826
  _useState26 = _slicedToArray(_useState25, 2),
26691
- jsonError = _useState26[0],
26692
- setJsonError = _useState26[1];
26827
+ jsonText = _useState26[0],
26828
+ setJsonText = _useState26[1];
26829
+ var _useState27 = React.useState(null),
26830
+ _useState28 = _slicedToArray(_useState27, 2),
26831
+ jsonError = _useState28[0],
26832
+ setJsonError = _useState28[1];
26693
26833
 
26694
26834
  // Clear credential data when transport changes (derived fields change entirely)
26695
26835
  // Only in create mode — in edit mode the initial transport is set correctly
@@ -26858,6 +26998,18 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26858
26998
  resources: result.resources || [],
26859
26999
  message: "Connected! Found ".concat((result.tools || []).length, " tools.")
26860
27000
  });
27001
+
27002
+ // Pre-select tools: intersect with existing allowedTools if editing, or select all
27003
+ var allToolNames = (result.tools || []).map(function (t) {
27004
+ return t.name;
27005
+ });
27006
+ if (initialAllowedTools) {
27007
+ setSelectedTools(allToolNames.filter(function (t) {
27008
+ return initialAllowedTools.includes(t);
27009
+ }));
27010
+ } else {
27011
+ setSelectedTools(allToolNames);
27012
+ }
26861
27013
  dashApi.mcpStopServer(testName, function () {}, function () {});
26862
27014
  setIsTesting(false);
26863
27015
  }, function (event, err) {
@@ -26890,11 +27042,11 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26890
27042
  url: result.url,
26891
27043
  headerRows: result.headerRows
26892
27044
  });
26893
- onSave(name, initialProviderType, result.credentialData, config);
27045
+ onSave(name, initialProviderType, result.credentialData, config, selectedTools);
26894
27046
  return;
26895
27047
  }
26896
27048
  if (!validateForm()) return;
26897
- onSave(providerName.trim(), initialProviderType, credentialData, mcpConfig);
27049
+ onSave(providerName.trim(), initialProviderType, credentialData, mcpConfig, selectedTools);
26898
27050
  };
26899
27051
  return /*#__PURE__*/jsxRuntime.jsxs("div", {
26900
27052
  className: "flex flex-col flex-1 min-h-0",
@@ -27278,30 +27430,20 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
27278
27430
  }, field.key);
27279
27431
  })]
27280
27432
  })]
27281
- }), testResult && /*#__PURE__*/jsxRuntime.jsxs("div", {
27433
+ }), testResult && /*#__PURE__*/jsxRuntime.jsx("div", {
27282
27434
  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"),
27283
- children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
27435
+ children: /*#__PURE__*/jsxRuntime.jsxs("div", {
27284
27436
  className: "flex items-center gap-2",
27285
27437
  children: [/*#__PURE__*/jsxRuntime.jsx(DashReact.FontAwesomeIcon, {
27286
27438
  icon: testResult.success ? "circle-check" : "circle-exclamation"
27287
27439
  }), /*#__PURE__*/jsxRuntime.jsx("span", {
27288
27440
  children: testResult.message
27289
27441
  })]
27290
- }), testResult.success && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && /*#__PURE__*/jsxRuntime.jsx("div", {
27291
- className: "mt-2 ml-6 space-y-1",
27292
- children: testResult.tools.map(function (tool) {
27293
- return /*#__PURE__*/jsxRuntime.jsxs("div", {
27294
- className: "text-xs",
27295
- children: [/*#__PURE__*/jsxRuntime.jsx("span", {
27296
- className: "font-mono",
27297
- children: tool.name
27298
- }), tool.description && /*#__PURE__*/jsxRuntime.jsxs("span", {
27299
- className: "opacity-60 ml-2",
27300
- children: ["- ", tool.description]
27301
- })]
27302
- }, tool.name);
27303
- })
27304
- })]
27442
+ })
27443
+ }), (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__*/jsxRuntime.jsx(ToolSelector, {
27444
+ tools: testResult.tools,
27445
+ selectedTools: selectedTools,
27446
+ onSelectionChange: setSelectedTools
27305
27447
  })]
27306
27448
  }), /*#__PURE__*/jsxRuntime.jsxs("div", {
27307
27449
  className: "flex-shrink-0 flex flex-row justify-end gap-2 px-6 py-4 border-t border-white/10",
@@ -27399,30 +27541,34 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27399
27541
  _useState18 = _slicedToArray(_useState17, 2),
27400
27542
  authResult = _useState18[0],
27401
27543
  setAuthResult = _useState18[1];
27544
+ var _useState19 = React.useState(null),
27545
+ _useState20 = _slicedToArray(_useState19, 2),
27546
+ selectedTools = _useState20[0],
27547
+ setSelectedTools = _useState20[1];
27402
27548
 
27403
27549
  // Configuration form state
27404
- var _useState19 = React.useState(""),
27405
- _useState20 = _slicedToArray(_useState19, 2),
27406
- providerName = _useState20[0],
27407
- setProviderName = _useState20[1];
27408
- var _useState21 = React.useState({}),
27550
+ var _useState21 = React.useState(""),
27409
27551
  _useState22 = _slicedToArray(_useState21, 2),
27410
- credentialData = _useState22[0],
27411
- setCredentialData = _useState22[1];
27552
+ providerName = _useState22[0],
27553
+ setProviderName = _useState22[1];
27412
27554
  var _useState23 = React.useState({}),
27413
27555
  _useState24 = _slicedToArray(_useState23, 2),
27414
- formErrors = _useState24[0],
27415
- setFormErrors = _useState24[1];
27556
+ credentialData = _useState24[0],
27557
+ setCredentialData = _useState24[1];
27558
+ var _useState25 = React.useState({}),
27559
+ _useState26 = _slicedToArray(_useState25, 2),
27560
+ formErrors = _useState26[0],
27561
+ setFormErrors = _useState26[1];
27416
27562
 
27417
27563
  // Advanced config row state
27418
- var _useState25 = React.useState([]),
27419
- _useState26 = _slicedToArray(_useState25, 2),
27420
- envMappingRows = _useState26[0],
27421
- setEnvMappingRows = _useState26[1];
27422
27564
  var _useState27 = React.useState([]),
27423
27565
  _useState28 = _slicedToArray(_useState27, 2),
27424
- headerRows = _useState28[0],
27425
- setHeaderRows = _useState28[1];
27566
+ envMappingRows = _useState28[0],
27567
+ setEnvMappingRows = _useState28[1];
27568
+ var _useState29 = React.useState([]),
27569
+ _useState30 = _slicedToArray(_useState29, 2),
27570
+ headerRows = _useState30[0],
27571
+ setHeaderRows = _useState30[1];
27426
27572
  var rowIdRef = React.useRef(0);
27427
27573
  var nextRowId = function nextRowId() {
27428
27574
  return "cat_".concat(++rowIdRef.current);
@@ -27529,6 +27675,11 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27529
27675
  message: "Connected! Found ".concat((result.tools || []).length, " tools.")
27530
27676
  });
27531
27677
 
27678
+ // Pre-select all tools
27679
+ setSelectedTools((result.tools || []).map(function (t) {
27680
+ return t.name;
27681
+ }));
27682
+
27532
27683
  // Stop the test server
27533
27684
  dashApi.mcpStopServer(testName, function () {}, function () {});
27534
27685
  setIsTesting(false);
@@ -27571,7 +27722,7 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27571
27722
  // Handle save
27572
27723
  var handleSaveProvider = function handleSaveProvider() {
27573
27724
  if (!selectedServer || !validateForm()) return;
27574
- onSave(providerName.trim(), selectedServer.id, credentialData, effectiveMcpConfig);
27725
+ onSave(providerName.trim(), selectedServer.id, credentialData, effectiveMcpConfig, selectedTools);
27575
27726
  };
27576
27727
 
27577
27728
  // Select custom server option
@@ -27592,6 +27743,7 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27592
27743
  setIsCustom(false);
27593
27744
  setTestResult(null);
27594
27745
  setAuthResult(null);
27746
+ setSelectedTools(null);
27595
27747
  setProviderName("");
27596
27748
  setCredentialData({});
27597
27749
  setFormErrors({});
@@ -27790,30 +27942,20 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27790
27942
  children: authResult.message
27791
27943
  })]
27792
27944
  })
27793
- }), testResult && /*#__PURE__*/jsxRuntime.jsxs("div", {
27945
+ }), testResult && /*#__PURE__*/jsxRuntime.jsx("div", {
27794
27946
  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"),
27795
- children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
27947
+ children: /*#__PURE__*/jsxRuntime.jsxs("div", {
27796
27948
  className: "flex items-center gap-2",
27797
27949
  children: [/*#__PURE__*/jsxRuntime.jsx(DashReact.FontAwesomeIcon, {
27798
27950
  icon: testResult.success ? "circle-check" : "circle-exclamation"
27799
27951
  }), /*#__PURE__*/jsxRuntime.jsx("span", {
27800
27952
  children: testResult.message
27801
27953
  })]
27802
- }), testResult.success && ((_testResult$tools = testResult.tools) === null || _testResult$tools === void 0 ? void 0 : _testResult$tools.length) > 0 && /*#__PURE__*/jsxRuntime.jsx("div", {
27803
- className: "mt-2 ml-6 space-y-1",
27804
- children: testResult.tools.map(function (tool) {
27805
- return /*#__PURE__*/jsxRuntime.jsxs("div", {
27806
- className: "text-xs",
27807
- children: [/*#__PURE__*/jsxRuntime.jsx("span", {
27808
- className: "font-mono",
27809
- children: tool.name
27810
- }), tool.description && /*#__PURE__*/jsxRuntime.jsxs("span", {
27811
- className: "opacity-60 ml-2",
27812
- children: ["- ", tool.description]
27813
- })]
27814
- }, tool.name);
27815
- })
27816
- })]
27954
+ })
27955
+ }), (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__*/jsxRuntime.jsx(ToolSelector, {
27956
+ tools: testResult.tools,
27957
+ selectedTools: selectedTools,
27958
+ onSelectionChange: setSelectedTools
27817
27959
  })]
27818
27960
  }), /*#__PURE__*/jsxRuntime.jsxs("div", {
27819
27961
  className: "flex-shrink-0 flex flex-row justify-end gap-2 px-6 py-4 border-t border-white/10",
@@ -28084,12 +28226,14 @@ var ProvidersSection = function ProvidersSection(_ref) {
28084
28226
 
28085
28227
  // Handle MCP provider creation from catalog picker
28086
28228
  function handleMcpSave(providerName, providerType, mcpCredentials, mcpConfig) {
28229
+ var allowedTools = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
28087
28230
  if (!dashApi || !appId) return;
28088
28231
  dashApi.saveProvider(appId, providerName, {
28089
28232
  providerType: providerType,
28090
28233
  credentials: mcpCredentials,
28091
28234
  providerClass: "mcp",
28092
- mcpConfig: mcpConfig
28235
+ mcpConfig: mcpConfig,
28236
+ allowedTools: allowedTools
28093
28237
  }, function () {
28094
28238
  setIsAddingMcp(false);
28095
28239
  refreshProviders && refreshProviders();
@@ -28102,6 +28246,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
28102
28246
 
28103
28247
  // Handle MCP provider editing via CustomMcpServerForm
28104
28248
  function handleMcpEditSave(providerName, providerType, mcpCredentials, mcpConfig) {
28249
+ var allowedTools = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
28105
28250
  if (!dashApi || !appId) return;
28106
28251
  var originalName = selectedName;
28107
28252
 
@@ -28113,7 +28258,8 @@ var ProvidersSection = function ProvidersSection(_ref) {
28113
28258
  providerType: providerType,
28114
28259
  credentials: mcpCredentials,
28115
28260
  providerClass: "mcp",
28116
- mcpConfig: mcpConfig
28261
+ mcpConfig: mcpConfig,
28262
+ allowedTools: allowedTools
28117
28263
  }, function () {
28118
28264
  setSelectedName(providerName);
28119
28265
  setProviderTab("mcp");
@@ -28125,6 +28271,24 @@ var ProvidersSection = function ProvidersSection(_ref) {
28125
28271
  });
28126
28272
  }
28127
28273
 
28274
+ // Handle saving just allowedTools for an existing MCP provider
28275
+ function handleSaveAllowedTools(providerName, allowedTools) {
28276
+ if (!dashApi || !appId) return;
28277
+ var existingProvider = providers[providerName];
28278
+ if (!existingProvider) return;
28279
+ dashApi.saveProvider(appId, providerName, {
28280
+ providerType: existingProvider.type,
28281
+ credentials: existingProvider.credentials,
28282
+ providerClass: "mcp",
28283
+ mcpConfig: existingProvider.mcpConfig,
28284
+ allowedTools: allowedTools
28285
+ }, function () {
28286
+ refreshProviders && refreshProviders();
28287
+ }, function (e, err) {
28288
+ return (void 0);
28289
+ });
28290
+ }
28291
+
28128
28292
  // Respond to external create trigger from header
28129
28293
  var prevCreateRequested = React.useRef(false);
28130
28294
  React.useEffect(function () {
@@ -28251,6 +28415,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
28251
28415
  initialUrl: mc.url || "",
28252
28416
  initialHeaderRows: headerTemplateToRows(mc.headerTemplate, nextRowId),
28253
28417
  initialCredentials: selectedProvider.credentials || {},
28418
+ initialAllowedTools: selectedProvider.allowedTools || null,
28254
28419
  onSave: handleMcpEditSave,
28255
28420
  onBack: function onBack() {
28256
28421
  return setIsEditingMcp(false);
@@ -28277,6 +28442,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
28277
28442
  onDelete: function onDelete(name) {
28278
28443
  return setDeleteTarget(name);
28279
28444
  },
28445
+ onSaveAllowedTools: handleSaveAllowedTools,
28280
28446
  catalogAuthCommand: (catalogEntry === null || catalogEntry === void 0 ? void 0 : catalogEntry.authCommand) || null
28281
28447
  });
28282
28448
  }
@@ -29009,9 +29175,20 @@ var InstalledWidgetDetail = function InstalledWidgetDetail(_ref) {
29009
29175
  }), /*#__PURE__*/jsxRuntime.jsx("div", {
29010
29176
  className: "flex flex-wrap gap-1.5",
29011
29177
  children: widget.providers.map(function (p, i) {
29012
- return /*#__PURE__*/jsxRuntime.jsxs("span", {
29013
- className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"] || "bg-white/10", " opacity-70"),
29014
- children: [p.type, p.providerClass === "mcp" ? " (MCP)" : ""]
29178
+ return /*#__PURE__*/jsxRuntime.jsxs("div", {
29179
+ className: "flex flex-col gap-1",
29180
+ children: [/*#__PURE__*/jsxRuntime.jsxs("span", {
29181
+ className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"] || "bg-white/10", " opacity-70 w-fit"),
29182
+ children: [p.type, p.providerClass === "mcp" ? " (MCP)" : ""]
29183
+ }), p.requiredTools && p.requiredTools.length > 0 && /*#__PURE__*/jsxRuntime.jsx("div", {
29184
+ className: "flex flex-wrap gap-1 ml-2",
29185
+ children: p.requiredTools.map(function (tool) {
29186
+ return /*#__PURE__*/jsxRuntime.jsx("span", {
29187
+ className: "text-[10px] font-mono px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
29188
+ children: tool
29189
+ }, tool);
29190
+ })
29191
+ })]
29015
29192
  }, i);
29016
29193
  })
29017
29194
  })]
@@ -29196,14 +29373,33 @@ var RegistryPackageDetail = function RegistryPackageDetail(_ref) {
29196
29373
  }), w.description && /*#__PURE__*/jsxRuntime.jsx("div", {
29197
29374
  className: "text-xs opacity-50 mt-0.5",
29198
29375
  children: w.description
29199
- }), w.providers && w.providers.length > 0 && /*#__PURE__*/jsxRuntime.jsx("div", {
29200
- className: "flex gap-1 mt-1",
29201
- children: w.providers.map(function (p, pidx) {
29202
- return /*#__PURE__*/jsxRuntime.jsxs("span", {
29203
- className: "text-xs px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
29204
- children: [p.type, p.required ? " *" : ""]
29205
- }, pidx);
29206
- })
29376
+ }), w.providers && w.providers.length > 0 && /*#__PURE__*/jsxRuntime.jsxs("div", {
29377
+ className: "space-y-1 mt-1",
29378
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
29379
+ className: "flex gap-1 flex-wrap",
29380
+ children: w.providers.map(function (p, pidx) {
29381
+ return /*#__PURE__*/jsxRuntime.jsxs("span", {
29382
+ className: "text-xs px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
29383
+ children: [p.type, p.required ? " *" : ""]
29384
+ }, pidx);
29385
+ })
29386
+ }), w.providers.some(function (p) {
29387
+ var _p$requiredTools;
29388
+ return ((_p$requiredTools = p.requiredTools) === null || _p$requiredTools === void 0 ? void 0 : _p$requiredTools.length) > 0;
29389
+ }) && /*#__PURE__*/jsxRuntime.jsx("div", {
29390
+ className: "flex flex-wrap gap-1 ml-1",
29391
+ children: w.providers.filter(function (p) {
29392
+ var _p$requiredTools2;
29393
+ return ((_p$requiredTools2 = p.requiredTools) === null || _p$requiredTools2 === void 0 ? void 0 : _p$requiredTools2.length) > 0;
29394
+ }).flatMap(function (p) {
29395
+ return p.requiredTools.map(function (tool) {
29396
+ return /*#__PURE__*/jsxRuntime.jsx("span", {
29397
+ className: "text-[10px] font-mono px-1.5 py-0.5 rounded bg-white/5 opacity-60",
29398
+ children: tool
29399
+ }, "".concat(p.type, "-").concat(tool));
29400
+ });
29401
+ })
29402
+ })]
29207
29403
  })]
29208
29404
  }, idx);
29209
29405
  })
@@ -29243,9 +29439,9 @@ var RegistryPackageDetail = function RegistryPackageDetail(_ref) {
29243
29439
  });
29244
29440
  };
29245
29441
 
29246
- 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; } } }; }
29247
- 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; } }
29248
- 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; }
29442
+ 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; } } }; }
29443
+ 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; } }
29444
+ 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; }
29249
29445
 
29250
29446
  /**
29251
29447
  * useRegistrySearch — shared hook for browsing and installing registry packages.
@@ -29320,11 +29516,11 @@ var useRegistrySearch = function useRegistrySearch() {
29320
29516
 
29321
29517
  // Flatten packages into widget entries
29322
29518
  widgets = [];
29323
- _iterator = _createForOfIteratorHelper$1(pkgs);
29519
+ _iterator = _createForOfIteratorHelper$2(pkgs);
29324
29520
  try {
29325
29521
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
29326
29522
  pkg = _step.value;
29327
- _iterator2 = _createForOfIteratorHelper$1(pkg.widgets || []);
29523
+ _iterator2 = _createForOfIteratorHelper$2(pkg.widgets || []);
29328
29524
  try {
29329
29525
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
29330
29526
  widget = _step2.value;
@@ -29451,10 +29647,15 @@ var useRegistrySearch = function useRegistrySearch() {
29451
29647
  };
29452
29648
  };
29453
29649
 
29650
+ 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; } } }; }
29651
+ 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; } }
29652
+ 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; }
29454
29653
  var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
29455
29654
  var onBack = _ref.onBack;
29456
29655
  var _useContext = React.useContext(DashReact.ThemeContext),
29457
29656
  currentTheme = _useContext.currentTheme;
29657
+ var appContext = React.useContext(AppContext);
29658
+ var providers = (appContext === null || appContext === void 0 ? void 0 : appContext.providers) || {};
29458
29659
  var panelStyles = DashReact.getStylesForItem(DashReact.themeObjects.PANEL, currentTheme, {
29459
29660
  grow: false
29460
29661
  });
@@ -29473,10 +29674,90 @@ var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
29473
29674
  _useState2 = _slicedToArray(_useState, 2),
29474
29675
  selectedPackageName = _useState2[0],
29475
29676
  setSelectedPackageName = _useState2[1];
29677
+ var _useState3 = React.useState(null),
29678
+ _useState4 = _slicedToArray(_useState3, 2),
29679
+ toolConflictWarning = _useState4[0],
29680
+ setToolConflictWarning = _useState4[1];
29476
29681
  var selectedWidget = selectedPackageName ? flatWidgets.find(function (w) {
29477
29682
  return w.packageName === selectedPackageName;
29478
29683
  }) : null;
29684
+
29685
+ // Check if widget's requiredTools conflict with user's provider allowedTools
29686
+ var checkToolConflicts = function checkToolConflicts(widget) {
29687
+ var conflicts = [];
29688
+ var packageWidgets = widget.packageWidgets || [];
29689
+ var _iterator = _createForOfIteratorHelper$1(packageWidgets),
29690
+ _step;
29691
+ try {
29692
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
29693
+ var w = _step.value;
29694
+ var _iterator2 = _createForOfIteratorHelper$1(w.providers || []),
29695
+ _step2;
29696
+ try {
29697
+ var _loop = function _loop() {
29698
+ var _p$requiredTools;
29699
+ var p = _step2.value;
29700
+ if (!((_p$requiredTools = p.requiredTools) !== null && _p$requiredTools !== void 0 && _p$requiredTools.length) || p.providerClass !== "mcp") return 1; // continue
29701
+ // Find matching user provider
29702
+ var matchingProviders = Object.entries(providers).filter(function (_ref2) {
29703
+ var _ref3 = _slicedToArray(_ref2, 2),
29704
+ prov = _ref3[1];
29705
+ return prov.type === p.type && prov.providerClass === "mcp" && prov.allowedTools;
29706
+ });
29707
+ var _iterator3 = _createForOfIteratorHelper$1(matchingProviders),
29708
+ _step3;
29709
+ try {
29710
+ var _loop2 = function _loop2() {
29711
+ var _step3$value = _slicedToArray(_step3.value, 2),
29712
+ provName = _step3$value[0],
29713
+ prov = _step3$value[1];
29714
+ var blocked = p.requiredTools.filter(function (t) {
29715
+ return !prov.allowedTools.includes(t);
29716
+ });
29717
+ if (blocked.length > 0) {
29718
+ conflicts.push({
29719
+ widgetName: w.displayName || w.name,
29720
+ providerName: provName,
29721
+ blockedTools: blocked
29722
+ });
29723
+ }
29724
+ };
29725
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
29726
+ _loop2();
29727
+ }
29728
+ } catch (err) {
29729
+ _iterator3.e(err);
29730
+ } finally {
29731
+ _iterator3.f();
29732
+ }
29733
+ };
29734
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
29735
+ if (_loop()) continue;
29736
+ }
29737
+ } catch (err) {
29738
+ _iterator2.e(err);
29739
+ } finally {
29740
+ _iterator2.f();
29741
+ }
29742
+ }
29743
+ } catch (err) {
29744
+ _iterator.e(err);
29745
+ } finally {
29746
+ _iterator.f();
29747
+ }
29748
+ return conflicts;
29749
+ };
29479
29750
  var handleInstall = function handleInstall() {
29751
+ if (!selectedWidget) return;
29752
+ var conflicts = checkToolConflicts(selectedWidget);
29753
+ if (conflicts.length > 0) {
29754
+ setToolConflictWarning(conflicts);
29755
+ } else {
29756
+ installPackage(selectedWidget);
29757
+ }
29758
+ };
29759
+ var handleConfirmInstall = function handleConfirmInstall() {
29760
+ setToolConflictWarning(null);
29480
29761
  if (selectedWidget) {
29481
29762
  installPackage(selectedWidget);
29482
29763
  }
@@ -29596,6 +29877,20 @@ var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
29596
29877
  }), !isLoading && !error && packages.length > 0 && /*#__PURE__*/jsxRuntime.jsxs("div", {
29597
29878
  className: "flex-shrink-0 px-4 py-2 text-[10px] opacity-40 border-t border-white/10",
29598
29879
  children: [packages.length, " package", packages.length !== 1 ? "s" : ""]
29880
+ }), /*#__PURE__*/jsxRuntime.jsx(DashReact.ConfirmationModal, {
29881
+ isOpen: !!toolConflictWarning,
29882
+ setIsOpen: function setIsOpen() {
29883
+ return setToolConflictWarning(null);
29884
+ },
29885
+ title: "Tool Access Conflict",
29886
+ message: toolConflictWarning ? "This widget requires tools that are blocked by your provider settings:\n\n".concat(toolConflictWarning.map(function (c) {
29887
+ return "\u2022 ".concat(c.widgetName, " needs ").concat(c.blockedTools.join(", "), " (blocked by \"").concat(c.providerName, "\")");
29888
+ }).join("\n"), "\n\nYou can update allowed tools in Settings \u2192 Providers after installing.") : "",
29889
+ confirmLabel: "Install Anyway",
29890
+ onConfirm: handleConfirmInstall,
29891
+ onCancel: function onCancel() {
29892
+ return setToolConflictWarning(null);
29893
+ }
29599
29894
  })]
29600
29895
  });
29601
29896
  };