@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,1794 @@
1
+ // SPDX-FileCopyrightText: 2026 TKMD and Reftrix Contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+
4
+ /**
5
+ * Gradient Detector Service
6
+ *
7
+ * Detects gradient patterns (linear, radial, conic) from images using
8
+ * pixel analysis and color change patterns.
9
+ *
10
+ * Security features:
11
+ * - Input size validation (5MB max) - SEC H-1
12
+ * - Processing timeout (30s default) - SEC M-1
13
+ *
14
+ * @module services/visual-extractor/gradient-detector.service
15
+ */
16
+
17
+ import { logger } from "../../utils/logger";
18
+ import sharp from "sharp";
19
+ import {
20
+ parseAndValidateImageInput,
21
+ withTimeout,
22
+ DEFAULT_PROCESSING_TIMEOUT,
23
+ logSecurityEvent,
24
+ rgbToHex,
25
+ wrapSharpError,
26
+ colorDistance,
27
+ type RGB,
28
+ } from "./image-utils";
29
+
30
+ /**
31
+ * Color stop in a gradient
32
+ */
33
+ export interface ColorStop {
34
+ /** Color in HEX format (#RRGGBB) */
35
+ color: string;
36
+ /** Position in gradient (0-1) */
37
+ position: number;
38
+ }
39
+
40
+ /**
41
+ * Region bounds for a detected gradient
42
+ */
43
+ export interface GradientRegion {
44
+ x: number;
45
+ y: number;
46
+ width: number;
47
+ height: number;
48
+ }
49
+
50
+ /**
51
+ * Animation info for gradient (v0.1.0)
52
+ */
53
+ export interface GradientAnimation {
54
+ /** Animation name (keyframes) */
55
+ name: string;
56
+ /** Animation duration (e.g., '3s', '500ms') */
57
+ duration?: string;
58
+ /** Timing function (e.g., 'ease', 'linear', 'ease-in-out') */
59
+ timingFunction?: string;
60
+ /** Iteration count (e.g., 'infinite', '1', '3') */
61
+ iterationCount?: string;
62
+ /** Animation direction (e.g., 'normal', 'alternate', 'reverse') */
63
+ direction?: string;
64
+ /** Animation delay (e.g., '0s', '200ms') */
65
+ delay?: string;
66
+ /** Fill mode (e.g., 'none', 'forwards', 'backwards', 'both') */
67
+ fillMode?: string;
68
+ }
69
+
70
+ /**
71
+ * Transition info for gradient (v0.1.0)
72
+ */
73
+ export interface GradientTransition {
74
+ /** Transition property (e.g., 'background', 'all') */
75
+ property: string;
76
+ /** Transition duration (e.g., '0.3s', '300ms') */
77
+ duration?: string;
78
+ /** Timing function (e.g., 'ease', 'linear', 'ease-out') */
79
+ timingFunction?: string;
80
+ /** Transition delay (e.g., '0s', '100ms') */
81
+ delay?: string;
82
+ }
83
+
84
+ /**
85
+ * Single detected gradient information
86
+ */
87
+ export interface DetectedGradient {
88
+ /** Type of gradient */
89
+ type: "linear" | "radial" | "conic";
90
+ /** Direction in degrees for linear gradient (0-360) */
91
+ direction?: number;
92
+ /** Center X position for radial/conic gradient (0-1) */
93
+ centerX?: number;
94
+ /** Center Y position for radial/conic gradient (0-1) */
95
+ centerY?: number;
96
+ /** Color stops in the gradient */
97
+ colorStops: ColorStop[];
98
+ /** Region where gradient was detected */
99
+ region: GradientRegion;
100
+ /** Confidence score for this gradient detection (0-1) */
101
+ confidence: number;
102
+ /** Generated CSS gradient string (v0.1.0) */
103
+ cssString?: string;
104
+ /** Animation info (v0.1.0) - populated when CSS context is available */
105
+ animation?: GradientAnimation;
106
+ /** Transition info (v0.1.0) - populated when CSS context is available */
107
+ transition?: GradientTransition;
108
+ /** Parent element CSS selector (v0.1.0) - populated when CSS context is available */
109
+ parentElement?: string;
110
+ }
111
+
112
+ /**
113
+ * Result of gradient detection from an image
114
+ */
115
+ export interface GradientDetectionResult {
116
+ /** Whether any gradient was detected */
117
+ hasGradient: boolean;
118
+ /** List of detected gradients */
119
+ gradients: DetectedGradient[];
120
+ /** The most prominent gradient type */
121
+ dominantGradientType?: "linear" | "radial" | "conic";
122
+ /** Overall confidence score (0-1) */
123
+ confidence: number;
124
+ /** Processing time in milliseconds */
125
+ processingTimeMs: number;
126
+ }
127
+
128
+ /**
129
+ * Gradient detector service interface
130
+ */
131
+ export interface GradientDetectorService {
132
+ /**
133
+ * Detect gradients from an image
134
+ * @param image - Image as Buffer or Base64 string
135
+ * @returns Promise resolving to gradient detection result
136
+ * @throws Error if image is invalid or processing fails
137
+ */
138
+ detectGradient(image: Buffer | string): Promise<GradientDetectionResult>;
139
+
140
+ /**
141
+ * Detect gradients from CSS text (v0.1.0)
142
+ * Extracts gradient definitions along with animation/transition info and parent selectors.
143
+ * @param css - CSS text to analyze
144
+ * @returns Gradient detection result with CSS-specific info
145
+ */
146
+ detectGradientFromCSS(css: string): GradientDetectionResult;
147
+ }
148
+
149
+ /**
150
+ * Configuration options for gradient detector
151
+ */
152
+ interface GradientDetectorConfig {
153
+ /** Max width for processing (for performance) */
154
+ maxProcessingWidth: number;
155
+ /** Max height for processing (for performance) */
156
+ maxProcessingHeight: number;
157
+ /** Minimum color change threshold (deltaE) to consider gradient */
158
+ minColorChangeThreshold: number;
159
+ /** Sample step size for analysis */
160
+ sampleStep: number;
161
+ /** Minimum gradient length (pixels) to consider valid */
162
+ minGradientLength: number;
163
+ }
164
+
165
+ /** Default configuration */
166
+ const DEFAULT_CONFIG: GradientDetectorConfig = {
167
+ maxProcessingWidth: 300,
168
+ maxProcessingHeight: 300,
169
+ minColorChangeThreshold: 15,
170
+ sampleStep: 2,
171
+ minGradientLength: 10,
172
+ };
173
+
174
+ /** Threshold for considering colors as similar */
175
+ const SIMILAR_COLOR_THRESHOLD = 5;
176
+
177
+ /** Threshold for continuous gradient detection */
178
+ const CONTINUOUS_GRADIENT_THRESHOLD = 20;
179
+
180
+ /** Minimum score threshold for linear gradient detection */
181
+ const LINEAR_MIN_SCORE_THRESHOLD = 5;
182
+
183
+ /** Minimum radial gradient consistency threshold */
184
+ const RADIAL_CONSISTENCY_THRESHOLD = 0.5;
185
+
186
+ /** Conic gradient angular variation threshold (reserved for future use) */
187
+ // const CONIC_ANGULAR_VARIATION_THRESHOLD = 15;
188
+
189
+ /** Minimum color samples ratio for conic gradient detection */
190
+ const CONIC_MIN_SAMPLES_RATIO = 0.8;
191
+
192
+ /** Minimum transitions for conic gradient detection */
193
+ const CONIC_MIN_TRANSITIONS = 4;
194
+
195
+ // =============================================================================
196
+ // CSS Gradient Parsing Types and Functions (v0.1.0)
197
+ // =============================================================================
198
+
199
+ /**
200
+ * Parsed CSS rule with selector and declarations
201
+ */
202
+ interface ParsedCSSRule {
203
+ selector: string;
204
+ declarations: Map<string, string>;
205
+ }
206
+
207
+ /**
208
+ * CSS gradient match from regex
209
+ */
210
+ interface CSSGradientMatch {
211
+ type: "linear" | "radial" | "conic";
212
+ fullMatch: string;
213
+ isRepeating: boolean;
214
+ }
215
+
216
+ /**
217
+ * Parse CSS text into rules (simplified parser)
218
+ */
219
+ function parseCSSRules(css: string): ParsedCSSRule[] {
220
+ if (!css || typeof css !== "string") {
221
+ return [];
222
+ }
223
+
224
+ const rules: ParsedCSSRule[] = [];
225
+ // Remove comments
226
+ const cleanedCss = css.replace(/\/\*[\s\S]*?\*\//g, "");
227
+
228
+ // Match CSS rules (simple regex, handles most cases)
229
+ const ruleRegex = /([^{}]+)\{([^{}]*)\}/g;
230
+ let match;
231
+
232
+ while ((match = ruleRegex.exec(cleanedCss)) !== null) {
233
+ const selector = match[1]?.trim() ?? "";
234
+ const declarationBlock = match[2] ?? "";
235
+
236
+ // Skip @keyframes and @media (handle separately if needed)
237
+ if (selector.startsWith("@")) {
238
+ continue;
239
+ }
240
+
241
+ const declarations = new Map<string, string>();
242
+
243
+ // Parse declarations
244
+ const declPairs = declarationBlock.split(";");
245
+ for (const pair of declPairs) {
246
+ const colonIndex = pair.indexOf(":");
247
+ if (colonIndex > 0) {
248
+ const property = pair.substring(0, colonIndex).trim();
249
+ const value = pair.substring(colonIndex + 1).trim();
250
+ if (property && value) {
251
+ declarations.set(property, value);
252
+ }
253
+ }
254
+ }
255
+
256
+ if (selector) {
257
+ rules.push({ selector, declarations });
258
+ }
259
+ }
260
+
261
+ return rules;
262
+ }
263
+
264
+ /**
265
+ * Extract gradient matches from a CSS value
266
+ */
267
+ function extractGradientMatches(value: string): CSSGradientMatch[] {
268
+ const matches: CSSGradientMatch[] = [];
269
+
270
+ // Regex to match gradient functions (handles nested parentheses)
271
+ const gradientRegex =
272
+ /(repeating-)?(linear|radial|conic)-gradient\(([^()]*(?:\([^()]*\)[^()]*)*)\)/g;
273
+ let match;
274
+
275
+ while ((match = gradientRegex.exec(value)) !== null) {
276
+ const isRepeating = !!match[1];
277
+ const type = match[2] as "linear" | "radial" | "conic";
278
+ const fullMatch = match[0];
279
+
280
+ matches.push({
281
+ type,
282
+ fullMatch,
283
+ isRepeating,
284
+ });
285
+ }
286
+
287
+ return matches;
288
+ }
289
+
290
+ /**
291
+ * Parse animation shorthand or individual properties
292
+ */
293
+ function parseAnimationInfo(declarations: Map<string, string>): GradientAnimation | undefined {
294
+ // Check for animation shorthand
295
+ const animationShorthand = declarations.get("animation");
296
+ if (animationShorthand) {
297
+ // Parse: name duration timing-function delay iteration-count direction fill-mode
298
+ // Example: "gradient-shift 3s ease infinite"
299
+ const parts = animationShorthand.split(/\s+/);
300
+ const result: GradientAnimation = { name: "" };
301
+
302
+ for (const part of parts) {
303
+ if (/^\d+(\.\d+)?(s|ms)$/.test(part)) {
304
+ // Duration or delay
305
+ if (!result.duration) {
306
+ result.duration = part;
307
+ } else {
308
+ result.delay = part;
309
+ }
310
+ } else if (
311
+ /^(ease|linear|ease-in|ease-out|ease-in-out|cubic-bezier\([^)]+\)|steps\([^)]+\))$/.test(
312
+ part
313
+ )
314
+ ) {
315
+ result.timingFunction = part;
316
+ } else if (/^(infinite|\d+)$/.test(part)) {
317
+ result.iterationCount = part;
318
+ } else if (/^(normal|reverse|alternate|alternate-reverse)$/.test(part)) {
319
+ result.direction = part;
320
+ } else if (/^(none|forwards|backwards|both)$/.test(part)) {
321
+ result.fillMode = part;
322
+ } else if (part && !result.name) {
323
+ result.name = part;
324
+ }
325
+ }
326
+
327
+ if (result.name) {
328
+ return result;
329
+ }
330
+ }
331
+
332
+ // Check for individual animation properties
333
+ const animationName = declarations.get("animation-name");
334
+ if (animationName && animationName !== "none") {
335
+ const result: GradientAnimation = {
336
+ name: animationName,
337
+ };
338
+
339
+ // Only add properties if they have values (exactOptionalPropertyTypes compliance)
340
+ const duration = declarations.get("animation-duration");
341
+ if (duration) result.duration = duration;
342
+
343
+ const timingFunction = declarations.get("animation-timing-function");
344
+ if (timingFunction) result.timingFunction = timingFunction;
345
+
346
+ const iterationCount = declarations.get("animation-iteration-count");
347
+ if (iterationCount) result.iterationCount = iterationCount;
348
+
349
+ const direction = declarations.get("animation-direction");
350
+ if (direction) result.direction = direction;
351
+
352
+ const delay = declarations.get("animation-delay");
353
+ if (delay) result.delay = delay;
354
+
355
+ const fillMode = declarations.get("animation-fill-mode");
356
+ if (fillMode) result.fillMode = fillMode;
357
+
358
+ return result;
359
+ }
360
+
361
+ return undefined;
362
+ }
363
+
364
+ /**
365
+ * Parse transition shorthand or individual properties
366
+ */
367
+ function parseTransitionInfo(declarations: Map<string, string>): GradientTransition | undefined {
368
+ // Check for transition shorthand
369
+ const transitionShorthand = declarations.get("transition");
370
+ if (transitionShorthand) {
371
+ // Parse: property duration timing-function delay
372
+ // Example: "background 0.3s ease"
373
+ const parts = transitionShorthand.split(/\s+/);
374
+ const result: GradientTransition = { property: "" };
375
+
376
+ for (const part of parts) {
377
+ if (/^\d+(\.\d+)?(s|ms)$/.test(part)) {
378
+ // Duration or delay
379
+ if (!result.duration) {
380
+ result.duration = part;
381
+ } else {
382
+ result.delay = part;
383
+ }
384
+ } else if (
385
+ /^(ease|linear|ease-in|ease-out|ease-in-out|cubic-bezier\([^)]+\)|steps\([^)]+\))$/.test(
386
+ part
387
+ )
388
+ ) {
389
+ result.timingFunction = part;
390
+ } else if (part && !result.property) {
391
+ result.property = part;
392
+ }
393
+ }
394
+
395
+ // Check if the transition applies to background
396
+ if (result.property && (result.property === "all" || result.property.includes("background"))) {
397
+ return result;
398
+ }
399
+ }
400
+
401
+ // Check for individual transition properties
402
+ const transitionProperty = declarations.get("transition-property");
403
+ if (transitionProperty) {
404
+ // Check if background is included
405
+ const properties = transitionProperty.split(",").map((p) => p.trim());
406
+ const bgIndex = properties.findIndex((p) => p === "all" || p.includes("background"));
407
+
408
+ if (bgIndex >= 0) {
409
+ const durations = (declarations.get("transition-duration") ?? "")
410
+ .split(",")
411
+ .map((d) => d.trim());
412
+ const timings = (declarations.get("transition-timing-function") ?? "")
413
+ .split(",")
414
+ .map((t) => t.trim());
415
+ const delays = (declarations.get("transition-delay") ?? "").split(",").map((d) => d.trim());
416
+
417
+ const result: GradientTransition = {
418
+ property: properties[bgIndex] ?? "background",
419
+ };
420
+
421
+ // Only add properties if they have values (exactOptionalPropertyTypes compliance)
422
+ const duration = durations[bgIndex] ?? durations[0];
423
+ if (duration) result.duration = duration;
424
+
425
+ const timingFunction = timings[bgIndex] ?? timings[0];
426
+ if (timingFunction) result.timingFunction = timingFunction;
427
+
428
+ const delay = delays[bgIndex] ?? delays[0];
429
+ if (delay) result.delay = delay;
430
+
431
+ return result;
432
+ }
433
+ }
434
+
435
+ return undefined;
436
+ }
437
+
438
+ /**
439
+ * Parse color stops from gradient arguments (simplified)
440
+ */
441
+ function parseColorStopsFromCSS(gradientArgs: string): ColorStop[] {
442
+ const colorStops: ColorStop[] = [];
443
+
444
+ // Remove direction/shape arguments for linear/radial
445
+ // Split by comma but respect parentheses
446
+ const parts: string[] = [];
447
+ let depth = 0;
448
+ let current = "";
449
+
450
+ for (const char of gradientArgs) {
451
+ if (char === "(") depth++;
452
+ if (char === ")") depth--;
453
+ if (char === "," && depth === 0) {
454
+ parts.push(current.trim());
455
+ current = "";
456
+ } else {
457
+ current += char;
458
+ }
459
+ }
460
+ if (current.trim()) {
461
+ parts.push(current.trim());
462
+ }
463
+
464
+ // Skip first part if it's a direction/position
465
+ let startIndex = 0;
466
+ if (parts[0]) {
467
+ const firstPart = parts[0].toLowerCase();
468
+ if (
469
+ firstPart.includes("deg") ||
470
+ firstPart.startsWith("to ") ||
471
+ firstPart.includes("at ") ||
472
+ firstPart === "circle" ||
473
+ firstPart === "ellipse" ||
474
+ firstPart.startsWith("from ")
475
+ ) {
476
+ startIndex = 1;
477
+ }
478
+ }
479
+
480
+ // Parse color stops
481
+ for (let i = startIndex; i < parts.length; i++) {
482
+ const part = parts[i]?.trim() ?? "";
483
+
484
+ // Extract position percentage if present
485
+ const posMatch = part.match(/(\d+(\.\d+)?%)/);
486
+ const position = posMatch
487
+ ? parseFloat(posMatch[1] ?? "0") / 100
488
+ : i === startIndex
489
+ ? 0
490
+ : i === parts.length - 1
491
+ ? 1
492
+ : (i - startIndex) / (parts.length - 1 - startIndex);
493
+
494
+ // Extract color (simplified - just take the color part)
495
+ const colorPart = part.replace(/\d+(\.\d+)?%/g, "").trim();
496
+
497
+ if (colorPart) {
498
+ colorStops.push({
499
+ color: colorPart,
500
+ position,
501
+ });
502
+ }
503
+ }
504
+
505
+ return colorStops;
506
+ }
507
+
508
+ /**
509
+ * Parse direction/angle from linear gradient
510
+ */
511
+ function parseLinearDirection(gradientArgs: string): number | undefined {
512
+ const firstPart = gradientArgs.split(",")[0]?.trim() ?? "";
513
+
514
+ // Check for angle (e.g., "45deg", "90deg")
515
+ const angleMatch = firstPart.match(/^(-?\d+(\.\d+)?)(deg|grad|rad|turn)/);
516
+ if (angleMatch) {
517
+ let value = parseFloat(angleMatch[1] ?? "0");
518
+ const unit = angleMatch[3];
519
+
520
+ // Convert to degrees
521
+ switch (unit) {
522
+ case "grad":
523
+ value = (value * 360) / 400;
524
+ break;
525
+ case "rad":
526
+ value = (value * 180) / Math.PI;
527
+ break;
528
+ case "turn":
529
+ value = value * 360;
530
+ break;
531
+ }
532
+
533
+ return value;
534
+ }
535
+
536
+ // Check for direction keywords
537
+ const directionMap: Record<string, number> = {
538
+ "to top": 0,
539
+ "to top right": 45,
540
+ "to right": 90,
541
+ "to bottom right": 135,
542
+ "to bottom": 180,
543
+ "to bottom left": 225,
544
+ "to left": 270,
545
+ "to top left": 315,
546
+ };
547
+
548
+ const lowerFirst = firstPart.toLowerCase();
549
+ for (const [key, value] of Object.entries(directionMap)) {
550
+ if (lowerFirst === key) {
551
+ return value;
552
+ }
553
+ }
554
+
555
+ return undefined;
556
+ }
557
+
558
+ /**
559
+ * Parse center position from radial/conic gradient
560
+ */
561
+ function parseGradientCenter(gradientArgs: string): { centerX?: number; centerY?: number } {
562
+ const result: { centerX?: number; centerY?: number } = {};
563
+
564
+ // Check for "at X% Y%" or "at X Y"
565
+ const atMatch = gradientArgs.match(/at\s+(\d+%?)\s+(\d+%?)/i);
566
+ if (atMatch) {
567
+ const xStr = atMatch[1] ?? "50%";
568
+ const yStr = atMatch[2] ?? "50%";
569
+
570
+ result.centerX = xStr.includes("%") ? parseFloat(xStr) / 100 : parseFloat(xStr) / 100;
571
+ result.centerY = yStr.includes("%") ? parseFloat(yStr) / 100 : parseFloat(yStr) / 100;
572
+ }
573
+
574
+ // Check for 'at center' keyword
575
+ if (gradientArgs.toLowerCase().includes("at center")) {
576
+ result.centerX = 0.5;
577
+ result.centerY = 0.5;
578
+ }
579
+
580
+ return result;
581
+ }
582
+
583
+ // =============================================================================
584
+ // Helper Types for Conic Gradient Detection
585
+ // =============================================================================
586
+
587
+ /**
588
+ * Color sample at a specific angle
589
+ */
590
+ interface AngularColorSample {
591
+ color: RGB;
592
+ angle: number;
593
+ }
594
+
595
+ /**
596
+ * Result of angular variation analysis
597
+ */
598
+ interface AngularVariationResult {
599
+ totalVariation: number;
600
+ numTransitions: number;
601
+ avgVariation: number;
602
+ isConic: boolean;
603
+ }
604
+
605
+ /**
606
+ * Significant color point for color stop extraction
607
+ */
608
+ interface SignificantColorPoint {
609
+ color: RGB;
610
+ position: number;
611
+ }
612
+
613
+ // =============================================================================
614
+ // Conic Gradient Helper Functions
615
+ // =============================================================================
616
+
617
+ /**
618
+ * Sample colors around a circle at fixed radius
619
+ */
620
+ function sampleColorsAroundCircle(
621
+ data: Buffer,
622
+ width: number,
623
+ height: number,
624
+ channels: number,
625
+ cx: number,
626
+ cy: number,
627
+ radius: number,
628
+ numSamples: number
629
+ ): AngularColorSample[] {
630
+ const colors: AngularColorSample[] = [];
631
+
632
+ for (let i = 0; i < numSamples; i++) {
633
+ const angle = (i / numSamples) * 2 * Math.PI;
634
+ const x = Math.floor(cx + Math.cos(angle) * radius);
635
+ const y = Math.floor(cy + Math.sin(angle) * radius);
636
+
637
+ if (x >= 0 && x < width && y >= 0 && y < height) {
638
+ const pixelIndex = (y * width + x) * channels;
639
+ const r = data[pixelIndex] ?? 0;
640
+ const g = data[pixelIndex + 1] ?? 0;
641
+ const b = data[pixelIndex + 2] ?? 0;
642
+ colors.push({ color: [r, g, b], angle });
643
+ }
644
+ }
645
+
646
+ return colors;
647
+ }
648
+
649
+ /**
650
+ * Analyze angular color variation to determine if conic gradient exists
651
+ */
652
+ function analyzeAngularVariation(colors: AngularColorSample[]): AngularVariationResult {
653
+ let totalVariation = 0;
654
+ let numTransitions = 0;
655
+
656
+ // Calculate variation between adjacent samples
657
+ for (let i = 1; i < colors.length; i++) {
658
+ const prevColor = colors[i - 1];
659
+ const currColor = colors[i];
660
+ if (prevColor && currColor) {
661
+ const deltaE = colorDistance(prevColor.color, currColor.color);
662
+ totalVariation += deltaE;
663
+ if (deltaE > SIMILAR_COLOR_THRESHOLD) {
664
+ numTransitions++;
665
+ }
666
+ }
667
+ }
668
+
669
+ // Check wrap-around
670
+ const lastColorEntry = colors[colors.length - 1];
671
+ const firstColorEntry = colors[0];
672
+ if (lastColorEntry && firstColorEntry) {
673
+ const wrapDeltaE = colorDistance(lastColorEntry.color, firstColorEntry.color);
674
+ totalVariation += wrapDeltaE;
675
+ }
676
+
677
+ const avgVariation = colors.length > 0 ? totalVariation / colors.length : 0;
678
+
679
+ // Determine if this is a conic gradient
680
+ const hasEnoughTransitions = numTransitions >= CONIC_MIN_TRANSITIONS;
681
+ const hasSignificantVariation = avgVariation > SIMILAR_COLOR_THRESHOLD;
682
+ const hasTotalVariation = totalVariation > CONTINUOUS_GRADIENT_THRESHOLD * 2;
683
+ const isConic = hasEnoughTransitions && hasSignificantVariation && hasTotalVariation;
684
+
685
+ return { totalVariation, numTransitions, avgVariation, isConic };
686
+ }
687
+
688
+ /**
689
+ * Find significant color transition points for color stops
690
+ */
691
+ function findSignificantColorPoints(colors: AngularColorSample[]): SignificantColorPoint[] {
692
+ const significantColors: SignificantColorPoint[] = [];
693
+
694
+ for (let i = 0; i < colors.length; i++) {
695
+ const prevIndex = (i - 1 + colors.length) % colors.length;
696
+ const nextIndex = (i + 1) % colors.length;
697
+
698
+ const prevColorEntry = colors[prevIndex];
699
+ const currColorEntry = colors[i];
700
+ const nextColorEntry = colors[nextIndex];
701
+
702
+ if (prevColorEntry && currColorEntry && nextColorEntry) {
703
+ const prevDeltaE = colorDistance(prevColorEntry.color, currColorEntry.color);
704
+ const nextDeltaE = colorDistance(currColorEntry.color, nextColorEntry.color);
705
+
706
+ // Detect transition points
707
+ if (
708
+ prevDeltaE > CONTINUOUS_GRADIENT_THRESHOLD ||
709
+ nextDeltaE > CONTINUOUS_GRADIENT_THRESHOLD
710
+ ) {
711
+ significantColors.push({
712
+ color: currColorEntry.color,
713
+ position: i / colors.length,
714
+ });
715
+ }
716
+ }
717
+ }
718
+
719
+ return significantColors;
720
+ }
721
+
722
+ /**
723
+ * Extract color stops from angular color samples
724
+ */
725
+ function extractConicColorStops(
726
+ colors: AngularColorSample[],
727
+ significantColors: SignificantColorPoint[]
728
+ ): ColorStop[] {
729
+ const colorStops: ColorStop[] = [];
730
+
731
+ // If few significant points, use evenly distributed samples
732
+ if (significantColors.length < 3) {
733
+ const step = Math.floor(colors.length / 4);
734
+ for (let i = 0; i < 4; i++) {
735
+ const idx = i * step;
736
+ const colorEntry = colors[idx];
737
+ if (colorEntry) {
738
+ colorStops.push({
739
+ color: rgbToHex(colorEntry.color[0], colorEntry.color[1], colorEntry.color[2]),
740
+ position: idx / colors.length,
741
+ });
742
+ }
743
+ }
744
+ } else {
745
+ // Use significant transition points
746
+ for (const sc of significantColors.slice(0, 6)) {
747
+ colorStops.push({
748
+ color: rgbToHex(sc.color[0], sc.color[1], sc.color[2]),
749
+ position: sc.position,
750
+ });
751
+ }
752
+ }
753
+
754
+ // Sort color stops by position
755
+ colorStops.sort((a, b) => a.position - b.position);
756
+
757
+ return colorStops;
758
+ }
759
+
760
+ // =============================================================================
761
+ // Line Gradient Analysis Helper Types and Functions
762
+ // =============================================================================
763
+
764
+ /**
765
+ * Color sample at a specific position along a line
766
+ */
767
+ interface LineColorSample {
768
+ color: RGB;
769
+ position: number;
770
+ }
771
+
772
+ /**
773
+ * Result of analyzing line gradient
774
+ */
775
+ interface LineGradientResult {
776
+ isGradient: boolean;
777
+ colorStops: ColorStop[];
778
+ avgDeltaE: number;
779
+ totalChange: number;
780
+ }
781
+
782
+ /**
783
+ * Sample colors along a line from start to end
784
+ */
785
+ function sampleColorsAlongLine(
786
+ data: Buffer,
787
+ width: number,
788
+ height: number,
789
+ channels: number,
790
+ startX: number,
791
+ startY: number,
792
+ endX: number,
793
+ endY: number,
794
+ step: number
795
+ ): LineColorSample[] {
796
+ const colors: LineColorSample[] = [];
797
+ const dx = endX - startX;
798
+ const dy = endY - startY;
799
+ const length = Math.sqrt(dx * dx + dy * dy);
800
+ const steps = Math.ceil(length / step);
801
+
802
+ if (steps < 2) {
803
+ return colors;
804
+ }
805
+
806
+ for (let i = 0; i <= steps; i++) {
807
+ const t = i / steps;
808
+ const x = Math.round(startX + dx * t);
809
+ const y = Math.round(startY + dy * t);
810
+
811
+ if (x >= 0 && x < width && y >= 0 && y < height) {
812
+ const pixelIndex = (y * width + x) * channels;
813
+ const r = data[pixelIndex] ?? 0;
814
+ const g = data[pixelIndex + 1] ?? 0;
815
+ const b = data[pixelIndex + 2] ?? 0;
816
+ colors.push({ color: [r, g, b], position: t });
817
+ }
818
+ }
819
+
820
+ return colors;
821
+ }
822
+
823
+ /**
824
+ * Calculate color variation metrics along sampled colors
825
+ */
826
+ function calculateColorVariation(colors: LineColorSample[]): {
827
+ avgDeltaE: number;
828
+ totalChange: number;
829
+ firstColor: RGB | null;
830
+ lastColor: RGB | null;
831
+ } {
832
+ if (colors.length < 2) {
833
+ return { avgDeltaE: 0, totalChange: 0, firstColor: null, lastColor: null };
834
+ }
835
+
836
+ let totalDeltaE = 0;
837
+
838
+ for (let i = 1; i < colors.length; i++) {
839
+ const prevColor = colors[i - 1];
840
+ const currColor = colors[i];
841
+ if (prevColor && currColor) {
842
+ const deltaE = colorDistance(prevColor.color, currColor.color);
843
+ totalDeltaE += deltaE;
844
+ }
845
+ }
846
+
847
+ const avgDeltaE = totalDeltaE / (colors.length - 1);
848
+
849
+ const firstColorEntry = colors[0];
850
+ const lastColorEntry = colors[colors.length - 1];
851
+
852
+ if (!firstColorEntry || !lastColorEntry) {
853
+ return { avgDeltaE, totalChange: 0, firstColor: null, lastColor: null };
854
+ }
855
+
856
+ const firstColor = firstColorEntry.color;
857
+ const lastColor = lastColorEntry.color;
858
+ const totalChange = colorDistance(firstColor, lastColor);
859
+
860
+ return { avgDeltaE, totalChange, firstColor, lastColor };
861
+ }
862
+
863
+ /**
864
+ * Extract color stops from line gradient
865
+ */
866
+ function extractLineColorStops(
867
+ colors: LineColorSample[],
868
+ firstColor: RGB,
869
+ lastColor: RGB
870
+ ): ColorStop[] {
871
+ const colorStops: ColorStop[] = [];
872
+
873
+ // Add start
874
+ colorStops.push({
875
+ color: rgbToHex(firstColor[0], firstColor[1], firstColor[2]),
876
+ position: 0,
877
+ });
878
+
879
+ // Find significant intermediate stops
880
+ const middleIndex = Math.floor(colors.length / 2);
881
+ if (colors.length > 4) {
882
+ const midEntry = colors[middleIndex];
883
+ if (midEntry) {
884
+ const midColor = midEntry.color;
885
+ const distFromStart = colorDistance(firstColor, midColor);
886
+ const distFromEnd = colorDistance(midColor, lastColor);
887
+
888
+ if (
889
+ distFromStart > CONTINUOUS_GRADIENT_THRESHOLD &&
890
+ distFromEnd > CONTINUOUS_GRADIENT_THRESHOLD
891
+ ) {
892
+ colorStops.push({
893
+ color: rgbToHex(midColor[0], midColor[1], midColor[2]),
894
+ position: 0.5,
895
+ });
896
+ }
897
+ }
898
+ }
899
+
900
+ // Add end - always at position 1.0
901
+ colorStops.push({
902
+ color: rgbToHex(lastColor[0], lastColor[1], lastColor[2]),
903
+ position: 1,
904
+ });
905
+
906
+ return colorStops;
907
+ }
908
+
909
+ /**
910
+ * Analyze color changes along a line to detect gradient
911
+ *
912
+ * Refactored to reduce cyclomatic complexity by extracting helper functions:
913
+ * - sampleColorsAlongLine: Color sampling
914
+ * - calculateColorVariation: Variation metrics calculation
915
+ * - extractLineColorStops: Color stop extraction
916
+ */
917
+ function analyzeLineGradient(
918
+ data: Buffer,
919
+ width: number,
920
+ height: number,
921
+ channels: number,
922
+ startX: number,
923
+ startY: number,
924
+ endX: number,
925
+ endY: number,
926
+ step: number
927
+ ): LineGradientResult {
928
+ // Step 1: Sample colors along the line
929
+ const colors = sampleColorsAlongLine(
930
+ data,
931
+ width,
932
+ height,
933
+ channels,
934
+ startX,
935
+ startY,
936
+ endX,
937
+ endY,
938
+ step
939
+ );
940
+
941
+ if (colors.length < 2) {
942
+ return { isGradient: false, colorStops: [], avgDeltaE: 0, totalChange: 0 };
943
+ }
944
+
945
+ // Step 2: Calculate color variation metrics
946
+ const { avgDeltaE, totalChange, firstColor, lastColor } = calculateColorVariation(colors);
947
+
948
+ if (!firstColor || !lastColor) {
949
+ return { isGradient: false, colorStops: [], avgDeltaE: 0, totalChange: 0 };
950
+ }
951
+
952
+ // Step 3: Determine if gradient exists
953
+ const isGradient = totalChange > CONTINUOUS_GRADIENT_THRESHOLD;
954
+
955
+ // Step 4: Extract color stops if gradient detected
956
+ const colorStops = isGradient ? extractLineColorStops(colors, firstColor, lastColor) : [];
957
+
958
+ return { isGradient, colorStops, avgDeltaE, totalChange };
959
+ }
960
+
961
+ // =============================================================================
962
+ // Linear Gradient Helper Types and Functions
963
+ // =============================================================================
964
+
965
+ /**
966
+ * Line coordinates for sampling
967
+ */
968
+ interface LineCoordinates {
969
+ startX: number;
970
+ startY: number;
971
+ endX: number;
972
+ endY: number;
973
+ }
974
+
975
+ /**
976
+ * Result from analyzing a specific angle
977
+ */
978
+ interface AngleAnalysisResult {
979
+ angle: number;
980
+ colorStops: ColorStop[];
981
+ avgDeltaE: number;
982
+ totalChange: number;
983
+ isGradient: boolean;
984
+ consistency: number;
985
+ }
986
+
987
+ /** Standard angles to test for linear gradient detection */
988
+ const LINEAR_TEST_ANGLES = [
989
+ 0, 30, 45, 60, 90, 120, 135, 150, 180, 210, 225, 240, 270, 300, 315, 330,
990
+ ];
991
+
992
+ /** Number of parallel lines to sample for each angle */
993
+ const LINEAR_NUM_SAMPLES = 7;
994
+
995
+ /**
996
+ * Calculate sampling line coordinates for a horizontal gradient
997
+ */
998
+ function calculateHorizontalLine(width: number, height: number, offset: number): LineCoordinates {
999
+ const y = Math.floor(height * (0.5 + offset * 0.6));
1000
+ return { startX: 0, startY: y, endX: width - 1, endY: y };
1001
+ }
1002
+
1003
+ /**
1004
+ * Calculate sampling line coordinates for a vertical gradient
1005
+ */
1006
+ function calculateVerticalLine(width: number, height: number, offset: number): LineCoordinates {
1007
+ const x = Math.floor(width * (0.5 + offset * 0.6));
1008
+ return { startX: x, startY: 0, endX: x, endY: height - 1 };
1009
+ }
1010
+
1011
+ /**
1012
+ * Calculate sampling line coordinates for a diagonal gradient
1013
+ */
1014
+ function calculateDiagonalLine(
1015
+ width: number,
1016
+ height: number,
1017
+ cosA: number,
1018
+ sinA: number,
1019
+ offset: number
1020
+ ): LineCoordinates {
1021
+ const centerX = width / 2;
1022
+ const centerY = height / 2;
1023
+ const diagonalLen = (Math.sqrt(width * width + height * height) / 2) * 0.9;
1024
+
1025
+ let startX = Math.floor(centerX - cosA * diagonalLen);
1026
+ let startY = Math.floor(centerY - sinA * diagonalLen);
1027
+ let endX = Math.floor(centerX + cosA * diagonalLen);
1028
+ let endY = Math.floor(centerY + sinA * diagonalLen);
1029
+
1030
+ // Apply perpendicular offset for parallel sampling lines
1031
+ const perpX = -sinA * offset * height * 0.3;
1032
+ const perpY = cosA * offset * height * 0.3;
1033
+ startX += Math.floor(perpX);
1034
+ startY += Math.floor(perpY);
1035
+ endX += Math.floor(perpX);
1036
+ endY += Math.floor(perpY);
1037
+
1038
+ return { startX, startY, endX, endY };
1039
+ }
1040
+
1041
+ /**
1042
+ * Calculate sampling line coordinates for a given angle and offset
1043
+ */
1044
+ function calculateSamplingLine(
1045
+ width: number,
1046
+ height: number,
1047
+ angle: number,
1048
+ cosA: number,
1049
+ sinA: number,
1050
+ offset: number
1051
+ ): LineCoordinates {
1052
+ let coords: LineCoordinates;
1053
+
1054
+ if (angle === 0 || angle === 180) {
1055
+ coords = calculateHorizontalLine(width, height, offset);
1056
+ } else if (angle === 90 || angle === 270) {
1057
+ coords = calculateVerticalLine(width, height, offset);
1058
+ } else {
1059
+ coords = calculateDiagonalLine(width, height, cosA, sinA, offset);
1060
+ }
1061
+
1062
+ // Clamp to bounds
1063
+ return {
1064
+ startX: Math.max(0, Math.min(width - 1, coords.startX)),
1065
+ startY: Math.max(0, Math.min(height - 1, coords.startY)),
1066
+ endX: Math.max(0, Math.min(width - 1, coords.endX)),
1067
+ endY: Math.max(0, Math.min(height - 1, coords.endY)),
1068
+ };
1069
+ }
1070
+
1071
+ /**
1072
+ * Analyze gradient at a specific angle by sampling multiple parallel lines
1073
+ */
1074
+ function analyzeLinearAngle(
1075
+ data: Buffer,
1076
+ width: number,
1077
+ height: number,
1078
+ channels: number,
1079
+ angle: number,
1080
+ step: number
1081
+ ): AngleAnalysisResult | null {
1082
+ const radians = (angle * Math.PI) / 180;
1083
+ const cosA = Math.cos(radians);
1084
+ const sinA = Math.sin(radians);
1085
+ const lineResults: LineGradientResult[] = [];
1086
+
1087
+ for (let s = 0; s < LINEAR_NUM_SAMPLES; s++) {
1088
+ const offset = s / (LINEAR_NUM_SAMPLES - 1) - 0.5;
1089
+ const coords = calculateSamplingLine(width, height, angle, cosA, sinA, offset);
1090
+ const result = analyzeLineGradient(
1091
+ data,
1092
+ width,
1093
+ height,
1094
+ channels,
1095
+ coords.startX,
1096
+ coords.startY,
1097
+ coords.endX,
1098
+ coords.endY,
1099
+ step
1100
+ );
1101
+ lineResults.push(result);
1102
+ }
1103
+
1104
+ // Score this angle based on consistency of gradients across samples
1105
+ const gradientCount = lineResults.filter((r) => r.isGradient).length;
1106
+ const avgDeltaE = lineResults.reduce((sum, r) => sum + r.avgDeltaE, 0) / lineResults.length;
1107
+ const avgTotalChange =
1108
+ lineResults.reduce((sum, r) => sum + r.totalChange, 0) / lineResults.length;
1109
+ const consistency = gradientCount / LINEAR_NUM_SAMPLES;
1110
+
1111
+ // Require at least half the lines to show gradient
1112
+ if (gradientCount < Math.ceil(LINEAR_NUM_SAMPLES * 0.5)) {
1113
+ return null;
1114
+ }
1115
+
1116
+ const firstGradient = lineResults.find((r) => r.isGradient);
1117
+
1118
+ return {
1119
+ angle,
1120
+ colorStops: firstGradient?.colorStops ?? [],
1121
+ avgDeltaE,
1122
+ totalChange: avgTotalChange,
1123
+ isGradient: true,
1124
+ consistency,
1125
+ };
1126
+ }
1127
+
1128
+ /**
1129
+ * Detect linear gradient pattern
1130
+ *
1131
+ * Refactored to reduce cyclomatic complexity by extracting helper functions:
1132
+ * - calculateSamplingLine: Line coordinate calculation
1133
+ * - analyzeLinearAngle: Per-angle analysis
1134
+ */
1135
+ function detectLinearGradient(
1136
+ data: Buffer,
1137
+ width: number,
1138
+ height: number,
1139
+ channels: number,
1140
+ config: GradientDetectorConfig
1141
+ ): DetectedGradient | null {
1142
+ const step = config.sampleStep;
1143
+ let bestResult: AngleAnalysisResult | null = null;
1144
+ let bestScore = 0;
1145
+
1146
+ // Test each angle
1147
+ for (const angle of LINEAR_TEST_ANGLES) {
1148
+ const result = analyzeLinearAngle(data, width, height, channels, angle, step);
1149
+
1150
+ if (result) {
1151
+ const score = result.consistency * result.totalChange;
1152
+ if (score > bestScore) {
1153
+ bestScore = score;
1154
+ bestResult = result;
1155
+ }
1156
+ }
1157
+ }
1158
+
1159
+ if (!bestResult || bestScore < LINEAR_MIN_SCORE_THRESHOLD) {
1160
+ return null;
1161
+ }
1162
+
1163
+ // Calculate confidence based on total color change and consistency
1164
+ const colorChangeRatio = Math.min(1, bestResult.totalChange / 300);
1165
+ const confidence = Math.min(1, colorChangeRatio * 0.7 + bestResult.consistency * 0.3);
1166
+
1167
+ return {
1168
+ type: "linear",
1169
+ direction: bestResult.angle,
1170
+ colorStops: bestResult.colorStops,
1171
+ region: { x: 0, y: 0, width, height },
1172
+ confidence,
1173
+ };
1174
+ }
1175
+
1176
+ // =============================================================================
1177
+ // Radial Gradient Helper Types and Functions
1178
+ // =============================================================================
1179
+
1180
+ /**
1181
+ * Center candidate for radial gradient detection
1182
+ */
1183
+ interface CenterCandidate {
1184
+ x: number;
1185
+ y: number;
1186
+ }
1187
+
1188
+ /**
1189
+ * Result from analyzing a potential radial center
1190
+ */
1191
+ interface RadialCenterResult {
1192
+ centerX: number;
1193
+ centerY: number;
1194
+ colorStops: ColorStop[];
1195
+ score: number;
1196
+ consistency: number;
1197
+ totalChange: number;
1198
+ isRadial: boolean;
1199
+ }
1200
+
1201
+ /** Standard center candidates for radial gradient detection */
1202
+ const RADIAL_CENTER_CANDIDATES: CenterCandidate[] = [
1203
+ { x: 0.5, y: 0.5 },
1204
+ { x: 0.25, y: 0.5 },
1205
+ { x: 0.75, y: 0.5 },
1206
+ { x: 0.5, y: 0.25 },
1207
+ { x: 0.5, y: 0.75 },
1208
+ { x: 0.25, y: 0.25 },
1209
+ { x: 0.75, y: 0.75 },
1210
+ { x: 0.25, y: 0.75 },
1211
+ { x: 0.75, y: 0.25 },
1212
+ ];
1213
+
1214
+ /**
1215
+ * Calculate the end point for a radial line from center at given angle
1216
+ */
1217
+ function calculateRadialEndPoint(
1218
+ cx: number,
1219
+ cy: number,
1220
+ width: number,
1221
+ height: number,
1222
+ angle: number
1223
+ ): { endX: number; endY: number } {
1224
+ const maxX = angle > Math.PI / 2 && angle < (3 * Math.PI) / 2 ? cx : width - cx;
1225
+ const maxY = angle > 0 && angle < Math.PI ? height - cy : cy;
1226
+ const radius =
1227
+ Math.min(maxX / Math.abs(Math.cos(angle) || 0.001), maxY / Math.abs(Math.sin(angle) || 0.001)) *
1228
+ 0.85;
1229
+ const clampedRadius = Math.min(radius, Math.max(width, height) * 0.7);
1230
+ const endX = Math.floor(cx + Math.cos(angle) * clampedRadius);
1231
+ const endY = Math.floor(cy + Math.sin(angle) * clampedRadius);
1232
+ return { endX, endY };
1233
+ }
1234
+
1235
+ /**
1236
+ * Analyze radial gradient from a specific center point
1237
+ */
1238
+ function analyzeRadialCenter(
1239
+ data: Buffer,
1240
+ width: number,
1241
+ height: number,
1242
+ channels: number,
1243
+ center: CenterCandidate,
1244
+ step: number,
1245
+ numAngles: number
1246
+ ): RadialCenterResult {
1247
+ const cx = Math.floor(width * center.x);
1248
+ const cy = Math.floor(height * center.y);
1249
+ const radialResults: LineGradientResult[] = [];
1250
+
1251
+ // Sample along multiple radial lines from center
1252
+ for (let i = 0; i < numAngles; i++) {
1253
+ const angle = (i / numAngles) * 2 * Math.PI;
1254
+ const { endX, endY } = calculateRadialEndPoint(cx, cy, width, height, angle);
1255
+ const result = analyzeLineGradient(data, width, height, channels, cx, cy, endX, endY, step);
1256
+ radialResults.push(result);
1257
+ }
1258
+
1259
+ // Calculate metrics
1260
+ const gradientCount = radialResults.filter((r) => r.isGradient).length;
1261
+ const avgTotalChange =
1262
+ radialResults.reduce((sum, r) => sum + r.totalChange, 0) / radialResults.length;
1263
+ const consistency = gradientCount / numAngles;
1264
+
1265
+ // For radial gradient, at least half the radial lines should show gradient
1266
+ const isRadial = consistency >= RADIAL_CONSISTENCY_THRESHOLD && gradientCount >= 6;
1267
+ const score = consistency * avgTotalChange;
1268
+
1269
+ const firstGradient = radialResults.find((r) => r.isGradient);
1270
+
1271
+ return {
1272
+ centerX: center.x,
1273
+ centerY: center.y,
1274
+ colorStops: firstGradient?.colorStops ?? [],
1275
+ score,
1276
+ consistency,
1277
+ totalChange: avgTotalChange,
1278
+ isRadial,
1279
+ };
1280
+ }
1281
+
1282
+ /**
1283
+ * Detect radial gradient pattern
1284
+ *
1285
+ * Refactored to reduce cyclomatic complexity by extracting helper functions:
1286
+ * - calculateRadialEndPoint: End point calculation
1287
+ * - analyzeRadialCenter: Center point analysis
1288
+ */
1289
+ function detectRadialGradient(
1290
+ data: Buffer,
1291
+ width: number,
1292
+ height: number,
1293
+ channels: number,
1294
+ config: GradientDetectorConfig
1295
+ ): DetectedGradient | null {
1296
+ const step = config.sampleStep;
1297
+ const numAngles = 16; // Increased for better detection
1298
+
1299
+ let bestResult: RadialCenterResult | null = null;
1300
+
1301
+ // Test each center candidate
1302
+ for (const center of RADIAL_CENTER_CANDIDATES) {
1303
+ const result = analyzeRadialCenter(data, width, height, channels, center, step, numAngles);
1304
+
1305
+ if (result.isRadial && (!bestResult || result.score > bestResult.score)) {
1306
+ bestResult = result;
1307
+ }
1308
+ }
1309
+
1310
+ if (!bestResult || !bestResult.isRadial) {
1311
+ return null;
1312
+ }
1313
+
1314
+ // Calculate confidence based on consistency and color change
1315
+ const colorChangeRatio = Math.min(1, bestResult.totalChange / 250);
1316
+ const confidence = Math.min(1, colorChangeRatio * 0.5 + bestResult.consistency * 0.5);
1317
+
1318
+ return {
1319
+ type: "radial",
1320
+ centerX: bestResult.centerX,
1321
+ centerY: bestResult.centerY,
1322
+ colorStops: bestResult.colorStops,
1323
+ region: { x: 0, y: 0, width, height },
1324
+ confidence,
1325
+ };
1326
+ }
1327
+
1328
+ /**
1329
+ * Detect conic gradient pattern
1330
+ *
1331
+ * Refactored to reduce cyclomatic complexity by extracting helper functions:
1332
+ * - sampleColorsAroundCircle: Color sampling
1333
+ * - analyzeAngularVariation: Variation analysis
1334
+ * - findSignificantColorPoints: Transition point detection
1335
+ * - extractConicColorStops: Color stop extraction
1336
+ */
1337
+ function detectConicGradient(
1338
+ data: Buffer,
1339
+ width: number,
1340
+ height: number,
1341
+ channels: number,
1342
+ _config: GradientDetectorConfig
1343
+ ): DetectedGradient | null {
1344
+ const cx = Math.floor(width / 2);
1345
+ const cy = Math.floor(height / 2);
1346
+ const radius = Math.min(width, height) / 3;
1347
+ const numSamples = 36; // Every 10 degrees
1348
+
1349
+ // Step 1: Sample colors around circle
1350
+ const colors = sampleColorsAroundCircle(
1351
+ data,
1352
+ width,
1353
+ height,
1354
+ channels,
1355
+ cx,
1356
+ cy,
1357
+ radius,
1358
+ numSamples
1359
+ );
1360
+
1361
+ if (colors.length < numSamples * CONIC_MIN_SAMPLES_RATIO) {
1362
+ return null;
1363
+ }
1364
+
1365
+ // Step 2: Analyze angular variation
1366
+ const variationResult = analyzeAngularVariation(colors);
1367
+
1368
+ if (!variationResult.isConic) {
1369
+ return null;
1370
+ }
1371
+
1372
+ // Step 3: Find significant color points
1373
+ const significantColors = findSignificantColorPoints(colors);
1374
+
1375
+ // Step 4: Extract color stops
1376
+ const colorStops = extractConicColorStops(colors, significantColors);
1377
+
1378
+ // Calculate confidence
1379
+ const confidence = Math.min(1, variationResult.avgVariation / 30);
1380
+
1381
+ return {
1382
+ type: "conic",
1383
+ centerX: 0.5,
1384
+ centerY: 0.5,
1385
+ colorStops,
1386
+ region: { x: 0, y: 0, width, height },
1387
+ confidence,
1388
+ };
1389
+ }
1390
+
1391
+ /**
1392
+ * Check if image is mostly solid color
1393
+ */
1394
+ function isSolidColor(
1395
+ data: Buffer,
1396
+ width: number,
1397
+ height: number,
1398
+ channels: number,
1399
+ sampleStep: number
1400
+ ): boolean {
1401
+ const colors: RGB[] = [];
1402
+
1403
+ // Sample a grid of pixels
1404
+ for (let y = 0; y < height; y += sampleStep) {
1405
+ for (let x = 0; x < width; x += sampleStep) {
1406
+ const pixelIndex = (y * width + x) * channels;
1407
+ const r = data[pixelIndex] ?? 0;
1408
+ const g = data[pixelIndex + 1] ?? 0;
1409
+ const b = data[pixelIndex + 2] ?? 0;
1410
+ colors.push([r, g, b]);
1411
+ }
1412
+ }
1413
+
1414
+ if (colors.length < 2) {
1415
+ return true;
1416
+ }
1417
+
1418
+ // Calculate max color distance from first sample
1419
+ const firstColor = colors[0];
1420
+ if (!firstColor) {
1421
+ return true;
1422
+ }
1423
+ let maxDistance = 0;
1424
+
1425
+ for (let i = 1; i < colors.length; i++) {
1426
+ const currentColor = colors[i];
1427
+ if (currentColor) {
1428
+ const dist = colorDistance(firstColor, currentColor);
1429
+ maxDistance = Math.max(maxDistance, dist);
1430
+ }
1431
+ }
1432
+
1433
+ // If max distance is small, consider it solid
1434
+ return maxDistance < CONTINUOUS_GRADIENT_THRESHOLD;
1435
+ }
1436
+
1437
+ // =============================================================================
1438
+ // Helper Types and Functions for detectGradientInternal
1439
+ // =============================================================================
1440
+
1441
+ /**
1442
+ * Type weight mapping for gradient type specificity
1443
+ * Higher weight = more specific gradient type
1444
+ */
1445
+ const GRADIENT_TYPE_WEIGHTS: Record<string, number> = {
1446
+ conic: 3,
1447
+ radial: 2,
1448
+ linear: 1,
1449
+ };
1450
+
1451
+ /**
1452
+ * Get type weight for sorting
1453
+ */
1454
+ function getGradientTypeWeight(type: string): number {
1455
+ return GRADIENT_TYPE_WEIGHTS[type] ?? 0;
1456
+ }
1457
+
1458
+ /**
1459
+ * Detect all gradient types and collect results
1460
+ */
1461
+ function detectAllGradientTypes(
1462
+ data: Buffer,
1463
+ width: number,
1464
+ height: number,
1465
+ channels: number,
1466
+ config: GradientDetectorConfig
1467
+ ): DetectedGradient[] {
1468
+ const gradients: DetectedGradient[] = [];
1469
+
1470
+ const linearGradient = detectLinearGradient(data, width, height, channels, config);
1471
+ const radialGradient = detectRadialGradient(data, width, height, channels, config);
1472
+ const conicGradient = detectConicGradient(data, width, height, channels, config);
1473
+
1474
+ if (linearGradient) {
1475
+ gradients.push(linearGradient);
1476
+ }
1477
+ if (radialGradient) {
1478
+ gradients.push(radialGradient);
1479
+ }
1480
+ if (conicGradient) {
1481
+ gradients.push(conicGradient);
1482
+ }
1483
+
1484
+ return gradients;
1485
+ }
1486
+
1487
+ /**
1488
+ * Sort gradients by confidence and type specificity
1489
+ */
1490
+ function sortGradientsByPriority(gradients: DetectedGradient[]): void {
1491
+ gradients.sort((a, b) => {
1492
+ // If confidence difference is significant, use confidence
1493
+ if (Math.abs(a.confidence - b.confidence) > 0.2) {
1494
+ return b.confidence - a.confidence;
1495
+ }
1496
+ // Otherwise prioritize by type specificity
1497
+ return getGradientTypeWeight(b.type) - getGradientTypeWeight(a.type);
1498
+ });
1499
+ }
1500
+
1501
+ /**
1502
+ * Build the final gradient detection result
1503
+ */
1504
+ function buildGradientResult(
1505
+ gradients: DetectedGradient[],
1506
+ processingTimeMs: number
1507
+ ): GradientDetectionResult {
1508
+ // Determine dominant type
1509
+ let dominantGradientType: "linear" | "radial" | "conic" | undefined = undefined;
1510
+ const firstGradient = gradients[0];
1511
+ if (firstGradient) {
1512
+ dominantGradientType = firstGradient.type;
1513
+ }
1514
+
1515
+ // Calculate overall confidence
1516
+ const overallConfidence =
1517
+ gradients.length > 0 ? Math.max(...gradients.map((g) => g.confidence)) : 0;
1518
+
1519
+ const result: GradientDetectionResult = {
1520
+ hasGradient: gradients.length > 0,
1521
+ gradients,
1522
+ confidence: overallConfidence,
1523
+ processingTimeMs,
1524
+ };
1525
+
1526
+ if (dominantGradientType) {
1527
+ result.dominantGradientType = dominantGradientType;
1528
+ }
1529
+
1530
+ return result;
1531
+ }
1532
+
1533
+ // =============================================================================
1534
+ // CSS String Generation (v0.1.0)
1535
+ // =============================================================================
1536
+
1537
+ /**
1538
+ * Generate CSS gradient string from DetectedGradient
1539
+ */
1540
+ function generateCSSString(gradient: DetectedGradient): string {
1541
+ const colorStopsStr = gradient.colorStops
1542
+ .map((stop) => `${stop.color} ${Math.round(stop.position * 100)}%`)
1543
+ .join(", ");
1544
+
1545
+ switch (gradient.type) {
1546
+ case "linear": {
1547
+ const angle = gradient.direction ?? 0;
1548
+ return `linear-gradient(${angle}deg, ${colorStopsStr})`;
1549
+ }
1550
+ case "radial": {
1551
+ const cx = gradient.centerX ?? 0.5;
1552
+ const cy = gradient.centerY ?? 0.5;
1553
+ return `radial-gradient(circle at ${Math.round(cx * 100)}% ${Math.round(cy * 100)}%, ${colorStopsStr})`;
1554
+ }
1555
+ case "conic": {
1556
+ const cx = gradient.centerX ?? 0.5;
1557
+ const cy = gradient.centerY ?? 0.5;
1558
+ return `conic-gradient(from 0deg at ${Math.round(cx * 100)}% ${Math.round(cy * 100)}%, ${colorStopsStr})`;
1559
+ }
1560
+ default:
1561
+ return `linear-gradient(${colorStopsStr})`;
1562
+ }
1563
+ }
1564
+
1565
+ /**
1566
+ * Internal implementation of GradientDetectorService
1567
+ */
1568
+ class GradientDetectorServiceImpl implements GradientDetectorService {
1569
+ private config: GradientDetectorConfig;
1570
+
1571
+ constructor(config: Partial<GradientDetectorConfig> = {}) {
1572
+ this.config = { ...DEFAULT_CONFIG, ...config };
1573
+ }
1574
+
1575
+ async detectGradient(image: Buffer | string): Promise<GradientDetectionResult> {
1576
+ const startTime = performance.now();
1577
+
1578
+ // Parse and validate input with size check (5MB max) - SEC H-1
1579
+ const imageBuffer = parseAndValidateImageInput(image);
1580
+
1581
+ logSecurityEvent("GradientDetector", "Processing image", {
1582
+ size: imageBuffer.length,
1583
+ sizeKB: Math.round(imageBuffer.length / 1024),
1584
+ });
1585
+
1586
+ // Wrap processing with timeout (30s default) - SEC M-1
1587
+ const result = await withTimeout(
1588
+ this.detectGradientInternal(imageBuffer, startTime),
1589
+ DEFAULT_PROCESSING_TIMEOUT
1590
+ );
1591
+
1592
+ return result;
1593
+ }
1594
+
1595
+ /**
1596
+ * Detect gradients from CSS text (v0.1.0)
1597
+ */
1598
+ detectGradientFromCSS(css: string): GradientDetectionResult {
1599
+ const startTime = performance.now();
1600
+
1601
+ // Handle null/undefined
1602
+ if (!css || typeof css !== "string") {
1603
+ return {
1604
+ hasGradient: false,
1605
+ gradients: [],
1606
+ confidence: 0,
1607
+ processingTimeMs: performance.now() - startTime,
1608
+ };
1609
+ }
1610
+
1611
+ logger.debug("[GradientDetector] Parsing CSS for gradients:", {
1612
+ cssLength: css.length,
1613
+ });
1614
+
1615
+ const gradients: DetectedGradient[] = [];
1616
+
1617
+ try {
1618
+ const rules = parseCSSRules(css);
1619
+
1620
+ for (const rule of rules) {
1621
+ // Check background and background-image properties
1622
+ const bgProps = ["background", "background-image"];
1623
+
1624
+ for (const prop of bgProps) {
1625
+ const value = rule.declarations.get(prop);
1626
+ if (!value) continue;
1627
+
1628
+ // Extract gradient matches from the value
1629
+ const gradientMatches = extractGradientMatches(value);
1630
+
1631
+ for (const match of gradientMatches) {
1632
+ // Extract gradient arguments (inside parentheses)
1633
+ const argsMatch = match.fullMatch.match(/\(([^()]*(?:\([^()]*\)[^()]*)*)\)/);
1634
+ const gradientArgs = argsMatch?.[1] ?? "";
1635
+
1636
+ // Parse color stops
1637
+ const colorStops = parseColorStopsFromCSS(gradientArgs);
1638
+
1639
+ // Create detected gradient
1640
+ const detectedGradient: DetectedGradient = {
1641
+ type: match.type,
1642
+ colorStops,
1643
+ region: { x: 0, y: 0, width: 0, height: 0 }, // Region not applicable for CSS
1644
+ confidence: 1.0, // High confidence for CSS parsing
1645
+ cssString: match.isRepeating ? match.fullMatch : match.fullMatch,
1646
+ parentElement: rule.selector,
1647
+ };
1648
+
1649
+ // Parse type-specific properties
1650
+ if (match.type === "linear") {
1651
+ const direction = parseLinearDirection(gradientArgs);
1652
+ if (direction !== undefined) {
1653
+ detectedGradient.direction = direction;
1654
+ }
1655
+ } else if (match.type === "radial" || match.type === "conic") {
1656
+ const center = parseGradientCenter(gradientArgs);
1657
+ if (center.centerX !== undefined) {
1658
+ detectedGradient.centerX = center.centerX;
1659
+ }
1660
+ if (center.centerY !== undefined) {
1661
+ detectedGradient.centerY = center.centerY;
1662
+ }
1663
+ }
1664
+
1665
+ // Parse animation info
1666
+ const animation = parseAnimationInfo(rule.declarations);
1667
+ if (animation) {
1668
+ detectedGradient.animation = animation;
1669
+ }
1670
+
1671
+ // Parse transition info
1672
+ const transition = parseTransitionInfo(rule.declarations);
1673
+ if (transition) {
1674
+ detectedGradient.transition = transition;
1675
+ }
1676
+
1677
+ gradients.push(detectedGradient);
1678
+ }
1679
+ }
1680
+ }
1681
+ } catch (error) {
1682
+ if (process.env.NODE_ENV === "development") {
1683
+ console.error("[GradientDetector] Error parsing CSS:", error);
1684
+ }
1685
+ }
1686
+
1687
+ const processingTimeMs = performance.now() - startTime;
1688
+
1689
+ // Determine dominant gradient type
1690
+ let dominantGradientType: "linear" | "radial" | "conic" | undefined;
1691
+ if (gradients.length > 0) {
1692
+ dominantGradientType = gradients[0]?.type;
1693
+ }
1694
+
1695
+ const result: GradientDetectionResult = {
1696
+ hasGradient: gradients.length > 0,
1697
+ gradients,
1698
+ confidence: gradients.length > 0 ? 1.0 : 0,
1699
+ processingTimeMs,
1700
+ };
1701
+
1702
+ if (dominantGradientType) {
1703
+ result.dominantGradientType = dominantGradientType;
1704
+ }
1705
+
1706
+ logger.debug("[GradientDetector] CSS detection result:", {
1707
+ hasGradient: result.hasGradient,
1708
+ gradientCount: result.gradients.length,
1709
+ dominantType: result.dominantGradientType,
1710
+ processingTimeMs: processingTimeMs.toFixed(0),
1711
+ });
1712
+
1713
+ return result;
1714
+ }
1715
+
1716
+ private async detectGradientInternal(
1717
+ imageBuffer: Buffer,
1718
+ startTime: number
1719
+ ): Promise<GradientDetectionResult> {
1720
+ try {
1721
+ const processedImage = sharp(imageBuffer);
1722
+ const metadata = await processedImage.metadata();
1723
+
1724
+ if (!metadata.width || !metadata.height) {
1725
+ throw new Error("Invalid image: unable to read dimensions");
1726
+ }
1727
+
1728
+ // Resize for performance while maintaining aspect ratio
1729
+ const resizeOptions: sharp.ResizeOptions = {
1730
+ width: Math.min(metadata.width, this.config.maxProcessingWidth),
1731
+ height: Math.min(metadata.height, this.config.maxProcessingHeight),
1732
+ fit: "inside",
1733
+ withoutEnlargement: true,
1734
+ };
1735
+
1736
+ // Get raw RGB pixel data (flatten handles transparency)
1737
+ const { data, info } = await processedImage
1738
+ .resize(resizeOptions)
1739
+ .flatten({ background: { r: 255, g: 255, b: 255 } })
1740
+ .raw()
1741
+ .toBuffer({ resolveWithObject: true });
1742
+
1743
+ const { width, height, channels } = info;
1744
+
1745
+ // First check if image is solid color
1746
+ if (isSolidColor(data, width, height, channels, this.config.sampleStep)) {
1747
+ return {
1748
+ hasGradient: false,
1749
+ gradients: [],
1750
+ confidence: 1,
1751
+ processingTimeMs: performance.now() - startTime,
1752
+ };
1753
+ }
1754
+
1755
+ // Detect all gradient types
1756
+ const gradients = detectAllGradientTypes(data, width, height, channels, this.config);
1757
+
1758
+ // Add cssString to each gradient (v0.1.0)
1759
+ for (const gradient of gradients) {
1760
+ gradient.cssString = generateCSSString(gradient);
1761
+ }
1762
+
1763
+ // Sort by type specificity and confidence
1764
+ sortGradientsByPriority(gradients);
1765
+
1766
+ // Build and return the result
1767
+ const processingTimeMs = performance.now() - startTime;
1768
+ const result = buildGradientResult(gradients, processingTimeMs);
1769
+
1770
+ logger.debug("[GradientDetector] Detection result:", {
1771
+ hasGradient: result.hasGradient,
1772
+ gradientCount: result.gradients.length,
1773
+ dominantType: result.dominantGradientType,
1774
+ confidence: result.confidence.toFixed(2),
1775
+ processingTimeMs: processingTimeMs.toFixed(0),
1776
+ });
1777
+
1778
+ return result;
1779
+ } catch (error) {
1780
+ throw wrapSharpError(error);
1781
+ }
1782
+ }
1783
+ }
1784
+
1785
+ /**
1786
+ * Create a new GradientDetectorService instance
1787
+ * @param config - Optional configuration options
1788
+ * @returns GradientDetectorService instance
1789
+ */
1790
+ export function createGradientDetectorService(
1791
+ config?: Partial<GradientDetectorConfig>
1792
+ ): GradientDetectorService {
1793
+ return new GradientDetectorServiceImpl(config);
1794
+ }