@sweetoburrito/backstage-plugin-ai-assistant-backend 0.17.0 → 0.18.0

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/README.md CHANGED
@@ -26,3 +26,27 @@ package with `yarn start`. It is a limited setup that is most convenient when
26
26
  developing the plugin backend itself.
27
27
 
28
28
  If you want to run the entire project, including the frontend, run `yarn start` from the root directory.
29
+
30
+ ## Tool Configuration
31
+
32
+ You can control tool behavior for all users through backend config:
33
+
34
+ - `aiAssistant.tools.core`: tools that are always enabled and not user-toggleable.
35
+ - `aiAssistant.tools.defaultEnabled`: tools enabled by default for users who do not yet have saved `user-tools` settings.
36
+
37
+ Both settings accept entries with `provider` and `name`:
38
+
39
+ ```yaml
40
+ aiAssistant:
41
+ tools:
42
+ core:
43
+ - provider: core
44
+ name: search-knowledge-base
45
+ defaultEnabled:
46
+ - provider: core
47
+ name: search-knowledge-base
48
+ - provider: mcp server:foo
49
+ name: foo_someTool
50
+ ```
51
+
52
+ For MCP tools, use provider format `mcp server:<server-name>`.
package/config.d.ts CHANGED
@@ -45,6 +45,28 @@ export interface Config {
45
45
  maxChunkProcessingSize?: number;
46
46
  };
47
47
  };
48
+ tools?: {
49
+ /**
50
+ * List of tools that should always be enabled and not user-toggleable.
51
+ *
52
+ * For MCP tools, provider format is: `mcp server:<server-name>`.
53
+ */
54
+ core?: Array<{
55
+ provider: string;
56
+ name: string;
57
+ }>;
58
+
59
+ /**
60
+ * List of tools enabled by default for users that don't have existing
61
+ * `user-tools` settings.
62
+ *
63
+ * For MCP tools, provider format is: `mcp server:<server-name>`.
64
+ */
65
+ defaultEnabled?: Array<{
66
+ provider: string;
67
+ name: string;
68
+ }>;
69
+ };
48
70
  mcp: {
49
71
  /**
50
72
  * @visibility secret
@@ -6,10 +6,59 @@ var tools = require('@langchain/core/tools');
6
6
 
7
7
  const createToolsService = async ({
8
8
  mcp,
9
- auth
9
+ auth,
10
+ config
10
11
  }) => {
11
12
  const tools$1 = [];
12
13
  const coreTools = [];
14
+ const areSameTools = (left, right) => left.name === right.name && left.provider === right.provider;
15
+ const getConfiguredTools = (path) => {
16
+ const configuredTools = config.getOptionalConfigArray(path);
17
+ if (!configuredTools) {
18
+ return void 0;
19
+ }
20
+ return configuredTools.map((tool) => ({
21
+ name: tool.getString("name"),
22
+ provider: tool.getString("provider")
23
+ }));
24
+ };
25
+ const uniqTools = (allTools) => {
26
+ const toolMap = new Map(
27
+ allTools.map((tool) => [`${tool.provider}:${tool.name}`, tool])
28
+ );
29
+ return Array.from(toolMap.values());
30
+ };
31
+ const resolveCoreTools = (allTools) => {
32
+ const configuredCoreTools = getConfiguredTools("aiAssistant.tools.core");
33
+ if (configuredCoreTools === void 0) {
34
+ return coreTools;
35
+ }
36
+ return allTools.filter(
37
+ (tool) => configuredCoreTools.some(
38
+ (configuredTool) => areSameTools(configuredTool, {
39
+ name: tool.name,
40
+ provider: tool.provider
41
+ })
42
+ )
43
+ );
44
+ };
45
+ const resolveDefaultEnabledTools = (allTools, resolvedCore) => {
46
+ const configuredDefaultTools = getConfiguredTools(
47
+ "aiAssistant.tools.defaultEnabled"
48
+ );
49
+ if (configuredDefaultTools === void 0) {
50
+ return resolvedCore;
51
+ }
52
+ const resolvedConfiguredDefaultTools = allTools.filter(
53
+ (tool) => configuredDefaultTools.some(
54
+ (configuredTool) => areSameTools(configuredTool, {
55
+ name: tool.name,
56
+ provider: tool.provider
57
+ })
58
+ )
59
+ );
60
+ return uniqTools(resolvedConfiguredDefaultTools.concat(resolvedCore));
61
+ };
13
62
  const registerTools = async (providers) => {
14
63
  tools$1.push(...providers);
15
64
  };
@@ -20,12 +69,30 @@ const createToolsService = async ({
20
69
  credentials
21
70
  }) => {
22
71
  const mcpTools = await mcp.getTools(credentials);
23
- const availableTools = tools$1.concat(mcpTools).concat(coreTools).map((tool) => ({
72
+ const availableTools = uniqTools(tools$1.concat(mcpTools).concat(coreTools));
73
+ const resolvedCoreTools = resolveCoreTools(availableTools);
74
+ const resolvedDefaultEnabledTools = resolveDefaultEnabledTools(
75
+ availableTools,
76
+ resolvedCoreTools
77
+ );
78
+ const availableUserTools = availableTools.map((tool) => ({
24
79
  name: tool.name,
25
80
  provider: tool.provider,
26
- description: tool.description
81
+ description: tool.description,
82
+ isCore: resolvedCoreTools.some(
83
+ (coreTool) => areSameTools(coreTool, {
84
+ name: tool.name,
85
+ provider: tool.provider
86
+ })
87
+ ),
88
+ enabledByDefault: resolvedDefaultEnabledTools.some(
89
+ (defaultTool) => areSameTools(defaultTool, {
90
+ name: tool.name,
91
+ provider: tool.provider
92
+ })
93
+ )
27
94
  }));
28
- return availableTools;
95
+ return availableUserTools;
29
96
  };
30
97
  const getPrincipalTools = async ({
31
98
  credentials,
@@ -36,8 +103,19 @@ const createToolsService = async ({
36
103
  return tools$1.filter(filter).map((t) => new tools.DynamicStructuredTool(t));
37
104
  }
38
105
  const mcpTools = await mcp.getTools(credentials);
39
- const userTools = tools$1.concat(mcpTools);
40
- const allTools = userTools.filter(filter).concat(coreTools.filter(filter));
106
+ const availableTools = uniqTools(tools$1.concat(mcpTools).concat(coreTools));
107
+ const resolvedCoreTools = resolveCoreTools(availableTools);
108
+ const userSelectableTools = availableTools.filter(
109
+ (tool) => !resolvedCoreTools.some(
110
+ (coreTool) => areSameTools(coreTool, {
111
+ name: tool.name,
112
+ provider: tool.provider
113
+ })
114
+ )
115
+ );
116
+ const allTools = uniqTools(
117
+ userSelectableTools.filter(filter).concat(resolvedCoreTools)
118
+ );
41
119
  return allTools.map((t) => new tools.DynamicStructuredTool(t));
42
120
  };
43
121
  return {
@@ -53,7 +131,8 @@ const toolsServiceRef = backendPluginApi.createServiceRef({
53
131
  service,
54
132
  deps: {
55
133
  mcp: index.mcpServiceRef,
56
- auth: backendPluginApi.coreServices.auth
134
+ auth: backendPluginApi.coreServices.auth,
135
+ config: backendPluginApi.coreServices.rootConfig
57
136
  },
58
137
  factory: async (options) => {
59
138
  return createToolsService(options);
@@ -1 +1 @@
1
- {"version":3,"file":"tools.cjs.js","sources":["../../src/services/tools.ts"],"sourcesContent":["import {\n BackstageCredentials,\n coreServices,\n createServiceFactory,\n createServiceRef,\n ServiceRef,\n AuthService,\n} from '@backstage/backend-plugin-api';\nimport {\n Tool,\n EnabledTool,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { McpService, mcpServiceRef } from './mcp';\nimport { DynamicStructuredTool } from '@langchain/core/tools';\n\nexport type ToolsService = {\n registerTools: (tools: Tool[]) => void;\n registerCoreTools: (tools: Tool[]) => void;\n getAvailableUserTools: (options: {\n credentials: BackstageCredentials;\n }) => Promise<EnabledTool[]>;\n getPrincipalTools: (options: {\n credentials: BackstageCredentials;\n filter?: (tool: Tool) => boolean;\n }) => Promise<DynamicStructuredTool[]>;\n};\n\nexport type CreateToolsServiceOptions = {\n mcp: McpService;\n auth: AuthService;\n};\n\nconst createToolsService = async ({\n mcp,\n auth,\n}: CreateToolsServiceOptions): Promise<ToolsService> => {\n const tools: Tool[] = [];\n const coreTools: Tool[] = [];\n\n const registerTools: ToolsService['registerTools'] = async providers => {\n tools.push(...providers);\n };\n\n const registerCoreTools: ToolsService['registerCoreTools'] =\n async providers => {\n coreTools.push(...providers.map(tool => ({ ...tool, provider: 'core' })));\n };\n\n const getAvailableUserTools: ToolsService['getAvailableUserTools'] = async ({\n credentials,\n }) => {\n const mcpTools = await mcp.getTools(credentials);\n\n const availableTools: EnabledTool[] = tools\n .concat(mcpTools)\n .concat(coreTools)\n .map(tool => ({\n name: tool.name,\n provider: tool.provider,\n description: tool.description,\n }));\n\n return availableTools;\n };\n\n const getPrincipalTools: ToolsService['getPrincipalTools'] = async ({\n credentials,\n filter = () => true,\n }) => {\n const isUser = auth.isPrincipal(credentials, 'user');\n\n if (!isUser) {\n return tools.filter(filter).map(t => new DynamicStructuredTool(t));\n }\n\n const mcpTools = await mcp.getTools(credentials);\n\n const userTools = tools.concat(mcpTools);\n\n const allTools: Tool[] = userTools\n .filter(filter)\n .concat(coreTools.filter(filter));\n return allTools.map(t => new DynamicStructuredTool(t));\n };\n\n return {\n registerTools,\n registerCoreTools,\n getAvailableUserTools,\n getPrincipalTools,\n };\n};\n\nexport const toolsServiceRef: ServiceRef<ToolsService, 'plugin', 'singleton'> =\n createServiceRef<ToolsService>({\n id: 'ai-assistant.tools-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n mcp: mcpServiceRef,\n auth: coreServices.auth,\n },\n factory: async options => {\n return createToolsService(options);\n },\n }),\n });\n"],"names":["tools","DynamicStructuredTool","createServiceRef","createServiceFactory","mcpServiceRef","coreServices"],"mappings":";;;;;;AAgCA,MAAM,qBAAqB,OAAO;AAAA,EAChC,GAAA;AAAA,EACA;AACF,CAAA,KAAwD;AACtD,EAAA,MAAMA,UAAgB,EAAC;AACvB,EAAA,MAAM,YAAoB,EAAC;AAE3B,EAAA,MAAM,aAAA,GAA+C,OAAM,SAAA,KAAa;AACtE,IAAAA,OAAA,CAAM,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,iBAAA,GACJ,OAAM,SAAA,KAAa;AACjB,IAAA,SAAA,CAAU,IAAA,CAAK,GAAG,SAAA,CAAU,GAAA,CAAI,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,MAAA,EAAO,CAAE,CAAC,CAAA;AAAA,EAC1E,CAAA;AAEF,EAAA,MAAM,wBAA+D,OAAO;AAAA,IAC1E;AAAA,GACF,KAAM;AACJ,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA;AAE/C,IAAA,MAAM,cAAA,GAAgCA,QACnC,MAAA,CAAO,QAAQ,EACf,MAAA,CAAO,SAAS,CAAA,CAChB,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAa,IAAA,CAAK;AAAA,KACpB,CAAE,CAAA;AAEJ,IAAA,OAAO,cAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,oBAAuD,OAAO;AAAA,IAClE,WAAA;AAAA,IACA,SAAS,MAAM;AAAA,GACjB,KAAM;AACJ,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,WAAA,EAAa,MAAM,CAAA;AAEnD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAOA,OAAA,CAAM,OAAO,MAAM,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,IAAIC,2BAAA,CAAsB,CAAC,CAAC,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA;AAE/C,IAAA,MAAM,SAAA,GAAYD,OAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAEvC,IAAA,MAAM,QAAA,GAAmB,UACtB,MAAA,CAAO,MAAM,EACb,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAClC,IAAA,OAAO,SAAS,GAAA,CAAI,CAAA,CAAA,KAAK,IAAIC,2BAAA,CAAsB,CAAC,CAAC,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEO,MAAM,kBACXC,iCAAA,CAA+B;AAAA,EAC7B,EAAA,EAAI,4BAAA;AAAA,EACJ,cAAA,EAAgB,OAAM,OAAA,KACpBC,qCAAA,CAAqB;AAAA,IACnB,OAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,GAAA,EAAKC,mBAAA;AAAA,MACL,MAAMC,6BAAA,CAAa;AAAA,KACrB;AAAA,IACA,OAAA,EAAS,OAAM,OAAA,KAAW;AACxB,MAAA,OAAO,mBAAmB,OAAO,CAAA;AAAA,IACnC;AAAA,GACD;AACL,CAAC;;;;"}
1
+ {"version":3,"file":"tools.cjs.js","sources":["../../src/services/tools.ts"],"sourcesContent":["import {\n BackstageCredentials,\n coreServices,\n createServiceFactory,\n createServiceRef,\n ServiceRef,\n AuthService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport {\n Tool,\n EnabledTool,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { McpService, mcpServiceRef } from './mcp';\nimport { DynamicStructuredTool } from '@langchain/core/tools';\n\nexport type ToolsService = {\n registerTools: (tools: Tool[]) => void;\n registerCoreTools: (tools: Tool[]) => void;\n getAvailableUserTools: (options: {\n credentials: BackstageCredentials;\n }) => Promise<EnabledTool[]>;\n getPrincipalTools: (options: {\n credentials: BackstageCredentials;\n filter?: (tool: Tool) => boolean;\n }) => Promise<DynamicStructuredTool[]>;\n};\n\nexport type CreateToolsServiceOptions = {\n mcp: McpService;\n auth: AuthService;\n config: RootConfigService;\n};\n\ntype ToolSelector = Pick<EnabledTool, 'name' | 'provider'>;\n\nconst createToolsService = async ({\n mcp,\n auth,\n config,\n}: CreateToolsServiceOptions): Promise<ToolsService> => {\n const tools: Tool[] = [];\n const coreTools: Tool[] = [];\n\n const areSameTools = (left: ToolSelector, right: ToolSelector) =>\n left.name === right.name && left.provider === right.provider;\n\n const getConfiguredTools = (path: string): ToolSelector[] | undefined => {\n const configuredTools = config.getOptionalConfigArray(path);\n\n if (!configuredTools) {\n return undefined;\n }\n\n return configuredTools.map(tool => ({\n name: tool.getString('name'),\n provider: tool.getString('provider'),\n }));\n };\n\n const uniqTools = (allTools: Tool[]): Tool[] => {\n const toolMap = new Map(\n allTools.map(tool => [`${tool.provider}:${tool.name}`, tool]),\n );\n\n return Array.from(toolMap.values());\n };\n\n const resolveCoreTools = (allTools: Tool[]): Tool[] => {\n const configuredCoreTools = getConfiguredTools('aiAssistant.tools.core');\n\n if (configuredCoreTools === undefined) {\n return coreTools;\n }\n\n return allTools.filter(tool =>\n configuredCoreTools.some(configuredTool =>\n areSameTools(configuredTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n );\n };\n\n const resolveDefaultEnabledTools = (\n allTools: Tool[],\n resolvedCore: Tool[],\n ) => {\n const configuredDefaultTools = getConfiguredTools(\n 'aiAssistant.tools.defaultEnabled',\n );\n\n if (configuredDefaultTools === undefined) {\n return resolvedCore;\n }\n\n const resolvedConfiguredDefaultTools = allTools.filter(tool =>\n configuredDefaultTools.some(configuredTool =>\n areSameTools(configuredTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n );\n\n return uniqTools(resolvedConfiguredDefaultTools.concat(resolvedCore));\n };\n\n const registerTools: ToolsService['registerTools'] = async providers => {\n tools.push(...providers);\n };\n\n const registerCoreTools: ToolsService['registerCoreTools'] =\n async providers => {\n coreTools.push(...providers.map(tool => ({ ...tool, provider: 'core' })));\n };\n\n const getAvailableUserTools: ToolsService['getAvailableUserTools'] = async ({\n credentials,\n }) => {\n const mcpTools = await mcp.getTools(credentials);\n\n const availableTools = uniqTools(tools.concat(mcpTools).concat(coreTools));\n\n const resolvedCoreTools = resolveCoreTools(availableTools);\n const resolvedDefaultEnabledTools = resolveDefaultEnabledTools(\n availableTools,\n resolvedCoreTools,\n );\n\n const availableUserTools: EnabledTool[] = availableTools.map(tool => ({\n name: tool.name,\n provider: tool.provider,\n description: tool.description,\n isCore: resolvedCoreTools.some(coreTool =>\n areSameTools(coreTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n enabledByDefault: resolvedDefaultEnabledTools.some(defaultTool =>\n areSameTools(defaultTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n }));\n\n return availableUserTools;\n };\n\n const getPrincipalTools: ToolsService['getPrincipalTools'] = async ({\n credentials,\n filter = () => true,\n }) => {\n const isUser = auth.isPrincipal(credentials, 'user');\n\n if (!isUser) {\n return tools.filter(filter).map(t => new DynamicStructuredTool(t));\n }\n\n const mcpTools = await mcp.getTools(credentials);\n\n const availableTools = uniqTools(tools.concat(mcpTools).concat(coreTools));\n const resolvedCoreTools = resolveCoreTools(availableTools);\n\n const userSelectableTools = availableTools.filter(\n tool =>\n !resolvedCoreTools.some(coreTool =>\n areSameTools(coreTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n );\n\n const allTools: Tool[] = uniqTools(\n userSelectableTools.filter(filter).concat(resolvedCoreTools),\n );\n\n return allTools.map(t => new DynamicStructuredTool(t));\n };\n\n return {\n registerTools,\n registerCoreTools,\n getAvailableUserTools,\n getPrincipalTools,\n };\n};\n\nexport const toolsServiceRef: ServiceRef<ToolsService, 'plugin', 'singleton'> =\n createServiceRef<ToolsService>({\n id: 'ai-assistant.tools-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n mcp: mcpServiceRef,\n auth: coreServices.auth,\n config: coreServices.rootConfig,\n },\n factory: async options => {\n return createToolsService(options);\n },\n }),\n });\n"],"names":["tools","DynamicStructuredTool","createServiceRef","createServiceFactory","mcpServiceRef","coreServices"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sweetoburrito/backstage-plugin-ai-assistant-backend",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.cjs.js",
6
6
  "types": "dist/index.d.ts",
@@ -42,8 +42,8 @@
42
42
  "@langchain/core": "^1.1.19",
43
43
  "@langchain/mcp-adapters": "^1.1.2",
44
44
  "@langchain/textsplitters": "^1.0.1",
45
- "@sweetoburrito/backstage-plugin-ai-assistant-common": "^0.9.0",
46
- "@sweetoburrito/backstage-plugin-ai-assistant-node": "^0.11.0",
45
+ "@sweetoburrito/backstage-plugin-ai-assistant-common": "^0.10.0",
46
+ "@sweetoburrito/backstage-plugin-ai-assistant-node": "^0.11.1",
47
47
  "express": "^4.17.1",
48
48
  "express-promise-router": "^4.1.0",
49
49
  "knex": "^3.1.0",