feat(asl/extraction): Complete Tool 3 M1+M2 - skeleton pipeline and HITL workbench
M1 Skeleton Pipeline: - Scatter-dispatch + Aggregator polling pattern (PgBoss) - PKB ACL bridge (PkbBridgeService -> PkbExportService DTOs) - ExtractionSingleWorker with DeepSeek-V3 LLM extraction - PermanentExtractionError for non-retryable failures - Phantom Retry Guard (idempotent worker) - 3-step minimal frontend (Setup -> Progress -> Workbench) - 4 new DB tables (extraction_templates, project_templates, tasks, results) - 3 system templates seed (RCT, Cohort, QC) - M1 integration test suite M2 HITL Workbench: - MinerU VLM integration for high-fidelity table extraction - XML-isolated DynamicPromptBuilder with flat JSON output template - fuzzyQuoteMatch validator (3-tier confidence scoring) - SSE real-time logging via ExtractionEventBus - Schema-driven ExtractionDrawer (dynamic field rendering from template) - Excel wide-table export with flattenModuleData normalization - M2 integration test suite Critical Fixes (data normalization): - DynamicPromptBuilder: explicit flat key-value output format with example - ExtractionExcelExporter: handle both array and flat data formats - ExtractionDrawer: schema-driven rendering instead of hardcoded fields - ExtractionValidator: array-format quote verification support - SSE route: Fastify register encapsulation to bypass auth for EventSource - LLM JSON sanitizer: strip illegal control chars before JSON.parse Also includes: RVW stats verification spec, SSA expert config guide Tested: M1 pipeline test + M2 HITL test + manual frontend verification Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -23,6 +23,7 @@ import { registerTestRoutes } from './test-platform-api.js';
|
||||
import { registerScreeningWorkers } from './modules/asl/services/screeningWorker.js';
|
||||
import { registerResearchWorker } from './modules/asl/workers/researchWorker.js';
|
||||
import { registerExtractionWorkers } from './modules/dc/tool-b/workers/extractionWorker.js';
|
||||
import { registerExtractionWorkers as registerAslExtractionWorkers } from './modules/asl/extraction/workers/index.js';
|
||||
import { registerParseExcelWorker } from './modules/dc/tool-c/workers/parseExcelWorker.js';
|
||||
import { registerReviewWorker } from './modules/rvw/workers/reviewWorker.js';
|
||||
import { jobQueue } from './common/jobs/index.js';
|
||||
@@ -253,6 +254,10 @@ const start = async () => {
|
||||
registerParseExcelWorker();
|
||||
logger.info('✅ DC Tool C parse excel worker registered');
|
||||
|
||||
// 注册ASL工具3全文提取Workers(散装派发 + Aggregator)
|
||||
await registerAslExtractionWorkers();
|
||||
logger.info('✅ ASL extraction workers registered (Tool 3)');
|
||||
|
||||
// 注册RVW审稿Worker(包含启动时清理卡住任务)
|
||||
await registerReviewWorker();
|
||||
logger.info('✅ RVW review worker registered');
|
||||
|
||||
Reference in New Issue
Block a user