@trops/dash-core 0.1.52 → 0.1.53

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
@@ -9526,6 +9526,157 @@ function headerTemplateToRows(headerTemplate, nextRowId) {
9526
9526
  });
9527
9527
  }
9528
9528
 
9529
+ /**
9530
+ * Serialize the current form state into a standard MCP JSON config string.
9531
+ *
9532
+ * Output format:
9533
+ * {
9534
+ * "mcpServers": {
9535
+ * "<name>": { "command": ..., "args": [...], "env": {...} }
9536
+ * }
9537
+ * }
9538
+ *
9539
+ * @param {string} name - The provider name
9540
+ * @param {string} transport - "stdio" or "streamable_http"
9541
+ * @param {object} fields - { command, args, envMappingRows, url, headerRows, credentialData }
9542
+ * @returns {string} Formatted JSON string
9543
+ */
9544
+ function formStateToMcpJson(name, transport, fields) {
9545
+ var _fields$command = fields.command,
9546
+ command = _fields$command === void 0 ? "" : _fields$command,
9547
+ _fields$args = fields.args,
9548
+ args = _fields$args === void 0 ? "" : _fields$args,
9549
+ _fields$envMappingRow = fields.envMappingRows,
9550
+ envMappingRows = _fields$envMappingRow === void 0 ? [] : _fields$envMappingRow,
9551
+ _fields$url = fields.url,
9552
+ url = _fields$url === void 0 ? "" : _fields$url,
9553
+ _fields$headerRows = fields.headerRows,
9554
+ headerRows = _fields$headerRows === void 0 ? [] : _fields$headerRows,
9555
+ _fields$credentialDat = fields.credentialData,
9556
+ credentialData = _fields$credentialDat === void 0 ? {} : _fields$credentialDat;
9557
+ var serverConfig;
9558
+ if (transport === "stdio") {
9559
+ var argsArray = args.trim().split(/\s+/).filter(Boolean);
9560
+ var env = {};
9561
+ envMappingRows.forEach(function (row) {
9562
+ var envVar = row.envVar.trim();
9563
+ var credField = row.credField.trim();
9564
+ if (envVar) {
9565
+ env[envVar] = credentialData[credField] || "";
9566
+ }
9567
+ });
9568
+ serverConfig = {
9569
+ command: command.trim()
9570
+ };
9571
+ if (argsArray.length > 0) serverConfig.args = argsArray;
9572
+ if (Object.keys(env).length > 0) serverConfig.env = env;
9573
+ } else {
9574
+ // streamable_http
9575
+ serverConfig = {
9576
+ url: url.trim()
9577
+ };
9578
+ var headers = {};
9579
+ headerRows.forEach(function (row) {
9580
+ var hName = row.headerName.trim();
9581
+ var hValue = row.headerValue.trim();
9582
+ if (hName && hValue) {
9583
+ headers[hName] = hValue;
9584
+ }
9585
+ });
9586
+ if (Object.keys(headers).length > 0) serverConfig.headers = headers;
9587
+ }
9588
+ return JSON.stringify({
9589
+ mcpServers: _defineProperty({}, name || "server-name", serverConfig)
9590
+ }, null, 2);
9591
+ }
9592
+
9593
+ /**
9594
+ * Parse a standard MCP JSON config string back into form state.
9595
+ *
9596
+ * Accepts:
9597
+ * - { "mcpServers": { "name": { ... } } }
9598
+ * - Bare server config: { "command": ..., "args": [...] }
9599
+ *
9600
+ * @param {string} jsonString - The JSON to parse
9601
+ * @param {Function} nextRowId - Function that returns a unique row ID
9602
+ * @returns {{ providerName, transport, command, args, envMappingRows, url, headerRows, credentialData, error }}
9603
+ */
9604
+ function mcpJsonToFormState(jsonString, nextRowId) {
9605
+ var parsed;
9606
+ try {
9607
+ parsed = JSON.parse(jsonString);
9608
+ } catch (e) {
9609
+ return {
9610
+ error: "Invalid JSON: ".concat(e.message)
9611
+ };
9612
+ }
9613
+ var providerName = "";
9614
+ var serverConfig;
9615
+ if (parsed.mcpServers && _typeof(parsed.mcpServers) === "object") {
9616
+ var entries = Object.entries(parsed.mcpServers);
9617
+ if (entries.length === 0) {
9618
+ return {
9619
+ error: "No server found in mcpServers"
9620
+ };
9621
+ }
9622
+ var _entries$ = _slicedToArray(entries[0], 2);
9623
+ providerName = _entries$[0];
9624
+ serverConfig = _entries$[1];
9625
+ } else if (parsed.command || parsed.url) {
9626
+ serverConfig = parsed;
9627
+ } else {
9628
+ return {
9629
+ error: "Unrecognized format: expected mcpServers object or bare server config"
9630
+ };
9631
+ }
9632
+ var isHttp = !!serverConfig.url;
9633
+ var transport = isHttp ? "streamable_http" : "stdio";
9634
+ var result = {
9635
+ providerName: providerName,
9636
+ transport: transport,
9637
+ command: "",
9638
+ args: "",
9639
+ envMappingRows: [],
9640
+ url: "",
9641
+ headerRows: [],
9642
+ credentialData: {},
9643
+ error: null
9644
+ };
9645
+ if (transport === "stdio") {
9646
+ result.command = serverConfig.command || "";
9647
+ result.args = (serverConfig.args || []).join(" ");
9648
+ if (serverConfig.env && _typeof(serverConfig.env) === "object") {
9649
+ Object.entries(serverConfig.env).forEach(function (_ref5) {
9650
+ var _ref6 = _slicedToArray(_ref5, 2),
9651
+ envVar = _ref6[0],
9652
+ value = _ref6[1];
9653
+ result.envMappingRows.push({
9654
+ id: nextRowId(),
9655
+ envVar: envVar,
9656
+ credField: envVar
9657
+ });
9658
+ result.credentialData[envVar] = value || "";
9659
+ });
9660
+ }
9661
+ } else {
9662
+ result.url = serverConfig.url || "";
9663
+ var headers = serverConfig.headers || serverConfig.headerTemplate || {};
9664
+ if (_typeof(headers) === "object") {
9665
+ Object.entries(headers).forEach(function (_ref7) {
9666
+ var _ref8 = _slicedToArray(_ref7, 2),
9667
+ headerName = _ref8[0],
9668
+ headerValue = _ref8[1];
9669
+ result.headerRows.push({
9670
+ id: nextRowId(),
9671
+ headerName: headerName,
9672
+ headerValue: headerValue
9673
+ });
9674
+ });
9675
+ }
9676
+ }
9677
+ return result;
9678
+ }
9679
+
9529
9680
  function ownKeys$p(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; }
9530
9681
  function _objectSpread$p(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$p(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$p(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9531
9682
  var AdvancedMcpConfig = function AdvancedMcpConfig(_ref) {
@@ -26215,29 +26366,57 @@ function buildMcpConfig(transport, _ref) {
26215
26366
  *
26216
26367
  * Form for configuring a custom MCP server (not from the catalog).
26217
26368
  * Supports stdio and streamable_http transports with dynamic field derivation.
26369
+ * Used for both creating new and editing existing MCP providers.
26218
26370
  *
26219
26371
  * @param {Function} onSave - (providerName, providerType, credentials, mcpConfig) => void
26220
- * @param {Function} onBack - Called when the user wants to return to the catalog
26372
+ * @param {Function} onBack - Called when the user wants to return
26373
+ * @param {boolean} isEditMode - Whether we're editing an existing provider
26374
+ * @param {string} initialName - Pre-populated provider name (edit mode)
26375
+ * @param {string} initialTransport - Pre-populated transport type (edit mode)
26376
+ * @param {string} initialCommand - Pre-populated command (edit mode)
26377
+ * @param {string} initialArgs - Pre-populated args string (edit mode)
26378
+ * @param {Array} initialEnvMappingRows - Pre-populated env mapping rows (edit mode)
26379
+ * @param {string} initialUrl - Pre-populated URL (edit mode)
26380
+ * @param {Array} initialHeaderRows - Pre-populated header rows (edit mode)
26381
+ * @param {object} initialCredentials - Pre-populated credential values (edit mode)
26221
26382
  */
26222
26383
  var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26223
26384
  var _testResult$tools;
26224
26385
  var onSave = _ref2.onSave,
26225
- onBack = _ref2.onBack;
26386
+ onBack = _ref2.onBack,
26387
+ _ref2$isEditMode = _ref2.isEditMode,
26388
+ isEditMode = _ref2$isEditMode === void 0 ? false : _ref2$isEditMode,
26389
+ _ref2$initialName = _ref2.initialName,
26390
+ initialName = _ref2$initialName === void 0 ? "" : _ref2$initialName,
26391
+ _ref2$initialTranspor = _ref2.initialTransport,
26392
+ initialTransport = _ref2$initialTranspor === void 0 ? "stdio" : _ref2$initialTranspor,
26393
+ _ref2$initialCommand = _ref2.initialCommand,
26394
+ initialCommand = _ref2$initialCommand === void 0 ? "" : _ref2$initialCommand,
26395
+ _ref2$initialArgs = _ref2.initialArgs,
26396
+ initialArgs = _ref2$initialArgs === void 0 ? "" : _ref2$initialArgs,
26397
+ _ref2$initialEnvMappi = _ref2.initialEnvMappingRows,
26398
+ initialEnvMappingRows = _ref2$initialEnvMappi === void 0 ? [] : _ref2$initialEnvMappi,
26399
+ _ref2$initialUrl = _ref2.initialUrl,
26400
+ initialUrl = _ref2$initialUrl === void 0 ? "" : _ref2$initialUrl,
26401
+ _ref2$initialHeaderRo = _ref2.initialHeaderRows,
26402
+ initialHeaderRows = _ref2$initialHeaderRo === void 0 ? [] : _ref2$initialHeaderRo,
26403
+ _ref2$initialCredenti = _ref2.initialCredentials,
26404
+ initialCredentials = _ref2$initialCredenti === void 0 ? {} : _ref2$initialCredenti;
26226
26405
  var appContext = useContext(AppContext);
26227
26406
  var dashApi = appContext === null || appContext === void 0 ? void 0 : appContext.dashApi;
26228
26407
 
26229
26408
  // Transport selection
26230
- var _useState = useState("stdio"),
26409
+ var _useState = useState(initialTransport),
26231
26410
  _useState2 = _slicedToArray(_useState, 2),
26232
26411
  transport = _useState2[0],
26233
26412
  setTransport = _useState2[1];
26234
26413
 
26235
26414
  // Common
26236
- var _useState3 = useState(""),
26415
+ var _useState3 = useState(initialName),
26237
26416
  _useState4 = _slicedToArray(_useState3, 2),
26238
26417
  providerName = _useState4[0],
26239
26418
  setProviderName = _useState4[1];
26240
- var _useState5 = useState({}),
26419
+ var _useState5 = useState(initialCredentials),
26241
26420
  _useState6 = _slicedToArray(_useState5, 2),
26242
26421
  credentialData = _useState6[0],
26243
26422
  setCredentialData = _useState6[1];
@@ -26255,34 +26434,51 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26255
26434
  setTestResult = _useState10[1];
26256
26435
 
26257
26436
  // stdio fields
26258
- var _useState11 = useState(""),
26437
+ var _useState11 = useState(initialCommand),
26259
26438
  _useState12 = _slicedToArray(_useState11, 2),
26260
26439
  command = _useState12[0],
26261
26440
  setCommand = _useState12[1];
26262
- var _useState13 = useState(""),
26441
+ var _useState13 = useState(initialArgs),
26263
26442
  _useState14 = _slicedToArray(_useState13, 2),
26264
26443
  args = _useState14[0],
26265
26444
  setArgs = _useState14[1];
26266
- var _useState15 = useState([]),
26445
+ var _useState15 = useState(initialEnvMappingRows),
26267
26446
  _useState16 = _slicedToArray(_useState15, 2),
26268
26447
  envMappingRows = _useState16[0],
26269
26448
  setEnvMappingRows = _useState16[1];
26270
26449
 
26271
26450
  // HTTP fields
26272
- var _useState17 = useState(""),
26451
+ var _useState17 = useState(initialUrl),
26273
26452
  _useState18 = _slicedToArray(_useState17, 2),
26274
26453
  url = _useState18[0],
26275
26454
  setUrl = _useState18[1];
26276
- var _useState19 = useState([]),
26455
+ var _useState19 = useState(initialHeaderRows),
26277
26456
  _useState20 = _slicedToArray(_useState19, 2),
26278
26457
  headerRows = _useState20[0],
26279
26458
  setHeaderRows = _useState20[1];
26280
26459
 
26460
+ // JSON editor state
26461
+ var _useState21 = useState("form"),
26462
+ _useState22 = _slicedToArray(_useState21, 2),
26463
+ viewMode = _useState22[0],
26464
+ setViewMode = _useState22[1]; // "form" | "json"
26465
+ var _useState23 = useState(""),
26466
+ _useState24 = _slicedToArray(_useState23, 2),
26467
+ jsonText = _useState24[0],
26468
+ setJsonText = _useState24[1];
26469
+ var _useState25 = useState(null),
26470
+ _useState26 = _slicedToArray(_useState25, 2),
26471
+ jsonError = _useState26[0],
26472
+ setJsonError = _useState26[1];
26473
+
26281
26474
  // Clear credential data when transport changes (derived fields change entirely)
26475
+ // Only in create mode — in edit mode the initial transport is set correctly
26282
26476
  useEffect(function () {
26283
- setCredentialData({});
26284
- setTestResult(null);
26285
- }, [transport]);
26477
+ if (!isEditMode) {
26478
+ setCredentialData({});
26479
+ setTestResult(null);
26480
+ }
26481
+ }, [transport, isEditMode]);
26286
26482
 
26287
26483
  // Build mcpConfig from current state
26288
26484
  var mcpConfig = useMemo(function () {
@@ -26364,6 +26560,38 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26364
26560
  }
26365
26561
  };
26366
26562
 
26563
+ // --- JSON toggle handlers ---
26564
+ var handleSwitchToJson = function handleSwitchToJson() {
26565
+ var json = formStateToMcpJson(providerName, transport, {
26566
+ command: command,
26567
+ args: args,
26568
+ envMappingRows: envMappingRows,
26569
+ url: url,
26570
+ headerRows: headerRows,
26571
+ credentialData: credentialData
26572
+ });
26573
+ setJsonText(json);
26574
+ setJsonError(null);
26575
+ setViewMode("json");
26576
+ };
26577
+ var handleSwitchToForm = function handleSwitchToForm() {
26578
+ var result = mcpJsonToFormState(jsonText, nextRowId);
26579
+ if (result.error) {
26580
+ setJsonError(result.error);
26581
+ return;
26582
+ }
26583
+ setProviderName(result.providerName || providerName);
26584
+ setTransport(result.transport);
26585
+ setCommand(result.command);
26586
+ setArgs(result.args);
26587
+ setEnvMappingRows(result.envMappingRows);
26588
+ setUrl(result.url);
26589
+ setHeaderRows(result.headerRows);
26590
+ setCredentialData(result.credentialData);
26591
+ setJsonError(null);
26592
+ setViewMode("form");
26593
+ };
26594
+
26367
26595
  // --- validation ---
26368
26596
  var validateForm = function validateForm() {
26369
26597
  var errors = {};
@@ -26423,6 +26651,28 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26423
26651
 
26424
26652
  // --- save ---
26425
26653
  var handleSave = function handleSave() {
26654
+ // If in JSON mode, parse JSON first to update form state
26655
+ if (viewMode === "json") {
26656
+ var result = mcpJsonToFormState(jsonText, nextRowId);
26657
+ if (result.error) {
26658
+ setJsonError(result.error);
26659
+ return;
26660
+ }
26661
+ var name = (result.providerName || providerName || "").trim();
26662
+ if (!name) {
26663
+ setJsonError("Provider name is required");
26664
+ return;
26665
+ }
26666
+ var config = buildMcpConfig(result.transport, {
26667
+ command: result.command,
26668
+ args: result.args,
26669
+ envMappingRows: result.envMappingRows,
26670
+ url: result.url,
26671
+ headerRows: result.headerRows
26672
+ });
26673
+ onSave(name, "custom", result.credentialData, config);
26674
+ return;
26675
+ }
26426
26676
  if (!validateForm()) return;
26427
26677
  onSave(providerName.trim(), "custom", credentialData, mcpConfig);
26428
26678
  };
@@ -26441,58 +26691,11 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26441
26691
  })
26442
26692
  }), /*#__PURE__*/jsxs("div", {
26443
26693
  children: [/*#__PURE__*/jsx(SubHeading3, {
26444
- title: "Configure Custom MCP Server",
26694
+ title: isEditMode ? "Edit MCP Server" : "Configure Custom MCP Server",
26445
26695
  padding: false
26446
26696
  }), /*#__PURE__*/jsx("p", {
26447
26697
  className: "text-sm opacity-50 mt-1",
26448
- children: "Define a custom MCP server connection"
26449
- })]
26450
- })]
26451
- }), /*#__PURE__*/jsxs("div", {
26452
- className: "space-y-2",
26453
- children: [/*#__PURE__*/jsx("p", {
26454
- className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26455
- children: "Transport Type"
26456
- }), /*#__PURE__*/jsxs("div", {
26457
- className: "grid grid-cols-2 gap-3",
26458
- children: [/*#__PURE__*/jsxs(Card2, {
26459
- hover: true,
26460
- selected: transport === "stdio",
26461
- onClick: function onClick() {
26462
- return setTransport("stdio");
26463
- },
26464
- className: "text-left",
26465
- children: [/*#__PURE__*/jsxs("div", {
26466
- className: "flex items-center gap-2 mb-1",
26467
- children: [/*#__PURE__*/jsx(Icon2, {
26468
- icon: "terminal"
26469
- }), /*#__PURE__*/jsx("span", {
26470
- className: "font-semibold text-sm",
26471
- children: "Local Process (stdio)"
26472
- })]
26473
- }), /*#__PURE__*/jsx("p", {
26474
- className: "text-xs opacity-50",
26475
- children: "Spawn a local command as a child process"
26476
- })]
26477
- }), /*#__PURE__*/jsxs(Card2, {
26478
- hover: true,
26479
- selected: transport === "streamable_http",
26480
- onClick: function onClick() {
26481
- return setTransport("streamable_http");
26482
- },
26483
- className: "text-left",
26484
- children: [/*#__PURE__*/jsxs("div", {
26485
- className: "flex items-center gap-2 mb-1",
26486
- children: [/*#__PURE__*/jsx(Icon2, {
26487
- icon: "globe"
26488
- }), /*#__PURE__*/jsx("span", {
26489
- className: "font-semibold text-sm",
26490
- children: "Remote Server (HTTP)"
26491
- })]
26492
- }), /*#__PURE__*/jsx("p", {
26493
- className: "text-xs opacity-50",
26494
- children: "Connect to a remote MCP server via HTTP"
26495
- })]
26698
+ children: isEditMode ? "Modify this MCP server configuration" : "Define a custom MCP server connection"
26496
26699
  })]
26497
26700
  })]
26498
26701
  }), /*#__PURE__*/jsxs("div", {
@@ -26520,231 +26723,315 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26520
26723
  className: "text-sm text-red-400",
26521
26724
  children: formErrors.providerName
26522
26725
  })]
26523
- }), transport === "stdio" && /*#__PURE__*/jsxs("div", {
26524
- className: "space-y-4",
26525
- children: [/*#__PURE__*/jsx("div", {
26526
- className: "border-t border-white/10 pt-4",
26527
- children: /*#__PURE__*/jsx("p", {
26726
+ }), /*#__PURE__*/jsxs("div", {
26727
+ className: "flex items-center gap-1",
26728
+ children: [/*#__PURE__*/jsx("button", {
26729
+ onClick: function onClick() {
26730
+ if (viewMode === "json") handleSwitchToForm();
26731
+ },
26732
+ className: "px-3 py-1 text-xs font-medium rounded-l transition-colors ".concat(viewMode === "form" ? "bg-white/10 text-white" : "text-white/50 hover:text-white/70"),
26733
+ children: "Form"
26734
+ }), /*#__PURE__*/jsx("button", {
26735
+ onClick: function onClick() {
26736
+ if (viewMode === "form") handleSwitchToJson();
26737
+ },
26738
+ className: "px-3 py-1 text-xs font-medium rounded-r transition-colors ".concat(viewMode === "json" ? "bg-white/10 text-white" : "text-white/50 hover:text-white/70"),
26739
+ children: "JSON"
26740
+ })]
26741
+ }), jsonError && /*#__PURE__*/jsx("p", {
26742
+ className: "text-sm text-red-400",
26743
+ children: jsonError
26744
+ }), viewMode === "json" && /*#__PURE__*/jsxs("div", {
26745
+ className: "space-y-2",
26746
+ children: [/*#__PURE__*/jsx("p", {
26747
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26748
+ children: "MCP Server Configuration (JSON)"
26749
+ }), /*#__PURE__*/jsx("p", {
26750
+ className: "text-sm opacity-50",
26751
+ children: "Paste a standard MCP config JSON (compatible with Claude Desktop, Cursor, etc.)"
26752
+ }), /*#__PURE__*/jsx(CodeEditorInline, {
26753
+ code: jsonText,
26754
+ setCode: function setCode(val) {
26755
+ setJsonText(val);
26756
+ setJsonError(null);
26757
+ },
26758
+ language: "json",
26759
+ placeholder: '{\n "mcpServers": {\n "server-name": {\n "command": "npx",\n "args": ["-y", "package-name"],\n "env": {\n "API_KEY": "your-key"\n }\n }\n }\n}'
26760
+ })]
26761
+ }), viewMode === "form" && /*#__PURE__*/jsxs(Fragment, {
26762
+ children: [/*#__PURE__*/jsxs("div", {
26763
+ className: "space-y-2",
26764
+ children: [/*#__PURE__*/jsx("p", {
26528
26765
  className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26529
- children: "Process Configuration"
26530
- })
26531
- }), /*#__PURE__*/jsxs("div", {
26532
- className: "flex flex-col gap-2",
26533
- children: [/*#__PURE__*/jsx(FormLabel, {
26534
- label: "Command",
26535
- required: true
26536
- }), /*#__PURE__*/jsx("p", {
26537
- className: "text-sm opacity-50",
26538
- children: "The executable to run (e.g., npx, node, python)"
26539
- }), /*#__PURE__*/jsx(InputText, {
26540
- value: command,
26541
- onChange: function onChange(value) {
26542
- setCommand(value);
26543
- if (formErrors.command && value !== null && value !== void 0 && value.trim()) {
26544
- setFormErrors(function (prev) {
26545
- var next = _objectSpread$5({}, prev);
26546
- delete next.command;
26547
- return next;
26548
- });
26549
- }
26550
- },
26551
- placeholder: "e.g., npx"
26552
- }), formErrors.command && /*#__PURE__*/jsx("p", {
26553
- className: "text-sm text-red-400",
26554
- children: formErrors.command
26555
- })]
26556
- }), /*#__PURE__*/jsxs("div", {
26557
- className: "flex flex-col gap-2",
26558
- children: [/*#__PURE__*/jsx(FormLabel, {
26559
- label: "Arguments"
26560
- }), /*#__PURE__*/jsx("p", {
26561
- className: "text-sm opacity-50",
26562
- children: "Space-separated arguments passed to the command"
26563
- }), /*#__PURE__*/jsx(InputText, {
26564
- value: args,
26565
- onChange: setArgs,
26566
- placeholder: "e.g., -y @modelcontextprotocol/server-github"
26567
- })]
26568
- }), /*#__PURE__*/jsxs("div", {
26569
- className: "space-y-3",
26570
- children: [/*#__PURE__*/jsx("div", {
26571
- className: "flex items-center justify-between",
26572
- children: /*#__PURE__*/jsxs("div", {
26573
- children: [/*#__PURE__*/jsx(FormLabel, {
26574
- label: "Environment Variable Mapping"
26766
+ children: "Transport Type"
26767
+ }), /*#__PURE__*/jsxs("div", {
26768
+ className: "grid grid-cols-2 gap-3",
26769
+ children: [/*#__PURE__*/jsxs(Card2, {
26770
+ hover: true,
26771
+ selected: transport === "stdio",
26772
+ onClick: function onClick() {
26773
+ return setTransport("stdio");
26774
+ },
26775
+ className: "text-left",
26776
+ children: [/*#__PURE__*/jsxs("div", {
26777
+ className: "flex items-center gap-2 mb-1",
26778
+ children: [/*#__PURE__*/jsx(Icon2, {
26779
+ icon: "terminal"
26780
+ }), /*#__PURE__*/jsx("span", {
26781
+ className: "font-semibold text-sm",
26782
+ children: "Local Process (stdio)"
26783
+ })]
26575
26784
  }), /*#__PURE__*/jsx("p", {
26576
- className: "text-sm opacity-50 mt-1",
26577
- children: "Map environment variables to credential fields"
26785
+ className: "text-xs opacity-50",
26786
+ children: "Spawn a local command as a child process"
26578
26787
  })]
26788
+ }), /*#__PURE__*/jsxs(Card2, {
26789
+ hover: true,
26790
+ selected: transport === "streamable_http",
26791
+ onClick: function onClick() {
26792
+ return setTransport("streamable_http");
26793
+ },
26794
+ className: "text-left",
26795
+ children: [/*#__PURE__*/jsxs("div", {
26796
+ className: "flex items-center gap-2 mb-1",
26797
+ children: [/*#__PURE__*/jsx(Icon2, {
26798
+ icon: "globe"
26799
+ }), /*#__PURE__*/jsx("span", {
26800
+ className: "font-semibold text-sm",
26801
+ children: "Remote Server (HTTP)"
26802
+ })]
26803
+ }), /*#__PURE__*/jsx("p", {
26804
+ className: "text-xs opacity-50",
26805
+ children: "Connect to a remote MCP server via HTTP"
26806
+ })]
26807
+ })]
26808
+ })]
26809
+ }), transport === "stdio" && /*#__PURE__*/jsxs("div", {
26810
+ className: "space-y-4",
26811
+ children: [/*#__PURE__*/jsx("div", {
26812
+ className: "border-t border-white/10 pt-4",
26813
+ children: /*#__PURE__*/jsx("p", {
26814
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26815
+ children: "Process Configuration"
26579
26816
  })
26580
- }), envMappingRows.map(function (row) {
26581
- return /*#__PURE__*/jsxs("div", {
26582
- className: "flex items-center gap-2",
26583
- children: [/*#__PURE__*/jsx("div", {
26584
- className: "flex-1",
26585
- children: /*#__PURE__*/jsx(InputText, {
26586
- value: row.envVar,
26587
- onChange: function onChange(value) {
26588
- return updateEnvRow(row.id, "envVar", value);
26817
+ }), /*#__PURE__*/jsxs("div", {
26818
+ className: "flex flex-col gap-2",
26819
+ children: [/*#__PURE__*/jsx(FormLabel, {
26820
+ label: "Command",
26821
+ required: true
26822
+ }), /*#__PURE__*/jsx("p", {
26823
+ className: "text-sm opacity-50",
26824
+ children: "The executable to run (e.g., npx, node, python)"
26825
+ }), /*#__PURE__*/jsx(InputText, {
26826
+ value: command,
26827
+ onChange: function onChange(value) {
26828
+ setCommand(value);
26829
+ if (formErrors.command && value !== null && value !== void 0 && value.trim()) {
26830
+ setFormErrors(function (prev) {
26831
+ var next = _objectSpread$5({}, prev);
26832
+ delete next.command;
26833
+ return next;
26834
+ });
26835
+ }
26836
+ },
26837
+ placeholder: "e.g., npx"
26838
+ }), formErrors.command && /*#__PURE__*/jsx("p", {
26839
+ className: "text-sm text-red-400",
26840
+ children: formErrors.command
26841
+ })]
26842
+ }), /*#__PURE__*/jsxs("div", {
26843
+ className: "flex flex-col gap-2",
26844
+ children: [/*#__PURE__*/jsx(FormLabel, {
26845
+ label: "Arguments"
26846
+ }), /*#__PURE__*/jsx("p", {
26847
+ className: "text-sm opacity-50",
26848
+ children: "Space-separated arguments passed to the command"
26849
+ }), /*#__PURE__*/jsx(InputText, {
26850
+ value: args,
26851
+ onChange: setArgs,
26852
+ placeholder: "e.g., -y @modelcontextprotocol/server-github"
26853
+ })]
26854
+ }), /*#__PURE__*/jsxs("div", {
26855
+ className: "space-y-3",
26856
+ children: [/*#__PURE__*/jsx("div", {
26857
+ className: "flex items-center justify-between",
26858
+ children: /*#__PURE__*/jsxs("div", {
26859
+ children: [/*#__PURE__*/jsx(FormLabel, {
26860
+ label: "Environment Variable Mapping"
26861
+ }), /*#__PURE__*/jsx("p", {
26862
+ className: "text-sm opacity-50 mt-1",
26863
+ children: "Map environment variables to credential fields"
26864
+ })]
26865
+ })
26866
+ }), envMappingRows.map(function (row) {
26867
+ return /*#__PURE__*/jsxs("div", {
26868
+ className: "flex items-center gap-2",
26869
+ children: [/*#__PURE__*/jsx("div", {
26870
+ className: "flex-1",
26871
+ children: /*#__PURE__*/jsx(InputText, {
26872
+ value: row.envVar,
26873
+ onChange: function onChange(value) {
26874
+ return updateEnvRow(row.id, "envVar", value);
26875
+ },
26876
+ placeholder: "ENV_VAR_NAME"
26877
+ })
26878
+ }), /*#__PURE__*/jsx("span", {
26879
+ className: "opacity-30 text-sm shrink-0",
26880
+ children: "\u2192"
26881
+ }), /*#__PURE__*/jsx("div", {
26882
+ className: "flex-1",
26883
+ children: /*#__PURE__*/jsx(InputText, {
26884
+ value: row.credField,
26885
+ onChange: function onChange(value) {
26886
+ return updateEnvRow(row.id, "credField", value);
26887
+ },
26888
+ placeholder: "credentialField"
26889
+ })
26890
+ }), /*#__PURE__*/jsx("button", {
26891
+ onClick: function onClick() {
26892
+ return removeEnvRow(row.id);
26589
26893
  },
26590
- placeholder: "ENV_VAR_NAME"
26591
- })
26894
+ className: "text-gray-500 hover:text-red-400 transition-colors shrink-0",
26895
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
26896
+ icon: "times",
26897
+ className: "text-sm"
26898
+ })
26899
+ })]
26900
+ }, row.id);
26901
+ }), /*#__PURE__*/jsxs("button", {
26902
+ onClick: addEnvRow,
26903
+ className: "text-sm text-blue-400 hover:text-blue-300 transition-colors flex items-center gap-1",
26904
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
26905
+ icon: "plus",
26906
+ className: "text-xs"
26592
26907
  }), /*#__PURE__*/jsx("span", {
26593
- className: "opacity-30 text-sm shrink-0",
26594
- children: "\u2192"
26595
- }), /*#__PURE__*/jsx("div", {
26596
- className: "flex-1",
26597
- children: /*#__PURE__*/jsx(InputText, {
26598
- value: row.credField,
26599
- onChange: function onChange(value) {
26600
- return updateEnvRow(row.id, "credField", value);
26601
- },
26602
- placeholder: "credentialField"
26603
- })
26604
- }), /*#__PURE__*/jsx("button", {
26605
- onClick: function onClick() {
26606
- return removeEnvRow(row.id);
26607
- },
26608
- className: "text-gray-500 hover:text-red-400 transition-colors shrink-0",
26609
- children: /*#__PURE__*/jsx(FontAwesomeIcon, {
26610
- icon: "times",
26611
- className: "text-sm"
26612
- })
26908
+ children: "Add Environment Variable"
26613
26909
  })]
26614
- }, row.id);
26615
- }), /*#__PURE__*/jsxs("button", {
26616
- onClick: addEnvRow,
26617
- className: "text-sm text-blue-400 hover:text-blue-300 transition-colors flex items-center gap-1",
26618
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
26619
- icon: "plus",
26620
- className: "text-xs"
26621
- }), /*#__PURE__*/jsx("span", {
26622
- children: "Add Environment Variable"
26623
26910
  })]
26624
26911
  })]
26625
- })]
26626
- }), transport === "streamable_http" && /*#__PURE__*/jsxs("div", {
26627
- className: "space-y-4",
26628
- children: [/*#__PURE__*/jsx("div", {
26629
- className: "border-t border-white/10 pt-4",
26630
- children: /*#__PURE__*/jsx("p", {
26631
- className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26632
- children: "Server Configuration"
26633
- })
26634
- }), /*#__PURE__*/jsxs("div", {
26635
- className: "flex flex-col gap-2",
26636
- children: [/*#__PURE__*/jsx(FormLabel, {
26637
- label: "Server URL",
26638
- required: true
26639
- }), /*#__PURE__*/jsxs("p", {
26640
- className: "text-sm opacity-50",
26641
- children: ["Use", " ", /*#__PURE__*/jsx("code", {
26642
- className: "text-xs bg-white/10 px-1 py-0.5 rounded",
26643
- children: "{{fieldName}}"
26644
- }), " ", "for values provided as credentials"]
26645
- }), /*#__PURE__*/jsx(InputText, {
26646
- value: url,
26647
- onChange: function onChange(value) {
26648
- setUrl(value);
26649
- if (formErrors.url && value !== null && value !== void 0 && value.trim()) {
26650
- setFormErrors(function (prev) {
26651
- var next = _objectSpread$5({}, prev);
26652
- delete next.url;
26653
- return next;
26654
- });
26655
- }
26656
- },
26657
- placeholder: "e.g., https://mcp.example.com/sse"
26658
- }), formErrors.url && /*#__PURE__*/jsx("p", {
26659
- className: "text-sm text-red-400",
26660
- children: formErrors.url
26661
- })]
26662
- }), /*#__PURE__*/jsxs("div", {
26663
- className: "space-y-3",
26664
- children: [/*#__PURE__*/jsxs("div", {
26912
+ }), transport === "streamable_http" && /*#__PURE__*/jsxs("div", {
26913
+ className: "space-y-4",
26914
+ children: [/*#__PURE__*/jsx("div", {
26915
+ className: "border-t border-white/10 pt-4",
26916
+ children: /*#__PURE__*/jsx("p", {
26917
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26918
+ children: "Server Configuration"
26919
+ })
26920
+ }), /*#__PURE__*/jsxs("div", {
26921
+ className: "flex flex-col gap-2",
26665
26922
  children: [/*#__PURE__*/jsx(FormLabel, {
26666
- label: "Request Headers"
26923
+ label: "Server URL",
26924
+ required: true
26667
26925
  }), /*#__PURE__*/jsxs("p", {
26668
- className: "text-sm opacity-50 mt-1",
26926
+ className: "text-sm opacity-50",
26669
26927
  children: ["Use", " ", /*#__PURE__*/jsx("code", {
26670
26928
  className: "text-xs bg-white/10 px-1 py-0.5 rounded",
26671
26929
  children: "{{fieldName}}"
26672
- }), " ", "in values for credential placeholders"]
26930
+ }), " ", "for values provided as credentials"]
26931
+ }), /*#__PURE__*/jsx(InputText, {
26932
+ value: url,
26933
+ onChange: function onChange(value) {
26934
+ setUrl(value);
26935
+ if (formErrors.url && value !== null && value !== void 0 && value.trim()) {
26936
+ setFormErrors(function (prev) {
26937
+ var next = _objectSpread$5({}, prev);
26938
+ delete next.url;
26939
+ return next;
26940
+ });
26941
+ }
26942
+ },
26943
+ placeholder: "e.g., https://mcp.example.com/sse"
26944
+ }), formErrors.url && /*#__PURE__*/jsx("p", {
26945
+ className: "text-sm text-red-400",
26946
+ children: formErrors.url
26673
26947
  })]
26674
- }), headerRows.map(function (row) {
26675
- return /*#__PURE__*/jsxs("div", {
26676
- className: "flex items-center gap-2",
26677
- children: [/*#__PURE__*/jsx("div", {
26678
- className: "flex-1",
26679
- children: /*#__PURE__*/jsx(InputText, {
26680
- value: row.headerName,
26681
- onChange: function onChange(value) {
26682
- return updateHeaderRow(row.id, "headerName", value);
26948
+ }), /*#__PURE__*/jsxs("div", {
26949
+ className: "space-y-3",
26950
+ children: [/*#__PURE__*/jsxs("div", {
26951
+ children: [/*#__PURE__*/jsx(FormLabel, {
26952
+ label: "Request Headers"
26953
+ }), /*#__PURE__*/jsxs("p", {
26954
+ className: "text-sm opacity-50 mt-1",
26955
+ children: ["Use", " ", /*#__PURE__*/jsx("code", {
26956
+ className: "text-xs bg-white/10 px-1 py-0.5 rounded",
26957
+ children: "{{fieldName}}"
26958
+ }), " ", "in values for credential placeholders"]
26959
+ })]
26960
+ }), headerRows.map(function (row) {
26961
+ return /*#__PURE__*/jsxs("div", {
26962
+ className: "flex items-center gap-2",
26963
+ children: [/*#__PURE__*/jsx("div", {
26964
+ className: "flex-1",
26965
+ children: /*#__PURE__*/jsx(InputText, {
26966
+ value: row.headerName,
26967
+ onChange: function onChange(value) {
26968
+ return updateHeaderRow(row.id, "headerName", value);
26969
+ },
26970
+ placeholder: "Header-Name"
26971
+ })
26972
+ }), /*#__PURE__*/jsx("span", {
26973
+ className: "opacity-30 text-sm shrink-0",
26974
+ children: ":"
26975
+ }), /*#__PURE__*/jsx("div", {
26976
+ className: "flex-1",
26977
+ children: /*#__PURE__*/jsx(InputText, {
26978
+ value: row.headerValue,
26979
+ onChange: function onChange(value) {
26980
+ return updateHeaderRow(row.id, "headerValue", value);
26981
+ },
26982
+ placeholder: "Bearer {{apiKey}}"
26983
+ })
26984
+ }), /*#__PURE__*/jsx("button", {
26985
+ onClick: function onClick() {
26986
+ return removeHeaderRow(row.id);
26683
26987
  },
26684
- placeholder: "Header-Name"
26685
- })
26988
+ className: "text-gray-500 hover:text-red-400 transition-colors shrink-0",
26989
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
26990
+ icon: "times",
26991
+ className: "text-sm"
26992
+ })
26993
+ })]
26994
+ }, row.id);
26995
+ }), /*#__PURE__*/jsxs("button", {
26996
+ onClick: addHeaderRow,
26997
+ className: "text-sm text-blue-400 hover:text-blue-300 transition-colors flex items-center gap-1",
26998
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
26999
+ icon: "plus",
27000
+ className: "text-xs"
26686
27001
  }), /*#__PURE__*/jsx("span", {
26687
- className: "opacity-30 text-sm shrink-0",
26688
- children: ":"
26689
- }), /*#__PURE__*/jsx("div", {
26690
- className: "flex-1",
26691
- children: /*#__PURE__*/jsx(InputText, {
26692
- value: row.headerValue,
26693
- onChange: function onChange(value) {
26694
- return updateHeaderRow(row.id, "headerValue", value);
26695
- },
26696
- placeholder: "Bearer {{apiKey}}"
26697
- })
26698
- }), /*#__PURE__*/jsx("button", {
26699
- onClick: function onClick() {
26700
- return removeHeaderRow(row.id);
26701
- },
26702
- className: "text-gray-500 hover:text-red-400 transition-colors shrink-0",
26703
- children: /*#__PURE__*/jsx(FontAwesomeIcon, {
26704
- icon: "times",
26705
- className: "text-sm"
26706
- })
27002
+ children: "Add Header"
26707
27003
  })]
26708
- }, row.id);
26709
- }), /*#__PURE__*/jsxs("button", {
26710
- onClick: addHeaderRow,
26711
- className: "text-sm text-blue-400 hover:text-blue-300 transition-colors flex items-center gap-1",
26712
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
26713
- icon: "plus",
26714
- className: "text-xs"
26715
- }), /*#__PURE__*/jsx("span", {
26716
- children: "Add Header"
26717
27004
  })]
26718
27005
  })]
26719
- })]
26720
- }), formFields.length > 0 && /*#__PURE__*/jsxs(Fragment, {
26721
- children: [/*#__PURE__*/jsxs("div", {
26722
- className: "border-t border-white/10 pt-4",
26723
- children: [/*#__PURE__*/jsx("p", {
26724
- className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
26725
- children: "Credentials"
26726
- }), /*#__PURE__*/jsx("p", {
26727
- className: "text-sm opacity-50 mt-1",
26728
- children: "Values for the fields referenced in your configuration above"
26729
- })]
26730
- }), formFields.map(function (field) {
26731
- return /*#__PURE__*/jsxs("div", {
26732
- className: "flex flex-col gap-2",
26733
- children: [/*#__PURE__*/jsx(FormLabel, {
26734
- label: field.displayName,
26735
- required: field.required
26736
- }), /*#__PURE__*/jsx(InputText, {
26737
- type: field.secret ? "password" : "text",
26738
- value: credentialData[field.key] || "",
26739
- onChange: function onChange(value) {
26740
- return handleCredentialChange(field.key, value);
26741
- },
26742
- placeholder: "Enter ".concat(field.displayName.toLowerCase())
26743
- }), formErrors[field.key] && /*#__PURE__*/jsx("p", {
26744
- className: "text-sm text-red-400",
26745
- children: formErrors[field.key]
27006
+ }), formFields.length > 0 && /*#__PURE__*/jsxs(Fragment, {
27007
+ children: [/*#__PURE__*/jsxs("div", {
27008
+ className: "border-t border-white/10 pt-4",
27009
+ children: [/*#__PURE__*/jsx("p", {
27010
+ className: "text-xs font-semibold opacity-40 uppercase tracking-wider",
27011
+ children: "Credentials"
27012
+ }), /*#__PURE__*/jsx("p", {
27013
+ className: "text-sm opacity-50 mt-1",
27014
+ children: "Values for the fields referenced in your configuration above"
26746
27015
  })]
26747
- }, field.key);
27016
+ }), formFields.map(function (field) {
27017
+ return /*#__PURE__*/jsxs("div", {
27018
+ className: "flex flex-col gap-2",
27019
+ children: [/*#__PURE__*/jsx(FormLabel, {
27020
+ label: field.displayName,
27021
+ required: field.required
27022
+ }), /*#__PURE__*/jsx(InputText, {
27023
+ type: field.secret ? "password" : "text",
27024
+ value: credentialData[field.key] || "",
27025
+ onChange: function onChange(value) {
27026
+ return handleCredentialChange(field.key, value);
27027
+ },
27028
+ placeholder: "Enter ".concat(field.displayName.toLowerCase())
27029
+ }), formErrors[field.key] && /*#__PURE__*/jsx("p", {
27030
+ className: "text-sm text-red-400",
27031
+ children: formErrors[field.key]
27032
+ })]
27033
+ }, field.key);
27034
+ })]
26748
27035
  })]
26749
27036
  }), testResult && /*#__PURE__*/jsxs("div", {
26750
27037
  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"),
@@ -26782,7 +27069,7 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26782
27069
  onClick: handleTestConnection,
26783
27070
  size: "sm"
26784
27071
  }), /*#__PURE__*/jsx(Button, {
26785
- title: "Save MCP Server",
27072
+ title: isEditMode ? "Save Changes" : "Save MCP Server",
26786
27073
  onClick: handleSave,
26787
27074
  size: "sm"
26788
27075
  })]
@@ -27350,6 +27637,16 @@ var ProvidersSection = function ProvidersSection(_ref) {
27350
27637
  _useState14 = _slicedToArray(_useState13, 2),
27351
27638
  isAddingMcp = _useState14[0],
27352
27639
  setIsAddingMcp = _useState14[1];
27640
+ var _useState15 = useState(false),
27641
+ _useState16 = _slicedToArray(_useState15, 2),
27642
+ isEditingMcp = _useState16[0],
27643
+ setIsEditingMcp = _useState16[1];
27644
+
27645
+ // Row ID counter for env/header rows in MCP edit mode
27646
+ var nextRowIdRef = useRef(0);
27647
+ var nextRowId = function nextRowId() {
27648
+ return "prov_row_".concat(++nextRowIdRef.current);
27649
+ };
27353
27650
  var providerEntries = Object.entries(providers);
27354
27651
  var appId = credentials === null || credentials === void 0 ? void 0 : credentials.appId;
27355
27652
 
@@ -27370,6 +27667,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27370
27667
  setFormCredentials({});
27371
27668
  setIsCreating(false);
27372
27669
  setIsEditing(false);
27670
+ setIsEditingMcp(false);
27373
27671
  }
27374
27672
  function handleSave() {
27375
27673
  if (!formName.trim() || !dashApi || !appId) return;
@@ -27392,11 +27690,17 @@ var ProvidersSection = function ProvidersSection(_ref) {
27392
27690
  }
27393
27691
  function handleStartEdit(name, provider) {
27394
27692
  setSelectedName(name);
27395
- setFormName(name);
27396
- setFormType(provider.type || "");
27397
- setFormCredentials(provider.credentials || {});
27398
- setIsEditing(true);
27399
27693
  setIsCreating(false);
27694
+ if (provider.providerClass === "mcp") {
27695
+ setIsEditingMcp(true);
27696
+ setIsEditing(false);
27697
+ } else {
27698
+ setFormName(name);
27699
+ setFormType(provider.type || "");
27700
+ setFormCredentials(provider.credentials || {});
27701
+ setIsEditing(true);
27702
+ setIsEditingMcp(false);
27703
+ }
27400
27704
  }
27401
27705
  function handleSaveEdit() {
27402
27706
  if (!formName.trim() || !dashApi || !appId) return;
@@ -27456,6 +27760,30 @@ var ProvidersSection = function ProvidersSection(_ref) {
27456
27760
  });
27457
27761
  }
27458
27762
 
27763
+ // Handle MCP provider editing via CustomMcpServerForm
27764
+ function handleMcpEditSave(providerName, providerType, mcpCredentials, mcpConfig) {
27765
+ if (!dashApi || !appId) return;
27766
+ var originalName = selectedName;
27767
+
27768
+ // Delete old if name changed
27769
+ if (originalName && originalName !== providerName) {
27770
+ dashApi.deleteProvider(appId, originalName, function () {}, function () {});
27771
+ }
27772
+ dashApi.saveProvider(appId, providerName, {
27773
+ providerType: providerType,
27774
+ credentials: mcpCredentials,
27775
+ providerClass: "mcp",
27776
+ mcpConfig: mcpConfig
27777
+ }, function () {
27778
+ setSelectedName(providerName);
27779
+ setIsEditingMcp(false);
27780
+ resetForm();
27781
+ refreshProviders && refreshProviders();
27782
+ }, function (e, err) {
27783
+ return (void 0);
27784
+ });
27785
+ }
27786
+
27459
27787
  // Respond to external create trigger from header
27460
27788
  var prevCreateRequested = useRef(false);
27461
27789
  useEffect(function () {
@@ -27574,6 +27902,23 @@ var ProvidersSection = function ProvidersSection(_ref) {
27574
27902
  setIsCreating(false);
27575
27903
  }
27576
27904
  });
27905
+ } else if (isEditingMcp && selectedName && selectedProvider) {
27906
+ var mc = selectedProvider.mcpConfig || {};
27907
+ detailContent = /*#__PURE__*/jsx(CustomMcpServerForm, {
27908
+ isEditMode: true,
27909
+ initialName: selectedName,
27910
+ initialTransport: mc.transport || "stdio",
27911
+ initialCommand: mc.command || "",
27912
+ initialArgs: (mc.args || []).join(" "),
27913
+ initialEnvMappingRows: envMappingToRows(mc.envMapping, nextRowId),
27914
+ initialUrl: mc.url || "",
27915
+ initialHeaderRows: headerTemplateToRows(mc.headerTemplate, nextRowId),
27916
+ initialCredentials: selectedProvider.credentials || {},
27917
+ onSave: handleMcpEditSave,
27918
+ onBack: function onBack() {
27919
+ return setIsEditingMcp(false);
27920
+ }
27921
+ });
27577
27922
  } else if (selectedName && selectedProvider) {
27578
27923
  detailContent = /*#__PURE__*/jsx(ProviderDetail, {
27579
27924
  providerName: selectedName,
@@ -33379,5 +33724,5 @@ var WorkspaceMenu = function WorkspaceMenu(_ref) {
33379
33724
 
33380
33725
  ComponentManager.registerContainerTypes(LayoutContainer, LayoutGridContainer);
33381
33726
 
33382
- 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, 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, 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 };
33727
+ 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 };
33383
33728
  //# sourceMappingURL=index.esm.js.map