@trops/dash-core 0.1.55 → 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.js CHANGED
@@ -691,6 +691,8 @@ var MCP_SERVER_STATUS_COMPLETE = "mcp:server-status:complete";
691
691
  var MCP_SERVER_STATUS_ERROR = "mcp:server-status:error";
692
692
  var MCP_GET_CATALOG_COMPLETE = "mcp:get-catalog:complete";
693
693
  var MCP_GET_CATALOG_ERROR = "mcp:get-catalog:error";
694
+ var MCP_RUN_AUTH_COMPLETE = "mcp:run-auth:complete";
695
+ var MCP_RUN_AUTH_ERROR = "mcp:run-auth:error";
694
696
 
695
697
  var DATA_JSON_TO_CSV_FILE = "data-json-to-csv-file";
696
698
  var DATA_JSON_TO_CSV_FILE_COMPLETE = "data-json-to-csv-file-complete";
@@ -799,6 +801,8 @@ var apiEvents = /*#__PURE__*/Object.freeze({
799
801
  MCP_LIST_TOOLS_ERROR: MCP_LIST_TOOLS_ERROR,
800
802
  MCP_READ_RESOURCE_COMPLETE: MCP_READ_RESOURCE_COMPLETE,
801
803
  MCP_READ_RESOURCE_ERROR: MCP_READ_RESOURCE_ERROR,
804
+ MCP_RUN_AUTH_COMPLETE: MCP_RUN_AUTH_COMPLETE,
805
+ MCP_RUN_AUTH_ERROR: MCP_RUN_AUTH_ERROR,
802
806
  MCP_SERVER_STATUS_COMPLETE: MCP_SERVER_STATUS_COMPLETE,
803
807
  MCP_SERVER_STATUS_ERROR: MCP_SERVER_STATUS_ERROR,
804
808
  MCP_START_SERVER_COMPLETE: MCP_START_SERVER_COMPLETE,
@@ -1497,6 +1501,27 @@ var ElectronDashboardApi = /*#__PURE__*/function () {
1497
1501
  return false;
1498
1502
  }
1499
1503
  }
1504
+ }, {
1505
+ key: "mcpRunAuth",
1506
+ value: function mcpRunAuth(mcpConfig, credentials, authCommand, onSuccess, onError) {
1507
+ var _this26 = this;
1508
+ if (this.api !== null) {
1509
+ try {
1510
+ this.api.mcp.runAuth(mcpConfig, credentials, authCommand).then(function (result) {
1511
+ onSuccess(_this26.events.MCP_RUN_AUTH_COMPLETE, result);
1512
+ })["catch"](function (error) {
1513
+ onError(_this26.events.MCP_RUN_AUTH_ERROR, error);
1514
+ });
1515
+ return true;
1516
+ } catch (e) {
1517
+ onError(this.events.MCP_RUN_AUTH_ERROR, e);
1518
+ return false;
1519
+ }
1520
+ } else {
1521
+ onError(this.events.MCP_RUN_AUTH_ERROR, new Error("No Api found"));
1522
+ return false;
1523
+ }
1524
+ }
1500
1525
  }]);
1501
1526
  }();
1502
1527
 
@@ -25868,7 +25893,7 @@ var FoldersSection = function FoldersSection(_ref) {
25868
25893
  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; }
25869
25894
  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; }
25870
25895
  var ProviderDetail = function ProviderDetail(_ref) {
25871
- var _testResult$tools;
25896
+ var _provider$mcpConfig, _testResult$tools;
25872
25897
  var _ref$providerName = _ref.providerName,
25873
25898
  providerName = _ref$providerName === void 0 ? null : _ref$providerName,
25874
25899
  _ref$provider = _ref.provider,
@@ -25890,7 +25915,9 @@ var ProviderDetail = function ProviderDetail(_ref) {
25890
25915
  onCancelEdit = _ref.onCancelEdit,
25891
25916
  onStartEdit = _ref.onStartEdit,
25892
25917
  onCreate = _ref.onCreate,
25893
- onDelete = _ref.onDelete;
25918
+ onDelete = _ref.onDelete,
25919
+ _ref$catalogAuthComma = _ref.catalogAuthCommand,
25920
+ catalogAuthCommand = _ref$catalogAuthComma === void 0 ? null : _ref$catalogAuthComma;
25894
25921
  var appContext = React.useContext(AppContext);
25895
25922
  var dashApi = appContext === null || appContext === void 0 ? void 0 : appContext.dashApi;
25896
25923
  var isMcp = (provider === null || provider === void 0 ? void 0 : provider.providerClass) === "mcp";
@@ -25905,6 +25932,19 @@ var ProviderDetail = function ProviderDetail(_ref) {
25905
25932
  testResult = _useState4[0],
25906
25933
  setTestResult = _useState4[1];
25907
25934
 
25935
+ // MCP auth state
25936
+ var _useState5 = React.useState(false),
25937
+ _useState6 = _slicedToArray(_useState5, 2),
25938
+ isAuthorizing = _useState6[0],
25939
+ setIsAuthorizing = _useState6[1];
25940
+ var _useState7 = React.useState(null),
25941
+ _useState8 = _slicedToArray(_useState7, 2),
25942
+ authResult = _useState8[0],
25943
+ setAuthResult = _useState8[1];
25944
+
25945
+ // Resolve authCommand: provider.mcpConfig.authCommand > catalogAuthCommand prop
25946
+ var resolvedAuthCommand = (provider === null || provider === void 0 || (_provider$mcpConfig = provider.mcpConfig) === null || _provider$mcpConfig === void 0 ? void 0 : _provider$mcpConfig.authCommand) || catalogAuthCommand || null;
25947
+
25908
25948
  // Derive credential fields for MCP providers in edit mode
25909
25949
  var mcpFormFields = React.useMemo(function () {
25910
25950
  if (!isMcp || !(provider !== null && provider !== void 0 && provider.mcpConfig)) return [];
@@ -25918,14 +25958,14 @@ var ProviderDetail = function ProviderDetail(_ref) {
25918
25958
  }, [isMcp, provider]);
25919
25959
 
25920
25960
  // Dynamic credential fields for create mode
25921
- var _useState5 = React.useState(isCreating ? [{
25961
+ var _useState9 = React.useState(isCreating ? [{
25922
25962
  id: "default_apiKey",
25923
25963
  key: "apiKey",
25924
25964
  secret: true
25925
25965
  }] : []),
25926
- _useState6 = _slicedToArray(_useState5, 2),
25927
- credentialFields = _useState6[0],
25928
- setCredentialFields = _useState6[1];
25966
+ _useState0 = _slicedToArray(_useState9, 2),
25967
+ credentialFields = _useState0[0],
25968
+ setCredentialFields = _useState0[1];
25929
25969
  var fieldIdRef = React.useRef(0);
25930
25970
  var handleFieldKeyChange = function handleFieldKeyChange(id, newKey) {
25931
25971
  setCredentialFields(function (prev) {
@@ -26028,6 +26068,31 @@ var ProviderDetail = function ProviderDetail(_ref) {
26028
26068
  setIsTesting(false);
26029
26069
  });
26030
26070
  };
26071
+ var handleAuthorize = function handleAuthorize() {
26072
+ if (!dashApi || !(provider !== null && provider !== void 0 && provider.mcpConfig) || !resolvedAuthCommand) return;
26073
+ setIsAuthorizing(true);
26074
+ setAuthResult(null);
26075
+ dashApi.mcpRunAuth(provider.mcpConfig, provider.credentials, resolvedAuthCommand, function (event, result) {
26076
+ if (result.error) {
26077
+ setAuthResult({
26078
+ success: false,
26079
+ message: result.message
26080
+ });
26081
+ } else {
26082
+ setAuthResult({
26083
+ success: true,
26084
+ message: "Authorized!"
26085
+ });
26086
+ }
26087
+ setIsAuthorizing(false);
26088
+ }, function (event, err) {
26089
+ setAuthResult({
26090
+ success: false,
26091
+ message: (err === null || err === void 0 ? void 0 : err.message) || "Authorization failed"
26092
+ });
26093
+ setIsAuthorizing(false);
26094
+ });
26095
+ };
26031
26096
  var isFormMode = isEditing || isCreating;
26032
26097
 
26033
26098
  // ── MCP config info block (shared between read-only view and edit form) ──
@@ -26081,7 +26146,7 @@ var ProviderDetail = function ProviderDetail(_ref) {
26081
26146
 
26082
26147
  // ── Edit / Create form ──
26083
26148
  if (isFormMode) {
26084
- var _provider$mcpConfig;
26149
+ var _provider$mcpConfig2;
26085
26150
  return /*#__PURE__*/jsxRuntime.jsxs("div", {
26086
26151
  className: "flex flex-col flex-1 min-h-0",
26087
26152
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
@@ -26178,7 +26243,7 @@ var ProviderDetail = function ProviderDetail(_ref) {
26178
26243
  className: "border-t border-white/10 pt-4",
26179
26244
  children: /*#__PURE__*/jsxRuntime.jsx("p", {
26180
26245
  className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26181
- children: ((_provider$mcpConfig = provider.mcpConfig) === null || _provider$mcpConfig === void 0 ? void 0 : _provider$mcpConfig.transport) === "streamable_http" ? "Server Configuration" : "Authentication"
26246
+ children: ((_provider$mcpConfig2 = provider.mcpConfig) === null || _provider$mcpConfig2 === void 0 ? void 0 : _provider$mcpConfig2.transport) === "streamable_http" ? "Server Configuration" : "Authentication"
26182
26247
  })
26183
26248
  }), mcpFormFields.map(function (field) {
26184
26249
  return /*#__PURE__*/jsxRuntime.jsxs("div", {
@@ -26189,13 +26254,38 @@ var ProviderDetail = function ProviderDetail(_ref) {
26189
26254
  }), field.instructions && /*#__PURE__*/jsxRuntime.jsx("p", {
26190
26255
  className: "text-sm opacity-50",
26191
26256
  children: field.instructions
26192
- }), /*#__PURE__*/jsxRuntime.jsx(DashReact.InputText, {
26193
- type: field.secret ? "password" : "text",
26194
- value: formCredentials[field.key] || "",
26195
- onChange: function onChange(value) {
26196
- return handleCredentialChange(field.key, value);
26197
- },
26198
- placeholder: "Enter ".concat(field.displayName.toLowerCase())
26257
+ }), /*#__PURE__*/jsxRuntime.jsxs("div", {
26258
+ className: "flex gap-2",
26259
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
26260
+ className: "flex-1",
26261
+ children: /*#__PURE__*/jsxRuntime.jsx(DashReact.InputText, {
26262
+ type: field.secret ? "password" : "text",
26263
+ value: formCredentials[field.key] || "",
26264
+ onChange: function onChange(value) {
26265
+ return handleCredentialChange(field.key, value);
26266
+ },
26267
+ placeholder: field.type === "file" ? "Select a file..." : "Enter ".concat(field.displayName.toLowerCase())
26268
+ })
26269
+ }), field.type === "file" && /*#__PURE__*/jsxRuntime.jsx("button", {
26270
+ onClick: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
26271
+ var filepath;
26272
+ return _regeneratorRuntime.wrap(function (_context) {
26273
+ while (1) switch (_context.prev = _context.next) {
26274
+ case 0:
26275
+ _context.next = 1;
26276
+ return window.mainApi.dialog.chooseFile(true, ["json"]);
26277
+ case 1:
26278
+ filepath = _context.sent;
26279
+ if (filepath) handleCredentialChange(field.key, filepath);
26280
+ case 2:
26281
+ case "end":
26282
+ return _context.stop();
26283
+ }
26284
+ }, _callee);
26285
+ })),
26286
+ className: "px-3 py-1.5 text-sm rounded bg-white/10 hover:bg-white/20 transition-colors",
26287
+ children: "Browse"
26288
+ })]
26199
26289
  })]
26200
26290
  }, field.key);
26201
26291
  })]
@@ -26315,6 +26405,16 @@ var ProviderDetail = function ProviderDetail(_ref) {
26315
26405
  })]
26316
26406
  })]
26317
26407
  })]
26408
+ }), authResult && /*#__PURE__*/jsxRuntime.jsx("div", {
26409
+ 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"),
26410
+ children: /*#__PURE__*/jsxRuntime.jsxs("div", {
26411
+ className: "flex items-center gap-2",
26412
+ children: [/*#__PURE__*/jsxRuntime.jsx(DashReact.FontAwesomeIcon, {
26413
+ icon: authResult.success ? "circle-check" : "circle-exclamation"
26414
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
26415
+ children: authResult.message
26416
+ })]
26417
+ })
26318
26418
  }), testResult && /*#__PURE__*/jsxRuntime.jsxs("div", {
26319
26419
  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"),
26320
26420
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
@@ -26343,7 +26443,11 @@ var ProviderDetail = function ProviderDetail(_ref) {
26343
26443
  })]
26344
26444
  }), /*#__PURE__*/jsxRuntime.jsxs("div", {
26345
26445
  className: "flex-shrink-0 flex flex-row justify-end gap-2 px-6 py-4 border-t border-white/10",
26346
- children: [isMcp && /*#__PURE__*/jsxRuntime.jsx(DashReact.Button, {
26446
+ children: [isMcp && resolvedAuthCommand && /*#__PURE__*/jsxRuntime.jsx(DashReact.Button, {
26447
+ title: isAuthorizing ? "Authorizing..." : "Authorize",
26448
+ onClick: handleAuthorize,
26449
+ size: "sm"
26450
+ }), isMcp && /*#__PURE__*/jsxRuntime.jsx(DashReact.Button, {
26347
26451
  title: isTesting ? "Testing..." : "Test Connection",
26348
26452
  onClick: handleTestConnection,
26349
26453
  size: "sm"
@@ -27074,13 +27178,38 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
27074
27178
  children: [/*#__PURE__*/jsxRuntime.jsx(DashReact.FormLabel, {
27075
27179
  label: field.displayName,
27076
27180
  required: field.required
27077
- }), /*#__PURE__*/jsxRuntime.jsx(DashReact.InputText, {
27078
- type: field.secret ? "password" : "text",
27079
- value: credentialData[field.key] || "",
27080
- onChange: function onChange(value) {
27081
- return handleCredentialChange(field.key, value);
27082
- },
27083
- placeholder: "Enter ".concat(field.displayName.toLowerCase())
27181
+ }), /*#__PURE__*/jsxRuntime.jsxs("div", {
27182
+ className: "flex gap-2",
27183
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
27184
+ className: "flex-1",
27185
+ children: /*#__PURE__*/jsxRuntime.jsx(DashReact.InputText, {
27186
+ type: field.secret ? "password" : "text",
27187
+ value: credentialData[field.key] || "",
27188
+ onChange: function onChange(value) {
27189
+ return handleCredentialChange(field.key, value);
27190
+ },
27191
+ placeholder: field.type === "file" ? "Select a file..." : "Enter ".concat(field.displayName.toLowerCase())
27192
+ })
27193
+ }), field.type === "file" && /*#__PURE__*/jsxRuntime.jsx("button", {
27194
+ onClick: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
27195
+ var filepath;
27196
+ return _regeneratorRuntime.wrap(function (_context) {
27197
+ while (1) switch (_context.prev = _context.next) {
27198
+ case 0:
27199
+ _context.next = 1;
27200
+ return window.mainApi.dialog.chooseFile(true, ["json"]);
27201
+ case 1:
27202
+ filepath = _context.sent;
27203
+ if (filepath) handleCredentialChange(field.key, filepath);
27204
+ case 2:
27205
+ case "end":
27206
+ return _context.stop();
27207
+ }
27208
+ }, _callee);
27209
+ })),
27210
+ className: "px-3 py-1.5 text-sm rounded bg-white/10 hover:bg-white/20 transition-colors",
27211
+ children: "Browse"
27212
+ })]
27084
27213
  }), formErrors[field.key] && /*#__PURE__*/jsxRuntime.jsx("p", {
27085
27214
  className: "text-sm text-red-400",
27086
27215
  children: formErrors[field.key]
@@ -27515,13 +27644,38 @@ var McpCatalogDetail = function McpCatalogDetail(_ref) {
27515
27644
  }), field.instructions && /*#__PURE__*/jsxRuntime.jsx("p", {
27516
27645
  className: "text-sm opacity-50",
27517
27646
  children: field.instructions
27518
- }), /*#__PURE__*/jsxRuntime.jsx(DashReact.InputText, {
27519
- type: field.secret ? "password" : "text",
27520
- value: credentialData[field.key] || "",
27521
- onChange: function onChange(value) {
27522
- return handleCredentialChange(field.key, value);
27523
- },
27524
- placeholder: "Enter ".concat(field.displayName.toLowerCase())
27647
+ }), /*#__PURE__*/jsxRuntime.jsxs("div", {
27648
+ className: "flex gap-2",
27649
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
27650
+ className: "flex-1",
27651
+ children: /*#__PURE__*/jsxRuntime.jsx(DashReact.InputText, {
27652
+ type: field.secret ? "password" : "text",
27653
+ value: credentialData[field.key] || "",
27654
+ onChange: function onChange(value) {
27655
+ return handleCredentialChange(field.key, value);
27656
+ },
27657
+ placeholder: field.type === "file" ? "Select a file..." : "Enter ".concat(field.displayName.toLowerCase())
27658
+ })
27659
+ }), field.type === "file" && /*#__PURE__*/jsxRuntime.jsx("button", {
27660
+ onClick: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
27661
+ var filepath;
27662
+ return _regeneratorRuntime.wrap(function (_context) {
27663
+ while (1) switch (_context.prev = _context.next) {
27664
+ case 0:
27665
+ _context.next = 1;
27666
+ return window.mainApi.dialog.chooseFile(true, ["json"]);
27667
+ case 1:
27668
+ filepath = _context.sent;
27669
+ if (filepath) handleCredentialChange(field.key, filepath);
27670
+ case 2:
27671
+ case "end":
27672
+ return _context.stop();
27673
+ }
27674
+ }, _callee);
27675
+ })),
27676
+ className: "px-3 py-1.5 text-sm rounded bg-white/10 hover:bg-white/20 transition-colors",
27677
+ children: "Browse"
27678
+ })]
27525
27679
  }), formErrors[field.key] && /*#__PURE__*/jsxRuntime.jsx("p", {
27526
27680
  className: "text-sm text-red-400",
27527
27681
  children: formErrors[field.key]
@@ -27660,46 +27814,58 @@ var ProvidersSection = function ProvidersSection(_ref) {
27660
27814
  var appContext = React.useContext(AppContext);
27661
27815
  var providers = (appContext === null || appContext === void 0 ? void 0 : appContext.providers) || {};
27662
27816
  var refreshProviders = appContext === null || appContext === void 0 ? void 0 : appContext.refreshProviders;
27663
- var _useState = React.useState("credentials"),
27817
+
27818
+ // Load MCP catalog for authCommand lookups
27819
+ var _useState = React.useState([]),
27664
27820
  _useState2 = _slicedToArray(_useState, 2),
27665
- providerTab = _useState2[0],
27666
- setProviderTab = _useState2[1];
27667
- var _useState3 = React.useState(null),
27821
+ catalog = _useState2[0],
27822
+ setCatalog = _useState2[1];
27823
+ React.useEffect(function () {
27824
+ if (!dashApi) return;
27825
+ dashApi.mcpGetCatalog(function (event, result) {
27826
+ if (result !== null && result !== void 0 && result.catalog) setCatalog(result.catalog);
27827
+ }, function () {});
27828
+ }, [dashApi]);
27829
+ var _useState3 = React.useState("credentials"),
27668
27830
  _useState4 = _slicedToArray(_useState3, 2),
27669
- selectedName = _useState4[0],
27670
- setSelectedName = _useState4[1];
27671
- var _useState5 = React.useState(false),
27831
+ providerTab = _useState4[0],
27832
+ setProviderTab = _useState4[1];
27833
+ var _useState5 = React.useState(null),
27672
27834
  _useState6 = _slicedToArray(_useState5, 2),
27673
- isCreating = _useState6[0],
27674
- setIsCreating = _useState6[1];
27835
+ selectedName = _useState6[0],
27836
+ setSelectedName = _useState6[1];
27675
27837
  var _useState7 = React.useState(false),
27676
27838
  _useState8 = _slicedToArray(_useState7, 2),
27677
- isEditing = _useState8[0],
27678
- setIsEditing = _useState8[1];
27679
- var _useState9 = React.useState(""),
27839
+ isCreating = _useState8[0],
27840
+ setIsCreating = _useState8[1];
27841
+ var _useState9 = React.useState(false),
27680
27842
  _useState0 = _slicedToArray(_useState9, 2),
27681
- formName = _useState0[0],
27682
- setFormName = _useState0[1];
27843
+ isEditing = _useState0[0],
27844
+ setIsEditing = _useState0[1];
27683
27845
  var _useState1 = React.useState(""),
27684
27846
  _useState10 = _slicedToArray(_useState1, 2),
27685
- formType = _useState10[0],
27686
- setFormType = _useState10[1];
27687
- var _useState11 = React.useState({}),
27847
+ formName = _useState10[0],
27848
+ setFormName = _useState10[1];
27849
+ var _useState11 = React.useState(""),
27688
27850
  _useState12 = _slicedToArray(_useState11, 2),
27689
- formCredentials = _useState12[0],
27690
- setFormCredentials = _useState12[1];
27691
- var _useState13 = React.useState(null),
27851
+ formType = _useState12[0],
27852
+ setFormType = _useState12[1];
27853
+ var _useState13 = React.useState({}),
27692
27854
  _useState14 = _slicedToArray(_useState13, 2),
27693
- deleteTarget = _useState14[0],
27694
- setDeleteTarget = _useState14[1];
27695
- var _useState15 = React.useState(false),
27855
+ formCredentials = _useState14[0],
27856
+ setFormCredentials = _useState14[1];
27857
+ var _useState15 = React.useState(null),
27696
27858
  _useState16 = _slicedToArray(_useState15, 2),
27697
- isAddingMcp = _useState16[0],
27698
- setIsAddingMcp = _useState16[1];
27859
+ deleteTarget = _useState16[0],
27860
+ setDeleteTarget = _useState16[1];
27699
27861
  var _useState17 = React.useState(false),
27700
27862
  _useState18 = _slicedToArray(_useState17, 2),
27701
- isEditingMcp = _useState18[0],
27702
- setIsEditingMcp = _useState18[1];
27863
+ isAddingMcp = _useState18[0],
27864
+ setIsAddingMcp = _useState18[1];
27865
+ var _useState19 = React.useState(false),
27866
+ _useState20 = _slicedToArray(_useState19, 2),
27867
+ isEditingMcp = _useState20[0],
27868
+ setIsEditingMcp = _useState20[1];
27703
27869
 
27704
27870
  // Row ID counter for env/header rows in MCP edit mode
27705
27871
  var nextRowIdRef = React.useRef(0);
@@ -27974,6 +28140,10 @@ var ProvidersSection = function ProvidersSection(_ref) {
27974
28140
  }
27975
28141
  });
27976
28142
  } else if (selectedName && selectedProvider) {
28143
+ // Look up authCommand from the catalog for this provider type
28144
+ var catalogEntry = catalog.find(function (entry) {
28145
+ return entry.id === selectedProvider.type;
28146
+ });
27977
28147
  detailContent = /*#__PURE__*/jsxRuntime.jsx(ProviderDetail, {
27978
28148
  providerName: selectedName,
27979
28149
  provider: selectedProvider,
@@ -27989,7 +28159,8 @@ var ProvidersSection = function ProvidersSection(_ref) {
27989
28159
  onStartEdit: handleStartEdit,
27990
28160
  onDelete: function onDelete(name) {
27991
28161
  return setDeleteTarget(name);
27992
- }
28162
+ },
28163
+ catalogAuthCommand: (catalogEntry === null || catalogEntry === void 0 ? void 0 : catalogEntry.authCommand) || null
27993
28164
  });
27994
28165
  }
27995
28166
  return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
@@ -33867,6 +34038,8 @@ exports.MCP_LIST_TOOLS_COMPLETE = MCP_LIST_TOOLS_COMPLETE;
33867
34038
  exports.MCP_LIST_TOOLS_ERROR = MCP_LIST_TOOLS_ERROR;
33868
34039
  exports.MCP_READ_RESOURCE_COMPLETE = MCP_READ_RESOURCE_COMPLETE;
33869
34040
  exports.MCP_READ_RESOURCE_ERROR = MCP_READ_RESOURCE_ERROR;
34041
+ exports.MCP_RUN_AUTH_COMPLETE = MCP_RUN_AUTH_COMPLETE;
34042
+ exports.MCP_RUN_AUTH_ERROR = MCP_RUN_AUTH_ERROR;
33870
34043
  exports.MCP_SERVER_STATUS_COMPLETE = MCP_SERVER_STATUS_COMPLETE;
33871
34044
  exports.MCP_SERVER_STATUS_ERROR = MCP_SERVER_STATUS_ERROR;
33872
34045
  exports.MCP_START_SERVER_COMPLETE = MCP_START_SERVER_COMPLETE;