llm-content-creator 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +309 -0
- package/dist/application/workflow/SyncExecutor.d.ts +75 -0
- package/dist/application/workflow/SyncExecutor.d.ts.map +1 -0
- package/dist/application/workflow/SyncExecutor.js +370 -0
- package/dist/application/workflow/SyncExecutor.js.map +1 -0
- package/dist/application/workflow/types.d.ts +46 -0
- package/dist/application/workflow/types.d.ts.map +1 -0
- package/dist/application/workflow/types.js +7 -0
- package/dist/application/workflow/types.js.map +1 -0
- package/dist/config/index.d.ts +173 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +288 -0
- package/dist/config/index.js.map +1 -0
- package/dist/domain/entities/QualityCheck.d.ts +181 -0
- package/dist/domain/entities/QualityCheck.d.ts.map +1 -0
- package/dist/domain/entities/QualityCheck.js +39 -0
- package/dist/domain/entities/QualityCheck.js.map +1 -0
- package/dist/domain/entities/Result.d.ts +103 -0
- package/dist/domain/entities/Result.d.ts.map +1 -0
- package/dist/domain/entities/Result.js +15 -0
- package/dist/domain/entities/Result.js.map +1 -0
- package/dist/domain/entities/Task.d.ts +130 -0
- package/dist/domain/entities/Task.d.ts.map +1 -0
- package/dist/domain/entities/Task.js +64 -0
- package/dist/domain/entities/Task.js.map +1 -0
- package/dist/domain/entities/TaskStep.d.ts +160 -0
- package/dist/domain/entities/TaskStep.d.ts.map +1 -0
- package/dist/domain/entities/TaskStep.js +30 -0
- package/dist/domain/entities/TaskStep.js.map +1 -0
- package/dist/domain/entities/TokenUsage.d.ts +70 -0
- package/dist/domain/entities/TokenUsage.d.ts.map +1 -0
- package/dist/domain/entities/TokenUsage.js +42 -0
- package/dist/domain/entities/TokenUsage.js.map +1 -0
- package/dist/domain/entities/index.d.ts +11 -0
- package/dist/domain/entities/index.d.ts.map +1 -0
- package/dist/domain/entities/index.js +16 -0
- package/dist/domain/entities/index.js.map +1 -0
- package/dist/domain/repositories/QualityCheckRepository.d.ts +49 -0
- package/dist/domain/repositories/QualityCheckRepository.d.ts.map +1 -0
- package/dist/domain/repositories/QualityCheckRepository.js +5 -0
- package/dist/domain/repositories/QualityCheckRepository.js.map +1 -0
- package/dist/domain/repositories/ResultRepository.d.ts +43 -0
- package/dist/domain/repositories/ResultRepository.d.ts.map +1 -0
- package/dist/domain/repositories/ResultRepository.js +5 -0
- package/dist/domain/repositories/ResultRepository.js.map +1 -0
- package/dist/domain/repositories/TaskRepository.d.ts +240 -0
- package/dist/domain/repositories/TaskRepository.d.ts.map +1 -0
- package/dist/domain/repositories/TaskRepository.js +7 -0
- package/dist/domain/repositories/TaskRepository.js.map +1 -0
- package/dist/domain/workflow/CheckpointManager.d.ts +94 -0
- package/dist/domain/workflow/CheckpointManager.d.ts.map +1 -0
- package/dist/domain/workflow/CheckpointManager.js +224 -0
- package/dist/domain/workflow/CheckpointManager.js.map +1 -0
- package/dist/domain/workflow/ContentCreatorGraph.d.ts +17 -0
- package/dist/domain/workflow/ContentCreatorGraph.d.ts.map +1 -0
- package/dist/domain/workflow/ContentCreatorGraph.js +381 -0
- package/dist/domain/workflow/ContentCreatorGraph.js.map +1 -0
- package/dist/domain/workflow/State.d.ts +172 -0
- package/dist/domain/workflow/State.d.ts.map +1 -0
- package/dist/domain/workflow/State.js +184 -0
- package/dist/domain/workflow/State.js.map +1 -0
- package/dist/domain/workflow/index.d.ts +11 -0
- package/dist/domain/workflow/index.d.ts.map +1 -0
- package/dist/domain/workflow/index.js +15 -0
- package/dist/domain/workflow/index.js.map +1 -0
- package/dist/domain/workflow/nodes/BaseNode.d.ts +134 -0
- package/dist/domain/workflow/nodes/BaseNode.d.ts.map +1 -0
- package/dist/domain/workflow/nodes/BaseNode.js +253 -0
- package/dist/domain/workflow/nodes/BaseNode.js.map +1 -0
- package/dist/domain/workflow/nodes/CheckImageNode.d.ts +43 -0
- package/dist/domain/workflow/nodes/CheckImageNode.d.ts.map +1 -0
- package/dist/domain/workflow/nodes/CheckImageNode.js +254 -0
- package/dist/domain/workflow/nodes/CheckImageNode.js.map +1 -0
- package/dist/domain/workflow/nodes/CheckTextNode.d.ts +66 -0
- package/dist/domain/workflow/nodes/CheckTextNode.d.ts.map +1 -0
- package/dist/domain/workflow/nodes/CheckTextNode.js +530 -0
- package/dist/domain/workflow/nodes/CheckTextNode.js.map +1 -0
- package/dist/domain/workflow/nodes/GenerateImageNode.d.ts +44 -0
- package/dist/domain/workflow/nodes/GenerateImageNode.d.ts.map +1 -0
- package/dist/domain/workflow/nodes/GenerateImageNode.js +272 -0
- package/dist/domain/workflow/nodes/GenerateImageNode.js.map +1 -0
- package/dist/domain/workflow/nodes/OrganizeNode.d.ts +49 -0
- package/dist/domain/workflow/nodes/OrganizeNode.d.ts.map +1 -0
- package/dist/domain/workflow/nodes/OrganizeNode.js +241 -0
- package/dist/domain/workflow/nodes/OrganizeNode.js.map +1 -0
- package/dist/domain/workflow/nodes/SearchNode.d.ts +48 -0
- package/dist/domain/workflow/nodes/SearchNode.d.ts.map +1 -0
- package/dist/domain/workflow/nodes/SearchNode.js +151 -0
- package/dist/domain/workflow/nodes/SearchNode.js.map +1 -0
- package/dist/domain/workflow/nodes/WriteNode.d.ts +68 -0
- package/dist/domain/workflow/nodes/WriteNode.d.ts.map +1 -0
- package/dist/domain/workflow/nodes/WriteNode.js +431 -0
- package/dist/domain/workflow/nodes/WriteNode.js.map +1 -0
- package/dist/domain/workflow/nodes/config/index.js +287 -0
- package/dist/domain/workflow/nodes/domain/entities/Task.js +68 -0
- package/dist/domain/workflow/nodes/domain/workflow/State.js +200 -0
- package/dist/domain/workflow/nodes/domain/workflow/nodes/BaseNode.js +328 -0
- package/dist/domain/workflow/nodes/domain/workflow/nodes/CheckTextNode.js +500 -0
- package/dist/domain/workflow/nodes/index.d.ts +13 -0
- package/dist/domain/workflow/nodes/index.d.ts.map +1 -0
- package/dist/domain/workflow/nodes/index.js +13 -0
- package/dist/domain/workflow/nodes/index.js.map +1 -0
- package/dist/domain/workflow/nodes/infrastructure/logging/logger.js +275 -0
- package/dist/domain/workflow/nodes/services/llm/EnhancedLLMService.js +559 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/cache/CacheService.d.ts +139 -0
- package/dist/infrastructure/cache/CacheService.d.ts.map +1 -0
- package/dist/infrastructure/cache/CacheService.js +419 -0
- package/dist/infrastructure/cache/CacheService.js.map +1 -0
- package/dist/infrastructure/cache/index.d.ts +5 -0
- package/dist/infrastructure/cache/index.d.ts.map +1 -0
- package/dist/infrastructure/cache/index.js +6 -0
- package/dist/infrastructure/cache/index.js.map +1 -0
- package/dist/infrastructure/database/BaseRepository.d.ts +98 -0
- package/dist/infrastructure/database/BaseRepository.d.ts.map +1 -0
- package/dist/infrastructure/database/BaseRepository.js +178 -0
- package/dist/infrastructure/database/BaseRepository.js.map +1 -0
- package/dist/infrastructure/database/MemoryTaskRepository.d.ts +77 -0
- package/dist/infrastructure/database/MemoryTaskRepository.d.ts.map +1 -0
- package/dist/infrastructure/database/MemoryTaskRepository.js +309 -0
- package/dist/infrastructure/database/MemoryTaskRepository.js.map +1 -0
- package/dist/infrastructure/database/PostgresQualityCheckRepository.d.ts +36 -0
- package/dist/infrastructure/database/PostgresQualityCheckRepository.d.ts.map +1 -0
- package/dist/infrastructure/database/PostgresQualityCheckRepository.js +89 -0
- package/dist/infrastructure/database/PostgresQualityCheckRepository.js.map +1 -0
- package/dist/infrastructure/database/PostgresTaskRepository.d.ts +94 -0
- package/dist/infrastructure/database/PostgresTaskRepository.d.ts.map +1 -0
- package/dist/infrastructure/database/PostgresTaskRepository.js +364 -0
- package/dist/infrastructure/database/PostgresTaskRepository.js.map +1 -0
- package/dist/infrastructure/database/ResultRepository.d.ts +41 -0
- package/dist/infrastructure/database/ResultRepository.d.ts.map +1 -0
- package/dist/infrastructure/database/ResultRepository.js +86 -0
- package/dist/infrastructure/database/ResultRepository.js.map +1 -0
- package/dist/infrastructure/database/SQLiteTaskRepository.d.ts +101 -0
- package/dist/infrastructure/database/SQLiteTaskRepository.d.ts.map +1 -0
- package/dist/infrastructure/database/SQLiteTaskRepository.js +548 -0
- package/dist/infrastructure/database/SQLiteTaskRepository.js.map +1 -0
- package/dist/infrastructure/database/index.d.ts +32 -0
- package/dist/infrastructure/database/index.d.ts.map +1 -0
- package/dist/infrastructure/database/index.js +72 -0
- package/dist/infrastructure/database/index.js.map +1 -0
- package/dist/infrastructure/logging/logger.d.ts +69 -0
- package/dist/infrastructure/logging/logger.d.ts.map +1 -0
- package/dist/infrastructure/logging/logger.js +169 -0
- package/dist/infrastructure/logging/logger.js.map +1 -0
- package/dist/infrastructure/monitoring/LoggingService.d.ts +109 -0
- package/dist/infrastructure/monitoring/LoggingService.d.ts.map +1 -0
- package/dist/infrastructure/monitoring/LoggingService.js +198 -0
- package/dist/infrastructure/monitoring/LoggingService.js.map +1 -0
- package/dist/infrastructure/monitoring/MetricsService.d.ts +112 -0
- package/dist/infrastructure/monitoring/MetricsService.d.ts.map +1 -0
- package/dist/infrastructure/monitoring/MetricsService.js +362 -0
- package/dist/infrastructure/monitoring/MetricsService.js.map +1 -0
- package/dist/infrastructure/monitoring/SentryService.d.ts +108 -0
- package/dist/infrastructure/monitoring/SentryService.d.ts.map +1 -0
- package/dist/infrastructure/monitoring/SentryService.js +282 -0
- package/dist/infrastructure/monitoring/SentryService.js.map +1 -0
- package/dist/infrastructure/monitoring/index.d.ts +7 -0
- package/dist/infrastructure/monitoring/index.d.ts.map +1 -0
- package/dist/infrastructure/monitoring/index.js +10 -0
- package/dist/infrastructure/monitoring/index.js.map +1 -0
- package/dist/infrastructure/queue/TaskQueue.d.ts +110 -0
- package/dist/infrastructure/queue/TaskQueue.d.ts.map +1 -0
- package/dist/infrastructure/queue/TaskQueue.js +363 -0
- package/dist/infrastructure/queue/TaskQueue.js.map +1 -0
- package/dist/infrastructure/queue/index.d.ts +5 -0
- package/dist/infrastructure/queue/index.d.ts.map +1 -0
- package/dist/infrastructure/queue/index.js +5 -0
- package/dist/infrastructure/queue/index.js.map +1 -0
- package/dist/infrastructure/redis/connection.d.ts +61 -0
- package/dist/infrastructure/redis/connection.d.ts.map +1 -0
- package/dist/infrastructure/redis/connection.js +184 -0
- package/dist/infrastructure/redis/connection.js.map +1 -0
- package/dist/infrastructure/redis/index.d.ts +5 -0
- package/dist/infrastructure/redis/index.d.ts.map +1 -0
- package/dist/infrastructure/redis/index.js +5 -0
- package/dist/infrastructure/redis/index.js.map +1 -0
- package/dist/infrastructure/security/ApiKeyService.d.ts +103 -0
- package/dist/infrastructure/security/ApiKeyService.d.ts.map +1 -0
- package/dist/infrastructure/security/ApiKeyService.js +250 -0
- package/dist/infrastructure/security/ApiKeyService.js.map +1 -0
- package/dist/infrastructure/security/QuotaService.d.ts +87 -0
- package/dist/infrastructure/security/QuotaService.d.ts.map +1 -0
- package/dist/infrastructure/security/QuotaService.js +303 -0
- package/dist/infrastructure/security/QuotaService.js.map +1 -0
- package/dist/infrastructure/security/RateLimiter.d.ts +104 -0
- package/dist/infrastructure/security/RateLimiter.d.ts.map +1 -0
- package/dist/infrastructure/security/RateLimiter.js +331 -0
- package/dist/infrastructure/security/RateLimiter.js.map +1 -0
- package/dist/infrastructure/security/index.d.ts +7 -0
- package/dist/infrastructure/security/index.d.ts.map +1 -0
- package/dist/infrastructure/security/index.js +10 -0
- package/dist/infrastructure/security/index.js.map +1 -0
- package/dist/monitoring/index.d.ts +5 -0
- package/dist/monitoring/index.d.ts.map +1 -0
- package/dist/monitoring/index.js +5 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/monitoring/server.d.ts +14 -0
- package/dist/monitoring/server.d.ts.map +1 -0
- package/dist/monitoring/server.js +99 -0
- package/dist/monitoring/server.js.map +1 -0
- package/dist/presentation/cli/commands/cancel.d.ts +8 -0
- package/dist/presentation/cli/commands/cancel.d.ts.map +1 -0
- package/dist/presentation/cli/commands/cancel.js +57 -0
- package/dist/presentation/cli/commands/cancel.js.map +1 -0
- package/dist/presentation/cli/commands/create.d.ts +8 -0
- package/dist/presentation/cli/commands/create.d.ts.map +1 -0
- package/dist/presentation/cli/commands/create.js +368 -0
- package/dist/presentation/cli/commands/create.js.map +1 -0
- package/dist/presentation/cli/commands/result.d.ts +8 -0
- package/dist/presentation/cli/commands/result.d.ts.map +1 -0
- package/dist/presentation/cli/commands/result.js +121 -0
- package/dist/presentation/cli/commands/result.js.map +1 -0
- package/dist/presentation/cli/commands/status.d.ts +8 -0
- package/dist/presentation/cli/commands/status.d.ts.map +1 -0
- package/dist/presentation/cli/commands/status.js +92 -0
- package/dist/presentation/cli/commands/status.js.map +1 -0
- package/dist/presentation/cli/index.d.ts +8 -0
- package/dist/presentation/cli/index.d.ts.map +1 -0
- package/dist/presentation/cli/index.js +32 -0
- package/dist/presentation/cli/index.js.map +1 -0
- package/dist/presentation/cli/utils/cleanup.d.ts +14 -0
- package/dist/presentation/cli/utils/cleanup.d.ts.map +1 -0
- package/dist/presentation/cli/utils/cleanup.js +62 -0
- package/dist/presentation/cli/utils/cleanup.js.map +1 -0
- package/dist/presentation/cli/utils/formatter.d.ts +28 -0
- package/dist/presentation/cli/utils/formatter.d.ts.map +1 -0
- package/dist/presentation/cli/utils/formatter.js +68 -0
- package/dist/presentation/cli/utils/formatter.js.map +1 -0
- package/dist/presentation/cli.d.ts +7 -0
- package/dist/presentation/cli.d.ts.map +1 -0
- package/dist/presentation/cli.js +8 -0
- package/dist/presentation/cli.js.map +1 -0
- package/dist/presentation/monitor-cli.d.ts +8 -0
- package/dist/presentation/monitor-cli.d.ts.map +1 -0
- package/dist/presentation/monitor-cli.js +44 -0
- package/dist/presentation/monitor-cli.js.map +1 -0
- package/dist/presentation/worker-cli.d.ts +8 -0
- package/dist/presentation/worker-cli.d.ts.map +1 -0
- package/dist/presentation/worker-cli.js +51 -0
- package/dist/presentation/worker-cli.js.map +1 -0
- package/dist/schedulers/TaskScheduler.d.ts +99 -0
- package/dist/schedulers/TaskScheduler.d.ts.map +1 -0
- package/dist/schedulers/TaskScheduler.js +233 -0
- package/dist/schedulers/TaskScheduler.js.map +1 -0
- package/dist/schedulers/index.d.ts +5 -0
- package/dist/schedulers/index.d.ts.map +1 -0
- package/dist/schedulers/index.js +5 -0
- package/dist/schedulers/index.js.map +1 -0
- package/dist/services/image/ImageService.d.ts +68 -0
- package/dist/services/image/ImageService.d.ts.map +1 -0
- package/dist/services/image/ImageService.js +166 -0
- package/dist/services/image/ImageService.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +12 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/llm/EnhancedLLMService.d.ts +148 -0
- package/dist/services/llm/EnhancedLLMService.d.ts.map +1 -0
- package/dist/services/llm/EnhancedLLMService.js +425 -0
- package/dist/services/llm/EnhancedLLMService.js.map +1 -0
- package/dist/services/llm/LLMService.d.ts +103 -0
- package/dist/services/llm/LLMService.d.ts.map +1 -0
- package/dist/services/llm/LLMService.js +212 -0
- package/dist/services/llm/LLMService.js.map +1 -0
- package/dist/services/quality/HardRuleChecker.d.ts +143 -0
- package/dist/services/quality/HardRuleChecker.d.ts.map +1 -0
- package/dist/services/quality/HardRuleChecker.js +353 -0
- package/dist/services/quality/HardRuleChecker.js.map +1 -0
- package/dist/services/quality/LLMEvaluator.d.ts +105 -0
- package/dist/services/quality/LLMEvaluator.d.ts.map +1 -0
- package/dist/services/quality/LLMEvaluator.js +312 -0
- package/dist/services/quality/LLMEvaluator.js.map +1 -0
- package/dist/services/quality/QualityCheckService.d.ts +112 -0
- package/dist/services/quality/QualityCheckService.d.ts.map +1 -0
- package/dist/services/quality/QualityCheckService.js +342 -0
- package/dist/services/quality/QualityCheckService.js.map +1 -0
- package/dist/services/quality/QualityService.d.ts +75 -0
- package/dist/services/quality/QualityService.d.ts.map +1 -0
- package/dist/services/quality/QualityService.js +360 -0
- package/dist/services/quality/QualityService.js.map +1 -0
- package/dist/services/quality/index.d.ts +7 -0
- package/dist/services/quality/index.d.ts.map +1 -0
- package/dist/services/quality/index.js +10 -0
- package/dist/services/quality/index.js.map +1 -0
- package/dist/services/search/SearchService.d.ts +79 -0
- package/dist/services/search/SearchService.d.ts.map +1 -0
- package/dist/services/search/SearchService.js +193 -0
- package/dist/services/search/SearchService.js.map +1 -0
- package/dist/workers/TaskWorker.d.ts +61 -0
- package/dist/workers/TaskWorker.d.ts.map +1 -0
- package/dist/workers/TaskWorker.js +256 -0
- package/dist/workers/TaskWorker.js.map +1 -0
- package/dist/workers/index.d.ts +5 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +5 -0
- package/dist/workers/index.js.map +1 -0
- package/docs/DOCUMENTATION-ANALYSIS.md +190 -0
- package/docs/README.md +145 -0
- package/docs/SOURCE-CODE-ANALYSIS.md +1107 -0
- package/docs/architecture-complete.md +5524 -0
- package/docs/archive/implementation/implementation-analysis/README.md +244 -0
- package/docs/archive/implementation/implementation-analysis/implementation-analysis-context.md +483 -0
- package/docs/archive/implementation/implementation-analysis/implementation-analysis-plan.md +1242 -0
- package/docs/archive/implementation/implementation-analysis/implementation-analysis-tasks.md +777 -0
- package/docs/archive/phases/phase-1/phase-1-completion-summary.md +284 -0
- package/docs/archive/phases/phase-1/phase-1-implementation-guide.md +1380 -0
- package/docs/archive/phases/phase-2/phase-2a/phase-2a-completion-summary.md +443 -0
- package/docs/archive/phases/phase-2/phase-2b/phase-2b-completion-report.md +430 -0
- package/docs/archive/phases/phase-2/phase-2b/phase-2b-completion-summary.md +592 -0
- package/docs/archive/phases/phase-2/phase-2b/phase-2b-final-summary.md +371 -0
- package/docs/archive/phases/phase-2/phase-2b/phase-2b-preparation-complete.md +343 -0
- package/docs/archive/phases/phase-2/phase-2b/phase-2b-preparation.md +945 -0
- package/docs/archive/phases/phase-2/phase-2b/phase-2b-progress-update.md +366 -0
- package/docs/archive/phases/phase-3/phase-3-completion-summary.md +354 -0
- package/docs/archive/phases/phase-3/phase-3-development-plan.md +878 -0
- package/docs/archive/phases/phase-3/phase-3-quick-start.md +324 -0
- package/docs/archive/phases/phase-4/phase-4-completion-summary.md +708 -0
- package/docs/archive/phases/phase-4/phase-4-development-plan.md +740 -0
- package/docs/archive/phases/phase-4/phase-4-quick-start.md +632 -0
- package/docs/archive/phases/phase-4/phase-4-session-3-security-testing.md +484 -0
- package/docs/archive/phases/phase-4/phase-4-session-4-unit-tests.md +550 -0
- package/docs/archive/phases/phase-4/phase-4-session-5-security-tests.md +564 -0
- package/docs/archive/phases/phase-4/phase-4-session-6-cache-integration.md +456 -0
- package/docs/archive/phases/phase-4/phase-4-session-7-test-fixes.md +348 -0
- package/docs/archive/phases/phase-4/phase-4-session-8-taskqueue-fixes.md +323 -0
- package/docs/archive/phases/phase-4/phase-4-session-summary-continued.md +373 -0
- package/docs/archive/phases/phase-4/phase-4-session-summary.md +595 -0
- package/docs/archive/reports/progress-reports/PHASE_0_PROGRESS.md +242 -0
- package/docs/archive/reports/progress-reports/PHASE_0_SUMMARY.md +262 -0
- package/docs/archive/reports/progress-reports/PHASE_1_2_ISSUES.md +399 -0
- package/docs/archive/reports/progress-reports/PHASE_1_PROGRESS.md +388 -0
- package/docs/archive/reports/progress-reports/PHASE_3_PREPARATION.md +574 -0
- package/docs/archive/reports/progress-reports/current-progress-update.md +294 -0
- package/docs/archive/reports/progress-reports/final-summary.md +215 -0
- package/docs/archive/reports/progress-reports/implementation-summary.md +287 -0
- package/docs/archive/reports/progress-reports/project-progress-report.md +440 -0
- package/docs/archive/reports/progress-reports/project-progress.md +386 -0
- package/docs/archive/reports/test-reports/TEST-COVERAGE-REPORT.md +441 -0
- package/docs/archive/reports/test-reports/e2e-test-report.md +293 -0
- package/docs/archive/reports/test-reports/final-test-report.md +367 -0
- package/docs/archive/reports/test-reports/real-env-test-report.md +391 -0
- package/docs/archive/reports/test-reports/test-completion-summary.md +356 -0
- package/docs/archive/reports/test-reports/test-report.md +371 -0
- package/docs/archive/sessions/session-2-summary.md +429 -0
- package/docs/archive/sessions/session-3-summary.md +395 -0
- package/docs/archive/sessions/session-summary.md +370 -0
- package/docs/config-system-update.md +239 -0
- package/docs/database-refactoring-PLAN.md +199 -0
- package/docs/database-refactoring-SUMMARY.md +384 -0
- package/docs/quality-check-architecture.md +1030 -0
- package/docs/quick-start.md +388 -0
- package/docs/references/bullmq-quick-reference.md +525 -0
- package/docs/references/monitoring-optimization-guide.md +871 -0
- package/docs/references/performance-optimization-guide.md +933 -0
- package/docs/storage-guide.md +612 -0
- package/docs/test-implementation-PLAN.md +223 -0
- package/docs/test-implementation-SUMMARY.md +194 -0
- package/docs/user-guide.md +719 -0
- package/docs/workflow-architecture.md +549 -0
- package/package.json +126 -0
- package/src/application/workflow/SyncExecutor.ts +444 -0
- package/src/application/workflow/types.ts +57 -0
- package/src/config/index.ts +352 -0
- package/src/domain/entities/QualityCheck.ts +202 -0
- package/src/domain/entities/Result.ts +130 -0
- package/src/domain/entities/Task.ts +178 -0
- package/src/domain/entities/TaskStep.ts +188 -0
- package/src/domain/entities/TokenUsage.ts +119 -0
- package/src/domain/entities/index.ts +20 -0
- package/src/domain/repositories/QualityCheckRepository.ts +52 -0
- package/src/domain/repositories/ResultRepository.ts +47 -0
- package/src/domain/repositories/TaskRepository.ts +271 -0
- package/src/domain/workflow/CheckpointManager.ts +283 -0
- package/src/domain/workflow/ContentCreatorGraph.ts +446 -0
- package/src/domain/workflow/State.ts +321 -0
- package/src/domain/workflow/index.ts +18 -0
- package/src/domain/workflow/nodes/BaseNode.ts +325 -0
- package/src/domain/workflow/nodes/CheckImageNode.ts +325 -0
- package/src/domain/workflow/nodes/CheckTextNode.ts +709 -0
- package/src/domain/workflow/nodes/GenerateImageNode.ts +342 -0
- package/src/domain/workflow/nodes/OrganizeNode.ts +304 -0
- package/src/domain/workflow/nodes/SearchNode.ts +192 -0
- package/src/domain/workflow/nodes/WriteNode.ts +505 -0
- package/src/domain/workflow/nodes/index.ts +13 -0
- package/src/index.ts +43 -0
- package/src/infrastructure/cache/CacheService.ts +483 -0
- package/src/infrastructure/cache/index.ts +6 -0
- package/src/infrastructure/database/BaseRepository.ts +214 -0
- package/src/infrastructure/database/MemoryTaskRepository.ts +377 -0
- package/src/infrastructure/database/PostgresQualityCheckRepository.ts +115 -0
- package/src/infrastructure/database/PostgresTaskRepository.ts +424 -0
- package/src/infrastructure/database/ResultRepository.ts +113 -0
- package/src/infrastructure/database/SQLiteTaskRepository.ts +651 -0
- package/src/infrastructure/database/index.ts +83 -0
- package/src/infrastructure/logging/logger.ts +231 -0
- package/src/infrastructure/monitoring/LoggingService.ts +292 -0
- package/src/infrastructure/monitoring/MetricsService.ts +468 -0
- package/src/infrastructure/monitoring/SentryService.ts +345 -0
- package/src/infrastructure/monitoring/index.ts +12 -0
- package/src/infrastructure/queue/TaskQueue.ts +429 -0
- package/src/infrastructure/queue/index.ts +5 -0
- package/src/infrastructure/redis/connection.ts +215 -0
- package/src/infrastructure/redis/index.ts +5 -0
- package/src/infrastructure/security/ApiKeyService.ts +340 -0
- package/src/infrastructure/security/QuotaService.ts +411 -0
- package/src/infrastructure/security/RateLimiter.ts +417 -0
- package/src/infrastructure/security/index.ts +12 -0
- package/src/monitoring/index.ts +5 -0
- package/src/monitoring/server.ts +109 -0
- package/src/presentation/cli/commands/cancel.ts +64 -0
- package/src/presentation/cli/commands/create.ts +400 -0
- package/src/presentation/cli/commands/result.ts +136 -0
- package/src/presentation/cli/commands/status.ts +102 -0
- package/src/presentation/cli/index.ts +39 -0
- package/src/presentation/cli/utils/cleanup.ts +65 -0
- package/src/presentation/cli/utils/formatter.ts +74 -0
- package/src/presentation/cli.ts +8 -0
- package/src/presentation/monitor-cli.ts +52 -0
- package/src/presentation/worker-cli.ts +62 -0
- package/src/schedulers/TaskScheduler.ts +314 -0
- package/src/schedulers/index.ts +11 -0
- package/src/services/image/ImageService.ts +221 -0
- package/src/services/index.ts +15 -0
- package/src/services/llm/EnhancedLLMService.ts +596 -0
- package/src/services/llm/LLMService.ts +310 -0
- package/src/services/quality/HardRuleChecker.ts +509 -0
- package/src/services/quality/LLMEvaluator.ts +400 -0
- package/src/services/quality/QualityCheckService.ts +473 -0
- package/src/services/quality/QualityService.ts +445 -0
- package/src/services/quality/index.ts +12 -0
- package/src/services/search/SearchService.ts +266 -0
- package/src/types/global.d.ts +17 -0
- package/src/workers/TaskWorker.ts +320 -0
- package/src/workers/index.ts +5 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgresTaskRepository - 任务数据访问实现
|
|
3
|
+
*
|
|
4
|
+
* 使用 PostgreSQL 实现任务数据持久化
|
|
5
|
+
* 支持乐观锁并发控制和 Worker 抢占机制
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { BaseRepository } from './BaseRepository.js';
|
|
9
|
+
import type { ITaskRepository, CreateTaskInput, TaskFilter, Pagination } from '../../domain/repositories/TaskRepository.js';
|
|
10
|
+
import type { Task } from '../../domain/entities/Task.js';
|
|
11
|
+
import { TaskStatus, ExecutionMode } from '../../domain/entities/Task.js';
|
|
12
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* PostgreSQL 任务仓储实现
|
|
16
|
+
*/
|
|
17
|
+
export class PostgresTaskRepository extends BaseRepository implements ITaskRepository {
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 创建任务
|
|
21
|
+
*/
|
|
22
|
+
async create(input: CreateTaskInput): Promise<Task> {
|
|
23
|
+
// 使用幂等键作为 taskId,或者生成新的 UUID
|
|
24
|
+
const taskId = input.idempotencyKey || uuidv4();
|
|
25
|
+
|
|
26
|
+
const query = `
|
|
27
|
+
INSERT INTO tasks (
|
|
28
|
+
task_id, user_id, mode, topic, requirements,
|
|
29
|
+
hard_constraints, idempotency_key
|
|
30
|
+
) VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
31
|
+
ON CONFLICT (task_id) DO UPDATE SET
|
|
32
|
+
user_id = EXCLUDED.user_id,
|
|
33
|
+
mode = EXCLUDED.mode,
|
|
34
|
+
topic = EXCLUDED.topic,
|
|
35
|
+
requirements = EXCLUDED.requirements,
|
|
36
|
+
hard_constraints = EXCLUDED.hard_constraints,
|
|
37
|
+
updated_at = CURRENT_TIMESTAMP
|
|
38
|
+
RETURNING *
|
|
39
|
+
`;
|
|
40
|
+
|
|
41
|
+
const values = [
|
|
42
|
+
taskId,
|
|
43
|
+
input.userId || null,
|
|
44
|
+
input.mode,
|
|
45
|
+
input.topic,
|
|
46
|
+
input.requirements,
|
|
47
|
+
JSON.stringify(input.hardConstraints || {}),
|
|
48
|
+
input.idempotencyKey || null,
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
const result = await this.query<any>(query, values);
|
|
52
|
+
return this.mapToTask(result.rows[0]);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 根据 taskId 查询任务
|
|
57
|
+
*/
|
|
58
|
+
async findById(taskId: string): Promise<Task | null> {
|
|
59
|
+
const query = 'SELECT * FROM tasks WHERE task_id = $1 AND deleted_at IS NULL';
|
|
60
|
+
const result = await this.query<any>(query, [taskId]);
|
|
61
|
+
|
|
62
|
+
if (result.rows.length === 0) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return this.mapToTask(result.rows[0]);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 根据 idempotencyKey 查询任务
|
|
71
|
+
*/
|
|
72
|
+
async findByIdempotencyKey(idempotencyKey: string): Promise<Task | null> {
|
|
73
|
+
const query = 'SELECT * FROM tasks WHERE idempotency_key = $1 AND deleted_at IS NULL';
|
|
74
|
+
const result = await this.query<any>(query, [idempotencyKey]);
|
|
75
|
+
|
|
76
|
+
if (result.rows.length === 0) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return this.mapToTask(result.rows[0]);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 根据 userId 查询任务列表
|
|
85
|
+
*/
|
|
86
|
+
async findByUserId(userId: string, pagination: Pagination = {}): Promise<Task[]> {
|
|
87
|
+
const { limit = 10, offset = 0 } = pagination;
|
|
88
|
+
|
|
89
|
+
const query = `
|
|
90
|
+
SELECT * FROM tasks
|
|
91
|
+
WHERE user_id = $1 AND deleted_at IS NULL
|
|
92
|
+
ORDER BY created_at DESC
|
|
93
|
+
LIMIT $2 OFFSET $3
|
|
94
|
+
`;
|
|
95
|
+
|
|
96
|
+
const result = await this.query<any>(query, [userId, limit, offset]);
|
|
97
|
+
return result.rows.map(row => this.mapToTask(row));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 查询任务列表(支持过滤和分页)
|
|
102
|
+
*/
|
|
103
|
+
async findMany(filter: TaskFilter = {}, pagination: Pagination = {}): Promise<Task[]> {
|
|
104
|
+
const { limit = 10, offset = 0 } = pagination;
|
|
105
|
+
const conditions: string[] = ['deleted_at IS NULL'];
|
|
106
|
+
const params: any[] = [];
|
|
107
|
+
let paramIndex = 1;
|
|
108
|
+
|
|
109
|
+
if (filter.userId) {
|
|
110
|
+
conditions.push(`user_id = $${paramIndex++}`);
|
|
111
|
+
params.push(filter.userId);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (filter.status) {
|
|
115
|
+
conditions.push(`status = $${paramIndex++}`);
|
|
116
|
+
params.push(filter.status);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (filter.mode) {
|
|
120
|
+
conditions.push(`mode = $${paramIndex++}`);
|
|
121
|
+
params.push(filter.mode);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (filter.startDate) {
|
|
125
|
+
conditions.push(`created_at >= $${paramIndex++}`);
|
|
126
|
+
params.push(filter.startDate);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (filter.endDate) {
|
|
130
|
+
conditions.push(`created_at <= $${paramIndex++}`);
|
|
131
|
+
params.push(filter.endDate);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const whereClause = conditions.join(' AND ');
|
|
135
|
+
const query = `
|
|
136
|
+
SELECT * FROM tasks
|
|
137
|
+
WHERE ${whereClause}
|
|
138
|
+
ORDER BY created_at DESC
|
|
139
|
+
LIMIT $${paramIndex++} OFFSET $${paramIndex++}
|
|
140
|
+
`;
|
|
141
|
+
|
|
142
|
+
params.push(limit, offset);
|
|
143
|
+
|
|
144
|
+
const result = await this.query<any>(query, params);
|
|
145
|
+
return result.rows.map(row => this.mapToTask(row));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* 统计任务数量
|
|
150
|
+
*/
|
|
151
|
+
// @ts-ignore - Method signature differs from base class
|
|
152
|
+
async count(filter: TaskFilter = {}): Promise<number> {
|
|
153
|
+
const conditions: string[] = ['deleted_at IS NULL'];
|
|
154
|
+
const params: any[] = [];
|
|
155
|
+
let paramIndex = 1;
|
|
156
|
+
|
|
157
|
+
if (filter.userId) {
|
|
158
|
+
conditions.push(`user_id = $${paramIndex++}`);
|
|
159
|
+
params.push(filter.userId);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (filter.status) {
|
|
163
|
+
conditions.push(`status = $${paramIndex++}`);
|
|
164
|
+
params.push(filter.status);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (filter.mode) {
|
|
168
|
+
conditions.push(`mode = $${paramIndex++}`);
|
|
169
|
+
params.push(filter.mode);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const whereClause = conditions.join(' AND ');
|
|
173
|
+
const query = `SELECT COUNT(*) as count FROM tasks WHERE ${whereClause}`;
|
|
174
|
+
|
|
175
|
+
const result = await this.query<{ count: string }>(query, params);
|
|
176
|
+
return parseInt(result.rows[0]?.count ?? '0', 10);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* 更新任务状态(带乐观锁)
|
|
181
|
+
*/
|
|
182
|
+
async updateStatus(taskId: string, status: TaskStatus, version: number): Promise<boolean> {
|
|
183
|
+
const query = `
|
|
184
|
+
UPDATE tasks
|
|
185
|
+
SET status = $1,
|
|
186
|
+
version = version + 1,
|
|
187
|
+
updated_at = CURRENT_TIMESTAMP
|
|
188
|
+
WHERE task_id = $2 AND version = $3 AND deleted_at IS NULL
|
|
189
|
+
RETURNING version
|
|
190
|
+
`;
|
|
191
|
+
|
|
192
|
+
const result = await this.query(query, [status, taskId, version]);
|
|
193
|
+
return result.rowCount === 1;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* 更新当前步骤(带乐观锁)
|
|
198
|
+
*/
|
|
199
|
+
async updateCurrentStep(taskId: string, step: string, version: number): Promise<boolean> {
|
|
200
|
+
const query = `
|
|
201
|
+
UPDATE tasks
|
|
202
|
+
SET current_step = $1,
|
|
203
|
+
version = version + 1,
|
|
204
|
+
updated_at = CURRENT_TIMESTAMP
|
|
205
|
+
WHERE task_id = $2 AND version = $3 AND deleted_at IS NULL
|
|
206
|
+
RETURNING version
|
|
207
|
+
`;
|
|
208
|
+
|
|
209
|
+
const result = await this.query(query, [step, taskId, version]);
|
|
210
|
+
return result.rowCount === 1;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Worker 抢占任务(乐观锁)
|
|
215
|
+
*
|
|
216
|
+
* 只有状态为 pending 且版本号匹配的任务才能被抢占
|
|
217
|
+
*/
|
|
218
|
+
async claimTask(taskId: string, workerId: string, version: number): Promise<boolean> {
|
|
219
|
+
const query = `
|
|
220
|
+
UPDATE tasks
|
|
221
|
+
SET worker_id = $1,
|
|
222
|
+
status = 'running',
|
|
223
|
+
started_at = CURRENT_TIMESTAMP,
|
|
224
|
+
current_step = 'claimed',
|
|
225
|
+
version = version + 1,
|
|
226
|
+
updated_at = CURRENT_TIMESTAMP
|
|
227
|
+
WHERE task_id = $2
|
|
228
|
+
AND version = $3
|
|
229
|
+
AND status = 'pending'
|
|
230
|
+
AND deleted_at IS NULL
|
|
231
|
+
RETURNING version
|
|
232
|
+
`;
|
|
233
|
+
|
|
234
|
+
const result = await this.query(query, [workerId, taskId, version]);
|
|
235
|
+
return result.rowCount === 1;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* 增加重试计数(带乐观锁)
|
|
240
|
+
*/
|
|
241
|
+
async incrementRetryCount(
|
|
242
|
+
taskId: string,
|
|
243
|
+
type: 'text' | 'image',
|
|
244
|
+
version: number
|
|
245
|
+
): Promise<boolean> {
|
|
246
|
+
const column = type === 'text' ? 'text_retry_count' : 'image_retry_count';
|
|
247
|
+
|
|
248
|
+
const query = `
|
|
249
|
+
UPDATE tasks
|
|
250
|
+
SET ${column} = ${column} + 1,
|
|
251
|
+
version = version + 1,
|
|
252
|
+
updated_at = CURRENT_TIMESTAMP
|
|
253
|
+
WHERE task_id = $1 AND version = $2 AND deleted_at IS NULL
|
|
254
|
+
RETURNING version
|
|
255
|
+
`;
|
|
256
|
+
|
|
257
|
+
const result = await this.query(query, [taskId, version]);
|
|
258
|
+
return result.rowCount === 1;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* 保存 State 快照(带乐观锁)
|
|
263
|
+
*/
|
|
264
|
+
async saveStateSnapshot(taskId: string, snapshot: object, version: number): Promise<boolean> {
|
|
265
|
+
const query = `
|
|
266
|
+
UPDATE tasks
|
|
267
|
+
SET state_snapshot = $1,
|
|
268
|
+
version = version + 1,
|
|
269
|
+
updated_at = CURRENT_TIMESTAMP
|
|
270
|
+
WHERE task_id = $2 AND version = $3 AND deleted_at IS NULL
|
|
271
|
+
RETURNING version
|
|
272
|
+
`;
|
|
273
|
+
|
|
274
|
+
const result = await this.query(query, [JSON.stringify(snapshot), taskId, version]);
|
|
275
|
+
return result.rowCount === 1;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* 标记任务完成(带乐观锁)
|
|
280
|
+
*/
|
|
281
|
+
async markAsCompleted(taskId: string, version: number): Promise<boolean> {
|
|
282
|
+
const query = `
|
|
283
|
+
UPDATE tasks
|
|
284
|
+
SET status = 'completed',
|
|
285
|
+
completed_at = CURRENT_TIMESTAMP,
|
|
286
|
+
version = version + 1,
|
|
287
|
+
updated_at = CURRENT_TIMESTAMP
|
|
288
|
+
WHERE task_id = $1 AND version = $2 AND deleted_at IS NULL
|
|
289
|
+
RETURNING version
|
|
290
|
+
`;
|
|
291
|
+
|
|
292
|
+
const result = await this.query(query, [taskId, version]);
|
|
293
|
+
return result.rowCount === 1;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* 标记任务失败(带乐观锁)
|
|
298
|
+
*/
|
|
299
|
+
async markAsFailed(taskId: string, errorMessage: string, version: number): Promise<boolean> {
|
|
300
|
+
const query = `
|
|
301
|
+
UPDATE tasks
|
|
302
|
+
SET status = 'failed',
|
|
303
|
+
error_message = $1,
|
|
304
|
+
completed_at = CURRENT_TIMESTAMP,
|
|
305
|
+
version = version + 1,
|
|
306
|
+
updated_at = CURRENT_TIMESTAMP
|
|
307
|
+
WHERE task_id = $2 AND version = $3 AND deleted_at IS NULL
|
|
308
|
+
RETURNING version
|
|
309
|
+
`;
|
|
310
|
+
|
|
311
|
+
const result = await this.query(query, [errorMessage, taskId, version]);
|
|
312
|
+
return result.rowCount === 1;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* 释放 Worker 占用(用于任务崩溃时)
|
|
317
|
+
*/
|
|
318
|
+
async releaseWorker(taskId: string, workerId: string, version: number): Promise<boolean> {
|
|
319
|
+
const query = `
|
|
320
|
+
UPDATE tasks
|
|
321
|
+
SET worker_id = NULL,
|
|
322
|
+
status = 'pending',
|
|
323
|
+
version = version + 1,
|
|
324
|
+
updated_at = CURRENT_TIMESTAMP
|
|
325
|
+
WHERE task_id = $1
|
|
326
|
+
AND worker_id = $2
|
|
327
|
+
AND version = $3
|
|
328
|
+
AND deleted_at IS NULL
|
|
329
|
+
RETURNING version
|
|
330
|
+
`;
|
|
331
|
+
|
|
332
|
+
const result = await this.query(query, [taskId, workerId, version]);
|
|
333
|
+
return result.rowCount === 1;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* 软删除任务
|
|
338
|
+
*/
|
|
339
|
+
async softDelete(taskId: string): Promise<boolean> {
|
|
340
|
+
const query = `
|
|
341
|
+
UPDATE tasks
|
|
342
|
+
SET deleted_at = CURRENT_TIMESTAMP,
|
|
343
|
+
updated_at = CURRENT_TIMESTAMP
|
|
344
|
+
WHERE task_id = $1 AND deleted_at IS NULL
|
|
345
|
+
RETURNING task_id
|
|
346
|
+
`;
|
|
347
|
+
|
|
348
|
+
const result = await this.query(query, [taskId]);
|
|
349
|
+
return result.rowCount === 1;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* 永久删除任务
|
|
354
|
+
*/
|
|
355
|
+
async delete(taskId: string): Promise<boolean> {
|
|
356
|
+
const query = 'DELETE FROM tasks WHERE task_id = $1 RETURNING task_id';
|
|
357
|
+
const result = await this.query(query, [taskId]);
|
|
358
|
+
return result.rowCount === 1;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* 获取待处理任务队列(用于 Worker 获取任务)
|
|
363
|
+
*/
|
|
364
|
+
async getPendingTasks(limit: number = 10): Promise<Task[]> {
|
|
365
|
+
const query = `
|
|
366
|
+
SELECT * FROM tasks
|
|
367
|
+
WHERE status = 'pending' AND deleted_at IS NULL
|
|
368
|
+
ORDER BY priority DESC, created_at ASC
|
|
369
|
+
LIMIT $1
|
|
370
|
+
`;
|
|
371
|
+
|
|
372
|
+
const result = await this.query<any>(query, [limit]);
|
|
373
|
+
return result.rows.map(row => this.mapToTask(row));
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* 获取 Worker 的活跃任务
|
|
378
|
+
*/
|
|
379
|
+
async getActiveTasksByWorker(workerId: string): Promise<Task[]> {
|
|
380
|
+
const query = `
|
|
381
|
+
SELECT * FROM tasks
|
|
382
|
+
WHERE worker_id = $1
|
|
383
|
+
AND status = 'running'
|
|
384
|
+
AND deleted_at IS NULL
|
|
385
|
+
ORDER BY started_at DESC
|
|
386
|
+
`;
|
|
387
|
+
|
|
388
|
+
const result = await this.query<any>(query, [workerId]);
|
|
389
|
+
return result.rows.map(row => this.mapToTask(row));
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* 映射数据库行到 Task 实体
|
|
394
|
+
*/
|
|
395
|
+
private mapToTask(row: any): Task {
|
|
396
|
+
return {
|
|
397
|
+
taskId: row.task_id,
|
|
398
|
+
id: row.task_id, // 别名
|
|
399
|
+
userId: row.user_id || undefined,
|
|
400
|
+
mode: row.mode as ExecutionMode,
|
|
401
|
+
topic: row.topic,
|
|
402
|
+
requirements: row.requirements,
|
|
403
|
+
targetAudience: '', // 默认值,向后兼容
|
|
404
|
+
hardConstraints: row.hard_constraints || {},
|
|
405
|
+
status: row.status as TaskStatus,
|
|
406
|
+
currentStep: row.current_step || undefined,
|
|
407
|
+
workerId: row.worker_id || undefined,
|
|
408
|
+
assignedWorkerId: row.worker_id || undefined, // 别名
|
|
409
|
+
textRetryCount: row.text_retry_count || 0,
|
|
410
|
+
imageRetryCount: row.image_retry_count || 0,
|
|
411
|
+
version: row.version,
|
|
412
|
+
createdAt: new Date(row.created_at),
|
|
413
|
+
startedAt: row.started_at ? new Date(row.started_at) : undefined,
|
|
414
|
+
completedAt: row.completed_at ? new Date(row.completed_at) : undefined,
|
|
415
|
+
updatedAt: new Date(row.updated_at),
|
|
416
|
+
deletedAt: row.deleted_at ? new Date(row.deleted_at) : undefined,
|
|
417
|
+
claimedAt: row.started_at ? new Date(row.started_at) : undefined, // 别名
|
|
418
|
+
errorMessage: row.error_message || undefined,
|
|
419
|
+
stateSnapshot: row.state_snapshot || undefined,
|
|
420
|
+
idempotencyKey: row.idempotency_key || undefined,
|
|
421
|
+
priority: 2, // 默认 NORMAL
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result Repository
|
|
3
|
+
*
|
|
4
|
+
* 负责任务结果的数据库操作
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Pool } from 'pg';
|
|
8
|
+
import { createLogger } from '../logging/logger.js';
|
|
9
|
+
import type { IResultRepository } from '../../domain/repositories/ResultRepository.js';
|
|
10
|
+
|
|
11
|
+
const logger = createLogger('ResultRepository');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* PostgreSQL Result Repository 实现
|
|
15
|
+
*/
|
|
16
|
+
export class PostgresResultRepository implements IResultRepository {
|
|
17
|
+
private pool: Pool;
|
|
18
|
+
|
|
19
|
+
constructor(pool: Pool) {
|
|
20
|
+
this.pool = pool;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 创建结果记录
|
|
25
|
+
*/
|
|
26
|
+
async create(params: {
|
|
27
|
+
taskId: string;
|
|
28
|
+
resultType: 'article' | 'image' | 'text';
|
|
29
|
+
content?: string;
|
|
30
|
+
filePath?: string;
|
|
31
|
+
metadata?: Record<string, any>;
|
|
32
|
+
}): Promise<void> {
|
|
33
|
+
const client = await this.pool.connect();
|
|
34
|
+
try {
|
|
35
|
+
await client.query(
|
|
36
|
+
`INSERT INTO results (task_id, result_type, content, file_path, metadata)
|
|
37
|
+
VALUES ($1, $2, $3, $4, $5)`,
|
|
38
|
+
[params.taskId, params.resultType, params.content, params.filePath, JSON.stringify(params.metadata || {})]
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
logger.info('Result created', {
|
|
42
|
+
taskId: params.taskId,
|
|
43
|
+
resultType: params.resultType,
|
|
44
|
+
});
|
|
45
|
+
} catch (error) {
|
|
46
|
+
logger.error('Failed to create result', error as Error);
|
|
47
|
+
throw error;
|
|
48
|
+
} finally {
|
|
49
|
+
client.release();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* 根据任务 ID 查询结果
|
|
55
|
+
*/
|
|
56
|
+
// @ts-ignore - Database returns string for resultType, interface expects union type
|
|
57
|
+
async findByTaskId(taskId: string): Promise<Array<{
|
|
58
|
+
id: number;
|
|
59
|
+
taskId: string;
|
|
60
|
+
resultType: string;
|
|
61
|
+
content: string | null;
|
|
62
|
+
filePath: string | null;
|
|
63
|
+
metadata: any;
|
|
64
|
+
createdAt: Date;
|
|
65
|
+
}>> {
|
|
66
|
+
const client = await this.pool.connect();
|
|
67
|
+
try {
|
|
68
|
+
const result = await client.query(
|
|
69
|
+
`SELECT id, task_id, result_type, content, file_path, metadata, created_at
|
|
70
|
+
FROM results
|
|
71
|
+
WHERE task_id = $1
|
|
72
|
+
ORDER BY result_type`,
|
|
73
|
+
[taskId]
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
return result.rows.map((row: any) => ({
|
|
77
|
+
id: row.id,
|
|
78
|
+
taskId: row.task_id,
|
|
79
|
+
resultType: row.result_type,
|
|
80
|
+
content: row.content,
|
|
81
|
+
filePath: row.file_path,
|
|
82
|
+
// jsonb 类型已被 pg driver 自动解析,无需 JSON.parse
|
|
83
|
+
metadata: row.metadata || null,
|
|
84
|
+
createdAt: row.created_at,
|
|
85
|
+
})) as any;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
logger.error('Failed to query results', error as Error);
|
|
88
|
+
throw error;
|
|
89
|
+
} finally {
|
|
90
|
+
client.release();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* 删除任务的所有结果
|
|
96
|
+
*/
|
|
97
|
+
async deleteByTaskId(taskId: string): Promise<void> {
|
|
98
|
+
const client = await this.pool.connect();
|
|
99
|
+
try {
|
|
100
|
+
await client.query(
|
|
101
|
+
`DELETE FROM results WHERE task_id = $1`,
|
|
102
|
+
[taskId]
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
logger.info('Results deleted', { taskId });
|
|
106
|
+
} catch (error) {
|
|
107
|
+
logger.error('Failed to delete results', error as Error);
|
|
108
|
+
throw error;
|
|
109
|
+
} finally {
|
|
110
|
+
client.release();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|