@trops/dash-core 0.1.54 → 0.1.56

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
@@ -672,6 +672,8 @@ var MCP_SERVER_STATUS_COMPLETE = "mcp:server-status:complete";
672
672
  var MCP_SERVER_STATUS_ERROR = "mcp:server-status:error";
673
673
  var MCP_GET_CATALOG_COMPLETE = "mcp:get-catalog:complete";
674
674
  var MCP_GET_CATALOG_ERROR = "mcp:get-catalog:error";
675
+ var MCP_RUN_AUTH_COMPLETE = "mcp:run-auth:complete";
676
+ var MCP_RUN_AUTH_ERROR = "mcp:run-auth:error";
675
677
 
676
678
  var DATA_JSON_TO_CSV_FILE = "data-json-to-csv-file";
677
679
  var DATA_JSON_TO_CSV_FILE_COMPLETE = "data-json-to-csv-file-complete";
@@ -780,6 +782,8 @@ var apiEvents = /*#__PURE__*/Object.freeze({
780
782
  MCP_LIST_TOOLS_ERROR: MCP_LIST_TOOLS_ERROR,
781
783
  MCP_READ_RESOURCE_COMPLETE: MCP_READ_RESOURCE_COMPLETE,
782
784
  MCP_READ_RESOURCE_ERROR: MCP_READ_RESOURCE_ERROR,
785
+ MCP_RUN_AUTH_COMPLETE: MCP_RUN_AUTH_COMPLETE,
786
+ MCP_RUN_AUTH_ERROR: MCP_RUN_AUTH_ERROR,
783
787
  MCP_SERVER_STATUS_COMPLETE: MCP_SERVER_STATUS_COMPLETE,
784
788
  MCP_SERVER_STATUS_ERROR: MCP_SERVER_STATUS_ERROR,
785
789
  MCP_START_SERVER_COMPLETE: MCP_START_SERVER_COMPLETE,
@@ -1478,6 +1482,27 @@ var ElectronDashboardApi = /*#__PURE__*/function () {
1478
1482
  return false;
1479
1483
  }
1480
1484
  }
1485
+ }, {
1486
+ key: "mcpRunAuth",
1487
+ value: function mcpRunAuth(mcpConfig, credentials, authCommand, onSuccess, onError) {
1488
+ var _this26 = this;
1489
+ if (this.api !== null) {
1490
+ try {
1491
+ this.api.mcp.runAuth(mcpConfig, credentials, authCommand).then(function (result) {
1492
+ onSuccess(_this26.events.MCP_RUN_AUTH_COMPLETE, result);
1493
+ })["catch"](function (error) {
1494
+ onError(_this26.events.MCP_RUN_AUTH_ERROR, error);
1495
+ });
1496
+ return true;
1497
+ } catch (e) {
1498
+ onError(this.events.MCP_RUN_AUTH_ERROR, e);
1499
+ return false;
1500
+ }
1501
+ } else {
1502
+ onError(this.events.MCP_RUN_AUTH_ERROR, new Error("No Api found"));
1503
+ return false;
1504
+ }
1505
+ }
1481
1506
  }]);
1482
1507
  }();
1483
1508
 
@@ -25849,7 +25874,7 @@ var FoldersSection = function FoldersSection(_ref) {
25849
25874
  function ownKeys$6(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25850
25875
  function _objectSpread$6(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$6(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$6(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25851
25876
  var ProviderDetail = function ProviderDetail(_ref) {
25852
- var _testResult$tools;
25877
+ var _provider$mcpConfig, _testResult$tools;
25853
25878
  var _ref$providerName = _ref.providerName,
25854
25879
  providerName = _ref$providerName === void 0 ? null : _ref$providerName,
25855
25880
  _ref$provider = _ref.provider,
@@ -25871,7 +25896,9 @@ var ProviderDetail = function ProviderDetail(_ref) {
25871
25896
  onCancelEdit = _ref.onCancelEdit,
25872
25897
  onStartEdit = _ref.onStartEdit,
25873
25898
  onCreate = _ref.onCreate,
25874
- onDelete = _ref.onDelete;
25899
+ onDelete = _ref.onDelete,
25900
+ _ref$catalogAuthComma = _ref.catalogAuthCommand,
25901
+ catalogAuthCommand = _ref$catalogAuthComma === void 0 ? null : _ref$catalogAuthComma;
25875
25902
  var appContext = useContext(AppContext);
25876
25903
  var dashApi = appContext === null || appContext === void 0 ? void 0 : appContext.dashApi;
25877
25904
  var isMcp = (provider === null || provider === void 0 ? void 0 : provider.providerClass) === "mcp";
@@ -25886,6 +25913,19 @@ var ProviderDetail = function ProviderDetail(_ref) {
25886
25913
  testResult = _useState4[0],
25887
25914
  setTestResult = _useState4[1];
25888
25915
 
25916
+ // MCP auth state
25917
+ var _useState5 = useState(false),
25918
+ _useState6 = _slicedToArray(_useState5, 2),
25919
+ isAuthorizing = _useState6[0],
25920
+ setIsAuthorizing = _useState6[1];
25921
+ var _useState7 = useState(null),
25922
+ _useState8 = _slicedToArray(_useState7, 2),
25923
+ authResult = _useState8[0],
25924
+ setAuthResult = _useState8[1];
25925
+
25926
+ // Resolve authCommand: provider.mcpConfig.authCommand > catalogAuthCommand prop
25927
+ var resolvedAuthCommand = (provider === null || provider === void 0 || (_provider$mcpConfig = provider.mcpConfig) === null || _provider$mcpConfig === void 0 ? void 0 : _provider$mcpConfig.authCommand) || catalogAuthCommand || null;
25928
+
25889
25929
  // Derive credential fields for MCP providers in edit mode
25890
25930
  var mcpFormFields = useMemo(function () {
25891
25931
  if (!isMcp || !(provider !== null && provider !== void 0 && provider.mcpConfig)) return [];
@@ -25899,14 +25939,14 @@ var ProviderDetail = function ProviderDetail(_ref) {
25899
25939
  }, [isMcp, provider]);
25900
25940
 
25901
25941
  // Dynamic credential fields for create mode
25902
- var _useState5 = useState(isCreating ? [{
25942
+ var _useState9 = useState(isCreating ? [{
25903
25943
  id: "default_apiKey",
25904
25944
  key: "apiKey",
25905
25945
  secret: true
25906
25946
  }] : []),
25907
- _useState6 = _slicedToArray(_useState5, 2),
25908
- credentialFields = _useState6[0],
25909
- setCredentialFields = _useState6[1];
25947
+ _useState0 = _slicedToArray(_useState9, 2),
25948
+ credentialFields = _useState0[0],
25949
+ setCredentialFields = _useState0[1];
25910
25950
  var fieldIdRef = useRef(0);
25911
25951
  var handleFieldKeyChange = function handleFieldKeyChange(id, newKey) {
25912
25952
  setCredentialFields(function (prev) {
@@ -26009,6 +26049,31 @@ var ProviderDetail = function ProviderDetail(_ref) {
26009
26049
  setIsTesting(false);
26010
26050
  });
26011
26051
  };
26052
+ var handleAuthorize = function handleAuthorize() {
26053
+ if (!dashApi || !(provider !== null && provider !== void 0 && provider.mcpConfig) || !resolvedAuthCommand) return;
26054
+ setIsAuthorizing(true);
26055
+ setAuthResult(null);
26056
+ dashApi.mcpRunAuth(provider.mcpConfig, provider.credentials, resolvedAuthCommand, function (event, result) {
26057
+ if (result.error) {
26058
+ setAuthResult({
26059
+ success: false,
26060
+ message: result.message
26061
+ });
26062
+ } else {
26063
+ setAuthResult({
26064
+ success: true,
26065
+ message: "Authorized!"
26066
+ });
26067
+ }
26068
+ setIsAuthorizing(false);
26069
+ }, function (event, err) {
26070
+ setAuthResult({
26071
+ success: false,
26072
+ message: (err === null || err === void 0 ? void 0 : err.message) || "Authorization failed"
26073
+ });
26074
+ setIsAuthorizing(false);
26075
+ });
26076
+ };
26012
26077
  var isFormMode = isEditing || isCreating;
26013
26078
 
26014
26079
  // ── MCP config info block (shared between read-only view and edit form) ──
@@ -26062,7 +26127,7 @@ var ProviderDetail = function ProviderDetail(_ref) {
26062
26127
 
26063
26128
  // ── Edit / Create form ──
26064
26129
  if (isFormMode) {
26065
- var _provider$mcpConfig;
26130
+ var _provider$mcpConfig2;
26066
26131
  return /*#__PURE__*/jsxs("div", {
26067
26132
  className: "flex flex-col flex-1 min-h-0",
26068
26133
  children: [/*#__PURE__*/jsxs("div", {
@@ -26159,7 +26224,7 @@ var ProviderDetail = function ProviderDetail(_ref) {
26159
26224
  className: "border-t border-white/10 pt-4",
26160
26225
  children: /*#__PURE__*/jsx("p", {
26161
26226
  className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26162
- children: ((_provider$mcpConfig = provider.mcpConfig) === null || _provider$mcpConfig === void 0 ? void 0 : _provider$mcpConfig.transport) === "streamable_http" ? "Server Configuration" : "Authentication"
26227
+ children: ((_provider$mcpConfig2 = provider.mcpConfig) === null || _provider$mcpConfig2 === void 0 ? void 0 : _provider$mcpConfig2.transport) === "streamable_http" ? "Server Configuration" : "Authentication"
26163
26228
  })
26164
26229
  }), mcpFormFields.map(function (field) {
26165
26230
  return /*#__PURE__*/jsxs("div", {
@@ -26170,13 +26235,38 @@ var ProviderDetail = function ProviderDetail(_ref) {
26170
26235
  }), field.instructions && /*#__PURE__*/jsx("p", {
26171
26236
  className: "text-sm opacity-50",
26172
26237
  children: field.instructions
26173
- }), /*#__PURE__*/jsx(InputText, {
26174
- type: field.secret ? "password" : "text",
26175
- value: formCredentials[field.key] || "",
26176
- onChange: function onChange(value) {
26177
- return handleCredentialChange(field.key, value);
26178
- },
26179
- placeholder: "Enter ".concat(field.displayName.toLowerCase())
26238
+ }), /*#__PURE__*/jsxs("div", {
26239
+ className: "flex gap-2",
26240
+ children: [/*#__PURE__*/jsx("div", {
26241
+ className: "flex-1",
26242
+ children: /*#__PURE__*/jsx(InputText, {
26243
+ type: field.secret ? "password" : "text",
26244
+ value: formCredentials[field.key] || "",
26245
+ onChange: function onChange(value) {
26246
+ return handleCredentialChange(field.key, value);
26247
+ },
26248
+ placeholder: field.type === "file" ? "Select a file..." : "Enter ".concat(field.displayName.toLowerCase())
26249
+ })
26250
+ }), field.type === "file" && /*#__PURE__*/jsx("button", {
26251
+ onClick: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
26252
+ var filepath;
26253
+ return _regeneratorRuntime.wrap(function (_context) {
26254
+ while (1) switch (_context.prev = _context.next) {
26255
+ case 0:
26256
+ _context.next = 1;
26257
+ return window.mainApi.dialog.chooseFile(true, ["json"]);
26258
+ case 1:
26259
+ filepath = _context.sent;
26260
+ if (filepath) handleCredentialChange(field.key, filepath);
26261
+ case 2:
26262
+ case "end":
26263
+ return _context.stop();
26264
+ }
26265
+ }, _callee);
26266
+ })),
26267
+ className: "px-3 py-1.5 text-sm rounded bg-white/10 hover:bg-white/20 transition-colors",
26268
+ children: "Browse"
26269
+ })]
26180
26270
  })]
26181
26271
  }, field.key);
26182
26272
  })]
@@ -26296,6 +26386,16 @@ var ProviderDetail = function ProviderDetail(_ref) {
26296
26386
  })]
26297
26387
  })]
26298
26388
  })]
26389
+ }), authResult && /*#__PURE__*/jsx("div", {
26390
+ className: "p-3 rounded-lg text-sm ".concat(authResult.success ? "bg-green-900/30 border border-green-700 text-green-300" : "bg-red-900/30 border border-red-700 text-red-300"),
26391
+ children: /*#__PURE__*/jsxs("div", {
26392
+ className: "flex items-center gap-2",
26393
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
26394
+ icon: authResult.success ? "circle-check" : "circle-exclamation"
26395
+ }), /*#__PURE__*/jsx("span", {
26396
+ children: authResult.message
26397
+ })]
26398
+ })
26299
26399
  }), testResult && /*#__PURE__*/jsxs("div", {
26300
26400
  className: "p-3 rounded-lg text-sm ".concat(testResult.success ? "bg-green-900/30 border border-green-700 text-green-300" : "bg-red-900/30 border border-red-700 text-red-300"),
26301
26401
  children: [/*#__PURE__*/jsxs("div", {
@@ -26324,7 +26424,11 @@ var ProviderDetail = function ProviderDetail(_ref) {
26324
26424
  })]
26325
26425
  }), /*#__PURE__*/jsxs("div", {
26326
26426
  className: "flex-shrink-0 flex flex-row justify-end gap-2 px-6 py-4 border-t border-white/10",
26327
- children: [isMcp && /*#__PURE__*/jsx(Button, {
26427
+ children: [isMcp && resolvedAuthCommand && /*#__PURE__*/jsx(Button, {
26428
+ title: isAuthorizing ? "Authorizing..." : "Authorize",
26429
+ onClick: handleAuthorize,
26430
+ size: "sm"
26431
+ }), isMcp && /*#__PURE__*/jsx(Button, {
26328
26432
  title: isTesting ? "Testing..." : "Test Connection",
26329
26433
  onClick: handleTestConnection,
26330
26434
  size: "sm"
@@ -27055,13 +27159,38 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
27055
27159
  children: [/*#__PURE__*/jsx(FormLabel, {
27056
27160
  label: field.displayName,
27057
27161
  required: field.required
27058
- }), /*#__PURE__*/jsx(InputText, {
27059
- type: field.secret ? "password" : "text",
27060
- value: credentialData[field.key] || "",
27061
- onChange: function onChange(value) {
27062
- return handleCredentialChange(field.key, value);
27063
- },
27064
- placeholder: "Enter ".concat(field.displayName.toLowerCase())
27162
+ }), /*#__PURE__*/jsxs("div", {
27163
+ className: "flex gap-2",
27164
+ children: [/*#__PURE__*/jsx("div", {
27165
+ className: "flex-1",
27166
+ children: /*#__PURE__*/jsx(InputText, {
27167
+ type: field.secret ? "password" : "text",
27168
+ value: credentialData[field.key] || "",
27169
+ onChange: function onChange(value) {
27170
+ return handleCredentialChange(field.key, value);
27171
+ },
27172
+ placeholder: field.type === "file" ? "Select a file..." : "Enter ".concat(field.displayName.toLowerCase())
27173
+ })
27174
+ }), field.type === "file" && /*#__PURE__*/jsx("button", {
27175
+ onClick: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
27176
+ var filepath;
27177
+ return _regeneratorRuntime.wrap(function (_context) {
27178
+ while (1) switch (_context.prev = _context.next) {
27179
+ case 0:
27180
+ _context.next = 1;
27181
+ return window.mainApi.dialog.chooseFile(true, ["json"]);
27182
+ case 1:
27183
+ filepath = _context.sent;
27184
+ if (filepath) handleCredentialChange(field.key, filepath);
27185
+ case 2:
27186
+ case "end":
27187
+ return _context.stop();
27188
+ }
27189
+ }, _callee);
27190
+ })),
27191
+ className: "px-3 py-1.5 text-sm rounded bg-white/10 hover:bg-white/20 transition-colors",
27192
+ children: "Browse"
27193
+ })]
27065
27194
  }), formErrors[field.key] && /*#__PURE__*/jsx("p", {
27066
27195
  className: "text-sm text-red-400",
27067
27196
  children: formErrors[field.key]
@@ -27496,13 +27625,38 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27496
27625
  }), field.instructions && /*#__PURE__*/jsx("p", {
27497
27626
  className: "text-sm opacity-50",
27498
27627
  children: field.instructions
27499
- }), /*#__PURE__*/jsx(InputText, {
27500
- type: field.secret ? "password" : "text",
27501
- value: credentialData[field.key] || "",
27502
- onChange: function onChange(value) {
27503
- return handleCredentialChange(field.key, value);
27504
- },
27505
- placeholder: "Enter ".concat(field.displayName.toLowerCase())
27628
+ }), /*#__PURE__*/jsxs("div", {
27629
+ className: "flex gap-2",
27630
+ children: [/*#__PURE__*/jsx("div", {
27631
+ className: "flex-1",
27632
+ children: /*#__PURE__*/jsx(InputText, {
27633
+ type: field.secret ? "password" : "text",
27634
+ value: credentialData[field.key] || "",
27635
+ onChange: function onChange(value) {
27636
+ return handleCredentialChange(field.key, value);
27637
+ },
27638
+ placeholder: field.type === "file" ? "Select a file..." : "Enter ".concat(field.displayName.toLowerCase())
27639
+ })
27640
+ }), field.type === "file" && /*#__PURE__*/jsx("button", {
27641
+ onClick: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
27642
+ var filepath;
27643
+ return _regeneratorRuntime.wrap(function (_context) {
27644
+ while (1) switch (_context.prev = _context.next) {
27645
+ case 0:
27646
+ _context.next = 1;
27647
+ return window.mainApi.dialog.chooseFile(true, ["json"]);
27648
+ case 1:
27649
+ filepath = _context.sent;
27650
+ if (filepath) handleCredentialChange(field.key, filepath);
27651
+ case 2:
27652
+ case "end":
27653
+ return _context.stop();
27654
+ }
27655
+ }, _callee);
27656
+ })),
27657
+ className: "px-3 py-1.5 text-sm rounded bg-white/10 hover:bg-white/20 transition-colors",
27658
+ children: "Browse"
27659
+ })]
27506
27660
  }), formErrors[field.key] && /*#__PURE__*/jsx("p", {
27507
27661
  className: "text-sm text-red-400",
27508
27662
  children: formErrors[field.key]
@@ -27641,42 +27795,58 @@ var ProvidersSection = function ProvidersSection(_ref) {
27641
27795
  var appContext = useContext(AppContext);
27642
27796
  var providers = (appContext === null || appContext === void 0 ? void 0 : appContext.providers) || {};
27643
27797
  var refreshProviders = appContext === null || appContext === void 0 ? void 0 : appContext.refreshProviders;
27644
- var _useState = useState(null),
27798
+
27799
+ // Load MCP catalog for authCommand lookups
27800
+ var _useState = useState([]),
27645
27801
  _useState2 = _slicedToArray(_useState, 2),
27646
- selectedName = _useState2[0],
27647
- setSelectedName = _useState2[1];
27648
- var _useState3 = useState(false),
27802
+ catalog = _useState2[0],
27803
+ setCatalog = _useState2[1];
27804
+ useEffect(function () {
27805
+ if (!dashApi) return;
27806
+ dashApi.mcpGetCatalog(function (event, result) {
27807
+ if (result !== null && result !== void 0 && result.catalog) setCatalog(result.catalog);
27808
+ }, function () {});
27809
+ }, [dashApi]);
27810
+ var _useState3 = useState("credentials"),
27649
27811
  _useState4 = _slicedToArray(_useState3, 2),
27650
- isCreating = _useState4[0],
27651
- setIsCreating = _useState4[1];
27652
- var _useState5 = useState(false),
27812
+ providerTab = _useState4[0],
27813
+ setProviderTab = _useState4[1];
27814
+ var _useState5 = useState(null),
27653
27815
  _useState6 = _slicedToArray(_useState5, 2),
27654
- isEditing = _useState6[0],
27655
- setIsEditing = _useState6[1];
27656
- var _useState7 = useState(""),
27816
+ selectedName = _useState6[0],
27817
+ setSelectedName = _useState6[1];
27818
+ var _useState7 = useState(false),
27657
27819
  _useState8 = _slicedToArray(_useState7, 2),
27658
- formName = _useState8[0],
27659
- setFormName = _useState8[1];
27660
- var _useState9 = useState(""),
27820
+ isCreating = _useState8[0],
27821
+ setIsCreating = _useState8[1];
27822
+ var _useState9 = useState(false),
27661
27823
  _useState0 = _slicedToArray(_useState9, 2),
27662
- formType = _useState0[0],
27663
- setFormType = _useState0[1];
27664
- var _useState1 = useState({}),
27824
+ isEditing = _useState0[0],
27825
+ setIsEditing = _useState0[1];
27826
+ var _useState1 = useState(""),
27665
27827
  _useState10 = _slicedToArray(_useState1, 2),
27666
- formCredentials = _useState10[0],
27667
- setFormCredentials = _useState10[1];
27668
- var _useState11 = useState(null),
27828
+ formName = _useState10[0],
27829
+ setFormName = _useState10[1];
27830
+ var _useState11 = useState(""),
27669
27831
  _useState12 = _slicedToArray(_useState11, 2),
27670
- deleteTarget = _useState12[0],
27671
- setDeleteTarget = _useState12[1];
27672
- var _useState13 = useState(false),
27832
+ formType = _useState12[0],
27833
+ setFormType = _useState12[1];
27834
+ var _useState13 = useState({}),
27673
27835
  _useState14 = _slicedToArray(_useState13, 2),
27674
- isAddingMcp = _useState14[0],
27675
- setIsAddingMcp = _useState14[1];
27676
- var _useState15 = useState(false),
27836
+ formCredentials = _useState14[0],
27837
+ setFormCredentials = _useState14[1];
27838
+ var _useState15 = useState(null),
27677
27839
  _useState16 = _slicedToArray(_useState15, 2),
27678
- isEditingMcp = _useState16[0],
27679
- setIsEditingMcp = _useState16[1];
27840
+ deleteTarget = _useState16[0],
27841
+ setDeleteTarget = _useState16[1];
27842
+ var _useState17 = useState(false),
27843
+ _useState18 = _slicedToArray(_useState17, 2),
27844
+ isAddingMcp = _useState18[0],
27845
+ setIsAddingMcp = _useState18[1];
27846
+ var _useState19 = useState(false),
27847
+ _useState20 = _slicedToArray(_useState19, 2),
27848
+ isEditingMcp = _useState20[0],
27849
+ setIsEditingMcp = _useState20[1];
27680
27850
 
27681
27851
  // Row ID counter for env/header rows in MCP edit mode
27682
27852
  var nextRowIdRef = useRef(0);
@@ -27719,6 +27889,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27719
27889
  credentials: credentials
27720
27890
  }, function () {
27721
27891
  resetForm();
27892
+ setProviderTab("credentials");
27722
27893
  refreshProviders && refreshProviders();
27723
27894
  }, function (e, err) {
27724
27895
  return (void 0);
@@ -27727,6 +27898,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27727
27898
  function handleStartEdit(name, provider) {
27728
27899
  setSelectedName(name);
27729
27900
  setIsCreating(false);
27901
+ setProviderTab(provider.providerClass === "mcp" ? "mcp" : "credentials");
27730
27902
  if (provider.providerClass === "mcp") {
27731
27903
  setIsEditingMcp(true);
27732
27904
  setIsEditing(false);
@@ -27791,6 +27963,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27791
27963
  setIsAddingMcp(false);
27792
27964
  refreshProviders && refreshProviders();
27793
27965
  setSelectedName(providerName);
27966
+ setProviderTab("mcp");
27794
27967
  }, function (e, err) {
27795
27968
  return (void 0);
27796
27969
  });
@@ -27812,6 +27985,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27812
27985
  mcpConfig: mcpConfig
27813
27986
  }, function () {
27814
27987
  setSelectedName(providerName);
27988
+ setProviderTab("mcp");
27815
27989
  setIsEditingMcp(false);
27816
27990
  resetForm();
27817
27991
  refreshProviders && refreshProviders();
@@ -27836,19 +28010,39 @@ var ProvidersSection = function ProvidersSection(_ref) {
27836
28010
  // eslint-disable-next-line react-hooks/exhaustive-deps
27837
28011
  }, [createRequested]);
27838
28012
  var selectedProvider = selectedName && providers[selectedName] ? providers[selectedName] : null;
27839
- var listContent = /*#__PURE__*/jsxs(Sidebar.Content, {
27840
- children: [credentialProviders.length > 0 && /*#__PURE__*/jsxs(Fragment, {
27841
- children: [/*#__PURE__*/jsx("div", {
27842
- className: "px-3 py-2 text-xs font-semibold opacity-40 uppercase tracking-wider",
27843
- children: "API Credentials"
27844
- }), credentialProviders.map(function (_ref8) {
28013
+ var activeProviders = providerTab === "credentials" ? credentialProviders : mcpProviders;
28014
+ var activeIcon = providerTab === "credentials" ? "key" : "server";
28015
+ var listContent = /*#__PURE__*/jsxs(Fragment, {
28016
+ children: [/*#__PURE__*/jsx("div", {
28017
+ className: "px-2 pt-2",
28018
+ children: /*#__PURE__*/jsx(Tabs3, {
28019
+ value: providerTab,
28020
+ onValueChange: setProviderTab,
28021
+ backgroundColor: "bg-transparent",
28022
+ spacing: "p-0",
28023
+ children: /*#__PURE__*/jsxs(Tabs3.List, {
28024
+ className: "w-full flex",
28025
+ spacing: "p-0.5",
28026
+ children: [/*#__PURE__*/jsx(Tabs3.Trigger, {
28027
+ value: "credentials",
28028
+ className: "flex-1",
28029
+ children: "API Credentials"
28030
+ }), /*#__PURE__*/jsx(Tabs3.Trigger, {
28031
+ value: "mcp",
28032
+ className: "flex-1",
28033
+ children: "MCP Servers"
28034
+ })]
28035
+ })
28036
+ })
28037
+ }), /*#__PURE__*/jsxs(Sidebar.Content, {
28038
+ children: [activeProviders.map(function (_ref8) {
27845
28039
  var _ref9 = _slicedToArray(_ref8, 2),
27846
28040
  name = _ref9[0],
27847
28041
  provider = _ref9[1];
27848
28042
  var isSelected = selectedName === name && !isCreating;
27849
28043
  return /*#__PURE__*/jsx(Sidebar.Item, {
27850
28044
  icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
27851
- icon: "key",
28045
+ icon: activeIcon,
27852
28046
  className: "h-3.5 w-3.5"
27853
28047
  }),
27854
28048
  active: isSelected,
@@ -27865,54 +28059,25 @@ var ProvidersSection = function ProvidersSection(_ref) {
27865
28059
  className: isSelected ? "bg-white/10 opacity-100" : "",
27866
28060
  children: name
27867
28061
  }, name);
27868
- })]
27869
- }), mcpProviders.length > 0 && /*#__PURE__*/jsxs(Fragment, {
27870
- children: [/*#__PURE__*/jsx("div", {
27871
- className: "px-3 py-2 text-xs font-semibold opacity-40 uppercase tracking-wider mt-2",
27872
- children: "MCP Servers"
27873
- }), mcpProviders.map(function (_ref0) {
27874
- var _ref1 = _slicedToArray(_ref0, 2),
27875
- name = _ref1[0],
27876
- provider = _ref1[1];
27877
- var isSelected = selectedName === name && !isCreating;
27878
- return /*#__PURE__*/jsx(Sidebar.Item, {
27879
- icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
27880
- icon: "server",
27881
- className: "h-3.5 w-3.5"
27882
- }),
27883
- active: isSelected,
28062
+ }), activeProviders.length === 0 && /*#__PURE__*/jsx("span", {
28063
+ className: "text-sm opacity-40 py-8 text-center",
28064
+ children: providerTab === "credentials" ? "No API credentials configured" : "No MCP servers configured"
28065
+ }), providerTab === "mcp" && /*#__PURE__*/jsx("div", {
28066
+ className: "px-3 py-3 mt-2 border-t border-white/10",
28067
+ children: /*#__PURE__*/jsxs("button", {
27884
28068
  onClick: function onClick() {
27885
- setSelectedName(name);
28069
+ setIsAddingMcp(true);
28070
+ setSelectedName(null);
27886
28071
  setIsCreating(false);
27887
28072
  setIsEditing(false);
27888
- setIsAddingMcp(false);
27889
- resetForm();
27890
28073
  },
27891
- badge: provider.type ? /*#__PURE__*/jsx(Tag3, {
27892
- text: provider.type
27893
- }) : null,
27894
- className: isSelected ? "bg-white/10 opacity-100" : "",
27895
- children: name
27896
- }, name);
28074
+ className: "flex items-center gap-2 text-sm text-blue-400 hover:text-blue-300 transition-colors w-full",
28075
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
28076
+ icon: "plus",
28077
+ className: "h-3 w-3"
28078
+ }), "Add MCP Server"]
28079
+ })
27897
28080
  })]
27898
- }), providerEntries.length === 0 && /*#__PURE__*/jsx("span", {
27899
- className: "text-sm opacity-40 py-8 text-center",
27900
- children: "No providers configured"
27901
- }), /*#__PURE__*/jsx("div", {
27902
- className: "px-3 py-3 mt-2 border-t border-white/10",
27903
- children: /*#__PURE__*/jsxs("button", {
27904
- onClick: function onClick() {
27905
- setIsAddingMcp(true);
27906
- setSelectedName(null);
27907
- setIsCreating(false);
27908
- setIsEditing(false);
27909
- },
27910
- className: "flex items-center gap-2 text-sm text-blue-400 hover:text-blue-300 transition-colors w-full",
27911
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
27912
- icon: "plus",
27913
- className: "h-3 w-3"
27914
- }), "Add MCP Server"]
27915
- })
27916
28081
  })]
27917
28082
  });
27918
28083
  var detailContent = null;
@@ -27956,6 +28121,10 @@ var ProvidersSection = function ProvidersSection(_ref) {
27956
28121
  }
27957
28122
  });
27958
28123
  } else if (selectedName && selectedProvider) {
28124
+ // Look up authCommand from the catalog for this provider type
28125
+ var catalogEntry = catalog.find(function (entry) {
28126
+ return entry.id === selectedProvider.type;
28127
+ });
27959
28128
  detailContent = /*#__PURE__*/jsx(ProviderDetail, {
27960
28129
  providerName: selectedName,
27961
28130
  provider: selectedProvider,
@@ -27971,7 +28140,8 @@ var ProvidersSection = function ProvidersSection(_ref) {
27971
28140
  onStartEdit: handleStartEdit,
27972
28141
  onDelete: function onDelete(name) {
27973
28142
  return setDeleteTarget(name);
27974
- }
28143
+ },
28144
+ catalogAuthCommand: (catalogEntry === null || catalogEntry === void 0 ? void 0 : catalogEntry.authCommand) || null
27975
28145
  });
27976
28146
  }
27977
28147
  return /*#__PURE__*/jsxs(Fragment, {
@@ -33760,5 +33930,5 @@ var WorkspaceMenu = function WorkspaceMenu(_ref) {
33760
33930
 
33761
33931
  ComponentManager.registerContainerTypes(LayoutContainer, LayoutGridContainer);
33762
33932
 
33763
- export { ALGOLIA_ANALYTICS_FOR_QUERY, ALGOLIA_ANALYTICS_FOR_QUERY_COMPLETE, ALGOLIA_ANALYTICS_FOR_QUERY_ERROR, ALGOLIA_LIST_INDICES, ALGOLIA_LIST_INDICES_COMPLETE, ALGOLIA_LIST_INDICES_ERROR, AVAILABLE_COLORS, AddMenuItemModal, AdvancedMcpConfig, AppContext, AppSettingsModal, AppThemeScope, AppWrapper, CHOOSE_FILE, CHOOSE_FILE_COMPLETE, CHOOSE_FILE_ERROR, ColorModel, ComponentConfigModel, ComponentManager, ContextModel, DATA_JSON_TO_CSV_FILE, DATA_JSON_TO_CSV_FILE_COMPLETE, DATA_JSON_TO_CSV_FILE_ERROR, DATA_JSON_TO_CSV_STRING, DATA_JSON_TO_CSV_STRING_COMPLETE, DATA_JSON_TO_CSV_STRING_ERROR, DATA_READ_FROM_FILE, DATA_READ_FROM_FILE_COMPLETE, DATA_READ_FROM_FILE_ERROR, DATA_SAVE_TO_FILE, DATA_SAVE_TO_FILE_COMPLETE, DATA_SAVE_TO_FILE_ERROR, DashCommandPalette, DashNavbar, DashSidebar, DashTabBar, DashboardStage as Dashboard, DashboardApi, DashboardContext, DashboardFooter, DashboardHeader, DashboardMenuItem, DashboardModel, DashboardMonitor, DashboardPublisher, DashboardStage, DashboardThemeProvider, DashboardWrapper, ElectronDashboardApi, ErrorBoundary, ExternalWidget, GRID_CELL_WIDGET_TYPE, HARMONY_STRATEGIES, LAYOUT_LIST, LAYOUT_LIST_COMPLETE, LAYOUT_LIST_ERROR, LAYOUT_SAVE, LAYOUT_SAVE_COMPLETE, LAYOUT_SAVE_ERROR, Layout, LayoutBuilder, LayoutBuilderAddItemModal, LayoutBuilderConfigContainerMenuItem, LayoutBuilderConfigMenuItem, LayoutBuilderConfigModal, LayoutBuilderEditItemModal, LayoutBuilderEventModal, LayoutBuilderGridItem, LayoutContainer, LayoutDragBuilder, LayoutDragBuilderEdit, LayoutGridContainer, LayoutManagerModal, LayoutModel, LayoutQuickAddMenu, MCP_CALL_TOOL_COMPLETE, MCP_CALL_TOOL_ERROR, MCP_GET_CATALOG_COMPLETE, MCP_GET_CATALOG_ERROR, MCP_LIST_RESOURCES_COMPLETE, MCP_LIST_RESOURCES_ERROR, MCP_LIST_TOOLS_COMPLETE, MCP_LIST_TOOLS_ERROR, MCP_READ_RESOURCE_COMPLETE, MCP_READ_RESOURCE_ERROR, MCP_SERVER_STATUS_COMPLETE, MCP_SERVER_STATUS_ERROR, MCP_START_SERVER_COMPLETE, MCP_START_SERVER_ERROR, MCP_STOP_SERVER_COMPLETE, MCP_STOP_SERVER_ERROR, MENU_ITEMS_DELETE, MENU_ITEMS_DELETE_COMPLETE, MENU_ITEMS_DELETE_ERROR, MENU_ITEMS_LIST, MENU_ITEMS_LIST_COMPLETE, MENU_ITEMS_LIST_ERROR, MENU_ITEMS_SAVE, MENU_ITEMS_SAVE_COMPLETE, MENU_ITEMS_SAVE_ERROR, MainMenu, MainMenuItem, MainMenuSection, McpServerPicker, MenuItemModel, MenuSlideOverlay, MergeCellsModal, MissingProviderPrompt, MockDashboardApi, PROVIDER_DELETE_COMPLETE, PROVIDER_DELETE_ERROR, PROVIDER_GET_COMPLETE, PROVIDER_GET_ERROR, PROVIDER_LIST_COMPLETE, PROVIDER_LIST_ERROR, PROVIDER_SAVE_COMPLETE, PROVIDER_SAVE_ERROR, PanelCode, PanelEditItem, PanelEditItemHandlers, ProviderContext, ProviderErrorBoundary, ProviderForm, ProviderSelector, SECURE_STORAGE_ENCRYPT_STRING, SECURE_STORAGE_ENCRYPT_STRING_COMPLETE, SECURE_STORAGE_ENCRYPT_STRING_ERROR, SECURE_STORE_ENCRYPTION_CHECK, SECURE_STORE_ENCRYPTION_CHECK_COMPLETE, SECURE_STORE_ENCRYPTION_CHECK_ERROR, SECURE_STORE_GET_DATA, SECURE_STORE_GET_DATA_COMPLETE, SECURE_STORE_GET_DATA_ERROR, SECURE_STORE_SET_DATA, SECURE_STORE_SET_DATA_COMPLETE, SECURE_STORE_SET_DATA_ERROR, SETTINGS_GET, SETTINGS_GET_COMPLETE, SETTINGS_GET_ERROR, SETTINGS_SAVE, SETTINGS_SAVE_COMPLETE, SETTINGS_SAVE_ERROR, SIDEBAR_WIDGET_TYPE, SettingsModel, SideMenu, SplitCellModal, THEME_DELETE, THEME_DELETE_COMPLETE, THEME_DELETE_ERROR, THEME_LIST, THEME_LIST_COMPLETE, THEME_LIST_ERROR, THEME_SAVE, THEME_SAVE_COMPLETE, THEME_SAVE_ERROR, ThemeApi, ThemeManagerModal, ThemeModel, ThemeWrapper, WORKSPACE_DELETE, WORKSPACE_DELETE_COMPLETE, WORKSPACE_DELETE_ERROR, WORKSPACE_LIST, WORKSPACE_LIST_COMPLETE, WORKSPACE_LIST_ERROR, WORKSPACE_SAVE, WORKSPACE_SAVE_COMPLETE, WORKSPACE_SAVE_ERROR, WebDashboardApi, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetPopoutStage, WidgetProviderWrapper, WidgetSidebar, Workspace, WorkspaceContext, WorkspaceFooter, WorkspaceMenu, WorkspaceModel, addChildToLayoutItem, addItemToItemLayout, buildMcpConfigFromOverrides, canHaveChildren, changeDirectionForLayoutItem, createProviderRegistry, deriveFormFields, envMappingToRows, evaluateBundle, extractWidgetConfigs, formStateToMcpJson, formatFieldName, generateCustomTheme, generateHarmonyTheme, generateRandomTheme, generateThemeName, getBorderStyle, getChildrenForLayoutItem, getComponentInLayout, getContainerBorderColor, getContainerColor, getIndexOfLayoutChildrenForItem, getIndexOfLayoutItem, getLayoutItemById, getLayoutItemForWorkspace, getNearestParentWorkspace, getNextHighestId, getNextHighestItemInLayout, getNextHighestOrder, getNextHighestParentId, getNextLowestItemInLayout, getParentForLayoutItem, getParentWorkspaceForItem, getThemePresets, getWidgetsForWorkspace, getWorkspacesForWorkspace, headerTemplateToRows, isContainer, isLikelySecret, isMaxOrderForItem, isMinOrderForItem, isWidget, isWidgetResolvable, isWorkspace, layoutItemHasWorkspaceAsChild, loadWidgetBundle, mcpJsonToFormState, numChildrenForLayout, removeItemFromLayout, renderComponent, renderGridLayout, renderGridLayoutFlow, _renderLayout as renderLayout, renderLayoutMenu, replaceItemInLayout, resolveIcon, setHostModules, traverseParentTree, updateLayoutItem, updateParentForItem, useDashboard, useMcpProvider, useProvider, useProviderClient, useWidgetEvents, useWidgetProviders, validateCellMerge, validateGridCell, validateGridPlacement, validateWidgetPlacement, withProviderDetection };
33933
+ export { ALGOLIA_ANALYTICS_FOR_QUERY, ALGOLIA_ANALYTICS_FOR_QUERY_COMPLETE, ALGOLIA_ANALYTICS_FOR_QUERY_ERROR, ALGOLIA_LIST_INDICES, ALGOLIA_LIST_INDICES_COMPLETE, ALGOLIA_LIST_INDICES_ERROR, AVAILABLE_COLORS, AddMenuItemModal, AdvancedMcpConfig, AppContext, AppSettingsModal, AppThemeScope, AppWrapper, CHOOSE_FILE, CHOOSE_FILE_COMPLETE, CHOOSE_FILE_ERROR, ColorModel, ComponentConfigModel, ComponentManager, ContextModel, DATA_JSON_TO_CSV_FILE, DATA_JSON_TO_CSV_FILE_COMPLETE, DATA_JSON_TO_CSV_FILE_ERROR, DATA_JSON_TO_CSV_STRING, DATA_JSON_TO_CSV_STRING_COMPLETE, DATA_JSON_TO_CSV_STRING_ERROR, DATA_READ_FROM_FILE, DATA_READ_FROM_FILE_COMPLETE, DATA_READ_FROM_FILE_ERROR, DATA_SAVE_TO_FILE, DATA_SAVE_TO_FILE_COMPLETE, DATA_SAVE_TO_FILE_ERROR, DashCommandPalette, DashNavbar, DashSidebar, DashTabBar, DashboardStage as Dashboard, DashboardApi, DashboardContext, DashboardFooter, DashboardHeader, DashboardMenuItem, DashboardModel, DashboardMonitor, DashboardPublisher, DashboardStage, DashboardThemeProvider, DashboardWrapper, ElectronDashboardApi, ErrorBoundary, ExternalWidget, GRID_CELL_WIDGET_TYPE, HARMONY_STRATEGIES, LAYOUT_LIST, LAYOUT_LIST_COMPLETE, LAYOUT_LIST_ERROR, LAYOUT_SAVE, LAYOUT_SAVE_COMPLETE, LAYOUT_SAVE_ERROR, Layout, LayoutBuilder, LayoutBuilderAddItemModal, LayoutBuilderConfigContainerMenuItem, LayoutBuilderConfigMenuItem, LayoutBuilderConfigModal, LayoutBuilderEditItemModal, LayoutBuilderEventModal, LayoutBuilderGridItem, LayoutContainer, LayoutDragBuilder, LayoutDragBuilderEdit, LayoutGridContainer, LayoutManagerModal, LayoutModel, LayoutQuickAddMenu, MCP_CALL_TOOL_COMPLETE, MCP_CALL_TOOL_ERROR, MCP_GET_CATALOG_COMPLETE, MCP_GET_CATALOG_ERROR, MCP_LIST_RESOURCES_COMPLETE, MCP_LIST_RESOURCES_ERROR, MCP_LIST_TOOLS_COMPLETE, MCP_LIST_TOOLS_ERROR, MCP_READ_RESOURCE_COMPLETE, MCP_READ_RESOURCE_ERROR, MCP_RUN_AUTH_COMPLETE, MCP_RUN_AUTH_ERROR, MCP_SERVER_STATUS_COMPLETE, MCP_SERVER_STATUS_ERROR, MCP_START_SERVER_COMPLETE, MCP_START_SERVER_ERROR, MCP_STOP_SERVER_COMPLETE, MCP_STOP_SERVER_ERROR, MENU_ITEMS_DELETE, MENU_ITEMS_DELETE_COMPLETE, MENU_ITEMS_DELETE_ERROR, MENU_ITEMS_LIST, MENU_ITEMS_LIST_COMPLETE, MENU_ITEMS_LIST_ERROR, MENU_ITEMS_SAVE, MENU_ITEMS_SAVE_COMPLETE, MENU_ITEMS_SAVE_ERROR, MainMenu, MainMenuItem, MainMenuSection, McpServerPicker, MenuItemModel, MenuSlideOverlay, MergeCellsModal, MissingProviderPrompt, MockDashboardApi, PROVIDER_DELETE_COMPLETE, PROVIDER_DELETE_ERROR, PROVIDER_GET_COMPLETE, PROVIDER_GET_ERROR, PROVIDER_LIST_COMPLETE, PROVIDER_LIST_ERROR, PROVIDER_SAVE_COMPLETE, PROVIDER_SAVE_ERROR, PanelCode, PanelEditItem, PanelEditItemHandlers, ProviderContext, ProviderErrorBoundary, ProviderForm, ProviderSelector, SECURE_STORAGE_ENCRYPT_STRING, SECURE_STORAGE_ENCRYPT_STRING_COMPLETE, SECURE_STORAGE_ENCRYPT_STRING_ERROR, SECURE_STORE_ENCRYPTION_CHECK, SECURE_STORE_ENCRYPTION_CHECK_COMPLETE, SECURE_STORE_ENCRYPTION_CHECK_ERROR, SECURE_STORE_GET_DATA, SECURE_STORE_GET_DATA_COMPLETE, SECURE_STORE_GET_DATA_ERROR, SECURE_STORE_SET_DATA, SECURE_STORE_SET_DATA_COMPLETE, SECURE_STORE_SET_DATA_ERROR, SETTINGS_GET, SETTINGS_GET_COMPLETE, SETTINGS_GET_ERROR, SETTINGS_SAVE, SETTINGS_SAVE_COMPLETE, SETTINGS_SAVE_ERROR, SIDEBAR_WIDGET_TYPE, SettingsModel, SideMenu, SplitCellModal, THEME_DELETE, THEME_DELETE_COMPLETE, THEME_DELETE_ERROR, THEME_LIST, THEME_LIST_COMPLETE, THEME_LIST_ERROR, THEME_SAVE, THEME_SAVE_COMPLETE, THEME_SAVE_ERROR, ThemeApi, ThemeManagerModal, ThemeModel, ThemeWrapper, WORKSPACE_DELETE, WORKSPACE_DELETE_COMPLETE, WORKSPACE_DELETE_ERROR, WORKSPACE_LIST, WORKSPACE_LIST_COMPLETE, WORKSPACE_LIST_ERROR, WORKSPACE_SAVE, WORKSPACE_SAVE_COMPLETE, WORKSPACE_SAVE_ERROR, WebDashboardApi, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetPopoutStage, WidgetProviderWrapper, WidgetSidebar, Workspace, WorkspaceContext, WorkspaceFooter, WorkspaceMenu, WorkspaceModel, addChildToLayoutItem, addItemToItemLayout, buildMcpConfigFromOverrides, canHaveChildren, changeDirectionForLayoutItem, createProviderRegistry, deriveFormFields, envMappingToRows, evaluateBundle, extractWidgetConfigs, formStateToMcpJson, formatFieldName, generateCustomTheme, generateHarmonyTheme, generateRandomTheme, generateThemeName, getBorderStyle, getChildrenForLayoutItem, getComponentInLayout, getContainerBorderColor, getContainerColor, getIndexOfLayoutChildrenForItem, getIndexOfLayoutItem, getLayoutItemById, getLayoutItemForWorkspace, getNearestParentWorkspace, getNextHighestId, getNextHighestItemInLayout, getNextHighestOrder, getNextHighestParentId, getNextLowestItemInLayout, getParentForLayoutItem, getParentWorkspaceForItem, getThemePresets, getWidgetsForWorkspace, getWorkspacesForWorkspace, headerTemplateToRows, isContainer, isLikelySecret, isMaxOrderForItem, isMinOrderForItem, isWidget, isWidgetResolvable, isWorkspace, layoutItemHasWorkspaceAsChild, loadWidgetBundle, mcpJsonToFormState, numChildrenForLayout, removeItemFromLayout, renderComponent, renderGridLayout, renderGridLayoutFlow, _renderLayout as renderLayout, renderLayoutMenu, replaceItemInLayout, resolveIcon, setHostModules, traverseParentTree, updateLayoutItem, updateParentForItem, useDashboard, useMcpProvider, useProvider, useProviderClient, useWidgetEvents, useWidgetProviders, validateCellMerge, validateGridCell, validateGridPlacement, validateWidgetPlacement, withProviderDetection };
33764
33934
  //# sourceMappingURL=index.esm.js.map