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.
Files changed (438) hide show
  1. package/README.md +309 -0
  2. package/dist/application/workflow/SyncExecutor.d.ts +75 -0
  3. package/dist/application/workflow/SyncExecutor.d.ts.map +1 -0
  4. package/dist/application/workflow/SyncExecutor.js +370 -0
  5. package/dist/application/workflow/SyncExecutor.js.map +1 -0
  6. package/dist/application/workflow/types.d.ts +46 -0
  7. package/dist/application/workflow/types.d.ts.map +1 -0
  8. package/dist/application/workflow/types.js +7 -0
  9. package/dist/application/workflow/types.js.map +1 -0
  10. package/dist/config/index.d.ts +173 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +288 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/domain/entities/QualityCheck.d.ts +181 -0
  15. package/dist/domain/entities/QualityCheck.d.ts.map +1 -0
  16. package/dist/domain/entities/QualityCheck.js +39 -0
  17. package/dist/domain/entities/QualityCheck.js.map +1 -0
  18. package/dist/domain/entities/Result.d.ts +103 -0
  19. package/dist/domain/entities/Result.d.ts.map +1 -0
  20. package/dist/domain/entities/Result.js +15 -0
  21. package/dist/domain/entities/Result.js.map +1 -0
  22. package/dist/domain/entities/Task.d.ts +130 -0
  23. package/dist/domain/entities/Task.d.ts.map +1 -0
  24. package/dist/domain/entities/Task.js +64 -0
  25. package/dist/domain/entities/Task.js.map +1 -0
  26. package/dist/domain/entities/TaskStep.d.ts +160 -0
  27. package/dist/domain/entities/TaskStep.d.ts.map +1 -0
  28. package/dist/domain/entities/TaskStep.js +30 -0
  29. package/dist/domain/entities/TaskStep.js.map +1 -0
  30. package/dist/domain/entities/TokenUsage.d.ts +70 -0
  31. package/dist/domain/entities/TokenUsage.d.ts.map +1 -0
  32. package/dist/domain/entities/TokenUsage.js +42 -0
  33. package/dist/domain/entities/TokenUsage.js.map +1 -0
  34. package/dist/domain/entities/index.d.ts +11 -0
  35. package/dist/domain/entities/index.d.ts.map +1 -0
  36. package/dist/domain/entities/index.js +16 -0
  37. package/dist/domain/entities/index.js.map +1 -0
  38. package/dist/domain/repositories/QualityCheckRepository.d.ts +49 -0
  39. package/dist/domain/repositories/QualityCheckRepository.d.ts.map +1 -0
  40. package/dist/domain/repositories/QualityCheckRepository.js +5 -0
  41. package/dist/domain/repositories/QualityCheckRepository.js.map +1 -0
  42. package/dist/domain/repositories/ResultRepository.d.ts +43 -0
  43. package/dist/domain/repositories/ResultRepository.d.ts.map +1 -0
  44. package/dist/domain/repositories/ResultRepository.js +5 -0
  45. package/dist/domain/repositories/ResultRepository.js.map +1 -0
  46. package/dist/domain/repositories/TaskRepository.d.ts +240 -0
  47. package/dist/domain/repositories/TaskRepository.d.ts.map +1 -0
  48. package/dist/domain/repositories/TaskRepository.js +7 -0
  49. package/dist/domain/repositories/TaskRepository.js.map +1 -0
  50. package/dist/domain/workflow/CheckpointManager.d.ts +94 -0
  51. package/dist/domain/workflow/CheckpointManager.d.ts.map +1 -0
  52. package/dist/domain/workflow/CheckpointManager.js +224 -0
  53. package/dist/domain/workflow/CheckpointManager.js.map +1 -0
  54. package/dist/domain/workflow/ContentCreatorGraph.d.ts +17 -0
  55. package/dist/domain/workflow/ContentCreatorGraph.d.ts.map +1 -0
  56. package/dist/domain/workflow/ContentCreatorGraph.js +381 -0
  57. package/dist/domain/workflow/ContentCreatorGraph.js.map +1 -0
  58. package/dist/domain/workflow/State.d.ts +172 -0
  59. package/dist/domain/workflow/State.d.ts.map +1 -0
  60. package/dist/domain/workflow/State.js +184 -0
  61. package/dist/domain/workflow/State.js.map +1 -0
  62. package/dist/domain/workflow/index.d.ts +11 -0
  63. package/dist/domain/workflow/index.d.ts.map +1 -0
  64. package/dist/domain/workflow/index.js +15 -0
  65. package/dist/domain/workflow/index.js.map +1 -0
  66. package/dist/domain/workflow/nodes/BaseNode.d.ts +134 -0
  67. package/dist/domain/workflow/nodes/BaseNode.d.ts.map +1 -0
  68. package/dist/domain/workflow/nodes/BaseNode.js +253 -0
  69. package/dist/domain/workflow/nodes/BaseNode.js.map +1 -0
  70. package/dist/domain/workflow/nodes/CheckImageNode.d.ts +43 -0
  71. package/dist/domain/workflow/nodes/CheckImageNode.d.ts.map +1 -0
  72. package/dist/domain/workflow/nodes/CheckImageNode.js +254 -0
  73. package/dist/domain/workflow/nodes/CheckImageNode.js.map +1 -0
  74. package/dist/domain/workflow/nodes/CheckTextNode.d.ts +66 -0
  75. package/dist/domain/workflow/nodes/CheckTextNode.d.ts.map +1 -0
  76. package/dist/domain/workflow/nodes/CheckTextNode.js +530 -0
  77. package/dist/domain/workflow/nodes/CheckTextNode.js.map +1 -0
  78. package/dist/domain/workflow/nodes/GenerateImageNode.d.ts +44 -0
  79. package/dist/domain/workflow/nodes/GenerateImageNode.d.ts.map +1 -0
  80. package/dist/domain/workflow/nodes/GenerateImageNode.js +272 -0
  81. package/dist/domain/workflow/nodes/GenerateImageNode.js.map +1 -0
  82. package/dist/domain/workflow/nodes/OrganizeNode.d.ts +49 -0
  83. package/dist/domain/workflow/nodes/OrganizeNode.d.ts.map +1 -0
  84. package/dist/domain/workflow/nodes/OrganizeNode.js +241 -0
  85. package/dist/domain/workflow/nodes/OrganizeNode.js.map +1 -0
  86. package/dist/domain/workflow/nodes/SearchNode.d.ts +48 -0
  87. package/dist/domain/workflow/nodes/SearchNode.d.ts.map +1 -0
  88. package/dist/domain/workflow/nodes/SearchNode.js +151 -0
  89. package/dist/domain/workflow/nodes/SearchNode.js.map +1 -0
  90. package/dist/domain/workflow/nodes/WriteNode.d.ts +68 -0
  91. package/dist/domain/workflow/nodes/WriteNode.d.ts.map +1 -0
  92. package/dist/domain/workflow/nodes/WriteNode.js +431 -0
  93. package/dist/domain/workflow/nodes/WriteNode.js.map +1 -0
  94. package/dist/domain/workflow/nodes/config/index.js +287 -0
  95. package/dist/domain/workflow/nodes/domain/entities/Task.js +68 -0
  96. package/dist/domain/workflow/nodes/domain/workflow/State.js +200 -0
  97. package/dist/domain/workflow/nodes/domain/workflow/nodes/BaseNode.js +328 -0
  98. package/dist/domain/workflow/nodes/domain/workflow/nodes/CheckTextNode.js +500 -0
  99. package/dist/domain/workflow/nodes/index.d.ts +13 -0
  100. package/dist/domain/workflow/nodes/index.d.ts.map +1 -0
  101. package/dist/domain/workflow/nodes/index.js +13 -0
  102. package/dist/domain/workflow/nodes/index.js.map +1 -0
  103. package/dist/domain/workflow/nodes/infrastructure/logging/logger.js +275 -0
  104. package/dist/domain/workflow/nodes/services/llm/EnhancedLLMService.js +559 -0
  105. package/dist/index.d.ts +24 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +34 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/infrastructure/cache/CacheService.d.ts +139 -0
  110. package/dist/infrastructure/cache/CacheService.d.ts.map +1 -0
  111. package/dist/infrastructure/cache/CacheService.js +419 -0
  112. package/dist/infrastructure/cache/CacheService.js.map +1 -0
  113. package/dist/infrastructure/cache/index.d.ts +5 -0
  114. package/dist/infrastructure/cache/index.d.ts.map +1 -0
  115. package/dist/infrastructure/cache/index.js +6 -0
  116. package/dist/infrastructure/cache/index.js.map +1 -0
  117. package/dist/infrastructure/database/BaseRepository.d.ts +98 -0
  118. package/dist/infrastructure/database/BaseRepository.d.ts.map +1 -0
  119. package/dist/infrastructure/database/BaseRepository.js +178 -0
  120. package/dist/infrastructure/database/BaseRepository.js.map +1 -0
  121. package/dist/infrastructure/database/MemoryTaskRepository.d.ts +77 -0
  122. package/dist/infrastructure/database/MemoryTaskRepository.d.ts.map +1 -0
  123. package/dist/infrastructure/database/MemoryTaskRepository.js +309 -0
  124. package/dist/infrastructure/database/MemoryTaskRepository.js.map +1 -0
  125. package/dist/infrastructure/database/PostgresQualityCheckRepository.d.ts +36 -0
  126. package/dist/infrastructure/database/PostgresQualityCheckRepository.d.ts.map +1 -0
  127. package/dist/infrastructure/database/PostgresQualityCheckRepository.js +89 -0
  128. package/dist/infrastructure/database/PostgresQualityCheckRepository.js.map +1 -0
  129. package/dist/infrastructure/database/PostgresTaskRepository.d.ts +94 -0
  130. package/dist/infrastructure/database/PostgresTaskRepository.d.ts.map +1 -0
  131. package/dist/infrastructure/database/PostgresTaskRepository.js +364 -0
  132. package/dist/infrastructure/database/PostgresTaskRepository.js.map +1 -0
  133. package/dist/infrastructure/database/ResultRepository.d.ts +41 -0
  134. package/dist/infrastructure/database/ResultRepository.d.ts.map +1 -0
  135. package/dist/infrastructure/database/ResultRepository.js +86 -0
  136. package/dist/infrastructure/database/ResultRepository.js.map +1 -0
  137. package/dist/infrastructure/database/SQLiteTaskRepository.d.ts +101 -0
  138. package/dist/infrastructure/database/SQLiteTaskRepository.d.ts.map +1 -0
  139. package/dist/infrastructure/database/SQLiteTaskRepository.js +548 -0
  140. package/dist/infrastructure/database/SQLiteTaskRepository.js.map +1 -0
  141. package/dist/infrastructure/database/index.d.ts +32 -0
  142. package/dist/infrastructure/database/index.d.ts.map +1 -0
  143. package/dist/infrastructure/database/index.js +72 -0
  144. package/dist/infrastructure/database/index.js.map +1 -0
  145. package/dist/infrastructure/logging/logger.d.ts +69 -0
  146. package/dist/infrastructure/logging/logger.d.ts.map +1 -0
  147. package/dist/infrastructure/logging/logger.js +169 -0
  148. package/dist/infrastructure/logging/logger.js.map +1 -0
  149. package/dist/infrastructure/monitoring/LoggingService.d.ts +109 -0
  150. package/dist/infrastructure/monitoring/LoggingService.d.ts.map +1 -0
  151. package/dist/infrastructure/monitoring/LoggingService.js +198 -0
  152. package/dist/infrastructure/monitoring/LoggingService.js.map +1 -0
  153. package/dist/infrastructure/monitoring/MetricsService.d.ts +112 -0
  154. package/dist/infrastructure/monitoring/MetricsService.d.ts.map +1 -0
  155. package/dist/infrastructure/monitoring/MetricsService.js +362 -0
  156. package/dist/infrastructure/monitoring/MetricsService.js.map +1 -0
  157. package/dist/infrastructure/monitoring/SentryService.d.ts +108 -0
  158. package/dist/infrastructure/monitoring/SentryService.d.ts.map +1 -0
  159. package/dist/infrastructure/monitoring/SentryService.js +282 -0
  160. package/dist/infrastructure/monitoring/SentryService.js.map +1 -0
  161. package/dist/infrastructure/monitoring/index.d.ts +7 -0
  162. package/dist/infrastructure/monitoring/index.d.ts.map +1 -0
  163. package/dist/infrastructure/monitoring/index.js +10 -0
  164. package/dist/infrastructure/monitoring/index.js.map +1 -0
  165. package/dist/infrastructure/queue/TaskQueue.d.ts +110 -0
  166. package/dist/infrastructure/queue/TaskQueue.d.ts.map +1 -0
  167. package/dist/infrastructure/queue/TaskQueue.js +363 -0
  168. package/dist/infrastructure/queue/TaskQueue.js.map +1 -0
  169. package/dist/infrastructure/queue/index.d.ts +5 -0
  170. package/dist/infrastructure/queue/index.d.ts.map +1 -0
  171. package/dist/infrastructure/queue/index.js +5 -0
  172. package/dist/infrastructure/queue/index.js.map +1 -0
  173. package/dist/infrastructure/redis/connection.d.ts +61 -0
  174. package/dist/infrastructure/redis/connection.d.ts.map +1 -0
  175. package/dist/infrastructure/redis/connection.js +184 -0
  176. package/dist/infrastructure/redis/connection.js.map +1 -0
  177. package/dist/infrastructure/redis/index.d.ts +5 -0
  178. package/dist/infrastructure/redis/index.d.ts.map +1 -0
  179. package/dist/infrastructure/redis/index.js +5 -0
  180. package/dist/infrastructure/redis/index.js.map +1 -0
  181. package/dist/infrastructure/security/ApiKeyService.d.ts +103 -0
  182. package/dist/infrastructure/security/ApiKeyService.d.ts.map +1 -0
  183. package/dist/infrastructure/security/ApiKeyService.js +250 -0
  184. package/dist/infrastructure/security/ApiKeyService.js.map +1 -0
  185. package/dist/infrastructure/security/QuotaService.d.ts +87 -0
  186. package/dist/infrastructure/security/QuotaService.d.ts.map +1 -0
  187. package/dist/infrastructure/security/QuotaService.js +303 -0
  188. package/dist/infrastructure/security/QuotaService.js.map +1 -0
  189. package/dist/infrastructure/security/RateLimiter.d.ts +104 -0
  190. package/dist/infrastructure/security/RateLimiter.d.ts.map +1 -0
  191. package/dist/infrastructure/security/RateLimiter.js +331 -0
  192. package/dist/infrastructure/security/RateLimiter.js.map +1 -0
  193. package/dist/infrastructure/security/index.d.ts +7 -0
  194. package/dist/infrastructure/security/index.d.ts.map +1 -0
  195. package/dist/infrastructure/security/index.js +10 -0
  196. package/dist/infrastructure/security/index.js.map +1 -0
  197. package/dist/monitoring/index.d.ts +5 -0
  198. package/dist/monitoring/index.d.ts.map +1 -0
  199. package/dist/monitoring/index.js +5 -0
  200. package/dist/monitoring/index.js.map +1 -0
  201. package/dist/monitoring/server.d.ts +14 -0
  202. package/dist/monitoring/server.d.ts.map +1 -0
  203. package/dist/monitoring/server.js +99 -0
  204. package/dist/monitoring/server.js.map +1 -0
  205. package/dist/presentation/cli/commands/cancel.d.ts +8 -0
  206. package/dist/presentation/cli/commands/cancel.d.ts.map +1 -0
  207. package/dist/presentation/cli/commands/cancel.js +57 -0
  208. package/dist/presentation/cli/commands/cancel.js.map +1 -0
  209. package/dist/presentation/cli/commands/create.d.ts +8 -0
  210. package/dist/presentation/cli/commands/create.d.ts.map +1 -0
  211. package/dist/presentation/cli/commands/create.js +368 -0
  212. package/dist/presentation/cli/commands/create.js.map +1 -0
  213. package/dist/presentation/cli/commands/result.d.ts +8 -0
  214. package/dist/presentation/cli/commands/result.d.ts.map +1 -0
  215. package/dist/presentation/cli/commands/result.js +121 -0
  216. package/dist/presentation/cli/commands/result.js.map +1 -0
  217. package/dist/presentation/cli/commands/status.d.ts +8 -0
  218. package/dist/presentation/cli/commands/status.d.ts.map +1 -0
  219. package/dist/presentation/cli/commands/status.js +92 -0
  220. package/dist/presentation/cli/commands/status.js.map +1 -0
  221. package/dist/presentation/cli/index.d.ts +8 -0
  222. package/dist/presentation/cli/index.d.ts.map +1 -0
  223. package/dist/presentation/cli/index.js +32 -0
  224. package/dist/presentation/cli/index.js.map +1 -0
  225. package/dist/presentation/cli/utils/cleanup.d.ts +14 -0
  226. package/dist/presentation/cli/utils/cleanup.d.ts.map +1 -0
  227. package/dist/presentation/cli/utils/cleanup.js +62 -0
  228. package/dist/presentation/cli/utils/cleanup.js.map +1 -0
  229. package/dist/presentation/cli/utils/formatter.d.ts +28 -0
  230. package/dist/presentation/cli/utils/formatter.d.ts.map +1 -0
  231. package/dist/presentation/cli/utils/formatter.js +68 -0
  232. package/dist/presentation/cli/utils/formatter.js.map +1 -0
  233. package/dist/presentation/cli.d.ts +7 -0
  234. package/dist/presentation/cli.d.ts.map +1 -0
  235. package/dist/presentation/cli.js +8 -0
  236. package/dist/presentation/cli.js.map +1 -0
  237. package/dist/presentation/monitor-cli.d.ts +8 -0
  238. package/dist/presentation/monitor-cli.d.ts.map +1 -0
  239. package/dist/presentation/monitor-cli.js +44 -0
  240. package/dist/presentation/monitor-cli.js.map +1 -0
  241. package/dist/presentation/worker-cli.d.ts +8 -0
  242. package/dist/presentation/worker-cli.d.ts.map +1 -0
  243. package/dist/presentation/worker-cli.js +51 -0
  244. package/dist/presentation/worker-cli.js.map +1 -0
  245. package/dist/schedulers/TaskScheduler.d.ts +99 -0
  246. package/dist/schedulers/TaskScheduler.d.ts.map +1 -0
  247. package/dist/schedulers/TaskScheduler.js +233 -0
  248. package/dist/schedulers/TaskScheduler.js.map +1 -0
  249. package/dist/schedulers/index.d.ts +5 -0
  250. package/dist/schedulers/index.d.ts.map +1 -0
  251. package/dist/schedulers/index.js +5 -0
  252. package/dist/schedulers/index.js.map +1 -0
  253. package/dist/services/image/ImageService.d.ts +68 -0
  254. package/dist/services/image/ImageService.d.ts.map +1 -0
  255. package/dist/services/image/ImageService.js +166 -0
  256. package/dist/services/image/ImageService.js.map +1 -0
  257. package/dist/services/index.d.ts +8 -0
  258. package/dist/services/index.d.ts.map +1 -0
  259. package/dist/services/index.js +12 -0
  260. package/dist/services/index.js.map +1 -0
  261. package/dist/services/llm/EnhancedLLMService.d.ts +148 -0
  262. package/dist/services/llm/EnhancedLLMService.d.ts.map +1 -0
  263. package/dist/services/llm/EnhancedLLMService.js +425 -0
  264. package/dist/services/llm/EnhancedLLMService.js.map +1 -0
  265. package/dist/services/llm/LLMService.d.ts +103 -0
  266. package/dist/services/llm/LLMService.d.ts.map +1 -0
  267. package/dist/services/llm/LLMService.js +212 -0
  268. package/dist/services/llm/LLMService.js.map +1 -0
  269. package/dist/services/quality/HardRuleChecker.d.ts +143 -0
  270. package/dist/services/quality/HardRuleChecker.d.ts.map +1 -0
  271. package/dist/services/quality/HardRuleChecker.js +353 -0
  272. package/dist/services/quality/HardRuleChecker.js.map +1 -0
  273. package/dist/services/quality/LLMEvaluator.d.ts +105 -0
  274. package/dist/services/quality/LLMEvaluator.d.ts.map +1 -0
  275. package/dist/services/quality/LLMEvaluator.js +312 -0
  276. package/dist/services/quality/LLMEvaluator.js.map +1 -0
  277. package/dist/services/quality/QualityCheckService.d.ts +112 -0
  278. package/dist/services/quality/QualityCheckService.d.ts.map +1 -0
  279. package/dist/services/quality/QualityCheckService.js +342 -0
  280. package/dist/services/quality/QualityCheckService.js.map +1 -0
  281. package/dist/services/quality/QualityService.d.ts +75 -0
  282. package/dist/services/quality/QualityService.d.ts.map +1 -0
  283. package/dist/services/quality/QualityService.js +360 -0
  284. package/dist/services/quality/QualityService.js.map +1 -0
  285. package/dist/services/quality/index.d.ts +7 -0
  286. package/dist/services/quality/index.d.ts.map +1 -0
  287. package/dist/services/quality/index.js +10 -0
  288. package/dist/services/quality/index.js.map +1 -0
  289. package/dist/services/search/SearchService.d.ts +79 -0
  290. package/dist/services/search/SearchService.d.ts.map +1 -0
  291. package/dist/services/search/SearchService.js +193 -0
  292. package/dist/services/search/SearchService.js.map +1 -0
  293. package/dist/workers/TaskWorker.d.ts +61 -0
  294. package/dist/workers/TaskWorker.d.ts.map +1 -0
  295. package/dist/workers/TaskWorker.js +256 -0
  296. package/dist/workers/TaskWorker.js.map +1 -0
  297. package/dist/workers/index.d.ts +5 -0
  298. package/dist/workers/index.d.ts.map +1 -0
  299. package/dist/workers/index.js +5 -0
  300. package/dist/workers/index.js.map +1 -0
  301. package/docs/DOCUMENTATION-ANALYSIS.md +190 -0
  302. package/docs/README.md +145 -0
  303. package/docs/SOURCE-CODE-ANALYSIS.md +1107 -0
  304. package/docs/architecture-complete.md +5524 -0
  305. package/docs/archive/implementation/implementation-analysis/README.md +244 -0
  306. package/docs/archive/implementation/implementation-analysis/implementation-analysis-context.md +483 -0
  307. package/docs/archive/implementation/implementation-analysis/implementation-analysis-plan.md +1242 -0
  308. package/docs/archive/implementation/implementation-analysis/implementation-analysis-tasks.md +777 -0
  309. package/docs/archive/phases/phase-1/phase-1-completion-summary.md +284 -0
  310. package/docs/archive/phases/phase-1/phase-1-implementation-guide.md +1380 -0
  311. package/docs/archive/phases/phase-2/phase-2a/phase-2a-completion-summary.md +443 -0
  312. package/docs/archive/phases/phase-2/phase-2b/phase-2b-completion-report.md +430 -0
  313. package/docs/archive/phases/phase-2/phase-2b/phase-2b-completion-summary.md +592 -0
  314. package/docs/archive/phases/phase-2/phase-2b/phase-2b-final-summary.md +371 -0
  315. package/docs/archive/phases/phase-2/phase-2b/phase-2b-preparation-complete.md +343 -0
  316. package/docs/archive/phases/phase-2/phase-2b/phase-2b-preparation.md +945 -0
  317. package/docs/archive/phases/phase-2/phase-2b/phase-2b-progress-update.md +366 -0
  318. package/docs/archive/phases/phase-3/phase-3-completion-summary.md +354 -0
  319. package/docs/archive/phases/phase-3/phase-3-development-plan.md +878 -0
  320. package/docs/archive/phases/phase-3/phase-3-quick-start.md +324 -0
  321. package/docs/archive/phases/phase-4/phase-4-completion-summary.md +708 -0
  322. package/docs/archive/phases/phase-4/phase-4-development-plan.md +740 -0
  323. package/docs/archive/phases/phase-4/phase-4-quick-start.md +632 -0
  324. package/docs/archive/phases/phase-4/phase-4-session-3-security-testing.md +484 -0
  325. package/docs/archive/phases/phase-4/phase-4-session-4-unit-tests.md +550 -0
  326. package/docs/archive/phases/phase-4/phase-4-session-5-security-tests.md +564 -0
  327. package/docs/archive/phases/phase-4/phase-4-session-6-cache-integration.md +456 -0
  328. package/docs/archive/phases/phase-4/phase-4-session-7-test-fixes.md +348 -0
  329. package/docs/archive/phases/phase-4/phase-4-session-8-taskqueue-fixes.md +323 -0
  330. package/docs/archive/phases/phase-4/phase-4-session-summary-continued.md +373 -0
  331. package/docs/archive/phases/phase-4/phase-4-session-summary.md +595 -0
  332. package/docs/archive/reports/progress-reports/PHASE_0_PROGRESS.md +242 -0
  333. package/docs/archive/reports/progress-reports/PHASE_0_SUMMARY.md +262 -0
  334. package/docs/archive/reports/progress-reports/PHASE_1_2_ISSUES.md +399 -0
  335. package/docs/archive/reports/progress-reports/PHASE_1_PROGRESS.md +388 -0
  336. package/docs/archive/reports/progress-reports/PHASE_3_PREPARATION.md +574 -0
  337. package/docs/archive/reports/progress-reports/current-progress-update.md +294 -0
  338. package/docs/archive/reports/progress-reports/final-summary.md +215 -0
  339. package/docs/archive/reports/progress-reports/implementation-summary.md +287 -0
  340. package/docs/archive/reports/progress-reports/project-progress-report.md +440 -0
  341. package/docs/archive/reports/progress-reports/project-progress.md +386 -0
  342. package/docs/archive/reports/test-reports/TEST-COVERAGE-REPORT.md +441 -0
  343. package/docs/archive/reports/test-reports/e2e-test-report.md +293 -0
  344. package/docs/archive/reports/test-reports/final-test-report.md +367 -0
  345. package/docs/archive/reports/test-reports/real-env-test-report.md +391 -0
  346. package/docs/archive/reports/test-reports/test-completion-summary.md +356 -0
  347. package/docs/archive/reports/test-reports/test-report.md +371 -0
  348. package/docs/archive/sessions/session-2-summary.md +429 -0
  349. package/docs/archive/sessions/session-3-summary.md +395 -0
  350. package/docs/archive/sessions/session-summary.md +370 -0
  351. package/docs/config-system-update.md +239 -0
  352. package/docs/database-refactoring-PLAN.md +199 -0
  353. package/docs/database-refactoring-SUMMARY.md +384 -0
  354. package/docs/quality-check-architecture.md +1030 -0
  355. package/docs/quick-start.md +388 -0
  356. package/docs/references/bullmq-quick-reference.md +525 -0
  357. package/docs/references/monitoring-optimization-guide.md +871 -0
  358. package/docs/references/performance-optimization-guide.md +933 -0
  359. package/docs/storage-guide.md +612 -0
  360. package/docs/test-implementation-PLAN.md +223 -0
  361. package/docs/test-implementation-SUMMARY.md +194 -0
  362. package/docs/user-guide.md +719 -0
  363. package/docs/workflow-architecture.md +549 -0
  364. package/package.json +126 -0
  365. package/src/application/workflow/SyncExecutor.ts +444 -0
  366. package/src/application/workflow/types.ts +57 -0
  367. package/src/config/index.ts +352 -0
  368. package/src/domain/entities/QualityCheck.ts +202 -0
  369. package/src/domain/entities/Result.ts +130 -0
  370. package/src/domain/entities/Task.ts +178 -0
  371. package/src/domain/entities/TaskStep.ts +188 -0
  372. package/src/domain/entities/TokenUsage.ts +119 -0
  373. package/src/domain/entities/index.ts +20 -0
  374. package/src/domain/repositories/QualityCheckRepository.ts +52 -0
  375. package/src/domain/repositories/ResultRepository.ts +47 -0
  376. package/src/domain/repositories/TaskRepository.ts +271 -0
  377. package/src/domain/workflow/CheckpointManager.ts +283 -0
  378. package/src/domain/workflow/ContentCreatorGraph.ts +446 -0
  379. package/src/domain/workflow/State.ts +321 -0
  380. package/src/domain/workflow/index.ts +18 -0
  381. package/src/domain/workflow/nodes/BaseNode.ts +325 -0
  382. package/src/domain/workflow/nodes/CheckImageNode.ts +325 -0
  383. package/src/domain/workflow/nodes/CheckTextNode.ts +709 -0
  384. package/src/domain/workflow/nodes/GenerateImageNode.ts +342 -0
  385. package/src/domain/workflow/nodes/OrganizeNode.ts +304 -0
  386. package/src/domain/workflow/nodes/SearchNode.ts +192 -0
  387. package/src/domain/workflow/nodes/WriteNode.ts +505 -0
  388. package/src/domain/workflow/nodes/index.ts +13 -0
  389. package/src/index.ts +43 -0
  390. package/src/infrastructure/cache/CacheService.ts +483 -0
  391. package/src/infrastructure/cache/index.ts +6 -0
  392. package/src/infrastructure/database/BaseRepository.ts +214 -0
  393. package/src/infrastructure/database/MemoryTaskRepository.ts +377 -0
  394. package/src/infrastructure/database/PostgresQualityCheckRepository.ts +115 -0
  395. package/src/infrastructure/database/PostgresTaskRepository.ts +424 -0
  396. package/src/infrastructure/database/ResultRepository.ts +113 -0
  397. package/src/infrastructure/database/SQLiteTaskRepository.ts +651 -0
  398. package/src/infrastructure/database/index.ts +83 -0
  399. package/src/infrastructure/logging/logger.ts +231 -0
  400. package/src/infrastructure/monitoring/LoggingService.ts +292 -0
  401. package/src/infrastructure/monitoring/MetricsService.ts +468 -0
  402. package/src/infrastructure/monitoring/SentryService.ts +345 -0
  403. package/src/infrastructure/monitoring/index.ts +12 -0
  404. package/src/infrastructure/queue/TaskQueue.ts +429 -0
  405. package/src/infrastructure/queue/index.ts +5 -0
  406. package/src/infrastructure/redis/connection.ts +215 -0
  407. package/src/infrastructure/redis/index.ts +5 -0
  408. package/src/infrastructure/security/ApiKeyService.ts +340 -0
  409. package/src/infrastructure/security/QuotaService.ts +411 -0
  410. package/src/infrastructure/security/RateLimiter.ts +417 -0
  411. package/src/infrastructure/security/index.ts +12 -0
  412. package/src/monitoring/index.ts +5 -0
  413. package/src/monitoring/server.ts +109 -0
  414. package/src/presentation/cli/commands/cancel.ts +64 -0
  415. package/src/presentation/cli/commands/create.ts +400 -0
  416. package/src/presentation/cli/commands/result.ts +136 -0
  417. package/src/presentation/cli/commands/status.ts +102 -0
  418. package/src/presentation/cli/index.ts +39 -0
  419. package/src/presentation/cli/utils/cleanup.ts +65 -0
  420. package/src/presentation/cli/utils/formatter.ts +74 -0
  421. package/src/presentation/cli.ts +8 -0
  422. package/src/presentation/monitor-cli.ts +52 -0
  423. package/src/presentation/worker-cli.ts +62 -0
  424. package/src/schedulers/TaskScheduler.ts +314 -0
  425. package/src/schedulers/index.ts +11 -0
  426. package/src/services/image/ImageService.ts +221 -0
  427. package/src/services/index.ts +15 -0
  428. package/src/services/llm/EnhancedLLMService.ts +596 -0
  429. package/src/services/llm/LLMService.ts +310 -0
  430. package/src/services/quality/HardRuleChecker.ts +509 -0
  431. package/src/services/quality/LLMEvaluator.ts +400 -0
  432. package/src/services/quality/QualityCheckService.ts +473 -0
  433. package/src/services/quality/QualityService.ts +445 -0
  434. package/src/services/quality/index.ts +12 -0
  435. package/src/services/search/SearchService.ts +266 -0
  436. package/src/types/global.d.ts +17 -0
  437. package/src/workers/TaskWorker.ts +320 -0
  438. 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
+ }