@trops/dash-core 0.1.174 → 0.1.175

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.
@@ -358,7 +358,7 @@ const PROVIDER_SAVE_COMPLETE = "provider-save-complete";
358
358
  const PROVIDER_SAVE_ERROR = "provider-save-error";
359
359
 
360
360
  const PROVIDER_LIST$1 = "provider-list";
361
- const PROVIDER_LIST_COMPLETE = "provider-list-complete";
361
+ const PROVIDER_LIST_COMPLETE$1 = "provider-list-complete";
362
362
  const PROVIDER_LIST_ERROR = "provider-list-error";
363
363
 
364
364
  const PROVIDER_GET$1 = "provider-get";
@@ -374,7 +374,7 @@ var providerEvents$1 = {
374
374
  PROVIDER_SAVE_COMPLETE,
375
375
  PROVIDER_SAVE_ERROR,
376
376
  PROVIDER_LIST: PROVIDER_LIST$1,
377
- PROVIDER_LIST_COMPLETE,
377
+ PROVIDER_LIST_COMPLETE: PROVIDER_LIST_COMPLETE$1,
378
378
  PROVIDER_LIST_ERROR,
379
379
  PROVIDER_GET: PROVIDER_GET$1,
380
380
  PROVIDER_GET_COMPLETE,
@@ -66111,7 +66111,7 @@ const registeredResources = [];
66111
66111
  * Register a tool to be exposed via the MCP server.
66112
66112
  * Call this before starting the server (or restart after registering).
66113
66113
  */
66114
- function registerTool$3(toolDef) {
66114
+ function registerTool$4(toolDef) {
66115
66115
  registeredTools.push(toolDef);
66116
66116
  }
66117
66117
 
@@ -66434,7 +66434,7 @@ const mcpDashServerController$3 = {
66434
66434
  },
66435
66435
 
66436
66436
  // Expose registration functions for other controllers
66437
- registerTool: registerTool$3,
66437
+ registerTool: registerTool$4,
66438
66438
  registerResource,
66439
66439
  getServerContext,
66440
66440
  };
@@ -69218,7 +69218,78 @@ const themeTools$1 = [
69218
69218
  },
69219
69219
  ];
69220
69220
 
69221
- var toolDefinitions = { dashboardTools: dashboardTools$1, widgetTools: widgetTools$1, themeTools: themeTools$1 };
69221
+ const providerTools$1 = [
69222
+ {
69223
+ name: "list_providers",
69224
+ description:
69225
+ "List all configured providers with their names, types, and status. Credential secrets are never returned.",
69226
+ inputSchema: {
69227
+ type: "object",
69228
+ properties: {},
69229
+ required: [],
69230
+ },
69231
+ },
69232
+ {
69233
+ name: "add_provider",
69234
+ description:
69235
+ "Add a new provider configuration. Supports credential providers (API keys) and MCP providers (server connections). Credentials are encrypted at rest.",
69236
+ inputSchema: {
69237
+ type: "object",
69238
+ properties: {
69239
+ name: {
69240
+ type: "string",
69241
+ description:
69242
+ "Unique display name for the provider (e.g. 'Algolia Production', 'Slack')",
69243
+ },
69244
+ type: {
69245
+ type: "string",
69246
+ description:
69247
+ "Provider type identifier (e.g. 'algolia', 'slack', 'openai', 'github')",
69248
+ },
69249
+ providerClass: {
69250
+ type: "string",
69251
+ enum: ["credential", "mcp"],
69252
+ description:
69253
+ "Provider class: 'credential' for API key providers, 'mcp' for MCP server providers. Defaults to 'credential'.",
69254
+ },
69255
+ credentials: {
69256
+ type: "object",
69257
+ description:
69258
+ "Credentials object (e.g. { apiKey: '...', appId: '...' }). Encrypted at rest, never returned in responses.",
69259
+ },
69260
+ mcpConfig: {
69261
+ type: "object",
69262
+ description:
69263
+ "MCP server configuration (transport, command, args, envMapping). Only used when providerClass is 'mcp'.",
69264
+ },
69265
+ allowedTools: {
69266
+ type: "array",
69267
+ items: { type: "string" },
69268
+ description:
69269
+ "Optional list of allowed MCP tool names. Only used when providerClass is 'mcp'.",
69270
+ },
69271
+ },
69272
+ required: ["name", "type", "credentials"],
69273
+ },
69274
+ },
69275
+ {
69276
+ name: "remove_provider",
69277
+ description:
69278
+ "Remove a provider by name. This deletes the provider and its stored credentials permanently.",
69279
+ inputSchema: {
69280
+ type: "object",
69281
+ properties: {
69282
+ name: {
69283
+ type: "string",
69284
+ description: "Name of the provider to remove",
69285
+ },
69286
+ },
69287
+ required: ["name"],
69288
+ },
69289
+ },
69290
+ ];
69291
+
69292
+ var toolDefinitions = { dashboardTools: dashboardTools$1, widgetTools: widgetTools$1, themeTools: themeTools$1, providerTools: providerTools$1 };
69222
69293
 
69223
69294
  /**
69224
69295
  * toolHandlers.js
@@ -70554,6 +70625,232 @@ async function handleApplyTheme$1({ name }) {
70554
70625
  };
70555
70626
  }
70556
70627
 
70628
+ // --- Provider Tool Handlers ---
70629
+
70630
+ const { PROVIDER_LIST_COMPLETE } = events$8;
70631
+
70632
+ /**
70633
+ * list_providers — Returns all configured providers with name, type, class, and status.
70634
+ * Credentials/secrets are NEVER included in the response.
70635
+ */
70636
+ async function handleListProviders$1() {
70637
+ const { win, appId } = requireContext();
70638
+ const result = providerController$1.listProviders(win, appId);
70639
+
70640
+ if (result.error) {
70641
+ return {
70642
+ content: [
70643
+ { type: "text", text: JSON.stringify({ error: result.message }) },
70644
+ ],
70645
+ isError: true,
70646
+ };
70647
+ }
70648
+
70649
+ const providers = (result.providers || []).map((p) => ({
70650
+ name: p.name,
70651
+ type: p.type,
70652
+ providerClass: p.providerClass || "credential",
70653
+ dateCreated: p.dateCreated,
70654
+ dateUpdated: p.dateUpdated,
70655
+ }));
70656
+
70657
+ return {
70658
+ content: [
70659
+ {
70660
+ type: "text",
70661
+ text: JSON.stringify({ providers, count: providers.length }, null, 2),
70662
+ },
70663
+ ],
70664
+ };
70665
+ }
70666
+
70667
+ /**
70668
+ * add_provider — Adds a new provider with encrypted credentials.
70669
+ * Credentials are accepted on input but never returned in the response.
70670
+ */
70671
+ async function handleAddProvider$1({
70672
+ name,
70673
+ type,
70674
+ providerClass,
70675
+ credentials,
70676
+ mcpConfig,
70677
+ allowedTools,
70678
+ }) {
70679
+ if (!name || typeof name !== "string" || !name.trim()) {
70680
+ return {
70681
+ content: [
70682
+ {
70683
+ type: "text",
70684
+ text: JSON.stringify({
70685
+ error: "name is required and must be a non-empty string",
70686
+ }),
70687
+ },
70688
+ ],
70689
+ isError: true,
70690
+ };
70691
+ }
70692
+
70693
+ if (!type || typeof type !== "string" || !type.trim()) {
70694
+ return {
70695
+ content: [
70696
+ {
70697
+ type: "text",
70698
+ text: JSON.stringify({
70699
+ error: "type is required and must be a non-empty string",
70700
+ }),
70701
+ },
70702
+ ],
70703
+ isError: true,
70704
+ };
70705
+ }
70706
+
70707
+ if (
70708
+ !credentials ||
70709
+ typeof credentials !== "object" ||
70710
+ Array.isArray(credentials)
70711
+ ) {
70712
+ return {
70713
+ content: [
70714
+ {
70715
+ type: "text",
70716
+ text: JSON.stringify({
70717
+ error: "credentials is required and must be an object",
70718
+ }),
70719
+ },
70720
+ ],
70721
+ isError: true,
70722
+ };
70723
+ }
70724
+
70725
+ const resolvedClass = providerClass || "credential";
70726
+ if (resolvedClass !== "credential" && resolvedClass !== "mcp") {
70727
+ return {
70728
+ content: [
70729
+ {
70730
+ type: "text",
70731
+ text: JSON.stringify({
70732
+ error: "providerClass must be 'credential' or 'mcp'",
70733
+ }),
70734
+ },
70735
+ ],
70736
+ isError: true,
70737
+ };
70738
+ }
70739
+
70740
+ const { win, appId } = requireContext();
70741
+ const providerName = name.trim();
70742
+ const providerType = type.trim();
70743
+
70744
+ // Check for duplicate names
70745
+ const existing = providerController$1.listProviders(win, appId);
70746
+ if (!existing.error) {
70747
+ const duplicate = (existing.providers || []).find(
70748
+ (p) => p.name === providerName,
70749
+ );
70750
+ if (duplicate) {
70751
+ return {
70752
+ content: [
70753
+ {
70754
+ type: "text",
70755
+ text: JSON.stringify({
70756
+ error: `A provider with name "${providerName}" already exists. Remove it first or use a different name.`,
70757
+ }),
70758
+ },
70759
+ ],
70760
+ isError: true,
70761
+ };
70762
+ }
70763
+ }
70764
+
70765
+ const result = providerController$1.saveProvider(
70766
+ win,
70767
+ appId,
70768
+ providerName,
70769
+ providerType,
70770
+ credentials,
70771
+ resolvedClass,
70772
+ resolvedClass === "mcp" ? mcpConfig || null : null,
70773
+ resolvedClass === "mcp" ? allowedTools || null : null,
70774
+ );
70775
+
70776
+ if (result.error) {
70777
+ return {
70778
+ content: [
70779
+ { type: "text", text: JSON.stringify({ error: result.message }) },
70780
+ ],
70781
+ isError: true,
70782
+ };
70783
+ }
70784
+
70785
+ // Notify the renderer so the UI updates
70786
+ const listResult = providerController$1.listProviders(win, appId);
70787
+ win.webContents.send(PROVIDER_LIST_COMPLETE, listResult);
70788
+
70789
+ return {
70790
+ content: [
70791
+ {
70792
+ type: "text",
70793
+ text: JSON.stringify(
70794
+ {
70795
+ name: providerName,
70796
+ type: providerType,
70797
+ providerClass: resolvedClass,
70798
+ created: true,
70799
+ },
70800
+ null,
70801
+ 2,
70802
+ ),
70803
+ },
70804
+ ],
70805
+ };
70806
+ }
70807
+
70808
+ /**
70809
+ * remove_provider — Removes a provider by name, deleting its stored credentials.
70810
+ */
70811
+ async function handleRemoveProvider$1({ name }) {
70812
+ if (!name || typeof name !== "string" || !name.trim()) {
70813
+ return {
70814
+ content: [
70815
+ {
70816
+ type: "text",
70817
+ text: JSON.stringify({
70818
+ error: "name is required and must be a non-empty string",
70819
+ }),
70820
+ },
70821
+ ],
70822
+ isError: true,
70823
+ };
70824
+ }
70825
+
70826
+ const { win, appId } = requireContext();
70827
+ const providerName = name.trim();
70828
+
70829
+ const result = providerController$1.deleteProvider(win, appId, providerName);
70830
+
70831
+ if (result.error) {
70832
+ return {
70833
+ content: [
70834
+ { type: "text", text: JSON.stringify({ error: result.message }) },
70835
+ ],
70836
+ isError: true,
70837
+ };
70838
+ }
70839
+
70840
+ // Notify the renderer so the UI updates
70841
+ const listResult = providerController$1.listProviders(win, appId);
70842
+ win.webContents.send(PROVIDER_LIST_COMPLETE, listResult);
70843
+
70844
+ return {
70845
+ content: [
70846
+ {
70847
+ type: "text",
70848
+ text: JSON.stringify({ name: providerName, removed: true }, null, 2),
70849
+ },
70850
+ ],
70851
+ };
70852
+ }
70853
+
70557
70854
  var toolHandlers = {
70558
70855
  handleListDashboards: handleListDashboards$1,
70559
70856
  handleGetDashboard: handleGetDashboard$1,
@@ -70570,6 +70867,9 @@ var toolHandlers = {
70570
70867
  handleCreateTheme: handleCreateTheme$1,
70571
70868
  handleCreateThemeFromUrl: handleCreateThemeFromUrl$1,
70572
70869
  handleApplyTheme: handleApplyTheme$1,
70870
+ handleListProviders: handleListProviders$1,
70871
+ handleAddProvider: handleAddProvider$1,
70872
+ handleRemoveProvider: handleRemoveProvider$1,
70573
70873
  };
70574
70874
 
70575
70875
  /**
@@ -70579,7 +70879,7 @@ var toolHandlers = {
70579
70879
  * Call registerDashboardTools() during app startup (before or after server start).
70580
70880
  */
70581
70881
 
70582
- const { registerTool: registerTool$2 } = mcpDashServerController_1;
70882
+ const { registerTool: registerTool$3 } = mcpDashServerController_1;
70583
70883
  const { dashboardTools } = toolDefinitions;
70584
70884
  const {
70585
70885
  handleListDashboards,
@@ -70590,7 +70890,7 @@ const {
70590
70890
  } = toolHandlers;
70591
70891
 
70592
70892
  // Map tool names to handler functions
70593
- const handlerMap$2 = {
70893
+ const handlerMap$3 = {
70594
70894
  list_dashboards: handleListDashboards,
70595
70895
  get_dashboard: handleGetDashboard,
70596
70896
  create_dashboard: handleCreateDashboard,
@@ -70603,12 +70903,12 @@ const handlerMap$2 = {
70603
70903
  */
70604
70904
  function registerDashboardTools$1() {
70605
70905
  for (const tool of dashboardTools) {
70606
- const handler = handlerMap$2[tool.name];
70906
+ const handler = handlerMap$3[tool.name];
70607
70907
  if (!handler) {
70608
70908
  console.warn(`[dashboardTools] No handler found for tool: ${tool.name}`);
70609
70909
  continue;
70610
70910
  }
70611
- registerTool$2({
70911
+ registerTool$3({
70612
70912
  name: tool.name,
70613
70913
  description: tool.description,
70614
70914
  inputSchema: tool.inputSchema,
@@ -70629,7 +70929,7 @@ var dashboardTools_1 = { registerDashboardTools: registerDashboardTools$1 };
70629
70929
  * Call registerWidgetTools() during app startup (before or after server start).
70630
70930
  */
70631
70931
 
70632
- const { registerTool: registerTool$1 } = mcpDashServerController_1;
70932
+ const { registerTool: registerTool$2 } = mcpDashServerController_1;
70633
70933
  const { widgetTools } = toolDefinitions;
70634
70934
  const {
70635
70935
  handleAddWidget,
@@ -70640,7 +70940,7 @@ const {
70640
70940
  } = toolHandlers;
70641
70941
 
70642
70942
  // Map tool names to handler functions
70643
- const handlerMap$1 = {
70943
+ const handlerMap$2 = {
70644
70944
  add_widget: handleAddWidget,
70645
70945
  remove_widget: handleRemoveWidget,
70646
70946
  configure_widget: handleConfigureWidget,
@@ -70653,12 +70953,12 @@ const handlerMap$1 = {
70653
70953
  */
70654
70954
  function registerWidgetTools$1() {
70655
70955
  for (const tool of widgetTools) {
70656
- const handler = handlerMap$1[tool.name];
70956
+ const handler = handlerMap$2[tool.name];
70657
70957
  if (!handler) {
70658
70958
  console.warn(`[widgetTools] No handler found for tool: ${tool.name}`);
70659
70959
  continue;
70660
70960
  }
70661
- registerTool$1({
70961
+ registerTool$2({
70662
70962
  name: tool.name,
70663
70963
  description: tool.description,
70664
70964
  inputSchema: tool.inputSchema,
@@ -70677,7 +70977,7 @@ var widgetTools_1 = { registerWidgetTools: registerWidgetTools$1 };
70677
70977
  * Call registerThemeTools() during app startup (before or after server start).
70678
70978
  */
70679
70979
 
70680
- const { registerTool } = mcpDashServerController_1;
70980
+ const { registerTool: registerTool$1 } = mcpDashServerController_1;
70681
70981
  const { themeTools } = toolDefinitions;
70682
70982
  const {
70683
70983
  handleListThemes,
@@ -70688,7 +70988,7 @@ const {
70688
70988
  } = toolHandlers;
70689
70989
 
70690
70990
  // Map tool names to handler functions
70691
- const handlerMap = {
70991
+ const handlerMap$1 = {
70692
70992
  list_themes: handleListThemes,
70693
70993
  get_theme: handleGetTheme,
70694
70994
  create_theme: handleCreateTheme,
@@ -70701,12 +71001,12 @@ const handlerMap = {
70701
71001
  */
70702
71002
  function registerThemeTools$1() {
70703
71003
  for (const tool of themeTools) {
70704
- const handler = handlerMap[tool.name];
71004
+ const handler = handlerMap$1[tool.name];
70705
71005
  if (!handler) {
70706
71006
  console.warn(`[themeTools] No handler found for tool: ${tool.name}`);
70707
71007
  continue;
70708
71008
  }
70709
- registerTool({
71009
+ registerTool$1({
70710
71010
  name: tool.name,
70711
71011
  description: tool.description,
70712
71012
  inputSchema: tool.inputSchema,
@@ -70718,6 +71018,52 @@ function registerThemeTools$1() {
70718
71018
 
70719
71019
  var themeTools_1 = { registerThemeTools: registerThemeTools$1 };
70720
71020
 
71021
+ /**
71022
+ * providerTools.js
71023
+ *
71024
+ * Registers provider MCP tools with the MCP Dash server.
71025
+ * Call registerProviderTools() during app startup (before or after server start).
71026
+ */
71027
+
71028
+ const { registerTool } = mcpDashServerController_1;
71029
+ const { providerTools } = toolDefinitions;
71030
+ const {
71031
+ handleListProviders,
71032
+ handleAddProvider,
71033
+ handleRemoveProvider,
71034
+ } = toolHandlers;
71035
+
71036
+ // Map tool names to handler functions
71037
+ const handlerMap = {
71038
+ list_providers: handleListProviders,
71039
+ add_provider: handleAddProvider,
71040
+ remove_provider: handleRemoveProvider,
71041
+ };
71042
+
71043
+ /**
71044
+ * Register all provider tools with the MCP server controller.
71045
+ */
71046
+ function registerProviderTools$1() {
71047
+ for (const tool of providerTools) {
71048
+ const handler = handlerMap[tool.name];
71049
+ if (!handler) {
71050
+ console.warn(`[providerTools] No handler found for tool: ${tool.name}`);
71051
+ continue;
71052
+ }
71053
+ registerTool({
71054
+ name: tool.name,
71055
+ description: tool.description,
71056
+ inputSchema: tool.inputSchema,
71057
+ handler,
71058
+ });
71059
+ }
71060
+ console.log(
71061
+ `[providerTools] Registered ${providerTools.length} provider tools`,
71062
+ );
71063
+ }
71064
+
71065
+ var providerTools_1 = { registerProviderTools: registerProviderTools$1 };
71066
+
70721
71067
  /**
70722
71068
  * dashboardRatingsApi.js
70723
71069
  *
@@ -71042,9 +71388,11 @@ const dynamicWidgetLoader = dynamicWidgetLoaderExports;
71042
71388
  const { registerDashboardTools } = dashboardTools_1;
71043
71389
  const { registerWidgetTools } = widgetTools_1;
71044
71390
  const { registerThemeTools } = themeTools_1;
71391
+ const { registerProviderTools } = providerTools_1;
71045
71392
  registerDashboardTools();
71046
71393
  registerWidgetTools();
71047
71394
  registerThemeTools();
71395
+ registerProviderTools();
71048
71396
 
71049
71397
  // --- Schema ---
71050
71398
  const dashboardConfigValidator = dashboardConfigValidator$1;
@@ -71142,6 +71490,7 @@ var electron = {
71142
71490
  registerDashboardTools,
71143
71491
  registerWidgetTools,
71144
71492
  registerThemeTools,
71493
+ registerProviderTools,
71145
71494
  };
71146
71495
 
71147
71496
  var index = /*@__PURE__*/getDefaultExportFromCjs(electron);