feat: eager vLLM warmup and smart page titles in paginate stage

- Add warmup() to LlmProvider interface for eager subprocess startup
- ManagedVllmProvider.warmup() starts vLLM in background on project load
- ProviderRegistry.warmupAll() triggers all managed providers
- NamedProvider proxies warmup() to inner provider
- paginate stage generates LLM-powered descriptive page titles when
  available, cached by content hash, falls back to generic "Page N"
- project-mcp-endpoint calls warmupAll() on router creation so vLLM
  is loading while the session initializes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Michal
2026-03-03 19:07:39 +00:00
parent 0427d7dc1a
commit 03827f11e4
147 changed files with 17561 additions and 2093 deletions

View File

@@ -0,0 +1,5 @@
-- AlterTable
ALTER TABLE "McpServer" ADD COLUMN "runtime" TEXT;
-- AlterTable
ALTER TABLE "McpTemplate" ADD COLUMN "runtime" TEXT;

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Project" ADD COLUMN "proxyModel" TEXT NOT NULL DEFAULT '';

View File

@@ -0,0 +1,27 @@
-- CreateTable
CREATE TABLE "AuditEvent" (
"id" TEXT NOT NULL,
"timestamp" TIMESTAMP(3) NOT NULL,
"sessionId" TEXT NOT NULL,
"projectName" TEXT NOT NULL,
"eventKind" TEXT NOT NULL,
"source" TEXT NOT NULL,
"verified" BOOLEAN NOT NULL DEFAULT false,
"serverName" TEXT,
"correlationId" TEXT,
"parentEventId" TEXT,
"payload" JSONB NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "AuditEvent_pkey" PRIMARY KEY ("id")
);
-- AlterTable
ALTER TABLE "Project" ADD COLUMN "serverOverrides" JSONB;
-- CreateIndex
CREATE INDEX "AuditEvent_sessionId_idx" ON "AuditEvent"("sessionId");
CREATE INDEX "AuditEvent_projectName_idx" ON "AuditEvent"("projectName");
CREATE INDEX "AuditEvent_correlationId_idx" ON "AuditEvent"("correlationId");
CREATE INDEX "AuditEvent_timestamp_idx" ON "AuditEvent"("timestamp");
CREATE INDEX "AuditEvent_eventKind_idx" ON "AuditEvent"("eventKind");

View File

@@ -57,6 +57,7 @@ model McpServer {
name String @unique
description String @default("")
packageName String?
runtime String?
dockerImage String?
transport Transport @default(STDIO)
repositoryUrl String?
@@ -93,6 +94,7 @@ model McpTemplate {
version String @default("1.0.0")
description String @default("")
packageName String?
runtime String?
dockerImage String?
transport Transport @default(STDIO)
repositoryUrl String?
@@ -172,10 +174,12 @@ model Project {
description String @default("")
prompt String @default("")
proxyMode String @default("direct")
proxyModel String @default("")
gated Boolean @default(true)
llmProvider String?
llmModel String?
ownerId String
llmProvider String?
llmModel String?
serverOverrides Json?
ownerId String
version Int @default(1)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -271,6 +275,29 @@ model PromptRequest {
@@index([createdBySession])
}
// ── Audit Events (pipeline/gate/tool trace from mcplocal) ──
model AuditEvent {
id String @id @default(cuid())
timestamp DateTime
sessionId String
projectName String
eventKind String
source String
verified Boolean @default(false)
serverName String?
correlationId String?
parentEventId String?
payload Json
createdAt DateTime @default(now())
@@index([sessionId])
@@index([projectName])
@@index([correlationId])
@@index([timestamp])
@@index([eventKind])
}
// ── Audit Logs ──
model AuditLog {

View File

@@ -28,6 +28,7 @@ export async function cleanupTestDb(): Promise<void> {
export async function clearAllTables(client: PrismaClient): Promise<void> {
// Delete in order respecting foreign keys
await client.auditEvent.deleteMany();
await client.auditLog.deleteMany();
await client.mcpInstance.deleteMany();
await client.promptRequest.deleteMany();