@sweetoburrito/backstage-plugin-ai-assistant-backend 0.13.0 → 0.14.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.
Files changed (39) hide show
  1. package/dist/plugin.cjs.js +25 -41
  2. package/dist/plugin.cjs.js.map +1 -1
  3. package/dist/services/agent/helpers/message-parser.cjs.js +31 -0
  4. package/dist/services/agent/helpers/message-parser.cjs.js.map +1 -0
  5. package/dist/services/agent/helpers/tool-filter.cjs.js +13 -0
  6. package/dist/services/agent/helpers/tool-filter.cjs.js.map +1 -0
  7. package/dist/services/agent/index.cjs.js +140 -0
  8. package/dist/services/agent/index.cjs.js.map +1 -0
  9. package/dist/services/callbacks.cjs.js +23 -9
  10. package/dist/services/callbacks.cjs.js.map +1 -1
  11. package/dist/services/chat.cjs.js +90 -253
  12. package/dist/services/chat.cjs.js.map +1 -1
  13. package/dist/services/conversation.cjs.js +133 -0
  14. package/dist/services/conversation.cjs.js.map +1 -0
  15. package/dist/services/mcp/index.cjs.js +37 -24
  16. package/dist/services/mcp/index.cjs.js.map +1 -1
  17. package/dist/services/model.cjs.js +45 -0
  18. package/dist/services/model.cjs.js.map +1 -0
  19. package/dist/services/router/agent.cjs.js +68 -0
  20. package/dist/services/router/agent.cjs.js.map +1 -0
  21. package/dist/services/router/chat.cjs.js +8 -13
  22. package/dist/services/router/chat.cjs.js.map +1 -1
  23. package/dist/services/router/index.cjs.js +4 -0
  24. package/dist/services/router/index.cjs.js.map +1 -1
  25. package/dist/services/router/models.cjs.js +2 -2
  26. package/dist/services/router/models.cjs.js.map +1 -1
  27. package/dist/services/router/settings/index.cjs.js +0 -3
  28. package/dist/services/router/settings/index.cjs.js.map +1 -1
  29. package/dist/services/router/summary.cjs.js +5 -3
  30. package/dist/services/router/summary.cjs.js.map +1 -1
  31. package/dist/services/router/tools.cjs.js +21 -0
  32. package/dist/services/router/tools.cjs.js.map +1 -0
  33. package/dist/services/summarizer.cjs.js +47 -28
  34. package/dist/services/summarizer.cjs.js.map +1 -1
  35. package/dist/services/tools.cjs.js +65 -0
  36. package/dist/services/tools.cjs.js.map +1 -0
  37. package/dist/services/user-settings.cjs.js +15 -0
  38. package/dist/services/user-settings.cjs.js.map +1 -1
  39. package/package.json +5 -3
@@ -1,26 +1,28 @@
1
1
  'use strict';
2
2
 
3
3
  var backendPluginApi = require('@backstage/backend-plugin-api');
4
- var index$1 = require('./services/router/index.cjs.js');
4
+ var index$2 = require('./services/router/index.cjs.js');
5
5
  var backstagePluginAiAssistantNode = require('@sweetoburrito/backstage-plugin-ai-assistant-node');
6
6
  var ingestor = require('./services/ingestor.cjs.js');
7
- var chat = require('./services/chat.cjs.js');
8
7
  var migrations = require('./database/migrations.cjs.js');
9
8
  var pgVectorStore = require('./database/pg-vector-store.cjs.js');
10
- var pluginSignalsNode = require('@backstage/plugin-signals-node');
11
9
  var searchKnowledge = require('./tools/searchKnowledge.cjs.js');
12
- var pluginCatalogNode = require('@backstage/plugin-catalog-node');
13
- var index = require('./services/mcp/index.cjs.js');
10
+ var index$1 = require('./services/mcp/index.cjs.js');
11
+ var chat = require('./services/chat.cjs.js');
14
12
  var callbacks = require('./services/callbacks.cjs.js');
15
13
  var summarizer = require('./services/summarizer.cjs.js');
16
14
  var userSettings = require('./services/user-settings.cjs.js');
15
+ var model = require('./services/model.cjs.js');
16
+ var tools = require('./services/tools.cjs.js');
17
+ var conversation = require('./services/conversation.cjs.js');
18
+ var index = require('./services/agent/index.cjs.js');
17
19
 
18
20
  const aiAssistantPlugin = backendPluginApi.createBackendPlugin({
19
21
  pluginId: "ai-assistant",
20
22
  register(env) {
21
23
  const ingestors = [];
22
24
  const models = [];
23
- const tools = [];
25
+ const tools$1 = [];
24
26
  const callbacks$1 = [];
25
27
  let embeddingsProvider;
26
28
  env.registerExtensionPoint(backstagePluginAiAssistantNode.dataIngestorExtensionPoint, {
@@ -50,11 +52,11 @@ const aiAssistantPlugin = backendPluginApi.createBackendPlugin({
50
52
  });
51
53
  env.registerExtensionPoint(backstagePluginAiAssistantNode.toolExtensionPoint, {
52
54
  register: (tool) => {
53
- const existingTool = tools.find((t) => t.name === tool.name);
55
+ const existingTool = tools$1.find((t) => t.name === tool.name);
54
56
  if (existingTool) {
55
57
  throw new Error(`Tool with name ${tool.name} is already registered.`);
56
58
  }
57
- tools.push(tool);
59
+ tools$1.push(tool);
58
60
  }
59
61
  });
60
62
  env.registerExtensionPoint(backstagePluginAiAssistantNode.callbackProviderExtensionPoint, {
@@ -71,13 +73,18 @@ const aiAssistantPlugin = backendPluginApi.createBackendPlugin({
71
73
  scheduler: backendPluginApi.coreServices.scheduler,
72
74
  httpAuth: backendPluginApi.coreServices.httpAuth,
73
75
  userInfo: backendPluginApi.coreServices.userInfo,
74
- signals: pluginSignalsNode.signalsServiceRef,
75
- catalog: pluginCatalogNode.catalogServiceRef,
76
- cache: backendPluginApi.coreServices.cache,
77
- auth: backendPluginApi.coreServices.auth
76
+ callback: callbacks.callbackServiceRef,
77
+ summarizer: summarizer.summarizerServiceRef,
78
+ model: model.modelServiceRef,
79
+ mcp: index$1.mcpServiceRef,
80
+ tool: tools.toolsServiceRef,
81
+ chat: chat.chatServiceRef,
82
+ userSettings: userSettings.userSettingsServiceRef,
83
+ conversation: conversation.conversationServiceRef,
84
+ agent: index.agentServiceRef
78
85
  },
79
86
  async init(options) {
80
- const { httpRouter, database, config } = options;
87
+ const { httpRouter, database, callback, model, tool } = options;
81
88
  const client = await database.getClient();
82
89
  await migrations.applyDatabaseMigrations(client);
83
90
  const vectorStore = await pgVectorStore.PgVectorStore.fromConfig(options);
@@ -90,35 +97,12 @@ const aiAssistantPlugin = backendPluginApi.createBackendPlugin({
90
97
  vectorStore,
91
98
  ingestors
92
99
  });
93
- const mcp = await index.createMcpService(options);
94
100
  const searchKnowledgeTool = searchKnowledge.createSearchKnowledgeTool({ vectorStore });
95
- tools.push(searchKnowledgeTool);
96
- const callback = await callbacks.createCallbackService({
97
- callbacks: callbacks$1
98
- });
99
- const summarizer$1 = await summarizer.createSummarizerService({
100
- config,
101
- models,
102
- callback
103
- });
104
- const chat$1 = await chat.createChatService({
105
- ...options,
106
- models,
107
- tools,
108
- mcp,
109
- callback,
110
- summarizer: summarizer$1
111
- });
112
- const userSettings$1 = await userSettings.createUserSettingsService(options);
113
- httpRouter.use(
114
- await index$1.createRouter({
115
- ...options,
116
- chat: chat$1,
117
- mcp,
118
- summarizer: summarizer$1,
119
- userSettings: userSettings$1
120
- })
121
- );
101
+ tool.registerTools(tools$1);
102
+ tool.registerCoreTools([searchKnowledgeTool]);
103
+ callback.registerCallbacks(callbacks$1);
104
+ model.registerModels(models);
105
+ httpRouter.use(await index$2.createRouter(options));
122
106
  dataIngestionPipeline.start();
123
107
  }
124
108
  });
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './services/router';\nimport {\n dataIngestorExtensionPoint,\n EmbeddingsProvider,\n embeddingsProviderExtensionPoint,\n Ingestor,\n Model,\n modelProviderExtensionPoint,\n toolExtensionPoint,\n callbackProviderExtensionPoint,\n CallbackProvider,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { Tool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { createDataIngestionPipeline } from './services/ingestor';\nimport { createChatService } from './services/chat';\nimport { applyDatabaseMigrations } from './database/migrations';\nimport { PgVectorStore } from './database';\nimport { signalsServiceRef } from '@backstage/plugin-signals-node';\nimport { createSearchKnowledgeTool } from './tools/searchKnowledge';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node';\nimport { createMcpService } from './services/mcp';\nimport { createCallbackService } from './services/callbacks';\nimport { createSummarizerService } from './services/summarizer';\nimport { createUserSettingsService } from './services/user-settings';\n/**\n * aiAssistantPlugin backend plugin\n *\n * @public\n */\n\nexport const aiAssistantPlugin = createBackendPlugin({\n pluginId: 'ai-assistant',\n register(env) {\n const ingestors: Ingestor[] = [];\n const models: Model[] = [];\n const tools: Tool[] = [];\n const callbacks: CallbackProvider[] = [];\n\n let embeddingsProvider: EmbeddingsProvider;\n\n env.registerExtensionPoint(dataIngestorExtensionPoint, {\n registerIngestor: ingestor => {\n const existingIngestor = ingestors.find(i => i.id === ingestor.id);\n if (existingIngestor) {\n throw new Error(\n `Ingestor with id ${ingestor.id} is already registered.`,\n );\n }\n ingestors.push(ingestor);\n },\n });\n\n env.registerExtensionPoint(embeddingsProviderExtensionPoint, {\n register: provider => {\n embeddingsProvider = provider;\n },\n });\n\n env.registerExtensionPoint(modelProviderExtensionPoint, {\n register: model => {\n const existingModel = models.find(m => m.id === model.id);\n if (existingModel) {\n throw new Error(`Model with id ${model.id} is already registered.`);\n }\n models.push(model);\n },\n });\n\n env.registerExtensionPoint(toolExtensionPoint, {\n register: tool => {\n const existingTool = tools.find(t => t.name === tool.name);\n if (existingTool) {\n throw new Error(`Tool with name ${tool.name} is already registered.`);\n }\n tools.push(tool);\n },\n });\n\n env.registerExtensionPoint(callbackProviderExtensionPoint, {\n register: callbackProvider => {\n callbacks.push(callbackProvider);\n },\n });\n\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n database: coreServices.database,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n userInfo: coreServices.userInfo,\n signals: signalsServiceRef,\n catalog: catalogServiceRef,\n cache: coreServices.cache,\n auth: coreServices.auth,\n },\n\n async init(options) {\n const { httpRouter, database, config } = options;\n\n const client = await database.getClient();\n\n await applyDatabaseMigrations(client);\n\n const vectorStore = await PgVectorStore.fromConfig(options);\n\n if (!embeddingsProvider) {\n throw new Error('No Embeddings Provider was registered.');\n }\n\n vectorStore.connectEmbeddings(await embeddingsProvider.getEmbeddings());\n\n const dataIngestionPipeline = createDataIngestionPipeline({\n ...options,\n vectorStore,\n ingestors,\n });\n\n const mcp = await createMcpService(options);\n\n const searchKnowledgeTool = createSearchKnowledgeTool({ vectorStore });\n tools.push(searchKnowledgeTool);\n\n const callback = await createCallbackService({\n callbacks,\n });\n\n const summarizer = await createSummarizerService({\n config,\n models,\n callback,\n });\n\n const chat = await createChatService({\n ...options,\n models,\n tools,\n mcp,\n callback,\n summarizer,\n });\n\n const userSettings = await createUserSettingsService(options);\n\n httpRouter.use(\n await createRouter({\n ...options,\n chat,\n mcp,\n summarizer,\n userSettings,\n }),\n );\n dataIngestionPipeline.start();\n },\n });\n },\n});\n"],"names":["createBackendPlugin","callbacks","dataIngestorExtensionPoint","embeddingsProviderExtensionPoint","modelProviderExtensionPoint","toolExtensionPoint","callbackProviderExtensionPoint","coreServices","signalsServiceRef","catalogServiceRef","applyDatabaseMigrations","PgVectorStore","createDataIngestionPipeline","createMcpService","createSearchKnowledgeTool","createCallbackService","summarizer","createSummarizerService","chat","createChatService","userSettings","createUserSettingsService","createRouter"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './services/router';\nimport {\n dataIngestorExtensionPoint,\n EmbeddingsProvider,\n embeddingsProviderExtensionPoint,\n Ingestor,\n Model,\n modelProviderExtensionPoint,\n toolExtensionPoint,\n callbackProviderExtensionPoint,\n CallbackProvider,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { Tool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { createDataIngestionPipeline } from './services/ingestor';\nimport { applyDatabaseMigrations } from './database/migrations';\nimport { PgVectorStore } from './database';\nimport { createSearchKnowledgeTool } from './tools/searchKnowledge';\nimport {\n callbackServiceRef,\n summarizerServiceRef,\n modelServiceRef,\n mcpServiceRef,\n toolsServiceRef,\n chatServiceRef,\n userSettingsServiceRef,\n conversationServiceRef,\n agentServiceRef,\n} from './services';\n\n/**\n * aiAssistantPlugin backend plugin\n *\n * @public\n */\n\nexport const aiAssistantPlugin = createBackendPlugin({\n pluginId: 'ai-assistant',\n register(env) {\n const ingestors: Ingestor[] = [];\n const models: Model[] = [];\n const tools: Tool[] = [];\n const callbacks: CallbackProvider[] = [];\n\n let embeddingsProvider: EmbeddingsProvider;\n\n env.registerExtensionPoint(dataIngestorExtensionPoint, {\n registerIngestor: ingestor => {\n const existingIngestor = ingestors.find(i => i.id === ingestor.id);\n if (existingIngestor) {\n throw new Error(\n `Ingestor with id ${ingestor.id} is already registered.`,\n );\n }\n ingestors.push(ingestor);\n },\n });\n\n env.registerExtensionPoint(embeddingsProviderExtensionPoint, {\n register: provider => {\n embeddingsProvider = provider;\n },\n });\n\n env.registerExtensionPoint(modelProviderExtensionPoint, {\n register: model => {\n const existingModel = models.find(m => m.id === model.id);\n if (existingModel) {\n throw new Error(`Model with id ${model.id} is already registered.`);\n }\n models.push(model);\n },\n });\n\n env.registerExtensionPoint(toolExtensionPoint, {\n register: tool => {\n const existingTool = tools.find(t => t.name === tool.name);\n if (existingTool) {\n throw new Error(`Tool with name ${tool.name} is already registered.`);\n }\n tools.push(tool);\n },\n });\n\n env.registerExtensionPoint(callbackProviderExtensionPoint, {\n register: callbackProvider => {\n callbacks.push(callbackProvider);\n },\n });\n\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n database: coreServices.database,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n userInfo: coreServices.userInfo,\n callback: callbackServiceRef,\n summarizer: summarizerServiceRef,\n model: modelServiceRef,\n mcp: mcpServiceRef,\n tool: toolsServiceRef,\n chat: chatServiceRef,\n userSettings: userSettingsServiceRef,\n conversation: conversationServiceRef,\n agent: agentServiceRef,\n },\n\n async init(options) {\n const { httpRouter, database, callback, model, tool } = options;\n\n const client = await database.getClient();\n\n await applyDatabaseMigrations(client);\n\n const vectorStore = await PgVectorStore.fromConfig(options);\n\n if (!embeddingsProvider) {\n throw new Error('No Embeddings Provider was registered.');\n }\n\n vectorStore.connectEmbeddings(await embeddingsProvider.getEmbeddings());\n\n const dataIngestionPipeline = createDataIngestionPipeline({\n ...options,\n vectorStore,\n ingestors,\n });\n\n const searchKnowledgeTool = createSearchKnowledgeTool({ vectorStore });\n\n tool.registerTools(tools);\n tool.registerCoreTools([searchKnowledgeTool]);\n callback.registerCallbacks(callbacks);\n model.registerModels(models);\n\n httpRouter.use(await createRouter(options));\n dataIngestionPipeline.start();\n },\n });\n },\n});\n"],"names":["createBackendPlugin","tools","callbacks","dataIngestorExtensionPoint","embeddingsProviderExtensionPoint","modelProviderExtensionPoint","toolExtensionPoint","callbackProviderExtensionPoint","coreServices","callbackServiceRef","summarizerServiceRef","modelServiceRef","mcpServiceRef","toolsServiceRef","chatServiceRef","userSettingsServiceRef","conversationServiceRef","agentServiceRef","applyDatabaseMigrations","PgVectorStore","createDataIngestionPipeline","createSearchKnowledgeTool","createRouter"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ var uuid = require('uuid');
4
+
5
+ const parseLangchainMessage = (message, traceId) => {
6
+ const id = uuid.validate(message.id) ? message.id : uuid.v4();
7
+ const role = message.getType();
8
+ const content = typeof message.content === "string" ? message.content : JSON.stringify(message.content);
9
+ const metadata = {};
10
+ if (role === "ai") {
11
+ const aiMessage = message;
12
+ metadata.toolCalls = aiMessage.tool_calls || [];
13
+ metadata.finishReason = aiMessage.response_metadata.finish_reason || void 0;
14
+ metadata.modelName = aiMessage.response_metadata.model_name || void 0;
15
+ }
16
+ if (role === "tool") {
17
+ const toolMessage = message;
18
+ metadata.name = toolMessage.name || "";
19
+ }
20
+ return {
21
+ id,
22
+ role,
23
+ content,
24
+ metadata,
25
+ score: 0,
26
+ traceId
27
+ };
28
+ };
29
+
30
+ exports.parseLangchainMessage = parseLangchainMessage;
31
+ //# sourceMappingURL=message-parser.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-parser.cjs.js","sources":["../../../../src/services/agent/helpers/message-parser.ts"],"sourcesContent":["import { AIMessage, ToolMessage, BaseMessage } from '@langchain/core/messages';\n\nimport {\n JsonObject,\n Message,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { v4 as uuid, validate } from 'uuid';\n\nexport const parseLangchainMessage = (\n message: BaseMessage,\n traceId: string,\n): Message => {\n const id = validate(message.id) ? message.id : uuid();\n const role = message.getType();\n const content =\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content);\n\n const metadata: JsonObject = {};\n\n if (role === 'ai') {\n const aiMessage = message as AIMessage;\n\n metadata.toolCalls = aiMessage.tool_calls || [];\n metadata.finishReason =\n aiMessage.response_metadata.finish_reason || undefined;\n metadata.modelName = aiMessage.response_metadata.model_name || undefined;\n }\n\n if (role === 'tool') {\n const toolMessage = message as ToolMessage;\n metadata.name = toolMessage.name || '';\n }\n\n return {\n id,\n role,\n content,\n metadata,\n score: 0,\n traceId,\n };\n};\n"],"names":["validate","uuid"],"mappings":";;;;AAQO,MAAM,qBAAA,GAAwB,CACnC,OAAA,EACA,OAAA,KACY;AACZ,EAAA,MAAM,KAAKA,aAAA,CAAS,OAAA,CAAQ,EAAE,CAAA,GAAI,OAAA,CAAQ,KAAKC,OAAA,EAAK;AACpD,EAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,EAAQ;AAC7B,EAAA,MAAM,OAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GACvB,QAAQ,OAAA,GACR,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAA;AAEpC,EAAA,MAAM,WAAuB,EAAC;AAE9B,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,MAAM,SAAA,GAAY,OAAA;AAElB,IAAA,QAAA,CAAS,SAAA,GAAY,SAAA,CAAU,UAAA,IAAc,EAAC;AAC9C,IAAA,QAAA,CAAS,YAAA,GACP,SAAA,CAAU,iBAAA,CAAkB,aAAA,IAAiB,MAAA;AAC/C,IAAA,QAAA,CAAS,SAAA,GAAY,SAAA,CAAU,iBAAA,CAAkB,UAAA,IAAc,MAAA;AAAA,EACjE;AAEA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,WAAA,GAAc,OAAA;AACpB,IAAA,QAAA,CAAS,IAAA,GAAO,YAAY,IAAA,IAAQ,EAAA;AAAA,EACtC;AAEA,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const toolFilter = (t, enabledTools) => {
4
+ if (enabledTools === void 0) return true;
5
+ if (enabledTools.length === 0) return false;
6
+ const enabled = enabledTools.find(
7
+ (enabledTool) => enabledTool.name === t.name && enabledTool.provider === t.provider
8
+ );
9
+ return !!enabled;
10
+ };
11
+
12
+ exports.toolFilter = toolFilter;
13
+ //# sourceMappingURL=tool-filter.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-filter.cjs.js","sources":["../../../../src/services/agent/helpers/tool-filter.ts"],"sourcesContent":["import {\n EnabledTool,\n Tool,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\n\nexport const toolFilter = (\n t: Tool,\n enabledTools: EnabledTool[] | undefined,\n): boolean => {\n if (enabledTools === undefined) return true;\n\n // If empty array, no tools should be enabled\n if (enabledTools.length === 0) return false;\n // Otherwise, only allow tools that are in the enabled list\n const enabled = enabledTools.find(\n enabledTool =>\n enabledTool.name === t.name && enabledTool.provider === t.provider,\n );\n return !!enabled;\n};\n"],"names":[],"mappings":";;AAKO,MAAM,UAAA,GAAa,CACxB,CAAA,EACA,YAAA,KACY;AACZ,EAAA,IAAI,YAAA,KAAiB,QAAW,OAAO,IAAA;AAGvC,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAEtC,EAAA,MAAM,UAAU,YAAA,CAAa,IAAA;AAAA,IAC3B,iBACE,WAAA,CAAY,IAAA,KAAS,EAAE,IAAA,IAAQ,WAAA,CAAY,aAAa,CAAA,CAAE;AAAA,GAC9D;AACA,EAAA,OAAO,CAAC,CAAC,OAAA;AACX;;;;"}
@@ -0,0 +1,140 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var prebuilt = require('@langchain/langgraph/prebuilt');
5
+ var toolFilter = require('./helpers/tool-filter.cjs.js');
6
+ var prompts = require('../../constants/prompts.cjs.js');
7
+ var prompts$1 = require('@langchain/core/prompts');
8
+ var callbacks = require('../callbacks.cjs.js');
9
+ var model = require('../model.cjs.js');
10
+ var tools = require('../tools.cjs.js');
11
+ var messageParser = require('./helpers/message-parser.cjs.js');
12
+
13
+ const createAgentService = ({
14
+ model,
15
+ tool,
16
+ config,
17
+ callback
18
+ }) => {
19
+ const identityPrompt = config.getOptionalString("aiAssistant.prompt.identity") || prompts.DEFAULT_IDENTITY_PROMPT;
20
+ const formattingPrompt = config.getOptionalString("aiAssistant.prompt.formatting") || prompts.DEFAULT_FORMATTING_PROMPT;
21
+ const contentPrompt = config.getOptionalString("aiAssistant.prompt.content") || prompts.DEFAULT_SYSTEM_PROMPT;
22
+ const defaultBasePrompt = `${identityPrompt}
23
+
24
+ ${formattingPrompt}
25
+
26
+ ${contentPrompt}`;
27
+ const toolGuideline = config.getOptionalString("aiAssistant.prompt.toolGuideline") || prompts.DEFAULT_TOOL_GUIDELINE;
28
+ const systemPromptTemplate = prompts$1.SystemMessagePromptTemplate.fromTemplate(`
29
+ PURPOSE:
30
+ {systemPrompt}
31
+
32
+ TOOL USAGE GUIDELINES:
33
+ {toolGuideline}
34
+
35
+ Available tools:
36
+ {toolList}
37
+
38
+ Context:
39
+ {context}`);
40
+ const createAgent = async (options) => {
41
+ const {
42
+ modelId,
43
+ credentials,
44
+ tools: enabledTools,
45
+ systemPrompt = defaultBasePrompt,
46
+ context = "none",
47
+ metadata: { conversationId, userId, runId, runName }
48
+ } = options;
49
+ const { chatModel: llm, id: resolvedModelId } = model.getModel(
50
+ modelId ?? "default"
51
+ );
52
+ const tools = await tool.getPrincipalTools({
53
+ credentials,
54
+ filter: (t) => {
55
+ return toolFilter.toolFilter(t, enabledTools);
56
+ }
57
+ });
58
+ const toolList = tools.map((t) => `- ${t.name}: ${t.description}`).join("\n");
59
+ const agentPrompt = await systemPromptTemplate.formatMessages({
60
+ toolGuideline,
61
+ toolList,
62
+ context,
63
+ systemPrompt
64
+ });
65
+ const agent = prebuilt.createReactAgent({
66
+ llm,
67
+ tools,
68
+ prompt: agentPrompt[0].text
69
+ });
70
+ const { callbacks } = await callback.getChainCallbacks({
71
+ userId,
72
+ conversationId,
73
+ modelId: resolvedModelId
74
+ });
75
+ const { metadata } = await callback.getChainMetadata({
76
+ userId,
77
+ conversationId,
78
+ modelId: resolvedModelId
79
+ });
80
+ agent.config = {
81
+ ...agent.config,
82
+ callbacks,
83
+ metadata,
84
+ runId,
85
+ runName
86
+ };
87
+ return agent;
88
+ };
89
+ const stream = async (options) => {
90
+ const { messages, onStreamChunk } = options;
91
+ const agent = await createAgent(options);
92
+ const promptStream = await agent.stream(
93
+ {
94
+ messages
95
+ },
96
+ {
97
+ streamMode: ["values"]
98
+ }
99
+ );
100
+ for await (const [, chunk] of promptStream) {
101
+ const { messages: promptMessages } = chunk;
102
+ const parsedMessages = promptMessages.map(
103
+ (m) => messageParser.parseLangchainMessage(m, options.metadata.runId)
104
+ );
105
+ onStreamChunk(parsedMessages);
106
+ }
107
+ };
108
+ const prompt = async (options) => {
109
+ const {
110
+ messages,
111
+ metadata: { runId }
112
+ } = options;
113
+ const agent = await createAgent(options);
114
+ const result = await agent.invoke({
115
+ messages
116
+ });
117
+ return result.messages.map(
118
+ (m) => messageParser.parseLangchainMessage(m, runId)
119
+ );
120
+ };
121
+ return { prompt, stream };
122
+ };
123
+ const agentServiceRef = backendPluginApi.createServiceRef({
124
+ id: "ai-assistant.conversation-service",
125
+ defaultFactory: async (service) => backendPluginApi.createServiceFactory({
126
+ service,
127
+ deps: {
128
+ config: backendPluginApi.coreServices.rootConfig,
129
+ model: model.modelServiceRef,
130
+ tool: tools.toolsServiceRef,
131
+ callback: callbacks.callbackServiceRef
132
+ },
133
+ factory: async (options) => {
134
+ return createAgentService(options);
135
+ }
136
+ })
137
+ });
138
+
139
+ exports.agentServiceRef = agentServiceRef;
140
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/services/agent/index.ts"],"sourcesContent":["import {\n BackstageCredentials,\n coreServices,\n createServiceFactory,\n createServiceRef,\n RootConfigService,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { createReactAgent } from '@langchain/langgraph/prebuilt';\nimport {\n EnabledTool,\n Message,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { toolFilter } from './helpers/tool-filter';\nimport {\n DEFAULT_FORMATTING_PROMPT,\n DEFAULT_IDENTITY_PROMPT,\n DEFAULT_SYSTEM_PROMPT,\n DEFAULT_TOOL_GUIDELINE,\n} from '../../constants/prompts';\nimport { SystemMessagePromptTemplate } from '@langchain/core/prompts';\n\nimport { CallbackService, callbackServiceRef } from '../callbacks';\nimport { modelServiceRef, ModelService } from '../model';\nimport { toolsServiceRef, ToolsService } from '../tools';\n\nimport { BaseMessage } from '@langchain/core/messages';\nimport { parseLangchainMessage } from './helpers/message-parser';\n\ntype PromptOptions = {\n credentials: BackstageCredentials;\n metadata: {\n conversationId: string;\n userId: string;\n runName: string;\n runId: string;\n };\n messages: Message[];\n modelId?: string;\n tools?: EnabledTool[];\n systemPrompt?: string;\n context?: string;\n};\n\ntype StreamOptions = PromptOptions & {\n onStreamChunk: (messages: Message[]) => void;\n};\n\nexport type AgentService = {\n prompt: (options: PromptOptions) => Promise<Message[]>;\n stream: (options: StreamOptions) => Promise<void>;\n};\n\ntype AgentServiceOptions = {\n model: ModelService;\n config: RootConfigService;\n tool: ToolsService;\n callback: CallbackService;\n};\n\nconst createAgentService = ({\n model,\n tool,\n config,\n callback,\n}: AgentServiceOptions): AgentService => {\n const identityPrompt =\n config.getOptionalString('aiAssistant.prompt.identity') ||\n DEFAULT_IDENTITY_PROMPT;\n\n const formattingPrompt =\n config.getOptionalString('aiAssistant.prompt.formatting') ||\n DEFAULT_FORMATTING_PROMPT;\n\n const contentPrompt =\n config.getOptionalString('aiAssistant.prompt.content') ||\n DEFAULT_SYSTEM_PROMPT;\n\n const defaultBasePrompt = `${identityPrompt}\\n\\n${formattingPrompt}\\n\\n${contentPrompt}`;\n\n const toolGuideline =\n config.getOptionalString('aiAssistant.prompt.toolGuideline') ||\n DEFAULT_TOOL_GUIDELINE;\n\n const systemPromptTemplate = SystemMessagePromptTemplate.fromTemplate(`\n PURPOSE:\n {systemPrompt}\n\n TOOL USAGE GUIDELINES:\n {toolGuideline}\n\n Available tools:\n {toolList}\n\n Context:\n {context}`);\n\n const createAgent = async (\n options: PromptOptions,\n ): Promise<ReturnType<typeof createReactAgent>> => {\n const {\n modelId,\n credentials,\n tools: enabledTools,\n systemPrompt = defaultBasePrompt,\n context = 'none',\n metadata: { conversationId, userId, runId, runName },\n } = options;\n\n const { chatModel: llm, id: resolvedModelId } = model.getModel(\n modelId ?? 'default',\n );\n\n const tools = await tool.getPrincipalTools({\n credentials,\n filter: t => {\n return toolFilter(t, enabledTools);\n },\n });\n\n const toolList = tools.map(t => `- ${t.name}: ${t.description}`).join('\\n');\n\n const agentPrompt = await systemPromptTemplate.formatMessages({\n toolGuideline,\n toolList,\n context,\n systemPrompt,\n });\n\n const agent = createReactAgent({\n llm,\n tools,\n prompt: agentPrompt[0].text,\n });\n\n const { callbacks } = await callback.getChainCallbacks({\n userId,\n conversationId,\n modelId: resolvedModelId,\n });\n\n const { metadata } = await callback.getChainMetadata({\n userId,\n conversationId,\n modelId: resolvedModelId,\n });\n\n agent.config = {\n ...agent.config,\n callbacks,\n metadata,\n runId,\n runName,\n };\n\n return agent;\n };\n\n const stream: AgentService['stream'] = async options => {\n const { messages, onStreamChunk } = options;\n\n const agent = await createAgent(options);\n\n const promptStream = await agent.stream(\n {\n messages,\n },\n {\n streamMode: ['values'],\n },\n );\n\n for await (const [, chunk] of promptStream) {\n const { messages: promptMessages } = chunk;\n\n const parsedMessages: Message[] = (promptMessages as BaseMessage[]).map(\n m => parseLangchainMessage(m, options.metadata.runId),\n );\n\n onStreamChunk(parsedMessages);\n }\n };\n\n const prompt: AgentService['prompt'] = async options => {\n const {\n messages,\n metadata: { runId },\n } = options;\n const agent = await createAgent(options);\n\n const result = await agent.invoke({\n messages,\n });\n\n return (result.messages as BaseMessage[]).map(m =>\n parseLangchainMessage(m, runId),\n );\n };\n\n return { prompt, stream };\n};\n\nexport const agentServiceRef: ServiceRef<AgentService, 'plugin', 'singleton'> =\n createServiceRef<AgentService>({\n id: 'ai-assistant.conversation-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n config: coreServices.rootConfig,\n model: modelServiceRef,\n tool: toolsServiceRef,\n callback: callbackServiceRef,\n },\n factory: async options => {\n return createAgentService(options);\n },\n }),\n });\n"],"names":["DEFAULT_IDENTITY_PROMPT","DEFAULT_FORMATTING_PROMPT","DEFAULT_SYSTEM_PROMPT","DEFAULT_TOOL_GUIDELINE","SystemMessagePromptTemplate","toolFilter","createReactAgent","parseLangchainMessage","createServiceRef","createServiceFactory","coreServices","modelServiceRef","toolsServiceRef","callbackServiceRef"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- const createCallbackService = async ({
4
- callbacks
5
- }) => {
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+
5
+ const createCallbackService = async ({}) => {
6
+ const callbacks = [];
6
7
  const getChainCallbacks = async (options) => {
7
8
  const callbackHandlers = [];
8
9
  for (const { chainCallback } of callbacks) {
@@ -27,10 +28,7 @@ const createCallbackService = async ({
27
28
  }
28
29
  return { metadata };
29
30
  };
30
- const handleScoreCallbacks = async ({
31
- name,
32
- message
33
- }) => {
31
+ const handleScoreCallbacks = async ({ name, message }) => {
34
32
  callbacks.forEach(async ({ scoreCallback }) => {
35
33
  if (!scoreCallback) {
36
34
  return;
@@ -38,12 +36,28 @@ const createCallbackService = async ({
38
36
  scoreCallback({ name, message });
39
37
  });
40
38
  };
39
+ const registerCallbacks = (newCallbacks) => {
40
+ newCallbacks.forEach((callback) => {
41
+ callbacks.push(callback);
42
+ });
43
+ };
41
44
  return {
42
45
  getChainCallbacks,
43
46
  getChainMetadata,
44
- handleScoreCallbacks
47
+ handleScoreCallbacks,
48
+ registerCallbacks
45
49
  };
46
50
  };
51
+ const callbackServiceRef = backendPluginApi.createServiceRef({
52
+ id: "ai-assistant.callback-service",
53
+ defaultFactory: async (service) => backendPluginApi.createServiceFactory({
54
+ service,
55
+ deps: {},
56
+ factory: async (options) => {
57
+ return createCallbackService(options);
58
+ }
59
+ })
60
+ });
47
61
 
48
- exports.createCallbackService = createCallbackService;
62
+ exports.callbackServiceRef = callbackServiceRef;
49
63
  //# sourceMappingURL=callbacks.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"callbacks.cjs.js","sources":["../../src/services/callbacks.ts"],"sourcesContent":["import {\n CallbackProvider,\n ChainMetadata,\n ChainCallbackOptions,\n ChainCallback,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\n\nexport type CallbackService = {\n getChainCallbacks: (options: ChainCallbackOptions) => Promise<{\n callbacks: ReturnType<ChainCallback>[];\n }>;\n\n getChainMetadata: (\n options: ChainCallbackOptions,\n ) => Promise<{ metadata: ChainMetadata }>;\n\n handleScoreCallbacks: NonNullable<CallbackProvider['scoreCallback']>;\n};\n\nexport type CreateCallbackServiceOptions = {\n callbacks: CallbackProvider[];\n};\n\nexport const createCallbackService = async ({\n callbacks,\n}: CreateCallbackServiceOptions): Promise<CallbackService> => {\n const getChainCallbacks: CallbackService['getChainCallbacks'] =\n async options => {\n const callbackHandlers: ReturnType<ChainCallback>[] = [];\n\n for (const { chainCallback } of callbacks) {\n if (!chainCallback) {\n continue;\n }\n\n const callbackHandler = await chainCallback(options);\n\n callbackHandlers.push(callbackHandler);\n }\n\n return {\n callbacks: callbackHandlers,\n };\n };\n\n const getChainMetadata: CallbackService['getChainMetadata'] =\n async options => {\n const metadata: ChainMetadata = {};\n\n for (const { chainMetadataCallback } of callbacks) {\n if (!chainMetadataCallback) {\n continue;\n }\n\n const callbackData = await chainMetadataCallback(options);\n\n Object.assign(metadata, callbackData.metadata);\n }\n\n return { metadata };\n };\n\n const handleScoreCallbacks: CallbackService['handleScoreCallbacks'] = async ({\n name,\n message,\n }) => {\n callbacks.forEach(async ({ scoreCallback }) => {\n if (!scoreCallback) {\n return;\n }\n\n scoreCallback({ name, message });\n });\n };\n\n return {\n getChainCallbacks,\n getChainMetadata,\n handleScoreCallbacks,\n };\n};\n"],"names":[],"mappings":";;AAuBO,MAAM,wBAAwB,OAAO;AAAA,EAC1C;AACF,CAAA,KAA8D;AAC5D,EAAA,MAAM,iBAAA,GACJ,OAAM,OAAA,KAAW;AACf,IAAA,MAAM,mBAAgD,EAAC;AAEvD,IAAA,KAAA,MAAW,EAAE,aAAA,EAAc,IAAK,SAAA,EAAW;AACzC,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc,OAAO,CAAA;AAEnD,MAAA,gBAAA,CAAiB,KAAK,eAAe,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA;AAEF,EAAA,MAAM,gBAAA,GACJ,OAAM,OAAA,KAAW;AACf,IAAA,MAAM,WAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,EAAE,qBAAA,EAAsB,IAAK,SAAA,EAAW;AACjD,MAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,qBAAA,CAAsB,OAAO,CAAA;AAExD,MAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,YAAA,CAAa,QAAQ,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB,CAAA;AAEF,EAAA,MAAM,uBAAgE,OAAO;AAAA,IAC3E,IAAA;AAAA,IACA;AAAA,GACF,KAAM;AACJ,IAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,aAAA,EAAc,KAAM;AAC7C,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"callbacks.cjs.js","sources":["../../src/services/callbacks.ts"],"sourcesContent":["import {\n CallbackProvider,\n ChainMetadata,\n ChainCallbackOptions,\n ChainCallback,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\n\nimport {\n createServiceFactory,\n createServiceRef,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\n\nexport type CallbackService = {\n getChainCallbacks: (options: ChainCallbackOptions) => Promise<{\n callbacks: ReturnType<ChainCallback>[];\n }>;\n\n getChainMetadata: (\n options: ChainCallbackOptions,\n ) => Promise<{ metadata: ChainMetadata }>;\n\n handleScoreCallbacks: NonNullable<CallbackProvider['scoreCallback']>;\n\n registerCallbacks: (callbacks: CallbackProvider[]) => void;\n};\n\nexport type CreateCallbackServiceOptions = {};\n\nconst createCallbackService =\n async ({}: CreateCallbackServiceOptions): Promise<CallbackService> => {\n const callbacks: CallbackProvider[] = [];\n\n const getChainCallbacks: CallbackService['getChainCallbacks'] =\n async options => {\n const callbackHandlers: ReturnType<ChainCallback>[] = [];\n\n for (const { chainCallback } of callbacks) {\n if (!chainCallback) {\n continue;\n }\n\n const callbackHandler = await chainCallback(options);\n\n callbackHandlers.push(callbackHandler);\n }\n\n return {\n callbacks: callbackHandlers,\n };\n };\n\n const getChainMetadata: CallbackService['getChainMetadata'] =\n async options => {\n const metadata: ChainMetadata = {};\n\n for (const { chainMetadataCallback } of callbacks) {\n if (!chainMetadataCallback) {\n continue;\n }\n\n const callbackData = await chainMetadataCallback(options);\n\n Object.assign(metadata, callbackData.metadata);\n }\n\n return { metadata };\n };\n\n const handleScoreCallbacks: CallbackService['handleScoreCallbacks'] =\n async ({ name, message }) => {\n callbacks.forEach(async ({ scoreCallback }) => {\n if (!scoreCallback) {\n return;\n }\n\n scoreCallback({ name, message });\n });\n };\n\n const registerCallbacks: CallbackService['registerCallbacks'] =\n newCallbacks => {\n newCallbacks.forEach(callback => {\n callbacks.push(callback);\n });\n };\n\n return {\n getChainCallbacks,\n getChainMetadata,\n handleScoreCallbacks,\n registerCallbacks,\n };\n };\n\nexport const callbackServiceRef: ServiceRef<\n CallbackService,\n 'plugin',\n 'singleton'\n> = createServiceRef<CallbackService>({\n id: 'ai-assistant.callback-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {},\n factory: async options => {\n return createCallbackService(options);\n },\n }),\n});\n"],"names":["createServiceRef","createServiceFactory"],"mappings":";;;;AA6BA,MAAM,qBAAA,GACJ,OAAO,EAAC,KAA8D;AACpE,EAAA,MAAM,YAAgC,EAAC;AAEvC,EAAA,MAAM,iBAAA,GACJ,OAAM,OAAA,KAAW;AACf,IAAA,MAAM,mBAAgD,EAAC;AAEvD,IAAA,KAAA,MAAW,EAAE,aAAA,EAAc,IAAK,SAAA,EAAW;AACzC,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc,OAAO,CAAA;AAEnD,MAAA,gBAAA,CAAiB,KAAK,eAAe,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA;AAEF,EAAA,MAAM,gBAAA,GACJ,OAAM,OAAA,KAAW;AACf,IAAA,MAAM,WAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,EAAE,qBAAA,EAAsB,IAAK,SAAA,EAAW;AACjD,MAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,qBAAA,CAAsB,OAAO,CAAA;AAExD,MAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,YAAA,CAAa,QAAQ,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB,CAAA;AAEF,EAAA,MAAM,oBAAA,GACJ,OAAO,EAAE,IAAA,EAAM,SAAQ,KAAM;AAC3B,IAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,aAAA,EAAc,KAAM;AAC7C,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAA;AAEF,EAAA,MAAM,oBACJ,CAAA,YAAA,KAAgB;AACd,IAAA,YAAA,CAAa,QAAQ,CAAA,QAAA,KAAY;AAC/B,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACH,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEK,MAAM,qBAITA,iCAAA,CAAkC;AAAA,EACpC,EAAA,EAAI,+BAAA;AAAA,EACJ,cAAA,EAAgB,OAAM,OAAA,KACpBC,qCAAA,CAAqB;AAAA,IACnB,OAAA;AAAA,IACA,MAAM,EAAC;AAAA,IACP,OAAA,EAAS,OAAM,OAAA,KAAW;AACxB,MAAA,OAAO,sBAAsB,OAAO,CAAA;AAAA,IACtC;AAAA,GACD;AACL,CAAC;;;;"}