fix: MCP server Docker deployment, healthchecks, and minor fixes

MCP server:
- Fix Prisma imports from stale client-generated path to @prisma/client
- Switch schema from SQLite to PostgreSQL for Docker compatibility
- Add prisma generate step to Dockerfile with proper binaryTargets
- Include index-sse.js in Docker build (was excluded by .dockerignore)
- Install openssl and libc6-compat in Alpine image for Prisma runtime

Docker:
- Fix memento-note healthcheck (wget unavailable in bullseye-slim)

Minor fixes:
- scrape.service SSRF protection, middleware route coverage
- canvas-board and note-input type fixes
- next.config turbopack and devIndicators adjustments

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Sepehr Ramezani
2026-04-21 22:21:35 +02:00
parent 1c659ce42f
commit cff36d9619
19 changed files with 1341 additions and 7346 deletions

View File

@@ -29,18 +29,18 @@ export interface OrganizationPlan {
}
/**
* Service for batch organizing notes from "Notes générales" into notebooks
* Service for batch organizing notes from "General Notes" into notebooks
* (Story 5.3 - IA3)
*/
export class BatchOrganizationService {
/**
* Analyze all notes in "Notes générales" and create an organization plan
* Analyze all notes in "General Notes" and create an organization plan
* @param userId - User ID
* @param language - User's preferred language (default: 'en')
* @returns Organization plan with notebook assignments
*/
async createOrganizationPlan(userId: string, language: string = 'en'): Promise<OrganizationPlan> {
// 1. Get all notes without notebook (Inbox/Notes générales)
// 1. Get all notes without notebook (Inbox/General Notes)
const notesWithoutNotebook = await prisma.note.findMany({
where: {
userId,

View File

@@ -50,12 +50,12 @@ export class ScrapeService {
}
return {
title: article.title,
content: article.content, // HTML fragment from readability
textContent: article.textContent, // Clean text
excerpt: article.excerpt,
byline: article.byline,
siteName: article.siteName,
title: article.title ?? '',
content: article.content ?? '', // HTML fragment from readability
textContent: article.textContent ?? '', // Clean text
excerpt: article.excerpt ?? '',
byline: article.byline ?? '',
siteName: article.siteName ?? '',
url: targetUrl
}
} catch (error) {