@trops/dash-core 0.1.435 → 0.1.437

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
@@ -3057,9 +3057,9 @@ var LayoutContainer = function LayoutContainer(_ref) {
3057
3057
 
3058
3058
  function ownKeys$X(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; }
3059
3059
  function _objectSpread$X(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$X(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$X(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3060
- function _createForOfIteratorHelper$t(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$t(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; } } }; }
3061
- function _unsupportedIterableToArray$t(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$t(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$t(r, a) : void 0; } }
3062
- function _arrayLikeToArray$t(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; }
3060
+ function _createForOfIteratorHelper$u(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$u(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; } } }; }
3061
+ function _unsupportedIterableToArray$u(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$u(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$u(r, a) : void 0; } }
3062
+ function _arrayLikeToArray$u(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; }
3063
3063
  /**
3064
3064
  * Layout template definitions for the dashboard template picker.
3065
3065
  *
@@ -3333,7 +3333,7 @@ function createLayoutFromTemplate(template) {
3333
3333
  cols: template.cols,
3334
3334
  gap: "gap-2"
3335
3335
  };
3336
- var _iterator = _createForOfIteratorHelper$t(template.cells),
3336
+ var _iterator = _createForOfIteratorHelper$u(template.cells),
3337
3337
  _step;
3338
3338
  try {
3339
3339
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -4264,9 +4264,9 @@ var RegistryAuthModal = function RegistryAuthModal(_ref) {
4264
4264
  });
4265
4265
  };
4266
4266
 
4267
- function _createForOfIteratorHelper$s(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$s(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; } } }; }
4268
- function _unsupportedIterableToArray$s(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$s(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$s(r, a) : void 0; } }
4269
- function _arrayLikeToArray$s(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; }
4267
+ function _createForOfIteratorHelper$t(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$t(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; } } }; }
4268
+ function _unsupportedIterableToArray$t(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$t(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$t(r, a) : void 0; } }
4269
+ function _arrayLikeToArray$t(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; }
4270
4270
  function ownKeys$W(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; }
4271
4271
  function _objectSpread$W(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$W(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$W(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4272
4272
  var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
@@ -4507,7 +4507,7 @@ var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
4507
4507
  toInstall = 0,
4508
4508
  unavailable = 0,
4509
4509
  hasUnavailableRequired = false;
4510
- var _iterator = _createForOfIteratorHelper$s(widgetDeps),
4510
+ var _iterator = _createForOfIteratorHelper$t(widgetDeps),
4511
4511
  _step;
4512
4512
  try {
4513
4513
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -6282,9 +6282,9 @@ function cleanIpcError(message) {
6282
6282
  return match ? match[1] : message;
6283
6283
  }
6284
6284
 
6285
- function _createForOfIteratorHelper$r(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$r(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; } } }; }
6286
- function _unsupportedIterableToArray$r(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$r(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$r(r, a) : void 0; } }
6287
- function _arrayLikeToArray$r(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; }
6285
+ function _createForOfIteratorHelper$s(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$s(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; } } }; }
6286
+ function _unsupportedIterableToArray$s(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$s(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$s(r, a) : void 0; } }
6287
+ function _arrayLikeToArray$s(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; }
6288
6288
 
6289
6289
  /**
6290
6290
  * useRegistrySearch — shared hook for browsing and installing registry packages.
@@ -6398,13 +6398,13 @@ var useRegistrySearch = function useRegistrySearch() {
6398
6398
  return c.toLowerCase();
6399
6399
  }));
6400
6400
  widgets = [];
6401
- _iterator = _createForOfIteratorHelper$r(pkgs);
6401
+ _iterator = _createForOfIteratorHelper$s(pkgs);
6402
6402
  try {
6403
6403
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
6404
6404
  pkg = _step.value;
6405
6405
  // Compute missing APIs for the entire package
6406
6406
  allApiProviders = [];
6407
- _iterator2 = _createForOfIteratorHelper$r(pkg.providers || []);
6407
+ _iterator2 = _createForOfIteratorHelper$s(pkg.providers || []);
6408
6408
  try {
6409
6409
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
6410
6410
  p = _step2.value;
@@ -6417,11 +6417,11 @@ var useRegistrySearch = function useRegistrySearch() {
6417
6417
  } finally {
6418
6418
  _iterator2.f();
6419
6419
  }
6420
- _iterator3 = _createForOfIteratorHelper$r(pkg.widgets || []);
6420
+ _iterator3 = _createForOfIteratorHelper$s(pkg.widgets || []);
6421
6421
  try {
6422
6422
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
6423
6423
  w = _step3.value;
6424
- _iterator5 = _createForOfIteratorHelper$r(w.providers || []);
6424
+ _iterator5 = _createForOfIteratorHelper$s(w.providers || []);
6425
6425
  try {
6426
6426
  for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
6427
6427
  _p = _step5.value;
@@ -6443,7 +6443,7 @@ var useRegistrySearch = function useRegistrySearch() {
6443
6443
  missingApis = _toConsumableArray(new Set(allApiProviders)).filter(function (api) {
6444
6444
  return !capSet.has(api.toLowerCase());
6445
6445
  });
6446
- _iterator4 = _createForOfIteratorHelper$r(pkg.widgets || []);
6446
+ _iterator4 = _createForOfIteratorHelper$s(pkg.widgets || []);
6447
6447
  try {
6448
6448
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
6449
6449
  widget = _step4.value;
@@ -7064,9 +7064,9 @@ function applyFilters(items, filters, mode) {
7064
7064
  });
7065
7065
  }
7066
7066
 
7067
- function _createForOfIteratorHelper$q(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$q(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; } } }; }
7068
- function _unsupportedIterableToArray$q(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$q(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$q(r, a) : void 0; } }
7069
- function _arrayLikeToArray$q(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; }
7067
+ function _createForOfIteratorHelper$r(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$r(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; } } }; }
7068
+ function _unsupportedIterableToArray$r(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$r(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$r(r, a) : void 0; } }
7069
+ function _arrayLikeToArray$r(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; }
7070
7070
  function ownKeys$U(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; }
7071
7071
  function _objectSpread$U(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$U(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$U(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7072
7072
  var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
@@ -7290,7 +7290,7 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
7290
7290
  installedNames = new Set(installedList.map(function (w) {
7291
7291
  return w.name;
7292
7292
  }));
7293
- _iterator = _createForOfIteratorHelper$q(state.selectedWidgets);
7293
+ _iterator = _createForOfIteratorHelper$r(state.selectedWidgets);
7294
7294
  _context2.prev = 13;
7295
7295
  _iterator.s();
7296
7296
  case 14:
@@ -12919,9 +12919,9 @@ var PanelEditItem = function PanelEditItem(_ref) {
12919
12919
  };
12920
12920
 
12921
12921
  var _excluded$6 = ["rows", "cols"];
12922
- function _createForOfIteratorHelper$p(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$p(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; } } }; }
12923
- function _unsupportedIterableToArray$p(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$p(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$p(r, a) : void 0; } }
12924
- function _arrayLikeToArray$p(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; }
12922
+ function _createForOfIteratorHelper$q(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$q(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; } } }; }
12923
+ function _unsupportedIterableToArray$q(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$q(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$q(r, a) : void 0; } }
12924
+ function _arrayLikeToArray$q(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; }
12925
12925
  function ownKeys$S(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; }
12926
12926
  function _objectSpread$S(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$S(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$S(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12927
12927
  var defaultGrid = {
@@ -13074,7 +13074,7 @@ function GridEditor(_ref) {
13074
13074
  function sortObjectByKeys(obj) {
13075
13075
  var sortedKeys = Object.keys(obj).sort();
13076
13076
  var sortedObj = {};
13077
- var _iterator = _createForOfIteratorHelper$p(sortedKeys),
13077
+ var _iterator = _createForOfIteratorHelper$q(sortedKeys),
13078
13078
  _step;
13079
13079
  try {
13080
13080
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -13547,9 +13547,9 @@ var PanelEditItemNotifications = function PanelEditItemNotifications(_ref) {
13547
13547
  });
13548
13548
  };
13549
13549
 
13550
- function _createForOfIteratorHelper$o(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$o(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; } } }; }
13551
- function _unsupportedIterableToArray$o(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$o(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$o(r, a) : void 0; } }
13552
- function _arrayLikeToArray$o(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; }
13550
+ function _createForOfIteratorHelper$p(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$p(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; } } }; }
13551
+ function _unsupportedIterableToArray$p(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$p(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$p(r, a) : void 0; } }
13552
+ function _arrayLikeToArray$p(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; }
13553
13553
  function ownKeys$Q(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; }
13554
13554
  function _objectSpread$Q(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$Q(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$Q(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13555
13555
  var DAYS = [{
@@ -13878,7 +13878,7 @@ var PanelEditItemSchedule = function PanelEditItemSchedule(_ref2) {
13878
13878
  setIsLoading(true);
13879
13879
  window.mainApi.scheduler.getTasks(widgetUuid).then(function (tasks) {
13880
13880
  var stateMap = {};
13881
- var _iterator = _createForOfIteratorHelper$o(tasks || []),
13881
+ var _iterator = _createForOfIteratorHelper$p(tasks || []),
13882
13882
  _step;
13883
13883
  try {
13884
13884
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -14022,296 +14022,1126 @@ var PanelCode = function PanelCode(_ref) {
14022
14022
  });
14023
14023
  };
14024
14024
 
14025
- var SectionLayout = function SectionLayout(_ref) {
14026
- var listContent = _ref.listContent,
14027
- _ref$detailContent = _ref.detailContent,
14028
- detailContent = _ref$detailContent === void 0 ? null : _ref$detailContent,
14029
- _ref$listWidth = _ref.listWidth,
14030
- listWidth = _ref$listWidth === void 0 ? "w-80" : _ref$listWidth,
14031
- _ref$emptyDetailMessa = _ref.emptyDetailMessage,
14032
- emptyDetailMessage = _ref$emptyDetailMessa === void 0 ? "Select an item to view details" : _ref$emptyDetailMessa;
14033
- var _useContext = useContext(ThemeContext),
14034
- currentTheme = _useContext.currentTheme;
14035
- var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
14036
- grow: false
14037
- });
14038
- var headerStyles = getStylesForItem(themeObjects.PANEL_HEADER, currentTheme, {
14039
- grow: false
14040
- });
14041
- return /*#__PURE__*/jsxs("div", {
14042
- className: "flex flex-row flex-1 min-h-0 ".concat(panelStyles.textColor || "text-gray-200"),
14043
- children: [/*#__PURE__*/jsx("div", {
14044
- className: "flex flex-col flex-shrink-0 ".concat(listWidth, " border-r ").concat(headerStyles.borderColor || "", " overflow-y-auto"),
14045
- children: listContent
14046
- }), /*#__PURE__*/jsx("div", {
14047
- className: "flex flex-col flex-1 min-w-0 min-h-0",
14048
- children: detailContent ? /*#__PURE__*/jsx("div", {
14049
- className: "flex flex-col flex-1 min-h-0",
14050
- children: detailContent
14051
- }) : /*#__PURE__*/jsx("div", {
14052
- className: "flex flex-1 items-center justify-center",
14053
- children: /*#__PURE__*/jsx("span", {
14054
- className: "text-sm opacity-40",
14055
- children: emptyDetailMessage
14056
- })
14057
- })
14058
- })]
14059
- });
14060
- };
14025
+ function _createForOfIteratorHelper$o(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$o(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; } } }; }
14026
+ function _unsupportedIterableToArray$o(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$o(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$o(r, a) : void 0; } }
14027
+ function _arrayLikeToArray$o(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; }
14028
+ /**
14029
+ * providerResolution.js
14030
+ *
14031
+ * Shared helpers for walking a workspace and figuring out which widgets
14032
+ * have required providers that are still unresolved after the 3-layer
14033
+ * resolution (widget → workspace → app-default → null). Used by:
14034
+ *
14035
+ * - DashboardConfigModal to render the Providers tab
14036
+ * - DashboardStage toolbar to show the unresolved-count badge
14037
+ *
14038
+ * Both places need the same answer, so keep the logic here to avoid drift
14039
+ * with the resolution inside `useMcpProvider` / `useWebSocketProvider`.
14040
+ */
14061
14041
 
14062
- var PanelEditItemHandlers = function PanelEditItemHandlers(_ref) {
14063
- var workspace = _ref.workspace,
14064
- onUpdate = _ref.onUpdate,
14065
- _ref$item = _ref.item,
14066
- item = _ref$item === void 0 ? null : _ref$item;
14067
- var _useState = useState(item),
14068
- _useState2 = _slicedToArray(_useState, 2),
14069
- itemSelected = _useState2[0],
14070
- setItemSelected = _useState2[1];
14071
- var _useState3 = useState(workspace),
14072
- _useState4 = _slicedToArray(_useState3, 2),
14073
- workspaceSelected = _useState4[0],
14074
- setWorkspaceSelected = _useState4[1];
14075
- var _useState5 = useState(null),
14076
- _useState6 = _slicedToArray(_useState5, 2),
14077
- eventHandlerSelected = _useState6[0],
14078
- setEventHandlerSelected = _useState6[1];
14079
- useEffect(function () {
14080
- if (deepEqual$1(item, itemSelected) === false) {
14081
- setItemSelected(function () {
14082
- return item;
14083
- });
14084
- }
14085
- if (deepEqual$1(workspace, workspaceSelected) === false) {
14086
- setWorkspaceSelected(function () {
14087
- return workspace;
14088
- });
14089
- }
14090
- // eslint-disable-next-line react-hooks/exhaustive-deps
14091
- }, [workspace, item]);
14092
- function handleSelectEvent(eventString) {
14093
- try {
14094
- if (eventString && eventHandlerSelected !== null) {
14095
- var tempEvents = [];
14096
- var currentListeners = deepCopy(itemSelected["listeners"] || {});
14097
- if (eventHandlerSelected in currentListeners) {
14098
- tempEvents = currentListeners[eventHandlerSelected];
14042
+ /**
14043
+ * Resolve which provider name a given widget instance would bind to for
14044
+ * the given provider type. Mirrors the 3-layer chain in useMcpProvider
14045
+ * and useWebSocketProvider exactly:
14046
+ *
14047
+ * 1. widget-level override (layoutItem.selectedProviders[type])
14048
+ * 2. workspace-level binding (workspace.selectedProviders[id][type])
14049
+ * 3. app default (any provider of matching type flagged
14050
+ * `isDefaultForType` in appProviders)
14051
+ * 4. null (truly unresolved)
14052
+ */
14053
+ function resolveProviderName(_ref) {
14054
+ var _layoutItem$selectedP, _workspace$selectedPr;
14055
+ var providerType = _ref.providerType,
14056
+ layoutItem = _ref.layoutItem,
14057
+ widgetId = _ref.widgetId,
14058
+ workspace = _ref.workspace,
14059
+ appProviders = _ref.appProviders;
14060
+ // 1. Widget-level
14061
+ var widgetLevel = layoutItem === null || layoutItem === void 0 || (_layoutItem$selectedP = layoutItem.selectedProviders) === null || _layoutItem$selectedP === void 0 ? void 0 : _layoutItem$selectedP[providerType];
14062
+ if (widgetLevel) return widgetLevel;
14063
+
14064
+ // 2. Workspace-level
14065
+ var workspaceLevel = widgetId && (workspace === null || workspace === void 0 || (_workspace$selectedPr = workspace.selectedProviders) === null || _workspace$selectedPr === void 0 || (_workspace$selectedPr = _workspace$selectedPr[widgetId]) === null || _workspace$selectedPr === void 0 ? void 0 : _workspace$selectedPr[providerType]);
14066
+ if (workspaceLevel) return workspaceLevel;
14067
+
14068
+ // 3. App default — appProviders is either a map keyed by name or an
14069
+ // array. Support both because different callers shape it either way.
14070
+ if (appProviders) {
14071
+ if (Array.isArray(appProviders)) {
14072
+ var _iterator = _createForOfIteratorHelper$o(appProviders),
14073
+ _step;
14074
+ try {
14075
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
14076
+ var data = _step.value;
14077
+ if ((data === null || data === void 0 ? void 0 : data.type) === providerType && (data === null || data === void 0 ? void 0 : data.isDefaultForType) === true) {
14078
+ return data.name;
14079
+ }
14099
14080
  }
14100
- tempEvents.push(eventString);
14101
- var uniqueEventsSelected = tempEvents.filter(function (value, index, array) {
14102
- return array.indexOf(value) === index;
14103
- });
14104
- currentListeners[eventHandlerSelected] = uniqueEventsSelected;
14105
- handleSaveChanges(currentListeners);
14081
+ } catch (err) {
14082
+ _iterator.e(err);
14083
+ } finally {
14084
+ _iterator.f();
14106
14085
  }
14107
- } catch (e) {
14108
- // select event failed
14109
- }
14110
- }
14111
- function handleRemoveEvent(eventString) {
14112
- try {
14113
- if (eventHandlerSelected) {
14114
- var currentListeners = deepCopy(itemSelected["listeners"] || {});
14115
- var eventsSelectedTemp = eventHandlerSelected in currentListeners ? currentListeners[eventHandlerSelected].filter(function (event) {
14116
- return event !== eventString;
14117
- }) : [];
14118
- if (eventsSelectedTemp.length > 0) {
14119
- if (eventHandlerSelected in currentListeners) {
14120
- currentListeners[eventHandlerSelected] = eventsSelectedTemp;
14121
- }
14122
- } else {
14123
- delete currentListeners[eventHandlerSelected];
14086
+ } else if (_typeof(appProviders) === "object") {
14087
+ for (var _i = 0, _Object$entries = Object.entries(appProviders); _i < _Object$entries.length; _i++) {
14088
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
14089
+ name = _Object$entries$_i[0],
14090
+ _data = _Object$entries$_i[1];
14091
+ if ((_data === null || _data === void 0 ? void 0 : _data.type) === providerType && (_data === null || _data === void 0 ? void 0 : _data.isDefaultForType) === true) {
14092
+ return name;
14124
14093
  }
14125
- handleSaveChanges(currentListeners);
14126
14094
  }
14127
- } catch (e) {
14128
- // remove event failed
14129
14095
  }
14130
14096
  }
14131
- function handleSelectEventHandler(handler) {
14132
- setEventHandlerSelected(function () {
14133
- return handler;
14134
- });
14135
- }
14136
- function getLayoutItemById(id) {
14137
- if (workspaceSelected !== null && Array.isArray(workspaceSelected.layout)) {
14138
- var layoutItems = workspaceSelected.layout.filter(function (layoutItem) {
14139
- return layoutItem["id"] === parseInt(id, 10);
14140
- });
14141
- if (layoutItems.length > 0) {
14142
- return layoutItems[0];
14143
- }
14144
- }
14097
+ return null;
14098
+ }
14099
+
14100
+ /**
14101
+ * Walk every layout container in a workspace and yield each widget
14102
+ * instance with its concrete layout item. Handles the main layout,
14103
+ * per-page layouts, the sidebar, and nested LayoutGridContainers whose
14104
+ * children are stored on `items`/`layout`.
14105
+ *
14106
+ * Deduplicates by object identity AND by stable id so that shared
14107
+ * references across pages (or two structurally-distinct items that
14108
+ * carry the same uuidString / id, which is the wiring key) are
14109
+ * visited exactly once. Pipeline-style workspaces re-reference the
14110
+ * same widget objects across page layouts; without this dedupe the
14111
+ * Providers/Listeners tabs render one row per reference.
14112
+ */
14113
+ function forEachWidget(workspace, visit) {
14114
+ if (!workspace) return;
14115
+ var visitedObjects = new WeakSet();
14116
+ var visitedIds = new Set();
14117
+
14118
+ // Canonical identity: `component|id-ish`. Including the component
14119
+ // prefix in every form aligns this with `canonicalItemKey` in
14120
+ // listenerResolution.js — they MUST agree or duplicates slip
14121
+ // between the visit loop and downstream dedupes. Prefer uuidString
14122
+ // (stable across sessions), then uuid, then numeric id.
14123
+ var stableId = function stableId(item) {
14124
+ if (!item || !item.component) return null;
14125
+ if (item.uuidString) return "".concat(item.component, "|").concat(item.uuidString);
14126
+ if (item.uuid) return "".concat(item.component, "|").concat(item.uuid);
14127
+ if (item.id != null) return "".concat(item.component, "|").concat(item.id);
14145
14128
  return null;
14146
- }
14147
- function handleSaveChanges() {
14148
- var currentListeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
14129
+ };
14130
+ var _walk = function walk(items) {
14131
+ if (!Array.isArray(items)) return;
14132
+ var _iterator2 = _createForOfIteratorHelper$o(items),
14133
+ _step2;
14149
14134
  try {
14150
- if (workspaceSelected !== null && eventHandlerSelected !== null && "id" in itemSelected && itemSelected["id"] !== null) {
14151
- var tempWorkspace = deepCopy(workspaceSelected);
14152
- var layoutItem = getLayoutItemById(itemSelected["id"]);
14153
- layoutItem["listeners"] = currentListeners;
14154
- tempWorkspace["layout"] = replaceItemInLayout(tempWorkspace.layout, layoutItem["id"], layoutItem);
14155
- onUpdate(layoutItem, tempWorkspace);
14135
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
14136
+ var item = _step2.value;
14137
+ if (!item || _typeof(item) !== "object") continue;
14138
+ // A "widget" is any layout item with a component name.
14139
+ // Containers can have both a component name AND nested items
14140
+ // (e.g. LayoutGridContainer), so still recurse.
14141
+ if (item.component) {
14142
+ var id = stableId(item);
14143
+ var alreadyByRef = visitedObjects.has(item);
14144
+ var alreadyById = id != null && visitedIds.has(id);
14145
+ if (!alreadyByRef && !alreadyById) {
14146
+ visitedObjects.add(item);
14147
+ if (id != null) visitedIds.add(id);
14148
+ visit(item);
14149
+ }
14150
+ }
14151
+ if (Array.isArray(item.items)) _walk(item.items);
14152
+ if (Array.isArray(item.layout)) _walk(item.layout);
14156
14153
  }
14157
- } catch (e) {
14158
- // save changes failed
14154
+ } catch (err) {
14155
+ _iterator2.e(err);
14156
+ } finally {
14157
+ _iterator2.f();
14159
14158
  }
14160
- }
14161
- function isSelectedEvent(event) {
14159
+ };
14160
+ _walk(workspace.layout);
14161
+ if (Array.isArray(workspace.pages)) {
14162
+ var _iterator3 = _createForOfIteratorHelper$o(workspace.pages),
14163
+ _step3;
14162
14164
  try {
14163
- if (event && eventHandlerSelected) {
14164
- var itemListeners = (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected["listeners"]) || {};
14165
- if (eventHandlerSelected in itemListeners) {
14166
- return itemListeners[eventHandlerSelected].includes(event);
14167
- }
14168
- return false;
14165
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
14166
+ var page = _step3.value;
14167
+ _walk(page === null || page === void 0 ? void 0 : page.layout);
14169
14168
  }
14170
- return false;
14171
- } catch (e) {
14172
- return false;
14169
+ } catch (err) {
14170
+ _iterator3.e(err);
14171
+ } finally {
14172
+ _iterator3.f();
14173
14173
  }
14174
14174
  }
14175
+ _walk(workspace.sidebarLayout);
14176
+ }
14175
14177
 
14176
- // Get the event handlers for the current item
14177
- var eventHandlers = Array.isArray(itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected.eventHandlers) ? itemSelected.eventHandlers.filter(function (value, index, array) {
14178
- return array.indexOf(value) === index;
14179
- }) : [];
14178
+ /**
14179
+ * Compute the list of unresolved required providers across a workspace.
14180
+ *
14181
+ * @param {object} args
14182
+ * @param {object} args.workspace The workspace (with layout/pages/sidebarLayout/selectedProviders).
14183
+ * @param {object|Array} args.appProviders
14184
+ * Map keyed by provider name, or an array of provider objects. Each
14185
+ * entry has at least `{ type, isDefaultForType }`.
14186
+ * @param {(componentName: string) => Array<{type, required?, providerClass?}>} args.getWidgetRequirements
14187
+ * Returns the `providers: [...]` declaration from the component's
14188
+ * `.dash.js` (via `ComponentManager.componentMap()[name].providers`).
14189
+ *
14190
+ * @returns {Array<{ widgetId, component, providerType, providerClass, layoutItem }>}
14191
+ * One entry per (widget instance, required provider type) that lacks
14192
+ * a binding.
14193
+ */
14194
+ function getUnresolvedProviders(_ref2) {
14195
+ var workspace = _ref2.workspace,
14196
+ appProviders = _ref2.appProviders,
14197
+ getWidgetRequirements = _ref2.getWidgetRequirements;
14198
+ if (!workspace || typeof getWidgetRequirements !== "function") return [];
14199
+ var unresolved = [];
14200
+ forEachWidget(workspace, function (item) {
14201
+ var requirements = getWidgetRequirements(item.component) || [];
14202
+ if (!Array.isArray(requirements) || requirements.length === 0) return;
14203
+ var widgetId = item.uuidString || item.uuid || item.id || null;
14204
+ var _iterator4 = _createForOfIteratorHelper$o(requirements),
14205
+ _step4;
14206
+ try {
14207
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
14208
+ var req = _step4.value;
14209
+ if (!req || !req.type) continue;
14210
+ if (req.required === false) continue; // optional, skip
14180
14211
 
14181
- // Get available source widgets from ALL pages + sidebar + root layout
14182
- function getAllWidgetLayouts(ws) {
14183
- var _ws$pages;
14184
- if (!ws) return [];
14185
- var all = _toConsumableArray(Array.isArray(ws.layout) ? ws.layout : []);
14186
- if (((_ws$pages = ws.pages) === null || _ws$pages === void 0 ? void 0 : _ws$pages.length) > 0) {
14187
- ws.pages.forEach(function (page) {
14188
- if (Array.isArray(page.layout)) all.push.apply(all, _toConsumableArray(page.layout));
14189
- });
14190
- }
14191
- if (Array.isArray(ws.sidebarLayout) && ws.sidebarLayout.length > 0) {
14192
- all.push.apply(all, _toConsumableArray(ws.sidebarLayout));
14212
+ var name = resolveProviderName({
14213
+ providerType: req.type,
14214
+ layoutItem: item,
14215
+ widgetId: widgetId,
14216
+ workspace: workspace,
14217
+ appProviders: appProviders
14218
+ });
14219
+ if (!name) {
14220
+ unresolved.push({
14221
+ widgetId: widgetId,
14222
+ component: item.component,
14223
+ providerType: req.type,
14224
+ providerClass: req.providerClass || null,
14225
+ layoutItem: item
14226
+ });
14227
+ }
14228
+ }
14229
+ } catch (err) {
14230
+ _iterator4.e(err);
14231
+ } finally {
14232
+ _iterator4.f();
14193
14233
  }
14194
- return all;
14195
- }
14196
- var layoutArray = getAllWidgetLayouts(workspaceSelected);
14197
- var sourceWidgets = layoutArray.filter(function (l) {
14198
- return l["component"] !== "Container" && l["component"] !== "LayoutContainer";
14199
- }).filter(function (e) {
14200
- return Array.isArray(e.events) && e.events.length > 0;
14201
- }).filter(function (li) {
14202
- return li["component"] !== (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected["component"]);
14203
14234
  });
14235
+ return unresolved;
14236
+ }
14204
14237
 
14205
- // Build a set of valid event strings from widgets currently in the layout
14206
- var validEventStrings = new Set();
14207
- sourceWidgets.forEach(function (layout) {
14208
- if (Array.isArray(layout.events)) {
14209
- layout.events.forEach(function (event) {
14210
- validEventStrings.add("".concat(layout["component"], "[").concat(layout["id"], "].").concat(event));
14211
- });
14238
+ /**
14239
+ * Group an unresolved-provider list (or any `{widget, providerType}` list)
14240
+ * by provider type, so the Providers tab can render one row per unique
14241
+ * type with N widgets beneath.
14242
+ */
14243
+ function groupByProviderType(unresolved) {
14244
+ var byType = new Map();
14245
+ var _iterator5 = _createForOfIteratorHelper$o(unresolved || []),
14246
+ _step5;
14247
+ try {
14248
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
14249
+ var u = _step5.value;
14250
+ if (!(u !== null && u !== void 0 && u.providerType)) continue;
14251
+ if (!byType.has(u.providerType)) byType.set(u.providerType, []);
14252
+ byType.get(u.providerType).push(u);
14212
14253
  }
14213
- });
14254
+ } catch (err) {
14255
+ _iterator5.e(err);
14256
+ } finally {
14257
+ _iterator5.f();
14258
+ }
14259
+ return byType;
14260
+ }
14214
14261
 
14215
- // Get the listeners for the current item, filtering out orphaned references
14216
- var rawListeners = itemSelected ? itemSelected["listeners"] || {} : {};
14217
- var listeners = {};
14218
- Object.keys(rawListeners).forEach(function (handler) {
14219
- var events = rawListeners[handler];
14220
- if (Array.isArray(events)) {
14221
- var validEvents = events.filter(function (e) {
14222
- return validEventStrings.has(e);
14223
- });
14224
- if (validEvents.length > 0) {
14225
- listeners[handler] = validEvents;
14262
+ /**
14263
+ * Summarize every widget in the workspace that requires ANY provider,
14264
+ * regardless of whether it's already resolved. Drives the Providers tab's
14265
+ * "show per-widget overrides" expansion — the modal lists all widgets so
14266
+ * the user can change an explicit override even for types that are
14267
+ * already resolved via the app default.
14268
+ */
14269
+ function getAllProviderBindings(_ref3) {
14270
+ var workspace = _ref3.workspace,
14271
+ appProviders = _ref3.appProviders,
14272
+ getWidgetRequirements = _ref3.getWidgetRequirements;
14273
+ if (!workspace || typeof getWidgetRequirements !== "function") return [];
14274
+ var bindings = [];
14275
+ forEachWidget(workspace, function (item) {
14276
+ var requirements = getWidgetRequirements(item.component) || [];
14277
+ if (!Array.isArray(requirements) || requirements.length === 0) return;
14278
+ var widgetId = item.uuidString || item.uuid || item.id || null;
14279
+ var _iterator6 = _createForOfIteratorHelper$o(requirements),
14280
+ _step6;
14281
+ try {
14282
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
14283
+ var req = _step6.value;
14284
+ if (!req || !req.type) continue;
14285
+ var name = resolveProviderName({
14286
+ providerType: req.type,
14287
+ layoutItem: item,
14288
+ widgetId: widgetId,
14289
+ workspace: workspace,
14290
+ appProviders: appProviders
14291
+ });
14292
+ bindings.push({
14293
+ widgetId: widgetId,
14294
+ component: item.component,
14295
+ providerType: req.type,
14296
+ providerClass: req.providerClass || null,
14297
+ required: req.required !== false,
14298
+ resolvedProviderName: name,
14299
+ layoutItem: item
14300
+ });
14226
14301
  }
14302
+ } catch (err) {
14303
+ _iterator6.e(err);
14304
+ } finally {
14305
+ _iterator6.f();
14227
14306
  }
14228
14307
  });
14308
+ return bindings;
14309
+ }
14229
14310
 
14230
- // Count connected events for a handler
14231
- function getConnectedCount(handler) {
14232
- return (listeners[handler] || []).length;
14233
- }
14311
+ function ownKeys$O(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; }
14312
+ function _objectSpread$O(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$O(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$O(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14313
+ function _createForOfIteratorHelper$n(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$n(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; } } }; }
14314
+ function _unsupportedIterableToArray$n(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$n(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$n(r, a) : void 0; } }
14315
+ function _arrayLikeToArray$n(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; }
14316
+ var EVENT_STRING_RE = /^([^[]+)\[([^\]]+)\]\.(.+)$/;
14234
14317
 
14235
- // Build the list content (left column)
14236
- var listContent = /*#__PURE__*/jsxs(Sidebar.Content, {
14237
- children: [/*#__PURE__*/jsx("div", {
14238
- className: "px-3 py-2 text-xs font-semibold opacity-40 uppercase tracking-wider",
14239
- children: "Event Handlers"
14240
- }), eventHandlers.map(function (handler) {
14241
- var count = getConnectedCount(handler);
14242
- var isActive = eventHandlerSelected === handler;
14243
- return /*#__PURE__*/jsx(Sidebar.Item, {
14244
- icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
14245
- icon: "bolt",
14246
- className: "h-3.5 w-3.5"
14247
- }),
14248
- active: isActive,
14249
- onClick: function onClick() {
14250
- return handleSelectEventHandler(handler);
14251
- },
14252
- badge: count > 0 ? String(count) : null,
14253
- className: isActive ? "bg-white/10 opacity-100" : "",
14254
- children: handler
14255
- }, handler);
14256
- }), eventHandlers.length === 0 && /*#__PURE__*/jsx("span", {
14257
- className: "text-sm opacity-40 py-8 text-center",
14258
- children: "No handlers available"
14259
- })]
14260
- });
14318
+ /** Parse "Component[itemId].event" { component, itemId, event }. */
14319
+ function parseEventString(eventString) {
14320
+ if (typeof eventString !== "string") return null;
14321
+ var m = eventString.match(EVENT_STRING_RE);
14322
+ if (!m) return null;
14323
+ return {
14324
+ component: m[1],
14325
+ itemId: m[2],
14326
+ event: m[3]
14327
+ };
14328
+ }
14261
14329
 
14262
- // Build the detail content (right column) when a handler is selected
14263
- var connectedCount = eventHandlerSelected ? getConnectedCount(eventHandlerSelected) : 0;
14264
- var detailContent = eventHandlerSelected ? /*#__PURE__*/jsx("div", {
14265
- className: "flex flex-col flex-1 min-h-0",
14266
- children: /*#__PURE__*/jsxs("div", {
14267
- className: "flex-1 min-h-0 overflow-y-auto p-6 space-y-6",
14268
- children: [/*#__PURE__*/jsxs("div", {
14269
- className: "flex flex-col space-y-1",
14270
- children: [/*#__PURE__*/jsx(SubHeading3, {
14271
- title: eventHandlerSelected,
14272
- padding: false
14273
- }), /*#__PURE__*/jsxs("span", {
14274
- className: "text-sm opacity-70",
14275
- children: [connectedCount, " event", connectedCount !== 1 ? "s" : "", " connected"]
14276
- })]
14277
- }), sourceWidgets.map(function (layout) {
14278
- return /*#__PURE__*/jsxs("div", {
14279
- className: "flex flex-col space-y-2",
14280
- children: [/*#__PURE__*/jsxs("span", {
14281
- className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
14282
- children: [layout["component"], " [", layout["id"], "]"]
14283
- }), layout.events.filter(function (value, index, array) {
14284
- return array.indexOf(value) === index;
14285
- }).map(function (event) {
14286
- var eventString = "".concat(layout["component"], "[").concat(layout["id"], "].").concat(event);
14287
- var selected = isSelectedEvent(eventString);
14288
- return /*#__PURE__*/jsxs("div", {
14289
- onClick: function onClick() {
14290
- return selected ? handleRemoveEvent(eventString) : handleSelectEvent(eventString);
14291
- },
14292
- className: "flex flex-row items-center gap-3 px-3 py-2 rounded-md cursor-pointer ".concat(selected ? "opacity-100" : "opacity-60 hover:opacity-80"),
14293
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
14294
- icon: selected ? "square-check" : "square",
14295
- className: "h-4 w-4 flex-shrink-0"
14296
- }), /*#__PURE__*/jsx("span", {
14297
- className: "text-sm",
14298
- children: event
14299
- })]
14300
- }, eventString);
14301
- })]
14302
- }, layout["id"]);
14303
- }), sourceWidgets.length === 0 && /*#__PURE__*/jsx("span", {
14304
- className: "text-sm opacity-40",
14305
- children: "No events available from other widgets"
14306
- })]
14307
- })
14308
- }) : null;
14309
- if (!itemSelected || !workspaceSelected) {
14310
- return null;
14311
- }
14312
- return /*#__PURE__*/jsx(SectionLayout, {
14313
- listContent: listContent,
14314
- detailContent: detailContent,
14330
+ /** Build an event string in the canonical runtime format. */
14331
+ function formatEventString(component, itemId, event) {
14332
+ return "".concat(component, "[").concat(itemId, "].").concat(event);
14333
+ }
14334
+
14335
+ /**
14336
+ * Get a stable id for a layout item. Layout items historically used
14337
+ * numeric `id`; some newer flows also carry `uuidString`/`uuid`. The
14338
+ * runtime event-string format uses whichever is `item.id`, so we
14339
+ * default to that and fall back to the others for resilience.
14340
+ */
14341
+ function itemIdOf(item) {
14342
+ if (item == null) return null;
14343
+ if (item.id !== undefined && item.id !== null) return String(item.id);
14344
+ if (item.uuidString) return item.uuidString;
14345
+ if (item.uuid) return item.uuid;
14346
+ return null;
14347
+ }
14348
+
14349
+ /**
14350
+ * Canonical identity key for a layout item: `component|id-ish`.
14351
+ * Single source of truth for dedupe in every query below and in
14352
+ * `forEachWidget` (providerResolution.js). Including the component
14353
+ * prefix prevents two structurally-different widgets from colliding
14354
+ * when they happen to share a uuid (rare, but possible when items
14355
+ * are pasted between workspaces).
14356
+ *
14357
+ * Priority matches forEachWidget's stableId so a widget that
14358
+ * forEachWidget visited once produces exactly one map entry across
14359
+ * every listener-side consumer — no more `STAGEGATECHECKLIST[4]`
14360
+ * appearing twice because one caller used `uuidString` and the
14361
+ * other used `id`.
14362
+ */
14363
+ function canonicalItemKey(item) {
14364
+ if (!item || !item.component) return null;
14365
+ if (item.uuidString) return "".concat(item.component, "|").concat(item.uuidString);
14366
+ if (item.uuid) return "".concat(item.component, "|").concat(item.uuid);
14367
+ if (item.id !== undefined && item.id !== null) {
14368
+ return "".concat(item.component, "|").concat(item.id);
14369
+ }
14370
+ return null;
14371
+ }
14372
+
14373
+ /**
14374
+ * Best-effort human label for a layout item: explicit title, then
14375
+ * widget config display name, then component name + short id.
14376
+ */
14377
+ function labelFor(item, getWidgetConfig) {
14378
+ var _item$userPrefs, _item$userConfig;
14379
+ var cfg = (getWidgetConfig === null || getWidgetConfig === void 0 ? void 0 : getWidgetConfig(item.component)) || null;
14380
+ var explicit = (item === null || item === void 0 || (_item$userPrefs = item.userPrefs) === null || _item$userPrefs === void 0 ? void 0 : _item$userPrefs.title) || (item === null || item === void 0 || (_item$userConfig = item.userConfig) === null || _item$userConfig === void 0 ? void 0 : _item$userConfig.title);
14381
+ if (explicit) return explicit;
14382
+ if (cfg !== null && cfg !== void 0 && cfg.displayName) return cfg.displayName;
14383
+ var id = itemIdOf(item);
14384
+ return "".concat(item.component || "widget").concat(id ? "[".concat(String(id).slice(0, 6), "]") : "");
14385
+ }
14386
+
14387
+ /**
14388
+ * Read the events/eventHandlers metadata for a widget. Items can carry
14389
+ * the arrays inline (older pattern where they got cached onto the
14390
+ * layout item); the current component config carries them via the
14391
+ * ComponentManager catalog. We UNION both so we don't flag a binding
14392
+ * as orphaned just because an inline cache is stale — if the current
14393
+ * widget code declares the event/handler, the binding is valid.
14394
+ */
14395
+ function eventsOf(item, getWidgetConfig) {
14396
+ var inline = Array.isArray(item.events) ? item.events : [];
14397
+ var cfg = (getWidgetConfig === null || getWidgetConfig === void 0 ? void 0 : getWidgetConfig(item.component)) || {};
14398
+ var fromCfg = Array.isArray(cfg.events) ? cfg.events : [];
14399
+ return _toConsumableArray(new Set([].concat(_toConsumableArray(inline), _toConsumableArray(fromCfg))));
14400
+ }
14401
+ function eventHandlersOf(item, getWidgetConfig) {
14402
+ var inline = Array.isArray(item.eventHandlers) ? item.eventHandlers : [];
14403
+ var cfg = (getWidgetConfig === null || getWidgetConfig === void 0 ? void 0 : getWidgetConfig(item.component)) || {};
14404
+ var fromCfg = Array.isArray(cfg.eventHandlers) ? cfg.eventHandlers : [];
14405
+ return _toConsumableArray(new Set([].concat(_toConsumableArray(inline), _toConsumableArray(fromCfg))));
14406
+ }
14407
+
14408
+ /**
14409
+ * Every widget instance in the workspace that emits at least one event.
14410
+ * Deduplicated by `${component}|${itemId}` — the same compound key that
14411
+ * event strings use at runtime, so any "duplicate" in the tree (same
14412
+ * widget referenced across pages) resolves to the same wiring target.
14413
+ * @returns {Array<{ itemId, component, label, events: string[], key: string }>}
14414
+ */
14415
+ function getEmitters(workspace, getWidgetConfig) {
14416
+ var byKey = new Map();
14417
+ forEachWidget(workspace, function (item) {
14418
+ var events = eventsOf(item, getWidgetConfig);
14419
+ if (events.length === 0) return;
14420
+ var key = canonicalItemKey(item);
14421
+ if (!key) return;
14422
+ if (byKey.has(key)) return;
14423
+ byKey.set(key, {
14424
+ key: key,
14425
+ itemId: itemIdOf(item),
14426
+ component: item.component,
14427
+ label: labelFor(item, getWidgetConfig),
14428
+ events: events
14429
+ });
14430
+ });
14431
+ return Array.from(byKey.values());
14432
+ }
14433
+
14434
+ /**
14435
+ * Every widget instance in the workspace that accepts at least one
14436
+ * handler. Used to populate the receiver dropdown. Deduplicated by
14437
+ * `${component}|${itemId}` (see getEmitters).
14438
+ * @returns {Array<{ itemId, component, label, eventHandlers: string[], listeners: object, key: string }>}
14439
+ */
14440
+ function getReceivers(workspace, getWidgetConfig) {
14441
+ var byKey = new Map();
14442
+ forEachWidget(workspace, function (item) {
14443
+ var handlers = eventHandlersOf(item, getWidgetConfig);
14444
+ if (handlers.length === 0) return;
14445
+ var key = canonicalItemKey(item);
14446
+ if (!key) return;
14447
+ if (byKey.has(key)) return;
14448
+ byKey.set(key, {
14449
+ key: key,
14450
+ itemId: itemIdOf(item),
14451
+ component: item.component,
14452
+ label: labelFor(item, getWidgetConfig),
14453
+ eventHandlers: handlers,
14454
+ listeners: item.listeners || {}
14455
+ });
14456
+ });
14457
+ return Array.from(byKey.values());
14458
+ }
14459
+
14460
+ /**
14461
+ * Flatten every listener binding in the workspace into a list of
14462
+ * { receiverItemId, receiverComponent, handlerName, sourceComponent,
14463
+ * sourceItemId, eventName, raw } tuples. `raw` is the original
14464
+ * event string for round-trip fidelity on remove.
14465
+ */
14466
+ function getCurrentWiring(workspace) {
14467
+ var wiring = [];
14468
+ forEachWidget(workspace, function (item) {
14469
+ var receiverItemId = itemIdOf(item);
14470
+ if (receiverItemId == null) return;
14471
+ var listeners = item.listeners;
14472
+ if (!listeners || _typeof(listeners) !== "object") return;
14473
+ for (var _i = 0, _Object$entries = Object.entries(listeners); _i < _Object$entries.length; _i++) {
14474
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
14475
+ handlerName = _Object$entries$_i[0],
14476
+ eventList = _Object$entries$_i[1];
14477
+ // Live format is array; defensive guard for legacy object
14478
+ // form (a single source widget keyed under the handler).
14479
+ var events = Array.isArray(eventList) ? eventList : typeof eventList === "string" ? [eventList] : [];
14480
+ var _iterator = _createForOfIteratorHelper$n(events),
14481
+ _step;
14482
+ try {
14483
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
14484
+ var raw = _step.value;
14485
+ var parsed = parseEventString(raw);
14486
+ if (!parsed) continue;
14487
+ wiring.push({
14488
+ receiverItemId: receiverItemId,
14489
+ receiverComponent: item.component,
14490
+ handlerName: handlerName,
14491
+ sourceComponent: parsed.component,
14492
+ sourceItemId: parsed.itemId,
14493
+ eventName: parsed.event,
14494
+ raw: raw
14495
+ });
14496
+ }
14497
+ } catch (err) {
14498
+ _iterator.e(err);
14499
+ } finally {
14500
+ _iterator.f();
14501
+ }
14502
+ }
14503
+ });
14504
+ return wiring;
14505
+ }
14506
+
14507
+ /**
14508
+ * Detect listener bindings that are no longer valid: the source widget
14509
+ * doesn't exist in the workspace anymore, or the source widget doesn't
14510
+ * declare the event, or the receiver doesn't declare the handler.
14511
+ * Each entry includes a `reason` so the modal can show a sensible
14512
+ * message.
14513
+ */
14514
+ function getOrphanedListeners(workspace, getWidgetConfig) {
14515
+ var wiring = getCurrentWiring(workspace);
14516
+ if (wiring.length === 0) return [];
14517
+
14518
+ // Build two lookups:
14519
+ // byCompositeKey: `${component}|${itemId}` → widget meta (primary)
14520
+ // byItemId: `${itemId}` → widget meta (fallback,
14521
+ // used only for the "source-missing" check where
14522
+ // the wiring's component can't be trusted yet)
14523
+ // The composite key matches how the runtime event-string
14524
+ // (`Component[itemId].event`) identifies a widget, so orphan
14525
+ // decisions line up with what actually fires at runtime.
14526
+ var byCompositeKey = new Map();
14527
+ var byItemId = new Map();
14528
+ forEachWidget(workspace, function (item) {
14529
+ var id = itemIdOf(item);
14530
+ if (id == null) return;
14531
+ var meta = {
14532
+ component: item.component,
14533
+ events: eventsOf(item, getWidgetConfig),
14534
+ eventHandlers: eventHandlersOf(item, getWidgetConfig)
14535
+ };
14536
+ byCompositeKey.set("".concat(item.component, "|").concat(id), meta);
14537
+ // First-seen wins on numeric-id collisions; good enough for the
14538
+ // "does any widget with this id exist?" fallback.
14539
+ if (!byItemId.has(id)) byItemId.set(id, meta);
14540
+ });
14541
+ var orphans = [];
14542
+ var _iterator2 = _createForOfIteratorHelper$n(wiring),
14543
+ _step2;
14544
+ try {
14545
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
14546
+ var w = _step2.value;
14547
+ var srcKey = "".concat(w.sourceComponent, "|").concat(w.sourceItemId);
14548
+ var src = byCompositeKey.get(srcKey);
14549
+ if (!src) {
14550
+ // No (component, id) match. If some OTHER widget still owns
14551
+ // this id, the source component changed; otherwise it's truly
14552
+ // missing. Preserves the user's ability to see whether a
14553
+ // rename happened vs. a delete.
14554
+ var fallback = byItemId.get(String(w.sourceItemId));
14555
+ orphans.push(_objectSpread$O(_objectSpread$O({}, w), {}, {
14556
+ reason: fallback ? "source-component-mismatch" : "source-missing"
14557
+ }));
14558
+ continue;
14559
+ }
14560
+ if (!src.events.includes(w.eventName)) {
14561
+ orphans.push(_objectSpread$O(_objectSpread$O({}, w), {}, {
14562
+ reason: "event-not-emitted"
14563
+ }));
14564
+ continue;
14565
+ }
14566
+ var receiverKey = "".concat(w.receiverComponent, "|").concat(w.receiverItemId);
14567
+ var receiver = byCompositeKey.get(receiverKey);
14568
+ if (receiver && !receiver.eventHandlers.includes(w.handlerName)) {
14569
+ orphans.push(_objectSpread$O(_objectSpread$O({}, w), {}, {
14570
+ reason: "handler-not-declared"
14571
+ }));
14572
+ }
14573
+ }
14574
+ } catch (err) {
14575
+ _iterator2.e(err);
14576
+ } finally {
14577
+ _iterator2.f();
14578
+ }
14579
+ return orphans;
14580
+ }
14581
+
14582
+ /**
14583
+ * Mutate a workspace tree in place, removing listener bindings whose
14584
+ * source widget is not present in the workspace. Pure: doesn't need
14585
+ * ComponentManager, so it's safe to call from WorkspaceModel during
14586
+ * load — the workspace's own tree is the only source of truth.
14587
+ *
14588
+ * Handles the four cases producing a "source-missing" orphan:
14589
+ * - the emitter widget was deleted
14590
+ * - the emitter widget's id now belongs to a different component
14591
+ * (stored binding has stale component name)
14592
+ * - the source string failed to parse (legacy/garbage data)
14593
+ *
14594
+ * Leaves "event-not-emitted" / "handler-not-declared" cases untouched
14595
+ * because they require the current widget catalog to decide — those
14596
+ * are handled at runtime with full ComponentManager access.
14597
+ *
14598
+ * @returns {number} count of bindings removed (for logging/diagnostics)
14599
+ */
14600
+ function pruneDeadListenerReferences(workspace) {
14601
+ if (!workspace) return 0;
14602
+
14603
+ // Build the set of live widgets in the tree, keyed by the same
14604
+ // `${component}|${itemId}` the runtime uses to resolve events.
14605
+ var liveKeys = new Set();
14606
+ var _walkForLive = function walkForLive(items) {
14607
+ if (!Array.isArray(items)) return;
14608
+ var _iterator3 = _createForOfIteratorHelper$n(items),
14609
+ _step3;
14610
+ try {
14611
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
14612
+ var item = _step3.value;
14613
+ if (!item || _typeof(item) !== "object") continue;
14614
+ if (item.component) {
14615
+ var id = itemIdOf(item);
14616
+ if (id != null) liveKeys.add("".concat(item.component, "|").concat(id));
14617
+ }
14618
+ if (Array.isArray(item.items)) _walkForLive(item.items);
14619
+ if (Array.isArray(item.layout)) _walkForLive(item.layout);
14620
+ }
14621
+ } catch (err) {
14622
+ _iterator3.e(err);
14623
+ } finally {
14624
+ _iterator3.f();
14625
+ }
14626
+ };
14627
+ _walkForLive(workspace.layout);
14628
+ if (Array.isArray(workspace.pages)) {
14629
+ var _iterator4 = _createForOfIteratorHelper$n(workspace.pages),
14630
+ _step4;
14631
+ try {
14632
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
14633
+ var page = _step4.value;
14634
+ _walkForLive(page === null || page === void 0 ? void 0 : page.layout);
14635
+ }
14636
+ } catch (err) {
14637
+ _iterator4.e(err);
14638
+ } finally {
14639
+ _iterator4.f();
14640
+ }
14641
+ }
14642
+ _walkForLive(workspace.sidebarLayout);
14643
+ var removed = 0;
14644
+ var _pruneListeners = function pruneListeners(items) {
14645
+ if (!Array.isArray(items)) return;
14646
+ var _iterator5 = _createForOfIteratorHelper$n(items),
14647
+ _step5;
14648
+ try {
14649
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
14650
+ var item = _step5.value;
14651
+ if (!item || _typeof(item) !== "object") continue;
14652
+ if (item.listeners && _typeof(item.listeners) === "object") {
14653
+ for (var _i2 = 0, _Object$keys = Object.keys(item.listeners); _i2 < _Object$keys.length; _i2++) {
14654
+ var handler = _Object$keys[_i2];
14655
+ var events = item.listeners[handler];
14656
+ if (!Array.isArray(events)) continue;
14657
+ var kept = [];
14658
+ var _iterator6 = _createForOfIteratorHelper$n(events),
14659
+ _step6;
14660
+ try {
14661
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
14662
+ var raw = _step6.value;
14663
+ var parsed = parseEventString(raw);
14664
+ if (parsed && liveKeys.has("".concat(parsed.component, "|").concat(parsed.itemId))) {
14665
+ kept.push(raw);
14666
+ } else {
14667
+ removed += 1;
14668
+ }
14669
+ }
14670
+ } catch (err) {
14671
+ _iterator6.e(err);
14672
+ } finally {
14673
+ _iterator6.f();
14674
+ }
14675
+ if (kept.length === 0) {
14676
+ delete item.listeners[handler];
14677
+ } else if (kept.length !== events.length) {
14678
+ item.listeners[handler] = kept;
14679
+ }
14680
+ }
14681
+ }
14682
+ if (Array.isArray(item.items)) _pruneListeners(item.items);
14683
+ if (Array.isArray(item.layout)) _pruneListeners(item.layout);
14684
+ }
14685
+ } catch (err) {
14686
+ _iterator5.e(err);
14687
+ } finally {
14688
+ _iterator5.f();
14689
+ }
14690
+ };
14691
+ _pruneListeners(workspace.layout);
14692
+ if (Array.isArray(workspace.pages)) {
14693
+ var _iterator7 = _createForOfIteratorHelper$n(workspace.pages),
14694
+ _step7;
14695
+ try {
14696
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
14697
+ var _page = _step7.value;
14698
+ _pruneListeners(_page === null || _page === void 0 ? void 0 : _page.layout);
14699
+ }
14700
+ } catch (err) {
14701
+ _iterator7.e(err);
14702
+ } finally {
14703
+ _iterator7.f();
14704
+ }
14705
+ }
14706
+ _pruneListeners(workspace.sidebarLayout);
14707
+ return removed;
14708
+ }
14709
+
14710
+ /**
14711
+ * Apply a staged delta to a workspace's listener bindings and return a
14712
+ * NEW workspace object (deep-cloned along the modified path).
14713
+ *
14714
+ * `adds` / `removes` are arrays of
14715
+ * { receiverItemId, handlerName, sourceComponent, sourceItemId, eventName }
14716
+ *
14717
+ * Removes may also pass `raw` (the exact pre-existing event string) for
14718
+ * a precise match; otherwise we match on the canonical formatted form.
14719
+ */
14720
+ function applyWiringChanges(workspace, _ref) {
14721
+ var _ref$adds = _ref.adds,
14722
+ adds = _ref$adds === void 0 ? [] : _ref$adds,
14723
+ _ref$removes = _ref.removes,
14724
+ removes = _ref$removes === void 0 ? [] : _ref$removes;
14725
+ if (!workspace) return workspace;
14726
+ if (adds.length === 0 && removes.length === 0) return workspace;
14727
+
14728
+ // Group changes by receiver for cheap per-item updates.
14729
+ var byReceiver = new Map();
14730
+ var ensure = function ensure(id) {
14731
+ if (!byReceiver.has(id)) byReceiver.set(id, {
14732
+ adds: [],
14733
+ removes: []
14734
+ });
14735
+ return byReceiver.get(id);
14736
+ };
14737
+ var _iterator8 = _createForOfIteratorHelper$n(adds),
14738
+ _step8;
14739
+ try {
14740
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
14741
+ var a = _step8.value;
14742
+ if (!a.receiverItemId) continue;
14743
+ ensure(String(a.receiverItemId)).adds.push(a);
14744
+ }
14745
+ } catch (err) {
14746
+ _iterator8.e(err);
14747
+ } finally {
14748
+ _iterator8.f();
14749
+ }
14750
+ var _iterator9 = _createForOfIteratorHelper$n(removes),
14751
+ _step9;
14752
+ try {
14753
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
14754
+ var r = _step9.value;
14755
+ if (!r.receiverItemId) continue;
14756
+ ensure(String(r.receiverItemId)).removes.push(r);
14757
+ }
14758
+
14759
+ // Walk the tree and rebuild listeners on every touched item. We do
14760
+ // shallow clones along the path so React change detection is
14761
+ // reliable — but the tree shape is preserved.
14762
+ } catch (err) {
14763
+ _iterator9.e(err);
14764
+ } finally {
14765
+ _iterator9.f();
14766
+ }
14767
+ var cloneList = function cloneList(items) {
14768
+ return Array.isArray(items) ? items.map(function (item) {
14769
+ return transform(item);
14770
+ }) : items;
14771
+ };
14772
+ var transform = function transform(item) {
14773
+ if (!item || _typeof(item) !== "object") return item;
14774
+ var next = item;
14775
+ var id = itemIdOf(item);
14776
+ var change = id != null ? byReceiver.get(String(id)) : null;
14777
+ if (change) {
14778
+ var newListeners = applyToItem(item.listeners || {}, change);
14779
+ next = _objectSpread$O(_objectSpread$O({}, next), {}, {
14780
+ listeners: newListeners
14781
+ });
14782
+ }
14783
+ if (Array.isArray(next.items)) {
14784
+ next = _objectSpread$O(_objectSpread$O({}, next), {}, {
14785
+ items: cloneList(next.items)
14786
+ });
14787
+ }
14788
+ if (Array.isArray(next.layout)) {
14789
+ next = _objectSpread$O(_objectSpread$O({}, next), {}, {
14790
+ layout: cloneList(next.layout)
14791
+ });
14792
+ }
14793
+ return next;
14794
+ };
14795
+ var updatedWs = _objectSpread$O({}, workspace);
14796
+ if (Array.isArray(workspace.layout)) {
14797
+ updatedWs.layout = cloneList(workspace.layout);
14798
+ }
14799
+ if (Array.isArray(workspace.pages)) {
14800
+ updatedWs.pages = workspace.pages.map(function (page) {
14801
+ return _objectSpread$O(_objectSpread$O({}, page), {}, {
14802
+ layout: cloneList(page.layout)
14803
+ });
14804
+ });
14805
+ }
14806
+ if (Array.isArray(workspace.sidebarLayout)) {
14807
+ updatedWs.sidebarLayout = cloneList(workspace.sidebarLayout);
14808
+ }
14809
+ return updatedWs;
14810
+ }
14811
+ function applyToItem(listeners, _ref2) {
14812
+ var adds = _ref2.adds,
14813
+ removes = _ref2.removes;
14814
+ // Deep enough clone for handler arrays.
14815
+ var next = {};
14816
+ for (var _i3 = 0, _Object$entries2 = Object.entries(listeners); _i3 < _Object$entries2.length; _i3++) {
14817
+ var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i3], 2),
14818
+ k = _Object$entries2$_i[0],
14819
+ v = _Object$entries2$_i[1];
14820
+ next[k] = Array.isArray(v) ? _toConsumableArray(v) : v;
14821
+ }
14822
+
14823
+ // Removes first so a re-add (rare) lands.
14824
+ var _iterator0 = _createForOfIteratorHelper$n(removes),
14825
+ _step0;
14826
+ try {
14827
+ var _loop = function _loop() {
14828
+ var r = _step0.value;
14829
+ var target = r.handlerName;
14830
+ if (!target) return 0; // continue
14831
+ var events = next[target];
14832
+ if (!Array.isArray(events)) return 0; // continue
14833
+ var eventStr = r.raw || formatEventString(r.sourceComponent, r.sourceItemId, r.eventName);
14834
+ var filtered = events.filter(function (e) {
14835
+ return e !== eventStr;
14836
+ });
14837
+ if (filtered.length === 0) {
14838
+ delete next[target];
14839
+ } else {
14840
+ next[target] = filtered;
14841
+ }
14842
+ },
14843
+ _ret;
14844
+ for (_iterator0.s(); !(_step0 = _iterator0.n()).done;) {
14845
+ _ret = _loop();
14846
+ if (_ret === 0) continue;
14847
+ }
14848
+ } catch (err) {
14849
+ _iterator0.e(err);
14850
+ } finally {
14851
+ _iterator0.f();
14852
+ }
14853
+ var _iterator1 = _createForOfIteratorHelper$n(adds),
14854
+ _step1;
14855
+ try {
14856
+ for (_iterator1.s(); !(_step1 = _iterator1.n()).done;) {
14857
+ var a = _step1.value;
14858
+ var target = a.handlerName;
14859
+ if (!target) continue;
14860
+ var eventStr = formatEventString(a.sourceComponent, a.sourceItemId, a.eventName);
14861
+ var existing = Array.isArray(next[target]) ? next[target] : [];
14862
+ if (existing.includes(eventStr)) continue;
14863
+ next[target] = [].concat(_toConsumableArray(existing), [eventStr]);
14864
+ }
14865
+ } catch (err) {
14866
+ _iterator1.e(err);
14867
+ } finally {
14868
+ _iterator1.f();
14869
+ }
14870
+ return next;
14871
+ }
14872
+
14873
+ var SectionLayout = function SectionLayout(_ref) {
14874
+ var listContent = _ref.listContent,
14875
+ _ref$detailContent = _ref.detailContent,
14876
+ detailContent = _ref$detailContent === void 0 ? null : _ref$detailContent,
14877
+ _ref$listWidth = _ref.listWidth,
14878
+ listWidth = _ref$listWidth === void 0 ? "w-80" : _ref$listWidth,
14879
+ _ref$emptyDetailMessa = _ref.emptyDetailMessage,
14880
+ emptyDetailMessage = _ref$emptyDetailMessa === void 0 ? "Select an item to view details" : _ref$emptyDetailMessa;
14881
+ var _useContext = useContext(ThemeContext),
14882
+ currentTheme = _useContext.currentTheme;
14883
+ var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
14884
+ grow: false
14885
+ });
14886
+ var headerStyles = getStylesForItem(themeObjects.PANEL_HEADER, currentTheme, {
14887
+ grow: false
14888
+ });
14889
+ return /*#__PURE__*/jsxs("div", {
14890
+ className: "flex flex-row flex-1 min-h-0 ".concat(panelStyles.textColor || "text-gray-200"),
14891
+ children: [/*#__PURE__*/jsx("div", {
14892
+ className: "flex flex-col flex-shrink-0 ".concat(listWidth, " border-r ").concat(headerStyles.borderColor || "", " overflow-y-auto"),
14893
+ children: listContent
14894
+ }), /*#__PURE__*/jsx("div", {
14895
+ className: "flex flex-col flex-1 min-w-0 min-h-0",
14896
+ children: detailContent ? /*#__PURE__*/jsx("div", {
14897
+ className: "flex flex-col flex-1 min-h-0",
14898
+ children: detailContent
14899
+ }) : /*#__PURE__*/jsx("div", {
14900
+ className: "flex flex-1 items-center justify-center",
14901
+ children: /*#__PURE__*/jsx("span", {
14902
+ className: "text-sm opacity-40",
14903
+ children: emptyDetailMessage
14904
+ })
14905
+ })
14906
+ })]
14907
+ });
14908
+ };
14909
+
14910
+ var PanelEditItemHandlers = function PanelEditItemHandlers(_ref) {
14911
+ var workspace = _ref.workspace,
14912
+ onUpdate = _ref.onUpdate,
14913
+ _ref$item = _ref.item,
14914
+ item = _ref$item === void 0 ? null : _ref$item;
14915
+ var _useState = useState(item),
14916
+ _useState2 = _slicedToArray(_useState, 2),
14917
+ itemSelected = _useState2[0],
14918
+ setItemSelected = _useState2[1];
14919
+ var _useState3 = useState(workspace),
14920
+ _useState4 = _slicedToArray(_useState3, 2),
14921
+ workspaceSelected = _useState4[0],
14922
+ setWorkspaceSelected = _useState4[1];
14923
+ var _useState5 = useState(null),
14924
+ _useState6 = _slicedToArray(_useState5, 2),
14925
+ eventHandlerSelected = _useState6[0],
14926
+ setEventHandlerSelected = _useState6[1];
14927
+ useEffect(function () {
14928
+ if (deepEqual$1(item, itemSelected) === false) {
14929
+ setItemSelected(function () {
14930
+ return item;
14931
+ });
14932
+ }
14933
+ if (deepEqual$1(workspace, workspaceSelected) === false) {
14934
+ setWorkspaceSelected(function () {
14935
+ return workspace;
14936
+ });
14937
+ }
14938
+ // eslint-disable-next-line react-hooks/exhaustive-deps
14939
+ }, [workspace, item]);
14940
+
14941
+ // Build the deduped list of source widgets — every widget in the
14942
+ // workspace that emits at least one event AND isn't the receiver
14943
+ // itself. forEachWidget dedupes by `${component}|${id}` so a widget
14944
+ // referenced from multiple locations (root layout AND pages) shows
14945
+ // up once.
14946
+ var sourceWidgets = function () {
14947
+ var list = [];
14948
+ var seen = new Set();
14949
+ forEachWidget(workspaceSelected, function (li) {
14950
+ if (!li || !li.component) return;
14951
+ if (li.component === "Container" || li.component === "LayoutContainer") {
14952
+ return;
14953
+ }
14954
+ if (li.id === (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected.id) && li.component === (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected.component)) {
14955
+ return;
14956
+ }
14957
+ if (!Array.isArray(li.events) || li.events.length === 0) return;
14958
+ var key = "".concat(li.component, "|").concat(li.id);
14959
+ if (seen.has(key)) return;
14960
+ seen.add(key);
14961
+ list.push(li);
14962
+ });
14963
+ return list;
14964
+ }();
14965
+ function handleSelectEventHandler(handler) {
14966
+ setEventHandlerSelected(function () {
14967
+ return handler;
14968
+ });
14969
+ }
14970
+ function commitChange(_ref2) {
14971
+ var _ref2$adds = _ref2.adds,
14972
+ adds = _ref2$adds === void 0 ? [] : _ref2$adds,
14973
+ _ref2$removes = _ref2.removes,
14974
+ removes = _ref2$removes === void 0 ? [] : _ref2$removes;
14975
+ if (!workspaceSelected || !itemSelected) return;
14976
+ if (adds.length === 0 && removes.length === 0) return;
14977
+ var nextWorkspace = applyWiringChanges(workspaceSelected, {
14978
+ adds: adds,
14979
+ removes: removes
14980
+ });
14981
+ // Find the post-change receiver item so the parent's onUpdate
14982
+ // gets the updated layout-item shape (some callers cache it).
14983
+ var nextItem = itemSelected;
14984
+ forEachWidget(nextWorkspace, function (li) {
14985
+ if ((li === null || li === void 0 ? void 0 : li.id) === itemSelected.id && li.component === itemSelected.component) {
14986
+ nextItem = li;
14987
+ }
14988
+ });
14989
+ setWorkspaceSelected(nextWorkspace);
14990
+ setItemSelected(nextItem);
14991
+ onUpdate(nextItem, nextWorkspace);
14992
+ }
14993
+ function handleSelectEvent(eventString) {
14994
+ if (!eventString || !eventHandlerSelected) return;
14995
+ var parsed = parseEventString(eventString);
14996
+ if (!parsed) return;
14997
+ commitChange({
14998
+ adds: [{
14999
+ receiverItemId: itemSelected.id,
15000
+ handlerName: eventHandlerSelected,
15001
+ sourceComponent: parsed.component,
15002
+ sourceItemId: parsed.itemId,
15003
+ eventName: parsed.event
15004
+ }]
15005
+ });
15006
+ }
15007
+ function handleRemoveEvent(eventString) {
15008
+ if (!eventString || !eventHandlerSelected) return;
15009
+ var parsed = parseEventString(eventString);
15010
+ if (!parsed) return;
15011
+ commitChange({
15012
+ removes: [{
15013
+ receiverItemId: itemSelected.id,
15014
+ handlerName: eventHandlerSelected,
15015
+ sourceComponent: parsed.component,
15016
+ sourceItemId: parsed.itemId,
15017
+ eventName: parsed.event,
15018
+ raw: eventString
15019
+ }]
15020
+ });
15021
+ }
15022
+ function isSelectedEvent(event) {
15023
+ if (!event || !eventHandlerSelected) return false;
15024
+ var itemListeners = (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected["listeners"]) || {};
15025
+ var list = itemListeners[eventHandlerSelected];
15026
+ return Array.isArray(list) && list.includes(event);
15027
+ }
15028
+
15029
+ // Get the event handlers for the current item
15030
+ var eventHandlers = Array.isArray(itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected.eventHandlers) ? itemSelected.eventHandlers.filter(function (value, index, array) {
15031
+ return array.indexOf(value) === index;
15032
+ }) : [];
15033
+
15034
+ // Build a set of valid event strings so we only count "connected"
15035
+ // listeners that still point at a live emitter. Stale references
15036
+ // are dropped from the count even before pruneDeadListenerReferences
15037
+ // runs on the next save.
15038
+ var validEventStrings = new Set();
15039
+ sourceWidgets.forEach(function (li) {
15040
+ if (Array.isArray(li.events)) {
15041
+ li.events.forEach(function (event) {
15042
+ validEventStrings.add(formatEventString(li.component, li.id, event));
15043
+ });
15044
+ }
15045
+ });
15046
+
15047
+ // Get the listeners for the current item, filtering out orphaned references
15048
+ var rawListeners = itemSelected ? itemSelected["listeners"] || {} : {};
15049
+ var listeners = {};
15050
+ Object.keys(rawListeners).forEach(function (handler) {
15051
+ var events = rawListeners[handler];
15052
+ if (Array.isArray(events)) {
15053
+ var validEvents = events.filter(function (e) {
15054
+ return validEventStrings.has(e);
15055
+ });
15056
+ if (validEvents.length > 0) {
15057
+ listeners[handler] = validEvents;
15058
+ }
15059
+ }
15060
+ });
15061
+ function getConnectedCount(handler) {
15062
+ return (listeners[handler] || []).length;
15063
+ }
15064
+
15065
+ // Build the list content (left column)
15066
+ var listContent = /*#__PURE__*/jsxs(Sidebar.Content, {
15067
+ children: [/*#__PURE__*/jsx("div", {
15068
+ className: "px-3 py-2 text-xs font-semibold opacity-40 uppercase tracking-wider",
15069
+ children: "Event Handlers"
15070
+ }), eventHandlers.map(function (handler) {
15071
+ var count = getConnectedCount(handler);
15072
+ var isActive = eventHandlerSelected === handler;
15073
+ return /*#__PURE__*/jsx(Sidebar.Item, {
15074
+ icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
15075
+ icon: "bolt",
15076
+ className: "h-3.5 w-3.5"
15077
+ }),
15078
+ active: isActive,
15079
+ onClick: function onClick() {
15080
+ return handleSelectEventHandler(handler);
15081
+ },
15082
+ badge: count > 0 ? String(count) : null,
15083
+ className: isActive ? "bg-white/10 opacity-100" : "",
15084
+ children: handler
15085
+ }, handler);
15086
+ }), eventHandlers.length === 0 && /*#__PURE__*/jsx("span", {
15087
+ className: "text-sm opacity-40 py-8 text-center",
15088
+ children: "No handlers available"
15089
+ })]
15090
+ });
15091
+
15092
+ // Build the detail content (right column) — when a handler is selected
15093
+ var connectedCount = eventHandlerSelected ? getConnectedCount(eventHandlerSelected) : 0;
15094
+ var detailContent = eventHandlerSelected ? /*#__PURE__*/jsx("div", {
15095
+ className: "flex flex-col flex-1 min-h-0",
15096
+ children: /*#__PURE__*/jsxs("div", {
15097
+ className: "flex-1 min-h-0 overflow-y-auto p-6 space-y-6",
15098
+ children: [/*#__PURE__*/jsxs("div", {
15099
+ className: "flex flex-col space-y-1",
15100
+ children: [/*#__PURE__*/jsx(SubHeading3, {
15101
+ title: eventHandlerSelected,
15102
+ padding: false
15103
+ }), /*#__PURE__*/jsxs("span", {
15104
+ className: "text-sm opacity-70",
15105
+ children: [connectedCount, " event", connectedCount !== 1 ? "s" : "", " connected"]
15106
+ })]
15107
+ }), sourceWidgets.map(function (layout) {
15108
+ return /*#__PURE__*/jsxs("div", {
15109
+ className: "flex flex-col space-y-2",
15110
+ children: [/*#__PURE__*/jsxs("span", {
15111
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
15112
+ children: [layout["component"], " [", layout["id"], "]"]
15113
+ }), layout.events.filter(function (value, index, array) {
15114
+ return array.indexOf(value) === index;
15115
+ }).map(function (event) {
15116
+ var eventString = formatEventString(layout.component, layout.id, event);
15117
+ var selected = isSelectedEvent(eventString);
15118
+ return /*#__PURE__*/jsxs("div", {
15119
+ onClick: function onClick() {
15120
+ return selected ? handleRemoveEvent(eventString) : handleSelectEvent(eventString);
15121
+ },
15122
+ className: "flex flex-row items-center gap-3 px-3 py-2 rounded-md cursor-pointer ".concat(selected ? "opacity-100" : "opacity-60 hover:opacity-80"),
15123
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
15124
+ icon: selected ? "square-check" : "square",
15125
+ className: "h-4 w-4 flex-shrink-0"
15126
+ }), /*#__PURE__*/jsx("span", {
15127
+ className: "text-sm",
15128
+ children: event
15129
+ })]
15130
+ }, eventString);
15131
+ })]
15132
+ }, "".concat(layout.component, "|").concat(layout.id));
15133
+ }), sourceWidgets.length === 0 && /*#__PURE__*/jsx("span", {
15134
+ className: "text-sm opacity-40",
15135
+ children: "No events available from other widgets"
15136
+ })]
15137
+ })
15138
+ }) : null;
15139
+ if (!itemSelected || !workspaceSelected) {
15140
+ return null;
15141
+ }
15142
+ return /*#__PURE__*/jsx(SectionLayout, {
15143
+ listContent: listContent,
15144
+ detailContent: detailContent,
14315
15145
  listWidth: "w-72",
14316
15146
  emptyDetailMessage: "Select a handler to view available events"
14317
15147
  });
@@ -14336,8 +15166,8 @@ var getUserConfigurableProviders = function getUserConfigurableProviders(provide
14336
15166
  });
14337
15167
  };
14338
15168
 
14339
- function ownKeys$O(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; }
14340
- function _objectSpread$O(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$O(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$O(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
15169
+ function ownKeys$N(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; }
15170
+ function _objectSpread$N(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$N(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$N(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14341
15171
  var PanelEditItemProviders = function PanelEditItemProviders(_ref) {
14342
15172
  var workspace = _ref.workspace,
14343
15173
  onUpdate = _ref.onUpdate,
@@ -14369,7 +15199,7 @@ var PanelEditItemProviders = function PanelEditItemProviders(_ref) {
14369
15199
  var selectedProviders = itemSelected.selectedProviders || {};
14370
15200
  function handleProviderChange(providerType, providerName) {
14371
15201
  var updatedItem = deepCopy(itemSelected);
14372
- var nextProviders = _objectSpread$O({}, updatedItem.selectedProviders || {});
15202
+ var nextProviders = _objectSpread$N({}, updatedItem.selectedProviders || {});
14373
15203
  if (providerName) {
14374
15204
  nextProviders[providerType] = providerName;
14375
15205
  } else {
@@ -14410,7 +15240,7 @@ var PanelEditItemProviders = function PanelEditItemProviders(_ref) {
14410
15240
  var _ref5 = _slicedToArray(_ref4, 2),
14411
15241
  name = _ref5[0],
14412
15242
  p = _ref5[1];
14413
- return _objectSpread$O({
15243
+ return _objectSpread$N({
14414
15244
  name: name
14415
15245
  }, p);
14416
15246
  });
@@ -14565,18 +15395,14 @@ var LayoutBuilderConfigModal = function LayoutBuilderConfigModal(_ref) {
14565
15395
  return s.key === activeSection;
14566
15396
  }) || sections[0];
14567
15397
 
14568
- // Footer label: derive @scope/package straight from the layout
14569
- // item's scoped component id. Strict no workspace fallback.
15398
+ // Footer label: full scoped id (`scope.package.Component`) so the
15399
+ // user always sees the underlying widget identity, even when the
15400
+ // primary title is a custom per-instance label. No workspace fallback.
14570
15401
  var footerPackageLabel = function () {
14571
15402
  var scopedId = (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected.component) || "";
14572
15403
  if (typeof scopedId !== "string") return "";
14573
15404
  var parts = scopedId.split(".");
14574
- if (parts.length !== 3) return "";
14575
- var _parts = _slicedToArray(parts, 2),
14576
- scope = _parts[0],
14577
- pkg = _parts[1];
14578
- if (!scope || !pkg) return "";
14579
- return "@".concat(scope, "/").concat(pkg);
15405
+ return parts.length === 3 ? scopedId : "";
14580
15406
  }();
14581
15407
  var componentName = itemSelected ? itemSelected["component"] : "";
14582
15408
  var footerLeftContent = footerPackageLabel ? /*#__PURE__*/jsxs("span", {
@@ -16161,8 +16987,8 @@ var WidgetIcon = function WidgetIcon(_ref) {
16161
16987
  });
16162
16988
  };
16163
16989
 
16164
- function ownKeys$N(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; }
16165
- function _objectSpread$N(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$N(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$N(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16990
+ function ownKeys$M(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; }
16991
+ function _objectSpread$M(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$M(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$M(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16166
16992
  var ProviderForm = function ProviderForm(_ref) {
16167
16993
  var credentialSchema = _ref.credentialSchema,
16168
16994
  _ref$initialValues = _ref.initialValues,
@@ -16207,14 +17033,14 @@ var ProviderForm = function ProviderForm(_ref) {
16207
17033
  var oldKey = f.key;
16208
17034
  if (oldKey && formData[oldKey] !== undefined) {
16209
17035
  setFormData(function (fd) {
16210
- var updated = _objectSpread$N({}, fd);
17036
+ var updated = _objectSpread$M({}, fd);
16211
17037
  var val = updated[oldKey];
16212
17038
  delete updated[oldKey];
16213
17039
  if (newKey.trim()) updated[newKey] = val;
16214
17040
  return updated;
16215
17041
  });
16216
17042
  }
16217
- return _objectSpread$N(_objectSpread$N({}, f), {}, {
17043
+ return _objectSpread$M(_objectSpread$M({}, f), {}, {
16218
17044
  key: newKey
16219
17045
  });
16220
17046
  });
@@ -16226,14 +17052,14 @@ var ProviderForm = function ProviderForm(_ref) {
16226
17052
  });
16227
17053
  if (field !== null && field !== void 0 && field.key) {
16228
17054
  setFormData(function (prev) {
16229
- return _objectSpread$N(_objectSpread$N({}, prev), {}, _defineProperty({}, field.key, value));
17055
+ return _objectSpread$M(_objectSpread$M({}, prev), {}, _defineProperty({}, field.key, value));
16230
17056
  });
16231
17057
  }
16232
17058
  };
16233
17059
  var handleDynamicSecretToggle = function handleDynamicSecretToggle(id) {
16234
17060
  setDynamicFields(function (prev) {
16235
17061
  return prev.map(function (f) {
16236
- return f.id === id ? _objectSpread$N(_objectSpread$N({}, f), {}, {
17062
+ return f.id === id ? _objectSpread$M(_objectSpread$M({}, f), {}, {
16237
17063
  secret: !f.secret
16238
17064
  }) : f;
16239
17065
  });
@@ -16255,7 +17081,7 @@ var ProviderForm = function ProviderForm(_ref) {
16255
17081
  });
16256
17082
  if (field !== null && field !== void 0 && field.key) {
16257
17083
  setFormData(function (prev) {
16258
- var updated = _objectSpread$N({}, prev);
17084
+ var updated = _objectSpread$M({}, prev);
16259
17085
  delete updated[field.key];
16260
17086
  return updated;
16261
17087
  });
@@ -16297,13 +17123,13 @@ var ProviderForm = function ProviderForm(_ref) {
16297
17123
  */
16298
17124
  var handleInputChange = function handleInputChange(fieldName, value) {
16299
17125
  setFormData(function (prev) {
16300
- return _objectSpread$N(_objectSpread$N({}, prev), {}, _defineProperty({}, fieldName, value));
17126
+ return _objectSpread$M(_objectSpread$M({}, prev), {}, _defineProperty({}, fieldName, value));
16301
17127
  });
16302
17128
 
16303
17129
  // Clear error for this field if it was filled
16304
17130
  if (errors[fieldName] && value !== null && value !== void 0 && value.trim()) {
16305
17131
  setErrors(function (prev) {
16306
- var newErrors = _objectSpread$N({}, prev);
17132
+ var newErrors = _objectSpread$M({}, prev);
16307
17133
  delete newErrors[fieldName];
16308
17134
  return newErrors;
16309
17135
  });
@@ -16341,7 +17167,7 @@ var ProviderForm = function ProviderForm(_ref) {
16341
17167
  // Clear error if filled
16342
17168
  if (errors.providerName && value !== null && value !== void 0 && value.trim()) {
16343
17169
  setErrors(function (prev) {
16344
- var newErrors = _objectSpread$N({}, prev);
17170
+ var newErrors = _objectSpread$M({}, prev);
16345
17171
  delete newErrors.providerName;
16346
17172
  return newErrors;
16347
17173
  });
@@ -16578,8 +17404,8 @@ var ToolSelector$1 = function ToolSelector(_ref) {
16578
17404
  });
16579
17405
  };
16580
17406
 
16581
- function ownKeys$M(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; }
16582
- function _objectSpread$M(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$M(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$M(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
17407
+ function ownKeys$L(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; }
17408
+ function _objectSpread$L(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$L(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$L(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16583
17409
  /**
16584
17410
  * Shared MCP utility functions.
16585
17411
  *
@@ -16707,7 +17533,7 @@ function buildMcpConfigFromOverrides(baseMcpConfig, envMappingRows, headerRows)
16707
17533
  headerTemplate[name] = value;
16708
17534
  }
16709
17535
  });
16710
- var config = _objectSpread$M({}, baseMcpConfig);
17536
+ var config = _objectSpread$L({}, baseMcpConfig);
16711
17537
  if (Object.keys(headerTemplate).length > 0) {
16712
17538
  config.headerTemplate = headerTemplate;
16713
17539
  } else {
@@ -16725,7 +17551,7 @@ function buildMcpConfigFromOverrides(baseMcpConfig, envMappingRows, headerRows)
16725
17551
  envMapping[env] = cred;
16726
17552
  }
16727
17553
  });
16728
- return _objectSpread$M(_objectSpread$M({}, baseMcpConfig), {}, {
17554
+ return _objectSpread$L(_objectSpread$L({}, baseMcpConfig), {}, {
16729
17555
  envMapping: envMapping
16730
17556
  });
16731
17557
  }
@@ -16959,11 +17785,11 @@ function mcpJsonToFormState(jsonString, nextRowId) {
16959
17785
  return result;
16960
17786
  }
16961
17787
 
16962
- function _createForOfIteratorHelper$n(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$n(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; } } }; }
16963
- function _unsupportedIterableToArray$n(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$n(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$n(r, a) : void 0; } }
16964
- function _arrayLikeToArray$n(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; }
16965
- function ownKeys$L(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; }
16966
- function _objectSpread$L(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$L(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$L(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
17788
+ function _createForOfIteratorHelper$m(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$m(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; } } }; }
17789
+ function _unsupportedIterableToArray$m(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$m(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$m(r, a) : void 0; } }
17790
+ function _arrayLikeToArray$m(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; }
17791
+ function ownKeys$K(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; }
17792
+ function _objectSpread$K(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$K(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$K(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16967
17793
  var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
16968
17794
  var isOpen = _ref.isOpen,
16969
17795
  onClose = _ref.onClose,
@@ -17158,7 +17984,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17158
17984
  .map(function (entry) {
17159
17985
  var widget = allWidgets[entry.widgetKey];
17160
17986
  if (!widget) return null; // Widget no longer exists
17161
- return _objectSpread$L(_objectSpread$L({
17987
+ return _objectSpread$K(_objectSpread$K({
17162
17988
  key: entry.widgetKey
17163
17989
  }, widget), {}, {
17164
17990
  savedProviders: entry.providers || {},
@@ -17246,11 +18072,11 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17246
18072
 
17247
18073
  // Flatten all widgets from all packages for the widget list
17248
18074
  flatWidgets = [];
17249
- _iterator = _createForOfIteratorHelper$n(result.packages || []);
18075
+ _iterator = _createForOfIteratorHelper$m(result.packages || []);
17250
18076
  try {
17251
18077
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
17252
18078
  pkg = _step.value;
17253
- _iterator2 = _createForOfIteratorHelper$n(pkg.widgets || []);
18079
+ _iterator2 = _createForOfIteratorHelper$m(pkg.widgets || []);
17254
18080
  try {
17255
18081
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
17256
18082
  widget = _step2.value;
@@ -17309,7 +18135,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17309
18135
  // Get widgets from ComponentManager
17310
18136
  var allWidgets = ComponentManager.map();
17311
18137
  var widgetList = Object.keys(allWidgets).map(function (key) {
17312
- return _objectSpread$L({
18138
+ return _objectSpread$K({
17313
18139
  key: key
17314
18140
  }, allWidgets[key]);
17315
18141
  }).filter(function (widget) {
@@ -17540,7 +18366,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17540
18366
  setInlineCreateType(null);
17541
18367
  setInlineCreateSchema({});
17542
18368
  setInlineCreateError(null);
17543
- setSelectedProviders(_objectSpread$L(_objectSpread$L({}, selectedProviders), {}, _defineProperty({}, providerType, providerName)));
18369
+ setSelectedProviders(_objectSpread$K(_objectSpread$K({}, selectedProviders), {}, _defineProperty({}, providerType, providerName)));
17544
18370
  }
17545
18371
  };
17546
18372
  var handleInlineProviderSubmit = function handleInlineProviderSubmit(formData) {
@@ -17561,7 +18387,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17561
18387
 
17562
18388
  // Auto-select the newly created provider
17563
18389
  setSelectedProviders(function (prev) {
17564
- return _objectSpread$L(_objectSpread$L({}, prev), {}, _defineProperty({}, providerType, providerName));
18390
+ return _objectSpread$K(_objectSpread$K({}, prev), {}, _defineProperty({}, providerType, providerName));
17565
18391
  });
17566
18392
 
17567
18393
  // Collapse the inline form
@@ -17615,11 +18441,11 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17615
18441
  };
17616
18442
  var inlineHandleCredentialChange = function inlineHandleCredentialChange(fieldName, value) {
17617
18443
  setInlineCredentialData(function (prev) {
17618
- return _objectSpread$L(_objectSpread$L({}, prev), {}, _defineProperty({}, fieldName, value));
18444
+ return _objectSpread$K(_objectSpread$K({}, prev), {}, _defineProperty({}, fieldName, value));
17619
18445
  });
17620
18446
  if (inlineFormErrors[fieldName] && value !== null && value !== void 0 && value.trim()) {
17621
18447
  setInlineFormErrors(function (prev) {
17622
- var next = _objectSpread$L({}, prev);
18448
+ var next = _objectSpread$K({}, prev);
17623
18449
  delete next[fieldName];
17624
18450
  return next;
17625
18451
  });
@@ -17712,7 +18538,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17712
18538
  refreshProviders();
17713
18539
  }
17714
18540
  setSelectedProviders(function (prev) {
17715
- return _objectSpread$L(_objectSpread$L({}, prev), {}, _defineProperty({}, providerType, providerName));
18541
+ return _objectSpread$K(_objectSpread$K({}, prev), {}, _defineProperty({}, providerType, providerName));
17716
18542
  });
17717
18543
 
17718
18544
  // Reset stepper state
@@ -17733,7 +18559,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17733
18559
  });
17734
18560
  };
17735
18561
  var handleConfigChange = function handleConfigChange(key, value) {
17736
- setUserConfigValues(_objectSpread$L(_objectSpread$L({}, userConfigValues), {}, _defineProperty({}, key, value)));
18562
+ setUserConfigValues(_objectSpread$K(_objectSpread$K({}, userConfigValues), {}, _defineProperty({}, key, value)));
17737
18563
  };
17738
18564
 
17739
18565
  // Install a package from the registry
@@ -17799,7 +18625,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17799
18625
  // Mark items as installed
17800
18626
  setProgressWidgets(function (prev) {
17801
18627
  return prev.map(function (w) {
17802
- return _objectSpread$L(_objectSpread$L({}, w), {}, {
18628
+ return _objectSpread$K(_objectSpread$K({}, w), {}, {
17803
18629
  status: "installed"
17804
18630
  });
17805
18631
  });
@@ -17818,7 +18644,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17818
18644
  setInstallError(msg);
17819
18645
  setProgressWidgets(function (prev) {
17820
18646
  return prev.map(function (w) {
17821
- return _objectSpread$L(_objectSpread$L({}, w), {}, {
18647
+ return _objectSpread$K(_objectSpread$K({}, w), {}, {
17822
18648
  status: "failed",
17823
18649
  error: msg
17824
18650
  });
@@ -17892,7 +18718,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
17892
18718
 
17893
18719
  // Phase 3: Save to recent widgets
17894
18720
  saveToRecent(selectedWidget, selectedProviders, userConfigValues);
17895
- onSelectWidget(_objectSpread$L(_objectSpread$L({}, selectedWidget), {}, {
18721
+ onSelectWidget(_objectSpread$K(_objectSpread$K({}, selectedWidget), {}, {
17896
18722
  selectedProviders: selectedProviders,
17897
18723
  // Pass to parent
17898
18724
  userConfigValues: userConfigValues // Pass to parent
@@ -18535,7 +19361,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
18535
19361
  setInlineProviderName(value);
18536
19362
  if (inlineFormErrors.providerName && value !== null && value !== void 0 && value.trim()) {
18537
19363
  setInlineFormErrors(function (prev) {
18538
- var next = _objectSpread$L({}, prev);
19364
+ var next = _objectSpread$K({}, prev);
18539
19365
  delete next.providerName;
18540
19366
  return next;
18541
19367
  });
@@ -18879,24 +19705,40 @@ var WidgetCardHeader = function WidgetCardHeader(_ref) {
18879
19705
  // Detect missing widgets (component key exists but not in ComponentManager)
18880
19706
  var isWidgetMissing = (widgetItem === null || widgetItem === void 0 ? void 0 : widgetItem.component) && !widgetConfig;
18881
19707
 
18882
- // Get widget name from config or item
18883
- var widgetName = (widgetConfig === null || widgetConfig === void 0 ? void 0 : widgetConfig.displayName) || (widgetConfig === null || widgetConfig === void 0 ? void 0 : widgetConfig.name) || (widgetItem === null || widgetItem === void 0 ? void 0 : widgetItem.name) || (widgetItem === null || widgetItem === void 0 ? void 0 : widgetItem.component);
19708
+ // Display name priority: per-instance user title → widget's default
19709
+ // title developer's friendly displayName widget config name
19710
+ // bare component name (last segment) → full scoped id (last resort).
19711
+ // Mirrors WidgetsTab so the same widget shows the same name in both
19712
+ // surfaces.
19713
+ var widgetName = function (_widgetItem$userPrefs, _widgetConfig$userCon) {
19714
+ var prefsTitle = widgetItem === null || widgetItem === void 0 || (_widgetItem$userPrefs = widgetItem.userPrefs) === null || _widgetItem$userPrefs === void 0 ? void 0 : _widgetItem$userPrefs.title;
19715
+ if (typeof prefsTitle === "string" && prefsTitle.trim()) return prefsTitle;
19716
+ var configDefault = widgetConfig === null || widgetConfig === void 0 || (_widgetConfig$userCon = widgetConfig.userConfig) === null || _widgetConfig$userCon === void 0 || (_widgetConfig$userCon = _widgetConfig$userCon.title) === null || _widgetConfig$userCon === void 0 ? void 0 : _widgetConfig$userCon.defaultValue;
19717
+ if (typeof configDefault === "string" && configDefault.trim()) {
19718
+ return configDefault;
19719
+ }
19720
+ if (widgetConfig !== null && widgetConfig !== void 0 && widgetConfig.displayName) return widgetConfig.displayName;
19721
+ if (widgetConfig !== null && widgetConfig !== void 0 && widgetConfig.name) return widgetConfig.name;
19722
+ if (widgetItem !== null && widgetItem !== void 0 && widgetItem.name) return widgetItem.name;
19723
+ var comp = widgetItem === null || widgetItem === void 0 ? void 0 : widgetItem.component;
19724
+ if (typeof comp === "string") {
19725
+ var parts = comp.split(".");
19726
+ if (parts.length === 3) return parts[2];
19727
+ return comp;
19728
+ }
19729
+ return "Widget";
19730
+ }();
18884
19731
 
18885
- // Derive the "@scope/package" label from the layout item's scoped
18886
- // component id (`scope.package.Component`). Strict the layout item
18887
- // is the source of truth. If the item isn't scoped (a legacy layout
18888
- // that LayoutModel couldn't migrate, or a missing widget) the label
18889
- // is empty rather than guessed from the workspace category.
19732
+ // Show the full scoped registry id (`scope.package.Component`) as
19733
+ // the subtitle. The friendly title on line 1 may be a custom user
19734
+ // title that doesn't reveal which widget is mounted; the subtitle
19735
+ // pins down the underlying identity. Strict the layout item is
19736
+ // the source of truth.
18890
19737
  var packageLabel = function () {
18891
19738
  var scopedId = (widgetItem === null || widgetItem === void 0 ? void 0 : widgetItem.component) || (widgetConfig === null || widgetConfig === void 0 ? void 0 : widgetConfig.id) || "";
18892
19739
  if (typeof scopedId !== "string") return "";
18893
19740
  var parts = scopedId.split(".");
18894
- if (parts.length !== 3) return "";
18895
- var _parts = _slicedToArray(parts, 2),
18896
- scope = _parts[0],
18897
- pkg = _parts[1];
18898
- if (!scope || !pkg) return "";
18899
- return "@".concat(scope, "/").concat(pkg);
19741
+ return parts.length === 3 ? scopedId : "";
18900
19742
  }();
18901
19743
 
18902
19744
  // Get provider requirements from widget config (not from item directly)
@@ -19151,9 +19993,9 @@ var useWidgetSchedulerStatus = function useWidgetSchedulerStatus(widgetId) {
19151
19993
  };
19152
19994
  };
19153
19995
 
19154
- function _createForOfIteratorHelper$m(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$m(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; } } }; }
19155
- function _unsupportedIterableToArray$m(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$m(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$m(r, a) : void 0; } }
19156
- function _arrayLikeToArray$m(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; }
19996
+ function _createForOfIteratorHelper$l(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$l(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; } } }; }
19997
+ function _unsupportedIterableToArray$l(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$l(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$l(r, a) : void 0; } }
19998
+ function _arrayLikeToArray$l(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; }
19157
19999
  function formatCountdown(ms) {
19158
20000
  if (ms == null || ms < 0) return "--";
19159
20001
  if (ms < 1000) return "< 1s";
@@ -19270,7 +20112,7 @@ var WidgetCardStatusBar = function WidgetCardStatusBar(_ref) {
19270
20112
 
19271
20113
  // Find soonest countdown among enabled tasks
19272
20114
  var soonestMs = null;
19273
- var _iterator = _createForOfIteratorHelper$m(enabledTasks),
20115
+ var _iterator = _createForOfIteratorHelper$l(enabledTasks),
19274
20116
  _step;
19275
20117
  try {
19276
20118
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -19723,8 +20565,8 @@ var ProviderSelector = function ProviderSelector(_ref) {
19723
20565
  });
19724
20566
  };
19725
20567
 
19726
- function ownKeys$K(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; }
19727
- function _objectSpread$K(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$K(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$K(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20568
+ 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; }
20569
+ 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; }
19728
20570
  var AdvancedMcpConfig = function AdvancedMcpConfig(_ref) {
19729
20571
  var transport = _ref.transport,
19730
20572
  envMappingRows = _ref.envMappingRows,
@@ -19753,7 +20595,7 @@ var AdvancedMcpConfig = function AdvancedMcpConfig(_ref) {
19753
20595
  var updateEnvRow = function updateEnvRow(id, field, value) {
19754
20596
  onEnvMappingRowsChange(function (prev) {
19755
20597
  return prev.map(function (row) {
19756
- return row.id === id ? _objectSpread$K(_objectSpread$K({}, row), {}, _defineProperty({}, field, value)) : row;
20598
+ return row.id === id ? _objectSpread$J(_objectSpread$J({}, row), {}, _defineProperty({}, field, value)) : row;
19757
20599
  });
19758
20600
  });
19759
20601
  };
@@ -19778,7 +20620,7 @@ var AdvancedMcpConfig = function AdvancedMcpConfig(_ref) {
19778
20620
  var updateHeaderRow = function updateHeaderRow(id, field, value) {
19779
20621
  onHeaderRowsChange(function (prev) {
19780
20622
  return prev.map(function (row) {
19781
- return row.id === id ? _objectSpread$K(_objectSpread$K({}, row), {}, _defineProperty({}, field, value)) : row;
20623
+ return row.id === id ? _objectSpread$J(_objectSpread$J({}, row), {}, _defineProperty({}, field, value)) : row;
19782
20624
  });
19783
20625
  });
19784
20626
  };
@@ -19927,8 +20769,8 @@ var AdvancedMcpConfig = function AdvancedMcpConfig(_ref) {
19927
20769
  });
19928
20770
  };
19929
20771
 
19930
- 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; }
19931
- 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; }
20772
+ 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; }
20773
+ 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; }
19932
20774
  var McpServerPicker = function McpServerPicker(_ref) {
19933
20775
  var _testResult$tools;
19934
20776
  var isOpen = _ref.isOpen,
@@ -20107,11 +20949,11 @@ var McpServerPicker = function McpServerPicker(_ref) {
20107
20949
  // Handle credential field changes
20108
20950
  var handleCredentialChange = function handleCredentialChange(fieldName, value) {
20109
20951
  setCredentialData(function (prev) {
20110
- return _objectSpread$J(_objectSpread$J({}, prev), {}, _defineProperty({}, fieldName, value));
20952
+ return _objectSpread$I(_objectSpread$I({}, prev), {}, _defineProperty({}, fieldName, value));
20111
20953
  });
20112
20954
  if (formErrors[fieldName] && value !== null && value !== void 0 && value.trim()) {
20113
20955
  setFormErrors(function (prev) {
20114
- var next = _objectSpread$J({}, prev);
20956
+ var next = _objectSpread$I({}, prev);
20115
20957
  delete next[fieldName];
20116
20958
  return next;
20117
20959
  });
@@ -20449,7 +21291,7 @@ var McpServerPicker = function McpServerPicker(_ref) {
20449
21291
  setProviderName(value);
20450
21292
  if (formErrors.providerName && value !== null && value !== void 0 && value.trim()) {
20451
21293
  setFormErrors(function (prev) {
20452
- var next = _objectSpread$J({}, prev);
21294
+ var next = _objectSpread$I({}, prev);
20453
21295
  delete next.providerName;
20454
21296
  return next;
20455
21297
  });
@@ -20639,8 +21481,8 @@ var McpServerPicker = function McpServerPicker(_ref) {
20639
21481
  });
20640
21482
  };
20641
21483
 
20642
- 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; }
20643
- 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; }
21484
+ function ownKeys$H(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; }
21485
+ function _objectSpread$H(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$H(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$H(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20644
21486
  var USE_ENHANCED_WIDGET_SELECTOR = true; // Set to false to use original modal
20645
21487
 
20646
21488
  /**
@@ -20686,7 +21528,7 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
20686
21528
  var _ref3 = _slicedToArray(_ref2, 2),
20687
21529
  id = _ref3[0],
20688
21530
  p = _ref3[1];
20689
- return _objectSpread$I(_objectSpread$I({}, p), {}, {
21531
+ return _objectSpread$H(_objectSpread$H({}, p), {}, {
20690
21532
  id: id,
20691
21533
  name: p.name || id
20692
21534
  });
@@ -20773,7 +21615,7 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
20773
21615
  // so we use its layout to replace any corrupted grid data.
20774
21616
  if (workspace && workspace["layout"]) {
20775
21617
  var model = new DashboardModel(workspace);
20776
- setCurrentWorkspace(_objectSpread$I(_objectSpread$I({}, workspace), {}, {
21618
+ setCurrentWorkspace(_objectSpread$H(_objectSpread$H({}, workspace), {}, {
20777
21619
  layout: model.layout
20778
21620
  }));
20779
21621
  } else {
@@ -20833,7 +21675,7 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
20833
21675
  }
20834
21676
  try {
20835
21677
  var hasChildren = config.type === "workspace";
20836
- var newLayout = addItemToItemLayout(ws.layout, gridItem.id, _objectSpread$I(_objectSpread$I({}, config), {}, {
21678
+ var newLayout = addItemToItemLayout(ws.layout, gridItem.id, _objectSpread$H(_objectSpread$H({}, config), {}, {
20837
21679
  component: widgetComponentName,
20838
21680
  packageId: config._sourcePackage || config.packageId || null
20839
21681
  }), hasChildren);
@@ -21270,7 +22112,7 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
21270
22112
  var uuid = widget.uuid || widget.uuidString;
21271
22113
  if (uuid) {
21272
22114
  newWorkspace.selectedProviders = newWorkspace.selectedProviders || {};
21273
- newWorkspace.selectedProviders[uuid] = _objectSpread$I(_objectSpread$I({}, newWorkspace.selectedProviders[uuid] || {}), {}, _defineProperty({}, providerType, providerId));
22115
+ newWorkspace.selectedProviders[uuid] = _objectSpread$H(_objectSpread$H({}, newWorkspace.selectedProviders[uuid] || {}), {}, _defineProperty({}, providerType, providerId));
21274
22116
  }
21275
22117
  setCurrentWorkspace(newWorkspace);
21276
22118
  }
@@ -21406,7 +22248,7 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
21406
22248
  var _gridContainer$grid;
21407
22249
  var config = ComponentManager.config(widgetKey);
21408
22250
  if (!config) return;
21409
- var widgetItem = _objectSpread$I(_objectSpread$I({}, config), {}, {
22251
+ var widgetItem = _objectSpread$H(_objectSpread$H({}, config), {}, {
21410
22252
  component: widgetKey,
21411
22253
  key: widgetKey,
21412
22254
  packageId: config._sourcePackage || config.packageId || null
@@ -21667,7 +22509,7 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
21667
22509
  onSelectWidget: function onSelectWidget(widget) {
21668
22510
 
21669
22511
  // Add component property from widget.key
21670
- var widgetWithComponent = _objectSpread$I(_objectSpread$I({}, widget), {}, {
22512
+ var widgetWithComponent = _objectSpread$H(_objectSpread$H({}, widget), {}, {
21671
22513
  component: widget.key
21672
22514
  });
21673
22515
  handleClickConfirmAdd(widgetWithComponent, dropdownTarget);
@@ -23296,8 +24138,8 @@ var MissingProviderPrompt = function MissingProviderPrompt(_ref) {
23296
24138
  });
23297
24139
  };
23298
24140
 
23299
- function ownKeys$H(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; }
23300
- function _objectSpread$H(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$H(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$H(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24141
+ function ownKeys$G(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; }
24142
+ function _objectSpread$G(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$G(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$G(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
23301
24143
  function _callSuper$4(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct$4() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
23302
24144
  function _isNativeReflectConstruct$4() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct$4 = function _isNativeReflectConstruct() { return !!t; })(); }
23303
24145
  var ProviderErrorBoundary = /*#__PURE__*/function (_Component) {
@@ -23352,7 +24194,7 @@ var ProviderErrorBoundary = /*#__PURE__*/function (_Component) {
23352
24194
  _defineProperty(_this, "handleProviderSelect", function (providerType, providerName, credentials) {
23353
24195
 
23354
24196
  // Update local selected providers state
23355
- var updatedSelected = _objectSpread$H(_objectSpread$H({}, _this.state.selectedProviders), {}, _defineProperty({}, providerType, providerName));
24197
+ var updatedSelected = _objectSpread$G(_objectSpread$G({}, _this.state.selectedProviders), {}, _defineProperty({}, providerType, providerName));
23356
24198
  _this.setState({
23357
24199
  selectedProviders: updatedSelected
23358
24200
  }, function () {
@@ -23426,8 +24268,8 @@ var ProviderErrorBoundary = /*#__PURE__*/function (_Component) {
23426
24268
  }(Component);
23427
24269
  _defineProperty(ProviderErrorBoundary, "contextType", ProviderContext);
23428
24270
 
23429
- function ownKeys$G(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; }
23430
- function _objectSpread$G(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$G(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$G(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24271
+ function ownKeys$F(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; }
24272
+ function _objectSpread$F(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$F(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$F(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
23431
24273
  var withProviderDetection = function withProviderDetection(Component) {
23432
24274
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
23433
24275
  _ref$requiredProvider = _ref.requiredProviders,
@@ -23452,7 +24294,7 @@ var withProviderDetection = function withProviderDetection(Component) {
23452
24294
  onProviderSelect: onProviderSelect
23453
24295
  });
23454
24296
  }
23455
- return /*#__PURE__*/jsx(Component, _objectSpread$G({}, props));
24297
+ return /*#__PURE__*/jsx(Component, _objectSpread$F({}, props));
23456
24298
  };
23457
24299
  };
23458
24300
 
@@ -24128,8 +24970,8 @@ var WidgetNotFound = function WidgetNotFound(_ref) {
24128
24970
  });
24129
24971
  };
24130
24972
 
24131
- function ownKeys$F(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; }
24132
- function _objectSpread$F(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$F(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$F(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24973
+ function ownKeys$E(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; }
24974
+ function _objectSpread$E(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$E(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$E(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24133
24975
  function _callSuper$2(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct$2() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
24134
24976
  function _isNativeReflectConstruct$2() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct$2 = function _isNativeReflectConstruct() { return !!t; })(); }
24135
24977
  var WidgetErrorBoundary = /*#__PURE__*/function (_Component) {
@@ -24289,7 +25131,7 @@ var WidgetRenderer = function WidgetRenderer(_ref) {
24289
25131
 
24290
25132
  // Build widgetData for WidgetContext — hooks read from this
24291
25133
  var uuidString = getUUID(params.uuid);
24292
- var widgetData = _objectSpread$F(_objectSpread$F({}, params), {}, {
25134
+ var widgetData = _objectSpread$E(_objectSpread$E({}, params), {}, {
24293
25135
  uuidString: uuidString,
24294
25136
  providers: (config === null || config === void 0 ? void 0 : config.providers) || [],
24295
25137
  notifications: (config === null || config === void 0 ? void 0 : config.notifications) || []
@@ -24313,7 +25155,7 @@ var WidgetRenderer = function WidgetRenderer(_ref) {
24313
25155
  widgetData: widgetData
24314
25156
  };
24315
25157
  var hasScheduledTasks = ((config === null || config === void 0 ? void 0 : config.scheduledTasks) || []).length > 0;
24316
- var widgetElement = children === null ? /*#__PURE__*/jsx(WidgetComponent, _objectSpread$F(_objectSpread$F(_objectSpread$F({
25158
+ var widgetElement = children === null ? /*#__PURE__*/jsx(WidgetComponent, _objectSpread$E(_objectSpread$E(_objectSpread$E({
24317
25159
  id: "widget-nokids-".concat(widgetKey),
24318
25160
  listen: function listen(listeners, handlers) {
24319
25161
  return helpers.listen(listeners, handlers);
@@ -24327,7 +25169,7 @@ var WidgetRenderer = function WidgetRenderer(_ref) {
24327
25169
  backgroundColor: bgColor,
24328
25170
  widgetConfig: helpers.config(),
24329
25171
  widgetEventNames: helpers.events()
24330
- }), "widget-nokids-".concat(widgetKey, "-v").concat(componentVersion)) : /*#__PURE__*/jsx(WidgetComponent, _objectSpread$F(_objectSpread$F(_objectSpread$F({
25172
+ }), "widget-nokids-".concat(widgetKey, "-v").concat(componentVersion)) : /*#__PURE__*/jsx(WidgetComponent, _objectSpread$E(_objectSpread$E(_objectSpread$E({
24331
25173
  listen: function listen(listeners, handlers) {
24332
25174
  return helpers.listen(listeners, handlers);
24333
25175
  },
@@ -24527,11 +25369,11 @@ var ExternalWidget = function ExternalWidget(_ref) {
24527
25369
  var GRID_CELL_WIDGET_TYPE = "grid-cell-widget";
24528
25370
  var SIDEBAR_WIDGET_TYPE = "sidebar-widget";
24529
25371
 
24530
- function _createForOfIteratorHelper$l(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$l(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; } } }; }
24531
- function _unsupportedIterableToArray$l(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$l(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$l(r, a) : void 0; } }
24532
- function _arrayLikeToArray$l(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; }
24533
- function ownKeys$E(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; }
24534
- function _objectSpread$E(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$E(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$E(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25372
+ function _createForOfIteratorHelper$k(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$k(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; } } }; }
25373
+ function _unsupportedIterableToArray$k(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$k(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$k(r, a) : void 0; } }
25374
+ function _arrayLikeToArray$k(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; }
25375
+ function ownKeys$D(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; }
25376
+ function _objectSpread$D(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$D(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$D(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24535
25377
 
24536
25378
  // Identifies which "bucket" of the workspace a LayoutBuilder belongs
24537
25379
  // to so drop handlers on grid cells can distinguish a same-container
@@ -24777,7 +25619,7 @@ var LayoutGridContainer = /*#__PURE__*/memo(function (_ref3) {
24777
25619
  var _ref5 = _slicedToArray(_ref4, 2),
24778
25620
  id = _ref5[0],
24779
25621
  provider = _ref5[1];
24780
- return _objectSpread$E({
25622
+ return _objectSpread$D({
24781
25623
  id: id
24782
25624
  }, provider);
24783
25625
  }) : [];
@@ -25152,7 +25994,7 @@ var LayoutGridContainer = /*#__PURE__*/memo(function (_ref3) {
25152
25994
  return selectable["delete"](cn);
25153
25995
  });
25154
25996
  var resolved = new Set();
25155
- var _iterator = _createForOfIteratorHelper$l(selectable),
25997
+ var _iterator = _createForOfIteratorHelper$k(selectable),
25156
25998
  _step;
25157
25999
  try {
25158
26000
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -25826,7 +26668,7 @@ var LayoutGridContainer = /*#__PURE__*/memo(function (_ref3) {
25826
26668
  var widgetSpecificSelections = (workspace === null || workspace === void 0 || (_workspace$selectedPr = workspace.selectedProviders) === null || _workspace$selectedPr === void 0 ? void 0 : _workspace$selectedPr[id]) || {};
25827
26669
 
25828
26670
  // Add provider-related props from workspace
25829
- var itemWithProviders = _objectSpread$E(_objectSpread$E({}, item), {}, {
26671
+ var itemWithProviders = _objectSpread$D(_objectSpread$D({}, item), {}, {
25830
26672
  selectedProviders: widgetSpecificSelections,
25831
26673
  onProviderSelect: onProviderSelect
25832
26674
  });
@@ -26044,8 +26886,8 @@ var LayoutGridContainer = /*#__PURE__*/memo(function (_ref3) {
26044
26886
  }) : renderComponentContainer(children);
26045
26887
  });
26046
26888
 
26047
- function ownKeys$D(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; }
26048
- function _objectSpread$D(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$D(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$D(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26889
+ function ownKeys$C(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; }
26890
+ function _objectSpread$C(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$C(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$C(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26049
26891
  function compareChildren(a, b) {
26050
26892
  if (a.order < b.order) {
26051
26893
  return -1;
@@ -27133,7 +27975,7 @@ function moveWidgetAcrossContainers(workspace, sourceGridId, sourceCell, targetG
27133
27975
 
27134
27976
  // Rewire the grid pointers first (swap works for empty target too —
27135
27977
  // targetWidgetId is null then and the source cell becomes empty).
27136
- sourceGrid.grid[sourceCell] = _objectSpread$D(_objectSpread$D({}, sourceCellData), {}, {
27978
+ sourceGrid.grid[sourceCell] = _objectSpread$C(_objectSpread$C({}, sourceCellData), {}, {
27137
27979
  component: targetWidgetId
27138
27980
  });
27139
27981
  if (!targetCellData) {
@@ -27142,7 +27984,7 @@ function moveWidgetAcrossContainers(workspace, sourceGridId, sourceCell, targetG
27142
27984
  hide: false
27143
27985
  };
27144
27986
  } else {
27145
- targetGrid.grid[targetCell] = _objectSpread$D(_objectSpread$D({}, targetCellData), {}, {
27987
+ targetGrid.grid[targetCell] = _objectSpread$C(_objectSpread$C({}, targetCellData), {}, {
27146
27988
  component: sourceWidgetId
27147
27989
  });
27148
27990
  }
@@ -27559,11 +28401,11 @@ function migrateBareComponentName(componentMap, component) {
27559
28401
  return component;
27560
28402
  }
27561
28403
 
27562
- function ownKeys$C(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; }
27563
- function _objectSpread$C(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$C(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$C(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
27564
- function _createForOfIteratorHelper$k(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$k(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; } } }; }
27565
- function _unsupportedIterableToArray$k(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$k(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$k(r, a) : void 0; } }
27566
- function _arrayLikeToArray$k(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; }
28404
+ function ownKeys$B(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; }
28405
+ function _objectSpread$B(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$B(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$B(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
28406
+ function _createForOfIteratorHelper$j(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$j(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; } } }; }
28407
+ function _unsupportedIterableToArray$j(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$j(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$j(r, a) : void 0; } }
28408
+ function _arrayLikeToArray$j(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; }
27567
28409
  /**
27568
28410
  * The model for all layout components used primarily in the renderLayout method
27569
28411
  * @param {Object} layoutItem an object containing various attributes of the layout item
@@ -27575,7 +28417,7 @@ function _arrayLikeToArray$k(r, a) { (null == a || a > r.length) && (a = r.lengt
27575
28417
  function sortObjectByKeys(obj) {
27576
28418
  var sortedKeys = Object.keys(obj).sort();
27577
28419
  var sortedObj = {};
27578
- var _iterator = _createForOfIteratorHelper$k(sortedKeys),
28420
+ var _iterator = _createForOfIteratorHelper$j(sortedKeys),
27579
28421
  _step;
27580
28422
  try {
27581
28423
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -27727,7 +28569,7 @@ var LayoutModel = function LayoutModel(layoutItem, workspaceLayout, dashboardId)
27727
28569
 
27728
28570
  // Merge user-entered config values (from EnhancedWidgetDropdown) into userPrefs
27729
28571
  if ("userConfigValues" in obj && obj.userConfigValues) {
27730
- layout.userPrefs = _objectSpread$C(_objectSpread$C({}, layout.userPrefs), obj.userConfigValues);
28572
+ layout.userPrefs = _objectSpread$B(_objectSpread$B({}, layout.userPrefs), obj.userConfigValues);
27731
28573
  }
27732
28574
 
27733
28575
  // Preserve provider selections for this widget
@@ -27765,956 +28607,224 @@ var LayoutModel = function LayoutModel(layoutItem, workspaceLayout, dashboardId)
27765
28607
  if (!layout.grid.rows) layout.grid.rows = 1;
27766
28608
  if (!layout.grid.cols) layout.grid.cols = 1;
27767
28609
 
27768
- // Set default gap if not specified
27769
- if (!layout.grid.gap) layout.grid.gap = "gap-2";
27770
-
27771
- // Sort grid object keys for consistent ordering
27772
- layout.grid = sortObjectByKeys(layout.grid);
27773
-
27774
- // If type is not explicitly set and grid exists, set type to "grid"
27775
- if (layout.type === "layout" && "grid" in obj) {
27776
- layout.type = "grid";
27777
- }
27778
- }
27779
- layout.parentWorkspaceName = "parentWorkspaceName" in obj ? obj["parentWorkspaceName"] : null;
27780
-
27781
- // last check for this being a container...
27782
- // we are forcing ALL containers to be w full and h full
27783
- // not sure this is a good idea, but...
27784
- if ("workspace" in layout || layout.type !== "widget") {
27785
- // if (layout.workspace === "layout") {
27786
- if (layout.width === "") {
27787
- layout.width = "w-full";
27788
- }
27789
- // if (layout.height === "") {
27790
- layout.height = "h-full";
27791
- // }
27792
- // if (layout.scrollable === "") {
27793
- // layout.scrollable = true;
27794
- // }
27795
- if (layout.direction === "") {
27796
- layout.direction = "col";
27797
- }
27798
- // }
27799
- }
27800
-
27801
- // lets check to see if we already have the parent workspace?
27802
- if (layout.parentWorkspaceName === null) {
27803
- // get the nearest workspace and assign this as the parent for rendering
27804
- var tempLayout = deepCopy(layout);
27805
- var parentWS = getNearestParentWorkspace(workspaceLayout, tempLayout, tempLayout);
27806
- var parentWorkspaceName = "layout";
27807
- if (parentWS) {
27808
- if ("workspace" in parentWS) {
27809
- parentWorkspaceName = parentWS["workspace"];
27810
- }
27811
- }
27812
- layout.parentWorkspaceName = parentWorkspaceName;
27813
- }
27814
- return layout;
27815
- } catch (e) {
27816
- return null;
27817
- }
27818
- };
27819
-
27820
- /**
27821
- * Handle all of the data for a color (theme)
27822
- * @param {Object} obj the color object we would like to use to populate the model (optional)
27823
- */
27824
- var ColorModel = function ColorModel() {
27825
- var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
27826
- try {
27827
- if (obj) {
27828
- // console.log("cm: ", obj);
27829
- var temp = deepCopy(obj);
27830
- var color = {};
27831
- color.panelType = "panelType" in temp ? temp.panelType : "main";
27832
- color.colorName = "colorName" in temp ? temp.colorName : "white";
27833
- color.colorType = "colorType" in temp ? temp.colorType !== undefined && temp.colorType !== null ? temp.colorType : "primary" : "primary";
27834
- color.shade = "shade" in temp ? temp.shade : 500;
27835
- color.variant = "variant" in temp ? temp.variant : "dark";
27836
- color.level = "level" in temp ? temp.level : "light";
27837
- color.objectType = "objectType" in temp ? temp.objectType : "bg";
27838
- color.styleName = getStyleName(color.objectType); //'background';
27839
-
27840
- /**
27841
- * generate the display name
27842
- */
27843
- color.displayName = "displayName" in temp ? temp.name : capitalizeFirstLetter(color.colorName);
27844
-
27845
- /**
27846
- * Strings for the theme class name and the class to be used in className
27847
- */
27848
- color.themeClass = "".concat(color.objectType, "-").concat(color.colorType, "-").concat(color.level);
27849
- color["class"] = "".concat(color.objectType, "-").concat(color.colorName, "-").concat(color.shade);
27850
-
27851
- /**
27852
- * Grab the hex code via tailwind for the tailwind color
27853
- * This may change as we move to hex codes for selection
27854
- */
27855
- color.hex = colors[color.colorName];
27856
- return color;
27857
- }
27858
- return null;
27859
- } catch (e) {
27860
- return obj;
27861
- }
27862
- };
27863
-
27864
- var SettingsModel = function SettingsModel() {
27865
- var settingsObject = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
27866
- var obj = deepCopy(settingsObject);
27867
- obj["debug"] = "debug" in obj ? obj["debug"] : false;
27868
- obj["theme"] = "theme" in obj ? obj["theme"] : null;
27869
- return obj;
27870
- };
27871
-
27872
- function _createForOfIteratorHelper$j(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$j(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; } } }; }
27873
- function _unsupportedIterableToArray$j(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$j(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$j(r, a) : void 0; } }
27874
- function _arrayLikeToArray$j(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; }
27875
- /**
27876
- * providerResolution.js
27877
- *
27878
- * Shared helpers for walking a workspace and figuring out which widgets
27879
- * have required providers that are still unresolved after the 3-layer
27880
- * resolution (widget → workspace → app-default → null). Used by:
27881
- *
27882
- * - DashboardConfigModal to render the Providers tab
27883
- * - DashboardStage toolbar to show the unresolved-count badge
27884
- *
27885
- * Both places need the same answer, so keep the logic here to avoid drift
27886
- * with the resolution inside `useMcpProvider` / `useWebSocketProvider`.
27887
- */
27888
-
27889
- /**
27890
- * Resolve which provider name a given widget instance would bind to for
27891
- * the given provider type. Mirrors the 3-layer chain in useMcpProvider
27892
- * and useWebSocketProvider exactly:
27893
- *
27894
- * 1. widget-level override (layoutItem.selectedProviders[type])
27895
- * 2. workspace-level binding (workspace.selectedProviders[id][type])
27896
- * 3. app default (any provider of matching type flagged
27897
- * `isDefaultForType` in appProviders)
27898
- * 4. null (truly unresolved)
27899
- */
27900
- function resolveProviderName(_ref) {
27901
- var _layoutItem$selectedP, _workspace$selectedPr;
27902
- var providerType = _ref.providerType,
27903
- layoutItem = _ref.layoutItem,
27904
- widgetId = _ref.widgetId,
27905
- workspace = _ref.workspace,
27906
- appProviders = _ref.appProviders;
27907
- // 1. Widget-level
27908
- var widgetLevel = layoutItem === null || layoutItem === void 0 || (_layoutItem$selectedP = layoutItem.selectedProviders) === null || _layoutItem$selectedP === void 0 ? void 0 : _layoutItem$selectedP[providerType];
27909
- if (widgetLevel) return widgetLevel;
27910
-
27911
- // 2. Workspace-level
27912
- var workspaceLevel = widgetId && (workspace === null || workspace === void 0 || (_workspace$selectedPr = workspace.selectedProviders) === null || _workspace$selectedPr === void 0 || (_workspace$selectedPr = _workspace$selectedPr[widgetId]) === null || _workspace$selectedPr === void 0 ? void 0 : _workspace$selectedPr[providerType]);
27913
- if (workspaceLevel) return workspaceLevel;
27914
-
27915
- // 3. App default — appProviders is either a map keyed by name or an
27916
- // array. Support both because different callers shape it either way.
27917
- if (appProviders) {
27918
- if (Array.isArray(appProviders)) {
27919
- var _iterator = _createForOfIteratorHelper$j(appProviders),
27920
- _step;
27921
- try {
27922
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
27923
- var data = _step.value;
27924
- if ((data === null || data === void 0 ? void 0 : data.type) === providerType && (data === null || data === void 0 ? void 0 : data.isDefaultForType) === true) {
27925
- return data.name;
27926
- }
27927
- }
27928
- } catch (err) {
27929
- _iterator.e(err);
27930
- } finally {
27931
- _iterator.f();
27932
- }
27933
- } else if (_typeof(appProviders) === "object") {
27934
- for (var _i = 0, _Object$entries = Object.entries(appProviders); _i < _Object$entries.length; _i++) {
27935
- var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
27936
- name = _Object$entries$_i[0],
27937
- _data = _Object$entries$_i[1];
27938
- if ((_data === null || _data === void 0 ? void 0 : _data.type) === providerType && (_data === null || _data === void 0 ? void 0 : _data.isDefaultForType) === true) {
27939
- return name;
27940
- }
27941
- }
27942
- }
27943
- }
27944
- return null;
27945
- }
27946
-
27947
- /**
27948
- * Walk every layout container in a workspace and yield each widget
27949
- * instance with its concrete layout item. Handles the main layout,
27950
- * per-page layouts, the sidebar, and nested LayoutGridContainers whose
27951
- * children are stored on `items`/`layout`.
27952
- *
27953
- * Deduplicates by object identity AND by stable id so that shared
27954
- * references across pages (or two structurally-distinct items that
27955
- * carry the same uuidString / id, which is the wiring key) are
27956
- * visited exactly once. Pipeline-style workspaces re-reference the
27957
- * same widget objects across page layouts; without this dedupe the
27958
- * Providers/Listeners tabs render one row per reference.
27959
- */
27960
- function forEachWidget(workspace, visit) {
27961
- if (!workspace) return;
27962
- var visitedObjects = new WeakSet();
27963
- var visitedIds = new Set();
27964
-
27965
- // Canonical identity: `component|id-ish`. Including the component
27966
- // prefix in every form aligns this with `canonicalItemKey` in
27967
- // listenerResolution.js — they MUST agree or duplicates slip
27968
- // between the visit loop and downstream dedupes. Prefer uuidString
27969
- // (stable across sessions), then uuid, then numeric id.
27970
- var stableId = function stableId(item) {
27971
- if (!item || !item.component) return null;
27972
- if (item.uuidString) return "".concat(item.component, "|").concat(item.uuidString);
27973
- if (item.uuid) return "".concat(item.component, "|").concat(item.uuid);
27974
- if (item.id != null) return "".concat(item.component, "|").concat(item.id);
27975
- return null;
27976
- };
27977
- var _walk = function walk(items) {
27978
- if (!Array.isArray(items)) return;
27979
- var _iterator2 = _createForOfIteratorHelper$j(items),
27980
- _step2;
27981
- try {
27982
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
27983
- var item = _step2.value;
27984
- if (!item || _typeof(item) !== "object") continue;
27985
- // A "widget" is any layout item with a component name.
27986
- // Containers can have both a component name AND nested items
27987
- // (e.g. LayoutGridContainer), so still recurse.
27988
- if (item.component) {
27989
- var id = stableId(item);
27990
- var alreadyByRef = visitedObjects.has(item);
27991
- var alreadyById = id != null && visitedIds.has(id);
27992
- if (!alreadyByRef && !alreadyById) {
27993
- visitedObjects.add(item);
27994
- if (id != null) visitedIds.add(id);
27995
- visit(item);
27996
- }
27997
- }
27998
- if (Array.isArray(item.items)) _walk(item.items);
27999
- if (Array.isArray(item.layout)) _walk(item.layout);
28000
- }
28001
- } catch (err) {
28002
- _iterator2.e(err);
28003
- } finally {
28004
- _iterator2.f();
28005
- }
28006
- };
28007
- _walk(workspace.layout);
28008
- if (Array.isArray(workspace.pages)) {
28009
- var _iterator3 = _createForOfIteratorHelper$j(workspace.pages),
28010
- _step3;
28011
- try {
28012
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
28013
- var page = _step3.value;
28014
- _walk(page === null || page === void 0 ? void 0 : page.layout);
28015
- }
28016
- } catch (err) {
28017
- _iterator3.e(err);
28018
- } finally {
28019
- _iterator3.f();
28020
- }
28021
- }
28022
- _walk(workspace.sidebarLayout);
28023
- }
28024
-
28025
- /**
28026
- * Compute the list of unresolved required providers across a workspace.
28027
- *
28028
- * @param {object} args
28029
- * @param {object} args.workspace The workspace (with layout/pages/sidebarLayout/selectedProviders).
28030
- * @param {object|Array} args.appProviders
28031
- * Map keyed by provider name, or an array of provider objects. Each
28032
- * entry has at least `{ type, isDefaultForType }`.
28033
- * @param {(componentName: string) => Array<{type, required?, providerClass?}>} args.getWidgetRequirements
28034
- * Returns the `providers: [...]` declaration from the component's
28035
- * `.dash.js` (via `ComponentManager.componentMap()[name].providers`).
28036
- *
28037
- * @returns {Array<{ widgetId, component, providerType, providerClass, layoutItem }>}
28038
- * One entry per (widget instance, required provider type) that lacks
28039
- * a binding.
28040
- */
28041
- function getUnresolvedProviders(_ref2) {
28042
- var workspace = _ref2.workspace,
28043
- appProviders = _ref2.appProviders,
28044
- getWidgetRequirements = _ref2.getWidgetRequirements;
28045
- if (!workspace || typeof getWidgetRequirements !== "function") return [];
28046
- var unresolved = [];
28047
- forEachWidget(workspace, function (item) {
28048
- var requirements = getWidgetRequirements(item.component) || [];
28049
- if (!Array.isArray(requirements) || requirements.length === 0) return;
28050
- var widgetId = item.uuidString || item.uuid || item.id || null;
28051
- var _iterator4 = _createForOfIteratorHelper$j(requirements),
28052
- _step4;
28053
- try {
28054
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
28055
- var req = _step4.value;
28056
- if (!req || !req.type) continue;
28057
- if (req.required === false) continue; // optional, skip
28058
-
28059
- var name = resolveProviderName({
28060
- providerType: req.type,
28061
- layoutItem: item,
28062
- widgetId: widgetId,
28063
- workspace: workspace,
28064
- appProviders: appProviders
28065
- });
28066
- if (!name) {
28067
- unresolved.push({
28068
- widgetId: widgetId,
28069
- component: item.component,
28070
- providerType: req.type,
28071
- providerClass: req.providerClass || null,
28072
- layoutItem: item
28073
- });
28074
- }
28075
- }
28076
- } catch (err) {
28077
- _iterator4.e(err);
28078
- } finally {
28079
- _iterator4.f();
28080
- }
28081
- });
28082
- return unresolved;
28083
- }
28084
-
28085
- /**
28086
- * Group an unresolved-provider list (or any `{widget, providerType}` list)
28087
- * by provider type, so the Providers tab can render one row per unique
28088
- * type with N widgets beneath.
28089
- */
28090
- function groupByProviderType(unresolved) {
28091
- var byType = new Map();
28092
- var _iterator5 = _createForOfIteratorHelper$j(unresolved || []),
28093
- _step5;
28094
- try {
28095
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
28096
- var u = _step5.value;
28097
- if (!(u !== null && u !== void 0 && u.providerType)) continue;
28098
- if (!byType.has(u.providerType)) byType.set(u.providerType, []);
28099
- byType.get(u.providerType).push(u);
28100
- }
28101
- } catch (err) {
28102
- _iterator5.e(err);
28103
- } finally {
28104
- _iterator5.f();
28105
- }
28106
- return byType;
28107
- }
28108
-
28109
- /**
28110
- * Summarize every widget in the workspace that requires ANY provider,
28111
- * regardless of whether it's already resolved. Drives the Providers tab's
28112
- * "show per-widget overrides" expansion — the modal lists all widgets so
28113
- * the user can change an explicit override even for types that are
28114
- * already resolved via the app default.
28115
- */
28116
- function getAllProviderBindings(_ref3) {
28117
- var workspace = _ref3.workspace,
28118
- appProviders = _ref3.appProviders,
28119
- getWidgetRequirements = _ref3.getWidgetRequirements;
28120
- if (!workspace || typeof getWidgetRequirements !== "function") return [];
28121
- var bindings = [];
28122
- forEachWidget(workspace, function (item) {
28123
- var requirements = getWidgetRequirements(item.component) || [];
28124
- if (!Array.isArray(requirements) || requirements.length === 0) return;
28125
- var widgetId = item.uuidString || item.uuid || item.id || null;
28126
- var _iterator6 = _createForOfIteratorHelper$j(requirements),
28127
- _step6;
28128
- try {
28129
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
28130
- var req = _step6.value;
28131
- if (!req || !req.type) continue;
28132
- var name = resolveProviderName({
28133
- providerType: req.type,
28134
- layoutItem: item,
28135
- widgetId: widgetId,
28136
- workspace: workspace,
28137
- appProviders: appProviders
28138
- });
28139
- bindings.push({
28140
- widgetId: widgetId,
28141
- component: item.component,
28142
- providerType: req.type,
28143
- providerClass: req.providerClass || null,
28144
- required: req.required !== false,
28145
- resolvedProviderName: name,
28146
- layoutItem: item
28147
- });
28148
- }
28149
- } catch (err) {
28150
- _iterator6.e(err);
28151
- } finally {
28152
- _iterator6.f();
28153
- }
28154
- });
28155
- return bindings;
28156
- }
28157
-
28158
- function ownKeys$B(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; }
28159
- function _objectSpread$B(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$B(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$B(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
28160
- function _createForOfIteratorHelper$i(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$i(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; } } }; }
28161
- function _unsupportedIterableToArray$i(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$i(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$i(r, a) : void 0; } }
28162
- function _arrayLikeToArray$i(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; }
28163
- var EVENT_STRING_RE = /^([^[]+)\[([^\]]+)\]\.(.+)$/;
28164
-
28165
- /** Parse "Component[itemId].event" → { component, itemId, event }. */
28166
- function parseEventString(eventString) {
28167
- if (typeof eventString !== "string") return null;
28168
- var m = eventString.match(EVENT_STRING_RE);
28169
- if (!m) return null;
28170
- return {
28171
- component: m[1],
28172
- itemId: m[2],
28173
- event: m[3]
28174
- };
28175
- }
28176
-
28177
- /** Build an event string in the canonical runtime format. */
28178
- function formatEventString(component, itemId, event) {
28179
- return "".concat(component, "[").concat(itemId, "].").concat(event);
28180
- }
28181
-
28182
- /**
28183
- * Get a stable id for a layout item. Layout items historically used
28184
- * numeric `id`; some newer flows also carry `uuidString`/`uuid`. The
28185
- * runtime event-string format uses whichever is `item.id`, so we
28186
- * default to that and fall back to the others for resilience.
28187
- */
28188
- function itemIdOf(item) {
28189
- if (item == null) return null;
28190
- if (item.id !== undefined && item.id !== null) return String(item.id);
28191
- if (item.uuidString) return item.uuidString;
28192
- if (item.uuid) return item.uuid;
28193
- return null;
28194
- }
28195
-
28196
- /**
28197
- * Canonical identity key for a layout item: `component|id-ish`.
28198
- * Single source of truth for dedupe in every query below and in
28199
- * `forEachWidget` (providerResolution.js). Including the component
28200
- * prefix prevents two structurally-different widgets from colliding
28201
- * when they happen to share a uuid (rare, but possible when items
28202
- * are pasted between workspaces).
28203
- *
28204
- * Priority matches forEachWidget's stableId so a widget that
28205
- * forEachWidget visited once produces exactly one map entry across
28206
- * every listener-side consumer — no more `STAGEGATECHECKLIST[4]`
28207
- * appearing twice because one caller used `uuidString` and the
28208
- * other used `id`.
28209
- */
28210
- function canonicalItemKey(item) {
28211
- if (!item || !item.component) return null;
28212
- if (item.uuidString) return "".concat(item.component, "|").concat(item.uuidString);
28213
- if (item.uuid) return "".concat(item.component, "|").concat(item.uuid);
28214
- if (item.id !== undefined && item.id !== null) {
28215
- return "".concat(item.component, "|").concat(item.id);
28216
- }
28217
- return null;
28218
- }
28219
-
28220
- /**
28221
- * Best-effort human label for a layout item: explicit title, then
28222
- * widget config display name, then component name + short id.
28223
- */
28224
- function labelFor(item, getWidgetConfig) {
28225
- var _item$userPrefs, _item$userConfig;
28226
- var cfg = (getWidgetConfig === null || getWidgetConfig === void 0 ? void 0 : getWidgetConfig(item.component)) || null;
28227
- var explicit = (item === null || item === void 0 || (_item$userPrefs = item.userPrefs) === null || _item$userPrefs === void 0 ? void 0 : _item$userPrefs.title) || (item === null || item === void 0 || (_item$userConfig = item.userConfig) === null || _item$userConfig === void 0 ? void 0 : _item$userConfig.title);
28228
- if (explicit) return explicit;
28229
- if (cfg !== null && cfg !== void 0 && cfg.displayName) return cfg.displayName;
28230
- var id = itemIdOf(item);
28231
- return "".concat(item.component || "widget").concat(id ? "[".concat(String(id).slice(0, 6), "]") : "");
28232
- }
28233
-
28234
- /**
28235
- * Read the events/eventHandlers metadata for a widget. Items can carry
28236
- * the arrays inline (older pattern where they got cached onto the
28237
- * layout item); the current component config carries them via the
28238
- * ComponentManager catalog. We UNION both so we don't flag a binding
28239
- * as orphaned just because an inline cache is stale — if the current
28240
- * widget code declares the event/handler, the binding is valid.
28241
- */
28242
- function eventsOf(item, getWidgetConfig) {
28243
- var inline = Array.isArray(item.events) ? item.events : [];
28244
- var cfg = (getWidgetConfig === null || getWidgetConfig === void 0 ? void 0 : getWidgetConfig(item.component)) || {};
28245
- var fromCfg = Array.isArray(cfg.events) ? cfg.events : [];
28246
- return _toConsumableArray(new Set([].concat(_toConsumableArray(inline), _toConsumableArray(fromCfg))));
28247
- }
28248
- function eventHandlersOf(item, getWidgetConfig) {
28249
- var inline = Array.isArray(item.eventHandlers) ? item.eventHandlers : [];
28250
- var cfg = (getWidgetConfig === null || getWidgetConfig === void 0 ? void 0 : getWidgetConfig(item.component)) || {};
28251
- var fromCfg = Array.isArray(cfg.eventHandlers) ? cfg.eventHandlers : [];
28252
- return _toConsumableArray(new Set([].concat(_toConsumableArray(inline), _toConsumableArray(fromCfg))));
28253
- }
28254
-
28255
- /**
28256
- * Every widget instance in the workspace that emits at least one event.
28257
- * Deduplicated by `${component}|${itemId}` — the same compound key that
28258
- * event strings use at runtime, so any "duplicate" in the tree (same
28259
- * widget referenced across pages) resolves to the same wiring target.
28260
- * @returns {Array<{ itemId, component, label, events: string[], key: string }>}
28261
- */
28262
- function getEmitters(workspace, getWidgetConfig) {
28263
- var byKey = new Map();
28264
- forEachWidget(workspace, function (item) {
28265
- var events = eventsOf(item, getWidgetConfig);
28266
- if (events.length === 0) return;
28267
- var key = canonicalItemKey(item);
28268
- if (!key) return;
28269
- if (byKey.has(key)) return;
28270
- byKey.set(key, {
28271
- key: key,
28272
- itemId: itemIdOf(item),
28273
- component: item.component,
28274
- label: labelFor(item, getWidgetConfig),
28275
- events: events
28276
- });
28277
- });
28278
- return Array.from(byKey.values());
28279
- }
28280
-
28281
- /**
28282
- * Every widget instance in the workspace that accepts at least one
28283
- * handler. Used to populate the receiver dropdown. Deduplicated by
28284
- * `${component}|${itemId}` (see getEmitters).
28285
- * @returns {Array<{ itemId, component, label, eventHandlers: string[], listeners: object, key: string }>}
28286
- */
28287
- function getReceivers(workspace, getWidgetConfig) {
28288
- var byKey = new Map();
28289
- forEachWidget(workspace, function (item) {
28290
- var handlers = eventHandlersOf(item, getWidgetConfig);
28291
- if (handlers.length === 0) return;
28292
- var key = canonicalItemKey(item);
28293
- if (!key) return;
28294
- if (byKey.has(key)) return;
28295
- byKey.set(key, {
28296
- key: key,
28297
- itemId: itemIdOf(item),
28298
- component: item.component,
28299
- label: labelFor(item, getWidgetConfig),
28300
- eventHandlers: handlers,
28301
- listeners: item.listeners || {}
28302
- });
28303
- });
28304
- return Array.from(byKey.values());
28305
- }
28610
+ // Set default gap if not specified
28611
+ if (!layout.grid.gap) layout.grid.gap = "gap-2";
28306
28612
 
28307
- /**
28308
- * Flatten every listener binding in the workspace into a list of
28309
- * { receiverItemId, receiverComponent, handlerName, sourceComponent,
28310
- * sourceItemId, eventName, raw } tuples. `raw` is the original
28311
- * event string for round-trip fidelity on remove.
28312
- */
28313
- function getCurrentWiring(workspace) {
28314
- var wiring = [];
28315
- forEachWidget(workspace, function (item) {
28316
- var receiverItemId = itemIdOf(item);
28317
- if (receiverItemId == null) return;
28318
- var listeners = item.listeners;
28319
- if (!listeners || _typeof(listeners) !== "object") return;
28320
- for (var _i = 0, _Object$entries = Object.entries(listeners); _i < _Object$entries.length; _i++) {
28321
- var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
28322
- handlerName = _Object$entries$_i[0],
28323
- eventList = _Object$entries$_i[1];
28324
- // Live format is array; defensive guard for legacy object
28325
- // form (a single source widget keyed under the handler).
28326
- var events = Array.isArray(eventList) ? eventList : typeof eventList === "string" ? [eventList] : [];
28327
- var _iterator = _createForOfIteratorHelper$i(events),
28328
- _step;
28329
- try {
28330
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
28331
- var raw = _step.value;
28332
- var parsed = parseEventString(raw);
28333
- if (!parsed) continue;
28334
- wiring.push({
28335
- receiverItemId: receiverItemId,
28336
- receiverComponent: item.component,
28337
- handlerName: handlerName,
28338
- sourceComponent: parsed.component,
28339
- sourceItemId: parsed.itemId,
28340
- eventName: parsed.event,
28341
- raw: raw
28342
- });
28613
+ // Sort grid object keys for consistent ordering
28614
+ layout.grid = sortObjectByKeys(layout.grid);
28615
+
28616
+ // If type is not explicitly set and grid exists, set type to "grid"
28617
+ if (layout.type === "layout" && "grid" in obj) {
28618
+ layout.type = "grid";
28619
+ }
28620
+ }
28621
+ layout.parentWorkspaceName = "parentWorkspaceName" in obj ? obj["parentWorkspaceName"] : null;
28622
+
28623
+ // last check for this being a container...
28624
+ // we are forcing ALL containers to be w full and h full
28625
+ // not sure this is a good idea, but...
28626
+ if ("workspace" in layout || layout.type !== "widget") {
28627
+ // if (layout.workspace === "layout") {
28628
+ if (layout.width === "") {
28629
+ layout.width = "w-full";
28630
+ }
28631
+ // if (layout.height === "") {
28632
+ layout.height = "h-full";
28633
+ // }
28634
+ // if (layout.scrollable === "") {
28635
+ // layout.scrollable = true;
28636
+ // }
28637
+ if (layout.direction === "") {
28638
+ layout.direction = "col";
28639
+ }
28640
+ // }
28641
+ }
28642
+
28643
+ // lets check to see if we already have the parent workspace?
28644
+ if (layout.parentWorkspaceName === null) {
28645
+ // get the nearest workspace and assign this as the parent for rendering
28646
+ var tempLayout = deepCopy(layout);
28647
+ var parentWS = getNearestParentWorkspace(workspaceLayout, tempLayout, tempLayout);
28648
+ var parentWorkspaceName = "layout";
28649
+ if (parentWS) {
28650
+ if ("workspace" in parentWS) {
28651
+ parentWorkspaceName = parentWS["workspace"];
28343
28652
  }
28344
- } catch (err) {
28345
- _iterator.e(err);
28346
- } finally {
28347
- _iterator.f();
28348
28653
  }
28654
+ layout.parentWorkspaceName = parentWorkspaceName;
28349
28655
  }
28350
- });
28351
- return wiring;
28352
- }
28656
+ return layout;
28657
+ } catch (e) {
28658
+ return null;
28659
+ }
28660
+ };
28353
28661
 
28354
28662
  /**
28355
- * Detect listener bindings that are no longer valid: the source widget
28356
- * doesn't exist in the workspace anymore, or the source widget doesn't
28357
- * declare the event, or the receiver doesn't declare the handler.
28358
- * Each entry includes a `reason` so the modal can show a sensible
28359
- * message.
28663
+ * Handle all of the data for a color (theme)
28664
+ * @param {Object} obj the color object we would like to use to populate the model (optional)
28360
28665
  */
28361
- function getOrphanedListeners(workspace, getWidgetConfig) {
28362
- var wiring = getCurrentWiring(workspace);
28363
- if (wiring.length === 0) return [];
28364
-
28365
- // Build two lookups:
28366
- // byCompositeKey: `${component}|${itemId}` → widget meta (primary)
28367
- // byItemId: `${itemId}` → widget meta (fallback,
28368
- // used only for the "source-missing" check where
28369
- // the wiring's component can't be trusted yet)
28370
- // The composite key matches how the runtime event-string
28371
- // (`Component[itemId].event`) identifies a widget, so orphan
28372
- // decisions line up with what actually fires at runtime.
28373
- var byCompositeKey = new Map();
28374
- var byItemId = new Map();
28375
- forEachWidget(workspace, function (item) {
28376
- var id = itemIdOf(item);
28377
- if (id == null) return;
28378
- var meta = {
28379
- component: item.component,
28380
- events: eventsOf(item, getWidgetConfig),
28381
- eventHandlers: eventHandlersOf(item, getWidgetConfig)
28382
- };
28383
- byCompositeKey.set("".concat(item.component, "|").concat(id), meta);
28384
- // First-seen wins on numeric-id collisions; good enough for the
28385
- // "does any widget with this id exist?" fallback.
28386
- if (!byItemId.has(id)) byItemId.set(id, meta);
28387
- });
28388
- var orphans = [];
28389
- var _iterator2 = _createForOfIteratorHelper$i(wiring),
28390
- _step2;
28666
+ var ColorModel = function ColorModel() {
28667
+ var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
28391
28668
  try {
28392
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
28393
- var w = _step2.value;
28394
- var srcKey = "".concat(w.sourceComponent, "|").concat(w.sourceItemId);
28395
- var src = byCompositeKey.get(srcKey);
28396
- if (!src) {
28397
- // No (component, id) match. If some OTHER widget still owns
28398
- // this id, the source component changed; otherwise it's truly
28399
- // missing. Preserves the user's ability to see whether a
28400
- // rename happened vs. a delete.
28401
- var fallback = byItemId.get(String(w.sourceItemId));
28402
- orphans.push(_objectSpread$B(_objectSpread$B({}, w), {}, {
28403
- reason: fallback ? "source-component-mismatch" : "source-missing"
28404
- }));
28405
- continue;
28406
- }
28407
- if (!src.events.includes(w.eventName)) {
28408
- orphans.push(_objectSpread$B(_objectSpread$B({}, w), {}, {
28409
- reason: "event-not-emitted"
28410
- }));
28411
- continue;
28412
- }
28413
- var receiverKey = "".concat(w.receiverComponent, "|").concat(w.receiverItemId);
28414
- var receiver = byCompositeKey.get(receiverKey);
28415
- if (receiver && !receiver.eventHandlers.includes(w.handlerName)) {
28416
- orphans.push(_objectSpread$B(_objectSpread$B({}, w), {}, {
28417
- reason: "handler-not-declared"
28418
- }));
28419
- }
28669
+ if (obj) {
28670
+ // console.log("cm: ", obj);
28671
+ var temp = deepCopy(obj);
28672
+ var color = {};
28673
+ color.panelType = "panelType" in temp ? temp.panelType : "main";
28674
+ color.colorName = "colorName" in temp ? temp.colorName : "white";
28675
+ color.colorType = "colorType" in temp ? temp.colorType !== undefined && temp.colorType !== null ? temp.colorType : "primary" : "primary";
28676
+ color.shade = "shade" in temp ? temp.shade : 500;
28677
+ color.variant = "variant" in temp ? temp.variant : "dark";
28678
+ color.level = "level" in temp ? temp.level : "light";
28679
+ color.objectType = "objectType" in temp ? temp.objectType : "bg";
28680
+ color.styleName = getStyleName(color.objectType); //'background';
28681
+
28682
+ /**
28683
+ * generate the display name
28684
+ */
28685
+ color.displayName = "displayName" in temp ? temp.name : capitalizeFirstLetter(color.colorName);
28686
+
28687
+ /**
28688
+ * Strings for the theme class name and the class to be used in className
28689
+ */
28690
+ color.themeClass = "".concat(color.objectType, "-").concat(color.colorType, "-").concat(color.level);
28691
+ color["class"] = "".concat(color.objectType, "-").concat(color.colorName, "-").concat(color.shade);
28692
+
28693
+ /**
28694
+ * Grab the hex code via tailwind for the tailwind color
28695
+ * This may change as we move to hex codes for selection
28696
+ */
28697
+ color.hex = colors[color.colorName];
28698
+ return color;
28420
28699
  }
28421
- } catch (err) {
28422
- _iterator2.e(err);
28423
- } finally {
28424
- _iterator2.f();
28700
+ return null;
28701
+ } catch (e) {
28702
+ return obj;
28425
28703
  }
28426
- return orphans;
28427
- }
28704
+ };
28705
+
28706
+ var SettingsModel = function SettingsModel() {
28707
+ var settingsObject = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
28708
+ var obj = deepCopy(settingsObject);
28709
+ obj["debug"] = "debug" in obj ? obj["debug"] : false;
28710
+ obj["theme"] = "theme" in obj ? obj["theme"] : null;
28711
+ return obj;
28712
+ };
28713
+
28714
+ function _createForOfIteratorHelper$i(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$i(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; } } }; }
28715
+ function _unsupportedIterableToArray$i(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$i(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$i(r, a) : void 0; } }
28716
+ function _arrayLikeToArray$i(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; }
28428
28717
 
28429
28718
  /**
28430
- * Mutate a workspace tree in place, removing listener bindings whose
28431
- * source widget is not present in the workspace. Pure: doesn't need
28432
- * ComponentManager, so it's safe to call from WorkspaceModel during
28433
- * load the workspace's own tree is the only source of truth.
28719
+ * Workspace-level pre-pass that migrates legacy bare component
28720
+ * references throughout an entire workspace. Runs ONCE on workspace
28721
+ * load (from `WorkspaceModel`); after this pass every layout item
28722
+ * carries a fully scoped `component` AND every listener event string
28723
+ * (`Comp[id].evt`) references the matching scoped component.
28434
28724
  *
28435
- * Handles the four cases producing a "source-missing" orphan:
28436
- * - the emitter widget was deleted
28437
- * - the emitter widget's id now belongs to a different component
28438
- * (stored binding has stale component name)
28439
- * - the source string failed to parse (legacy/garbage data)
28725
+ * Why workspace-level (and not per-LayoutModel item)?
28440
28726
  *
28441
- * Leaves "event-not-emitted" / "handler-not-declared" cases untouched
28442
- * because they require the current widget catalog to decide — those
28443
- * are handled at runtime with full ComponentManager access.
28727
+ * - Listeners can reference widgets across pages/sidebar/root, so
28728
+ * migrating one item's listeners requires knowing the scoped form
28729
+ * of widgets in OTHER items. Per-item migration can't see that.
28730
+ * - `pruneDeadListenerReferences` (called immediately after) walks
28731
+ * the whole workspace and needs every item's `component` AND
28732
+ * every listener string to use the same identity space. If
28733
+ * listeners still reference bare names but live items are scoped,
28734
+ * prune treats every legacy listener as an orphan and silently
28735
+ * deletes the user's wiring.
28444
28736
  *
28445
- * @returns {number} count of bindings removed (for logging/diagnostics)
28737
+ * Mutating in place is intentional `WorkspaceModel` already deep-
28738
+ * copies the input, so the surface mutation is contained to that
28739
+ * working copy.
28740
+ *
28741
+ * @param {object} workspace
28742
+ * @param {object} componentMap - registry map keyed by scoped ids
28743
+ * @returns {{components: number, listeners: number}} migration counts
28446
28744
  */
28447
- function pruneDeadListenerReferences(workspace) {
28448
- if (!workspace) return 0;
28745
+ function migrateScopedIdsInWorkspace(workspace, componentMap) {
28746
+ var counts = {
28747
+ components: 0,
28748
+ listeners: 0
28749
+ };
28750
+ if (!workspace || !componentMap) return counts;
28751
+ var migrateComponent = function migrateComponent(item) {
28752
+ if (!item || _typeof(item) !== "object" || !item.component) return;
28753
+ var before = item.component;
28754
+ var after = migrateBareComponentName(componentMap, before);
28755
+ if (after !== before) {
28756
+ item.component = after;
28757
+ counts.components += 1;
28758
+ }
28759
+ };
28449
28760
 
28450
- // Build the set of live widgets in the tree, keyed by the same
28451
- // `${component}|${itemId}` the runtime uses to resolve events.
28452
- var liveKeys = new Set();
28453
- var _walkForLive = function walkForLive(items) {
28454
- if (!Array.isArray(items)) return;
28455
- var _iterator3 = _createForOfIteratorHelper$i(items),
28456
- _step3;
28457
- try {
28458
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
28459
- var item = _step3.value;
28460
- if (!item || _typeof(item) !== "object") continue;
28461
- if (item.component) {
28462
- var id = itemIdOf(item);
28463
- if (id != null) liveKeys.add("".concat(item.component, "|").concat(id));
28761
+ // Listener event strings parse as `Comp[id].evt`. Only the `Comp`
28762
+ // portion is migrated; the id is the receiver's stable layout id
28763
+ // (numeric or uuid) and the event name is widget-defined.
28764
+ var EVENT_RE = /^([^[]+)(\[[^\]]+\]\..+)$/;
28765
+ var migrateListenerStrings = function migrateListenerStrings(item) {
28766
+ if (!item || _typeof(item) !== "object") return;
28767
+ var listeners = item.listeners;
28768
+ if (!listeners || _typeof(listeners) !== "object") return;
28769
+ for (var _i = 0, _Object$keys = Object.keys(listeners); _i < _Object$keys.length; _i++) {
28770
+ var handler = _Object$keys[_i];
28771
+ var events = listeners[handler];
28772
+ if (!Array.isArray(events)) continue;
28773
+ for (var i = 0; i < events.length; i += 1) {
28774
+ var raw = events[i];
28775
+ if (typeof raw !== "string") continue;
28776
+ var m = raw.match(EVENT_RE);
28777
+ if (!m) continue;
28778
+ var _m = _slicedToArray(m, 3),
28779
+ comp = _m[1],
28780
+ rest = _m[2];
28781
+ var migrated = migrateBareComponentName(componentMap, comp);
28782
+ if (migrated !== comp) {
28783
+ events[i] = "".concat(migrated).concat(rest);
28784
+ counts.listeners += 1;
28464
28785
  }
28465
- if (Array.isArray(item.items)) _walkForLive(item.items);
28466
- if (Array.isArray(item.layout)) _walkForLive(item.layout);
28467
28786
  }
28468
- } catch (err) {
28469
- _iterator3.e(err);
28470
- } finally {
28471
- _iterator3.f();
28472
28787
  }
28473
28788
  };
28474
- _walkForLive(workspace.layout);
28475
- if (Array.isArray(workspace.pages)) {
28476
- var _iterator4 = _createForOfIteratorHelper$i(workspace.pages),
28477
- _step4;
28478
- try {
28479
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
28480
- var page = _step4.value;
28481
- _walkForLive(page === null || page === void 0 ? void 0 : page.layout);
28482
- }
28483
- } catch (err) {
28484
- _iterator4.e(err);
28485
- } finally {
28486
- _iterator4.f();
28487
- }
28488
- }
28489
- _walkForLive(workspace.sidebarLayout);
28490
- var removed = 0;
28491
- var _pruneListeners = function pruneListeners(items) {
28789
+ var _walk = function walk(items) {
28492
28790
  if (!Array.isArray(items)) return;
28493
- var _iterator5 = _createForOfIteratorHelper$i(items),
28494
- _step5;
28791
+ var _iterator = _createForOfIteratorHelper$i(items),
28792
+ _step;
28495
28793
  try {
28496
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
28497
- var item = _step5.value;
28794
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
28795
+ var item = _step.value;
28498
28796
  if (!item || _typeof(item) !== "object") continue;
28499
- if (item.listeners && _typeof(item.listeners) === "object") {
28500
- for (var _i2 = 0, _Object$keys = Object.keys(item.listeners); _i2 < _Object$keys.length; _i2++) {
28501
- var handler = _Object$keys[_i2];
28502
- var events = item.listeners[handler];
28503
- if (!Array.isArray(events)) continue;
28504
- var kept = [];
28505
- var _iterator6 = _createForOfIteratorHelper$i(events),
28506
- _step6;
28507
- try {
28508
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
28509
- var raw = _step6.value;
28510
- var parsed = parseEventString(raw);
28511
- if (parsed && liveKeys.has("".concat(parsed.component, "|").concat(parsed.itemId))) {
28512
- kept.push(raw);
28513
- } else {
28514
- removed += 1;
28515
- }
28516
- }
28517
- } catch (err) {
28518
- _iterator6.e(err);
28519
- } finally {
28520
- _iterator6.f();
28521
- }
28522
- if (kept.length === 0) {
28523
- delete item.listeners[handler];
28524
- } else if (kept.length !== events.length) {
28525
- item.listeners[handler] = kept;
28526
- }
28527
- }
28528
- }
28529
- if (Array.isArray(item.items)) _pruneListeners(item.items);
28530
- if (Array.isArray(item.layout)) _pruneListeners(item.layout);
28797
+ // Migrate this item, then recurse — order matters so that
28798
+ // pre-existing listeners on this item see the registry as it
28799
+ // was, not the (possibly newly-renamed) component name.
28800
+ migrateComponent(item);
28801
+ migrateListenerStrings(item);
28802
+ if (Array.isArray(item.items)) _walk(item.items);
28803
+ if (Array.isArray(item.layout)) _walk(item.layout);
28531
28804
  }
28532
28805
  } catch (err) {
28533
- _iterator5.e(err);
28806
+ _iterator.e(err);
28534
28807
  } finally {
28535
- _iterator5.f();
28808
+ _iterator.f();
28536
28809
  }
28537
28810
  };
28538
- _pruneListeners(workspace.layout);
28811
+ _walk(workspace.layout);
28539
28812
  if (Array.isArray(workspace.pages)) {
28540
- var _iterator7 = _createForOfIteratorHelper$i(workspace.pages),
28541
- _step7;
28813
+ var _iterator2 = _createForOfIteratorHelper$i(workspace.pages),
28814
+ _step2;
28542
28815
  try {
28543
- for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
28544
- var _page = _step7.value;
28545
- _pruneListeners(_page === null || _page === void 0 ? void 0 : _page.layout);
28816
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
28817
+ var page = _step2.value;
28818
+ _walk(page === null || page === void 0 ? void 0 : page.layout);
28546
28819
  }
28547
28820
  } catch (err) {
28548
- _iterator7.e(err);
28821
+ _iterator2.e(err);
28549
28822
  } finally {
28550
- _iterator7.f();
28551
- }
28552
- }
28553
- _pruneListeners(workspace.sidebarLayout);
28554
- return removed;
28555
- }
28556
-
28557
- /**
28558
- * Apply a staged delta to a workspace's listener bindings and return a
28559
- * NEW workspace object (deep-cloned along the modified path).
28560
- *
28561
- * `adds` / `removes` are arrays of
28562
- * { receiverItemId, handlerName, sourceComponent, sourceItemId, eventName }
28563
- *
28564
- * Removes may also pass `raw` (the exact pre-existing event string) for
28565
- * a precise match; otherwise we match on the canonical formatted form.
28566
- */
28567
- function applyWiringChanges(workspace, _ref) {
28568
- var _ref$adds = _ref.adds,
28569
- adds = _ref$adds === void 0 ? [] : _ref$adds,
28570
- _ref$removes = _ref.removes,
28571
- removes = _ref$removes === void 0 ? [] : _ref$removes;
28572
- if (!workspace) return workspace;
28573
- if (adds.length === 0 && removes.length === 0) return workspace;
28574
-
28575
- // Group changes by receiver for cheap per-item updates.
28576
- var byReceiver = new Map();
28577
- var ensure = function ensure(id) {
28578
- if (!byReceiver.has(id)) byReceiver.set(id, {
28579
- adds: [],
28580
- removes: []
28581
- });
28582
- return byReceiver.get(id);
28583
- };
28584
- var _iterator8 = _createForOfIteratorHelper$i(adds),
28585
- _step8;
28586
- try {
28587
- for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
28588
- var a = _step8.value;
28589
- if (!a.receiverItemId) continue;
28590
- ensure(String(a.receiverItemId)).adds.push(a);
28591
- }
28592
- } catch (err) {
28593
- _iterator8.e(err);
28594
- } finally {
28595
- _iterator8.f();
28596
- }
28597
- var _iterator9 = _createForOfIteratorHelper$i(removes),
28598
- _step9;
28599
- try {
28600
- for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
28601
- var r = _step9.value;
28602
- if (!r.receiverItemId) continue;
28603
- ensure(String(r.receiverItemId)).removes.push(r);
28604
- }
28605
-
28606
- // Walk the tree and rebuild listeners on every touched item. We do
28607
- // shallow clones along the path so React change detection is
28608
- // reliable — but the tree shape is preserved.
28609
- } catch (err) {
28610
- _iterator9.e(err);
28611
- } finally {
28612
- _iterator9.f();
28613
- }
28614
- var cloneList = function cloneList(items) {
28615
- return Array.isArray(items) ? items.map(function (item) {
28616
- return transform(item);
28617
- }) : items;
28618
- };
28619
- var transform = function transform(item) {
28620
- if (!item || _typeof(item) !== "object") return item;
28621
- var next = item;
28622
- var id = itemIdOf(item);
28623
- var change = id != null ? byReceiver.get(String(id)) : null;
28624
- if (change) {
28625
- var newListeners = applyToItem(item.listeners || {}, change);
28626
- next = _objectSpread$B(_objectSpread$B({}, next), {}, {
28627
- listeners: newListeners
28628
- });
28629
- }
28630
- if (Array.isArray(next.items)) {
28631
- next = _objectSpread$B(_objectSpread$B({}, next), {}, {
28632
- items: cloneList(next.items)
28633
- });
28634
- }
28635
- if (Array.isArray(next.layout)) {
28636
- next = _objectSpread$B(_objectSpread$B({}, next), {}, {
28637
- layout: cloneList(next.layout)
28638
- });
28639
- }
28640
- return next;
28641
- };
28642
- var updatedWs = _objectSpread$B({}, workspace);
28643
- if (Array.isArray(workspace.layout)) {
28644
- updatedWs.layout = cloneList(workspace.layout);
28645
- }
28646
- if (Array.isArray(workspace.pages)) {
28647
- updatedWs.pages = workspace.pages.map(function (page) {
28648
- return _objectSpread$B(_objectSpread$B({}, page), {}, {
28649
- layout: cloneList(page.layout)
28650
- });
28651
- });
28652
- }
28653
- if (Array.isArray(workspace.sidebarLayout)) {
28654
- updatedWs.sidebarLayout = cloneList(workspace.sidebarLayout);
28655
- }
28656
- return updatedWs;
28657
- }
28658
- function applyToItem(listeners, _ref2) {
28659
- var adds = _ref2.adds,
28660
- removes = _ref2.removes;
28661
- // Deep enough clone for handler arrays.
28662
- var next = {};
28663
- for (var _i3 = 0, _Object$entries2 = Object.entries(listeners); _i3 < _Object$entries2.length; _i3++) {
28664
- var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i3], 2),
28665
- k = _Object$entries2$_i[0],
28666
- v = _Object$entries2$_i[1];
28667
- next[k] = Array.isArray(v) ? _toConsumableArray(v) : v;
28668
- }
28669
-
28670
- // Removes first so a re-add (rare) lands.
28671
- var _iterator0 = _createForOfIteratorHelper$i(removes),
28672
- _step0;
28673
- try {
28674
- var _loop = function _loop() {
28675
- var r = _step0.value;
28676
- var target = r.handlerName;
28677
- if (!target) return 0; // continue
28678
- var events = next[target];
28679
- if (!Array.isArray(events)) return 0; // continue
28680
- var eventStr = r.raw || formatEventString(r.sourceComponent, r.sourceItemId, r.eventName);
28681
- var filtered = events.filter(function (e) {
28682
- return e !== eventStr;
28683
- });
28684
- if (filtered.length === 0) {
28685
- delete next[target];
28686
- } else {
28687
- next[target] = filtered;
28688
- }
28689
- },
28690
- _ret;
28691
- for (_iterator0.s(); !(_step0 = _iterator0.n()).done;) {
28692
- _ret = _loop();
28693
- if (_ret === 0) continue;
28694
- }
28695
- } catch (err) {
28696
- _iterator0.e(err);
28697
- } finally {
28698
- _iterator0.f();
28699
- }
28700
- var _iterator1 = _createForOfIteratorHelper$i(adds),
28701
- _step1;
28702
- try {
28703
- for (_iterator1.s(); !(_step1 = _iterator1.n()).done;) {
28704
- var a = _step1.value;
28705
- var target = a.handlerName;
28706
- if (!target) continue;
28707
- var eventStr = formatEventString(a.sourceComponent, a.sourceItemId, a.eventName);
28708
- var existing = Array.isArray(next[target]) ? next[target] : [];
28709
- if (existing.includes(eventStr)) continue;
28710
- next[target] = [].concat(_toConsumableArray(existing), [eventStr]);
28823
+ _iterator2.f();
28711
28824
  }
28712
- } catch (err) {
28713
- _iterator1.e(err);
28714
- } finally {
28715
- _iterator1.f();
28716
28825
  }
28717
- return next;
28826
+ _walk(workspace.sidebarLayout);
28827
+ return counts;
28718
28828
  }
28719
28829
 
28720
28830
  /**
@@ -28853,14 +28963,21 @@ var WorkspaceModel = function WorkspaceModel(workspaceItem) {
28853
28963
  workspace.selectedProviders = "selectedProviders" in obj ? obj["selectedProviders"] : {};
28854
28964
  workspace.themeKey = "themeKey" in obj ? obj["themeKey"] : null;
28855
28965
 
28966
+ // Migrate legacy bare component refs (`PipelineKanban`) and the
28967
+ // listener event strings that reference them (`PipelineKanban[5].evt`)
28968
+ // to the canonical scoped form (`trops.pipeline.PipelineKanban`).
28969
+ // Runs BEFORE pruneDeadListenerReferences — without this, prune
28970
+ // sees bare listener strings vs scoped layout items, treats every
28971
+ // legacy listener as an orphan, and silently deletes the user's
28972
+ // wiring on first load post-v0.1.435.
28973
+ migrateScopedIdsInWorkspace(workspace, ComponentManager.componentMap());
28974
+
28856
28975
  // Strip any listener bindings whose source widget is no longer in
28857
28976
  // the tree. These "orphan" bindings are dead — they don't match any
28858
28977
  // live publisher and never fire — so they're safe to remove at load
28859
- // time before the renderer wires up subscriptions. Keeps stored
28860
- // workspaces self-consistent without the user having to do anything.
28978
+ // time before the renderer wires up subscriptions.
28861
28979
  pruneDeadListenerReferences(workspace);
28862
28980
  return sanitizeWorkspaceObject(workspace);
28863
- // return workspace;
28864
28981
  };
28865
28982
 
28866
28983
  /**
@@ -55101,21 +55218,53 @@ function _arrayLikeToArray$5(r, a) { (null == a || a > r.length) && (a = r.lengt
55101
55218
  var ALL_WIDGETS_ID = "__ALL__";
55102
55219
 
55103
55220
  /**
55104
- * Build the scoped registry identifier for a widget. Surfaces the
55105
- * `scope.packageName.component` triple in the settings UI so users
55106
- * can verify what a widget's registry identity is useful when
55107
- * diagnosing dashboard-install warnings ("why didn't this widget
55108
- * install?" → scoped id in the warning vs scoped id shown here).
55109
- * Returns just the component name when scope/package metadata is
55110
- * unavailable (e.g. bare built-ins).
55221
+ * Pick the most user-friendly display name for a widget instance.
55222
+ * Priority: per-instance user title widget's default title → widget
55223
+ * developer's friendly displayName widget config name the bare
55224
+ * component name (last segment of the scoped id) → the full scoped
55225
+ * id (last resort, never preferred but always present).
55226
+ *
55227
+ * This is what shows on the primary line of the WidgetsTab list and
55228
+ * detail header. The full scoped registry id (`scope.package.X`) is
55229
+ * surfaced separately via `pickWidgetRef` below, so the user sees
55230
+ * BOTH a friendly name and an unambiguous reference.
55231
+ */
55232
+ function pickDisplayName(item, cfg) {
55233
+ var _item$userPrefs, _item$userConfig;
55234
+ var prefsTitle = item === null || item === void 0 || (_item$userPrefs = item.userPrefs) === null || _item$userPrefs === void 0 ? void 0 : _item$userPrefs.title;
55235
+ if (typeof prefsTitle === "string" && prefsTitle.trim()) return prefsTitle;
55236
+ var configDefault = item === null || item === void 0 || (_item$userConfig = item.userConfig) === null || _item$userConfig === void 0 || (_item$userConfig = _item$userConfig.title) === null || _item$userConfig === void 0 ? void 0 : _item$userConfig.defaultValue;
55237
+ if (typeof configDefault === "string" && configDefault.trim()) {
55238
+ return configDefault;
55239
+ }
55240
+ if (cfg !== null && cfg !== void 0 && cfg.displayName) return cfg.displayName;
55241
+ if (cfg !== null && cfg !== void 0 && cfg.name) return cfg.name;
55242
+ var bare = bareComponentName(item === null || item === void 0 ? void 0 : item.component);
55243
+ if (bare) return bare;
55244
+ return (item === null || item === void 0 ? void 0 : item.component) || "Widget";
55245
+ }
55246
+
55247
+ /**
55248
+ * Format the full scoped registry id (`scope.package.Component`) for
55249
+ * the subtitle. The friendly display name on line 1 may be a custom
55250
+ * per-instance title that doesn't reveal which widget is actually
55251
+ * mounted — the subtitle pins down the underlying widget identity so
55252
+ * the user can always see "this 'Q4 Pipeline' is actually a
55253
+ * `trops.pipeline.SalesPipeline`".
55254
+ *
55255
+ * Falls back to the cfg fields when the layout item is non-canonical
55256
+ * (legacy bare names that LayoutModel couldn't migrate). Returns
55257
+ * null when even those are missing — caller hides the subtitle.
55111
55258
  */
55112
- function buildScopedId(widget) {
55113
- if (!(widget !== null && widget !== void 0 && widget.component)) return null;
55114
- var scope = widget.scope ? String(widget.scope).replace(/^@/, "") : null;
55115
- var pkg = widget.packageName ? scope ? String(widget.packageName).replace(new RegExp("^@?".concat(scope, "/")), "") : String(widget.packageName).replace(/^@/, "") : null;
55116
- if (scope && pkg) return "".concat(scope, ".").concat(pkg, ".").concat(widget.component);
55117
- if (pkg) return "".concat(pkg, ".").concat(widget.component);
55118
- return widget.component;
55259
+ function pickWidgetRef(item, cfg) {
55260
+ if (parseScopedComponentId(item === null || item === void 0 ? void 0 : item.component)) return item.component;
55261
+ var scope = (cfg === null || cfg === void 0 ? void 0 : cfg.scope) || (item === null || item === void 0 ? void 0 : item.scope);
55262
+ var pkg = (cfg === null || cfg === void 0 ? void 0 : cfg.packageName) || (item === null || item === void 0 ? void 0 : item.packageName);
55263
+ var comp = bareComponentName(item === null || item === void 0 ? void 0 : item.component) || (cfg === null || cfg === void 0 ? void 0 : cfg.name);
55264
+ if (!scope || !pkg || !comp) return (item === null || item === void 0 ? void 0 : item.component) || null;
55265
+ var bareScope = String(scope).replace(/^@/, "");
55266
+ var barePkg = String(pkg).replace(new RegExp("^@?".concat(bareScope, "/")), "");
55267
+ return "".concat(bareScope, ".").concat(barePkg, ".").concat(comp);
55119
55268
  }
55120
55269
 
55121
55270
  /**
@@ -55162,13 +55311,11 @@ var WidgetsTab = function WidgetsTab(_ref) {
55162
55311
  result.push({
55163
55312
  id: id,
55164
55313
  component: item.component,
55165
- displayName: item.name || cfg.name || cfg.displayName || item.component,
55314
+ displayName: pickDisplayName(item, cfg),
55315
+ widgetRef: pickWidgetRef(item, cfg),
55166
55316
  section: section,
55167
55317
  userConfig: cfg.userConfig || {},
55168
55318
  userPrefs: item.userPrefs || {},
55169
- // Identity fields for the registry-identifier label. Prefer
55170
- // values from the widget's component manager entry since the
55171
- // layout item itself often doesn't carry scope/packageName.
55172
55319
  scope: cfg.scope || item.scope || null,
55173
55320
  packageName: cfg.packageName || cfg.name || item.packageName || null
55174
55321
  });
@@ -55306,6 +55453,10 @@ var WidgetsTab = function WidgetsTab(_ref) {
55306
55453
  className: "text-[10px] bg-amber-500/20 text-amber-300 px-1.5 rounded",
55307
55454
  children: stagedForWidget
55308
55455
  })]
55456
+ }), w.widgetRef && /*#__PURE__*/jsx("div", {
55457
+ className: "text-[10px] text-gray-500 font-mono truncate mt-0.5",
55458
+ title: w.widgetRef,
55459
+ children: w.widgetRef
55309
55460
  }), /*#__PURE__*/jsx("div", {
55310
55461
  className: "text-[10px] text-gray-600 mt-0.5",
55311
55462
  children: fieldCount === 0 ? "No configurable fields" : "".concat(fieldCount, " field").concat(fieldCount === 1 ? "" : "s")
@@ -55338,20 +55489,19 @@ function SingleWidgetPane(_ref4) {
55338
55489
  effectivePrefs = _ref4.effectivePrefs,
55339
55490
  onFieldChange = _ref4.onFieldChange;
55340
55491
  var hasFields = Object.keys(widget.userConfig).length > 0;
55341
- var scopedId = buildScopedId(widget);
55342
55492
  return /*#__PURE__*/jsxs("div", {
55343
55493
  children: [/*#__PURE__*/jsxs("div", {
55344
55494
  className: "mb-3",
55345
55495
  children: [/*#__PURE__*/jsx("div", {
55346
55496
  className: "text-gray-200 font-semibold",
55347
55497
  children: widget.displayName
55348
- }), /*#__PURE__*/jsxs("div", {
55349
- className: "text-xs text-gray-500",
55350
- children: [widget.component, " \xB7 ", widget.section]
55351
- }), scopedId && scopedId !== widget.component && /*#__PURE__*/jsx("code", {
55352
- className: "block mt-1 text-[11px] text-gray-500 font-mono truncate",
55353
- title: scopedId,
55354
- children: scopedId
55498
+ }), widget.widgetRef && /*#__PURE__*/jsx("div", {
55499
+ className: "text-xs text-gray-500 font-mono truncate mt-0.5",
55500
+ title: widget.widgetRef,
55501
+ children: widget.widgetRef
55502
+ }), /*#__PURE__*/jsx("div", {
55503
+ className: "text-xs text-gray-600 mt-0.5",
55504
+ children: widget.section
55355
55505
  })]
55356
55506
  }), hasFields ? /*#__PURE__*/jsx(PanelEditForm, {
55357
55507
  userConfig: widget.userConfig,
@@ -55597,11 +55747,11 @@ var DashboardConfigModal = function DashboardConfigModal(_ref) {
55597
55747
  var derivePackage = function derivePackage(item) {
55598
55748
  var scopedId = typeof (item === null || item === void 0 ? void 0 : item.component) === "string" ? item.component : "";
55599
55749
  var parts = scopedId.split(".");
55600
- if (parts.length === 3) {
55601
- var _parts = _slicedToArray(parts, 2),
55602
- scope = _parts[0],
55603
- pkg = _parts[1];
55604
- if (scope && pkg) return "@".concat(scope, "/").concat(pkg);
55750
+ if (parts.length === 3 && parts[0] && parts[1]) {
55751
+ // Group rows by `@scope/package` so two widgets from the same
55752
+ // package show up under one heading. The full scoped id is
55753
+ // surfaced per-row in the table (column-level identity).
55754
+ return "@".concat(parts[0], "/").concat(parts[1]);
55605
55755
  }
55606
55756
  // Defensive: an explicit packageId on the item still wins for
55607
55757
  // legacy items the migration couldn't auto-resolve.