diff --git a/workspaces/lightspeed/e2e-tests/fixtures/responses.ts b/workspaces/lightspeed/e2e-tests/fixtures/responses.ts index 2833e6ad72..52644cf047 100644 --- a/workspaces/lightspeed/e2e-tests/fixtures/responses.ts +++ b/workspaces/lightspeed/e2e-tests/fixtures/responses.ts @@ -283,23 +283,25 @@ export function generateQueryResponseWithMcpToolCall( request_id: mockStreamRequestId, }, }); - events.push({ - event: 'tool_call', - data: { - id: e2eMcpToolCallId, - name: 'mcp_list_tools', - args: { server_label: 'mcp-integration-tools' }, - type: 'mcp_list_tools', + events.push( + { + event: 'tool_call', + data: { + id: e2eMcpToolCallId, + name: 'mcp_list_tools', + args: { server_label: 'mcp-integration-tools' }, + type: 'mcp_list_tools', + }, }, - }); - events.push({ - event: 'tool_result', - data: { - id: e2eMcpToolCallId, - status: 'success', - content: '{"server_label":"mcp-integration-tools","tools":[]}', + { + event: 'tool_result', + data: { + id: e2eMcpToolCallId, + status: 'success', + content: '{"server_label":"mcp-integration-tools","tools":[]}', + }, }, - }); + ); const tokens = assistantResponse.match(/(\s+|[^\s]+)/g) || [ assistantResponse, diff --git a/workspaces/lightspeed/e2e-tests/utils/accessibility.ts b/workspaces/lightspeed/e2e-tests/utils/accessibility.ts index 586d0c10c3..bcaf00c14b 100644 --- a/workspaces/lightspeed/e2e-tests/utils/accessibility.ts +++ b/workspaces/lightspeed/e2e-tests/utils/accessibility.ts @@ -21,7 +21,7 @@ export async function runAccessibilityTests( page: Page, testInfo: TestInfo, attachName = 'accessibility-scan-results.json', - options: { skipFailures?: boolean } = { skipFailures: true }, + options?: { skipFailures?: boolean }, ) { const accessibilityScanResults = await new AxeBuilder({ page }) .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa']) @@ -32,7 +32,8 @@ export async function runAccessibilityTests( contentType: 'application/json', }); - if (!options?.skipFailures) { + const { skipFailures = true } = options ?? {}; + if (!skipFailures) { expect( accessibilityScanResults.violations, 'Accessibility violations found', diff --git a/workspaces/lightspeed/e2e-tests/utils/devMode.ts b/workspaces/lightspeed/e2e-tests/utils/devMode.ts index 79bd8f841c..bb5fe7f278 100644 --- a/workspaces/lightspeed/e2e-tests/utils/devMode.ts +++ b/workspaces/lightspeed/e2e-tests/utils/devMode.ts @@ -37,7 +37,7 @@ export type MockMcpServersOptions = { let mcpMockOptions: MockMcpServersOptions = {}; function cloneMcpServersMock(json: McpServersListMock): McpServersListMock { - return JSON.parse(JSON.stringify(json)) as McpServersListMock; + return structuredClone(json); } export async function mockModels(page: Page, models: any[]) { diff --git a/workspaces/lightspeed/e2e-tests/utils/testHelper.ts b/workspaces/lightspeed/e2e-tests/utils/testHelper.ts index f8089b9cec..cd5bc8caba 100644 --- a/workspaces/lightspeed/e2e-tests/utils/testHelper.ts +++ b/workspaces/lightspeed/e2e-tests/utils/testHelper.ts @@ -133,7 +133,7 @@ export async function assertClipboardContains( expectedText: string, ) { const clipboardText = await page.evaluate(() => - window.navigator.clipboard.readText(), + globalThis.navigator.clipboard.readText(), ); expect(clipboardText).toMatch(expectedText); } diff --git a/workspaces/lightspeed/e2e-tests/utils/translations.ts b/workspaces/lightspeed/e2e-tests/utils/translations.ts index c766a893c2..23e7560e1d 100644 --- a/workspaces/lightspeed/e2e-tests/utils/translations.ts +++ b/workspaces/lightspeed/e2e-tests/utils/translations.ts @@ -66,8 +66,8 @@ export function formatMcpSelectedCount( totalCount: number, ): string { return t['mcp.settings.selectedCount'] - .replace(/\{\{selectedCount\}\}/g, String(selectedCount)) - .replace(/\{\{totalCount\}\}/g, String(totalCount)); + .replaceAll('{{selectedCount}}', String(selectedCount)) + .replaceAll('{{totalCount}}', String(totalCount)); } /** Status cell detail for a connected server tool count (singular vs plural). */ @@ -79,5 +79,5 @@ export function formatMcpToolCountStatus( toolCount === 1 ? 'mcp.settings.status.oneTool' : 'mcp.settings.status.manyTools'; - return t[key].replace(/\{\{count\}\}/g, String(toolCount)); + return t[key].replaceAll('{{count}}', String(toolCount)); } diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/__fixtures__/lightspeedCoreHandlers.ts b/workspaces/lightspeed/plugins/lightspeed-backend/__fixtures__/lightspeedCoreHandlers.ts index aa90966c0b..1c8650875a 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/__fixtures__/lightspeedCoreHandlers.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/__fixtures__/lightspeedCoreHandlers.ts @@ -69,7 +69,6 @@ export const mockFile1 = { // In-memory storage for tests const vectorStores = new Map(); -const files = new Map(); const vectorStoreFiles = new Map(); /** Monotonic suffix so vector store IDs never collide when Date.now() repeats (fast CI). */ @@ -78,7 +77,6 @@ let nextFileSeq = 0; export function resetMockStorage() { vectorStores.clear(); - files.clear(); vectorStoreFiles.clear(); nextVectorStoreSeq = 0; nextFileSeq = 0; @@ -91,7 +89,7 @@ export function resetMockStorage() { export const lightspeedCoreHandlers: HttpHandler[] = [ // Create vector store http.post(`${LIGHTSPEED_CORE_ADDR}/v1/vector-stores`, async ({ request }) => { - const body = (await request.json()) as any; + const body: any = await request.json(); const id = `vs-${Date.now()}-${nextVectorStoreSeq++}`; const vectorStore = { id, @@ -131,7 +129,7 @@ export const lightspeedCoreHandlers: HttpHandler[] = [ { status: 404 }, ); } - const body = (await request.json()) as any; + const body: any = await request.json(); const updated = { ...vectorStore, metadata: body.metadata || vectorStore.metadata, @@ -169,7 +167,6 @@ export const lightspeedCoreHandlers: HttpHandler[] = [ created_at: Date.now(), purpose: 'assistants', }; - files.set(fileId, file); return HttpResponse.json(file); }), @@ -186,7 +183,7 @@ export const lightspeedCoreHandlers: HttpHandler[] = [ ); } - const body = (await request.json()) as any; + const body: any = await request.json(); const vectorStoreFile = { id: body.file_id, status: 'completed' as const, diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/mcp-server-validator.test.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/mcp-server-validator.test.ts index b996408f81..e9ad7951d3 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/mcp-server-validator.test.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/mcp-server-validator.test.ts @@ -28,10 +28,10 @@ describe('McpServerValidator auth header behavior', () => { }; childMock.mockImplementation(() => logger); - const originalFetch = global.fetch; + const originalFetch = globalThis.fetch; afterEach(() => { - global.fetch = originalFetch; + globalThis.fetch = originalFetch; jest.clearAllMocks(); }); @@ -39,7 +39,7 @@ describe('McpServerValidator auth header behavior', () => { const fetchMock = jest .fn() .mockResolvedValue(new Response(null, { status: 401 })); - global.fetch = fetchMock; + globalThis.fetch = fetchMock; const validator = new McpServerValidator(logger); const result = await validator.validate(url, 'raw-token'); @@ -63,7 +63,7 @@ describe('McpServerValidator auth header behavior', () => { const fetchMock = jest .fn() .mockResolvedValue(new Response(null, { status: 401 })); - global.fetch = fetchMock; + globalThis.fetch = fetchMock; const validator = new McpServerValidator(logger); const result = await validator.validate(url, 'Basic abc123'); diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/VectorStoresOperator.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/VectorStoresOperator.ts index 5159b3614c..a95d402e19 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/VectorStoresOperator.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/VectorStoresOperator.ts @@ -96,8 +96,8 @@ async function handleHttpError( */ export class VectorStoresOperator { private static instance: VectorStoresOperator | null = null; - private baseURL: string; - private logger: LoggerService; + private readonly baseURL: string; + private readonly logger: LoggerService; private constructor(lightspeedCoreUrl: string, logger: LoggerService) { this.baseURL = lightspeedCoreUrl; @@ -114,12 +114,10 @@ export class VectorStoresOperator { lightspeedCoreUrl: string, logger: LoggerService, ): VectorStoresOperator { - if (!VectorStoresOperator.instance) { - VectorStoresOperator.instance = new VectorStoresOperator( - lightspeedCoreUrl, - logger, - ); - } + VectorStoresOperator.instance ??= new VectorStoresOperator( + lightspeedCoreUrl, + logger, + ); return VectorStoresOperator.instance; } diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentHelpers.test.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentHelpers.test.ts index 792d06de27..f503fd28db 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentHelpers.test.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentHelpers.test.ts @@ -96,7 +96,7 @@ describe('documentHelpers', () => { describe('parseFileContent', () => { it('should throw error when no file uploaded for non-URL type', async () => { - await expect(parseFileContent(logger, 'txt', undefined)).rejects.toThrow( + await expect(parseFileContent(logger, 'txt')).rejects.toThrow( 'No file uploaded', ); }); diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentHelpers.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentHelpers.ts index 880054b81d..8a67eceba0 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentHelpers.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentHelpers.ts @@ -18,8 +18,8 @@ import { InputError } from '@backstage/errors'; import { Parser } from 'htmlparser2'; -import dns from 'dns/promises'; -import { isIP } from 'net'; +import dns from 'node:dns/promises'; +import { isIP } from 'node:net'; import { DEFAULT_MAX_FILE_SIZE_MB, @@ -163,7 +163,7 @@ const isPrivateOrInternalIP = (ip: string): boolean => { // Extract the hex parts and check against private ranges const parts = ipv4Part.split(':'); if (parts.length >= 1) { - const firstHex = parseInt(parts[0], 16); + const firstHex = Number.parseInt(parts[0], 16); // Check for common private ranges in hex: // 127.x.x.x -> 0x7F00-0x7FFF (loopback) // 10.x.x.x -> 0x0A00-0x0AFF (private) @@ -293,7 +293,7 @@ export const sanitizeContentForRAG = (content: string): string => { // Limit excessive consecutive newlines to prevent context stuffing const newlinePattern = new RegExp( - `\\n{${MAX_CONSECUTIVE_NEWLINES + 1},}`, + String.raw`\n{${MAX_CONSECUTIVE_NEWLINES + 1},}`, 'g', ); sanitized = sanitized.replace( diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentService.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentService.ts index 3786573961..5e931d3b6d 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentService.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/documentService.ts @@ -33,9 +33,9 @@ import { toFile } from './fileParser'; * Uses VectorStoresOperator to proxy through lightspeed-core */ export class DocumentService { - private logger: LoggerService; - private client: VectorStoresOperator; - private chunkingStrategy: { + private readonly logger: LoggerService; + private readonly client: VectorStoresOperator; + private readonly chunkingStrategy: { type: string; static?: { max_chunk_size_tokens: number; chunk_overlap_tokens: number }; }; diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/fileParser.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/fileParser.ts index 0a28405b56..0feb15b618 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/fileParser.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/documents/fileParser.ts @@ -19,7 +19,7 @@ import { InputError } from '@backstage/errors'; import * as yaml from 'js-yaml'; import * as pdfjsLib from 'pdfjs-dist'; -import { Readable } from 'stream'; +import { Readable } from 'node:stream'; import { SupportedFileType } from '../../constant'; diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/notebooksRouters.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/notebooksRouters.ts index a9771b5115..3e46b81b35 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/notebooksRouters.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/notebooksRouters.ts @@ -26,7 +26,7 @@ import express, { Router } from 'express'; import { lightspeedNotebooksUsePermission } from '@red-hat-developer-hub/backstage-plugin-lightspeed-common'; -import { Readable, Transform } from 'stream'; +import { Readable, Transform } from 'node:stream'; import { DEFAULT_LIGHTSPEED_SERVICE_HOST, @@ -232,8 +232,6 @@ export async function createNotebooksRouter( ); // Extract citations/sources from tool calls (file_search results) - - // this.push(`data: ${JSON.stringify(legacy)}\n\n`); } else { // Log unhandled event types to help identify what we're missing logger.debug(`Unhandled SSE event type: ${eventType}`, parsed); @@ -507,7 +505,7 @@ export async function createNotebooksRouter( } if (!response.ok) { - const errorBody = (await response.json()) as any; + const errorBody = await response.json(); const errorMsg = errorBody?.detail?.[0]?.msg || errorBody?.detail?.cause || diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/sessions/sessionService.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/sessions/sessionService.ts index 8bff2ddfe8..4bb2355906 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/sessions/sessionService.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/sessions/sessionService.ts @@ -28,9 +28,9 @@ import { VectorStoresOperator } from '../VectorStoresOperator'; * - Uses VectorStoresOperator to proxy through lightspeed-core */ export class SessionService { - private logger: LoggerService; - private client: VectorStoresOperator; - private providerId: string; + private readonly logger: LoggerService; + private readonly client: VectorStoresOperator; + private readonly providerId: string; constructor(client: VectorStoresOperator, logger: LoggerService) { this.client = client; @@ -157,10 +157,9 @@ export class SessionService { const updated: NotebookSession = { ...existing, - name: name !== undefined ? name : existing.name, - description: - description !== undefined ? description : existing.description, - metadata: metadata !== undefined ? metadata : existing.metadata, + name: name ?? existing.name, + description: description ?? existing.description, + metadata: metadata ?? existing.metadata, updated_at: new Date().toISOString(), }; diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/utils.test.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/utils.test.ts index 0a644a6761..f8085fff50 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/utils.test.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/utils.test.ts @@ -38,7 +38,7 @@ describe('utils', () => { }); describe('handleError', () => { - let mockRes: Partial; + let mockRes: Response; let mockJson: jest.Mock; let mockStatus: jest.Mock; @@ -47,18 +47,13 @@ describe('utils', () => { mockStatus = jest.fn().mockReturnValue({ json: mockJson }); mockRes = { status: mockStatus, - }; + } as unknown as Response; }); it('should handle NotAllowedError with 403 status', () => { const error = new NotAllowedError('User lacks permission'); - handleError( - logger, - mockRes as Response, - error, - 'Permission check failed', - ); + handleError(logger, mockRes, error, 'Permission check failed'); expect(mockStatus).toHaveBeenCalledWith(403); expect(mockJson).toHaveBeenCalledWith({ @@ -74,7 +69,7 @@ describe('utils', () => { it('should handle NotFoundError with 404 status', () => { const error = new NotFoundError('Resource not found'); - handleError(logger, mockRes as Response, error, 'Fetch resource failed'); + handleError(logger, mockRes, error, 'Fetch resource failed'); expect(mockStatus).toHaveBeenCalledWith(404); expect(mockJson).toHaveBeenCalledWith({ @@ -86,7 +81,7 @@ describe('utils', () => { it('should handle InputError with 400 status', () => { const error = new InputError('Invalid input data'); - handleError(logger, mockRes as Response, error, 'Validation failed'); + handleError(logger, mockRes, error, 'Validation failed'); expect(mockStatus).toHaveBeenCalledWith(400); expect(mockJson).toHaveBeenCalledWith({ @@ -98,7 +93,7 @@ describe('utils', () => { it('should handle ConflictError with 409 status', () => { const error = new ConflictError('Resource already exists'); - handleError(logger, mockRes as Response, error, 'Create resource failed'); + handleError(logger, mockRes, error, 'Create resource failed'); expect(mockStatus).toHaveBeenCalledWith(409); expect(mockJson).toHaveBeenCalledWith({ @@ -110,7 +105,7 @@ describe('utils', () => { it('should handle generic Error with 500 status', () => { const error = new Error('Unexpected error'); - handleError(logger, mockRes as Response, error, 'Operation failed'); + handleError(logger, mockRes, error, 'Operation failed'); expect(mockStatus).toHaveBeenCalledWith(500); expect(mockJson).toHaveBeenCalledWith({ @@ -122,7 +117,7 @@ describe('utils', () => { it('should handle validation error strings with 400 status', () => { const error = 'Field is required'; - handleError(logger, mockRes as Response, error); + handleError(logger, mockRes, error); expect(mockStatus).toHaveBeenCalledWith(400); expect(mockJson).toHaveBeenCalledWith({ @@ -135,7 +130,7 @@ describe('utils', () => { }); it('should handle empty validation error string', () => { - handleError(logger, mockRes as Response, ''); + handleError(logger, mockRes, ''); expect(mockStatus).toHaveBeenCalledWith(400); expect(mockJson).toHaveBeenCalledWith({ @@ -147,7 +142,7 @@ describe('utils', () => { it('should handle long validation error messages', () => { const longMessage = 'a'.repeat(1000); - handleError(logger, mockRes as Response, longMessage); + handleError(logger, mockRes, longMessage); expect(mockStatus).toHaveBeenCalledWith(400); expect(mockJson).toHaveBeenCalledWith({ @@ -159,7 +154,7 @@ describe('utils', () => { it('should handle validation errors with special characters', () => { const error = 'Invalid format: "name" must match /^[a-z]+$/'; - handleError(logger, mockRes as Response, error); + handleError(logger, mockRes, error); expect(mockStatus).toHaveBeenCalledWith(400); expect(mockJson).toHaveBeenCalledWith({ @@ -171,7 +166,7 @@ describe('utils', () => { it('should handle undefined error', () => { const error = undefined; - handleError(logger, mockRes as Response, error, 'Unknown error'); + handleError(logger, mockRes, error, 'Unknown error'); expect(mockStatus).toHaveBeenCalledWith(500); expect(mockJson).toHaveBeenCalledWith({ @@ -183,7 +178,7 @@ describe('utils', () => { it('should handle null error', () => { const error = null; - handleError(logger, mockRes as Response, error, 'Null error'); + handleError(logger, mockRes, error, 'Null error'); expect(mockStatus).toHaveBeenCalledWith(500); expect(mockJson).toHaveBeenCalledWith({ @@ -196,7 +191,7 @@ describe('utils', () => { const error = new Error('Test error'); const contextMessage = 'Context: Operation X failed'; - handleError(logger, mockRes as Response, error, contextMessage); + handleError(logger, mockRes, error, contextMessage); expect(logger.error).toHaveBeenCalledWith( 'Context: Operation X failed: Test error', @@ -204,15 +199,15 @@ describe('utils', () => { ); }); - it('should handle error with empty message', () => { - const error = new Error(''); + it('should handle error with short message', () => { + const error = new Error('error'); - handleError(logger, mockRes as Response, error, 'Operation failed'); + handleError(logger, mockRes, error, 'Operation failed'); expect(mockStatus).toHaveBeenCalledWith(500); expect(mockJson).toHaveBeenCalledWith({ status: 'error', - error: '', + error: 'error', }); }); @@ -226,12 +221,7 @@ describe('utils', () => { const error = new CustomError('Custom error occurred'); - handleError( - logger, - mockRes as Response, - error, - 'Custom operation failed', - ); + handleError(logger, mockRes, error, 'Custom operation failed'); expect(mockStatus).toHaveBeenCalledWith(500); expect(mockJson).toHaveBeenCalledWith({ @@ -255,7 +245,7 @@ describe('utils', () => { mockJson.mockClear(); mockStatus.mockClear(); - handleError(logger, mockRes as Response, error, 'Test'); + handleError(logger, mockRes, error, 'Test'); expect(mockStatus).toHaveBeenCalledWith(expectedStatuses[index]); }); diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/utils.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/utils.ts index 7ad14140cd..db5d930e3a 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/utils.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/notebooks/utils.ts @@ -87,7 +87,7 @@ export const buildVectorStoreMetadata = ( description: session.description, created_at: session.created_at, updated_at: session.updated_at, - ...(session.metadata || {}), + ...session.metadata, }; }; diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts index 5f4744abd0..d3b77df933 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts @@ -128,7 +128,7 @@ describe('lightspeed router tests', () => { lightspeedPlugin, mockServices.rootLogger.factory(), mockServices.rootConfig.factory({ - data: { ...BASE_CONFIG, ...(config || {}) }, + data: { ...BASE_CONFIG, ...config }, }), mockServices.httpAuth.factory({ defaultCredentials: mockCredentials.user(mockUserId), @@ -151,7 +151,7 @@ describe('lightspeed router tests', () => { lightspeedPlugin, mockServices.rootLogger.factory(), mockServices.rootConfig.factory({ - data: { ...BASE_CONFIG, ...(config || {}) }, + data: { ...BASE_CONFIG, ...config }, }), mockServices.httpAuth.factory({ defaultCredentials: mockCredentials.user(mockUserId), @@ -435,7 +435,6 @@ describe('lightspeed router tests', () => { }); it('load history with deleted conversation_id', async () => { - // await deleteHistory(mockConversationId); const backendServer = await startBackendServer(); const response = await request(backendServer).get( `/api/lightspeed/v2/conversations/${encodedConversationId}`, diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts index 79a4aa787d..3d4503cec5 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts @@ -379,14 +379,8 @@ export async function createRouter( enabled?: boolean; token?: string | null; }; - const hasEnabledField = Object.prototype.hasOwnProperty.call( - body, - 'enabled', - ); - const hasTokenField = Object.prototype.hasOwnProperty.call( - body, - 'token', - ); + const hasEnabledField = Object.hasOwn(body, 'enabled'); + const hasTokenField = Object.hasOwn(body, 'token'); const { enabled, token } = body; if (!hasEnabledField && !hasTokenField) { res.status(400).json({ diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/validation.test.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/validation.test.ts index 2a13877408..2305a2e069 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/validation.test.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/validation.test.ts @@ -24,28 +24,24 @@ import { import { validateCompletionsRequest } from './validation'; describe('validateCompletionsRequest', () => { - let mockReq: Partial; - let mockRes: Partial; + let mockReq: Request; + let mockRes: Response; let mockNext: NextFunction; let jsonMock: jest.Mock; let statusMock: jest.Mock; const callValidate = () => - validateCompletionsRequest( - mockReq as Request, - mockRes as Response, - mockNext, - ); + validateCompletionsRequest(mockReq, mockRes, mockNext); beforeEach(() => { jsonMock = jest.fn(); statusMock = jest.fn().mockReturnValue({ json: jsonMock }); mockReq = { body: {}, - }; + } as unknown as Request; mockRes = { status: statusMock, - }; + } as unknown as Response; mockNext = jest.fn(); }); diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/setupTests.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/setupTests.ts index d8c88d3ec6..d58938d3f8 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/setupTests.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/setupTests.ts @@ -13,5 +13,3 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -export {}; diff --git a/workspaces/lightspeed/plugins/lightspeed-common/src/setupTests.ts b/workspaces/lightspeed/plugins/lightspeed-common/src/setupTests.ts index d8c88d3ec6..d58938d3f8 100644 --- a/workspaces/lightspeed/plugins/lightspeed-common/src/setupTests.ts +++ b/workspaces/lightspeed/plugins/lightspeed-common/src/setupTests.ts @@ -13,5 +13,3 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -export {}; diff --git a/workspaces/lightspeed/plugins/lightspeed/report-alpha.api.md b/workspaces/lightspeed/plugins/lightspeed/report-alpha.api.md index b4d36623c3..3509b627f9 100644 --- a/workspaces/lightspeed/plugins/lightspeed/report-alpha.api.md +++ b/workspaces/lightspeed/plugins/lightspeed/report-alpha.api.md @@ -174,35 +174,6 @@ export const lightspeedRedirectModule: FrontendModule; export const lightspeedTranslationRef: TranslationRef< 'plugin.lightspeed', { - readonly 'disclaimer.withoutValidation': string; - readonly 'disclaimer.withValidation': string; - readonly 'prompts.codeReadability.title': string; - readonly 'prompts.codeReadability.message': string; - readonly 'prompts.debugging.title': string; - readonly 'prompts.debugging.message': string; - readonly 'prompts.developmentConcept.title': string; - readonly 'prompts.developmentConcept.message': string; - readonly 'prompts.codeOptimization.title': string; - readonly 'prompts.codeOptimization.message': string; - readonly 'prompts.documentation.title': string; - readonly 'prompts.documentation.message': string; - readonly 'prompts.gitWorkflows.title': string; - readonly 'prompts.gitWorkflows.message': string; - readonly 'prompts.testingStrategies.title': string; - readonly 'prompts.testingStrategies.message': string; - readonly 'prompts.sortingAlgorithms.title': string; - readonly 'prompts.sortingAlgorithms.message': string; - readonly 'prompts.eventDriven.title': string; - readonly 'prompts.eventDriven.message': string; - readonly 'prompts.tekton.title': string; - readonly 'prompts.tekton.message': string; - readonly 'prompts.openshift.title': string; - readonly 'prompts.openshift.message': string; - readonly 'prompts.rhdh.title': string; - readonly 'prompts.rhdh.message': string; - readonly 'notebooks.prompts.coreConcepts.title': string; - readonly 'notebooks.prompts.vulnerabilities.title': string; - readonly 'notebooks.prompts.accessIssue.title': string; readonly 'page.title': string; readonly 'page.subtitle': string; readonly 'tabs.ariaLabel': string; @@ -231,6 +202,9 @@ export const lightspeedTranslationRef: TranslationRef< readonly 'notebooks.updated.days': string; readonly 'notebooks.updated.on': string; readonly 'notebooks.card.openAria': string; + readonly 'notebooks.prompts.coreConcepts.title': string; + readonly 'notebooks.prompts.vulnerabilities.title': string; + readonly 'notebooks.prompts.accessIssue.title': string; readonly 'notebook.view.title': string; readonly 'notebook.view.close': string; readonly 'notebook.view.documents.count': string; @@ -267,6 +241,30 @@ export const lightspeedTranslationRef: TranslationRef< readonly 'notebook.document.delete.description': string; readonly 'notebook.document.delete.action': string; readonly 'notebook.document.delete.success': string; + readonly 'prompts.codeReadability.title': string; + readonly 'prompts.codeReadability.message': string; + readonly 'prompts.debugging.title': string; + readonly 'prompts.debugging.message': string; + readonly 'prompts.developmentConcept.title': string; + readonly 'prompts.developmentConcept.message': string; + readonly 'prompts.codeOptimization.title': string; + readonly 'prompts.codeOptimization.message': string; + readonly 'prompts.documentation.title': string; + readonly 'prompts.documentation.message': string; + readonly 'prompts.gitWorkflows.title': string; + readonly 'prompts.gitWorkflows.message': string; + readonly 'prompts.testingStrategies.title': string; + readonly 'prompts.testingStrategies.message': string; + readonly 'prompts.sortingAlgorithms.title': string; + readonly 'prompts.sortingAlgorithms.message': string; + readonly 'prompts.eventDriven.title': string; + readonly 'prompts.eventDriven.message': string; + readonly 'prompts.tekton.title': string; + readonly 'prompts.tekton.message': string; + readonly 'prompts.openshift.title': string; + readonly 'prompts.openshift.message': string; + readonly 'prompts.rhdh.title': string; + readonly 'prompts.rhdh.message': string; readonly 'conversation.delete.confirm.title': string; readonly 'conversation.delete.confirm.message': string; readonly 'conversation.delete.confirm.action': string; @@ -284,6 +282,8 @@ export const lightspeedTranslationRef: TranslationRef< readonly 'lcore.notConfigured.backendDocs': string; readonly 'lcore.loadError.title': string; readonly 'lcore.loadError.description': string; + readonly 'disclaimer.withValidation': string; + readonly 'disclaimer.withoutValidation': string; readonly 'footer.accuracy.label': string; readonly 'common.cancel': string; readonly 'common.close': string; diff --git a/workspaces/lightspeed/plugins/lightspeed/src/components/FilePreview.tsx b/workspaces/lightspeed/plugins/lightspeed/src/components/FilePreview.tsx index fb9e588363..01cb04b6a4 100644 --- a/workspaces/lightspeed/plugins/lightspeed/src/components/FilePreview.tsx +++ b/workspaces/lightspeed/plugins/lightspeed/src/components/FilePreview.tsx @@ -56,7 +56,7 @@ const FilePreview = () => {
{fileContents.map((file, index) => ( { const classes = useStyles(); const { t } = useTranslation(); return ( -
-
+ ); }; diff --git a/workspaces/lightspeed/plugins/lightspeed/src/components/McpServersSettings.tsx b/workspaces/lightspeed/plugins/lightspeed/src/components/McpServersSettings.tsx index a162752ba6..a0646a1081 100644 --- a/workspaces/lightspeed/plugins/lightspeed/src/components/McpServersSettings.tsx +++ b/workspaces/lightspeed/plugins/lightspeed/src/components/McpServersSettings.tsx @@ -944,7 +944,7 @@ export const McpServersSettings = ({ isChecked={isChecked} isDisabled={isToggleDisabled} onChange={(_event, checked) => { - void patchServer(server.name, { + patchServer(server.name, { enabled: checked, }).catch(() => { // patchServer already updates component error state. @@ -1089,7 +1089,9 @@ export const McpServersSettings = ({