@red-hat-developer-hub/backstage-plugin-intelligent-assistant-backend 4.0.0 → 4.2.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/config.d.ts DELETED
@@ -1,142 +0,0 @@
1
- /*
2
- * Copyright Red Hat, Inc.
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
-
17
- export interface Config {
18
- /**
19
- * Configuration required for using intelligent-assistant
20
- * @visibility frontend
21
- */
22
- 'intelligent-assistant'?: {
23
- /**
24
- * configure the port number for the lightspeed service.
25
- * @visibility backend
26
- */
27
- servicePort?: number;
28
- /**
29
- * customize system prompt for the lightspeed service.
30
- * @visibility backend
31
- */
32
- systemPrompt?: string;
33
- /**
34
- * configure the MCP server for the lightspeed service.
35
- * @visibility backend
36
- */
37
- mcpServers?: Array<{
38
- /**
39
- * The name of the MCP server. Must match the name registered in LCS config.
40
- * The URL is fetched from LCS (GET /v1/mcp-servers) at startup.
41
- * @visibility backend
42
- */
43
- name: string;
44
- /**
45
- * The default access token for authenticating with this MCP server.
46
- * Optional — if omitted, users must provide their own token via the UI.
47
- * Users can also override this with a personal token via PATCH /mcp-servers/:name.
48
- * @visibility secret
49
- */
50
- token?: string;
51
- /**
52
- * Authentication mode for this MCP server.
53
- * Set to 'dcr' for Dynamic Client Registration (user-bound tokens minted per-request).
54
- * When omitted, falls back to static-token mode.
55
- * @visibility frontend
56
- */
57
- auth?: 'dcr';
58
- }>;
59
- /**
60
- * Per-user rate limiting for Lightspeed API endpoints.
61
- * @visibility backend
62
- */
63
- rateLimit?: {
64
- /**
65
- * Limits for expensive endpoints (LLM queries, document uploads).
66
- * @visibility backend
67
- */
68
- expensive?: {
69
- /**
70
- * Maximum requests per minute per user.
71
- * Set to 0 to disable rate limiting for this tier.
72
- * @default 25
73
- * @visibility backend
74
- */
75
- max?: number;
76
- };
77
- /**
78
- * Limits for all other authenticated endpoints.
79
- * @visibility backend
80
- */
81
- general?: {
82
- /**
83
- * Maximum requests per minute per user.
84
- * Set to 0 to disable rate limiting for this tier.
85
- * @default 200
86
- * @visibility backend
87
- */
88
- max?: number;
89
- };
90
- };
91
- /**
92
- * Configuration for AI Notebooks (Developer Preview)
93
- */
94
- notebooks?: {
95
- /**
96
- * Enable/disable AI Notebooks feature
97
- * When enabled, exposes AI Notebooks REST API endpoints for document-based conversations with RAG.
98
- * Requires Lightspeed service to be running (host and port default to 127.0.0.1 and 8080).
99
- * @default false
100
- * @visibility frontend
101
- */
102
- enabled: boolean;
103
- /**
104
- * Lightspeed configuration
105
- * @visibility backend
106
- */
107
- queryDefaults: {
108
- /**
109
- * Model to use for answering queries. Must map to a model available through the provider set in provider_id.
110
- * @visibility backend
111
- */
112
- model: string;
113
- /**
114
- * AI provider for the query model. Must map to a provider enabled in your Lightspeed config.
115
- * @visibility backend
116
- */
117
- provider_id: string;
118
- };
119
- /**
120
- * Chunking strategy for document processing
121
- * @visibility backend
122
- */
123
- chunkingStrategy?: {
124
- /**
125
- * Document chunking strategy - 'auto' (automatic, default) or 'static' (fixed size)
126
- * @visibility backend
127
- */
128
- type?: 'auto' | 'static';
129
- /**
130
- * Maximum chunk size in tokens for static chunking (default: 512)
131
- * @visibility backend
132
- */
133
- maxChunkSizeTokens?: number;
134
- /**
135
- * Token overlap between chunks for static chunking (default: 50)
136
- * @visibility backend
137
- */
138
- chunkOverlapTokens?: number;
139
- };
140
- };
141
- };
142
- }
@@ -1,139 +0,0 @@
1
- 'use strict';
2
-
3
- var errors = require('@backstage/errors');
4
- var yaml = require('js-yaml');
5
- var pdfjsLib = require('pdfjs-dist');
6
- var stream = require('stream');
7
- var constant = require('../../constant.cjs.js');
8
-
9
- function _interopNamespaceCompat(e) {
10
- if (e && typeof e === 'object' && 'default' in e) return e;
11
- var n = Object.create(null);
12
- if (e) {
13
- Object.keys(e).forEach(function (k) {
14
- if (k !== 'default') {
15
- var d = Object.getOwnPropertyDescriptor(e, k);
16
- Object.defineProperty(n, k, d.get ? d : {
17
- enumerable: true,
18
- get: function () { return e[k]; }
19
- });
20
- }
21
- });
22
- }
23
- n.default = e;
24
- return Object.freeze(n);
25
- }
26
-
27
- var yaml__namespace = /*#__PURE__*/_interopNamespaceCompat(yaml);
28
- var pdfjsLib__namespace = /*#__PURE__*/_interopNamespaceCompat(pdfjsLib);
29
-
30
- function parseTextFile(buffer, fileName, fileType) {
31
- const content = buffer.toString("utf-8");
32
- return {
33
- content,
34
- metadata: {
35
- fileName,
36
- fileType,
37
- parseTimestamp: (/* @__PURE__ */ new Date()).toISOString()
38
- }
39
- };
40
- }
41
- function parseJSONFile(buffer, fileName, fileType) {
42
- try {
43
- const content = buffer.toString("utf-8");
44
- JSON.parse(content);
45
- return {
46
- content,
47
- metadata: {
48
- fileName,
49
- fileType,
50
- parseTimestamp: (/* @__PURE__ */ new Date()).toISOString()
51
- }
52
- };
53
- } catch (error) {
54
- throw new errors.InputError(`Invalid JSON file: ${error}`);
55
- }
56
- }
57
- function parseYAMLFile(buffer, fileName, fileType) {
58
- try {
59
- const content = buffer.toString("utf-8");
60
- yaml__namespace.load(content);
61
- return {
62
- content,
63
- metadata: {
64
- fileName,
65
- fileType,
66
- parseTimestamp: (/* @__PURE__ */ new Date()).toISOString()
67
- }
68
- };
69
- } catch (error) {
70
- throw new errors.InputError(`Invalid YAML file: ${error}`);
71
- }
72
- }
73
- async function parsePDFFile(buffer, fileName, fileType) {
74
- try {
75
- const loadingTask = pdfjsLib__namespace.getDocument({
76
- data: new Uint8Array(buffer),
77
- useSystemFonts: true
78
- });
79
- const pdf = await loadingTask.promise;
80
- const textParts = [];
81
- for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
82
- const page = await pdf.getPage(pageNum);
83
- const textContent = await page.getTextContent();
84
- const pageText = textContent.items.map((item) => {
85
- if ("str" in item) {
86
- return item.str;
87
- }
88
- return "";
89
- }).filter((str) => str.trim().length > 0).join(" ");
90
- if (pageText.trim().length > 0) {
91
- textParts.push(`--- Page ${pageNum} ---
92
- ${pageText}`);
93
- }
94
- }
95
- const content = textParts.join("\n\n");
96
- return {
97
- content,
98
- metadata: {
99
- fileName,
100
- fileType,
101
- pageCount: pdf.numPages,
102
- parseTimestamp: (/* @__PURE__ */ new Date()).toISOString()
103
- }
104
- };
105
- } catch (error) {
106
- throw new errors.InputError(`Error parsing PDF: ${error}`);
107
- }
108
- }
109
- async function parseFile(buffer, fileName, fileType) {
110
- const normalizedType = fileType.toLowerCase().replace(/^\./, "");
111
- switch (normalizedType) {
112
- case constant.SupportedFileType.MARKDOWN:
113
- case constant.SupportedFileType.TEXT:
114
- case constant.SupportedFileType.LOG:
115
- return parseTextFile(buffer, fileName, fileType);
116
- case constant.SupportedFileType.JSON:
117
- return parseJSONFile(buffer, fileName, fileType);
118
- case constant.SupportedFileType.YAML:
119
- case constant.SupportedFileType.YML:
120
- return parseYAMLFile(buffer, fileName, fileType);
121
- case constant.SupportedFileType.PDF:
122
- return parsePDFFile(buffer, fileName, fileType);
123
- default:
124
- throw new errors.InputError(`Unsupported file type: ${fileType}`);
125
- }
126
- }
127
- async function toFile(buffer, filename, options) {
128
- const stream$1 = stream.Readable.from(buffer);
129
- return {
130
- name: filename,
131
- stream: stream$1,
132
- buffer,
133
- type: options?.type || "application/octet-stream"
134
- };
135
- }
136
-
137
- exports.parseFile = parseFile;
138
- exports.toFile = toFile;
139
- //# sourceMappingURL=fileParser.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fileParser.cjs.js","sources":["../../../../src/service/notebooks/documents/fileParser.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\n\nimport * as yaml from 'js-yaml';\nimport * as pdfjsLib from 'pdfjs-dist';\n\nimport { Readable } from 'stream';\n\nimport { SupportedFileType } from '../../constant';\n\nexport interface ParsedDocument {\n content: string;\n metadata: {\n fileName: string;\n fileType: string;\n pageCount?: number;\n parseTimestamp: string;\n };\n}\n\n/**\n * Parse text-based files (md, txt, log)\n */\nfunction parseTextFile(\n buffer: Buffer,\n fileName: string,\n fileType: string,\n): ParsedDocument {\n const content = buffer.toString('utf-8');\n\n return {\n content,\n metadata: {\n fileName,\n fileType,\n parseTimestamp: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Parse JSON files\n */\nfunction parseJSONFile(\n buffer: Buffer,\n fileName: string,\n fileType: string,\n): ParsedDocument {\n try {\n const content = buffer.toString('utf-8');\n // Validate JSON but keep original formatting\n JSON.parse(content);\n\n return {\n content,\n metadata: {\n fileName,\n fileType,\n parseTimestamp: new Date().toISOString(),\n },\n };\n } catch (error) {\n throw new InputError(`Invalid JSON file: ${error}`);\n }\n}\n\n/**\n * Parse YAML files\n */\nfunction parseYAMLFile(\n buffer: Buffer,\n fileName: string,\n fileType: string,\n): ParsedDocument {\n try {\n const content = buffer.toString('utf-8');\n // Validate YAML but keep original formatting and comments\n yaml.load(content);\n\n return {\n content,\n metadata: {\n fileName,\n fileType,\n parseTimestamp: new Date().toISOString(),\n },\n };\n } catch (error) {\n throw new InputError(`Invalid YAML file: ${error}`);\n }\n}\n\n/**\n * Parse PDF files\n * Extracts text content from PDF using PDF.js\n */\nasync function parsePDFFile(\n buffer: Buffer,\n fileName: string,\n fileType: string,\n): Promise<ParsedDocument> {\n try {\n const loadingTask = pdfjsLib.getDocument({\n data: new Uint8Array(buffer),\n useSystemFonts: true,\n });\n\n const pdf = await loadingTask.promise;\n const textParts: string[] = [];\n\n // Extract text from each page\n for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {\n const page = await pdf.getPage(pageNum);\n const textContent = await page.getTextContent();\n\n const pageText = textContent.items\n .map((item: any) => {\n if ('str' in item) {\n return item.str;\n }\n return '';\n })\n .filter((str: string) => str.trim().length > 0)\n .join(' ');\n\n if (pageText.trim().length > 0) {\n textParts.push(`--- Page ${pageNum} ---\\n${pageText}`);\n }\n }\n\n const content = textParts.join('\\n\\n');\n\n return {\n content,\n metadata: {\n fileName,\n fileType,\n pageCount: pdf.numPages,\n parseTimestamp: new Date().toISOString(),\n },\n };\n } catch (error) {\n throw new InputError(`Error parsing PDF: ${error}`);\n }\n}\n\n/**\n * Parse file based on its type\n * @param buffer - File buffer\n * @param fileName - File name\n * @param fileType - File type (md, txt, pdf, json, yaml, yml, log)\n * @returns Parsed document with content and metadata\n */\nexport async function parseFile(\n buffer: Buffer,\n fileName: string,\n fileType: string,\n): Promise<ParsedDocument> {\n // Normalize file type: lowercase and remove leading dot\n const normalizedType = fileType.toLowerCase().replace(/^\\./, '');\n\n switch (normalizedType) {\n case SupportedFileType.MARKDOWN:\n case SupportedFileType.TEXT:\n case SupportedFileType.LOG:\n return parseTextFile(buffer, fileName, fileType);\n\n case SupportedFileType.JSON:\n return parseJSONFile(buffer, fileName, fileType);\n\n case SupportedFileType.YAML:\n case SupportedFileType.YML:\n return parseYAMLFile(buffer, fileName, fileType);\n\n case SupportedFileType.PDF:\n return parsePDFFile(buffer, fileName, fileType);\n\n default:\n throw new InputError(`Unsupported file type: ${fileType}`);\n }\n}\n\n/**\n * File-like object interface matching what toFile() returns\n */\nexport interface FileObject {\n name: string;\n stream: Readable;\n buffer: Buffer;\n type: string;\n}\n\n/**\n * Convert Buffer to File-like object for upload\n */\nexport async function toFile(\n buffer: Buffer,\n filename: string,\n options?: { type?: string },\n): Promise<FileObject> {\n const stream = Readable.from(buffer);\n\n return {\n name: filename,\n stream,\n buffer,\n type: options?.type || 'application/octet-stream',\n };\n}\n"],"names":["InputError","yaml","pdfjsLib","SupportedFileType","stream","Readable"],"mappings":"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"}