Summary: - Implement Prompt management infrastructure and core services - Build admin portal frontend with light theme - Integrate CodeMirror 6 editor for non-technical users Phase 3.5.1: Infrastructure Setup - Create capability_schema for Prompt storage - Add prompt_templates and prompt_versions tables - Add prompt:view/edit/debug/publish permissions - Migrate RVW prompts to database (RVW_EDITORIAL, RVW_METHODOLOGY) Phase 3.5.2: PromptService Core - Implement gray preview logic (DRAFT for debuggers, ACTIVE for users) - Module-level debug control (setDebugMode) - Handlebars template rendering - Variable extraction and validation (extractVariables, validateVariables) - Three-level disaster recovery (database -> cache -> hardcoded fallback) Phase 3.5.3: Management API - 8 RESTful endpoints (/api/admin/prompts/*) - Permission control (PROMPT_ENGINEER can edit, SUPER_ADMIN can publish) Phase 3.5.4: Frontend Management UI - Build admin portal architecture (AdminLayout, OrgLayout) - Add route system (/admin/*, /org/*) - Implement PromptListPage (filter, search, debug switch) - Implement PromptEditor (CodeMirror 6 simplified for clinical users) - Implement PromptEditorPage (edit, save, publish, test, version history) Technical Details: - Backend: 6 files, ~2044 lines (prompt.service.ts 596 lines) - Frontend: 9 files, ~1735 lines (PromptEditorPage.tsx 399 lines) - CodeMirror 6: Line numbers, auto-wrap, variable highlight, search, undo/redo - Chinese-friendly: 15px font, 1.8 line-height, system fonts Next Step: Phase 3.5.5 - Integrate RVW module with PromptService Tested: Backend API tests passed (8/8), Frontend pending user testing Status: Ready for Phase 3.5.5 RVW integration
74 lines
1.8 KiB
JSON
74 lines
1.8 KiB
JSON
{
|
|
"name": "ai-clinical-backend",
|
|
"version": "1.0.0",
|
|
"description": "AI Clinical Research Platform - Backend API",
|
|
"main": "dist/index.js",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "tsx watch src/index.ts",
|
|
"build": "tsc",
|
|
"start": "node dist/index.js",
|
|
"prisma:generate": "prisma generate",
|
|
"prisma:migrate": "prisma migrate dev",
|
|
"prisma:studio": "prisma studio",
|
|
"prisma:seed": "tsx prisma/seed.ts",
|
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
},
|
|
"prisma": {
|
|
"seed": "tsx prisma/seed.ts"
|
|
},
|
|
"keywords": [
|
|
"ai",
|
|
"clinical",
|
|
"research",
|
|
"medical"
|
|
],
|
|
"author": "AI Clinical Dev Team",
|
|
"license": "ISC",
|
|
"dependencies": {
|
|
"@fastify/cors": "^11.1.0",
|
|
"@fastify/jwt": "^10.0.0",
|
|
"@fastify/multipart": "^9.2.1",
|
|
"@prisma/client": "^6.17.0",
|
|
"bcryptjs": "^2.4.3",
|
|
"handlebars": "^4.7.8",
|
|
"jsonwebtoken": "^9.0.2",
|
|
"@types/form-data": "^2.2.1",
|
|
"@wecom/crypto": "^1.0.1",
|
|
"ajv": "^8.17.1",
|
|
"axios": "^1.12.2",
|
|
"bullmq": "^5.65.0",
|
|
"diff-match-patch": "^1.0.5",
|
|
"dotenv": "^17.2.3",
|
|
"exceljs": "^4.4.0",
|
|
"fastify": "^5.6.1",
|
|
"form-data": "^4.0.4",
|
|
"html2canvas": "^1.4.1",
|
|
"js-yaml": "^4.1.0",
|
|
"jsonrepair": "^3.13.1",
|
|
"jspdf": "^3.0.3",
|
|
"p-queue": "^9.0.1",
|
|
"pg-boss": "^12.5.2",
|
|
"prisma": "^6.17.0",
|
|
"tiktoken": "^1.0.22",
|
|
"winston": "^3.18.3",
|
|
"xlsx": "^0.18.5",
|
|
"xml2js": "^0.6.2",
|
|
"zod": "^4.1.12"
|
|
},
|
|
"devDependencies": {
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/js-yaml": "^4.0.9",
|
|
"@types/jsonwebtoken": "^9.0.7",
|
|
"@types/node": "^24.7.1",
|
|
"@types/winston": "^2.4.4",
|
|
"@types/xml2js": "^0.4.14",
|
|
"better-sqlite3": "^12.4.6",
|
|
"nodemon": "^3.1.10",
|
|
"pino-pretty": "^13.1.1",
|
|
"ts-node": "^10.9.2",
|
|
"tsx": "^4.20.6",
|
|
"typescript": "^5.9.3"
|
|
}
|
|
}
|