@trops/dash-core 0.1.53 → 0.1.55

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
@@ -9527,18 +9527,29 @@ function headerTemplateToRows(headerTemplate, nextRowId) {
9527
9527
  }
9528
9528
 
9529
9529
  /**
9530
- * Serialize the current form state into a standard MCP JSON config string.
9530
+ * Serialize the current form state into a bare MCP JSON config string.
9531
9531
  *
9532
- * Output format:
9532
+ * Output format (stdio):
9533
9533
  * {
9534
- * "mcpServers": {
9535
- * "<name>": { "command": ..., "args": [...], "env": {...} }
9536
- * }
9534
+ * "type": "stdio",
9535
+ * "command": "npx",
9536
+ * "args": ["-y", "package-name"],
9537
+ * "env": { "API_KEY": "${API_KEY}" }
9538
+ * }
9539
+ *
9540
+ * Output format (HTTP):
9541
+ * {
9542
+ * "type": "streamable_http",
9543
+ * "url": "https://example.com/mcp",
9544
+ * "headerTemplate": { "Authorization": "Bearer {{apiKey}}" }
9537
9545
  * }
9538
9546
  *
9539
- * @param {string} name - The provider name
9547
+ * Credential values are NOT embedded env values use ${FIELD_NAME} syntax
9548
+ * to reference credential fields entered separately in the form.
9549
+ *
9550
+ * @param {string} name - The provider name (unused in output, kept for API compat)
9540
9551
  * @param {string} transport - "stdio" or "streamable_http"
9541
- * @param {object} fields - { command, args, envMappingRows, url, headerRows, credentialData }
9552
+ * @param {object} fields - { command, args, envMappingRows, url, headerRows }
9542
9553
  * @returns {string} Formatted JSON string
9543
9554
  */
9544
9555
  function formStateToMcpJson(name, transport, fields) {
@@ -9551,9 +9562,7 @@ function formStateToMcpJson(name, transport, fields) {
9551
9562
  _fields$url = fields.url,
9552
9563
  url = _fields$url === void 0 ? "" : _fields$url,
9553
9564
  _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;
9565
+ headerRows = _fields$headerRows === void 0 ? [] : _fields$headerRows;
9557
9566
  var serverConfig;
9558
9567
  if (transport === "stdio") {
9559
9568
  var argsArray = args.trim().split(/\s+/).filter(Boolean);
@@ -9561,11 +9570,12 @@ function formStateToMcpJson(name, transport, fields) {
9561
9570
  envMappingRows.forEach(function (row) {
9562
9571
  var envVar = row.envVar.trim();
9563
9572
  var credField = row.credField.trim();
9564
- if (envVar) {
9565
- env[envVar] = credentialData[credField] || "";
9573
+ if (envVar && credField) {
9574
+ env[envVar] = "${".concat(credField, "}");
9566
9575
  }
9567
9576
  });
9568
9577
  serverConfig = {
9578
+ type: "stdio",
9569
9579
  command: command.trim()
9570
9580
  };
9571
9581
  if (argsArray.length > 0) serverConfig.args = argsArray;
@@ -9573,29 +9583,36 @@ function formStateToMcpJson(name, transport, fields) {
9573
9583
  } else {
9574
9584
  // streamable_http
9575
9585
  serverConfig = {
9586
+ type: "streamable_http",
9576
9587
  url: url.trim()
9577
9588
  };
9578
- var headers = {};
9589
+ var headerTemplate = {};
9579
9590
  headerRows.forEach(function (row) {
9580
9591
  var hName = row.headerName.trim();
9581
9592
  var hValue = row.headerValue.trim();
9582
9593
  if (hName && hValue) {
9583
- headers[hName] = hValue;
9594
+ headerTemplate[hName] = hValue;
9584
9595
  }
9585
9596
  });
9586
- if (Object.keys(headers).length > 0) serverConfig.headers = headers;
9597
+ if (Object.keys(headerTemplate).length > 0) serverConfig.headerTemplate = headerTemplate;
9587
9598
  }
9588
- return JSON.stringify({
9589
- mcpServers: _defineProperty({}, name || "server-name", serverConfig)
9590
- }, null, 2);
9599
+ return JSON.stringify(serverConfig, null, 2);
9591
9600
  }
9592
9601
 
9593
9602
  /**
9594
- * Parse a standard MCP JSON config string back into form state.
9603
+ * Parse an MCP JSON config string back into form state.
9595
9604
  *
9596
- * Accepts:
9597
- * - { "mcpServers": { "name": { ... } } }
9598
- * - Bare server config: { "command": ..., "args": [...] }
9605
+ * Accepts multiple input formats:
9606
+ * - Bare config: { "command": ..., "args": [...], "env": { "KEY": "${FIELD}" } }
9607
+ * - Wrapped: { "mcpServers": { "name": { ... } } } — unwraps and uses key as providerName
9608
+ *
9609
+ * Transport detection:
9610
+ * - Explicit `type` or `transport` field
9611
+ * - Inferred: `url` present → streamable_http, `command` present → stdio
9612
+ *
9613
+ * stdio env value parsing:
9614
+ * - "${FIELD_NAME}" → envVar = key, credField = FIELD_NAME (reference syntax)
9615
+ * - "literal-value" → envVar = key, credField = key, credentialData[key] = value
9599
9616
  *
9600
9617
  * @param {string} jsonString - The JSON to parse
9601
9618
  * @param {Function} nextRowId - Function that returns a unique row ID
@@ -9622,15 +9639,22 @@ function mcpJsonToFormState(jsonString, nextRowId) {
9622
9639
  var _entries$ = _slicedToArray(entries[0], 2);
9623
9640
  providerName = _entries$[0];
9624
9641
  serverConfig = _entries$[1];
9625
- } else if (parsed.command || parsed.url) {
9642
+ } else if (parsed.command || parsed.url || parsed.type || parsed.transport) {
9626
9643
  serverConfig = parsed;
9627
9644
  } else {
9628
9645
  return {
9629
- error: "Unrecognized format: expected mcpServers object or bare server config"
9646
+ error: "Unrecognized format: expected a server config with command, url, or type"
9630
9647
  };
9631
9648
  }
9632
- var isHttp = !!serverConfig.url;
9633
- var transport = isHttp ? "streamable_http" : "stdio";
9649
+
9650
+ // Determine transport from type/transport field or infer from contents
9651
+ var explicitType = serverConfig.type || serverConfig.transport;
9652
+ var transport;
9653
+ if (explicitType) {
9654
+ transport = explicitType === "stdio" ? "stdio" : "streamable_http";
9655
+ } else {
9656
+ transport = serverConfig.url ? "streamable_http" : "stdio";
9657
+ }
9634
9658
  var result = {
9635
9659
  providerName: providerName,
9636
9660
  transport: transport,
@@ -9650,12 +9674,24 @@ function mcpJsonToFormState(jsonString, nextRowId) {
9650
9674
  var _ref6 = _slicedToArray(_ref5, 2),
9651
9675
  envVar = _ref6[0],
9652
9676
  value = _ref6[1];
9653
- result.envMappingRows.push({
9654
- id: nextRowId(),
9655
- envVar: envVar,
9656
- credField: envVar
9657
- });
9658
- result.credentialData[envVar] = value || "";
9677
+ // Check for ${FIELD_NAME} reference syntax
9678
+ var refMatch = typeof value === "string" && value.match(/^\$\{(.+)\}$/);
9679
+ if (refMatch) {
9680
+ // Reference syntax — credField is the extracted name, no credential value
9681
+ result.envMappingRows.push({
9682
+ id: nextRowId(),
9683
+ envVar: envVar,
9684
+ credField: refMatch[1]
9685
+ });
9686
+ } else {
9687
+ // Literal value — use envVar as credField and store the value
9688
+ result.envMappingRows.push({
9689
+ id: nextRowId(),
9690
+ envVar: envVar,
9691
+ credField: envVar
9692
+ });
9693
+ result.credentialData[envVar] = value || "";
9694
+ }
9659
9695
  });
9660
9696
  }
9661
9697
  } else {
@@ -26756,7 +26792,7 @@ var CustomMcpServerForm = function CustomMcpServerForm(_ref2) {
26756
26792
  setJsonError(null);
26757
26793
  },
26758
26794
  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}'
26795
+ placeholder: '{\n "type": "stdio",\n "command": "npx",\n "args": ["-y", "package-name"],\n "env": {\n "API_KEY": "${API_KEY}"\n }\n}'
26760
26796
  })]
26761
26797
  }), viewMode === "form" && /*#__PURE__*/jsxs(Fragment, {
26762
26798
  children: [/*#__PURE__*/jsxs("div", {
@@ -27605,42 +27641,46 @@ var ProvidersSection = function ProvidersSection(_ref) {
27605
27641
  var appContext = useContext(AppContext);
27606
27642
  var providers = (appContext === null || appContext === void 0 ? void 0 : appContext.providers) || {};
27607
27643
  var refreshProviders = appContext === null || appContext === void 0 ? void 0 : appContext.refreshProviders;
27608
- var _useState = useState(null),
27644
+ var _useState = useState("credentials"),
27609
27645
  _useState2 = _slicedToArray(_useState, 2),
27610
- selectedName = _useState2[0],
27611
- setSelectedName = _useState2[1];
27612
- var _useState3 = useState(false),
27646
+ providerTab = _useState2[0],
27647
+ setProviderTab = _useState2[1];
27648
+ var _useState3 = useState(null),
27613
27649
  _useState4 = _slicedToArray(_useState3, 2),
27614
- isCreating = _useState4[0],
27615
- setIsCreating = _useState4[1];
27650
+ selectedName = _useState4[0],
27651
+ setSelectedName = _useState4[1];
27616
27652
  var _useState5 = useState(false),
27617
27653
  _useState6 = _slicedToArray(_useState5, 2),
27618
- isEditing = _useState6[0],
27619
- setIsEditing = _useState6[1];
27620
- var _useState7 = useState(""),
27654
+ isCreating = _useState6[0],
27655
+ setIsCreating = _useState6[1];
27656
+ var _useState7 = useState(false),
27621
27657
  _useState8 = _slicedToArray(_useState7, 2),
27622
- formName = _useState8[0],
27623
- setFormName = _useState8[1];
27658
+ isEditing = _useState8[0],
27659
+ setIsEditing = _useState8[1];
27624
27660
  var _useState9 = useState(""),
27625
27661
  _useState0 = _slicedToArray(_useState9, 2),
27626
- formType = _useState0[0],
27627
- setFormType = _useState0[1];
27628
- var _useState1 = useState({}),
27662
+ formName = _useState0[0],
27663
+ setFormName = _useState0[1];
27664
+ var _useState1 = useState(""),
27629
27665
  _useState10 = _slicedToArray(_useState1, 2),
27630
- formCredentials = _useState10[0],
27631
- setFormCredentials = _useState10[1];
27632
- var _useState11 = useState(null),
27666
+ formType = _useState10[0],
27667
+ setFormType = _useState10[1];
27668
+ var _useState11 = useState({}),
27633
27669
  _useState12 = _slicedToArray(_useState11, 2),
27634
- deleteTarget = _useState12[0],
27635
- setDeleteTarget = _useState12[1];
27636
- var _useState13 = useState(false),
27670
+ formCredentials = _useState12[0],
27671
+ setFormCredentials = _useState12[1];
27672
+ var _useState13 = useState(null),
27637
27673
  _useState14 = _slicedToArray(_useState13, 2),
27638
- isAddingMcp = _useState14[0],
27639
- setIsAddingMcp = _useState14[1];
27674
+ deleteTarget = _useState14[0],
27675
+ setDeleteTarget = _useState14[1];
27640
27676
  var _useState15 = useState(false),
27641
27677
  _useState16 = _slicedToArray(_useState15, 2),
27642
- isEditingMcp = _useState16[0],
27643
- setIsEditingMcp = _useState16[1];
27678
+ isAddingMcp = _useState16[0],
27679
+ setIsAddingMcp = _useState16[1];
27680
+ var _useState17 = useState(false),
27681
+ _useState18 = _slicedToArray(_useState17, 2),
27682
+ isEditingMcp = _useState18[0],
27683
+ setIsEditingMcp = _useState18[1];
27644
27684
 
27645
27685
  // Row ID counter for env/header rows in MCP edit mode
27646
27686
  var nextRowIdRef = useRef(0);
@@ -27683,6 +27723,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27683
27723
  credentials: credentials
27684
27724
  }, function () {
27685
27725
  resetForm();
27726
+ setProviderTab("credentials");
27686
27727
  refreshProviders && refreshProviders();
27687
27728
  }, function (e, err) {
27688
27729
  return (void 0);
@@ -27691,6 +27732,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27691
27732
  function handleStartEdit(name, provider) {
27692
27733
  setSelectedName(name);
27693
27734
  setIsCreating(false);
27735
+ setProviderTab(provider.providerClass === "mcp" ? "mcp" : "credentials");
27694
27736
  if (provider.providerClass === "mcp") {
27695
27737
  setIsEditingMcp(true);
27696
27738
  setIsEditing(false);
@@ -27755,6 +27797,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27755
27797
  setIsAddingMcp(false);
27756
27798
  refreshProviders && refreshProviders();
27757
27799
  setSelectedName(providerName);
27800
+ setProviderTab("mcp");
27758
27801
  }, function (e, err) {
27759
27802
  return (void 0);
27760
27803
  });
@@ -27776,6 +27819,7 @@ var ProvidersSection = function ProvidersSection(_ref) {
27776
27819
  mcpConfig: mcpConfig
27777
27820
  }, function () {
27778
27821
  setSelectedName(providerName);
27822
+ setProviderTab("mcp");
27779
27823
  setIsEditingMcp(false);
27780
27824
  resetForm();
27781
27825
  refreshProviders && refreshProviders();
@@ -27800,19 +27844,39 @@ var ProvidersSection = function ProvidersSection(_ref) {
27800
27844
  // eslint-disable-next-line react-hooks/exhaustive-deps
27801
27845
  }, [createRequested]);
27802
27846
  var selectedProvider = selectedName && providers[selectedName] ? providers[selectedName] : null;
27803
- var listContent = /*#__PURE__*/jsxs(Sidebar.Content, {
27804
- children: [credentialProviders.length > 0 && /*#__PURE__*/jsxs(Fragment, {
27805
- children: [/*#__PURE__*/jsx("div", {
27806
- className: "px-3 py-2 text-xs font-semibold opacity-40 uppercase tracking-wider",
27807
- children: "API Credentials"
27808
- }), credentialProviders.map(function (_ref8) {
27847
+ var activeProviders = providerTab === "credentials" ? credentialProviders : mcpProviders;
27848
+ var activeIcon = providerTab === "credentials" ? "key" : "server";
27849
+ var listContent = /*#__PURE__*/jsxs(Fragment, {
27850
+ children: [/*#__PURE__*/jsx("div", {
27851
+ className: "px-2 pt-2",
27852
+ children: /*#__PURE__*/jsx(Tabs3, {
27853
+ value: providerTab,
27854
+ onValueChange: setProviderTab,
27855
+ backgroundColor: "bg-transparent",
27856
+ spacing: "p-0",
27857
+ children: /*#__PURE__*/jsxs(Tabs3.List, {
27858
+ className: "w-full flex",
27859
+ spacing: "p-0.5",
27860
+ children: [/*#__PURE__*/jsx(Tabs3.Trigger, {
27861
+ value: "credentials",
27862
+ className: "flex-1",
27863
+ children: "API Credentials"
27864
+ }), /*#__PURE__*/jsx(Tabs3.Trigger, {
27865
+ value: "mcp",
27866
+ className: "flex-1",
27867
+ children: "MCP Servers"
27868
+ })]
27869
+ })
27870
+ })
27871
+ }), /*#__PURE__*/jsxs(Sidebar.Content, {
27872
+ children: [activeProviders.map(function (_ref8) {
27809
27873
  var _ref9 = _slicedToArray(_ref8, 2),
27810
27874
  name = _ref9[0],
27811
27875
  provider = _ref9[1];
27812
27876
  var isSelected = selectedName === name && !isCreating;
27813
27877
  return /*#__PURE__*/jsx(Sidebar.Item, {
27814
27878
  icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
27815
- icon: "key",
27879
+ icon: activeIcon,
27816
27880
  className: "h-3.5 w-3.5"
27817
27881
  }),
27818
27882
  active: isSelected,
@@ -27829,54 +27893,25 @@ var ProvidersSection = function ProvidersSection(_ref) {
27829
27893
  className: isSelected ? "bg-white/10 opacity-100" : "",
27830
27894
  children: name
27831
27895
  }, name);
27832
- })]
27833
- }), mcpProviders.length > 0 && /*#__PURE__*/jsxs(Fragment, {
27834
- children: [/*#__PURE__*/jsx("div", {
27835
- className: "px-3 py-2 text-xs font-semibold opacity-40 uppercase tracking-wider mt-2",
27836
- children: "MCP Servers"
27837
- }), mcpProviders.map(function (_ref0) {
27838
- var _ref1 = _slicedToArray(_ref0, 2),
27839
- name = _ref1[0],
27840
- provider = _ref1[1];
27841
- var isSelected = selectedName === name && !isCreating;
27842
- return /*#__PURE__*/jsx(Sidebar.Item, {
27843
- icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
27844
- icon: "server",
27845
- className: "h-3.5 w-3.5"
27846
- }),
27847
- active: isSelected,
27896
+ }), activeProviders.length === 0 && /*#__PURE__*/jsx("span", {
27897
+ className: "text-sm opacity-40 py-8 text-center",
27898
+ children: providerTab === "credentials" ? "No API credentials configured" : "No MCP servers configured"
27899
+ }), providerTab === "mcp" && /*#__PURE__*/jsx("div", {
27900
+ className: "px-3 py-3 mt-2 border-t border-white/10",
27901
+ children: /*#__PURE__*/jsxs("button", {
27848
27902
  onClick: function onClick() {
27849
- setSelectedName(name);
27903
+ setIsAddingMcp(true);
27904
+ setSelectedName(null);
27850
27905
  setIsCreating(false);
27851
27906
  setIsEditing(false);
27852
- setIsAddingMcp(false);
27853
- resetForm();
27854
27907
  },
27855
- badge: provider.type ? /*#__PURE__*/jsx(Tag3, {
27856
- text: provider.type
27857
- }) : null,
27858
- className: isSelected ? "bg-white/10 opacity-100" : "",
27859
- children: name
27860
- }, name);
27908
+ className: "flex items-center gap-2 text-sm text-blue-400 hover:text-blue-300 transition-colors w-full",
27909
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
27910
+ icon: "plus",
27911
+ className: "h-3 w-3"
27912
+ }), "Add MCP Server"]
27913
+ })
27861
27914
  })]
27862
- }), providerEntries.length === 0 && /*#__PURE__*/jsx("span", {
27863
- className: "text-sm opacity-40 py-8 text-center",
27864
- children: "No providers configured"
27865
- }), /*#__PURE__*/jsx("div", {
27866
- className: "px-3 py-3 mt-2 border-t border-white/10",
27867
- children: /*#__PURE__*/jsxs("button", {
27868
- onClick: function onClick() {
27869
- setIsAddingMcp(true);
27870
- setSelectedName(null);
27871
- setIsCreating(false);
27872
- setIsEditing(false);
27873
- },
27874
- className: "flex items-center gap-2 text-sm text-blue-400 hover:text-blue-300 transition-colors w-full",
27875
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
27876
- icon: "plus",
27877
- className: "h-3 w-3"
27878
- }), "Add MCP Server"]
27879
- })
27880
27915
  })]
27881
27916
  });
27882
27917
  var detailContent = null;