@reftrixmcp/mcp-server 0.1.7

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 (1614) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +1099 -0
  3. package/dist/api/health.d.ts +122 -0
  4. package/dist/api/health.d.ts.map +1 -0
  5. package/dist/api/health.js +267 -0
  6. package/dist/api/health.js.map +1 -0
  7. package/dist/config/index.d.ts +9 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +27 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/config/redis.d.ts +99 -0
  12. package/dist/config/redis.d.ts.map +1 -0
  13. package/dist/config/redis.js +234 -0
  14. package/dist/config/redis.js.map +1 -0
  15. package/dist/index.d.ts +18 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +247 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lib/index.d.ts +6 -0
  20. package/dist/lib/index.d.ts.map +1 -0
  21. package/dist/lib/index.js +14 -0
  22. package/dist/lib/index.js.map +1 -0
  23. package/dist/lib/project-context.d.ts +51 -0
  24. package/dist/lib/project-context.d.ts.map +1 -0
  25. package/dist/lib/project-context.js +109 -0
  26. package/dist/lib/project-context.js.map +1 -0
  27. package/dist/middleware/args-type-coercion.d.ts +59 -0
  28. package/dist/middleware/args-type-coercion.d.ts.map +1 -0
  29. package/dist/middleware/args-type-coercion.js +187 -0
  30. package/dist/middleware/args-type-coercion.js.map +1 -0
  31. package/dist/middleware/auth.d.ts +122 -0
  32. package/dist/middleware/auth.d.ts.map +1 -0
  33. package/dist/middleware/auth.js +430 -0
  34. package/dist/middleware/auth.js.map +1 -0
  35. package/dist/middleware/index.d.ts +10 -0
  36. package/dist/middleware/index.d.ts.map +1 -0
  37. package/dist/middleware/index.js +38 -0
  38. package/dist/middleware/index.js.map +1 -0
  39. package/dist/middleware/light-response-controller.d.ts +206 -0
  40. package/dist/middleware/light-response-controller.d.ts.map +1 -0
  41. package/dist/middleware/light-response-controller.js +555 -0
  42. package/dist/middleware/light-response-controller.js.map +1 -0
  43. package/dist/middleware/response-size-warning.d.ts +97 -0
  44. package/dist/middleware/response-size-warning.d.ts.map +1 -0
  45. package/dist/middleware/response-size-warning.js +137 -0
  46. package/dist/middleware/response-size-warning.js.map +1 -0
  47. package/dist/queues/batch-quality-queue.d.ts +225 -0
  48. package/dist/queues/batch-quality-queue.d.ts.map +1 -0
  49. package/dist/queues/batch-quality-queue.js +375 -0
  50. package/dist/queues/batch-quality-queue.js.map +1 -0
  51. package/dist/queues/index.d.ts +10 -0
  52. package/dist/queues/index.d.ts.map +1 -0
  53. package/dist/queues/index.js +28 -0
  54. package/dist/queues/index.js.map +1 -0
  55. package/dist/queues/page-analyze-queue.d.ts +287 -0
  56. package/dist/queues/page-analyze-queue.d.ts.map +1 -0
  57. package/dist/queues/page-analyze-queue.js +219 -0
  58. package/dist/queues/page-analyze-queue.js.map +1 -0
  59. package/dist/router.d.ts +144 -0
  60. package/dist/router.d.ts.map +1 -0
  61. package/dist/router.js +261 -0
  62. package/dist/router.js.map +1 -0
  63. package/dist/schemas/creative/index.d.ts +8 -0
  64. package/dist/schemas/creative/index.d.ts.map +1 -0
  65. package/dist/schemas/creative/index.js +23 -0
  66. package/dist/schemas/creative/index.js.map +1 -0
  67. package/dist/schemas/creative/palette.schema.d.ts +741 -0
  68. package/dist/schemas/creative/palette.schema.d.ts.map +1 -0
  69. package/dist/schemas/creative/palette.schema.js +154 -0
  70. package/dist/schemas/creative/palette.schema.js.map +1 -0
  71. package/dist/schemas/mood-brandtone-filters.d.ts +740 -0
  72. package/dist/schemas/mood-brandtone-filters.d.ts.map +1 -0
  73. package/dist/schemas/mood-brandtone-filters.js +265 -0
  74. package/dist/schemas/mood-brandtone-filters.js.map +1 -0
  75. package/dist/scripts/backfill-embeddings.d.ts +3 -0
  76. package/dist/scripts/backfill-embeddings.d.ts.map +1 -0
  77. package/dist/scripts/backfill-embeddings.js +385 -0
  78. package/dist/scripts/backfill-embeddings.js.map +1 -0
  79. package/dist/scripts/check-embedding-coverage.d.ts +3 -0
  80. package/dist/scripts/check-embedding-coverage.d.ts.map +1 -0
  81. package/dist/scripts/check-embedding-coverage.js +103 -0
  82. package/dist/scripts/check-embedding-coverage.js.map +1 -0
  83. package/dist/scripts/start-workers.d.ts +3 -0
  84. package/dist/scripts/start-workers.d.ts.map +1 -0
  85. package/dist/scripts/start-workers.js +447 -0
  86. package/dist/scripts/start-workers.js.map +1 -0
  87. package/dist/server.d.ts +49 -0
  88. package/dist/server.d.ts.map +1 -0
  89. package/dist/server.js +237 -0
  90. package/dist/server.js.map +1 -0
  91. package/dist/services/background/background-design-db.service.d.ts +65 -0
  92. package/dist/services/background/background-design-db.service.d.ts.map +1 -0
  93. package/dist/services/background/background-design-db.service.js +138 -0
  94. package/dist/services/background/background-design-db.service.js.map +1 -0
  95. package/dist/services/background/background-design-detector.service.d.ts +125 -0
  96. package/dist/services/background/background-design-detector.service.d.ts.map +1 -0
  97. package/dist/services/background/background-design-detector.service.js +1106 -0
  98. package/dist/services/background/background-design-detector.service.js.map +1 -0
  99. package/dist/services/background/background-design-embedding.service.d.ts +188 -0
  100. package/dist/services/background/background-design-embedding.service.d.ts.map +1 -0
  101. package/dist/services/background/background-design-embedding.service.js +386 -0
  102. package/dist/services/background/background-design-embedding.service.js.map +1 -0
  103. package/dist/services/background-search.service.d.ts +43 -0
  104. package/dist/services/background-search.service.d.ts.map +1 -0
  105. package/dist/services/background-search.service.js +235 -0
  106. package/dist/services/background-search.service.js.map +1 -0
  107. package/dist/services/backup-service.d.ts +135 -0
  108. package/dist/services/backup-service.d.ts.map +1 -0
  109. package/dist/services/backup-service.js +357 -0
  110. package/dist/services/backup-service.js.map +1 -0
  111. package/dist/services/brief/brief-parser-service.d.ts +47 -0
  112. package/dist/services/brief/brief-parser-service.d.ts.map +1 -0
  113. package/dist/services/brief/brief-parser-service.js +380 -0
  114. package/dist/services/brief/brief-parser-service.js.map +1 -0
  115. package/dist/services/brief/schemas/brief-parser-schemas.d.ts +278 -0
  116. package/dist/services/brief/schemas/brief-parser-schemas.d.ts.map +1 -0
  117. package/dist/services/brief/schemas/brief-parser-schemas.js +116 -0
  118. package/dist/services/brief/schemas/brief-parser-schemas.js.map +1 -0
  119. package/dist/services/browser-process-manager.d.ts +116 -0
  120. package/dist/services/browser-process-manager.d.ts.map +1 -0
  121. package/dist/services/browser-process-manager.js +259 -0
  122. package/dist/services/browser-process-manager.js.map +1 -0
  123. package/dist/services/cache.d.ts +119 -0
  124. package/dist/services/cache.d.ts.map +1 -0
  125. package/dist/services/cache.js +233 -0
  126. package/dist/services/cache.js.map +1 -0
  127. package/dist/services/checksum-service.d.ts +122 -0
  128. package/dist/services/checksum-service.d.ts.map +1 -0
  129. package/dist/services/checksum-service.js +270 -0
  130. package/dist/services/checksum-service.js.map +1 -0
  131. package/dist/services/css-analysis-cache.service.d.ts +248 -0
  132. package/dist/services/css-analysis-cache.service.d.ts.map +1 -0
  133. package/dist/services/css-analysis-cache.service.js +398 -0
  134. package/dist/services/css-analysis-cache.service.js.map +1 -0
  135. package/dist/services/database-dumper.service.d.ts +181 -0
  136. package/dist/services/database-dumper.service.d.ts.map +1 -0
  137. package/dist/services/database-dumper.service.js +550 -0
  138. package/dist/services/database-dumper.service.js.map +1 -0
  139. package/dist/services/embedding-backfill.service.d.ts +53 -0
  140. package/dist/services/embedding-backfill.service.d.ts.map +1 -0
  141. package/dist/services/embedding-backfill.service.js +672 -0
  142. package/dist/services/embedding-backfill.service.js.map +1 -0
  143. package/dist/services/embedding-validation.service.d.ts +64 -0
  144. package/dist/services/embedding-validation.service.d.ts.map +1 -0
  145. package/dist/services/embedding-validation.service.js +141 -0
  146. package/dist/services/embedding-validation.service.js.map +1 -0
  147. package/dist/services/encryption-service.d.ts +171 -0
  148. package/dist/services/encryption-service.d.ts.map +1 -0
  149. package/dist/services/encryption-service.js +343 -0
  150. package/dist/services/encryption-service.js.map +1 -0
  151. package/dist/services/external-css-fetcher.d.ts +185 -0
  152. package/dist/services/external-css-fetcher.d.ts.map +1 -0
  153. package/dist/services/external-css-fetcher.js +667 -0
  154. package/dist/services/external-css-fetcher.js.map +1 -0
  155. package/dist/services/gpu-resource-manager.d.ts +180 -0
  156. package/dist/services/gpu-resource-manager.d.ts.map +1 -0
  157. package/dist/services/gpu-resource-manager.js +485 -0
  158. package/dist/services/gpu-resource-manager.js.map +1 -0
  159. package/dist/services/index.d.ts +15 -0
  160. package/dist/services/index.d.ts.map +1 -0
  161. package/dist/services/index.js +73 -0
  162. package/dist/services/index.js.map +1 -0
  163. package/dist/services/layout/component-splitter.d.ts +63 -0
  164. package/dist/services/layout/component-splitter.d.ts.map +1 -0
  165. package/dist/services/layout/component-splitter.js +508 -0
  166. package/dist/services/layout/component-splitter.js.map +1 -0
  167. package/dist/services/layout/html-to-jsx-converter.d.ts +40 -0
  168. package/dist/services/layout/html-to-jsx-converter.d.ts.map +1 -0
  169. package/dist/services/layout/html-to-jsx-converter.js +484 -0
  170. package/dist/services/layout/html-to-jsx-converter.js.map +1 -0
  171. package/dist/services/layout/semantic-html-converter.d.ts +67 -0
  172. package/dist/services/layout/semantic-html-converter.d.ts.map +1 -0
  173. package/dist/services/layout/semantic-html-converter.js +247 -0
  174. package/dist/services/layout/semantic-html-converter.js.map +1 -0
  175. package/dist/services/layout/style-to-tailwind-mapper.d.ts +82 -0
  176. package/dist/services/layout/style-to-tailwind-mapper.d.ts.map +1 -0
  177. package/dist/services/layout/style-to-tailwind-mapper.js +1334 -0
  178. package/dist/services/layout/style-to-tailwind-mapper.js.map +1 -0
  179. package/dist/services/layout-embedding.service.d.ts +415 -0
  180. package/dist/services/layout-embedding.service.d.ts.map +1 -0
  181. package/dist/services/layout-embedding.service.js +1147 -0
  182. package/dist/services/layout-embedding.service.js.map +1 -0
  183. package/dist/services/layout-generate-code-service-export.d.ts +38 -0
  184. package/dist/services/layout-generate-code-service-export.d.ts.map +1 -0
  185. package/dist/services/layout-generate-code-service-export.js +77 -0
  186. package/dist/services/layout-generate-code-service-export.js.map +1 -0
  187. package/dist/services/layout-search-service-export.d.ts +31 -0
  188. package/dist/services/layout-search-service-export.d.ts.map +1 -0
  189. package/dist/services/layout-search-service-export.js +43 -0
  190. package/dist/services/layout-search-service-export.js.map +1 -0
  191. package/dist/services/layout-search.service.d.ts +111 -0
  192. package/dist/services/layout-search.service.d.ts.map +1 -0
  193. package/dist/services/layout-search.service.js +716 -0
  194. package/dist/services/layout-search.service.js.map +1 -0
  195. package/dist/services/layout-to-code.service.d.ts +85 -0
  196. package/dist/services/layout-to-code.service.d.ts.map +1 -0
  197. package/dist/services/layout-to-code.service.js +1368 -0
  198. package/dist/services/layout-to-code.service.js.map +1 -0
  199. package/dist/services/metrics-collector.d.ts +189 -0
  200. package/dist/services/metrics-collector.d.ts.map +1 -0
  201. package/dist/services/metrics-collector.js +344 -0
  202. package/dist/services/metrics-collector.js.map +1 -0
  203. package/dist/services/ml/mood-brandtone-embedding.service.d.ts +253 -0
  204. package/dist/services/ml/mood-brandtone-embedding.service.d.ts.map +1 -0
  205. package/dist/services/ml/mood-brandtone-embedding.service.js +678 -0
  206. package/dist/services/ml/mood-brandtone-embedding.service.js.map +1 -0
  207. package/dist/services/motion/analyzers/color-change.analyzer.d.ts +274 -0
  208. package/dist/services/motion/analyzers/color-change.analyzer.d.ts.map +1 -0
  209. package/dist/services/motion/analyzers/color-change.analyzer.js +644 -0
  210. package/dist/services/motion/analyzers/color-change.analyzer.js.map +1 -0
  211. package/dist/services/motion/analyzers/frame-diff.analyzer.d.ts +109 -0
  212. package/dist/services/motion/analyzers/frame-diff.analyzer.d.ts.map +1 -0
  213. package/dist/services/motion/analyzers/frame-diff.analyzer.js +315 -0
  214. package/dist/services/motion/analyzers/frame-diff.analyzer.js.map +1 -0
  215. package/dist/services/motion/analyzers/layout-shift.detector.d.ts +132 -0
  216. package/dist/services/motion/analyzers/layout-shift.detector.d.ts.map +1 -0
  217. package/dist/services/motion/analyzers/layout-shift.detector.js +179 -0
  218. package/dist/services/motion/analyzers/layout-shift.detector.js.map +1 -0
  219. package/dist/services/motion/analyzers/motion-vector.estimator.d.ts +88 -0
  220. package/dist/services/motion/analyzers/motion-vector.estimator.d.ts.map +1 -0
  221. package/dist/services/motion/analyzers/motion-vector.estimator.js +494 -0
  222. package/dist/services/motion/analyzers/motion-vector.estimator.js.map +1 -0
  223. package/dist/services/motion/analyzers/webgl-motion-analyzer.d.ts +167 -0
  224. package/dist/services/motion/analyzers/webgl-motion-analyzer.d.ts.map +1 -0
  225. package/dist/services/motion/analyzers/webgl-motion-analyzer.js +500 -0
  226. package/dist/services/motion/analyzers/webgl-motion-analyzer.js.map +1 -0
  227. package/dist/services/motion/animation-metrics-collector.service.d.ts +215 -0
  228. package/dist/services/motion/animation-metrics-collector.service.d.ts.map +1 -0
  229. package/dist/services/motion/animation-metrics-collector.service.js +502 -0
  230. package/dist/services/motion/animation-metrics-collector.service.js.map +1 -0
  231. package/dist/services/motion/cls-calculator.service.d.ts +186 -0
  232. package/dist/services/motion/cls-calculator.service.d.ts.map +1 -0
  233. package/dist/services/motion/cls-calculator.service.js +329 -0
  234. package/dist/services/motion/cls-calculator.service.js.map +1 -0
  235. package/dist/services/motion/existing-animation-detector.service.d.ts +208 -0
  236. package/dist/services/motion/existing-animation-detector.service.d.ts.map +1 -0
  237. package/dist/services/motion/existing-animation-detector.service.js +591 -0
  238. package/dist/services/motion/existing-animation-detector.service.js.map +1 -0
  239. package/dist/services/motion/fade-detector.service.d.ts +114 -0
  240. package/dist/services/motion/fade-detector.service.d.ts.map +1 -0
  241. package/dist/services/motion/fade-detector.service.js +249 -0
  242. package/dist/services/motion/fade-detector.service.js.map +1 -0
  243. package/dist/services/motion/frame-analysis-save.helper.d.ts +41 -0
  244. package/dist/services/motion/frame-analysis-save.helper.d.ts.map +1 -0
  245. package/dist/services/motion/frame-analysis-save.helper.js +235 -0
  246. package/dist/services/motion/frame-analysis-save.helper.js.map +1 -0
  247. package/dist/services/motion/frame-capture.service.d.ts +170 -0
  248. package/dist/services/motion/frame-capture.service.d.ts.map +1 -0
  249. package/dist/services/motion/frame-capture.service.js +476 -0
  250. package/dist/services/motion/frame-capture.service.js.map +1 -0
  251. package/dist/services/motion/frame-embedding.service.d.ts +315 -0
  252. package/dist/services/motion/frame-embedding.service.d.ts.map +1 -0
  253. package/dist/services/motion/frame-embedding.service.js +1023 -0
  254. package/dist/services/motion/frame-embedding.service.js.map +1 -0
  255. package/dist/services/motion/frame-image-analysis.service.d.ts +126 -0
  256. package/dist/services/motion/frame-image-analysis.service.d.ts.map +1 -0
  257. package/dist/services/motion/frame-image-analysis.service.js +982 -0
  258. package/dist/services/motion/frame-image-analysis.service.js.map +1 -0
  259. package/dist/services/motion/frame-image-analyzer.adapter.d.ts +168 -0
  260. package/dist/services/motion/frame-image-analyzer.adapter.d.ts.map +1 -0
  261. package/dist/services/motion/frame-image-analyzer.adapter.js +520 -0
  262. package/dist/services/motion/frame-image-analyzer.adapter.js.map +1 -0
  263. package/dist/services/motion/frame-worker-pool.service.d.ts +133 -0
  264. package/dist/services/motion/frame-worker-pool.service.d.ts.map +1 -0
  265. package/dist/services/motion/frame-worker-pool.service.js +410 -0
  266. package/dist/services/motion/frame-worker-pool.service.js.map +1 -0
  267. package/dist/services/motion/infrastructure/frame-loader.d.ts +77 -0
  268. package/dist/services/motion/infrastructure/frame-loader.d.ts.map +1 -0
  269. package/dist/services/motion/infrastructure/frame-loader.js +430 -0
  270. package/dist/services/motion/infrastructure/frame-loader.js.map +1 -0
  271. package/dist/services/motion/js-animation-detector.d.ts +382 -0
  272. package/dist/services/motion/js-animation-detector.d.ts.map +1 -0
  273. package/dist/services/motion/js-animation-detector.js +911 -0
  274. package/dist/services/motion/js-animation-detector.js.map +1 -0
  275. package/dist/services/motion/js-animation-embedding.service.d.ts +114 -0
  276. package/dist/services/motion/js-animation-embedding.service.d.ts.map +1 -0
  277. package/dist/services/motion/js-animation-embedding.service.js +289 -0
  278. package/dist/services/motion/js-animation-embedding.service.js.map +1 -0
  279. package/dist/services/motion/js-animation-search.service.d.ts +138 -0
  280. package/dist/services/motion/js-animation-search.service.d.ts.map +1 -0
  281. package/dist/services/motion/js-animation-search.service.js +503 -0
  282. package/dist/services/motion/js-animation-search.service.js.map +1 -0
  283. package/dist/services/motion/motion-db.service.d.ts +231 -0
  284. package/dist/services/motion/motion-db.service.d.ts.map +1 -0
  285. package/dist/services/motion/motion-db.service.js +676 -0
  286. package/dist/services/motion/motion-db.service.js.map +1 -0
  287. package/dist/services/motion/three-js-scene-extractor.d.ts +274 -0
  288. package/dist/services/motion/three-js-scene-extractor.d.ts.map +1 -0
  289. package/dist/services/motion/three-js-scene-extractor.js +1126 -0
  290. package/dist/services/motion/three-js-scene-extractor.js.map +1 -0
  291. package/dist/services/motion/types.d.ts +592 -0
  292. package/dist/services/motion/types.d.ts.map +1 -0
  293. package/dist/services/motion/types.js +121 -0
  294. package/dist/services/motion/types.js.map +1 -0
  295. package/dist/services/motion/visual-category-classifier.d.ts +273 -0
  296. package/dist/services/motion/visual-category-classifier.d.ts.map +1 -0
  297. package/dist/services/motion/visual-category-classifier.js +1060 -0
  298. package/dist/services/motion/visual-category-classifier.js.map +1 -0
  299. package/dist/services/motion/webgl-animation-categorizer.d.ts +151 -0
  300. package/dist/services/motion/webgl-animation-categorizer.d.ts.map +1 -0
  301. package/dist/services/motion/webgl-animation-categorizer.js +568 -0
  302. package/dist/services/motion/webgl-animation-categorizer.js.map +1 -0
  303. package/dist/services/motion/webgl-animation-detector.service.d.ts +204 -0
  304. package/dist/services/motion/webgl-animation-detector.service.d.ts.map +1 -0
  305. package/dist/services/motion/webgl-animation-detector.service.js +518 -0
  306. package/dist/services/motion/webgl-animation-detector.service.js.map +1 -0
  307. package/dist/services/motion/webgl-animation-embedding.service.d.ts +238 -0
  308. package/dist/services/motion/webgl-animation-embedding.service.d.ts.map +1 -0
  309. package/dist/services/motion/webgl-animation-embedding.service.js +368 -0
  310. package/dist/services/motion/webgl-animation-embedding.service.js.map +1 -0
  311. package/dist/services/motion-detect-service-export.d.ts +130 -0
  312. package/dist/services/motion-detect-service-export.d.ts.map +1 -0
  313. package/dist/services/motion-detect-service-export.js +160 -0
  314. package/dist/services/motion-detect-service-export.js.map +1 -0
  315. package/dist/services/motion-persistence.service.d.ts +144 -0
  316. package/dist/services/motion-persistence.service.d.ts.map +1 -0
  317. package/dist/services/motion-persistence.service.js +398 -0
  318. package/dist/services/motion-persistence.service.js.map +1 -0
  319. package/dist/services/motion-search-service.d.ts +10 -0
  320. package/dist/services/motion-search-service.d.ts.map +1 -0
  321. package/dist/services/motion-search-service.js +22 -0
  322. package/dist/services/motion-search-service.js.map +1 -0
  323. package/dist/services/motion-search.service.d.ts +210 -0
  324. package/dist/services/motion-search.service.d.ts.map +1 -0
  325. package/dist/services/motion-search.service.js +900 -0
  326. package/dist/services/motion-search.service.js.map +1 -0
  327. package/dist/services/narrative/analyzers/layout-structure.analyzer.d.ts +75 -0
  328. package/dist/services/narrative/analyzers/layout-structure.analyzer.d.ts.map +1 -0
  329. package/dist/services/narrative/analyzers/layout-structure.analyzer.js +489 -0
  330. package/dist/services/narrative/analyzers/layout-structure.analyzer.js.map +1 -0
  331. package/dist/services/narrative/analyzers/worldview.analyzer.d.ts +92 -0
  332. package/dist/services/narrative/analyzers/worldview.analyzer.d.ts.map +1 -0
  333. package/dist/services/narrative/analyzers/worldview.analyzer.js +477 -0
  334. package/dist/services/narrative/analyzers/worldview.analyzer.js.map +1 -0
  335. package/dist/services/narrative/generators/confidence-calculator.d.ts +65 -0
  336. package/dist/services/narrative/generators/confidence-calculator.d.ts.map +1 -0
  337. package/dist/services/narrative/generators/confidence-calculator.js +316 -0
  338. package/dist/services/narrative/generators/confidence-calculator.js.map +1 -0
  339. package/dist/services/narrative/generators/text-representation.generator.d.ts +67 -0
  340. package/dist/services/narrative/generators/text-representation.generator.d.ts.map +1 -0
  341. package/dist/services/narrative/generators/text-representation.generator.js +312 -0
  342. package/dist/services/narrative/generators/text-representation.generator.js.map +1 -0
  343. package/dist/services/narrative/index.d.ts +16 -0
  344. package/dist/services/narrative/index.d.ts.map +1 -0
  345. package/dist/services/narrative/index.js +63 -0
  346. package/dist/services/narrative/index.js.map +1 -0
  347. package/dist/services/narrative/narrative-analysis.service.d.ts +120 -0
  348. package/dist/services/narrative/narrative-analysis.service.d.ts.map +1 -0
  349. package/dist/services/narrative/narrative-analysis.service.js +479 -0
  350. package/dist/services/narrative/narrative-analysis.service.js.map +1 -0
  351. package/dist/services/narrative/narrative-search.service.d.ts +126 -0
  352. package/dist/services/narrative/narrative-search.service.d.ts.map +1 -0
  353. package/dist/services/narrative/narrative-search.service.js +516 -0
  354. package/dist/services/narrative/narrative-search.service.js.map +1 -0
  355. package/dist/services/narrative/types/narrative.types.d.ts +372 -0
  356. package/dist/services/narrative/types/narrative.types.d.ts.map +1 -0
  357. package/dist/services/narrative/types/narrative.types.js +5 -0
  358. package/dist/services/narrative/types/narrative.types.js.map +1 -0
  359. package/dist/services/orphaned-job-utils.d.ts +62 -0
  360. package/dist/services/orphaned-job-utils.d.ts.map +1 -0
  361. package/dist/services/orphaned-job-utils.js +130 -0
  362. package/dist/services/orphaned-job-utils.js.map +1 -0
  363. package/dist/services/page/css-animation-parser.service.d.ts +173 -0
  364. package/dist/services/page/css-animation-parser.service.d.ts.map +1 -0
  365. package/dist/services/page/css-animation-parser.service.js +537 -0
  366. package/dist/services/page/css-animation-parser.service.js.map +1 -0
  367. package/dist/services/page/fallback-analyzer.service.d.ts +140 -0
  368. package/dist/services/page/fallback-analyzer.service.d.ts.map +1 -0
  369. package/dist/services/page/fallback-analyzer.service.js +289 -0
  370. package/dist/services/page/fallback-analyzer.service.js.map +1 -0
  371. package/dist/services/page/frame-analyzer.service.d.ts +208 -0
  372. package/dist/services/page/frame-analyzer.service.d.ts.map +1 -0
  373. package/dist/services/page/frame-analyzer.service.js +628 -0
  374. package/dist/services/page/frame-analyzer.service.js.map +1 -0
  375. package/dist/services/page/layout-analyzer.service.d.ts +323 -0
  376. package/dist/services/page/layout-analyzer.service.d.ts.map +1 -0
  377. package/dist/services/page/layout-analyzer.service.js +2001 -0
  378. package/dist/services/page/layout-analyzer.service.js.map +1 -0
  379. package/dist/services/page/motion-category-classifier.service.d.ts +72 -0
  380. package/dist/services/page/motion-category-classifier.service.d.ts.map +1 -0
  381. package/dist/services/page/motion-category-classifier.service.js +340 -0
  382. package/dist/services/page/motion-category-classifier.service.js.map +1 -0
  383. package/dist/services/page/motion-detector.service.d.ts +76 -0
  384. package/dist/services/page/motion-detector.service.d.ts.map +1 -0
  385. package/dist/services/page/motion-detector.service.js +255 -0
  386. package/dist/services/page/motion-detector.service.js.map +1 -0
  387. package/dist/services/page/motion-performance-analyzer.service.d.ts +114 -0
  388. package/dist/services/page/motion-performance-analyzer.service.d.ts.map +1 -0
  389. package/dist/services/page/motion-performance-analyzer.service.js +315 -0
  390. package/dist/services/page/motion-performance-analyzer.service.js.map +1 -0
  391. package/dist/services/page/playwright-crawler.service.d.ts +106 -0
  392. package/dist/services/page/playwright-crawler.service.d.ts.map +1 -0
  393. package/dist/services/page/playwright-crawler.service.js +373 -0
  394. package/dist/services/page/playwright-crawler.service.js.map +1 -0
  395. package/dist/services/page/quality-evaluator.service.d.ts +107 -0
  396. package/dist/services/page/quality-evaluator.service.d.ts.map +1 -0
  397. package/dist/services/page/quality-evaluator.service.js +1138 -0
  398. package/dist/services/page/quality-evaluator.service.js.map +1 -0
  399. package/dist/services/page/runtime-animation-detector.service.d.ts +154 -0
  400. package/dist/services/page/runtime-animation-detector.service.d.ts.map +1 -0
  401. package/dist/services/page/runtime-animation-detector.service.js +480 -0
  402. package/dist/services/page/runtime-animation-detector.service.js.map +1 -0
  403. package/dist/services/page/section-postprocessor.service.d.ts +55 -0
  404. package/dist/services/page/section-postprocessor.service.d.ts.map +1 -0
  405. package/dist/services/page/section-postprocessor.service.js +708 -0
  406. package/dist/services/page/section-postprocessor.service.js.map +1 -0
  407. package/dist/services/page/video-recorder.service.d.ts +110 -0
  408. package/dist/services/page/video-recorder.service.d.ts.map +1 -0
  409. package/dist/services/page/video-recorder.service.js +441 -0
  410. package/dist/services/page/video-recorder.service.js.map +1 -0
  411. package/dist/services/page/webgl-detector.service.d.ts +113 -0
  412. package/dist/services/page/webgl-detector.service.d.ts.map +1 -0
  413. package/dist/services/page/webgl-detector.service.js +280 -0
  414. package/dist/services/page/webgl-detector.service.js.map +1 -0
  415. package/dist/services/page-analyze-service.d.ts +30 -0
  416. package/dist/services/page-analyze-service.d.ts.map +1 -0
  417. package/dist/services/page-analyze-service.js +58 -0
  418. package/dist/services/page-analyze-service.js.map +1 -0
  419. package/dist/services/page-ingest-adapter.d.ts +479 -0
  420. package/dist/services/page-ingest-adapter.d.ts.map +1 -0
  421. package/dist/services/page-ingest-adapter.js +1726 -0
  422. package/dist/services/page-ingest-adapter.js.map +1 -0
  423. package/dist/services/palette-service-export.d.ts +26 -0
  424. package/dist/services/palette-service-export.d.ts.map +1 -0
  425. package/dist/services/palette-service-export.js +22 -0
  426. package/dist/services/palette-service-export.js.map +1 -0
  427. package/dist/services/part/index.d.ts +22 -0
  428. package/dist/services/part/index.d.ts.map +1 -0
  429. package/dist/services/part/index.js +72 -0
  430. package/dist/services/part/index.js.map +1 -0
  431. package/dist/services/part/part-backfill.service.d.ts +66 -0
  432. package/dist/services/part/part-backfill.service.d.ts.map +1 -0
  433. package/dist/services/part/part-backfill.service.js +195 -0
  434. package/dist/services/part/part-backfill.service.js.map +1 -0
  435. package/dist/services/part/part-bbox-playwright.service.d.ts +85 -0
  436. package/dist/services/part/part-bbox-playwright.service.d.ts.map +1 -0
  437. package/dist/services/part/part-bbox-playwright.service.js +362 -0
  438. package/dist/services/part/part-bbox-playwright.service.js.map +1 -0
  439. package/dist/services/part/part-db.service.d.ts +41 -0
  440. package/dist/services/part/part-db.service.d.ts.map +1 -0
  441. package/dist/services/part/part-db.service.js +82 -0
  442. package/dist/services/part/part-db.service.js.map +1 -0
  443. package/dist/services/part/part-embedding-db.service.d.ts +52 -0
  444. package/dist/services/part/part-embedding-db.service.d.ts.map +1 -0
  445. package/dist/services/part/part-embedding-db.service.js +122 -0
  446. package/dist/services/part/part-embedding-db.service.js.map +1 -0
  447. package/dist/services/part/part-embedding.service.d.ts +140 -0
  448. package/dist/services/part/part-embedding.service.d.ts.map +1 -0
  449. package/dist/services/part/part-embedding.service.js +276 -0
  450. package/dist/services/part/part-embedding.service.js.map +1 -0
  451. package/dist/services/part/part-extraction.service.d.ts +75 -0
  452. package/dist/services/part/part-extraction.service.d.ts.map +1 -0
  453. package/dist/services/part/part-extraction.service.js +519 -0
  454. package/dist/services/part/part-extraction.service.js.map +1 -0
  455. package/dist/services/part/part-search.service.d.ts +180 -0
  456. package/dist/services/part/part-search.service.d.ts.map +1 -0
  457. package/dist/services/part/part-search.service.js +565 -0
  458. package/dist/services/part/part-search.service.js.map +1 -0
  459. package/dist/services/part/schemas.d.ts +232 -0
  460. package/dist/services/part/schemas.d.ts.map +1 -0
  461. package/dist/services/part/schemas.js +167 -0
  462. package/dist/services/part/schemas.js.map +1 -0
  463. package/dist/services/part/section-screenshot-fallback.service.d.ts +101 -0
  464. package/dist/services/part/section-screenshot-fallback.service.d.ts.map +1 -0
  465. package/dist/services/part/section-screenshot-fallback.service.js +489 -0
  466. package/dist/services/part/section-screenshot-fallback.service.js.map +1 -0
  467. package/dist/services/part/types.d.ts +189 -0
  468. package/dist/services/part/types.d.ts.map +1 -0
  469. package/dist/services/part/types.js +139 -0
  470. package/dist/services/part/types.js.map +1 -0
  471. package/dist/services/persistent-cache.d.ts +209 -0
  472. package/dist/services/persistent-cache.d.ts.map +1 -0
  473. package/dist/services/persistent-cache.js +633 -0
  474. package/dist/services/persistent-cache.js.map +1 -0
  475. package/dist/services/preference-profile.service.d.ts +143 -0
  476. package/dist/services/preference-profile.service.d.ts.map +1 -0
  477. package/dist/services/preference-profile.service.js +604 -0
  478. package/dist/services/preference-profile.service.js.map +1 -0
  479. package/dist/services/preference-rerank.helper.d.ts +128 -0
  480. package/dist/services/preference-rerank.helper.d.ts.map +1 -0
  481. package/dist/services/preference-rerank.helper.js +397 -0
  482. package/dist/services/preference-rerank.helper.js.map +1 -0
  483. package/dist/services/production-guard.d.ts +213 -0
  484. package/dist/services/production-guard.d.ts.map +1 -0
  485. package/dist/services/production-guard.js +357 -0
  486. package/dist/services/production-guard.js.map +1 -0
  487. package/dist/services/project-context-analyzer.d.ts +194 -0
  488. package/dist/services/project-context-analyzer.d.ts.map +1 -0
  489. package/dist/services/project-context-analyzer.js +747 -0
  490. package/dist/services/project-context-analyzer.js.map +1 -0
  491. package/dist/services/quality/axe-accessibility.service.d.ts +87 -0
  492. package/dist/services/quality/axe-accessibility.service.d.ts.map +1 -0
  493. package/dist/services/quality/axe-accessibility.service.js +188 -0
  494. package/dist/services/quality/axe-accessibility.service.js.map +1 -0
  495. package/dist/services/quality/axe-core-shared.d.ts +108 -0
  496. package/dist/services/quality/axe-core-shared.d.ts.map +1 -0
  497. package/dist/services/quality/axe-core-shared.js +136 -0
  498. package/dist/services/quality/axe-core-shared.js.map +1 -0
  499. package/dist/services/quality/benchmark.service.d.ts +178 -0
  500. package/dist/services/quality/benchmark.service.d.ts.map +1 -0
  501. package/dist/services/quality/benchmark.service.js +394 -0
  502. package/dist/services/quality/benchmark.service.js.map +1 -0
  503. package/dist/services/quality/content-gap-detector.service.d.ts +133 -0
  504. package/dist/services/quality/content-gap-detector.service.d.ts.map +1 -0
  505. package/dist/services/quality/content-gap-detector.service.js +364 -0
  506. package/dist/services/quality/content-gap-detector.service.js.map +1 -0
  507. package/dist/services/quality/index.d.ts +12 -0
  508. package/dist/services/quality/index.d.ts.map +1 -0
  509. package/dist/services/quality/index.js +12 -0
  510. package/dist/services/quality/index.js.map +1 -0
  511. package/dist/services/quality/pattern-matcher.service.d.ts +195 -0
  512. package/dist/services/quality/pattern-matcher.service.d.ts.map +1 -0
  513. package/dist/services/quality/pattern-matcher.service.js +630 -0
  514. package/dist/services/quality/pattern-matcher.service.js.map +1 -0
  515. package/dist/services/quality/playwright-axe.service.d.ts +84 -0
  516. package/dist/services/quality/playwright-axe.service.d.ts.map +1 -0
  517. package/dist/services/quality/playwright-axe.service.js +267 -0
  518. package/dist/services/quality/playwright-axe.service.js.map +1 -0
  519. package/dist/services/quality/quality-evaluate.service.interface.d.ts +216 -0
  520. package/dist/services/quality/quality-evaluate.service.interface.d.ts.map +1 -0
  521. package/dist/services/quality/quality-evaluate.service.interface.js +5 -0
  522. package/dist/services/quality/quality-evaluate.service.interface.js.map +1 -0
  523. package/dist/services/quality/visual-design-analyzer.service.d.ts +72 -0
  524. package/dist/services/quality/visual-design-analyzer.service.d.ts.map +1 -0
  525. package/dist/services/quality/visual-design-analyzer.service.js +762 -0
  526. package/dist/services/quality/visual-design-analyzer.service.js.map +1 -0
  527. package/dist/services/quality-evaluate-service-export.d.ts +122 -0
  528. package/dist/services/quality-evaluate-service-export.d.ts.map +1 -0
  529. package/dist/services/quality-evaluate-service-export.js +138 -0
  530. package/dist/services/quality-evaluate-service-export.js.map +1 -0
  531. package/dist/services/quality-search.service.d.ts +20 -0
  532. package/dist/services/quality-search.service.d.ts.map +1 -0
  533. package/dist/services/quality-search.service.js +260 -0
  534. package/dist/services/quality-search.service.js.map +1 -0
  535. package/dist/services/query-analyzer.d.ts +107 -0
  536. package/dist/services/query-analyzer.d.ts.map +1 -0
  537. package/dist/services/query-analyzer.js +222 -0
  538. package/dist/services/query-analyzer.js.map +1 -0
  539. package/dist/services/query-context-analyzer.d.ts +85 -0
  540. package/dist/services/query-context-analyzer.d.ts.map +1 -0
  541. package/dist/services/query-context-analyzer.js +728 -0
  542. package/dist/services/query-context-analyzer.js.map +1 -0
  543. package/dist/services/queue-cleanup.service.d.ts +102 -0
  544. package/dist/services/queue-cleanup.service.d.ts.map +1 -0
  545. package/dist/services/queue-cleanup.service.js +259 -0
  546. package/dist/services/queue-cleanup.service.js.map +1 -0
  547. package/dist/services/responsive/difference-detector.service.d.ts +77 -0
  548. package/dist/services/responsive/difference-detector.service.d.ts.map +1 -0
  549. package/dist/services/responsive/difference-detector.service.js +525 -0
  550. package/dist/services/responsive/difference-detector.service.js.map +1 -0
  551. package/dist/services/responsive/index.d.ts +16 -0
  552. package/dist/services/responsive/index.d.ts.map +1 -0
  553. package/dist/services/responsive/index.js +60 -0
  554. package/dist/services/responsive/index.js.map +1 -0
  555. package/dist/services/responsive/multi-viewport-capture.service.d.ts +103 -0
  556. package/dist/services/responsive/multi-viewport-capture.service.d.ts.map +1 -0
  557. package/dist/services/responsive/multi-viewport-capture.service.js +841 -0
  558. package/dist/services/responsive/multi-viewport-capture.service.js.map +1 -0
  559. package/dist/services/responsive/responsive-analysis-embedding.service.d.ts +114 -0
  560. package/dist/services/responsive/responsive-analysis-embedding.service.d.ts.map +1 -0
  561. package/dist/services/responsive/responsive-analysis-embedding.service.js +232 -0
  562. package/dist/services/responsive/responsive-analysis-embedding.service.js.map +1 -0
  563. package/dist/services/responsive/responsive-analysis.service.d.ts +37 -0
  564. package/dist/services/responsive/responsive-analysis.service.d.ts.map +1 -0
  565. package/dist/services/responsive/responsive-analysis.service.js +262 -0
  566. package/dist/services/responsive/responsive-analysis.service.js.map +1 -0
  567. package/dist/services/responsive/responsive-persistence.service.d.ts +45 -0
  568. package/dist/services/responsive/responsive-persistence.service.d.ts.map +1 -0
  569. package/dist/services/responsive/responsive-persistence.service.js +102 -0
  570. package/dist/services/responsive/responsive-persistence.service.js.map +1 -0
  571. package/dist/services/responsive/responsive-quality-evaluator.service.d.ts +80 -0
  572. package/dist/services/responsive/responsive-quality-evaluator.service.d.ts.map +1 -0
  573. package/dist/services/responsive/responsive-quality-evaluator.service.js +448 -0
  574. package/dist/services/responsive/responsive-quality-evaluator.service.js.map +1 -0
  575. package/dist/services/responsive/shared-browser-manager.d.ts +65 -0
  576. package/dist/services/responsive/shared-browser-manager.d.ts.map +1 -0
  577. package/dist/services/responsive/shared-browser-manager.js +112 -0
  578. package/dist/services/responsive/shared-browser-manager.js.map +1 -0
  579. package/dist/services/responsive/types.d.ts +367 -0
  580. package/dist/services/responsive/types.d.ts.map +1 -0
  581. package/dist/services/responsive/types.js +5 -0
  582. package/dist/services/responsive/types.js.map +1 -0
  583. package/dist/services/responsive/viewport-diff.service.d.ts +49 -0
  584. package/dist/services/responsive/viewport-diff.service.d.ts.map +1 -0
  585. package/dist/services/responsive/viewport-diff.service.js +178 -0
  586. package/dist/services/responsive/viewport-diff.service.js.map +1 -0
  587. package/dist/services/responsive-search.service.d.ts +52 -0
  588. package/dist/services/responsive-search.service.d.ts.map +1 -0
  589. package/dist/services/responsive-search.service.js +136 -0
  590. package/dist/services/responsive-search.service.js.map +1 -0
  591. package/dist/services/search/mood-brandtone-search.service.d.ts +99 -0
  592. package/dist/services/search/mood-brandtone-search.service.d.ts.map +1 -0
  593. package/dist/services/search/mood-brandtone-search.service.js +310 -0
  594. package/dist/services/search/mood-brandtone-search.service.js.map +1 -0
  595. package/dist/services/search-performance.service.d.ts +118 -0
  596. package/dist/services/search-performance.service.d.ts.map +1 -0
  597. package/dist/services/search-performance.service.js +181 -0
  598. package/dist/services/search-performance.service.js.map +1 -0
  599. package/dist/services/section-screenshot.service.d.ts +163 -0
  600. package/dist/services/section-screenshot.service.d.ts.map +1 -0
  601. package/dist/services/section-screenshot.service.js +363 -0
  602. package/dist/services/section-screenshot.service.js.map +1 -0
  603. package/dist/services/service-client.d.ts +181 -0
  604. package/dist/services/service-client.d.ts.map +1 -0
  605. package/dist/services/service-client.js +450 -0
  606. package/dist/services/service-client.js.map +1 -0
  607. package/dist/services/service-initializer.d.ts +174 -0
  608. package/dist/services/service-initializer.d.ts.map +1 -0
  609. package/dist/services/service-initializer.js +942 -0
  610. package/dist/services/service-initializer.js.map +1 -0
  611. package/dist/services/storage/index.d.ts +7 -0
  612. package/dist/services/storage/index.d.ts.map +1 -0
  613. package/dist/services/storage/index.js +14 -0
  614. package/dist/services/storage/index.js.map +1 -0
  615. package/dist/services/storage/local-storage.provider.d.ts +140 -0
  616. package/dist/services/storage/local-storage.provider.d.ts.map +1 -0
  617. package/dist/services/storage/local-storage.provider.js +333 -0
  618. package/dist/services/storage/local-storage.provider.js.map +1 -0
  619. package/dist/services/style/index.d.ts +7 -0
  620. package/dist/services/style/index.d.ts.map +1 -0
  621. package/dist/services/style/index.js +25 -0
  622. package/dist/services/style/index.js.map +1 -0
  623. package/dist/services/style/palette-service.d.ts +212 -0
  624. package/dist/services/style/palette-service.d.ts.map +1 -0
  625. package/dist/services/style/palette-service.js +423 -0
  626. package/dist/services/style/palette-service.js.map +1 -0
  627. package/dist/services/style/prisma-palette-repository.d.ts +35 -0
  628. package/dist/services/style/prisma-palette-repository.d.ts.map +1 -0
  629. package/dist/services/style/prisma-palette-repository.js +165 -0
  630. package/dist/services/style/prisma-palette-repository.js.map +1 -0
  631. package/dist/services/vision/brandtone.analyzer.d.ts +104 -0
  632. package/dist/services/vision/brandtone.analyzer.d.ts.map +1 -0
  633. package/dist/services/vision/brandtone.analyzer.js +279 -0
  634. package/dist/services/vision/brandtone.analyzer.js.map +1 -0
  635. package/dist/services/vision/hardware-detector.d.ts +166 -0
  636. package/dist/services/vision/hardware-detector.d.ts.map +1 -0
  637. package/dist/services/vision/hardware-detector.js +330 -0
  638. package/dist/services/vision/hardware-detector.js.map +1 -0
  639. package/dist/services/vision/image-optimizer.d.ts +152 -0
  640. package/dist/services/vision/image-optimizer.d.ts.map +1 -0
  641. package/dist/services/vision/image-optimizer.js +266 -0
  642. package/dist/services/vision/image-optimizer.js.map +1 -0
  643. package/dist/services/vision/index.d.ts +26 -0
  644. package/dist/services/vision/index.d.ts.map +1 -0
  645. package/dist/services/vision/index.js +80 -0
  646. package/dist/services/vision/index.js.map +1 -0
  647. package/dist/services/vision/llama-vision-adapter.d.ts +178 -0
  648. package/dist/services/vision/llama-vision-adapter.d.ts.map +1 -0
  649. package/dist/services/vision/llama-vision-adapter.js +307 -0
  650. package/dist/services/vision/llama-vision-adapter.js.map +1 -0
  651. package/dist/services/vision/mcp-progress-adapter.d.ts +128 -0
  652. package/dist/services/vision/mcp-progress-adapter.d.ts.map +1 -0
  653. package/dist/services/vision/mcp-progress-adapter.js +150 -0
  654. package/dist/services/vision/mcp-progress-adapter.js.map +1 -0
  655. package/dist/services/vision/mood.analyzer.d.ts +74 -0
  656. package/dist/services/vision/mood.analyzer.d.ts.map +1 -0
  657. package/dist/services/vision/mood.analyzer.js +258 -0
  658. package/dist/services/vision/mood.analyzer.js.map +1 -0
  659. package/dist/services/vision/ollama-readiness-probe.d.ts +87 -0
  660. package/dist/services/vision/ollama-readiness-probe.d.ts.map +1 -0
  661. package/dist/services/vision/ollama-readiness-probe.js +211 -0
  662. package/dist/services/vision/ollama-readiness-probe.js.map +1 -0
  663. package/dist/services/vision/ollama-vision-client.d.ts +129 -0
  664. package/dist/services/vision/ollama-vision-client.d.ts.map +1 -0
  665. package/dist/services/vision/ollama-vision-client.js +478 -0
  666. package/dist/services/vision/ollama-vision-client.js.map +1 -0
  667. package/dist/services/vision/progress-reporter.d.ts +140 -0
  668. package/dist/services/vision/progress-reporter.d.ts.map +1 -0
  669. package/dist/services/vision/progress-reporter.js +306 -0
  670. package/dist/services/vision/progress-reporter.js.map +1 -0
  671. package/dist/services/vision/scroll-vision-capture.service.d.ts +117 -0
  672. package/dist/services/vision/scroll-vision-capture.service.d.ts.map +1 -0
  673. package/dist/services/vision/scroll-vision-capture.service.js +266 -0
  674. package/dist/services/vision/scroll-vision-capture.service.js.map +1 -0
  675. package/dist/services/vision/scroll-vision-persistence.service.d.ts +48 -0
  676. package/dist/services/vision/scroll-vision-persistence.service.d.ts.map +1 -0
  677. package/dist/services/vision/scroll-vision-persistence.service.js +161 -0
  678. package/dist/services/vision/scroll-vision-persistence.service.js.map +1 -0
  679. package/dist/services/vision/scroll-vision.analyzer.d.ts +90 -0
  680. package/dist/services/vision/scroll-vision.analyzer.d.ts.map +1 -0
  681. package/dist/services/vision/scroll-vision.analyzer.js +280 -0
  682. package/dist/services/vision/scroll-vision.analyzer.js.map +1 -0
  683. package/dist/services/vision/theme.analyzer.d.ts +108 -0
  684. package/dist/services/vision/theme.analyzer.d.ts.map +1 -0
  685. package/dist/services/vision/theme.analyzer.js +315 -0
  686. package/dist/services/vision/theme.analyzer.js.map +1 -0
  687. package/dist/services/vision/timeout-calculator.d.ts +85 -0
  688. package/dist/services/vision/timeout-calculator.d.ts.map +1 -0
  689. package/dist/services/vision/timeout-calculator.js +142 -0
  690. package/dist/services/vision/timeout-calculator.js.map +1 -0
  691. package/dist/services/vision/vision-fallback.service.d.ts +121 -0
  692. package/dist/services/vision/vision-fallback.service.d.ts.map +1 -0
  693. package/dist/services/vision/vision-fallback.service.js +253 -0
  694. package/dist/services/vision/vision-fallback.service.js.map +1 -0
  695. package/dist/services/vision/vision.cache.d.ts +124 -0
  696. package/dist/services/vision/vision.cache.d.ts.map +1 -0
  697. package/dist/services/vision/vision.cache.js +261 -0
  698. package/dist/services/vision/vision.cache.js.map +1 -0
  699. package/dist/services/vision/vision.errors.d.ts +104 -0
  700. package/dist/services/vision/vision.errors.d.ts.map +1 -0
  701. package/dist/services/vision/vision.errors.js +133 -0
  702. package/dist/services/vision/vision.errors.js.map +1 -0
  703. package/dist/services/vision/vision.prompts.d.ts +47 -0
  704. package/dist/services/vision/vision.prompts.d.ts.map +1 -0
  705. package/dist/services/vision/vision.prompts.js +272 -0
  706. package/dist/services/vision/vision.prompts.js.map +1 -0
  707. package/dist/services/vision/vram-utils.d.ts +22 -0
  708. package/dist/services/vision/vram-utils.d.ts.map +1 -0
  709. package/dist/services/vision/vram-utils.js +57 -0
  710. package/dist/services/vision/vram-utils.js.map +1 -0
  711. package/dist/services/vision-adapter/index.d.ts +18 -0
  712. package/dist/services/vision-adapter/index.d.ts.map +1 -0
  713. package/dist/services/vision-adapter/index.js +31 -0
  714. package/dist/services/vision-adapter/index.js.map +1 -0
  715. package/dist/services/vision-adapter/interface.d.ts +1434 -0
  716. package/dist/services/vision-adapter/interface.d.ts.map +1 -0
  717. package/dist/services/vision-adapter/interface.js +326 -0
  718. package/dist/services/vision-adapter/interface.js.map +1 -0
  719. package/dist/services/vision-adapter/llama-vision.adapter.d.ts +373 -0
  720. package/dist/services/vision-adapter/llama-vision.adapter.d.ts.map +1 -0
  721. package/dist/services/vision-adapter/llama-vision.adapter.js +1751 -0
  722. package/dist/services/vision-adapter/llama-vision.adapter.js.map +1 -0
  723. package/dist/services/vision-adapter/llama-vision.prompts.d.ts +63 -0
  724. package/dist/services/vision-adapter/llama-vision.prompts.d.ts.map +1 -0
  725. package/dist/services/vision-adapter/llama-vision.prompts.js +234 -0
  726. package/dist/services/vision-adapter/llama-vision.prompts.js.map +1 -0
  727. package/dist/services/vision-adapter/llama-vision.types.d.ts +68 -0
  728. package/dist/services/vision-adapter/llama-vision.types.d.ts.map +1 -0
  729. package/dist/services/vision-adapter/llama-vision.types.js +21 -0
  730. package/dist/services/vision-adapter/llama-vision.types.js.map +1 -0
  731. package/dist/services/vision-adapter/local.adapter.d.ts +185 -0
  732. package/dist/services/vision-adapter/local.adapter.d.ts.map +1 -0
  733. package/dist/services/vision-adapter/local.adapter.js +835 -0
  734. package/dist/services/vision-adapter/local.adapter.js.map +1 -0
  735. package/dist/services/vision-adapter/mock.adapter.d.ts +174 -0
  736. package/dist/services/vision-adapter/mock.adapter.d.ts.map +1 -0
  737. package/dist/services/vision-adapter/mock.adapter.js +812 -0
  738. package/dist/services/vision-adapter/mock.adapter.js.map +1 -0
  739. package/dist/services/vision-embedding-search.service.d.ts +205 -0
  740. package/dist/services/vision-embedding-search.service.d.ts.map +1 -0
  741. package/dist/services/vision-embedding-search.service.js +742 -0
  742. package/dist/services/vision-embedding-search.service.js.map +1 -0
  743. package/dist/services/vision-embedding.service.d.ts +150 -0
  744. package/dist/services/vision-embedding.service.d.ts.map +1 -0
  745. package/dist/services/vision-embedding.service.js +461 -0
  746. package/dist/services/vision-embedding.service.js.map +1 -0
  747. package/dist/services/visual/css-variable-extractor.service.d.ts +97 -0
  748. package/dist/services/visual/css-variable-extractor.service.d.ts.map +1 -0
  749. package/dist/services/visual/css-variable-extractor.service.js +460 -0
  750. package/dist/services/visual/css-variable-extractor.service.js.map +1 -0
  751. package/dist/services/visual/typography-extractor.service.d.ts +137 -0
  752. package/dist/services/visual/typography-extractor.service.d.ts.map +1 -0
  753. package/dist/services/visual/typography-extractor.service.js +539 -0
  754. package/dist/services/visual/typography-extractor.service.js.map +1 -0
  755. package/dist/services/visual-extractor/color-extractor.service.d.ts +55 -0
  756. package/dist/services/visual-extractor/color-extractor.service.d.ts.map +1 -0
  757. package/dist/services/visual-extractor/color-extractor.service.js +281 -0
  758. package/dist/services/visual-extractor/color-extractor.service.js.map +1 -0
  759. package/dist/services/visual-extractor/density-calculator.service.d.ts +85 -0
  760. package/dist/services/visual-extractor/density-calculator.service.d.ts.map +1 -0
  761. package/dist/services/visual-extractor/density-calculator.service.js +369 -0
  762. package/dist/services/visual-extractor/density-calculator.service.js.map +1 -0
  763. package/dist/services/visual-extractor/gradient-detector.service.d.ts +134 -0
  764. package/dist/services/visual-extractor/gradient-detector.service.d.ts.map +1 -0
  765. package/dist/services/visual-extractor/gradient-detector.service.js +1172 -0
  766. package/dist/services/visual-extractor/gradient-detector.service.js.map +1 -0
  767. package/dist/services/visual-extractor/image-utils.d.ts +135 -0
  768. package/dist/services/visual-extractor/image-utils.d.ts.map +1 -0
  769. package/dist/services/visual-extractor/image-utils.js +305 -0
  770. package/dist/services/visual-extractor/image-utils.js.map +1 -0
  771. package/dist/services/visual-extractor/pixel-theme-detector.service.d.ts +58 -0
  772. package/dist/services/visual-extractor/pixel-theme-detector.service.d.ts.map +1 -0
  773. package/dist/services/visual-extractor/pixel-theme-detector.service.js +358 -0
  774. package/dist/services/visual-extractor/pixel-theme-detector.service.js.map +1 -0
  775. package/dist/services/visual-extractor/theme-detector.service.d.ts +101 -0
  776. package/dist/services/visual-extractor/theme-detector.service.d.ts.map +1 -0
  777. package/dist/services/visual-extractor/theme-detector.service.js +463 -0
  778. package/dist/services/visual-extractor/theme-detector.service.js.map +1 -0
  779. package/dist/services/visual-extractor/visual-decoration-detector.service.d.ts +43 -0
  780. package/dist/services/visual-extractor/visual-decoration-detector.service.d.ts.map +1 -0
  781. package/dist/services/visual-extractor/visual-decoration-detector.service.js +628 -0
  782. package/dist/services/visual-extractor/visual-decoration-detector.service.js.map +1 -0
  783. package/dist/services/visual-extractor/visual-feature-merger.service.d.ts +230 -0
  784. package/dist/services/visual-extractor/visual-feature-merger.service.d.ts.map +1 -0
  785. package/dist/services/visual-extractor/visual-feature-merger.service.js +482 -0
  786. package/dist/services/visual-extractor/visual-feature-merger.service.js.map +1 -0
  787. package/dist/services/web-page.service.d.ts +80 -0
  788. package/dist/services/web-page.service.d.ts.map +1 -0
  789. package/dist/services/web-page.service.js +211 -0
  790. package/dist/services/web-page.service.js.map +1 -0
  791. package/dist/services/worker-constants.d.ts +40 -0
  792. package/dist/services/worker-constants.d.ts.map +1 -0
  793. package/dist/services/worker-constants.js +51 -0
  794. package/dist/services/worker-constants.js.map +1 -0
  795. package/dist/services/worker-db-save.service.d.ts +311 -0
  796. package/dist/services/worker-db-save.service.d.ts.map +1 -0
  797. package/dist/services/worker-db-save.service.js +771 -0
  798. package/dist/services/worker-db-save.service.js.map +1 -0
  799. package/dist/services/worker-memory-monitor.service.d.ts +24 -0
  800. package/dist/services/worker-memory-monitor.service.d.ts.map +1 -0
  801. package/dist/services/worker-memory-monitor.service.js +105 -0
  802. package/dist/services/worker-memory-monitor.service.js.map +1 -0
  803. package/dist/services/worker-memory-profile.d.ts +65 -0
  804. package/dist/services/worker-memory-profile.d.ts.map +1 -0
  805. package/dist/services/worker-memory-profile.js +225 -0
  806. package/dist/services/worker-memory-profile.js.map +1 -0
  807. package/dist/services/worker-stall-recovery.service.d.ts +166 -0
  808. package/dist/services/worker-stall-recovery.service.d.ts.map +1 -0
  809. package/dist/services/worker-stall-recovery.service.js +335 -0
  810. package/dist/services/worker-stall-recovery.service.js.map +1 -0
  811. package/dist/services/worker-supervisor.service.d.ts +145 -0
  812. package/dist/services/worker-supervisor.service.d.ts.map +1 -0
  813. package/dist/services/worker-supervisor.service.js +635 -0
  814. package/dist/services/worker-supervisor.service.js.map +1 -0
  815. package/dist/tools/background/schemas.d.ts +85 -0
  816. package/dist/tools/background/schemas.d.ts.map +1 -0
  817. package/dist/tools/background/schemas.js +79 -0
  818. package/dist/tools/background/schemas.js.map +1 -0
  819. package/dist/tools/background/search.tool.d.ts +179 -0
  820. package/dist/tools/background/search.tool.d.ts.map +1 -0
  821. package/dist/tools/background/search.tool.js +318 -0
  822. package/dist/tools/background/search.tool.js.map +1 -0
  823. package/dist/tools/brief/index.d.ts +10 -0
  824. package/dist/tools/brief/index.d.ts.map +1 -0
  825. package/dist/tools/brief/index.js +54 -0
  826. package/dist/tools/brief/index.js.map +1 -0
  827. package/dist/tools/brief/schemas.d.ts +750 -0
  828. package/dist/tools/brief/schemas.d.ts.map +1 -0
  829. package/dist/tools/brief/schemas.js +212 -0
  830. package/dist/tools/brief/schemas.js.map +1 -0
  831. package/dist/tools/brief/validate.handler.d.ts +149 -0
  832. package/dist/tools/brief/validate.handler.d.ts.map +1 -0
  833. package/dist/tools/brief/validate.handler.js +247 -0
  834. package/dist/tools/brief/validate.handler.js.map +1 -0
  835. package/dist/tools/brief/validate.service.d.ts +100 -0
  836. package/dist/tools/brief/validate.service.d.ts.map +1 -0
  837. package/dist/tools/brief/validate.service.js +296 -0
  838. package/dist/tools/brief/validate.service.js.map +1 -0
  839. package/dist/tools/common/error-codes.d.ts +35 -0
  840. package/dist/tools/common/error-codes.d.ts.map +1 -0
  841. package/dist/tools/common/error-codes.js +92 -0
  842. package/dist/tools/common/error-codes.js.map +1 -0
  843. package/dist/tools/common/index.d.ts +7 -0
  844. package/dist/tools/common/index.d.ts.map +1 -0
  845. package/dist/tools/common/index.js +20 -0
  846. package/dist/tools/common/index.js.map +1 -0
  847. package/dist/tools/index.d.ts +2756 -0
  848. package/dist/tools/index.d.ts.map +1 -0
  849. package/dist/tools/index.js +506 -0
  850. package/dist/tools/index.js.map +1 -0
  851. package/dist/tools/layout/batch-ingest.tool.d.ts +82 -0
  852. package/dist/tools/layout/batch-ingest.tool.d.ts.map +1 -0
  853. package/dist/tools/layout/batch-ingest.tool.js +410 -0
  854. package/dist/tools/layout/batch-ingest.tool.js.map +1 -0
  855. package/dist/tools/layout/index.d.ts +13 -0
  856. package/dist/tools/layout/index.d.ts.map +1 -0
  857. package/dist/tools/layout/index.js +62 -0
  858. package/dist/tools/layout/index.js.map +1 -0
  859. package/dist/tools/layout/ingest.tool.d.ts +338 -0
  860. package/dist/tools/layout/ingest.tool.d.ts.map +1 -0
  861. package/dist/tools/layout/ingest.tool.js +1308 -0
  862. package/dist/tools/layout/ingest.tool.js.map +1 -0
  863. package/dist/tools/layout/inspect/index.d.ts +11 -0
  864. package/dist/tools/layout/inspect/index.d.ts.map +1 -0
  865. package/dist/tools/layout/inspect/index.js +55 -0
  866. package/dist/tools/layout/inspect/index.js.map +1 -0
  867. package/dist/tools/layout/inspect/inspect.schemas.d.ts +4130 -0
  868. package/dist/tools/layout/inspect/inspect.schemas.d.ts.map +1 -0
  869. package/dist/tools/layout/inspect/inspect.schemas.js +400 -0
  870. package/dist/tools/layout/inspect/inspect.schemas.js.map +1 -0
  871. package/dist/tools/layout/inspect/inspect.tool.d.ts +164 -0
  872. package/dist/tools/layout/inspect/inspect.tool.d.ts.map +1 -0
  873. package/dist/tools/layout/inspect/inspect.tool.js +738 -0
  874. package/dist/tools/layout/inspect/inspect.tool.js.map +1 -0
  875. package/dist/tools/layout/inspect/inspect.utils.d.ts +200 -0
  876. package/dist/tools/layout/inspect/inspect.utils.d.ts.map +1 -0
  877. package/dist/tools/layout/inspect/inspect.utils.js +1104 -0
  878. package/dist/tools/layout/inspect/inspect.utils.js.map +1 -0
  879. package/dist/tools/layout/inspect/visual-extractors.schemas.d.ts +3372 -0
  880. package/dist/tools/layout/inspect/visual-extractors.schemas.d.ts.map +1 -0
  881. package/dist/tools/layout/inspect/visual-extractors.schemas.js +558 -0
  882. package/dist/tools/layout/inspect/visual-extractors.schemas.js.map +1 -0
  883. package/dist/tools/layout/inspect/visual-extractors.utils.d.ts +86 -0
  884. package/dist/tools/layout/inspect/visual-extractors.utils.d.ts.map +1 -0
  885. package/dist/tools/layout/inspect/visual-extractors.utils.js +231 -0
  886. package/dist/tools/layout/inspect/visual-extractors.utils.js.map +1 -0
  887. package/dist/tools/layout/schemas.d.ts +11074 -0
  888. package/dist/tools/layout/schemas.d.ts.map +1 -0
  889. package/dist/tools/layout/schemas.js +1497 -0
  890. package/dist/tools/layout/schemas.js.map +1 -0
  891. package/dist/tools/layout/search.tool.d.ts +470 -0
  892. package/dist/tools/layout/search.tool.d.ts.map +1 -0
  893. package/dist/tools/layout/search.tool.js +1582 -0
  894. package/dist/tools/layout/search.tool.js.map +1 -0
  895. package/dist/tools/layout/to-code.tool.d.ts +280 -0
  896. package/dist/tools/layout/to-code.tool.d.ts.map +1 -0
  897. package/dist/tools/layout/to-code.tool.js +317 -0
  898. package/dist/tools/layout/to-code.tool.js.map +1 -0
  899. package/dist/tools/motion/analyze-frames.handler.d.ts +157 -0
  900. package/dist/tools/motion/analyze-frames.handler.d.ts.map +1 -0
  901. package/dist/tools/motion/analyze-frames.handler.js +263 -0
  902. package/dist/tools/motion/analyze-frames.handler.js.map +1 -0
  903. package/dist/tools/motion/analyze-frames.schema.d.ts +4599 -0
  904. package/dist/tools/motion/analyze-frames.schema.d.ts.map +1 -0
  905. package/dist/tools/motion/analyze-frames.schema.js +420 -0
  906. package/dist/tools/motion/analyze-frames.schema.js.map +1 -0
  907. package/dist/tools/motion/css-mode-handler.d.ts +70 -0
  908. package/dist/tools/motion/css-mode-handler.d.ts.map +1 -0
  909. package/dist/tools/motion/css-mode-handler.js +754 -0
  910. package/dist/tools/motion/css-mode-handler.js.map +1 -0
  911. package/dist/tools/motion/detect.schemas.d.ts +14288 -0
  912. package/dist/tools/motion/detect.schemas.d.ts.map +1 -0
  913. package/dist/tools/motion/detect.schemas.js +1715 -0
  914. package/dist/tools/motion/detect.schemas.js.map +1 -0
  915. package/dist/tools/motion/detect.tool.d.ts +195 -0
  916. package/dist/tools/motion/detect.tool.d.ts.map +1 -0
  917. package/dist/tools/motion/detect.tool.js +1421 -0
  918. package/dist/tools/motion/detect.tool.js.map +1 -0
  919. package/dist/tools/motion/detection-modes.d.ts +72 -0
  920. package/dist/tools/motion/detection-modes.d.ts.map +1 -0
  921. package/dist/tools/motion/detection-modes.js +353 -0
  922. package/dist/tools/motion/detection-modes.js.map +1 -0
  923. package/dist/tools/motion/di-factories.d.ts +341 -0
  924. package/dist/tools/motion/di-factories.d.ts.map +1 -0
  925. package/dist/tools/motion/di-factories.js +376 -0
  926. package/dist/tools/motion/di-factories.js.map +1 -0
  927. package/dist/tools/motion/index.d.ts +12 -0
  928. package/dist/tools/motion/index.d.ts.map +1 -0
  929. package/dist/tools/motion/index.js +146 -0
  930. package/dist/tools/motion/index.js.map +1 -0
  931. package/dist/tools/motion/pattern-converter.d.ts +49 -0
  932. package/dist/tools/motion/pattern-converter.d.ts.map +1 -0
  933. package/dist/tools/motion/pattern-converter.js +493 -0
  934. package/dist/tools/motion/pattern-converter.js.map +1 -0
  935. package/dist/tools/motion/schemas.d.ts +10 -0
  936. package/dist/tools/motion/schemas.d.ts.map +1 -0
  937. package/dist/tools/motion/schemas.js +28 -0
  938. package/dist/tools/motion/schemas.js.map +1 -0
  939. package/dist/tools/motion/search.schemas.d.ts +7500 -0
  940. package/dist/tools/motion/search.schemas.d.ts.map +1 -0
  941. package/dist/tools/motion/search.schemas.js +596 -0
  942. package/dist/tools/motion/search.schemas.js.map +1 -0
  943. package/dist/tools/motion/search.tool.d.ts +416 -0
  944. package/dist/tools/motion/search.tool.d.ts.map +1 -0
  945. package/dist/tools/motion/search.tool.js +2088 -0
  946. package/dist/tools/motion/search.tool.js.map +1 -0
  947. package/dist/tools/motion/shared.schemas.d.ts +994 -0
  948. package/dist/tools/motion/shared.schemas.d.ts.map +1 -0
  949. package/dist/tools/motion/shared.schemas.js +354 -0
  950. package/dist/tools/motion/shared.schemas.js.map +1 -0
  951. package/dist/tools/narrative/analyze.tool.d.ts +96 -0
  952. package/dist/tools/narrative/analyze.tool.d.ts.map +1 -0
  953. package/dist/tools/narrative/analyze.tool.js +396 -0
  954. package/dist/tools/narrative/analyze.tool.js.map +1 -0
  955. package/dist/tools/narrative/index.d.ts +15 -0
  956. package/dist/tools/narrative/index.d.ts.map +1 -0
  957. package/dist/tools/narrative/index.js +83 -0
  958. package/dist/tools/narrative/index.js.map +1 -0
  959. package/dist/tools/narrative/schemas.d.ts +5553 -0
  960. package/dist/tools/narrative/schemas.d.ts.map +1 -0
  961. package/dist/tools/narrative/schemas.js +747 -0
  962. package/dist/tools/narrative/schemas.js.map +1 -0
  963. package/dist/tools/narrative/search.tool.d.ts +160 -0
  964. package/dist/tools/narrative/search.tool.d.ts.map +1 -0
  965. package/dist/tools/narrative/search.tool.js +434 -0
  966. package/dist/tools/narrative/search.tool.js.map +1 -0
  967. package/dist/tools/page/analyze.tool.d.ts +502 -0
  968. package/dist/tools/page/analyze.tool.d.ts.map +1 -0
  969. package/dist/tools/page/analyze.tool.js +875 -0
  970. package/dist/tools/page/analyze.tool.js.map +1 -0
  971. package/dist/tools/page/get-job-status.tool.d.ts +43 -0
  972. package/dist/tools/page/get-job-status.tool.d.ts.map +1 -0
  973. package/dist/tools/page/get-job-status.tool.js +178 -0
  974. package/dist/tools/page/get-job-status.tool.js.map +1 -0
  975. package/dist/tools/page/handlers/db-handler.d.ts +155 -0
  976. package/dist/tools/page/handlers/db-handler.d.ts.map +1 -0
  977. package/dist/tools/page/handlers/db-handler.js +368 -0
  978. package/dist/tools/page/handlers/db-handler.js.map +1 -0
  979. package/dist/tools/page/handlers/embedding-handler.d.ts +200 -0
  980. package/dist/tools/page/handlers/embedding-handler.d.ts.map +1 -0
  981. package/dist/tools/page/handlers/embedding-handler.js +541 -0
  982. package/dist/tools/page/handlers/embedding-handler.js.map +1 -0
  983. package/dist/tools/page/handlers/execution-status-tracker.d.ts +146 -0
  984. package/dist/tools/page/handlers/execution-status-tracker.d.ts.map +1 -0
  985. package/dist/tools/page/handlers/execution-status-tracker.js +348 -0
  986. package/dist/tools/page/handlers/execution-status-tracker.js.map +1 -0
  987. package/dist/tools/page/handlers/js-animation-handler.d.ts +197 -0
  988. package/dist/tools/page/handlers/js-animation-handler.d.ts.map +1 -0
  989. package/dist/tools/page/handlers/js-animation-handler.js +952 -0
  990. package/dist/tools/page/handlers/js-animation-handler.js.map +1 -0
  991. package/dist/tools/page/handlers/layout-handler.d.ts +31 -0
  992. package/dist/tools/page/handlers/layout-handler.d.ts.map +1 -0
  993. package/dist/tools/page/handlers/layout-handler.js +1181 -0
  994. package/dist/tools/page/handlers/layout-handler.js.map +1 -0
  995. package/dist/tools/page/handlers/motion-handler.d.ts +31 -0
  996. package/dist/tools/page/handlers/motion-handler.d.ts.map +1 -0
  997. package/dist/tools/page/handlers/motion-handler.js +940 -0
  998. package/dist/tools/page/handlers/motion-handler.js.map +1 -0
  999. package/dist/tools/page/handlers/narrative-handler.d.ts +23 -0
  1000. package/dist/tools/page/handlers/narrative-handler.d.ts.map +1 -0
  1001. package/dist/tools/page/handlers/narrative-handler.js +279 -0
  1002. package/dist/tools/page/handlers/narrative-handler.js.map +1 -0
  1003. package/dist/tools/page/handlers/phased-db-handler.d.ts +83 -0
  1004. package/dist/tools/page/handlers/phased-db-handler.d.ts.map +1 -0
  1005. package/dist/tools/page/handlers/phased-db-handler.js +120 -0
  1006. package/dist/tools/page/handlers/phased-db-handler.js.map +1 -0
  1007. package/dist/tools/page/handlers/phased-executor.d.ts +123 -0
  1008. package/dist/tools/page/handlers/phased-executor.d.ts.map +1 -0
  1009. package/dist/tools/page/handlers/phased-executor.js +205 -0
  1010. package/dist/tools/page/handlers/phased-executor.js.map +1 -0
  1011. package/dist/tools/page/handlers/quality-handler.d.ts +9 -0
  1012. package/dist/tools/page/handlers/quality-handler.d.ts.map +1 -0
  1013. package/dist/tools/page/handlers/quality-handler.js +100 -0
  1014. package/dist/tools/page/handlers/quality-handler.js.map +1 -0
  1015. package/dist/tools/page/handlers/result-builder.d.ts +105 -0
  1016. package/dist/tools/page/handlers/result-builder.d.ts.map +1 -0
  1017. package/dist/tools/page/handlers/result-builder.js +447 -0
  1018. package/dist/tools/page/handlers/result-builder.js.map +1 -0
  1019. package/dist/tools/page/handlers/retry-strategy.d.ts +106 -0
  1020. package/dist/tools/page/handlers/retry-strategy.d.ts.map +1 -0
  1021. package/dist/tools/page/handlers/retry-strategy.js +169 -0
  1022. package/dist/tools/page/handlers/retry-strategy.js.map +1 -0
  1023. package/dist/tools/page/handlers/sync-processing.d.ts +26 -0
  1024. package/dist/tools/page/handlers/sync-processing.d.ts.map +1 -0
  1025. package/dist/tools/page/handlers/sync-processing.js +1659 -0
  1026. package/dist/tools/page/handlers/sync-processing.js.map +1 -0
  1027. package/dist/tools/page/handlers/timeout-utils.d.ts +278 -0
  1028. package/dist/tools/page/handlers/timeout-utils.d.ts.map +1 -0
  1029. package/dist/tools/page/handlers/timeout-utils.js +600 -0
  1030. package/dist/tools/page/handlers/timeout-utils.js.map +1 -0
  1031. package/dist/tools/page/handlers/types.d.ts +1229 -0
  1032. package/dist/tools/page/handlers/types.d.ts.map +1 -0
  1033. package/dist/tools/page/handlers/types.js +21 -0
  1034. package/dist/tools/page/handlers/types.js.map +1 -0
  1035. package/dist/tools/page/handlers/video-handler.d.ts +11 -0
  1036. package/dist/tools/page/handlers/video-handler.d.ts.map +1 -0
  1037. package/dist/tools/page/handlers/video-handler.js +235 -0
  1038. package/dist/tools/page/handlers/video-handler.js.map +1 -0
  1039. package/dist/tools/page/handlers/webgl-animation-handler.d.ts +48 -0
  1040. package/dist/tools/page/handlers/webgl-animation-handler.d.ts.map +1 -0
  1041. package/dist/tools/page/handlers/webgl-animation-handler.js +237 -0
  1042. package/dist/tools/page/handlers/webgl-animation-handler.js.map +1 -0
  1043. package/dist/tools/page/handlers/webgl-detector.d.ts +184 -0
  1044. package/dist/tools/page/handlers/webgl-detector.d.ts.map +1 -0
  1045. package/dist/tools/page/handlers/webgl-detector.js +680 -0
  1046. package/dist/tools/page/handlers/webgl-detector.js.map +1 -0
  1047. package/dist/tools/page/handlers/webgl-domains.d.ts +133 -0
  1048. package/dist/tools/page/handlers/webgl-domains.d.ts.map +1 -0
  1049. package/dist/tools/page/handlers/webgl-domains.js +420 -0
  1050. package/dist/tools/page/handlers/webgl-domains.js.map +1 -0
  1051. package/dist/tools/page/handlers/webgl-pre-detector.d.ts +100 -0
  1052. package/dist/tools/page/handlers/webgl-pre-detector.d.ts.map +1 -0
  1053. package/dist/tools/page/handlers/webgl-pre-detector.js +248 -0
  1054. package/dist/tools/page/handlers/webgl-pre-detector.js.map +1 -0
  1055. package/dist/tools/page/index.d.ts +10 -0
  1056. package/dist/tools/page/index.d.ts.map +1 -0
  1057. package/dist/tools/page/index.js +84 -0
  1058. package/dist/tools/page/index.js.map +1 -0
  1059. package/dist/tools/page/input.schemas.d.ts +2223 -0
  1060. package/dist/tools/page/input.schemas.d.ts.map +1 -0
  1061. package/dist/tools/page/input.schemas.js +853 -0
  1062. package/dist/tools/page/input.schemas.js.map +1 -0
  1063. package/dist/tools/page/output.schemas.d.ts +26026 -0
  1064. package/dist/tools/page/output.schemas.d.ts.map +1 -0
  1065. package/dist/tools/page/output.schemas.js +1414 -0
  1066. package/dist/tools/page/output.schemas.js.map +1 -0
  1067. package/dist/tools/page/schemas.d.ts +10 -0
  1068. package/dist/tools/page/schemas.d.ts.map +1 -0
  1069. package/dist/tools/page/schemas.js +28 -0
  1070. package/dist/tools/page/schemas.js.map +1 -0
  1071. package/dist/tools/page/shared.schemas.d.ts +38 -0
  1072. package/dist/tools/page/shared.schemas.d.ts.map +1 -0
  1073. package/dist/tools/page/shared.schemas.js +69 -0
  1074. package/dist/tools/page/shared.schemas.js.map +1 -0
  1075. package/dist/tools/part/compare.tool.d.ts +106 -0
  1076. package/dist/tools/part/compare.tool.d.ts.map +1 -0
  1077. package/dist/tools/part/compare.tool.js +421 -0
  1078. package/dist/tools/part/compare.tool.js.map +1 -0
  1079. package/dist/tools/part/inspect.tool.d.ts +108 -0
  1080. package/dist/tools/part/inspect.tool.d.ts.map +1 -0
  1081. package/dist/tools/part/inspect.tool.js +279 -0
  1082. package/dist/tools/part/inspect.tool.js.map +1 -0
  1083. package/dist/tools/part/search.tool.d.ts +121 -0
  1084. package/dist/tools/part/search.tool.d.ts.map +1 -0
  1085. package/dist/tools/part/search.tool.js +381 -0
  1086. package/dist/tools/part/search.tool.js.map +1 -0
  1087. package/dist/tools/preference/get.tool.d.ts +74 -0
  1088. package/dist/tools/preference/get.tool.d.ts.map +1 -0
  1089. package/dist/tools/preference/get.tool.js +175 -0
  1090. package/dist/tools/preference/get.tool.js.map +1 -0
  1091. package/dist/tools/preference/hear.tool.d.ts +267 -0
  1092. package/dist/tools/preference/hear.tool.d.ts.map +1 -0
  1093. package/dist/tools/preference/hear.tool.js +268 -0
  1094. package/dist/tools/preference/hear.tool.js.map +1 -0
  1095. package/dist/tools/preference/index.d.ts +16 -0
  1096. package/dist/tools/preference/index.d.ts.map +1 -0
  1097. package/dist/tools/preference/index.js +43 -0
  1098. package/dist/tools/preference/index.js.map +1 -0
  1099. package/dist/tools/preference/reset.tool.d.ts +71 -0
  1100. package/dist/tools/preference/reset.tool.d.ts.map +1 -0
  1101. package/dist/tools/preference/reset.tool.js +205 -0
  1102. package/dist/tools/preference/reset.tool.js.map +1 -0
  1103. package/dist/tools/preference/schemas.d.ts +174 -0
  1104. package/dist/tools/preference/schemas.d.ts.map +1 -0
  1105. package/dist/tools/preference/schemas.js +142 -0
  1106. package/dist/tools/preference/schemas.js.map +1 -0
  1107. package/dist/tools/project-get.d.ts +42 -0
  1108. package/dist/tools/project-get.d.ts.map +1 -0
  1109. package/dist/tools/project-get.js +152 -0
  1110. package/dist/tools/project-get.js.map +1 -0
  1111. package/dist/tools/project-list.d.ts +66 -0
  1112. package/dist/tools/project-list.d.ts.map +1 -0
  1113. package/dist/tools/project-list.js +201 -0
  1114. package/dist/tools/project-list.js.map +1 -0
  1115. package/dist/tools/quality/batch-evaluate.tool.d.ts +101 -0
  1116. package/dist/tools/quality/batch-evaluate.tool.d.ts.map +1 -0
  1117. package/dist/tools/quality/batch-evaluate.tool.js +393 -0
  1118. package/dist/tools/quality/batch-evaluate.tool.js.map +1 -0
  1119. package/dist/tools/quality/evaluate-engine.d.ts +166 -0
  1120. package/dist/tools/quality/evaluate-engine.d.ts.map +1 -0
  1121. package/dist/tools/quality/evaluate-engine.js +1061 -0
  1122. package/dist/tools/quality/evaluate-engine.js.map +1 -0
  1123. package/dist/tools/quality/evaluate.tool.d.ts +286 -0
  1124. package/dist/tools/quality/evaluate.tool.d.ts.map +1 -0
  1125. package/dist/tools/quality/evaluate.tool.js +815 -0
  1126. package/dist/tools/quality/evaluate.tool.js.map +1 -0
  1127. package/dist/tools/quality/get-job-status.tool.d.ts +44 -0
  1128. package/dist/tools/quality/get-job-status.tool.d.ts.map +1 -0
  1129. package/dist/tools/quality/get-job-status.tool.js +291 -0
  1130. package/dist/tools/quality/get-job-status.tool.js.map +1 -0
  1131. package/dist/tools/quality/improvement-utils.d.ts +24 -0
  1132. package/dist/tools/quality/improvement-utils.d.ts.map +1 -0
  1133. package/dist/tools/quality/improvement-utils.js +307 -0
  1134. package/dist/tools/quality/improvement-utils.js.map +1 -0
  1135. package/dist/tools/quality/index.d.ts +11 -0
  1136. package/dist/tools/quality/index.d.ts.map +1 -0
  1137. package/dist/tools/quality/index.js +49 -0
  1138. package/dist/tools/quality/index.js.map +1 -0
  1139. package/dist/tools/quality/schemas.d.ts +14098 -0
  1140. package/dist/tools/quality/schemas.d.ts.map +1 -0
  1141. package/dist/tools/quality/schemas.js +950 -0
  1142. package/dist/tools/quality/schemas.js.map +1 -0
  1143. package/dist/tools/responsive/schemas.d.ts +156 -0
  1144. package/dist/tools/responsive/schemas.d.ts.map +1 -0
  1145. package/dist/tools/responsive/schemas.js +86 -0
  1146. package/dist/tools/responsive/schemas.js.map +1 -0
  1147. package/dist/tools/responsive/search.tool.d.ts +130 -0
  1148. package/dist/tools/responsive/search.tool.d.ts.map +1 -0
  1149. package/dist/tools/responsive/search.tool.js +324 -0
  1150. package/dist/tools/responsive/search.tool.js.map +1 -0
  1151. package/dist/tools/schemas/index.d.ts +10 -0
  1152. package/dist/tools/schemas/index.d.ts.map +1 -0
  1153. package/dist/tools/schemas/index.js +45 -0
  1154. package/dist/tools/schemas/index.js.map +1 -0
  1155. package/dist/tools/schemas/layout-schemas.d.ts +521 -0
  1156. package/dist/tools/schemas/layout-schemas.d.ts.map +1 -0
  1157. package/dist/tools/schemas/layout-schemas.js +281 -0
  1158. package/dist/tools/schemas/layout-schemas.js.map +1 -0
  1159. package/dist/tools/schemas/project-schemas.d.ts +417 -0
  1160. package/dist/tools/schemas/project-schemas.d.ts.map +1 -0
  1161. package/dist/tools/schemas/project-schemas.js +159 -0
  1162. package/dist/tools/schemas/project-schemas.js.map +1 -0
  1163. package/dist/tools/schemas/shared.d.ts +107 -0
  1164. package/dist/tools/schemas/shared.d.ts.map +1 -0
  1165. package/dist/tools/schemas/shared.js +150 -0
  1166. package/dist/tools/schemas/shared.js.map +1 -0
  1167. package/dist/tools/schemas/style-schemas.d.ts +114 -0
  1168. package/dist/tools/schemas/style-schemas.d.ts.map +1 -0
  1169. package/dist/tools/schemas/style-schemas.js +61 -0
  1170. package/dist/tools/schemas/style-schemas.js.map +1 -0
  1171. package/dist/tools/style-get-palette.d.ts +136 -0
  1172. package/dist/tools/style-get-palette.d.ts.map +1 -0
  1173. package/dist/tools/style-get-palette.js +259 -0
  1174. package/dist/tools/style-get-palette.js.map +1 -0
  1175. package/dist/tools/system-health.d.ts +255 -0
  1176. package/dist/tools/system-health.d.ts.map +1 -0
  1177. package/dist/tools/system-health.js +463 -0
  1178. package/dist/tools/system-health.js.map +1 -0
  1179. package/dist/transport.d.ts +29 -0
  1180. package/dist/transport.d.ts.map +1 -0
  1181. package/dist/transport.js +50 -0
  1182. package/dist/transport.js.map +1 -0
  1183. package/dist/types/creative/index.d.ts +8 -0
  1184. package/dist/types/creative/index.d.ts.map +1 -0
  1185. package/dist/types/creative/index.js +5 -0
  1186. package/dist/types/creative/index.js.map +1 -0
  1187. package/dist/types/creative/palette.d.ts +142 -0
  1188. package/dist/types/creative/palette.d.ts.map +1 -0
  1189. package/dist/types/creative/palette.js +5 -0
  1190. package/dist/types/creative/palette.js.map +1 -0
  1191. package/dist/types/reftrix-window.d.ts +124 -0
  1192. package/dist/types/reftrix-window.d.ts.map +1 -0
  1193. package/dist/types/reftrix-window.js +68 -0
  1194. package/dist/types/reftrix-window.js.map +1 -0
  1195. package/dist/utils/actionable-warning.d.ts +170 -0
  1196. package/dist/utils/actionable-warning.d.ts.map +1 -0
  1197. package/dist/utils/actionable-warning.js +818 -0
  1198. package/dist/utils/actionable-warning.js.map +1 -0
  1199. package/dist/utils/blank-image-detector.d.ts +22 -0
  1200. package/dist/utils/blank-image-detector.d.ts.map +1 -0
  1201. package/dist/utils/blank-image-detector.js +133 -0
  1202. package/dist/utils/blank-image-detector.js.map +1 -0
  1203. package/dist/utils/color.d.ts +203 -0
  1204. package/dist/utils/color.d.ts.map +1 -0
  1205. package/dist/utils/color.js +442 -0
  1206. package/dist/utils/color.js.map +1 -0
  1207. package/dist/utils/deprecation-warning.d.ts +43 -0
  1208. package/dist/utils/deprecation-warning.d.ts.map +1 -0
  1209. package/dist/utils/deprecation-warning.js +112 -0
  1210. package/dist/utils/deprecation-warning.js.map +1 -0
  1211. package/dist/utils/error-messages.d.ts +233 -0
  1212. package/dist/utils/error-messages.d.ts.map +1 -0
  1213. package/dist/utils/error-messages.js +721 -0
  1214. package/dist/utils/error-messages.js.map +1 -0
  1215. package/dist/utils/errors.d.ts +64 -0
  1216. package/dist/utils/errors.d.ts.map +1 -0
  1217. package/dist/utils/errors.js +82 -0
  1218. package/dist/utils/errors.js.map +1 -0
  1219. package/dist/utils/gpu-browser-args.d.ts +27 -0
  1220. package/dist/utils/gpu-browser-args.d.ts.map +1 -0
  1221. package/dist/utils/gpu-browser-args.js +42 -0
  1222. package/dist/utils/gpu-browser-args.js.map +1 -0
  1223. package/dist/utils/html-sanitizer.d.ts +116 -0
  1224. package/dist/utils/html-sanitizer.d.ts.map +1 -0
  1225. package/dist/utils/html-sanitizer.js +630 -0
  1226. package/dist/utils/html-sanitizer.js.map +1 -0
  1227. package/dist/utils/logger.d.ts +141 -0
  1228. package/dist/utils/logger.d.ts.map +1 -0
  1229. package/dist/utils/logger.js +249 -0
  1230. package/dist/utils/logger.js.map +1 -0
  1231. package/dist/utils/mcp-response.d.ts +317 -0
  1232. package/dist/utils/mcp-response.d.ts.map +1 -0
  1233. package/dist/utils/mcp-response.js +270 -0
  1234. package/dist/utils/mcp-response.js.map +1 -0
  1235. package/dist/utils/path-security.d.ts +73 -0
  1236. package/dist/utils/path-security.d.ts.map +1 -0
  1237. package/dist/utils/path-security.js +389 -0
  1238. package/dist/utils/path-security.js.map +1 -0
  1239. package/dist/utils/prisma-wrapper-factory.d.ts +152 -0
  1240. package/dist/utils/prisma-wrapper-factory.d.ts.map +1 -0
  1241. package/dist/utils/prisma-wrapper-factory.js +124 -0
  1242. package/dist/utils/prisma-wrapper-factory.js.map +1 -0
  1243. package/dist/utils/safe-parse-int.d.ts +41 -0
  1244. package/dist/utils/safe-parse-int.d.ts.map +1 -0
  1245. package/dist/utils/safe-parse-int.js +49 -0
  1246. package/dist/utils/safe-parse-int.js.map +1 -0
  1247. package/dist/utils/url-normalizer.d.ts +38 -0
  1248. package/dist/utils/url-normalizer.d.ts.map +1 -0
  1249. package/dist/utils/url-normalizer.js +103 -0
  1250. package/dist/utils/url-normalizer.js.map +1 -0
  1251. package/dist/utils/url-validator.d.ts +86 -0
  1252. package/dist/utils/url-validator.d.ts.map +1 -0
  1253. package/dist/utils/url-validator.js +533 -0
  1254. package/dist/utils/url-validator.js.map +1 -0
  1255. package/dist/workers/batch-quality-worker.d.ts +87 -0
  1256. package/dist/workers/batch-quality-worker.d.ts.map +1 -0
  1257. package/dist/workers/batch-quality-worker.js +300 -0
  1258. package/dist/workers/batch-quality-worker.js.map +1 -0
  1259. package/dist/workers/page-analyze-worker.d.ts +63 -0
  1260. package/dist/workers/page-analyze-worker.d.ts.map +1 -0
  1261. package/dist/workers/page-analyze-worker.js +872 -0
  1262. package/dist/workers/page-analyze-worker.js.map +1 -0
  1263. package/dist/workers/phases/phase-0-ingest.d.ts +42 -0
  1264. package/dist/workers/phases/phase-0-ingest.d.ts.map +1 -0
  1265. package/dist/workers/phases/phase-0-ingest.js +197 -0
  1266. package/dist/workers/phases/phase-0-ingest.js.map +1 -0
  1267. package/dist/workers/phases/phase-1-layout.d.ts +63 -0
  1268. package/dist/workers/phases/phase-1-layout.d.ts.map +1 -0
  1269. package/dist/workers/phases/phase-1-layout.js +362 -0
  1270. package/dist/workers/phases/phase-1-layout.js.map +1 -0
  1271. package/dist/workers/phases/phase-2-motion.d.ts +93 -0
  1272. package/dist/workers/phases/phase-2-motion.d.ts.map +1 -0
  1273. package/dist/workers/phases/phase-2-motion.js +408 -0
  1274. package/dist/workers/phases/phase-2-motion.js.map +1 -0
  1275. package/dist/workers/phases/phase-3-quality.d.ts +61 -0
  1276. package/dist/workers/phases/phase-3-quality.d.ts.map +1 -0
  1277. package/dist/workers/phases/phase-3-quality.js +191 -0
  1278. package/dist/workers/phases/phase-3-quality.js.map +1 -0
  1279. package/dist/workers/phases/phase-4-narrative.d.ts +37 -0
  1280. package/dist/workers/phases/phase-4-narrative.d.ts.map +1 -0
  1281. package/dist/workers/phases/phase-4-narrative.js +309 -0
  1282. package/dist/workers/phases/phase-4-narrative.js.map +1 -0
  1283. package/dist/workers/phases/phase-5-embedding.d.ts +56 -0
  1284. package/dist/workers/phases/phase-5-embedding.d.ts.map +1 -0
  1285. package/dist/workers/phases/phase-5-embedding.js +1350 -0
  1286. package/dist/workers/phases/phase-5-embedding.js.map +1 -0
  1287. package/dist/workers/phases/types.d.ts +411 -0
  1288. package/dist/workers/phases/types.d.ts.map +1 -0
  1289. package/dist/workers/phases/types.js +540 -0
  1290. package/dist/workers/phases/types.js.map +1 -0
  1291. package/package.json +117 -0
  1292. package/src/api/health.ts +372 -0
  1293. package/src/config/index.ts +12 -0
  1294. package/src/config/redis.ts +280 -0
  1295. package/src/index.ts +360 -0
  1296. package/src/lib/index.ts +9 -0
  1297. package/src/lib/project-context.ts +109 -0
  1298. package/src/middleware/args-type-coercion.ts +220 -0
  1299. package/src/middleware/auth.ts +558 -0
  1300. package/src/middleware/index.ts +56 -0
  1301. package/src/middleware/light-response-controller.ts +723 -0
  1302. package/src/middleware/response-size-warning.ts +196 -0
  1303. package/src/queues/batch-quality-queue.ts +580 -0
  1304. package/src/queues/index.ts +13 -0
  1305. package/src/queues/page-analyze-queue.ts +472 -0
  1306. package/src/router.ts +343 -0
  1307. package/src/schemas/creative/index.ts +34 -0
  1308. package/src/schemas/creative/palette.schema.ts +191 -0
  1309. package/src/schemas/mood-brandtone-filters.ts +306 -0
  1310. package/src/scripts/backfill-embeddings.ts +454 -0
  1311. package/src/scripts/check-embedding-coverage.ts +119 -0
  1312. package/src/scripts/start-workers.ts +560 -0
  1313. package/src/server.ts +290 -0
  1314. package/src/services/background/background-design-db.service.ts +206 -0
  1315. package/src/services/background/background-design-detector.service.ts +1442 -0
  1316. package/src/services/background/background-design-embedding.service.ts +599 -0
  1317. package/src/services/background-search.service.ts +372 -0
  1318. package/src/services/backup-service.ts +441 -0
  1319. package/src/services/brief/brief-parser-service.ts +435 -0
  1320. package/src/services/brief/schemas/brief-parser-schemas.ts +138 -0
  1321. package/src/services/browser-process-manager.ts +334 -0
  1322. package/src/services/cache.ts +297 -0
  1323. package/src/services/checksum-service.ts +293 -0
  1324. package/src/services/css-analysis-cache.service.ts +547 -0
  1325. package/src/services/database-dumper.service.ts +675 -0
  1326. package/src/services/embedding-backfill.service.ts +1055 -0
  1327. package/src/services/embedding-validation.service.ts +194 -0
  1328. package/src/services/encryption-service.ts +433 -0
  1329. package/src/services/external-css-fetcher.ts +872 -0
  1330. package/src/services/gpu-resource-manager.ts +615 -0
  1331. package/src/services/index.ts +169 -0
  1332. package/src/services/layout/component-splitter.ts +656 -0
  1333. package/src/services/layout/html-to-jsx-converter.ts +591 -0
  1334. package/src/services/layout/semantic-html-converter.ts +293 -0
  1335. package/src/services/layout/style-to-tailwind-mapper.ts +1530 -0
  1336. package/src/services/layout-embedding.service.ts +1552 -0
  1337. package/src/services/layout-generate-code-service-export.ts +109 -0
  1338. package/src/services/layout-search-service-export.ts +55 -0
  1339. package/src/services/layout-search.service.ts +933 -0
  1340. package/src/services/layout-to-code.service.ts +1631 -0
  1341. package/src/services/metrics-collector.ts +473 -0
  1342. package/src/services/ml/mood-brandtone-embedding.service.ts +1115 -0
  1343. package/src/services/motion/analyzers/color-change.analyzer.ts +935 -0
  1344. package/src/services/motion/analyzers/frame-diff.analyzer.ts +372 -0
  1345. package/src/services/motion/analyzers/layout-shift.detector.ts +296 -0
  1346. package/src/services/motion/analyzers/motion-vector.estimator.ts +698 -0
  1347. package/src/services/motion/analyzers/webgl-motion-analyzer.ts +700 -0
  1348. package/src/services/motion/animation-metrics-collector.service.ts +726 -0
  1349. package/src/services/motion/cls-calculator.service.ts +519 -0
  1350. package/src/services/motion/existing-animation-detector.service.ts +751 -0
  1351. package/src/services/motion/fade-detector.service.ts +383 -0
  1352. package/src/services/motion/frame-analysis-save.helper.ts +333 -0
  1353. package/src/services/motion/frame-capture.service.ts +654 -0
  1354. package/src/services/motion/frame-embedding.service.ts +1419 -0
  1355. package/src/services/motion/frame-image-analysis.service.ts +1271 -0
  1356. package/src/services/motion/frame-image-analyzer.adapter.ts +747 -0
  1357. package/src/services/motion/frame-worker-pool.service.ts +519 -0
  1358. package/src/services/motion/infrastructure/frame-loader.ts +450 -0
  1359. package/src/services/motion/js-animation-detector.ts +1563 -0
  1360. package/src/services/motion/js-animation-embedding.service.ts +423 -0
  1361. package/src/services/motion/js-animation-search.service.ts +715 -0
  1362. package/src/services/motion/motion-db.service.ts +952 -0
  1363. package/src/services/motion/three-js-scene-extractor.ts +1556 -0
  1364. package/src/services/motion/types.ts +820 -0
  1365. package/src/services/motion/visual-category-classifier.ts +1426 -0
  1366. package/src/services/motion/webgl-animation-categorizer.ts +761 -0
  1367. package/src/services/motion/webgl-animation-detector.service.ts +772 -0
  1368. package/src/services/motion/webgl-animation-embedding.service.ts +558 -0
  1369. package/src/services/motion-detect-service-export.ts +300 -0
  1370. package/src/services/motion-persistence.service.ts +541 -0
  1371. package/src/services/motion-search-service.ts +38 -0
  1372. package/src/services/motion-search.service.ts +1159 -0
  1373. package/src/services/narrative/analyzers/layout-structure.analyzer.ts +628 -0
  1374. package/src/services/narrative/analyzers/worldview.analyzer.ts +639 -0
  1375. package/src/services/narrative/generators/confidence-calculator.ts +419 -0
  1376. package/src/services/narrative/generators/text-representation.generator.ts +362 -0
  1377. package/src/services/narrative/index.ts +72 -0
  1378. package/src/services/narrative/narrative-analysis.service.ts +610 -0
  1379. package/src/services/narrative/narrative-search.service.ts +704 -0
  1380. package/src/services/narrative/types/narrative.types.ts +451 -0
  1381. package/src/services/orphaned-job-utils.ts +160 -0
  1382. package/src/services/page/css-animation-parser.service.ts +650 -0
  1383. package/src/services/page/fallback-analyzer.service.ts +435 -0
  1384. package/src/services/page/frame-analyzer.service.ts +824 -0
  1385. package/src/services/page/layout-analyzer.service.ts +2534 -0
  1386. package/src/services/page/motion-category-classifier.service.ts +463 -0
  1387. package/src/services/page/motion-detector.service.ts +430 -0
  1388. package/src/services/page/motion-performance-analyzer.service.ts +390 -0
  1389. package/src/services/page/playwright-crawler.service.ts +478 -0
  1390. package/src/services/page/quality-evaluator.service.ts +1473 -0
  1391. package/src/services/page/runtime-animation-detector.service.ts +743 -0
  1392. package/src/services/page/section-postprocessor.service.ts +874 -0
  1393. package/src/services/page/video-recorder.service.ts +516 -0
  1394. package/src/services/page/webgl-detector.service.ts +361 -0
  1395. package/src/services/page-analyze-service.ts +83 -0
  1396. package/src/services/page-ingest-adapter.ts +2256 -0
  1397. package/src/services/palette-service-export.ts +50 -0
  1398. package/src/services/part/index.ts +81 -0
  1399. package/src/services/part/part-backfill.service.ts +308 -0
  1400. package/src/services/part/part-bbox-playwright.service.ts +502 -0
  1401. package/src/services/part/part-db.service.ts +121 -0
  1402. package/src/services/part/part-embedding-db.service.ts +184 -0
  1403. package/src/services/part/part-embedding.service.ts +406 -0
  1404. package/src/services/part/part-extraction.service.ts +612 -0
  1405. package/src/services/part/part-search.service.ts +806 -0
  1406. package/src/services/part/schemas.ts +194 -0
  1407. package/src/services/part/section-screenshot-fallback.service.ts +644 -0
  1408. package/src/services/part/types.ts +299 -0
  1409. package/src/services/persistent-cache.ts +760 -0
  1410. package/src/services/preference-profile.service.ts +862 -0
  1411. package/src/services/preference-rerank.helper.ts +549 -0
  1412. package/src/services/production-guard.ts +423 -0
  1413. package/src/services/project-context-analyzer.ts +915 -0
  1414. package/src/services/quality/axe-accessibility.service.ts +253 -0
  1415. package/src/services/quality/axe-core-shared.ts +203 -0
  1416. package/src/services/quality/benchmark.service.ts +657 -0
  1417. package/src/services/quality/content-gap-detector.service.ts +485 -0
  1418. package/src/services/quality/index.ts +45 -0
  1419. package/src/services/quality/pattern-matcher.service.ts +941 -0
  1420. package/src/services/quality/playwright-axe.service.ts +343 -0
  1421. package/src/services/quality/quality-evaluate.service.interface.ts +262 -0
  1422. package/src/services/quality/visual-design-analyzer.service.ts +918 -0
  1423. package/src/services/quality-evaluate-service-export.ts +268 -0
  1424. package/src/services/quality-search.service.ts +406 -0
  1425. package/src/services/query-analyzer.ts +306 -0
  1426. package/src/services/query-context-analyzer.ts +843 -0
  1427. package/src/services/queue-cleanup.service.ts +376 -0
  1428. package/src/services/responsive/difference-detector.service.ts +647 -0
  1429. package/src/services/responsive/index.ts +64 -0
  1430. package/src/services/responsive/multi-viewport-capture.service.ts +943 -0
  1431. package/src/services/responsive/responsive-analysis-embedding.service.ts +413 -0
  1432. package/src/services/responsive/responsive-analysis.service.ts +325 -0
  1433. package/src/services/responsive/responsive-persistence.service.ts +133 -0
  1434. package/src/services/responsive/responsive-quality-evaluator.service.ts +515 -0
  1435. package/src/services/responsive/shared-browser-manager.ts +118 -0
  1436. package/src/services/responsive/types.ts +387 -0
  1437. package/src/services/responsive/viewport-diff.service.ts +236 -0
  1438. package/src/services/responsive-search.service.ts +230 -0
  1439. package/src/services/search/mood-brandtone-search.service.ts +400 -0
  1440. package/src/services/search-performance.service.ts +252 -0
  1441. package/src/services/section-screenshot.service.ts +581 -0
  1442. package/src/services/service-client.ts +643 -0
  1443. package/src/services/service-initializer.ts +1386 -0
  1444. package/src/services/storage/index.ts +15 -0
  1445. package/src/services/storage/local-storage.provider.ts +370 -0
  1446. package/src/services/style/index.ts +10 -0
  1447. package/src/services/style/palette-service.ts +655 -0
  1448. package/src/services/style/prisma-palette-repository.ts +216 -0
  1449. package/src/services/vision/brandtone.analyzer.ts +371 -0
  1450. package/src/services/vision/hardware-detector.ts +436 -0
  1451. package/src/services/vision/image-optimizer.ts +377 -0
  1452. package/src/services/vision/index.ts +131 -0
  1453. package/src/services/vision/llama-vision-adapter.ts +526 -0
  1454. package/src/services/vision/mcp-progress-adapter.ts +221 -0
  1455. package/src/services/vision/mood.analyzer.ts +332 -0
  1456. package/src/services/vision/ollama-readiness-probe.ts +271 -0
  1457. package/src/services/vision/ollama-vision-client.ts +631 -0
  1458. package/src/services/vision/progress-reporter.ts +377 -0
  1459. package/src/services/vision/scroll-vision-capture.service.ts +409 -0
  1460. package/src/services/vision/scroll-vision-persistence.service.ts +216 -0
  1461. package/src/services/vision/scroll-vision.analyzer.ts +416 -0
  1462. package/src/services/vision/theme.analyzer.ts +443 -0
  1463. package/src/services/vision/timeout-calculator.ts +155 -0
  1464. package/src/services/vision/vision-fallback.service.ts +368 -0
  1465. package/src/services/vision/vision.cache.ts +332 -0
  1466. package/src/services/vision/vision.errors.ts +186 -0
  1467. package/src/services/vision/vision.prompts.ts +298 -0
  1468. package/src/services/vision/vram-utils.ts +80 -0
  1469. package/src/services/vision-adapter/index.ts +71 -0
  1470. package/src/services/vision-adapter/interface.ts +911 -0
  1471. package/src/services/vision-adapter/llama-vision.adapter.ts +2254 -0
  1472. package/src/services/vision-adapter/llama-vision.prompts.ts +242 -0
  1473. package/src/services/vision-adapter/llama-vision.types.ts +103 -0
  1474. package/src/services/vision-adapter/local.adapter.ts +1079 -0
  1475. package/src/services/vision-adapter/mock.adapter.ts +978 -0
  1476. package/src/services/vision-embedding-search.service.ts +1071 -0
  1477. package/src/services/vision-embedding.service.ts +631 -0
  1478. package/src/services/visual/css-variable-extractor.service.ts +655 -0
  1479. package/src/services/visual/typography-extractor.service.ts +767 -0
  1480. package/src/services/visual-extractor/color-extractor.service.ts +397 -0
  1481. package/src/services/visual-extractor/density-calculator.service.ts +616 -0
  1482. package/src/services/visual-extractor/gradient-detector.service.ts +1794 -0
  1483. package/src/services/visual-extractor/image-utils.ts +333 -0
  1484. package/src/services/visual-extractor/pixel-theme-detector.service.ts +487 -0
  1485. package/src/services/visual-extractor/theme-detector.service.ts +697 -0
  1486. package/src/services/visual-extractor/visual-decoration-detector.service.ts +800 -0
  1487. package/src/services/visual-extractor/visual-feature-merger.service.ts +831 -0
  1488. package/src/services/web-page.service.ts +275 -0
  1489. package/src/services/worker-constants.ts +52 -0
  1490. package/src/services/worker-db-save.service.ts +1098 -0
  1491. package/src/services/worker-memory-monitor.service.ts +126 -0
  1492. package/src/services/worker-memory-profile.ts +336 -0
  1493. package/src/services/worker-stall-recovery.service.ts +486 -0
  1494. package/src/services/worker-supervisor.service.ts +746 -0
  1495. package/src/tools/background/schemas.ts +93 -0
  1496. package/src/tools/background/search.tool.ts +484 -0
  1497. package/src/tools/brief/index.ts +76 -0
  1498. package/src/tools/brief/schemas.ts +247 -0
  1499. package/src/tools/brief/validate.handler.ts +278 -0
  1500. package/src/tools/brief/validate.service.ts +409 -0
  1501. package/src/tools/common/error-codes.ts +116 -0
  1502. package/src/tools/common/index.ts +25 -0
  1503. package/src/tools/index.ts +723 -0
  1504. package/src/tools/layout/batch-ingest.tool.ts +466 -0
  1505. package/src/tools/layout/index.ts +72 -0
  1506. package/src/tools/layout/ingest.tool.ts +1564 -0
  1507. package/src/tools/layout/inspect/index.ts +49 -0
  1508. package/src/tools/layout/inspect/inspect.schemas.ts +518 -0
  1509. package/src/tools/layout/inspect/inspect.tool.ts +844 -0
  1510. package/src/tools/layout/inspect/inspect.utils.ts +1278 -0
  1511. package/src/tools/layout/inspect/visual-extractors.schemas.ts +642 -0
  1512. package/src/tools/layout/inspect/visual-extractors.utils.ts +328 -0
  1513. package/src/tools/layout/schemas.ts +1670 -0
  1514. package/src/tools/layout/search.tool.ts +2088 -0
  1515. package/src/tools/layout/to-code.tool.ts +503 -0
  1516. package/src/tools/motion/analyze-frames.handler.ts +388 -0
  1517. package/src/tools/motion/analyze-frames.schema.ts +484 -0
  1518. package/src/tools/motion/css-mode-handler.ts +939 -0
  1519. package/src/tools/motion/detect.schemas.ts +2005 -0
  1520. package/src/tools/motion/detect.tool.ts +1914 -0
  1521. package/src/tools/motion/detection-modes.ts +480 -0
  1522. package/src/tools/motion/di-factories.ts +767 -0
  1523. package/src/tools/motion/index.ts +229 -0
  1524. package/src/tools/motion/pattern-converter.ts +619 -0
  1525. package/src/tools/motion/schemas.ts +12 -0
  1526. package/src/tools/motion/search.schemas.ts +694 -0
  1527. package/src/tools/motion/search.tool.ts +2518 -0
  1528. package/src/tools/motion/shared.schemas.ts +414 -0
  1529. package/src/tools/narrative/PAGE_ANALYZE_INTEGRATION.md +249 -0
  1530. package/src/tools/narrative/analyze.tool.ts +460 -0
  1531. package/src/tools/narrative/index.ts +133 -0
  1532. package/src/tools/narrative/schemas.ts +886 -0
  1533. package/src/tools/narrative/search.tool.ts +536 -0
  1534. package/src/tools/page/analyze.tool.ts +992 -0
  1535. package/src/tools/page/get-job-status.tool.ts +217 -0
  1536. package/src/tools/page/handlers/db-handler.ts +638 -0
  1537. package/src/tools/page/handlers/embedding-handler.ts +813 -0
  1538. package/src/tools/page/handlers/execution-status-tracker.ts +461 -0
  1539. package/src/tools/page/handlers/js-animation-handler.ts +1229 -0
  1540. package/src/tools/page/handlers/layout-handler.ts +1423 -0
  1541. package/src/tools/page/handlers/motion-handler.ts +1156 -0
  1542. package/src/tools/page/handlers/narrative-handler.ts +345 -0
  1543. package/src/tools/page/handlers/phased-db-handler.ts +186 -0
  1544. package/src/tools/page/handlers/phased-executor.ts +356 -0
  1545. package/src/tools/page/handlers/quality-handler.ts +114 -0
  1546. package/src/tools/page/handlers/result-builder.ts +551 -0
  1547. package/src/tools/page/handlers/retry-strategy.ts +223 -0
  1548. package/src/tools/page/handlers/sync-processing.ts +2084 -0
  1549. package/src/tools/page/handlers/timeout-utils.ts +835 -0
  1550. package/src/tools/page/handlers/types.ts +1333 -0
  1551. package/src/tools/page/handlers/video-handler.ts +299 -0
  1552. package/src/tools/page/handlers/webgl-animation-handler.ts +309 -0
  1553. package/src/tools/page/handlers/webgl-detector.ts +833 -0
  1554. package/src/tools/page/handlers/webgl-domains.ts +482 -0
  1555. package/src/tools/page/handlers/webgl-pre-detector.ts +308 -0
  1556. package/src/tools/page/index.ts +142 -0
  1557. package/src/tools/page/input.schemas.ts +945 -0
  1558. package/src/tools/page/output.schemas.ts +1636 -0
  1559. package/src/tools/page/schemas.ts +12 -0
  1560. package/src/tools/page/shared.schemas.ts +86 -0
  1561. package/src/tools/part/compare.tool.ts +542 -0
  1562. package/src/tools/part/inspect.tool.ts +400 -0
  1563. package/src/tools/part/search.tool.ts +470 -0
  1564. package/src/tools/preference/get.tool.ts +238 -0
  1565. package/src/tools/preference/hear.tool.ts +504 -0
  1566. package/src/tools/preference/index.ts +65 -0
  1567. package/src/tools/preference/reset.tool.ts +264 -0
  1568. package/src/tools/preference/schemas.ts +161 -0
  1569. package/src/tools/project-get.ts +194 -0
  1570. package/src/tools/project-list.ts +240 -0
  1571. package/src/tools/quality/batch-evaluate.tool.ts +480 -0
  1572. package/src/tools/quality/evaluate-engine.ts +1329 -0
  1573. package/src/tools/quality/evaluate.tool.ts +981 -0
  1574. package/src/tools/quality/get-job-status.tool.ts +344 -0
  1575. package/src/tools/quality/improvement-utils.ts +361 -0
  1576. package/src/tools/quality/index.ts +49 -0
  1577. package/src/tools/quality/schemas.ts +1114 -0
  1578. package/src/tools/responsive/schemas.ts +103 -0
  1579. package/src/tools/responsive/search.tool.ts +421 -0
  1580. package/src/tools/schemas/index.ts +67 -0
  1581. package/src/tools/schemas/layout-schemas.ts +334 -0
  1582. package/src/tools/schemas/project-schemas.ts +233 -0
  1583. package/src/tools/schemas/shared.ts +176 -0
  1584. package/src/tools/schemas/style-schemas.ts +74 -0
  1585. package/src/tools/style-get-palette.ts +344 -0
  1586. package/src/tools/system-health.ts +729 -0
  1587. package/src/transport.ts +54 -0
  1588. package/src/types/creative/index.ts +22 -0
  1589. package/src/types/creative/palette.ts +197 -0
  1590. package/src/types/reftrix-window.ts +175 -0
  1591. package/src/utils/actionable-warning.ts +997 -0
  1592. package/src/utils/blank-image-detector.ts +143 -0
  1593. package/src/utils/color.ts +534 -0
  1594. package/src/utils/deprecation-warning.ts +146 -0
  1595. package/src/utils/error-messages.ts +965 -0
  1596. package/src/utils/errors.ts +95 -0
  1597. package/src/utils/gpu-browser-args.ts +41 -0
  1598. package/src/utils/html-sanitizer.ts +753 -0
  1599. package/src/utils/logger.ts +292 -0
  1600. package/src/utils/mcp-response.ts +397 -0
  1601. package/src/utils/path-security.ts +412 -0
  1602. package/src/utils/prisma-wrapper-factory.ts +283 -0
  1603. package/src/utils/safe-parse-int.ts +74 -0
  1604. package/src/utils/url-normalizer.ts +115 -0
  1605. package/src/utils/url-validator.ts +615 -0
  1606. package/src/workers/batch-quality-worker.ts +419 -0
  1607. package/src/workers/page-analyze-worker.ts +1056 -0
  1608. package/src/workers/phases/phase-0-ingest.ts +249 -0
  1609. package/src/workers/phases/phase-1-layout.ts +522 -0
  1610. package/src/workers/phases/phase-2-motion.ts +674 -0
  1611. package/src/workers/phases/phase-3-quality.ts +293 -0
  1612. package/src/workers/phases/phase-4-narrative.ts +409 -0
  1613. package/src/workers/phases/phase-5-embedding.ts +1816 -0
  1614. package/src/workers/phases/types.ts +909 -0
@@ -0,0 +1,2256 @@
1
+ // SPDX-FileCopyrightText: 2026 TKMD and Reftrix Contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+
4
+ /**
5
+ * PageIngestAdapter
6
+ * Playwrightを直接使用してWebページをインジェストするサービス
7
+ *
8
+ * Crawler依存を排除し、MCP Server内で完結するPlaywright統合
9
+ *
10
+ * @module services/page-ingest-adapter
11
+ */
12
+
13
+ import { chromium, type Browser, type Page, type BrowserContext } from "playwright";
14
+ import { logger, isDevelopment } from "../utils/logger";
15
+ import { GPU_BROWSER_BASE_ARGS } from "../utils/gpu-browser-args";
16
+ import { BrowserProcessManager } from "./browser-process-manager";
17
+ import { isUrlAllowedByRobotsTxt, ROBOTS_TXT } from "@reftrixmcp/core";
18
+ import { McpError, ErrorCode } from "../utils/errors";
19
+
20
+ // =============================================
21
+ // 型定義
22
+ // =============================================
23
+
24
+ /**
25
+ * ビューポート設定
26
+ */
27
+ export interface IngestViewport {
28
+ width: number;
29
+ height: number;
30
+ }
31
+
32
+ /**
33
+ * WebGL検出結果
34
+ */
35
+ export interface WebGLDetectionResult {
36
+ /** WebGLが検出されたか */
37
+ detected: boolean;
38
+ /** 検出されたCanvas要素の数 */
39
+ canvasCount: number;
40
+ /** WebGL 1.0コンテキスト数 */
41
+ webgl1Count: number;
42
+ /** WebGL 2.0コンテキスト数 */
43
+ webgl2Count: number;
44
+ /** Three.js検出 */
45
+ threeJsDetected: boolean;
46
+ /** 検出にかかった時間(ms) */
47
+ detectionTimeMs: number;
48
+ }
49
+
50
+ /**
51
+ * WebGL待機結果
52
+ */
53
+ export interface WebGLWaitResult {
54
+ /** 安定化に成功したか */
55
+ stable: boolean;
56
+ /** 待機時間(ms) */
57
+ waitTimeMs: number;
58
+ /** フレームレートが安定したか */
59
+ frameRateStable: boolean;
60
+ /** 最終フレームレート(fps) */
61
+ lastFrameRate?: number;
62
+ /** 理由 */
63
+ reason: "stable" | "timeout" | "no_webgl" | "error";
64
+ }
65
+
66
+ /**
67
+ * インジェストオプション
68
+ */
69
+ export interface IngestAdapterOptions {
70
+ /** フルページキャプチャ */
71
+ fullPage?: boolean;
72
+ /** ビューポート設定 */
73
+ viewport?: IngestViewport;
74
+ /** 待機セレクター */
75
+ waitForSelector?: string;
76
+ /** タイムアウト(ms) */
77
+ timeout?: number;
78
+ /** JavaScript無効化 */
79
+ disableJavaScript?: boolean;
80
+ /** ページ読み込み完了判定(デフォルト: 'load') */
81
+ waitUntil?: "load" | "domcontentloaded" | "networkidle";
82
+ /** DOM安定化待機(React/Vue/Next.js対応) */
83
+ waitForDomStable?: boolean;
84
+ /** DOM安定化判定の無変更時間(ms)(デフォルト: 500) */
85
+ domStableTimeout?: number;
86
+ /** ローディング完了後の追加待機時間(ms) */
87
+ waitForTimeout?: number;
88
+ /** 非表示待機セレクター(ローディング要素など) */
89
+ waitForSelectorHidden?: string;
90
+ /** コンテンツ表示待機セレクター(実際のコンテンツが表示されるまで待機) */
91
+ waitForContentVisible?: string;
92
+ /** ユーザーインタラクション模倣(マウス移動でローディング解除するサイト対応) */
93
+ simulateUserInteraction?: boolean;
94
+ /** スクリーンショットをスキップ */
95
+ skipScreenshot?: boolean;
96
+ /** Computed Styles取得(デフォルトfalse、パフォーマンス考慮) */
97
+ includeComputedStyles?: boolean;
98
+ /** ソースタイプ */
99
+ sourceType?: "award_gallery" | "user_provided";
100
+ /** 利用範囲 */
101
+ usageScope?: "inspiration_only" | "owned_asset";
102
+ /** スクリーンショットオプション */
103
+ screenshotOptions?: {
104
+ format?: "png" | "jpeg";
105
+ quality?: number;
106
+ };
107
+ /**
108
+ * WebGL/3Dサイトの自動検出と適応的待機
109
+ * Canvas要素とWebGLコンテキストを検出し、フレームレート安定化を待機
110
+ * @default true
111
+ */
112
+ adaptiveWebGLWait?: boolean;
113
+ /**
114
+ * WebGL検出時の追加待機時間(ms)
115
+ * requestAnimationFrame同期後に追加で待機する時間
116
+ * @default 5000
117
+ */
118
+ webglExtraWaitMs?: number;
119
+ /**
120
+ * WebGLを完全に無効化
121
+ * 重い3Dサイト(Three.js、WebGL等)でタイムアウトが発生する場合に使用
122
+ * true設定時: 専用ブラウザインスタンスを起動し、WebGL関連機能を無効化
123
+ * @default false
124
+ */
125
+ disableWebGL?: boolean;
126
+ /**
127
+ * タイムアウト時にブラウザプロセスを強制終了
128
+ * WebGLサイトでハングした場合の最終手段として使用
129
+ * @default false
130
+ */
131
+ forceKillOnTimeout?: boolean;
132
+ /**
133
+ * GPU有効化モード(WebGL重サイト向け)
134
+ * --use-angle=gl, --enable-gpu-rasterization, --ignore-gpu-blocklist を設定
135
+ * WebGL重サイト(Linear、Vercel、Notion等)のレンダリングパフォーマンス向上に使用
136
+ * disableWebGL: trueと同時指定された場合はdisableWebGLが優先される
137
+ * @default false
138
+ */
139
+ enableGPU?: boolean;
140
+ /**
141
+ * WebGL待機モード(Phase1-2)
142
+ * Canvas要素の出現を待機し、WebGL初期化完了まで追加待機
143
+ * networkidleが永遠に完了しないWebGLサイト向けの最適化
144
+ * enableGPU: trueと組み合わせて使用推奨
145
+ * @default false
146
+ */
147
+ waitForWebGL?: boolean;
148
+ /**
149
+ * WebGL待機時間(ミリ秒)
150
+ * waitForWebGL: true時のCanvas検出後の追加待機時間
151
+ * @default 3000
152
+ */
153
+ webglWaitMs?: number;
154
+ /**
155
+ * robots.txtを尊重するかどうか(RFC 9309)
156
+ * true: クロール前にrobots.txtを確認し、拒否された場合はエラー
157
+ * false: robots.txtを無視してクロール
158
+ * undefined: 環境変数REFTRIX_RESPECT_ROBOTS_TXTの設定に従う(デフォルト有効)
159
+ */
160
+ respectRobotsTxt?: boolean;
161
+ }
162
+
163
+ /**
164
+ * ソース情報
165
+ */
166
+ export interface IngestSourceInfo {
167
+ type: "award_gallery" | "user_provided";
168
+ usageScope: "inspiration_only" | "owned_asset";
169
+ awardSite?: "cssda" | "fwa" | "awwwards";
170
+ }
171
+
172
+ /**
173
+ * ページメタデータ
174
+ */
175
+ export interface IngestPageMetadata {
176
+ title: string;
177
+ description?: string | undefined;
178
+ ogImage?: string | undefined;
179
+ favicon?: string | undefined;
180
+ lang?: string | undefined;
181
+ canonical?: string | undefined;
182
+ keywords?: string[] | undefined;
183
+ }
184
+
185
+ /**
186
+ * ビューポート情報
187
+ */
188
+ export interface IngestViewportInfo {
189
+ documentWidth: number;
190
+ documentHeight: number;
191
+ viewportWidth: number;
192
+ viewportHeight: number;
193
+ scrollHeight: number;
194
+ }
195
+
196
+ /**
197
+ * スクリーンショット結果
198
+ */
199
+ export interface IngestScreenshotResult {
200
+ viewportName: string;
201
+ viewport: IngestViewport;
202
+ data: string;
203
+ format: "png" | "jpeg";
204
+ fullPage: boolean;
205
+ size: number;
206
+ }
207
+
208
+ /**
209
+ * 要素のComputed Styles
210
+ * 取得するCSSプロパティのセット
211
+ */
212
+ export interface ElementComputedStyles {
213
+ // 背景
214
+ backgroundColor: string;
215
+ backgroundImage: string;
216
+ // テキスト
217
+ color: string;
218
+ fontSize: string;
219
+ fontFamily: string;
220
+ fontWeight: string;
221
+ lineHeight: string;
222
+ letterSpacing: string;
223
+ textAlign: string;
224
+ textDecoration: string;
225
+ textTransform: string;
226
+ // レイアウト
227
+ display: string;
228
+ position: string;
229
+ flexDirection: string;
230
+ justifyContent: string;
231
+ alignItems: string;
232
+ padding: string;
233
+ paddingTop: string;
234
+ paddingRight: string;
235
+ paddingBottom: string;
236
+ paddingLeft: string;
237
+ margin: string;
238
+ marginTop: string;
239
+ marginRight: string;
240
+ marginBottom: string;
241
+ marginLeft: string;
242
+ gap: string;
243
+ width: string;
244
+ height: string;
245
+ maxWidth: string;
246
+ minHeight: string;
247
+ // 視覚効果
248
+ border: string;
249
+ borderRadius: string;
250
+ boxShadow: string;
251
+ backdropFilter: string;
252
+ opacity: string;
253
+ overflow: string;
254
+ // トランジション・アニメーション
255
+ transition: string;
256
+ transform: string;
257
+ }
258
+
259
+ /**
260
+ * 子要素のComputed Styles情報
261
+ */
262
+ export interface ChildElementStyleInfo {
263
+ /** CSSセレクタ(ユニーク識別用) */
264
+ selector: string;
265
+ /** HTML要素タグ名 */
266
+ tagName: string;
267
+ /** class属性値 */
268
+ className: string;
269
+ /** 親セクションからの相対パス */
270
+ path: string;
271
+ /** 要素のテキストコンテンツ(ボタンやリンクの場合) */
272
+ textContent?: string;
273
+ /** Computed Styles */
274
+ styles: ElementComputedStyles;
275
+ }
276
+
277
+ /**
278
+ * Computed Styles for a section element
279
+ * ブラウザがレンダリングした実際のスタイル値
280
+ */
281
+ export interface ComputedStyleInfo {
282
+ /** セクションのインデックス */
283
+ index: number;
284
+ /** HTML要素タグ名 */
285
+ tagName: string;
286
+ /** class属性値 */
287
+ className: string;
288
+ /** id属性値 */
289
+ id: string;
290
+ /** role属性値 */
291
+ role: string;
292
+ /** セクション自体のComputed Styles */
293
+ styles: ElementComputedStyles;
294
+ /** セクション内の子要素のスタイル(重要な要素のみ) */
295
+ children?: ChildElementStyleInfo[];
296
+ }
297
+
298
+ /**
299
+ * インジェスト警告
300
+ */
301
+ export interface IngestWarning {
302
+ code: string;
303
+ message: string;
304
+ }
305
+
306
+ /**
307
+ * インジェスト結果
308
+ */
309
+ export interface IngestResult {
310
+ success: boolean;
311
+ error?: string;
312
+ url: string;
313
+ finalUrl: string;
314
+ html: string;
315
+ htmlSize: number;
316
+ screenshots?: IngestScreenshotResult[];
317
+ /** セクション要素のComputed Styles(include_computed_styles: true時のみ) */
318
+ computedStyles?: ComputedStyleInfo[];
319
+ viewportInfo: IngestViewportInfo;
320
+ metadata: IngestPageMetadata;
321
+ ingestedAt: Date;
322
+ source: IngestSourceInfo;
323
+ /** WebGL検出結果(adaptiveWebGLWait=true時のみ) */
324
+ webglDetection?: WebGLDetectionResult;
325
+ /** WebGL待機結果(WebGL検出時のみ) */
326
+ webglWait?: WebGLWaitResult;
327
+ /** 警告(Graceful Degradation時など) */
328
+ warnings?: IngestWarning[];
329
+ }
330
+
331
+ // =============================================
332
+ // DNS リトライ定数・関数
333
+ // =============================================
334
+
335
+ /**
336
+ * DNS関連エラーのリトライ設定
337
+ *
338
+ * ローカルDNSリゾルバ(systemd-resolved等)が断続的にEAI_AGAINを返す
339
+ * 環境に対応するため、DNS解決エラー時のみリトライを行う。
340
+ */
341
+ export const DNS_RETRY_CONFIG = {
342
+ /** 最大リトライ回数 */
343
+ MAX_RETRIES: 3,
344
+ /** 基本遅延(ms) - exponential backoffの基本値 */
345
+ BASE_DELAY_MS: 5000,
346
+ /** 最大遅延(ms) - exponential backoffの上限 */
347
+ MAX_DELAY_MS: 20000,
348
+ } as const;
349
+
350
+ /**
351
+ * リトライ可能なDNS関連エラーパターン
352
+ *
353
+ * NXDOMAINは永続的なエラー(ドメインが存在しない)のためリトライ対象外。
354
+ * 一時的なDNSリゾルバ障害のみリトライする。
355
+ */
356
+ const DNS_ERROR_PATTERNS = [
357
+ "ERR_NAME_NOT_RESOLVED",
358
+ "ERR_NAME_RESOLUTION_FAILED",
359
+ "EAI_AGAIN",
360
+ "ENOTFOUND",
361
+ ] as const;
362
+
363
+ /**
364
+ * エラーがリトライ可能なDNS関連エラーかどうかを判定する
365
+ *
366
+ * NXDOMAINは永続的エラー(ドメインが存在しない)のため対象外。
367
+ * 一時的なDNSリゾルバ障害(EAI_AGAIN, ERR_NAME_NOT_RESOLVED等)のみリトライ。
368
+ *
369
+ * @param error - 判定するエラー
370
+ * @returns DNS関連の一時的エラーであればtrue
371
+ */
372
+ export function isDnsRelatedError(error: unknown): boolean {
373
+ if (error === null || error === undefined) {
374
+ return false;
375
+ }
376
+
377
+ const message = error instanceof Error ? error.message : "";
378
+ if (!message) {
379
+ return false;
380
+ }
381
+
382
+ return DNS_ERROR_PATTERNS.some((pattern) => message.includes(pattern));
383
+ }
384
+
385
+ /**
386
+ * リトライ遅延を計算する(exponential backoff)
387
+ *
388
+ * @param attempt - リトライ試行番号(0-indexed)
389
+ * @returns 遅延時間(ms)
390
+ */
391
+ export function calculateRetryDelay(attempt: number): number {
392
+ const delay = DNS_RETRY_CONFIG.BASE_DELAY_MS * Math.pow(2, attempt);
393
+ return Math.min(delay, DNS_RETRY_CONFIG.MAX_DELAY_MS);
394
+ }
395
+
396
+ // =============================================
397
+ // 定数
398
+ // =============================================
399
+
400
+ /**
401
+ * デフォルトタイムアウト(ms)
402
+ */
403
+ const DEFAULT_TIMEOUT = 30000;
404
+
405
+ /**
406
+ * デフォルトビューポート
407
+ */
408
+ const DEFAULT_VIEWPORT: IngestViewport = {
409
+ width: 1920,
410
+ height: 1080,
411
+ };
412
+
413
+ /** Lazy Loadingスクロール最小ステップ幅(px) / Min scroll step for lazy loading (px) */
414
+ const LAZY_SCROLL_MIN_STEP_PX = 500;
415
+ /** Lazy Loadingスクロール最大反復回数 / Max lazy loading scroll iterations */
416
+ const LAZY_SCROLL_MAX_ITERATIONS = 50;
417
+ /** スクロール後描画安定待ち(ms) / Paint stabilization wait after scroll (ms) */
418
+ const LAZY_SCROLL_STABILIZE_MS = 500;
419
+ /** rAFタイムアウト(ms) / requestAnimationFrame timeout (ms) */
420
+ const RAF_TIMEOUT_MS = 2000;
421
+
422
+ /**
423
+ * WebGL関連定数
424
+ */
425
+ const WEBGL_CONSTANTS = {
426
+ /** デフォルトの追加待機時間(ms) */
427
+ DEFAULT_EXTRA_WAIT_MS: 5000,
428
+ /** フレームレート安定化の最大待機時間(ms) */
429
+ MAX_FRAME_RATE_WAIT_MS: 10000,
430
+ /** 安定判定に必要な連続安定フレーム数 */
431
+ STABLE_FRAME_COUNT: 3,
432
+ /** 最小許容フレームレート(fps) */
433
+ MIN_STABLE_FPS: 20,
434
+ /** 最大許容フレームレート(fps) */
435
+ MAX_STABLE_FPS: 120,
436
+ /** フレーム間隔の許容変動率(±50%) */
437
+ FRAME_INTERVAL_TOLERANCE: 0.5,
438
+ /** waitForWebGLモードのCanvas検出タイムアウト(ms) */
439
+ CANVAS_WAIT_TIMEOUT_MS: 10000,
440
+ /** waitForWebGLモードのデフォルト待機時間(ms) */
441
+ DEFAULT_WEBGL_WAIT_MS: 3000,
442
+ } as const;
443
+
444
+ /**
445
+ * 操作レベルタイムアウト定数(WebGLサイト用)
446
+ */
447
+ const OPERATION_TIMEOUTS = {
448
+ /** page.content()のタイムアウト(ms) */
449
+ CONTENT_EXTRACTION: 30000,
450
+ /** metadata抽出のタイムアウト(ms) */
451
+ METADATA_EXTRACTION: 15000,
452
+ /** viewport情報取得のタイムアウト(ms) */
453
+ VIEWPORT_INFO: 10000,
454
+ /** WebGLサイト用のタイムアウト乗数(通常の2倍) */
455
+ WEBGL_MULTIPLIER: 2,
456
+ } as const;
457
+
458
+ // =============================================
459
+ // ヘルパー関数
460
+ // =============================================
461
+
462
+ /**
463
+ * Promiseにタイムアウトを追加
464
+ * WebGLサイトなど重い処理がハングする場合の保護
465
+ *
466
+ * @param promise - 実行するPromise
467
+ * @param timeoutMs - タイムアウト時間(ms)
468
+ * @param operationName - 操作名(エラーメッセージ用)
469
+ * @returns Promise結果またはタイムアウトエラー
470
+ */
471
+ async function withTimeout<T>(
472
+ promise: Promise<T>,
473
+ timeoutMs: number,
474
+ operationName: string
475
+ ): Promise<T> {
476
+ let timeoutId: ReturnType<typeof setTimeout>;
477
+
478
+ const timeoutPromise = new Promise<never>((_, reject) => {
479
+ timeoutId = setTimeout(() => {
480
+ reject(new Error(`Operation '${operationName}' timed out after ${timeoutMs}ms`));
481
+ }, timeoutMs);
482
+ });
483
+
484
+ try {
485
+ const result = await Promise.race([promise, timeoutPromise]);
486
+ clearTimeout(timeoutId!);
487
+ return result;
488
+ } catch (error) {
489
+ clearTimeout(timeoutId!);
490
+ throw error;
491
+ }
492
+ }
493
+
494
+ // =============================================
495
+ // PageIngestAdapter クラス
496
+ // =============================================
497
+
498
+ /**
499
+ * ページインジェストアダプター
500
+ *
501
+ * Playwrightを使用してWebページをキャプチャする
502
+ *
503
+ * @example
504
+ * ```typescript
505
+ * const result = await pageIngestAdapter.ingest({
506
+ * url: 'https://example.com',
507
+ * fullPage: true,
508
+ * timeout: 30000,
509
+ * });
510
+ * ```
511
+ */
512
+ class PageIngestAdapter {
513
+ private browser: Browser | null = null;
514
+
515
+ /**
516
+ * ローディング要素の完全非表示を待機(CSS opacity/visibility対応)
517
+ *
518
+ * Playwrightの`state: 'hidden'`はCSSアニメーション(opacity変化)を検知しないため、
519
+ * JavaScript でcomputed styleを直接チェックする
520
+ *
521
+ * @param page - Playwrightページ
522
+ * @param selector - ローディング要素のセレクター(カンマ区切り複数可)
523
+ * @param timeout - 最大待機時間(ms)
524
+ */
525
+ private async waitForLoadingElementHidden(
526
+ page: Page,
527
+ selector: string,
528
+ timeout: number = 30000
529
+ ): Promise<{ hidden: boolean; waitTime: number; reason: string }> {
530
+ const startTime = Date.now();
531
+
532
+ // セレクターを分割(カンマ区切り対応)
533
+ const selectors = selector
534
+ .split(",")
535
+ .map((s) => s.trim())
536
+ .filter(Boolean);
537
+
538
+ const result = await page.evaluate(
539
+ `(async function() {
540
+ var startTime = Date.now();
541
+ var timeout = ${timeout};
542
+ var selectors = ${JSON.stringify(selectors)};
543
+ var checkInterval = 100; // 100ms間隔でチェック
544
+
545
+ function isElementHidden(el) {
546
+ if (!el) return true;
547
+
548
+ var style = window.getComputedStyle(el);
549
+
550
+ // display: none
551
+ if (style.display === 'none') return true;
552
+
553
+ // visibility: hidden
554
+ if (style.visibility === 'hidden') return true;
555
+
556
+ // opacity: 0 (またはほぼ0)
557
+ var opacity = parseFloat(style.opacity);
558
+ if (opacity < 0.01) return true;
559
+
560
+ // サイズが0
561
+ var rect = el.getBoundingClientRect();
562
+ if (rect.width === 0 || rect.height === 0) return true;
563
+
564
+ // pointer-events: none かつ opacity < 0.1 はフェードアウト中とみなす
565
+ if (style.pointerEvents === 'none' && opacity < 0.1) return true;
566
+
567
+ return false;
568
+ }
569
+
570
+ function checkAllHidden() {
571
+ for (var i = 0; i < selectors.length; i++) {
572
+ var elements = document.querySelectorAll(selectors[i]);
573
+ for (var j = 0; j < elements.length; j++) {
574
+ if (!isElementHidden(elements[j])) {
575
+ return false; // まだ可視の要素がある
576
+ }
577
+ }
578
+ }
579
+ return true; // すべて非表示(または要素なし)
580
+ }
581
+
582
+ return new Promise(function(resolve) {
583
+ // 初回チェック
584
+ if (checkAllHidden()) {
585
+ resolve({
586
+ hidden: true,
587
+ waitTime: Date.now() - startTime,
588
+ reason: 'already_hidden'
589
+ });
590
+ return;
591
+ }
592
+
593
+ // ポーリングでチェック
594
+ var intervalId = setInterval(function() {
595
+ if (checkAllHidden()) {
596
+ clearInterval(intervalId);
597
+ resolve({
598
+ hidden: true,
599
+ waitTime: Date.now() - startTime,
600
+ reason: 'became_hidden'
601
+ });
602
+ return;
603
+ }
604
+
605
+ if (Date.now() - startTime >= timeout) {
606
+ clearInterval(intervalId);
607
+ resolve({
608
+ hidden: false,
609
+ waitTime: Date.now() - startTime,
610
+ reason: 'timeout'
611
+ });
612
+ }
613
+ }, checkInterval);
614
+ });
615
+ })()`
616
+ );
617
+
618
+ const typedResult = result as { hidden: boolean; waitTime: number; reason: string };
619
+
620
+ if (isDevelopment()) {
621
+ logger.debug("[PageIngestAdapter] Loading element visibility check", {
622
+ hidden: typedResult.hidden,
623
+ waitTime: typedResult.waitTime,
624
+ reason: typedResult.reason,
625
+ elapsedTotal: Date.now() - startTime,
626
+ });
627
+ }
628
+
629
+ return typedResult;
630
+ }
631
+
632
+ /**
633
+ * DOM安定化を待機(React/Vue/Next.js ハイドレーション対応)
634
+ *
635
+ * MutationObserverを使用してDOMの変更を監視し、
636
+ * 指定時間内に変更がなくなったら安定したと判断
637
+ *
638
+ * @param page - Playwrightページ
639
+ * @param stableTimeout - 安定判定の無変更時間(ms)
640
+ * @param maxWait - 最大待機時間(ms)
641
+ */
642
+ private async waitForDomStable(
643
+ page: Page,
644
+ stableTimeout: number = 500,
645
+ maxWait: number = 10000
646
+ ): Promise<{ stable: boolean; mutations: number; waitTime: number }> {
647
+ if (isDevelopment()) {
648
+ logger.debug("[PageIngestAdapter] Waiting for DOM to stabilize...", {
649
+ stableTimeout,
650
+ maxWait,
651
+ });
652
+ }
653
+
654
+ const result = await page.evaluate(
655
+ `(async function() {
656
+ const stableTimeout = ${stableTimeout};
657
+ const maxWait = ${maxWait};
658
+ const startTime = Date.now();
659
+ let mutationCount = 0;
660
+ let lastMutationTime = Date.now();
661
+
662
+ return new Promise((resolve) => {
663
+ // 最大待機タイムアウト
664
+ const maxWaitTimer = setTimeout(() => {
665
+ observer.disconnect();
666
+ resolve({
667
+ stable: false,
668
+ mutations: mutationCount,
669
+ waitTime: Date.now() - startTime,
670
+ reason: 'max_wait_exceeded'
671
+ });
672
+ }, maxWait);
673
+
674
+ // 安定化チェック用インターバル
675
+ const checkInterval = setInterval(() => {
676
+ const timeSinceLastMutation = Date.now() - lastMutationTime;
677
+ if (timeSinceLastMutation >= stableTimeout) {
678
+ clearInterval(checkInterval);
679
+ clearTimeout(maxWaitTimer);
680
+ observer.disconnect();
681
+ resolve({
682
+ stable: true,
683
+ mutations: mutationCount,
684
+ waitTime: Date.now() - startTime,
685
+ reason: 'dom_stable'
686
+ });
687
+ }
688
+ }, 100);
689
+
690
+ // MutationObserver設定
691
+ const observer = new MutationObserver((mutations) => {
692
+ // 重要な変更のみカウント(テキストノードの軽微な変更を除外)
693
+ const significantMutations = mutations.filter(m => {
694
+ // 追加・削除されたノードがある
695
+ if (m.addedNodes.length > 0 || m.removedNodes.length > 0) {
696
+ // スクリプトタグやスタイルタグは除外
697
+ for (const node of m.addedNodes) {
698
+ if (node.nodeType === 1) {
699
+ const el = node;
700
+ if (el.tagName !== 'SCRIPT' && el.tagName !== 'STYLE') {
701
+ return true;
702
+ }
703
+ }
704
+ }
705
+ for (const node of m.removedNodes) {
706
+ if (node.nodeType === 1) {
707
+ const el = node;
708
+ if (el.tagName !== 'SCRIPT' && el.tagName !== 'STYLE') {
709
+ return true;
710
+ }
711
+ }
712
+ }
713
+ return false;
714
+ }
715
+ // 属性変更(class, style等)
716
+ if (m.type === 'attributes') {
717
+ return true;
718
+ }
719
+ return false;
720
+ });
721
+
722
+ if (significantMutations.length > 0) {
723
+ mutationCount += significantMutations.length;
724
+ lastMutationTime = Date.now();
725
+ }
726
+ });
727
+
728
+ observer.observe(document.body || document.documentElement, {
729
+ childList: true,
730
+ subtree: true,
731
+ attributes: true,
732
+ attributeFilter: ['class', 'style', 'data-loaded', 'data-hydrated'],
733
+ });
734
+ });
735
+ })()`
736
+ );
737
+
738
+ const typedResult = result as {
739
+ stable: boolean;
740
+ mutations: number;
741
+ waitTime: number;
742
+ reason?: string;
743
+ };
744
+
745
+ if (isDevelopment()) {
746
+ logger.info("[PageIngestAdapter] DOM stability check completed", {
747
+ stable: typedResult.stable,
748
+ mutations: typedResult.mutations,
749
+ waitTime: typedResult.waitTime,
750
+ reason: typedResult.reason,
751
+ });
752
+ }
753
+
754
+ return typedResult;
755
+ }
756
+
757
+ /**
758
+ * WebGL/Canvas要素を検出
759
+ *
760
+ * Canvas要素とWebGLコンテキストの存在を確認し、
761
+ * Three.js等の3Dライブラリの検出も行う
762
+ *
763
+ * @param page - Playwrightページ
764
+ * @returns WebGL検出結果
765
+ */
766
+ private async detectWebGL(page: Page): Promise<WebGLDetectionResult> {
767
+ const startTime = Date.now();
768
+
769
+ if (isDevelopment()) {
770
+ logger.debug("[PageIngestAdapter] Detecting WebGL/Canvas elements...");
771
+ }
772
+
773
+ const result = await page.evaluate(`
774
+ (function() {
775
+ var canvases = document.querySelectorAll('canvas');
776
+ var webgl1Count = 0;
777
+ var webgl2Count = 0;
778
+
779
+ // 各Canvasに対してWebGLコンテキストをチェック
780
+ for (var i = 0; i < canvases.length; i++) {
781
+ var canvas = canvases[i];
782
+ try {
783
+ // WebGL2をまず試行
784
+ var gl2 = canvas.getContext('webgl2');
785
+ if (gl2) {
786
+ webgl2Count++;
787
+ continue;
788
+ }
789
+ // WebGL1を試行
790
+ var gl1 = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
791
+ if (gl1) {
792
+ webgl1Count++;
793
+ }
794
+ } catch (e) {
795
+ // コンテキスト取得エラーは無視
796
+ }
797
+ }
798
+
799
+ // Three.js検出
800
+ var threeJsDetected = !!(
801
+ window.THREE ||
802
+ window.__THREE__ ||
803
+ window.__THREE_DEVTOOLS__ ||
804
+ document.querySelector('[data-three]') ||
805
+ document.querySelector('[data-engine*="three"]')
806
+ );
807
+
808
+ // R3F (React Three Fiber) 検出
809
+ if (!threeJsDetected) {
810
+ threeJsDetected = !!(
811
+ document.querySelector('[class*="r3f"]') ||
812
+ document.querySelector('[data-r3f]')
813
+ );
814
+ }
815
+
816
+ return {
817
+ detected: canvases.length > 0 && (webgl1Count > 0 || webgl2Count > 0),
818
+ canvasCount: canvases.length,
819
+ webgl1Count: webgl1Count,
820
+ webgl2Count: webgl2Count,
821
+ threeJsDetected: threeJsDetected
822
+ };
823
+ })()
824
+ `);
825
+
826
+ const typedResult = result as Omit<WebGLDetectionResult, "detectionTimeMs">;
827
+ const detectionTimeMs = Date.now() - startTime;
828
+
829
+ if (isDevelopment()) {
830
+ logger.info("[PageIngestAdapter] WebGL detection completed", {
831
+ ...typedResult,
832
+ detectionTimeMs,
833
+ });
834
+ }
835
+
836
+ return {
837
+ ...typedResult,
838
+ detectionTimeMs,
839
+ };
840
+ }
841
+
842
+ /**
843
+ * requestAnimationFrameでフレームレート安定化を待機
844
+ *
845
+ * WebGLサイトの初期化完了を判定するため、
846
+ * 3フレーム連続で安定したフレームレート(20-120fps)になるまで待機
847
+ *
848
+ * @param page - Playwrightページ
849
+ * @param maxWaitMs - 最大待機時間(ms)
850
+ * @returns WebGL待機結果
851
+ */
852
+ private async waitForStableFrameRate(
853
+ page: Page,
854
+ maxWaitMs: number = WEBGL_CONSTANTS.MAX_FRAME_RATE_WAIT_MS
855
+ ): Promise<WebGLWaitResult> {
856
+ const startTime = Date.now();
857
+
858
+ if (isDevelopment()) {
859
+ logger.debug("[PageIngestAdapter] Waiting for stable frame rate...", {
860
+ maxWaitMs,
861
+ });
862
+ }
863
+
864
+ try {
865
+ const result = await page.evaluate(
866
+ `(async function() {
867
+ var maxWait = ${maxWaitMs};
868
+ var startTime = performance.now();
869
+ var stableFrameCount = ${WEBGL_CONSTANTS.STABLE_FRAME_COUNT};
870
+ var minFps = ${WEBGL_CONSTANTS.MIN_STABLE_FPS};
871
+ var maxFps = ${WEBGL_CONSTANTS.MAX_STABLE_FPS};
872
+ var tolerance = ${WEBGL_CONSTANTS.FRAME_INTERVAL_TOLERANCE};
873
+
874
+ // フレーム間隔の期待値(60fps基準: 16.67ms)
875
+ var expectedInterval = 1000 / 60;
876
+ var minInterval = 1000 / maxFps; // 8.33ms (120fps)
877
+ var maxInterval = 1000 / minFps; // 50ms (20fps)
878
+
879
+ return new Promise(function(resolve) {
880
+ var frameCount = 0;
881
+ var lastTime = performance.now();
882
+ var stableFrames = 0;
883
+ var lastFps = 0;
884
+ var rafId = null;
885
+
886
+ function checkFrame(currentTime) {
887
+ var now = currentTime || performance.now();
888
+ var delta = now - lastTime;
889
+ lastTime = now;
890
+ frameCount++;
891
+
892
+ // 初回フレームはスキップ
893
+ if (frameCount === 1) {
894
+ rafId = requestAnimationFrame(checkFrame);
895
+ return;
896
+ }
897
+
898
+ // フレームレートを計算
899
+ var currentFps = delta > 0 ? 1000 / delta : 0;
900
+ lastFps = currentFps;
901
+
902
+ // 安定判定: フレーム間隔が許容範囲内か
903
+ var isStable = delta >= minInterval && delta <= maxInterval;
904
+
905
+ // さらに厳密に: 前回との変動率をチェック
906
+ if (frameCount > 2 && isStable) {
907
+ isStable = true;
908
+ }
909
+
910
+ if (isStable) {
911
+ stableFrames++;
912
+ } else {
913
+ stableFrames = 0;
914
+ }
915
+
916
+ // 安定判定達成
917
+ if (stableFrames >= stableFrameCount) {
918
+ cancelAnimationFrame(rafId);
919
+ resolve({
920
+ stable: true,
921
+ waitTimeMs: Math.round(now - startTime),
922
+ frameRateStable: true,
923
+ lastFrameRate: Math.round(lastFps),
924
+ reason: 'stable'
925
+ });
926
+ return;
927
+ }
928
+
929
+ // タイムアウトチェック
930
+ if (now - startTime >= maxWait) {
931
+ cancelAnimationFrame(rafId);
932
+ resolve({
933
+ stable: false,
934
+ waitTimeMs: Math.round(now - startTime),
935
+ frameRateStable: false,
936
+ lastFrameRate: Math.round(lastFps),
937
+ reason: 'timeout'
938
+ });
939
+ return;
940
+ }
941
+
942
+ rafId = requestAnimationFrame(checkFrame);
943
+ }
944
+
945
+ rafId = requestAnimationFrame(checkFrame);
946
+ });
947
+ })()`
948
+ );
949
+
950
+ const typedResult = result as WebGLWaitResult;
951
+
952
+ if (isDevelopment()) {
953
+ logger.info("[PageIngestAdapter] Frame rate stabilization check completed", {
954
+ ...typedResult,
955
+ totalElapsed: Date.now() - startTime,
956
+ });
957
+ }
958
+
959
+ return typedResult;
960
+ } catch (error) {
961
+ const errorMessage = error instanceof Error ? error.message : String(error);
962
+
963
+ if (isDevelopment()) {
964
+ logger.warn("[PageIngestAdapter] Frame rate check failed", {
965
+ error: errorMessage,
966
+ elapsed: Date.now() - startTime,
967
+ });
968
+ }
969
+
970
+ return {
971
+ stable: false,
972
+ waitTimeMs: Date.now() - startTime,
973
+ frameRateStable: false,
974
+ reason: "error",
975
+ };
976
+ }
977
+ }
978
+
979
+ /**
980
+ * WebGL初期化完了を待機(適応的待機戦略)
981
+ *
982
+ * 1. WebGL/Canvas検出
983
+ * 2. 検出時: requestAnimationFrame同期で安定化待機
984
+ * 3. 必要に応じてnetworkidleにフォールバック
985
+ * 4. 追加の固定待機時間
986
+ *
987
+ * @param page - Playwrightページ
988
+ * @param options - インジェストオプション
989
+ * @param warnings - 警告配列(Graceful Degradation時に追加)
990
+ * @returns WebGL検出・待機結果
991
+ */
992
+ private async waitForWebGLReady(
993
+ page: Page,
994
+ options: IngestAdapterOptions,
995
+ warnings: IngestWarning[]
996
+ ): Promise<{
997
+ detection: WebGLDetectionResult;
998
+ wait?: WebGLWaitResult;
999
+ }> {
1000
+ // Step 1: WebGL検出
1001
+ const detection = await this.detectWebGL(page);
1002
+
1003
+ // WebGL未検出の場合は早期リターン
1004
+ if (!detection.detected) {
1005
+ if (isDevelopment()) {
1006
+ logger.debug("[PageIngestAdapter] No WebGL detected, skipping adaptive wait");
1007
+ }
1008
+ return { detection };
1009
+ }
1010
+
1011
+ // Step 2: フレームレート安定化待機
1012
+ const maxWaitMs = Math.min(
1013
+ WEBGL_CONSTANTS.MAX_FRAME_RATE_WAIT_MS,
1014
+ (options.timeout ?? DEFAULT_TIMEOUT) / 3
1015
+ );
1016
+
1017
+ const waitResult = await this.waitForStableFrameRate(page, maxWaitMs);
1018
+
1019
+ // Step 3: Graceful Degradation - 安定化失敗時は警告を追加
1020
+ if (!waitResult.stable) {
1021
+ warnings.push({
1022
+ code: "WEBGL_FRAME_RATE_UNSTABLE",
1023
+ message: `WebGL frame rate not stabilized after ${waitResult.waitTimeMs}ms, continuing with current state`,
1024
+ });
1025
+
1026
+ if (isDevelopment()) {
1027
+ logger.warn(
1028
+ "[PageIngestAdapter] WebGL frame rate not stabilized, continuing with current state",
1029
+ {
1030
+ waitResult,
1031
+ }
1032
+ );
1033
+ }
1034
+ }
1035
+
1036
+ // Step 4: 追加の固定待機時間
1037
+ const extraWaitMs = options.webglExtraWaitMs ?? WEBGL_CONSTANTS.DEFAULT_EXTRA_WAIT_MS;
1038
+ if (extraWaitMs > 0) {
1039
+ if (isDevelopment()) {
1040
+ logger.debug("[PageIngestAdapter] Additional WebGL wait", { extraWaitMs });
1041
+ }
1042
+ await page.waitForTimeout(extraWaitMs);
1043
+ }
1044
+
1045
+ return { detection, wait: waitResult };
1046
+ }
1047
+
1048
+ /**
1049
+ * 共有ブラウザインスタンスを取得(Worker pipeline用)
1050
+ * PageIngestAdapterが管理するシングルトンブラウザを外部サービスと共有し、
1051
+ * Chromiumプロセス数を削減する(4→1)
1052
+ */
1053
+ public async getSharedBrowser(): Promise<Browser> {
1054
+ return this.getBrowser();
1055
+ }
1056
+
1057
+ /**
1058
+ * ブラウザを起動(遅延初期化)
1059
+ *
1060
+ * v0.1.0改善:
1061
+ * - ブラウザが閉じられている場合を検出し、自動的に再起動
1062
+ * - isConnected()チェックで陳腐化した参照を検出
1063
+ *
1064
+ * v0.1.0セキュリティ改善:
1065
+ * - --no-sandboxを削除(セキュリティリスク軽減)
1066
+ * - --gpu-sandbox-start-earlyを追加(GPUプロセスのサンドボックス強化)
1067
+ */
1068
+ private async getBrowser(): Promise<Browser> {
1069
+ // ブラウザが存在するが閉じられている場合は参照をクリア
1070
+ if (this.browser && !this.browser.isConnected()) {
1071
+ if (isDevelopment()) {
1072
+ logger.warn("[PageIngestAdapter] Browser disconnected, will re-launch...");
1073
+ }
1074
+ this.browser = null;
1075
+ }
1076
+
1077
+ if (!this.browser) {
1078
+ if (isDevelopment()) {
1079
+ logger.info("[PageIngestAdapter] Launching Chromium browser...");
1080
+ }
1081
+ this.browser = await chromium.launch({
1082
+ headless: true,
1083
+ args: [
1084
+ "--disable-gpu",
1085
+ "--disable-dev-shm-usage",
1086
+ "--disable-setuid-sandbox",
1087
+ // セキュリティ強化: --no-sandboxを削除し、GPUサンドボックスを早期起動
1088
+ "--gpu-sandbox-start-early",
1089
+ ],
1090
+ });
1091
+ }
1092
+ return this.browser;
1093
+ }
1094
+
1095
+ /**
1096
+ * GPU有効化ブラウザを起動(専用インスタンス、共有しない)
1097
+ * WebGL重サイト(Linear、Vercel、Notion等)のレンダリングパフォーマンス向上のため使用
1098
+ * --use-angle=glでOpenGL ESバックエンドを使用し、GPUアクセラレーションを有効化
1099
+ * このブラウザは使用後に必ず閉じる必要がある
1100
+ *
1101
+ * Phase1-1: GPU有効化オプション追加
1102
+ */
1103
+ private async launchGPUEnabledBrowser(): Promise<Browser> {
1104
+ if (isDevelopment()) {
1105
+ logger.info("[PageIngestAdapter] Launching GPU-enabled Chromium browser...");
1106
+ }
1107
+ return chromium.launch({
1108
+ headless: true,
1109
+ args: [...GPU_BROWSER_BASE_ARGS],
1110
+ });
1111
+ }
1112
+
1113
+ /**
1114
+ * WebGL無効化ブラウザを起動(専用インスタンス、共有しない)
1115
+ * 重い3Dサイトでハングを防止するため、WebGL関連機能を完全に無効化
1116
+ * このブラウザは使用後に必ず閉じる必要がある
1117
+ */
1118
+ private async launchWebGLDisabledBrowser(): Promise<Browser> {
1119
+ if (isDevelopment()) {
1120
+ logger.info("[PageIngestAdapter] Launching WebGL-disabled Chromium browser...");
1121
+ }
1122
+ return chromium.launch({
1123
+ headless: true,
1124
+ args: [
1125
+ // 標準のセキュリティ/パフォーマンス設定
1126
+ "--disable-gpu",
1127
+ "--disable-dev-shm-usage",
1128
+ "--disable-setuid-sandbox",
1129
+ // セキュリティ強化: --no-sandboxを削除し、GPUサンドボックスを早期起動
1130
+ "--gpu-sandbox-start-early",
1131
+ // WebGL/3D関連を完全に無効化
1132
+ "--disable-webgl",
1133
+ "--disable-webgl2",
1134
+ "--disable-3d-apis",
1135
+ "--disable-software-rasterizer",
1136
+ "--disable-accelerated-2d-canvas",
1137
+ "--disable-accelerated-video-decode",
1138
+ // 追加のパフォーマンス最適化
1139
+ "--disable-background-timer-throttling",
1140
+ "--disable-renderer-backgrounding",
1141
+ // タイムアウト強制用
1142
+ "--disable-hang-monitor",
1143
+ ],
1144
+ });
1145
+ }
1146
+
1147
+ /**
1148
+ * ページからメタデータを抽出
1149
+ */
1150
+ private async extractMetadata(page: Page): Promise<IngestPageMetadata> {
1151
+ // page.evaluate内でTypeScriptヘルパー関数(__name)が使用されないよう、
1152
+ // シンプルな構造で記述
1153
+ const result = await page.evaluate(`
1154
+ (function() {
1155
+ function getMetaContent(name) {
1156
+ var el = document.querySelector('meta[name="' + name + '"]') ||
1157
+ document.querySelector('meta[property="' + name + '"]');
1158
+ return el ? el.getAttribute('content') : undefined;
1159
+ }
1160
+
1161
+ function getFavicon() {
1162
+ var link = document.querySelector('link[rel="icon"]') ||
1163
+ document.querySelector('link[rel="shortcut icon"]');
1164
+ return link ? link.getAttribute('href') : undefined;
1165
+ }
1166
+
1167
+ var canonicalEl = document.querySelector('link[rel="canonical"]');
1168
+ var keywordsStr = getMetaContent('keywords');
1169
+
1170
+ return {
1171
+ title: document.title || '',
1172
+ description: getMetaContent('description') || getMetaContent('og:description'),
1173
+ ogImage: getMetaContent('og:image'),
1174
+ favicon: getFavicon(),
1175
+ lang: document.documentElement.lang || undefined,
1176
+ canonical: canonicalEl ? canonicalEl.getAttribute('href') : undefined,
1177
+ keywords: keywordsStr ? keywordsStr.split(',').map(function(k) { return k.trim(); }) : undefined,
1178
+ };
1179
+ })()
1180
+ `);
1181
+ return result as IngestPageMetadata;
1182
+ }
1183
+
1184
+ /**
1185
+ * ビューポート情報を取得
1186
+ */
1187
+ private async getViewportInfo(page: Page, viewport: IngestViewport): Promise<IngestViewportInfo> {
1188
+ // page.evaluate内でTypeScriptヘルパー関数(__name)が使用されないよう、
1189
+ // 文字列形式で記述し、パラメータは別途渡す
1190
+ const result = await page.evaluate(`
1191
+ (function() {
1192
+ return {
1193
+ documentWidth: document.documentElement.scrollWidth,
1194
+ documentHeight: document.documentElement.scrollHeight,
1195
+ viewportWidth: ${viewport.width},
1196
+ viewportHeight: ${viewport.height},
1197
+ scrollHeight: document.body ? document.body.scrollHeight : 0,
1198
+ };
1199
+ })()
1200
+ `);
1201
+ return result as IngestViewportInfo;
1202
+ }
1203
+
1204
+ /**
1205
+ * セクション要素とその子要素のComputed Stylesを抽出
1206
+ *
1207
+ * ブラウザがレンダリングした実際のスタイル値を取得し、
1208
+ * デザインの正確な再現を可能にする
1209
+ *
1210
+ * 取得する子要素:
1211
+ * - 見出し: h1-h6
1212
+ * - ボタン: button, a.btn, [role="button"]
1213
+ * - リンク: a(主要なもの)
1214
+ * - 入力: input, select, textarea
1215
+ * - コンテナ: div(直接の子のみ、display: flex/gridのもの)
1216
+ * - 画像: img
1217
+ * - 段落: p(最初の3つのみ)
1218
+ *
1219
+ * @param page - Playwrightページ
1220
+ * @returns Computed Styles配列
1221
+ */
1222
+ private async extractComputedStyles(page: Page): Promise<ComputedStyleInfo[]> {
1223
+ if (isDevelopment()) {
1224
+ logger.debug("[PageIngestAdapter] Extracting computed styles...");
1225
+ }
1226
+
1227
+ const result = await page.evaluate(`
1228
+ (function() {
1229
+ // ユニークなセレクタを生成
1230
+ function getUniqueSelector(el) {
1231
+ if (el.id) {
1232
+ return '#' + el.id;
1233
+ }
1234
+ if (el.className && typeof el.className === 'string') {
1235
+ var classes = el.className.trim().split(/\\s+/).filter(function(c) {
1236
+ return c.length > 0 && !c.startsWith('_') && c.length < 50;
1237
+ }).slice(0, 3);
1238
+ if (classes.length > 0) {
1239
+ return el.tagName.toLowerCase() + '.' + classes.join('.');
1240
+ }
1241
+ }
1242
+ return el.tagName.toLowerCase();
1243
+ }
1244
+
1245
+ // 親セクションからの相対パスを取得
1246
+ function getRelativePath(el, sectionEl) {
1247
+ var path = [];
1248
+ var current = el;
1249
+ while (current && current !== sectionEl) {
1250
+ var tagName = current.tagName.toLowerCase();
1251
+ var siblings = current.parentElement ? Array.from(current.parentElement.children).filter(function(s) {
1252
+ return s.tagName === current.tagName;
1253
+ }) : [];
1254
+ if (siblings.length > 1) {
1255
+ var index = siblings.indexOf(current) + 1;
1256
+ path.unshift(tagName + '[' + index + ']');
1257
+ } else {
1258
+ path.unshift(tagName);
1259
+ }
1260
+ current = current.parentElement;
1261
+ }
1262
+ return path.join(' > ');
1263
+ }
1264
+
1265
+ // 要素のComputed Stylesを取得
1266
+ function getElementStyles(el) {
1267
+ var style = window.getComputedStyle(el);
1268
+ return {
1269
+ // 背景
1270
+ backgroundColor: style.backgroundColor,
1271
+ backgroundImage: style.backgroundImage,
1272
+ // テキスト
1273
+ color: style.color,
1274
+ fontSize: style.fontSize,
1275
+ fontFamily: style.fontFamily,
1276
+ fontWeight: style.fontWeight,
1277
+ lineHeight: style.lineHeight,
1278
+ letterSpacing: style.letterSpacing,
1279
+ textAlign: style.textAlign,
1280
+ textDecoration: style.textDecoration,
1281
+ textTransform: style.textTransform,
1282
+ // レイアウト
1283
+ display: style.display,
1284
+ position: style.position,
1285
+ flexDirection: style.flexDirection,
1286
+ justifyContent: style.justifyContent,
1287
+ alignItems: style.alignItems,
1288
+ padding: style.padding,
1289
+ paddingTop: style.paddingTop,
1290
+ paddingRight: style.paddingRight,
1291
+ paddingBottom: style.paddingBottom,
1292
+ paddingLeft: style.paddingLeft,
1293
+ margin: style.margin,
1294
+ marginTop: style.marginTop,
1295
+ marginRight: style.marginRight,
1296
+ marginBottom: style.marginBottom,
1297
+ marginLeft: style.marginLeft,
1298
+ gap: style.gap,
1299
+ width: style.width,
1300
+ height: style.height,
1301
+ maxWidth: style.maxWidth,
1302
+ minHeight: style.minHeight,
1303
+ // 視覚効果
1304
+ border: style.border,
1305
+ borderRadius: style.borderRadius,
1306
+ boxShadow: style.boxShadow,
1307
+ backdropFilter: style.backdropFilter,
1308
+ opacity: style.opacity,
1309
+ overflow: style.overflow,
1310
+ // トランジション・アニメーション
1311
+ transition: style.transition,
1312
+ transform: style.transform
1313
+ };
1314
+ }
1315
+
1316
+ // 子要素のスタイルを取得
1317
+ function getChildrenStyles(sectionEl, maxChildren) {
1318
+ var children = [];
1319
+ var childSelectors = 'h1, h2, h3, h4, h5, h6, button, a[href], input, select, textarea, img, p, [role="button"], [class*="btn"], [class*="button"]';
1320
+ var childElements = sectionEl.querySelectorAll(childSelectors);
1321
+
1322
+ // 直接の子divでflex/gridレイアウトのものも追加
1323
+ var directDivs = Array.from(sectionEl.children).filter(function(el) {
1324
+ if (el.tagName !== 'DIV') return false;
1325
+ var style = window.getComputedStyle(el);
1326
+ return style.display === 'flex' || style.display === 'grid';
1327
+ });
1328
+
1329
+ var allElements = Array.from(childElements).concat(directDivs);
1330
+ var processed = new Set();
1331
+
1332
+ // 段落は最初の3つのみ
1333
+ var pCount = 0;
1334
+ var MAX_P = 3;
1335
+
1336
+ for (var i = 0; i < allElements.length && children.length < maxChildren; i++) {
1337
+ var el = allElements[i];
1338
+
1339
+ // 重複チェック
1340
+ if (processed.has(el)) continue;
1341
+ processed.add(el);
1342
+
1343
+ // 非表示要素はスキップ
1344
+ var style = window.getComputedStyle(el);
1345
+ if (style.display === 'none' || style.visibility === 'hidden') continue;
1346
+
1347
+ // 段落の制限
1348
+ if (el.tagName === 'P') {
1349
+ if (pCount >= MAX_P) continue;
1350
+ pCount++;
1351
+ }
1352
+
1353
+ var textContent = '';
1354
+ if (el.tagName === 'BUTTON' || el.tagName === 'A' || el.getAttribute('role') === 'button') {
1355
+ textContent = (el.textContent || '').trim().substring(0, 100);
1356
+ } else if (el.tagName.match(/^H[1-6]$/)) {
1357
+ textContent = (el.textContent || '').trim().substring(0, 200);
1358
+ }
1359
+
1360
+ children.push({
1361
+ selector: getUniqueSelector(el),
1362
+ tagName: el.tagName,
1363
+ className: el.className || '',
1364
+ path: getRelativePath(el, sectionEl),
1365
+ textContent: textContent || undefined,
1366
+ styles: getElementStyles(el)
1367
+ });
1368
+ }
1369
+
1370
+ return children;
1371
+ }
1372
+
1373
+ var sectionSelectors = 'section, header, footer, main, nav, article, aside, [role="banner"], [role="main"], [role="contentinfo"], [role="navigation"]';
1374
+ var sections = document.querySelectorAll(sectionSelectors);
1375
+ var MAX_CHILDREN_PER_SECTION = 30;
1376
+
1377
+ return Array.from(sections).map(function(el, index) {
1378
+ var children = getChildrenStyles(el, MAX_CHILDREN_PER_SECTION);
1379
+
1380
+ return {
1381
+ index: index,
1382
+ tagName: el.tagName,
1383
+ className: el.className || '',
1384
+ id: el.id || '',
1385
+ role: el.getAttribute('role') || '',
1386
+ styles: getElementStyles(el),
1387
+ children: children.length > 0 ? children : undefined
1388
+ };
1389
+ });
1390
+ })()
1391
+ `);
1392
+
1393
+ const computedStyles = result as ComputedStyleInfo[];
1394
+
1395
+ if (isDevelopment()) {
1396
+ const totalChildren = computedStyles.reduce((sum, s) => sum + (s.children?.length ?? 0), 0);
1397
+ logger.debug("[PageIngestAdapter] Computed styles extracted", {
1398
+ sectionCount: computedStyles.length,
1399
+ totalChildElements: totalChildren,
1400
+ });
1401
+ }
1402
+
1403
+ return computedStyles;
1404
+ }
1405
+
1406
+ /**
1407
+ * URLからWebページをインジェストする
1408
+ *
1409
+ * @param options - インジェストオプション
1410
+ * @returns インジェスト結果
1411
+ */
1412
+ async ingest(options: IngestAdapterOptions & { url: string }): Promise<IngestResult> {
1413
+ const { url, ...ingestOptions } = options;
1414
+ const viewport = ingestOptions.viewport ?? DEFAULT_VIEWPORT;
1415
+ const timeout = ingestOptions.timeout ?? DEFAULT_TIMEOUT;
1416
+ // disableWebGLはenableGPUより優先される
1417
+ const useWebGLDisabledBrowser = ingestOptions.disableWebGL === true;
1418
+ // GPU有効化(disableWebGLがtrueの場合は無効)
1419
+ const useGPUEnabledBrowser = !useWebGLDisabledBrowser && ingestOptions.enableGPU === true;
1420
+ const forceKillOnTimeout = ingestOptions.forceKillOnTimeout === true;
1421
+
1422
+ if (isDevelopment()) {
1423
+ logger.info("[PageIngestAdapter] Starting ingest", {
1424
+ url,
1425
+ viewport,
1426
+ timeout,
1427
+ disableWebGL: useWebGLDisabledBrowser,
1428
+ enableGPU: useGPUEnabledBrowser,
1429
+ forceKillOnTimeout,
1430
+ });
1431
+ }
1432
+
1433
+ // robots.txt チェック(RFC 9309準拠)
1434
+ const robotsResult = await isUrlAllowedByRobotsTxt(url, ingestOptions.respectRobotsTxt);
1435
+ if (!robotsResult.allowed) {
1436
+ throw new McpError(
1437
+ ErrorCode.ROBOTS_TXT_BLOCKED,
1438
+ `Blocked by robots.txt: ${url} (domain: ${robotsResult.domain}, reason: ${robotsResult.reason}). ` +
1439
+ `Use respect_robots_txt: false to override. ` +
1440
+ `Note: Overriding robots.txt may have legal implications depending on jurisdiction (e.g., EU DSM Directive Article 4).`,
1441
+ { domain: robotsResult.domain, reason: robotsResult.reason }
1442
+ );
1443
+ }
1444
+
1445
+ let context: BrowserContext | null = null;
1446
+ let page: Page | null = null;
1447
+ let globalTimeoutId: ReturnType<typeof setTimeout> | null = null;
1448
+ // WebGL無効化またはGPU有効化ブラウザを使用する場合は専用インスタンス
1449
+ let dedicatedBrowser: Browser | null = null;
1450
+ // プロセス強制終了用のPID
1451
+ let browserPid: number | undefined;
1452
+ // タイムアウトreject関数(グローバルタイムアウト時にPromiseをrejectするため)
1453
+ let timeoutReject: ((error: Error) => void) | null = null;
1454
+ // BrowserProcessManager(専用ブラウザ使用時のみ作成)
1455
+ let processManager: BrowserProcessManager | null = null;
1456
+
1457
+ try {
1458
+ // ブラウザを取得
1459
+ // 優先順位: disableWebGL > enableGPU > 通常ブラウザ
1460
+ let browser: Browser;
1461
+ if (useWebGLDisabledBrowser) {
1462
+ dedicatedBrowser = await this.launchWebGLDisabledBrowser();
1463
+ browser = dedicatedBrowser;
1464
+ // browser.process() はPlaywrightの型定義に含まれていないが、実行時に存在
1465
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1466
+ browserPid = (browser as any).process?.()?.pid as number | undefined;
1467
+ if (isDevelopment()) {
1468
+ logger.debug("[PageIngestAdapter] Using dedicated WebGL-disabled browser", {
1469
+ pid: browserPid,
1470
+ });
1471
+ }
1472
+ } else if (useGPUEnabledBrowser) {
1473
+ // GPU有効化ブラウザ(専用インスタンス)
1474
+ dedicatedBrowser = await this.launchGPUEnabledBrowser();
1475
+ browser = dedicatedBrowser;
1476
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1477
+ browserPid = (browser as any).process?.()?.pid as number | undefined;
1478
+ if (isDevelopment()) {
1479
+ logger.debug("[PageIngestAdapter] Using dedicated GPU-enabled browser", {
1480
+ pid: browserPid,
1481
+ });
1482
+ }
1483
+ } else {
1484
+ browser = await this.getBrowser();
1485
+ // 共有ブラウザのPIDも取得(強制終了時に必要)
1486
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1487
+ browserPid = (browser as any).process?.()?.pid as number | undefined;
1488
+ }
1489
+
1490
+ // BrowserProcessManagerを作成(専用ブラウザ使用時またはforceKillOnTimeout有効時)
1491
+ if (dedicatedBrowser && forceKillOnTimeout) {
1492
+ processManager = new BrowserProcessManager({
1493
+ browser: dedicatedBrowser,
1494
+ forceKillOnTimeout: true,
1495
+ killGracePeriodMs: 5000,
1496
+ });
1497
+ if (isDevelopment()) {
1498
+ logger.debug("[PageIngestAdapter] BrowserProcessManager created for dedicated browser");
1499
+ }
1500
+ }
1501
+
1502
+ // 新しいコンテキストを作成
1503
+ context = await browser.newContext({
1504
+ viewport,
1505
+ javaScriptEnabled: !ingestOptions.disableJavaScript,
1506
+ userAgent: ROBOTS_TXT.USER_AGENT,
1507
+ });
1508
+
1509
+ page = await context.newPage();
1510
+
1511
+ // ページレベルのデフォルトタイムアウトを設定
1512
+ // page.evaluate()等にはネイティブタイムアウトオプションがないため、
1513
+ // ページ全体のタイムアウトを設定することでハング防止
1514
+ page.setDefaultTimeout(timeout);
1515
+
1516
+ // グローバルタイムアウトハンドラー: タイムアウト時にページ/ブラウザを強制クローズ
1517
+ // これにより、ハングしたpage.evaluate()も中断される
1518
+ // Note: page.evaluate()にはネイティブタイムアウトがないため、この方法でハングを防止
1519
+ // さらに、timeoutRejectを呼び出してメインのPromiseもrejectする
1520
+ const timeoutPromise = new Promise<never>((_, reject) => {
1521
+ timeoutReject = reject;
1522
+ });
1523
+
1524
+ const globalTimeoutMs = timeout + 5000;
1525
+
1526
+ globalTimeoutId = setTimeout(async () => {
1527
+ const timeoutError = new Error(
1528
+ `Global timeout: ingest operation exceeded ${timeout}ms for ${url}`
1529
+ );
1530
+
1531
+ if (isDevelopment()) {
1532
+ logger.error("[PageIngestAdapter] Global timeout triggered, force closing", {
1533
+ url,
1534
+ timeout,
1535
+ forceKillOnTimeout,
1536
+ browserPid,
1537
+ });
1538
+ }
1539
+
1540
+ // Phase 1: ページをクローズ
1541
+ try {
1542
+ await Promise.race([
1543
+ page?.close(),
1544
+ new Promise((_, reject) =>
1545
+ setTimeout(() => reject(new Error("page.close timeout")), 5000)
1546
+ ),
1547
+ ]);
1548
+ } catch {
1549
+ if (isDevelopment()) {
1550
+ logger.warn("[PageIngestAdapter] page.close() failed or timed out");
1551
+ }
1552
+ }
1553
+
1554
+ // Phase 2: 専用ブラウザを使用している場合はブラウザをクローズ
1555
+ // BrowserProcessManagerを使用してタイムアウト付きクローズと強制終了を処理
1556
+ if (dedicatedBrowser) {
1557
+ if (processManager) {
1558
+ // BrowserProcessManagerを使用: タイムアウト付きクローズ(失敗時は自動で強制終了)
1559
+ const closed = await processManager.closeWithTimeout(5000);
1560
+ if (!closed && isDevelopment()) {
1561
+ logger.warn("[PageIngestAdapter] browser.close() timed out, force kill attempted");
1562
+ }
1563
+ } else {
1564
+ // processManagerがない場合は従来の方法でクローズ
1565
+ try {
1566
+ await Promise.race([
1567
+ dedicatedBrowser.close(),
1568
+ new Promise((_, reject) =>
1569
+ setTimeout(() => reject(new Error("browser.close timeout")), 5000)
1570
+ ),
1571
+ ]);
1572
+ } catch {
1573
+ if (isDevelopment()) {
1574
+ logger.warn("[PageIngestAdapter] browser.close() failed or timed out");
1575
+ }
1576
+ // forceKillOnTimeoutが有効な場合は手動でkill
1577
+ if (forceKillOnTimeout && browserPid) {
1578
+ try {
1579
+ if (isDevelopment()) {
1580
+ logger.warn("[PageIngestAdapter] Force killing browser process", {
1581
+ pid: browserPid,
1582
+ });
1583
+ }
1584
+ process.kill(browserPid, "SIGKILL");
1585
+ } catch {
1586
+ // プロセスが既に終了している場合は無視
1587
+ }
1588
+ }
1589
+ }
1590
+ }
1591
+ }
1592
+
1593
+ // Phase 4: メインのPromiseをrejectしてエラーを伝播
1594
+ // これにより、ハングしている操作があっても関数がエラーで返る
1595
+ if (timeoutReject) {
1596
+ timeoutReject(timeoutError);
1597
+ }
1598
+ }, globalTimeoutMs);
1599
+
1600
+ // グローバルタイムアウトとレースするためのヘルパー関数
1601
+ // 既存のwithTimeout関数とは異なり、グローバルタイムアウトPromiseとレースする
1602
+ const withGlobalTimeout = async <T>(
1603
+ operation: Promise<T>,
1604
+ operationName: string
1605
+ ): Promise<T> => {
1606
+ return Promise.race([
1607
+ operation,
1608
+ timeoutPromise.then(() => {
1609
+ // This branch never executes (timeoutPromise only rejects, never resolves)
1610
+ throw new Error(`${operationName} timed out`);
1611
+ }),
1612
+ ]);
1613
+ };
1614
+
1615
+ // ページに移動
1616
+ // waitForWebGL: trueの場合は'domcontentloaded'を使用(networkidleは永遠に完了しない問題への対応)
1617
+ // adaptiveWebGLWait有効時も'domcontentloaded'を使用(WebGLサイトは'load'が発火しない場合がある)
1618
+ // WebGL検出とフレームレート安定化で追加待機を処理するため、早期のDOM準備完了で十分
1619
+ let waitUntil = ingestOptions.waitUntil ?? "load";
1620
+ if (ingestOptions.waitForWebGL === true) {
1621
+ // waitForWebGL: trueが明示的に指定された場合、常にdomcontentloadedを使用
1622
+ waitUntil = "domcontentloaded";
1623
+ if (isDevelopment()) {
1624
+ logger.debug("[PageIngestAdapter] Using domcontentloaded for waitForWebGL mode");
1625
+ }
1626
+ } else if (ingestOptions.adaptiveWebGLWait !== false && waitUntil === "load") {
1627
+ waitUntil = "domcontentloaded";
1628
+ if (isDevelopment()) {
1629
+ logger.debug("[PageIngestAdapter] Using domcontentloaded for adaptive WebGL wait");
1630
+ }
1631
+ }
1632
+ if (isDevelopment()) {
1633
+ logger.debug("[PageIngestAdapter] Navigating with waitUntil", { url, waitUntil, timeout });
1634
+ }
1635
+
1636
+ // DNS不安定対策: リトライ機構付きpage.goto
1637
+ // ERR_NAME_NOT_RESOLVED, EAI_AGAIN等のDNSエラー時のみリトライする
1638
+ let response: Awaited<ReturnType<Page["goto"]>> = null;
1639
+ let lastError: Error | null = null;
1640
+
1641
+ for (let attempt = 0; attempt <= DNS_RETRY_CONFIG.MAX_RETRIES; attempt++) {
1642
+ try {
1643
+ response = await withGlobalTimeout(
1644
+ page.goto(url, {
1645
+ timeout,
1646
+ waitUntil,
1647
+ }),
1648
+ "page.goto"
1649
+ );
1650
+ lastError = null;
1651
+ break; // 成功したらループを抜ける
1652
+ } catch (gotoError) {
1653
+ lastError = gotoError instanceof Error ? gotoError : new Error(String(gotoError));
1654
+
1655
+ // DNSエラーでない場合はリトライしない(即座に再throw)
1656
+ if (!isDnsRelatedError(gotoError)) {
1657
+ throw lastError;
1658
+ }
1659
+
1660
+ // 最後のリトライで失敗した場合は再throw
1661
+ if (attempt >= DNS_RETRY_CONFIG.MAX_RETRIES) {
1662
+ logger.error("[PageIngestAdapter] DNS retry exhausted", {
1663
+ url,
1664
+ attempts: attempt + 1,
1665
+ error: lastError.message,
1666
+ });
1667
+ throw lastError;
1668
+ }
1669
+
1670
+ // リトライ遅延(exponential backoff)
1671
+ const retryDelay = calculateRetryDelay(attempt);
1672
+
1673
+ // 残りタイムアウトをチェック: リトライ遅延 + 次の試行がタイムアウトを超えないこと
1674
+ // グローバルタイムアウトが管理しているため、ここでは警告ログのみ
1675
+ logger.warn("[PageIngestAdapter] DNS error, retrying", {
1676
+ url,
1677
+ attempt: attempt + 1,
1678
+ maxRetries: DNS_RETRY_CONFIG.MAX_RETRIES,
1679
+ retryDelayMs: retryDelay,
1680
+ error: lastError.message,
1681
+ });
1682
+
1683
+ await new Promise<void>((resolve) => setTimeout(resolve, retryDelay));
1684
+ }
1685
+ }
1686
+
1687
+ if (!response) {
1688
+ throw lastError ?? new Error("No response received from page");
1689
+ }
1690
+
1691
+ const finalUrl = page.url();
1692
+
1693
+ // 特定のセレクターを待機(オプション)
1694
+ if (ingestOptions.waitForSelector) {
1695
+ await page.waitForSelector(ingestOptions.waitForSelector, {
1696
+ timeout: timeout / 2,
1697
+ });
1698
+ }
1699
+
1700
+ // ステップ0: ユーザーインタラクション模倣(ローディング解除トリガー)
1701
+ // マウス移動でローディングアニメーションを解除するサイト対応
1702
+ if (ingestOptions.simulateUserInteraction !== false) {
1703
+ if (isDevelopment()) {
1704
+ logger.debug("[PageIngestAdapter] Step 0: Simulating user interaction");
1705
+ }
1706
+ try {
1707
+ // ビューポート中央にマウスを移動
1708
+ const vp = page.viewportSize() ?? { width: 1440, height: 900 };
1709
+ await page.mouse.move(vp.width / 2, vp.height / 2);
1710
+ // 少しスクロール
1711
+ await page.mouse.wheel(0, 100);
1712
+ await page.waitForTimeout(500);
1713
+ // 元に戻す
1714
+ await page.mouse.wheel(0, -100);
1715
+ if (isDevelopment()) {
1716
+ logger.debug("[PageIngestAdapter] User interaction simulation completed");
1717
+ }
1718
+ } catch (e) {
1719
+ if (isDevelopment()) {
1720
+ logger.warn("[PageIngestAdapter] User interaction simulation failed", {
1721
+ error: String(e),
1722
+ });
1723
+ }
1724
+ }
1725
+ }
1726
+
1727
+ // ステップ0.5: waitForWebGLモードのCanvas待機(Phase1-2)
1728
+ // networkidleが永遠に完了しないWebGLサイト向けの最適化
1729
+ if (ingestOptions.waitForWebGL === true) {
1730
+ if (isDevelopment()) {
1731
+ logger.debug(
1732
+ "[PageIngestAdapter] Step 0.5: waitForWebGL mode - waiting for canvas element"
1733
+ );
1734
+ }
1735
+
1736
+ try {
1737
+ // Canvas要素の出現を待機(最大10秒)
1738
+ await page.waitForSelector("canvas", { timeout: WEBGL_CONSTANTS.CANVAS_WAIT_TIMEOUT_MS });
1739
+
1740
+ // WebGLコンテキスト取得確認
1741
+ const hasWebGL = await page.evaluate(`
1742
+ (function() {
1743
+ var canvas = document.querySelector('canvas');
1744
+ if (!canvas) return false;
1745
+ var gl = canvas.getContext('webgl') || canvas.getContext('webgl2');
1746
+ return !!gl;
1747
+ })()
1748
+ `);
1749
+
1750
+ // WebGL初期化待機
1751
+ if (hasWebGL) {
1752
+ const webglWaitMs = ingestOptions.webglWaitMs ?? WEBGL_CONSTANTS.DEFAULT_WEBGL_WAIT_MS;
1753
+ if (webglWaitMs > 0) {
1754
+ if (isDevelopment()) {
1755
+ logger.debug(
1756
+ "[PageIngestAdapter] WebGL context found, waiting for initialization",
1757
+ {
1758
+ webglWaitMs,
1759
+ }
1760
+ );
1761
+ }
1762
+ await page.waitForTimeout(webglWaitMs);
1763
+ }
1764
+ } else {
1765
+ if (isDevelopment()) {
1766
+ logger.debug("[PageIngestAdapter] Canvas found but no WebGL context, skipping wait");
1767
+ }
1768
+ }
1769
+ } catch (e) {
1770
+ // Canvas未検出やエラー時もエラーにしない(Graceful Degradation)
1771
+ if (isDevelopment()) {
1772
+ logger.debug(
1773
+ "[PageIngestAdapter] waitForWebGL canvas/context check failed, continuing",
1774
+ {
1775
+ error: e instanceof Error ? e.message : String(e),
1776
+ }
1777
+ );
1778
+ }
1779
+ }
1780
+ }
1781
+
1782
+ // ステップ1: ローディング要素の完全非表示を待機(最優先)
1783
+ // CSSアニメーション(opacity, transform)で隠れるローディング要素対応
1784
+ if (ingestOptions.waitForSelectorHidden) {
1785
+ if (isDevelopment()) {
1786
+ logger.debug(
1787
+ "[PageIngestAdapter] Step 1: Waiting for loading element to become invisible",
1788
+ {
1789
+ selector: ingestOptions.waitForSelectorHidden,
1790
+ }
1791
+ );
1792
+ }
1793
+ const loadingHiddenResult = await this.waitForLoadingElementHidden(
1794
+ page,
1795
+ ingestOptions.waitForSelectorHidden,
1796
+ Math.min(timeout / 2, 30000)
1797
+ );
1798
+ if (isDevelopment()) {
1799
+ logger.debug("[PageIngestAdapter] Loading element check completed", loadingHiddenResult);
1800
+ }
1801
+ }
1802
+
1803
+ // ステップ1.5: コンテンツ要素の可視性待機
1804
+ // 実際のコンテンツが描画されるまで待機(sr-only以外の可視要素)
1805
+ if (ingestOptions.waitForContentVisible) {
1806
+ if (isDevelopment()) {
1807
+ logger.debug("[PageIngestAdapter] Step 1.5: Waiting for content to become visible", {
1808
+ selector: ingestOptions.waitForContentVisible,
1809
+ });
1810
+ }
1811
+ try {
1812
+ await page.waitForSelector(ingestOptions.waitForContentVisible, {
1813
+ state: "visible",
1814
+ timeout: Math.min(timeout / 2, 30000),
1815
+ });
1816
+ if (isDevelopment()) {
1817
+ logger.debug("[PageIngestAdapter] Content element visible");
1818
+ }
1819
+ } catch {
1820
+ if (isDevelopment()) {
1821
+ logger.warn("[PageIngestAdapter] Content element not found or timeout", {
1822
+ selector: ingestOptions.waitForContentVisible,
1823
+ });
1824
+ }
1825
+ }
1826
+ }
1827
+
1828
+ // ステップ2: DOM安定化待機(React/Vue/Next.js hydration対応)
1829
+ // ローディング完了後のコンテンツ描画を待つ
1830
+ if (ingestOptions.waitForDomStable !== false) {
1831
+ const domStableTimeout = ingestOptions.domStableTimeout ?? 500;
1832
+ const maxWait = Math.min(timeout / 2, 10000);
1833
+ if (isDevelopment()) {
1834
+ logger.debug("[PageIngestAdapter] Step 2: Waiting for DOM stability", {
1835
+ domStableTimeout,
1836
+ maxWait,
1837
+ });
1838
+ }
1839
+ const result = await withGlobalTimeout(
1840
+ this.waitForDomStable(page, domStableTimeout, maxWait),
1841
+ "waitForDomStable"
1842
+ );
1843
+ if (isDevelopment()) {
1844
+ logger.debug("[PageIngestAdapter] DOM stability check completed", result);
1845
+ }
1846
+ }
1847
+
1848
+ // ステップ2.5: WebGL/3Dサイト適応的待機(デフォルト有効)
1849
+ // Canvas/WebGLを検出し、フレームレート安定化を待機
1850
+ // disableWebGL=trueの場合はスキップ(WebGLが無効化されているため検出不要)
1851
+ const warnings: IngestWarning[] = [];
1852
+ let webglDetection: WebGLDetectionResult | undefined;
1853
+ let webglWait: WebGLWaitResult | undefined;
1854
+
1855
+ // disableWebGL使用時は警告を追加
1856
+ if (useWebGLDisabledBrowser) {
1857
+ warnings.push({
1858
+ code: "WEBGL_DISABLED",
1859
+ message:
1860
+ "WebGL has been disabled for this ingest. 3D/WebGL content will not render correctly.",
1861
+ });
1862
+ if (isDevelopment()) {
1863
+ logger.info("[PageIngestAdapter] Skipping WebGL detection (disableWebGL=true)");
1864
+ }
1865
+ } else if (ingestOptions.adaptiveWebGLWait !== false) {
1866
+ if (isDevelopment()) {
1867
+ logger.debug("[PageIngestAdapter] Step 2.5: Adaptive WebGL wait (enabled by default)");
1868
+ }
1869
+ try {
1870
+ const webglResult = await withGlobalTimeout(
1871
+ this.waitForWebGLReady(page, ingestOptions, warnings),
1872
+ "waitForWebGLReady"
1873
+ );
1874
+ webglDetection = webglResult.detection;
1875
+ webglWait = webglResult.wait;
1876
+
1877
+ if (webglDetection.detected && isDevelopment()) {
1878
+ logger.info("[PageIngestAdapter] WebGL site detected", {
1879
+ canvasCount: webglDetection.canvasCount,
1880
+ webgl1Count: webglDetection.webgl1Count,
1881
+ webgl2Count: webglDetection.webgl2Count,
1882
+ threeJsDetected: webglDetection.threeJsDetected,
1883
+ frameRateStable: webglWait?.frameRateStable,
1884
+ lastFrameRate: webglWait?.lastFrameRate,
1885
+ });
1886
+ }
1887
+ } catch (e) {
1888
+ // Graceful Degradation: WebGL待機失敗時も処理を継続
1889
+ const errorMessage = e instanceof Error ? e.message : String(e);
1890
+ warnings.push({
1891
+ code: "WEBGL_WAIT_ERROR",
1892
+ message: `WebGL adaptive wait failed: ${errorMessage}`,
1893
+ });
1894
+ if (isDevelopment()) {
1895
+ logger.warn("[PageIngestAdapter] WebGL adaptive wait failed, continuing", {
1896
+ error: errorMessage,
1897
+ });
1898
+ }
1899
+ }
1900
+ }
1901
+
1902
+ // ステップ3: 追加の固定待機時間(アニメーション完了用)
1903
+ if (ingestOptions.waitForTimeout && ingestOptions.waitForTimeout > 0) {
1904
+ if (isDevelopment()) {
1905
+ logger.debug("[PageIngestAdapter] Step 3: Additional wait", {
1906
+ waitForTimeout: ingestOptions.waitForTimeout,
1907
+ });
1908
+ }
1909
+ await page.waitForTimeout(ingestOptions.waitForTimeout);
1910
+ }
1911
+
1912
+ // WebGLサイトかどうかでタイムアウトを調整
1913
+ const isWebGLSiteForTimeout = webglDetection?.detected ?? false;
1914
+ const timeoutMultiplier = isWebGLSiteForTimeout ? OPERATION_TIMEOUTS.WEBGL_MULTIPLIER : 1;
1915
+
1916
+ // HTML取得(操作レベルタイムアウト付き)
1917
+ const html = await withTimeout(
1918
+ page.content(),
1919
+ OPERATION_TIMEOUTS.CONTENT_EXTRACTION * timeoutMultiplier,
1920
+ "page.content()"
1921
+ );
1922
+
1923
+ // メタデータ抽出(操作レベルタイムアウト付き)
1924
+ const metadata = await withTimeout(
1925
+ this.extractMetadata(page),
1926
+ OPERATION_TIMEOUTS.METADATA_EXTRACTION * timeoutMultiplier,
1927
+ "extractMetadata"
1928
+ );
1929
+
1930
+ // ビューポート情報取得(操作レベルタイムアウト付き)
1931
+ const viewportInfo = await withTimeout(
1932
+ this.getViewportInfo(page, viewport),
1933
+ OPERATION_TIMEOUTS.VIEWPORT_INFO * timeoutMultiplier,
1934
+ "getViewportInfo"
1935
+ );
1936
+
1937
+ // スクリーンショット取得(skipScreenshot: true の場合はスキップ)
1938
+ let screenshots: IngestScreenshotResult[] | undefined;
1939
+ if (!ingestOptions.skipScreenshot) {
1940
+ // WebGLサイトの場合はスクリーンショットタイムアウトを延長(120秒)
1941
+ // 重い3Dサイトはフォント読み込みやレンダリングに時間がかかるため
1942
+ const isWebGLSite = webglDetection?.detected ?? false;
1943
+ const screenshotTimeout = isWebGLSite ? 120000 : 30000;
1944
+
1945
+ try {
1946
+ // WebGLサイトではfullPageを強制無効化(SwiftShaderで極めて遅いため)
1947
+ // フルページスクロール+レンダリングはSwiftShaderで数分〜タイムアウトになる
1948
+ const effectiveFullPage = isWebGLSite ? false : (ingestOptions.fullPage ?? true);
1949
+
1950
+ if (isDevelopment()) {
1951
+ if (isWebGLSite) {
1952
+ logger.debug(
1953
+ "[PageIngestAdapter] WebGL site detected: using viewport-only screenshot (fullPage disabled)",
1954
+ {
1955
+ timeout: screenshotTimeout,
1956
+ originalFullPage: ingestOptions.fullPage ?? true,
1957
+ effectiveFullPage,
1958
+ }
1959
+ );
1960
+ } else {
1961
+ logger.debug("[PageIngestAdapter] Taking screenshot", {
1962
+ timeout: screenshotTimeout,
1963
+ fullPage: effectiveFullPage,
1964
+ });
1965
+ }
1966
+ }
1967
+
1968
+ // Lazy Loading発火: fullPage screenshot前にページ全体をスクロール
1969
+ // Trigger Lazy Loading: scroll through entire page before fullPage screenshot
1970
+ // IntersectionObserverベースのLazy Loadingはビューポート外では発火しないため、
1971
+ // スクロールで各セクションをビューポート内に入れてコンテンツを描画させる
1972
+ if (effectiveFullPage) {
1973
+ try {
1974
+ const scrollHeight = await page.evaluate(() => document.documentElement.scrollHeight);
1975
+ const viewportHeight = await page.evaluate(() => window.innerHeight);
1976
+
1977
+ // SEC: NaN/Infinity防御 — 無効値の場合はスクロールスキップ
1978
+ // SEC: NaN/Infinity defense — skip scroll on invalid dimensions
1979
+ if (
1980
+ !Number.isFinite(scrollHeight) ||
1981
+ !Number.isFinite(viewportHeight) ||
1982
+ scrollHeight <= 0
1983
+ ) {
1984
+ if (isDevelopment()) {
1985
+ logger.debug(
1986
+ "[PageIngestAdapter] Skipping lazy loading scroll: invalid dimensions",
1987
+ {
1988
+ scrollHeight,
1989
+ viewportHeight,
1990
+ }
1991
+ );
1992
+ }
1993
+ } else {
1994
+ const scrollStep = Math.max(viewportHeight, LAZY_SCROLL_MIN_STEP_PX);
1995
+ const maxScrollIterations = LAZY_SCROLL_MAX_ITERATIONS;
1996
+ let iterations = 0;
1997
+
1998
+ for (
1999
+ let y = 0;
2000
+ y < scrollHeight && iterations < maxScrollIterations;
2001
+ y += scrollStep
2002
+ ) {
2003
+ await page.evaluate((sy: number) => window.scrollTo(0, sy), y);
2004
+ // requestAnimationFrame 2フレーム完了待ち + 2秒タイムアウトガード
2005
+ // Wait for 2 rAF frames + 2s timeout guard (consistent with section-screenshot-fallback.service.ts)
2006
+ await Promise.race([
2007
+ page.evaluate(
2008
+ () =>
2009
+ new Promise<void>((resolve) => {
2010
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
2011
+ })
2012
+ ),
2013
+ page.waitForTimeout(RAF_TIMEOUT_MS),
2014
+ ]).catch(() => {
2015
+ /* non-fatal */
2016
+ });
2017
+ iterations++;
2018
+ }
2019
+
2020
+ // 先頭に戻す / Scroll back to top
2021
+ await page.evaluate(() => window.scrollTo(0, 0));
2022
+ // 描画安定待ち / Wait for paint stabilization
2023
+ await page.waitForTimeout(LAZY_SCROLL_STABILIZE_MS);
2024
+
2025
+ if (isDevelopment()) {
2026
+ logger.debug("[PageIngestAdapter] Lazy loading scroll completed", {
2027
+ scrollHeight,
2028
+ viewportHeight,
2029
+ iterations,
2030
+ });
2031
+ }
2032
+ }
2033
+ } catch (scrollError) {
2034
+ // Graceful Degradation: スクロール失敗時もスクリーンショットは続行
2035
+ // Graceful Degradation: continue screenshot even if scroll fails
2036
+ logger.warn("[PageIngestAdapter] Pre-screenshot scroll failed (non-fatal)", {
2037
+ error: scrollError instanceof Error ? scrollError.message : String(scrollError),
2038
+ });
2039
+ }
2040
+ }
2041
+
2042
+ const screenshotBuffer = await withGlobalTimeout(
2043
+ page.screenshot({
2044
+ fullPage: effectiveFullPage,
2045
+ type: "png",
2046
+ timeout: screenshotTimeout,
2047
+ }),
2048
+ "page.screenshot"
2049
+ );
2050
+ const screenshotBase64 = screenshotBuffer.toString("base64");
2051
+ screenshots = [
2052
+ {
2053
+ viewportName: "desktop",
2054
+ viewport,
2055
+ data: screenshotBase64,
2056
+ format: "png",
2057
+ fullPage: effectiveFullPage,
2058
+ size: screenshotBuffer.length,
2059
+ },
2060
+ ];
2061
+ } catch (screenshotError) {
2062
+ // Graceful Degradation: スクリーンショット失敗時も続行
2063
+ const errorMessage =
2064
+ screenshotError instanceof Error ? screenshotError.message : String(screenshotError);
2065
+ warnings.push({
2066
+ code: "SCREENSHOT_FAILED",
2067
+ message: `Screenshot capture failed: ${errorMessage}. Analysis will continue without screenshot.`,
2068
+ });
2069
+
2070
+ if (isDevelopment()) {
2071
+ logger.warn("[PageIngestAdapter] Screenshot failed, continuing without screenshot", {
2072
+ error: errorMessage,
2073
+ isWebGLSite,
2074
+ fullPage: ingestOptions.fullPage ?? true,
2075
+ });
2076
+ }
2077
+ }
2078
+ }
2079
+
2080
+ // Computed Styles取得(includeComputedStyles: true の場合のみ)
2081
+ let computedStyles: ComputedStyleInfo[] | undefined;
2082
+ if (ingestOptions.includeComputedStyles) {
2083
+ computedStyles = await this.extractComputedStyles(page);
2084
+ }
2085
+
2086
+ if (isDevelopment()) {
2087
+ logger.info("[PageIngestAdapter] Ingest completed", {
2088
+ url,
2089
+ finalUrl,
2090
+ htmlSize: html.length,
2091
+ hasScreenshot: !!screenshots,
2092
+ hasComputedStyles: !!computedStyles,
2093
+ computedStylesCount: computedStyles?.length ?? 0,
2094
+ webglDetected: webglDetection?.detected ?? false,
2095
+ warningCount: warnings.length,
2096
+ });
2097
+ }
2098
+
2099
+ // 結果オブジェクトを構築(undefinedプロパティを除外)
2100
+ const result: IngestResult = {
2101
+ success: true,
2102
+ url,
2103
+ finalUrl,
2104
+ html,
2105
+ htmlSize: html.length,
2106
+ viewportInfo,
2107
+ metadata,
2108
+ ingestedAt: new Date(),
2109
+ source: {
2110
+ type: ingestOptions.sourceType ?? "user_provided",
2111
+ usageScope: ingestOptions.usageScope ?? "inspiration_only",
2112
+ },
2113
+ };
2114
+
2115
+ // screenshotsは値がある場合のみ設定
2116
+ if (screenshots) {
2117
+ result.screenshots = screenshots;
2118
+ }
2119
+
2120
+ // computedStylesは値がある場合のみ設定
2121
+ if (computedStyles) {
2122
+ result.computedStyles = computedStyles;
2123
+ }
2124
+
2125
+ // WebGL検出結果(検出された場合のみ設定)
2126
+ if (webglDetection?.detected) {
2127
+ result.webglDetection = webglDetection;
2128
+ if (webglWait) {
2129
+ result.webglWait = webglWait;
2130
+ }
2131
+ }
2132
+
2133
+ // 警告がある場合のみ設定
2134
+ if (warnings.length > 0) {
2135
+ result.warnings = warnings;
2136
+ }
2137
+
2138
+ // 正常完了時はグローバルタイムアウトをクリア
2139
+ if (globalTimeoutId) {
2140
+ clearTimeout(globalTimeoutId);
2141
+ }
2142
+
2143
+ return result;
2144
+ } catch (error) {
2145
+ // エラー発生時もグローバルタイムアウトをクリア
2146
+ if (globalTimeoutId) {
2147
+ clearTimeout(globalTimeoutId);
2148
+ }
2149
+ // エラー処理
2150
+ const errorMessage = error instanceof Error ? error.message : String(error);
2151
+
2152
+ if (isDevelopment()) {
2153
+ logger.error("[PageIngestAdapter] Ingest failed", {
2154
+ url,
2155
+ error: errorMessage,
2156
+ });
2157
+ }
2158
+
2159
+ // エラー結果を返す
2160
+ return {
2161
+ success: false,
2162
+ error: errorMessage,
2163
+ url,
2164
+ finalUrl: url,
2165
+ html: "",
2166
+ htmlSize: 0,
2167
+ viewportInfo: {
2168
+ documentWidth: 0,
2169
+ documentHeight: 0,
2170
+ viewportWidth: 0,
2171
+ viewportHeight: 0,
2172
+ scrollHeight: 0,
2173
+ },
2174
+ metadata: { title: "" },
2175
+ ingestedAt: new Date(),
2176
+ source: {
2177
+ type: options.sourceType ?? "user_provided",
2178
+ usageScope: options.usageScope ?? "inspiration_only",
2179
+ },
2180
+ };
2181
+ } finally {
2182
+ // リソースクリーンアップ
2183
+ if (page) {
2184
+ await page.close().catch(() => {});
2185
+ }
2186
+ if (context) {
2187
+ await context.close().catch(() => {});
2188
+ }
2189
+ // 専用ブラウザを使用した場合はブラウザも閉じる
2190
+ // BrowserProcessManagerを使用して安全にクローズ
2191
+ if (dedicatedBrowser) {
2192
+ if (isDevelopment()) {
2193
+ logger.debug("[PageIngestAdapter] Closing dedicated browser");
2194
+ }
2195
+ if (processManager) {
2196
+ // BrowserProcessManagerを使用して安全にクローズ(タイムアウト10秒)
2197
+ const closed = await processManager.closeWithTimeout(10000);
2198
+ if (!closed && isDevelopment()) {
2199
+ logger.warn("[PageIngestAdapter] Dedicated browser close timed out in finally block");
2200
+ }
2201
+ } else {
2202
+ // processManagerがない場合は従来の方法でクローズ
2203
+ await dedicatedBrowser.close().catch(() => {});
2204
+ }
2205
+ dedicatedBrowser = null;
2206
+ processManager = null;
2207
+ }
2208
+ }
2209
+ }
2210
+
2211
+ /**
2212
+ * ブラウザを終了
2213
+ */
2214
+ async close(): Promise<void> {
2215
+ if (this.browser) {
2216
+ await this.browser.close();
2217
+ this.browser = null;
2218
+ if (isDevelopment()) {
2219
+ logger.info("[PageIngestAdapter] Browser closed");
2220
+ }
2221
+ }
2222
+ }
2223
+ }
2224
+
2225
+ // シングルトンインスタンス
2226
+ export const pageIngestAdapter = new PageIngestAdapter();
2227
+
2228
+ // プロセスイベントリスナー重複登録防止フラグ
2229
+ let processListenersRegistered = false;
2230
+
2231
+ // プロセス終了時にブラウザを閉じる(1回だけ登録)
2232
+ if (!processListenersRegistered) {
2233
+ processListenersRegistered = true;
2234
+
2235
+ process.on("beforeExit", async () => {
2236
+ await pageIngestAdapter.close();
2237
+ });
2238
+
2239
+ process.on("SIGINT", async () => {
2240
+ await pageIngestAdapter.close();
2241
+ process.exit(0);
2242
+ });
2243
+
2244
+ process.on("SIGTERM", async () => {
2245
+ await pageIngestAdapter.close();
2246
+ process.exit(0);
2247
+ });
2248
+ }
2249
+
2250
+ // =============================================
2251
+ // 開発環境ログ
2252
+ // =============================================
2253
+
2254
+ if (isDevelopment()) {
2255
+ logger.debug("[PageIngestAdapter] Module loaded (Playwright direct integration)");
2256
+ }