opendevbrowser 0.0.31 → 0.0.32

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 (294) hide show
  1. package/README.md +18 -5
  2. package/dist/{accessibility-snapshot-CQ4ZKWKC.js → accessibility-snapshot-XOP66CSK.js} +11 -11
  3. package/dist/{active-window-TD5HYJ72.js → active-window-E3WFOQGX.js} +11 -11
  4. package/dist/{annotate-VTLFS2XV.js → annotate-MAE7ZJOZ.js} +10 -10
  5. package/dist/{artifacts-KJ6RNDO2.js → artifacts-JHDUUJGQ.js} +2 -2
  6. package/dist/{attr-BCI5KYCW.js → attr-M3PFDJ7Q.js} +10 -10
  7. package/dist/{canvas-5DFEEOKM.js → canvas-3AJVL5I5.js} +10 -10
  8. package/dist/{capture-desktop-HFTTWY4Z.js → capture-desktop-VJGEETMJ.js} +11 -11
  9. package/dist/{capture-window-X63XPIFF.js → capture-window-W5UFSFQL.js} +11 -11
  10. package/dist/{check-LWAUY7GC.js → check-4IR3UJVW.js} +10 -10
  11. package/dist/{checked-ZSOUKVYT.js → checked-PKNY7724.js} +10 -10
  12. package/dist/{chunk-KZ2IXVQT.js → chunk-2X4JFMKJ.js} +39 -4
  13. package/dist/chunk-2X4JFMKJ.js.map +1 -0
  14. package/dist/{chunk-IPE7TF2P.js → chunk-7BNU6DFI.js} +8 -5
  15. package/dist/chunk-7BNU6DFI.js.map +1 -0
  16. package/dist/{chunk-6B5WAQV7.js → chunk-AKIAGFOE.js} +30 -7
  17. package/dist/chunk-AKIAGFOE.js.map +1 -0
  18. package/dist/{chunk-2I3YS3DV.js → chunk-AWQ37HSC.js} +7 -3
  19. package/dist/chunk-AWQ37HSC.js.map +1 -0
  20. package/dist/{chunk-3ILXPKSJ.js → chunk-BUVYTJZR.js} +2 -1
  21. package/dist/chunk-BUVYTJZR.js.map +1 -0
  22. package/dist/{chunk-AHEWXOKY.js → chunk-BUXFIY2P.js} +4 -4
  23. package/dist/{chunk-QOMWCRE3.js → chunk-HBK56JST.js} +3 -3
  24. package/dist/{chunk-T4GMCW6Z.js → chunk-J3KYGJRQ.js} +3 -3
  25. package/dist/{chunk-6PVZ2ABC.js → chunk-L3YNUGYF.js} +2 -2
  26. package/dist/{chunk-JZXD6FWR.js → chunk-NURQB55J.js} +2 -2
  27. package/dist/{chunk-GQJ5S3BL.js → chunk-P5K3ZIPI.js} +3 -3
  28. package/dist/{chunk-PPUWQKIC.js → chunk-PIFHXKV4.js} +4 -4
  29. package/dist/{chunk-STGGGVYT.js → chunk-QMHKAFYX.js} +2 -2
  30. package/dist/{chunk-4BEJVZRK.js → chunk-RO3SMXF3.js} +1073 -138
  31. package/dist/chunk-RO3SMXF3.js.map +1 -0
  32. package/dist/{chunk-RPXWUCQQ.js → chunk-SKFB5ICF.js} +2 -2
  33. package/dist/{chunk-2SIMIPLY.js → chunk-W6YPVNDX.js} +3 -3
  34. package/dist/{chunk-MD655IPO.js → chunk-XDLJE3RJ.js} +11 -4
  35. package/dist/chunk-XDLJE3RJ.js.map +1 -0
  36. package/dist/{chunk-KDSNXS6N.js → chunk-ZMNEWS7A.js} +2 -2
  37. package/dist/{chunk-COAOWH3G.js → chunk-ZOVMMQO6.js} +119 -27
  38. package/dist/chunk-ZOVMMQO6.js.map +1 -0
  39. package/dist/cli/args.d.ts.map +1 -1
  40. package/dist/cli/commands/daemon.d.ts +19 -2
  41. package/dist/cli/commands/daemon.d.ts.map +1 -1
  42. package/dist/cli/commands/inspiredesign.d.ts +6 -1
  43. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  44. package/dist/cli/commands/serve.d.ts +12 -3
  45. package/dist/cli/commands/serve.d.ts.map +1 -1
  46. package/dist/cli/commands/status.d.ts.map +1 -1
  47. package/dist/cli/commands/types.d.ts +1 -0
  48. package/dist/cli/commands/types.d.ts.map +1 -1
  49. package/dist/cli/daemon-client.d.ts.map +1 -1
  50. package/dist/cli/daemon-commands.d.ts.map +1 -1
  51. package/dist/cli/daemon-mismatch.d.ts +9 -0
  52. package/dist/cli/daemon-mismatch.d.ts.map +1 -0
  53. package/dist/cli/daemon.d.ts.map +1 -1
  54. package/dist/cli/errors.d.ts +4 -2
  55. package/dist/cli/errors.d.ts.map +1 -1
  56. package/dist/cli/help.d.ts.map +1 -1
  57. package/dist/cli/index.js +89 -88
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/cli/installers/postinstall-skill-sync.js +2 -2
  60. package/dist/{click-2AILSEIZ.js → click-HLNXU4I5.js} +10 -10
  61. package/dist/{clone-component-TPJS3PEG.js → clone-component-QIKN5PIM.js} +9 -9
  62. package/dist/{clone-page-LE74CIFC.js → clone-page-5C7DTGZT.js} +9 -9
  63. package/dist/{close-HN4YI47K.js → close-PCRZHX7F.js} +9 -9
  64. package/dist/{close-WFERRHX6.js → close-WTXB3EDD.js} +9 -9
  65. package/dist/{connect-RWBV2UCQ.js → connect-6C2IG55I.js} +10 -10
  66. package/dist/{console-poll-PP4YYPDF.js → console-poll-VJXCZR3F.js} +10 -10
  67. package/dist/{cookie-import-6IP776FC.js → cookie-import-5OEDFB6U.js} +9 -9
  68. package/dist/{cookie-list-O2KG6DPU.js → cookie-list-44UNJJ6D.js} +9 -9
  69. package/dist/{daemon-2BSAZXLT.js → daemon-CIKGBWEB.js} +25 -12
  70. package/dist/daemon-CIKGBWEB.js.map +1 -0
  71. package/dist/daemon-fingerprint.json +1 -1
  72. package/dist/{debug-trace-snapshot-F3BDVZXS.js → debug-trace-snapshot-RGXAPGWB.js} +10 -10
  73. package/dist/{dialog-6JQYUWMQ.js → dialog-S64MJUM2.js} +10 -10
  74. package/dist/{disconnect-763TP7GH.js → disconnect-MTIELIM7.js} +9 -9
  75. package/dist/{enabled-DLYQFNIP.js → enabled-KF2L7LW4.js} +10 -10
  76. package/dist/{goto-S346TJJH.js → goto-ULWINUAZ.js} +10 -10
  77. package/dist/{help-U7KBQME6.js → help-IG5S5RJD.js} +13 -9
  78. package/dist/help-IG5S5RJD.js.map +1 -0
  79. package/dist/{hover-6JVJFGO7.js → hover-NOCOTR6N.js} +10 -10
  80. package/dist/{html-EVOSPBIT.js → html-LXSYP6BT.js} +10 -10
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +46 -17
  83. package/dist/index.js.map +1 -1
  84. package/dist/{inspector-H57BVUJP.js → inspector-62EPCLYB.js} +11 -11
  85. package/dist/{inspector-audit-NQBAJWC7.js → inspector-audit-T2IF67RJ.js} +13 -13
  86. package/dist/{inspector-plan-ZDIQVND3.js → inspector-plan-KQS6LRMW.js} +11 -11
  87. package/dist/inspiredesign/capture.d.ts +4 -0
  88. package/dist/inspiredesign/capture.d.ts.map +1 -1
  89. package/dist/inspiredesign/contract.d.ts +22 -0
  90. package/dist/inspiredesign/contract.d.ts.map +1 -1
  91. package/dist/inspiredesign/handoff.d.ts +7 -1
  92. package/dist/inspiredesign/handoff.d.ts.map +1 -1
  93. package/dist/inspiredesign/meta-prompt.d.ts +9 -0
  94. package/dist/inspiredesign/meta-prompt.d.ts.map +1 -0
  95. package/dist/inspiredesign/reference-discovery.d.ts +29 -0
  96. package/dist/inspiredesign/reference-discovery.d.ts.map +1 -0
  97. package/dist/inspiredesign/reference-pattern-board.d.ts +21 -0
  98. package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
  99. package/dist/inspiredesign/visual-evidence.d.ts +46 -0
  100. package/dist/inspiredesign/visual-evidence.d.ts.map +1 -0
  101. package/dist/inspiredesign/visual-policy.d.ts +17 -0
  102. package/dist/inspiredesign/visual-policy.d.ts.map +1 -0
  103. package/dist/{inspiredesign-IEUL4PX3.js → inspiredesign-DB6CHYN3.js} +71 -19
  104. package/dist/inspiredesign-DB6CHYN3.js.map +1 -0
  105. package/dist/{launch-EK66VQPF.js → launch-B5ES6FVS.js} +10 -10
  106. package/dist/{list-KKUKN467.js → list-TIZVR6RO.js} +9 -9
  107. package/dist/{list-ADZAQ2IU.js → list-XM4BP5GM.js} +9 -9
  108. package/dist/{macro-resolve-6DOQJ7CA.js → macro-resolve-TTQZVFIW.js} +10 -10
  109. package/dist/{native-UPLVQ2SG.js → native-J2DFLOLP.js} +3 -3
  110. package/dist/{network-poll-NUL4PDPY.js → network-poll-NNSY4W63.js} +10 -10
  111. package/dist/{new-5NKYPEFT.js → new-E6VNAC2A.js} +9 -9
  112. package/dist/{open-NR3BPLXV.js → open-F55XKMKB.js} +9 -9
  113. package/dist/opendevbrowser.d.ts.map +1 -1
  114. package/dist/opendevbrowser.js +46 -17
  115. package/dist/opendevbrowser.js.map +1 -1
  116. package/dist/{perf-HJ36ZI6H.js → perf-RE7JE6CP.js} +10 -10
  117. package/dist/{pointer-down-IYTTQWXZ.js → pointer-down-BCBPC5FJ.js} +11 -11
  118. package/dist/{pointer-drag-A2YC5PWI.js → pointer-drag-QK7KGF7W.js} +11 -11
  119. package/dist/{pointer-move-W5K5FUI4.js → pointer-move-VFAZQAXA.js} +11 -11
  120. package/dist/{pointer-up-6GWVO64Y.js → pointer-up-FA5WE6LS.js} +11 -11
  121. package/dist/{press-A3V5WB3S.js → press-TNRHNDSW.js} +10 -10
  122. package/dist/{product-video-52REKWF3.js → product-video-UEANMZ2U.js} +11 -11
  123. package/dist/providers/renderer.d.ts +7 -1
  124. package/dist/providers/renderer.d.ts.map +1 -1
  125. package/dist/providers/workflow-handoff.d.ts +1 -0
  126. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  127. package/dist/providers/workflows.d.ts +45 -3
  128. package/dist/providers/workflows.d.ts.map +1 -1
  129. package/dist/{providers-IMFYMMHQ.js → providers-AMCNWZUL.js} +3 -3
  130. package/dist/public-surface/generated-manifest.d.ts +12 -3
  131. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  132. package/dist/public-surface/source.d.ts +5 -5
  133. package/dist/public-surface/source.d.ts.map +1 -1
  134. package/dist/{research-WB6BBCDD.js → research-YFY7WJSZ.js} +11 -11
  135. package/dist/{review-BGWVY4RA.js → review-NHOPLAT7.js} +11 -11
  136. package/dist/{review-desktop-LEORC5VS.js → review-desktop-OFWPDYGD.js} +11 -11
  137. package/dist/{rpc-4TSKSFGC.js → rpc-TVVQPUOL.js} +10 -10
  138. package/dist/{run-3NBLVWXD.js → run-OCBEZRDW.js} +8 -8
  139. package/dist/{screencast-start-UZVIT3IN.js → screencast-start-GTSDA33J.js} +10 -10
  140. package/dist/{screencast-stop-NOSJSIUO.js → screencast-stop-FYBUIXAA.js} +10 -10
  141. package/dist/{screenshot-LARG4JQG.js → screenshot-OEYRT3SP.js} +10 -10
  142. package/dist/{scroll-VNFMV6TW.js → scroll-35OFEFC5.js} +10 -10
  143. package/dist/{scroll-into-view-VYRT3JPT.js → scroll-into-view-UQ5RAWIX.js} +10 -10
  144. package/dist/{select-KJTUZDVO.js → select-K56QELVZ.js} +10 -10
  145. package/dist/{serve-EV7K4HKR.js → serve-5UJ3VMWC.js} +48 -24
  146. package/dist/serve-5UJ3VMWC.js.map +1 -0
  147. package/dist/{shopping-DTXHVQ2X.js → shopping-FJG7XB4Q.js} +11 -11
  148. package/dist/{skill-lifecycle-5UAZGKSN.js → skill-lifecycle-OWZYBPFS.js} +3 -3
  149. package/dist/skills/bundled-skill-directories.d.ts.map +1 -1
  150. package/dist/skills/skill-loader.js +2 -2
  151. package/dist/{skills-NSXDX6YM.js → skills-KHMRNOE4.js} +3 -3
  152. package/dist/{snapshot-3XQMCMRJ.js → snapshot-W7RKVZEI.js} +10 -10
  153. package/dist/{status-YUMDP5KY.js → status-KHYCLGUD.js} +20 -12
  154. package/dist/status-KHYCLGUD.js.map +1 -0
  155. package/dist/{status-OXSYA5XD.js → status-R4EV4TWO.js} +11 -11
  156. package/dist/{status-capabilities-P4KDSE2Y.js → status-capabilities-XD3RGLKF.js} +11 -11
  157. package/dist/{text-V3B7UVIH.js → text-TANLFZ4O.js} +10 -10
  158. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  159. package/dist/{type-IYBN3ZLR.js → type-Y2Y7LX7Y.js} +10 -10
  160. package/dist/{uncheck-SG737EGI.js → uncheck-6REVUUB2.js} +10 -10
  161. package/dist/{uninstall-KYKGJAX7.js → uninstall-FW5ORBIN.js} +3 -3
  162. package/dist/{update-skill-modes-BVX7IVMW.js → update-skill-modes-3ULKJK3Y.js} +3 -3
  163. package/dist/{upload-KH6ZABJA.js → upload-GGZC5UQP.js} +10 -10
  164. package/dist/{use-7YDKO3U4.js → use-B4Q7CFG2.js} +9 -9
  165. package/dist/{value-RZBWSKKM.js → value-DHOHO55D.js} +10 -10
  166. package/dist/{visible-BSFTAKXR.js → visible-S5BTWYNH.js} +10 -10
  167. package/dist/{wait-TMTEAYOP.js → wait-WV6NZUKL.js} +10 -10
  168. package/dist/{windows-HIZ23OHS.js → windows-GKE36DJQ.js} +11 -11
  169. package/extension/manifest.json +1 -1
  170. package/package.json +1 -1
  171. package/skills/AGENTS.md +2 -1
  172. package/skills/opendevbrowser-best-practices/SKILL.md +9 -2
  173. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +4 -3
  174. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +7 -0
  175. package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +49 -3
  176. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +24 -2
  177. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +1 -0
  178. package/skills/opendevbrowser-design-agent/SKILL.md +3 -0
  179. package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +85 -40
  180. package/skills/opendevbrowser-design-agent/artifacts/scroll-reveal-surface-planning.md +2 -0
  181. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +20 -5
  182. package/skills/opendevbrowser-motion-design/SKILL.md +129 -0
  183. package/skills/opendevbrowser-motion-design/artifacts/accessibility-reduced-motion.md +37 -0
  184. package/skills/opendevbrowser-motion-design/artifacts/device-breakpoint-posture.md +40 -0
  185. package/skills/opendevbrowser-motion-design/artifacts/motion-anti-patterns.md +29 -0
  186. package/skills/opendevbrowser-motion-design/artifacts/motion-pattern-catalog.md +430 -0
  187. package/skills/opendevbrowser-motion-design/artifacts/motion-release-gate.md +28 -0
  188. package/skills/opendevbrowser-motion-design/artifacts/motion-terminology.md +46 -0
  189. package/skills/opendevbrowser-motion-design/artifacts/open-dev-browser-motion-evidence.md +48 -0
  190. package/skills/opendevbrowser-motion-design/artifacts/performance-frame-budget.md +38 -0
  191. package/skills/opendevbrowser-motion-design/artifacts/platform-framework-guide.md +166 -0
  192. package/skills/opendevbrowser-motion-design/assets/templates/motion-audit-report.v1.md +70 -0
  193. package/skills/opendevbrowser-motion-design/assets/templates/motion-contract.v1.json +79 -0
  194. package/skills/opendevbrowser-motion-design/assets/templates/motion-release-gate.v1.json +18 -0
  195. package/skills/opendevbrowser-motion-design/assets/templates/motion-viewport-matrix.v1.json +76 -0
  196. package/skills/opendevbrowser-motion-design/scripts/motion-workflow.sh +163 -0
  197. package/skills/opendevbrowser-motion-design/scripts/validate-skill-assets.sh +374 -0
  198. package/dist/chunk-2I3YS3DV.js.map +0 -1
  199. package/dist/chunk-3ILXPKSJ.js.map +0 -1
  200. package/dist/chunk-4BEJVZRK.js.map +0 -1
  201. package/dist/chunk-6B5WAQV7.js.map +0 -1
  202. package/dist/chunk-COAOWH3G.js.map +0 -1
  203. package/dist/chunk-IPE7TF2P.js.map +0 -1
  204. package/dist/chunk-KZ2IXVQT.js.map +0 -1
  205. package/dist/chunk-MD655IPO.js.map +0 -1
  206. package/dist/daemon-2BSAZXLT.js.map +0 -1
  207. package/dist/help-U7KBQME6.js.map +0 -1
  208. package/dist/inspiredesign-IEUL4PX3.js.map +0 -1
  209. package/dist/serve-EV7K4HKR.js.map +0 -1
  210. package/dist/status-YUMDP5KY.js.map +0 -1
  211. /package/dist/{accessibility-snapshot-CQ4ZKWKC.js.map → accessibility-snapshot-XOP66CSK.js.map} +0 -0
  212. /package/dist/{active-window-TD5HYJ72.js.map → active-window-E3WFOQGX.js.map} +0 -0
  213. /package/dist/{annotate-VTLFS2XV.js.map → annotate-MAE7ZJOZ.js.map} +0 -0
  214. /package/dist/{artifacts-KJ6RNDO2.js.map → artifacts-JHDUUJGQ.js.map} +0 -0
  215. /package/dist/{attr-BCI5KYCW.js.map → attr-M3PFDJ7Q.js.map} +0 -0
  216. /package/dist/{canvas-5DFEEOKM.js.map → canvas-3AJVL5I5.js.map} +0 -0
  217. /package/dist/{capture-desktop-HFTTWY4Z.js.map → capture-desktop-VJGEETMJ.js.map} +0 -0
  218. /package/dist/{capture-window-X63XPIFF.js.map → capture-window-W5UFSFQL.js.map} +0 -0
  219. /package/dist/{check-LWAUY7GC.js.map → check-4IR3UJVW.js.map} +0 -0
  220. /package/dist/{checked-ZSOUKVYT.js.map → checked-PKNY7724.js.map} +0 -0
  221. /package/dist/{chunk-AHEWXOKY.js.map → chunk-BUXFIY2P.js.map} +0 -0
  222. /package/dist/{chunk-QOMWCRE3.js.map → chunk-HBK56JST.js.map} +0 -0
  223. /package/dist/{chunk-T4GMCW6Z.js.map → chunk-J3KYGJRQ.js.map} +0 -0
  224. /package/dist/{chunk-6PVZ2ABC.js.map → chunk-L3YNUGYF.js.map} +0 -0
  225. /package/dist/{chunk-JZXD6FWR.js.map → chunk-NURQB55J.js.map} +0 -0
  226. /package/dist/{chunk-GQJ5S3BL.js.map → chunk-P5K3ZIPI.js.map} +0 -0
  227. /package/dist/{chunk-PPUWQKIC.js.map → chunk-PIFHXKV4.js.map} +0 -0
  228. /package/dist/{chunk-STGGGVYT.js.map → chunk-QMHKAFYX.js.map} +0 -0
  229. /package/dist/{chunk-RPXWUCQQ.js.map → chunk-SKFB5ICF.js.map} +0 -0
  230. /package/dist/{chunk-2SIMIPLY.js.map → chunk-W6YPVNDX.js.map} +0 -0
  231. /package/dist/{chunk-KDSNXS6N.js.map → chunk-ZMNEWS7A.js.map} +0 -0
  232. /package/dist/{click-2AILSEIZ.js.map → click-HLNXU4I5.js.map} +0 -0
  233. /package/dist/{clone-component-TPJS3PEG.js.map → clone-component-QIKN5PIM.js.map} +0 -0
  234. /package/dist/{clone-page-LE74CIFC.js.map → clone-page-5C7DTGZT.js.map} +0 -0
  235. /package/dist/{close-HN4YI47K.js.map → close-PCRZHX7F.js.map} +0 -0
  236. /package/dist/{close-WFERRHX6.js.map → close-WTXB3EDD.js.map} +0 -0
  237. /package/dist/{connect-RWBV2UCQ.js.map → connect-6C2IG55I.js.map} +0 -0
  238. /package/dist/{console-poll-PP4YYPDF.js.map → console-poll-VJXCZR3F.js.map} +0 -0
  239. /package/dist/{cookie-import-6IP776FC.js.map → cookie-import-5OEDFB6U.js.map} +0 -0
  240. /package/dist/{cookie-list-O2KG6DPU.js.map → cookie-list-44UNJJ6D.js.map} +0 -0
  241. /package/dist/{debug-trace-snapshot-F3BDVZXS.js.map → debug-trace-snapshot-RGXAPGWB.js.map} +0 -0
  242. /package/dist/{dialog-6JQYUWMQ.js.map → dialog-S64MJUM2.js.map} +0 -0
  243. /package/dist/{disconnect-763TP7GH.js.map → disconnect-MTIELIM7.js.map} +0 -0
  244. /package/dist/{enabled-DLYQFNIP.js.map → enabled-KF2L7LW4.js.map} +0 -0
  245. /package/dist/{goto-S346TJJH.js.map → goto-ULWINUAZ.js.map} +0 -0
  246. /package/dist/{hover-6JVJFGO7.js.map → hover-NOCOTR6N.js.map} +0 -0
  247. /package/dist/{html-EVOSPBIT.js.map → html-LXSYP6BT.js.map} +0 -0
  248. /package/dist/{inspector-H57BVUJP.js.map → inspector-62EPCLYB.js.map} +0 -0
  249. /package/dist/{inspector-audit-NQBAJWC7.js.map → inspector-audit-T2IF67RJ.js.map} +0 -0
  250. /package/dist/{inspector-plan-ZDIQVND3.js.map → inspector-plan-KQS6LRMW.js.map} +0 -0
  251. /package/dist/{launch-EK66VQPF.js.map → launch-B5ES6FVS.js.map} +0 -0
  252. /package/dist/{list-KKUKN467.js.map → list-TIZVR6RO.js.map} +0 -0
  253. /package/dist/{list-ADZAQ2IU.js.map → list-XM4BP5GM.js.map} +0 -0
  254. /package/dist/{macro-resolve-6DOQJ7CA.js.map → macro-resolve-TTQZVFIW.js.map} +0 -0
  255. /package/dist/{native-UPLVQ2SG.js.map → native-J2DFLOLP.js.map} +0 -0
  256. /package/dist/{network-poll-NUL4PDPY.js.map → network-poll-NNSY4W63.js.map} +0 -0
  257. /package/dist/{new-5NKYPEFT.js.map → new-E6VNAC2A.js.map} +0 -0
  258. /package/dist/{open-NR3BPLXV.js.map → open-F55XKMKB.js.map} +0 -0
  259. /package/dist/{perf-HJ36ZI6H.js.map → perf-RE7JE6CP.js.map} +0 -0
  260. /package/dist/{pointer-down-IYTTQWXZ.js.map → pointer-down-BCBPC5FJ.js.map} +0 -0
  261. /package/dist/{pointer-drag-A2YC5PWI.js.map → pointer-drag-QK7KGF7W.js.map} +0 -0
  262. /package/dist/{pointer-move-W5K5FUI4.js.map → pointer-move-VFAZQAXA.js.map} +0 -0
  263. /package/dist/{pointer-up-6GWVO64Y.js.map → pointer-up-FA5WE6LS.js.map} +0 -0
  264. /package/dist/{press-A3V5WB3S.js.map → press-TNRHNDSW.js.map} +0 -0
  265. /package/dist/{product-video-52REKWF3.js.map → product-video-UEANMZ2U.js.map} +0 -0
  266. /package/dist/{providers-IMFYMMHQ.js.map → providers-AMCNWZUL.js.map} +0 -0
  267. /package/dist/{research-WB6BBCDD.js.map → research-YFY7WJSZ.js.map} +0 -0
  268. /package/dist/{review-BGWVY4RA.js.map → review-NHOPLAT7.js.map} +0 -0
  269. /package/dist/{review-desktop-LEORC5VS.js.map → review-desktop-OFWPDYGD.js.map} +0 -0
  270. /package/dist/{rpc-4TSKSFGC.js.map → rpc-TVVQPUOL.js.map} +0 -0
  271. /package/dist/{run-3NBLVWXD.js.map → run-OCBEZRDW.js.map} +0 -0
  272. /package/dist/{screencast-start-UZVIT3IN.js.map → screencast-start-GTSDA33J.js.map} +0 -0
  273. /package/dist/{screencast-stop-NOSJSIUO.js.map → screencast-stop-FYBUIXAA.js.map} +0 -0
  274. /package/dist/{screenshot-LARG4JQG.js.map → screenshot-OEYRT3SP.js.map} +0 -0
  275. /package/dist/{scroll-VNFMV6TW.js.map → scroll-35OFEFC5.js.map} +0 -0
  276. /package/dist/{scroll-into-view-VYRT3JPT.js.map → scroll-into-view-UQ5RAWIX.js.map} +0 -0
  277. /package/dist/{select-KJTUZDVO.js.map → select-K56QELVZ.js.map} +0 -0
  278. /package/dist/{shopping-DTXHVQ2X.js.map → shopping-FJG7XB4Q.js.map} +0 -0
  279. /package/dist/{skill-lifecycle-5UAZGKSN.js.map → skill-lifecycle-OWZYBPFS.js.map} +0 -0
  280. /package/dist/{skills-NSXDX6YM.js.map → skills-KHMRNOE4.js.map} +0 -0
  281. /package/dist/{snapshot-3XQMCMRJ.js.map → snapshot-W7RKVZEI.js.map} +0 -0
  282. /package/dist/{status-OXSYA5XD.js.map → status-R4EV4TWO.js.map} +0 -0
  283. /package/dist/{status-capabilities-P4KDSE2Y.js.map → status-capabilities-XD3RGLKF.js.map} +0 -0
  284. /package/dist/{text-V3B7UVIH.js.map → text-TANLFZ4O.js.map} +0 -0
  285. /package/dist/{type-IYBN3ZLR.js.map → type-Y2Y7LX7Y.js.map} +0 -0
  286. /package/dist/{uncheck-SG737EGI.js.map → uncheck-6REVUUB2.js.map} +0 -0
  287. /package/dist/{uninstall-KYKGJAX7.js.map → uninstall-FW5ORBIN.js.map} +0 -0
  288. /package/dist/{update-skill-modes-BVX7IVMW.js.map → update-skill-modes-3ULKJK3Y.js.map} +0 -0
  289. /package/dist/{upload-KH6ZABJA.js.map → upload-GGZC5UQP.js.map} +0 -0
  290. /package/dist/{use-7YDKO3U4.js.map → use-B4Q7CFG2.js.map} +0 -0
  291. /package/dist/{value-RZBWSKKM.js.map → value-DHOHO55D.js.map} +0 -0
  292. /package/dist/{visible-BSFTAKXR.js.map → visible-S5BTWYNH.js.map} +0 -0
  293. /package/dist/{wait-TMTEAYOP.js.map → wait-WV6NZUKL.js.map} +0 -0
  294. /package/dist/{windows-HIZ23OHS.js.map → windows-GKE36DJQ.js.map} +0 -0
@@ -10,7 +10,7 @@ import {
10
10
  INSPIREDESIGN_HANDOFF_RECOMMENDED_SKILLS,
11
11
  buildInspiredesignFollowthroughSummary,
12
12
  buildInspiredesignNextStep
13
- } from "./chunk-KZ2IXVQT.js";
13
+ } from "./chunk-2X4JFMKJ.js";
14
14
  import {
15
15
  applyPromptGuard,
16
16
  applyProviderIssueHint,
@@ -1968,7 +1968,7 @@ var executeStep = async (args) => {
1968
1968
  });
1969
1969
  await args.handle.pointerMove(args.sessionId, point.x, point.y, args.targetId, 12);
1970
1970
  await args.handle.pointerDown(args.sessionId, point.x, point.y, args.targetId, "left", 1);
1971
- await new Promise((resolve) => setTimeout(resolve, Math.max(250, args.step.holdMs ?? DEFAULT_HOLD_MS2)));
1971
+ await new Promise((resolve2) => setTimeout(resolve2, Math.max(250, args.step.holdMs ?? DEFAULT_HOLD_MS2)));
1972
1972
  await args.handle.pointerUp(args.sessionId, point.x, point.y, args.targetId, "left", 1);
1973
1973
  return;
1974
1974
  }
@@ -3685,8 +3685,8 @@ var CrawlWorkerPool = class {
3685
3685
  }
3686
3686
  const taskId = this.nextTaskId;
3687
3687
  this.nextTaskId += 1;
3688
- return new Promise((resolve, reject) => {
3689
- this.queue.push({ id: taskId, input, resolve, reject });
3688
+ return new Promise((resolve2, reject) => {
3689
+ this.queue.push({ id: taskId, input, resolve: resolve2, reject });
3690
3690
  this.dispatch();
3691
3691
  });
3692
3692
  }
@@ -9086,7 +9086,10 @@ var isWorkflowResumeEnvelope = (value) => isJsonRecord(value) && isWorkflowKind(
9086
9086
  var isWorkflowResumePayload = (value) => isJsonRecord(value) && isWorkflowResumeEnvelope(value.workflow);
9087
9087
 
9088
9088
  // src/providers/workflows.ts
9089
- import { createHash as createHash7 } from "crypto";
9089
+ import { createHash as createHash8 } from "crypto";
9090
+ import { mkdtemp as mkdtemp2, readFile, rm as rm2 } from "fs/promises";
9091
+ import { tmpdir as tmpdir2 } from "os";
9092
+ import { join as join3, resolve } from "path";
9090
9093
 
9091
9094
  // src/providers/workflow-output-root.ts
9092
9095
  import { join as join2 } from "path";
@@ -9282,7 +9285,7 @@ var enrichResearchRecords = (records, timebox, now = /* @__PURE__ */ new Date())
9282
9285
  };
9283
9286
 
9284
9287
  // src/inspiredesign/contract.ts
9285
- import { createHash as createHash3 } from "crypto";
9288
+ import { createHash as createHash4 } from "crypto";
9286
9289
 
9287
9290
  // skills/opendevbrowser-design-agent/assets/templates/canvas-generation-plan.design.v1.json
9288
9291
  var canvas_generation_plan_design_v1_default = {
@@ -11193,6 +11196,15 @@ var expandInspiredesignBrief = (brief, preferredFormatId) => {
11193
11196
  var SIGNAL_LIMIT = 5;
11194
11197
  var SIGNAL_CLIP = 180;
11195
11198
  var PATTERN_LIMIT = 6;
11199
+ var SCORE_FETCH_CAPTURED = 20;
11200
+ var SCORE_CAPTURE_CAPTURED = 20;
11201
+ var SCORE_VISUAL_CAPTURED = 30;
11202
+ var SCORE_SNAPSHOT = 10;
11203
+ var SCORE_CLONE = 8;
11204
+ var SCORE_DOM = 8;
11205
+ var SCORE_PUBLIC_LANDING = 6;
11206
+ var SCORE_SIGNAL_CAP = 12;
11207
+ var MAX_REFERENCE_SCORE = 100;
11196
11208
  var ADVANCED_MOTION_FIELDS = [
11197
11209
  "Advisory shader-style gradients: specify effect type, uniforms, static fallback, and reduced-motion replacement as design language only.",
11198
11210
  "Advisory WebGL-style depth cues: describe layered depth, camera-like parallax, and spatial hierarchy without requiring WebGL runtime.",
@@ -11211,7 +11223,7 @@ var textFromHtml = (html) => {
11211
11223
  var stripActionRefs = (value) => value.replace(/\[r\d+\]\s+(?:link|button|combobox|textbox|option)\s+/gi, "").replace(/\[r\d+\]\s+/gi, "").replace(/\bvalue=/gi, "");
11212
11224
  var isCodeOrCssPreview = (value) => {
11213
11225
  const lower = value.toLowerCase();
11214
- return lower.includes("dangerouslysetinnerhtml") || lower.includes("opendevbrowser-root") || lower.includes("align-content:") || lower.startsWith("import ") || /^[.#][a-z0-9_-]+\s*\{/.test(lower) || lower.includes("{") && /[a-z-]+:\s*[^;]+;/.test(lower);
11226
+ return lower.includes("dangerouslysetinnerhtml") || lower.includes("opendevbrowser-root") || lower.includes("--gestalt-") || lower.includes("align-content:") || lower.startsWith(":root") || lower.startsWith("import ") || /^[.#][a-z0-9_-]+\s*\{/.test(lower) || lower.includes("{") && /[a-z-]+:\s*[^;]+;/.test(lower);
11215
11227
  };
11216
11228
  var cleanEvidenceText = (value) => {
11217
11229
  return trimText(stripActionRefs(value).replace(/[{};]/g, " "));
@@ -11232,6 +11244,23 @@ var DIAGNOSTIC_TEXT_MARKERS = [
11232
11244
  "complete the verification",
11233
11245
  "blocked reference"
11234
11246
  ];
11247
+ var INTERFACE_CHROME_TEXT_MARKERS = [
11248
+ "your profile",
11249
+ "your boards",
11250
+ "remove search input",
11251
+ "settings & support",
11252
+ "pin card",
11253
+ "voice search",
11254
+ "lens",
11255
+ "back to home page",
11256
+ "toggle mobile menu",
11257
+ "facebook",
11258
+ "instagram",
11259
+ "updates",
11260
+ "messages",
11261
+ "when autocomplete results are available",
11262
+ "touch device users"
11263
+ ];
11235
11264
  var PUBLIC_LANDING_TEXT_MARKERS = [
11236
11265
  "church",
11237
11266
  "landing page",
@@ -11271,6 +11300,14 @@ var isDiagnosticText = (value) => {
11271
11300
  const lower = value.toLowerCase();
11272
11301
  return DIAGNOSTIC_TEXT_MARKERS.some((marker) => lower.includes(marker));
11273
11302
  };
11303
+ var isInterfaceChromeText = (value) => {
11304
+ const lower = value.toLowerCase();
11305
+ if (lower === "your profile" || lower === "adobe, inc." || lower === "dribbble: the community for graphic design" || /^https?:\/\/\S+$/.test(lower) || lower.includes("when autocomplete results are available") && lower.includes("touch device users") || lower.includes("get 20%") && lower.includes("dribbble: the community for graphic design") || lower.includes("our free wordpress themes are downloaded") && lower.includes("get them now")) {
11306
+ return true;
11307
+ }
11308
+ const markerCount = INTERFACE_CHROME_TEXT_MARKERS.filter((marker) => lower.includes(marker)).length;
11309
+ return markerCount >= 3 || lower.includes("pin card") && lower.includes("your profile");
11310
+ };
11274
11311
  var hasPublicLandingSignal = (value) => {
11275
11312
  const lower = value.toLowerCase();
11276
11313
  const strongCount = PUBLIC_LANDING_TEXT_MARKERS.filter((marker) => lower.includes(marker)).length;
@@ -11281,7 +11318,7 @@ var hasPublicLandingSignal = (value) => {
11281
11318
  var pushSignal = (signals, value) => {
11282
11319
  if (!value || isCodeOrCssPreview(value)) return;
11283
11320
  const text = cleanEvidenceText(value);
11284
- if (isCodeOrCssPreview(text) || isDiagnosticText(text)) return;
11321
+ if (isCodeOrCssPreview(text) || isDiagnosticText(text) || isInterfaceChromeText(text)) return;
11285
11322
  if (text.length > 0 && !signals.includes(text)) {
11286
11323
  signals.push(text);
11287
11324
  }
@@ -11300,7 +11337,7 @@ var getInspiredesignReferenceSignals = (reference) => {
11300
11337
  var hasCleanSignal = (value) => {
11301
11338
  if (!value || isCodeOrCssPreview(value)) return false;
11302
11339
  const text = cleanEvidenceText(value);
11303
- return text.length > 0 && !isCodeOrCssPreview(text) && !isDiagnosticText(text);
11340
+ return text.length > 0 && !isCodeOrCssPreview(text) && !isDiagnosticText(text) && !isInterfaceChromeText(text);
11304
11341
  };
11305
11342
  var hasUsableCloneCreativeEvidence = (reference) => hasCleanSignal(reference.capture?.clone?.componentPreview);
11306
11343
  var hasUsableCaptureEvidence = (reference) => hasCleanSignal(reference.capture?.snapshot?.content) || hasUsableCloneCreativeEvidence(reference) || hasCleanSignal(textFromHtml(reference.capture?.dom?.outerHTML));
@@ -11316,9 +11353,16 @@ var firstSignal = (reference) => {
11316
11353
  textFromHtml(reference.capture?.dom?.outerHTML),
11317
11354
  reference.excerpt,
11318
11355
  reference.title
11319
- ].map((value) => value ? cleanEvidenceText(value) : "").find((value) => value.length > 0 && !isCodeOrCssPreview(value) && !isDiagnosticText(value));
11356
+ ].map((value) => value ? cleanEvidenceText(value) : "").find((value) => value.length > 0 && !isCodeOrCssPreview(value) && !isDiagnosticText(value) && !isInterfaceChromeText(value));
11320
11357
  return preferred ? clipText(preferred, SIGNAL_CLIP) : reference.url;
11321
11358
  };
11359
+ var displayNameForReference = (reference, primarySignal) => {
11360
+ const title = reference.title ? cleanEvidenceText(reference.title) : "";
11361
+ if (title && !isDiagnosticText(title) && !isInterfaceChromeText(title)) {
11362
+ return clipText(title, SIGNAL_CLIP);
11363
+ }
11364
+ return primarySignal !== reference.url ? primarySignal : reference.url;
11365
+ };
11322
11366
  var REFERENCE_PATTERN_RULES = [
11323
11367
  {
11324
11368
  summary: "location-first church discovery with regional pathways",
@@ -11376,8 +11420,49 @@ var deriveCapturedVia = (reference) => {
11376
11420
  methods.push("clone");
11377
11421
  }
11378
11422
  if (reference.capture?.dom?.outerHTML.trim()) methods.push("dom");
11423
+ if (reference.capture?.visual?.status === "captured") methods.push("visual");
11379
11424
  return methods;
11380
11425
  };
11426
+ var scoreReference = (reference, signals, isPublicLanding) => {
11427
+ let score = 0;
11428
+ if (reference.fetchStatus === "captured") score += SCORE_FETCH_CAPTURED;
11429
+ if (reference.captureStatus === "captured") score += SCORE_CAPTURE_CAPTURED;
11430
+ if (reference.capture?.visual?.status === "captured") score += SCORE_VISUAL_CAPTURED;
11431
+ if (reference.capture?.snapshot?.content.trim()) score += SCORE_SNAPSHOT;
11432
+ if (hasUsableCloneCreativeEvidence(reference)) score += SCORE_CLONE;
11433
+ if (reference.capture?.dom?.outerHTML.trim()) score += SCORE_DOM;
11434
+ if (isPublicLanding) score += SCORE_PUBLIC_LANDING;
11435
+ score += Math.min(SCORE_SIGNAL_CAP, signals.length * 2);
11436
+ return Math.min(MAX_REFERENCE_SCORE, score);
11437
+ };
11438
+ var confidenceFromScore = (score) => Number((score / MAX_REFERENCE_SCORE).toFixed(2));
11439
+ var deriveVisualStrengths = (reference, patterns) => {
11440
+ const strengths = [
11441
+ ...reference.capture?.visual?.status === "captured" ? ["Screenshot artifact is available for direct visual inspection."] : [],
11442
+ ...reference.capture?.snapshot?.content.trim() ? ["Snapshot text confirms visible hierarchy and interaction targets."] : [],
11443
+ ...hasUsableCloneCreativeEvidence(reference) ? ["Clone preview exposes reusable component and styling cues."] : [],
11444
+ ...patterns.slice(0, 2).map((pattern) => `Reusable visual cue: ${pattern}.`)
11445
+ ];
11446
+ return strengths.slice(0, PATTERN_LIMIT);
11447
+ };
11448
+ var deriveVisualRisks = (reference) => {
11449
+ const risks = [
11450
+ ...reference.capture?.visual?.status !== "captured" ? ["No finalized screenshot artifact, so visual claims must stay conservative."] : [],
11451
+ ...reference.capture?.visual?.status === "failed" && reference.capture.visual.failure ? [`Screenshot failure: ${reference.capture.visual.failure}.`] : [],
11452
+ ...(reference.capture?.visual?.warnings ?? []).map((warning) => `Screenshot warning: ${warning}.`),
11453
+ ...reference.fetchStatus !== "captured" ? ["Fetch evidence failed or was skipped, so use browser capture cautiously."] : []
11454
+ ];
11455
+ return risks.length > 0 ? risks.slice(0, PATTERN_LIMIT) : ["No major visual evidence risk detected in the captured reference."];
11456
+ };
11457
+ var selectionReasonForScore = (score, capturedVia) => {
11458
+ if (capturedVia.includes("visual")) {
11459
+ return `Ranked for screenshot-backed visual evidence plus ${capturedVia.join(", ")} capture.`;
11460
+ }
11461
+ if (score >= 50) {
11462
+ return `Ranked for strong text and structural evidence from ${capturedVia.join(", ") || "reference metadata"}.`;
11463
+ }
11464
+ return "Ranked for limited but usable reference cues.";
11465
+ };
11381
11466
  var deriveComponentFamilies = (format, patterns, isPublicLanding) => {
11382
11467
  const base = isPublicLanding ? "hero composition, proof bands, narrative pathways, service or story sections, conversion CTA, and footer" : format.componentGrammar;
11383
11468
  return [base, ...patterns.slice(0, 3)];
@@ -11405,12 +11490,19 @@ var deriveReferenceEntry = (reference, format) => {
11405
11490
  const primarySignal = firstSignal(reference);
11406
11491
  const patterns = appendSourceDetail(derivePatternSummaries(signals, primarySignal), primarySignal);
11407
11492
  const isPublicLanding = signals.some(hasPublicLandingSignal);
11493
+ const capturedVia = deriveCapturedVia(reference);
11494
+ const score = scoreReference(reference, signals, isPublicLanding);
11408
11495
  return {
11409
11496
  id: reference.id,
11410
- name: reference.title ?? reference.url,
11497
+ score,
11498
+ confidence: confidenceFromScore(score),
11499
+ name: displayNameForReference(reference, primarySignal),
11411
11500
  url: reference.url,
11412
11501
  surfaceType: isPublicLanding ? "public landing page" : format.archetype,
11413
- capturedVia: deriveCapturedVia(reference),
11502
+ capturedVia,
11503
+ selectionReason: selectionReasonForScore(score, capturedVia),
11504
+ visualStrengths: deriveVisualStrengths(reference, patterns),
11505
+ visualRisks: deriveVisualRisks(reference),
11414
11506
  layoutRecipe: patterns.join("; "),
11415
11507
  contentHierarchy: patterns.slice(0, 4),
11416
11508
  componentFamilies: deriveComponentFamilies(format, patterns, isPublicLanding),
@@ -11421,16 +11513,41 @@ var deriveReferenceEntry = (reference, format) => {
11421
11513
  whyItWorks: reference.captureStatus === "captured" ? "Captured reference evidence provides reusable hierarchy, rhythm, and component cues." : "Available reference text provides directional content and hierarchy cues."
11422
11514
  };
11423
11515
  };
11516
+ var sortReferenceEntries = (entries) => entries.slice().sort((left, right) => right.score - left.score || left.id.localeCompare(right.id) || left.url.localeCompare(right.url)).map((entry, index) => ({
11517
+ rank: index + 1,
11518
+ ...entry
11519
+ }));
11520
+ var rejectionReasonForReference = (reference) => {
11521
+ if (reference.fetchStatus === "failed" && reference.captureStatus === "failed") {
11522
+ return "Fetch and capture did not produce usable creative evidence.";
11523
+ }
11524
+ if (reference.captureStatus === "failed") {
11525
+ return "Capture did not produce usable creative evidence.";
11526
+ }
11527
+ if (reference.fetchStatus === "failed") {
11528
+ return "Fetch did not produce usable creative evidence.";
11529
+ }
11530
+ return "Reference evidence was diagnostic, empty, or too weak for creative synthesis.";
11531
+ };
11532
+ var buildRejectedReferences = (references) => references.filter((reference) => !hasInspiredesignUsableReferenceEvidence(reference)).map((reference) => ({
11533
+ id: reference.id,
11534
+ url: reference.url,
11535
+ reason: rejectionReasonForReference(reference),
11536
+ fetchStatus: reference.fetchStatus,
11537
+ captureStatus: reference.captureStatus
11538
+ }));
11424
11539
  var buildInspiredesignReferencePatternBoard = (briefId, format, references) => {
11425
11540
  const entries = references.filter(hasInspiredesignUsableReferenceEvidence).map((reference) => deriveReferenceEntry(reference, format));
11426
- const sharedStrengths = entries.flatMap((entry) => entry.patternsToBorrow).slice(0, 6);
11427
- const targetSurface = entries.some((entry) => entry.surfaceType === "public landing page") ? "reference-led public landing page" : format.layoutArchetype;
11541
+ const rankedEntries = sortReferenceEntries(entries);
11542
+ const sharedStrengths = rankedEntries.flatMap((entry) => entry.patternsToBorrow).slice(0, 6);
11543
+ const targetSurface = rankedEntries.some((entry) => entry.surfaceType === "public landing page") ? "reference-led public landing page" : format.layoutArchetype;
11428
11544
  return {
11429
11545
  briefId,
11430
11546
  targetSurface,
11431
- references: entries,
11547
+ references: rankedEntries,
11548
+ rejectedReferences: buildRejectedReferences(references),
11432
11549
  synthesis: {
11433
- dominantDirection: entries[0]?.layoutRecipe ?? format.archetype,
11550
+ dominantDirection: rankedEntries[0]?.layoutRecipe ?? format.archetype,
11434
11551
  sharedStrengths,
11435
11552
  sharedFailuresToAvoid: [...format.antiPatterns],
11436
11553
  contractDeltas: [
@@ -11569,6 +11686,176 @@ var buildInspiredesignDesignVectors = (format, board) => {
11569
11686
  };
11570
11687
  };
11571
11688
 
11689
+ // src/inspiredesign/meta-prompt.ts
11690
+ var formatList = (items) => items.length > 0 ? items.map((item) => `- ${item}`).join("\n") : "- No evidence-backed item available.";
11691
+ var formatRankedReferences = (board) => {
11692
+ if (board.references.length === 0) {
11693
+ return "- No usable references were ranked. Work from the brief and note missing evidence.";
11694
+ }
11695
+ return board.references.map((reference) => [
11696
+ `### Rank ${reference.rank}: ${reference.name}`,
11697
+ `- URL: ${reference.url}`,
11698
+ `- Score: ${reference.score}`,
11699
+ `- Confidence: ${reference.confidence.toFixed(2)}`,
11700
+ `- Selection reason: ${reference.selectionReason}`,
11701
+ `- Borrow: ${reference.patternsToBorrow.join("; ")}`,
11702
+ `- Reject: ${reference.patternsToReject.join("; ")}`,
11703
+ `- Visual strengths: ${reference.visualStrengths.join("; ")}`,
11704
+ `- Visual risks: ${reference.visualRisks.join("; ")}`
11705
+ ].join("\n")).join("\n\n");
11706
+ };
11707
+ var formatRejectedReferences = (board) => {
11708
+ if (board.rejectedReferences.length === 0) {
11709
+ return "- No references were rejected from the creative synthesis.";
11710
+ }
11711
+ return board.rejectedReferences.map((reference) => `- ${reference.url}: ${reference.reason} (fetch=${reference.fetchStatus}, capture=${reference.captureStatus})`).join("\n");
11712
+ };
11713
+ var buildInspiredesignMetaPrompt = (input) => [
11714
+ "# InspireDesign Meta Prompt",
11715
+ "",
11716
+ "Use this prompt to generate a fresh design direction from evidence without copying any reference brand, asset, layout, or proprietary expression.",
11717
+ "",
11718
+ "## Source Brief",
11719
+ input.brief,
11720
+ "",
11721
+ "## Prompt Format",
11722
+ `- Format: ${input.briefExpansion.format.label}`,
11723
+ `- Target surface: ${input.referencePatternBoard.targetSurface}`,
11724
+ `- Dominant direction: ${input.referencePatternBoard.synthesis.dominantDirection}`,
11725
+ "",
11726
+ "## Ranked References",
11727
+ formatRankedReferences(input.referencePatternBoard),
11728
+ "",
11729
+ "## Rejected References",
11730
+ formatRejectedReferences(input.referencePatternBoard),
11731
+ "",
11732
+ "## Borrow Guidance",
11733
+ formatList(input.designVectors.patternsToBorrow),
11734
+ "",
11735
+ "## Reject Guidance",
11736
+ formatList([
11737
+ ...input.designVectors.patternsToReject,
11738
+ "Do not copy logos, screenshots, protected brand assets, page structure, copy, or trade dress from references."
11739
+ ]),
11740
+ "",
11741
+ "## Motion Posture",
11742
+ formatList([
11743
+ ...input.designVectors.motionPosture,
11744
+ ...input.designVectors.interactionMoments,
11745
+ ...input.designVectors.advancedMotionAdvisory
11746
+ ]),
11747
+ "",
11748
+ "## Accessibility Constraints",
11749
+ formatList([
11750
+ "Keyboard navigation must reach every interactive element.",
11751
+ "Focus states must be visible in every theme and viewport.",
11752
+ "Respect prefers-reduced-motion with a static hierarchy-preserving alternative.",
11753
+ "Validate contrast for text, controls, overlays, and disabled states."
11754
+ ]),
11755
+ "",
11756
+ "## Validation Gates",
11757
+ formatList([
11758
+ "Read visual-evidence.json, screenshot-index.json, ranked-references.json, and evidence.json before implementation.",
11759
+ "Confirm screenshot paths exist before making visual claims.",
11760
+ "Verify desktop and mobile layouts with real browser screenshots.",
11761
+ "Run reduced-motion, keyboard, focus, and contrast checks before shipping.",
11762
+ "Keep production code generation outside the harvest output."
11763
+ ])
11764
+ ].join("\n");
11765
+
11766
+ // src/inspiredesign/visual-evidence.ts
11767
+ import { createHash as createHash3 } from "crypto";
11768
+ var INSPIREDESIGN_VISUAL_EVIDENCE_MODES = ["off", "auto", "required"];
11769
+ var INSPIREDESIGN_VISUAL_EVIDENCE_KINDS = ["viewport", "full_page"];
11770
+ var SAFE_REFERENCE_ID_PATTERN = /[^a-z0-9._-]+/gi;
11771
+ var MAX_VISUAL_REFERENCE_ID_LENGTH = 96;
11772
+ var MAX_VISUAL_WARNING_LENGTH = 160;
11773
+ var MAX_VISUAL_FAILURE_LENGTH = 240;
11774
+ var UNSAFE_VISUAL_TEXT_PATTERN = /(?:\/(?:Users|private|tmp|var|Volumes)\/|[A-Za-z]:\\|\\|data:image|;base64|base64,|[A-Za-z0-9+/]{80,}={0,2})/i;
11775
+ var DOT_ONLY_PATH_SEGMENT_PATTERN = /^\.+$/;
11776
+ var SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/i;
11777
+ var VISUAL_ARTIFACT_PATH_PATTERN = /^visual-evidence\/([A-Za-z0-9._-]+)\/(?:viewport|full_page)\.png$/;
11778
+ var FALLBACK_VISUAL_CAPTURED_AT = "1970-01-01T00:00:00.000Z";
11779
+ var isInspiredesignVisualEvidenceMode = (value) => typeof value === "string" && INSPIREDESIGN_VISUAL_EVIDENCE_MODES.includes(value);
11780
+ var isInspiredesignVisualEvidenceKind = (value) => typeof value === "string" && INSPIREDESIGN_VISUAL_EVIDENCE_KINDS.includes(value);
11781
+ var sanitizeInspiredesignVisualReferenceId = (referenceId) => {
11782
+ const sanitized = referenceId.trim().replace(SAFE_REFERENCE_ID_PATTERN, "-").replace(/^-+|-+$/g, "");
11783
+ if (!sanitized || DOT_ONLY_PATH_SEGMENT_PATTERN.test(sanitized)) return "reference";
11784
+ const truncated = sanitized.slice(0, MAX_VISUAL_REFERENCE_ID_LENGTH);
11785
+ return DOT_ONLY_PATH_SEGMENT_PATTERN.test(truncated) ? "reference" : truncated;
11786
+ };
11787
+ var buildVisualEvidenceArtifactPath = (referenceId, kind) => `visual-evidence/${sanitizeInspiredesignVisualReferenceId(referenceId)}/${kind}.png`;
11788
+ var hashVisualEvidenceBuffer = (buffer) => createHash3("sha256").update(buffer).digest("hex");
11789
+ var sanitizeVisualEvidenceText = (value, maxLength) => {
11790
+ if (typeof value !== "string") return void 0;
11791
+ const trimmed = value.trim();
11792
+ if (!trimmed || UNSAFE_VISUAL_TEXT_PATTERN.test(trimmed)) return void 0;
11793
+ return trimmed.slice(0, maxLength);
11794
+ };
11795
+ var sanitizeVisualEvidencePath = (value) => {
11796
+ if (typeof value !== "string") return void 0;
11797
+ const trimmed = value.trim();
11798
+ const match = VISUAL_ARTIFACT_PATH_PATTERN.exec(trimmed);
11799
+ const referenceSegment = match?.[1];
11800
+ if (!referenceSegment || DOT_ONLY_PATH_SEGMENT_PATTERN.test(referenceSegment)) return void 0;
11801
+ return trimmed;
11802
+ };
11803
+ var sanitizeVisualEvidenceSha256 = (value) => {
11804
+ if (typeof value !== "string") return void 0;
11805
+ const trimmed = value.trim();
11806
+ return SHA256_HEX_PATTERN.test(trimmed) ? trimmed.toLowerCase() : void 0;
11807
+ };
11808
+ var sanitizeVisualEvidenceBytes = (value) => typeof value === "number" && Number.isFinite(value) && Number.isInteger(value) && value >= 0 ? value : void 0;
11809
+ var sanitizeVisualEvidenceCapturedAt = (value) => {
11810
+ if (typeof value !== "string") return FALLBACK_VISUAL_CAPTURED_AT;
11811
+ const trimmed = value.trim();
11812
+ if (!trimmed || UNSAFE_VISUAL_TEXT_PATTERN.test(trimmed)) return FALLBACK_VISUAL_CAPTURED_AT;
11813
+ const timestamp = Date.parse(trimmed);
11814
+ if (!Number.isFinite(timestamp)) return FALLBACK_VISUAL_CAPTURED_AT;
11815
+ return new Date(timestamp).toISOString();
11816
+ };
11817
+ var normalizeVisualEvidenceViewport = (value) => {
11818
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
11819
+ const record = value;
11820
+ const viewport = {};
11821
+ if (typeof record.width === "number" && Number.isFinite(record.width)) {
11822
+ viewport.width = record.width;
11823
+ }
11824
+ if (typeof record.height === "number" && Number.isFinite(record.height)) {
11825
+ viewport.height = record.height;
11826
+ }
11827
+ if (typeof record.deviceScaleFactor === "number" && Number.isFinite(record.deviceScaleFactor)) {
11828
+ viewport.deviceScaleFactor = record.deviceScaleFactor;
11829
+ }
11830
+ return Object.keys(viewport).length > 0 ? viewport : void 0;
11831
+ };
11832
+ var normalizeVisualEvidenceWarnings = (value) => {
11833
+ if (!Array.isArray(value)) return [];
11834
+ return value.map((warning) => sanitizeVisualEvidenceText(warning, MAX_VISUAL_WARNING_LENGTH)).filter((warning) => Boolean(warning));
11835
+ };
11836
+ var persistInspiredesignVisualEvidence = (metadata, options = {}) => {
11837
+ const runtimeMetadata = metadata;
11838
+ const persistedMetadata = metadata;
11839
+ const path2 = metadata.status === "captured" ? sanitizeVisualEvidencePath(options.artifactPath) ?? sanitizeVisualEvidencePath(persistedMetadata.path) ?? sanitizeVisualEvidencePath(runtimeMetadata.artifactPath) : void 0;
11840
+ const sha256 = sanitizeVisualEvidenceSha256(options.sha256) ?? sanitizeVisualEvidenceSha256(persistedMetadata.sha256);
11841
+ const bytes = sanitizeVisualEvidenceBytes(options.bytes) ?? sanitizeVisualEvidenceBytes(persistedMetadata.bytes);
11842
+ const capturedAt = sanitizeVisualEvidenceCapturedAt(metadata.capturedAt);
11843
+ const viewport = normalizeVisualEvidenceViewport(metadata.viewport);
11844
+ const failure = sanitizeVisualEvidenceText(metadata.failure, MAX_VISUAL_FAILURE_LENGTH);
11845
+ return {
11846
+ status: metadata.status,
11847
+ kind: isInspiredesignVisualEvidenceKind(metadata.kind) ? metadata.kind : "viewport",
11848
+ fullPage: metadata.fullPage === true,
11849
+ capturedAt,
11850
+ ...path2 ? { path: path2 } : {},
11851
+ ...sha256 ? { sha256 } : {},
11852
+ ...bytes !== void 0 ? { bytes } : {},
11853
+ ...viewport ? { viewport } : {},
11854
+ warnings: normalizeVisualEvidenceWarnings(metadata.warnings),
11855
+ ...failure ? { failure } : {}
11856
+ };
11857
+ };
11858
+
11572
11859
  // src/inspiredesign/contract.ts
11573
11860
  var INSPIREDESIGN_CAPTURE_ATTEMPT_KEYS = ["snapshot", "clone", "dom"];
11574
11861
  var MALFORMED_CAPTURE_ATTEMPT_DETAIL = "Capture attempt metadata missing or malformed.";
@@ -11662,7 +11949,8 @@ var normalizeInspiredesignCaptureEvidence = (capture) => {
11662
11949
  ...capture.title ? { title: capture.title } : {},
11663
11950
  ...hasUsableInspiredesignSnapshot(capture) && capture.snapshot ? { snapshot: capture.snapshot } : {},
11664
11951
  ...hasUsableInspiredesignDom(capture) && capture.dom ? { dom: capture.dom } : {},
11665
- ...hasUsableInspiredesignClone(capture) && capture.clone ? { clone: capture.clone } : {}
11952
+ ...hasUsableInspiredesignClone(capture) && capture.clone ? { clone: capture.clone } : {},
11953
+ ...capture.visual ? { visual: persistInspiredesignVisualEvidence(capture.visual) } : {}
11666
11954
  };
11667
11955
  const attempts = reconcileInspiredesignCaptureAttempts(
11668
11956
  normalizedBase,
@@ -12019,7 +12307,7 @@ var renderUnavailableReference = (reference) => {
12019
12307
  };
12020
12308
  var cloneTemplate = (value) => structuredClone(value);
12021
12309
  var referenceFingerprint = (value) => {
12022
- return createHash3("sha256").update(value).digest("hex").slice(0, 12);
12310
+ return createHash4("sha256").update(value).digest("hex").slice(0, 12);
12023
12311
  };
12024
12312
  var summarizeBrief = (brief) => {
12025
12313
  const normalized = trimText2(brief);
@@ -12543,6 +12831,10 @@ var buildBriefExpansionMetadata = (briefExpansion) => ({
12543
12831
  var buildRequiredReferenceArtifacts = (includePrototypeGuidance) => {
12544
12832
  const files = [
12545
12833
  INSPIREDESIGN_HANDOFF_FILES.evidence,
12834
+ INSPIREDESIGN_HANDOFF_FILES.visualEvidence,
12835
+ INSPIREDESIGN_HANDOFF_FILES.screenshotIndex,
12836
+ INSPIREDESIGN_HANDOFF_FILES.rankedReferences,
12837
+ INSPIREDESIGN_HANDOFF_FILES.metaPrompt,
12546
12838
  INSPIREDESIGN_HANDOFF_FILES.advancedBrief,
12547
12839
  INSPIREDESIGN_HANDOFF_FILES.designMarkdown,
12548
12840
  INSPIREDESIGN_HANDOFF_FILES.generationPlan,
@@ -12994,9 +13286,30 @@ var buildEvidencePayload = ({
12994
13286
  referenceCount: references.length,
12995
13287
  references: references.map((reference) => toReferenceEvidenceJson(reference)),
12996
13288
  referencePatternBoard,
13289
+ rankedReferences: referencePatternBoard.references,
12997
13290
  designVectors,
12998
- targetAnalysis
13291
+ targetAnalysis,
13292
+ visualEvidence: buildVisualEvidencePayload(references),
13293
+ screenshotIndex: buildScreenshotIndex(references)
12999
13294
  });
13295
+ var buildVisualEvidencePayload = (references) => references.flatMap((reference) => {
13296
+ const visual = normalizeInspiredesignCaptureEvidence(reference.capture)?.visual;
13297
+ return visual ? [{
13298
+ referenceId: reference.id,
13299
+ url: reference.url,
13300
+ visual: persistInspiredesignVisualEvidence(visual)
13301
+ }] : [];
13302
+ });
13303
+ var buildScreenshotIndex = (references) => buildVisualEvidencePayload(references).filter((entry) => entry.visual.status === "captured" && typeof entry.visual.path === "string" && typeof entry.visual.sha256 === "string" && typeof entry.visual.bytes === "number").map((entry) => ({
13304
+ referenceId: entry.referenceId,
13305
+ url: entry.url,
13306
+ path: entry.visual.path,
13307
+ sha256: entry.visual.sha256,
13308
+ bytes: entry.visual.bytes,
13309
+ kind: entry.visual.kind,
13310
+ fullPage: entry.visual.fullPage,
13311
+ capturedAt: entry.visual.capturedAt
13312
+ }));
13000
13313
  var toCaptureEvidenceJson = (reference) => {
13001
13314
  const normalized = normalizeInspiredesignCaptureEvidence(reference.capture);
13002
13315
  if (!normalized) return null;
@@ -13004,6 +13317,7 @@ var toCaptureEvidenceJson = (reference) => {
13004
13317
  return {
13005
13318
  ...normalized.title ? { title: normalized.title } : {},
13006
13319
  ...signals.length > 0 ? { signals } : {},
13320
+ ...normalized.visual ? { visual: normalized.visual } : {},
13007
13321
  ...normalized.attempts ? { attempts: normalized.attempts } : {}
13008
13322
  };
13009
13323
  };
@@ -13049,6 +13363,12 @@ var buildInspiredesignPacket = (input) => {
13049
13363
  advancedBrief: isReferenceFirstPublicLanding(designVectors) ? renderEvidenceDerivedAdvancedBrief(input.briefExpansion, effectiveFormat) : input.briefExpansion.advancedBrief,
13050
13364
  format: effectiveFormat
13051
13365
  };
13366
+ const metaPromptMarkdown = buildInspiredesignMetaPrompt({
13367
+ brief,
13368
+ briefExpansion: effectiveBriefExpansion,
13369
+ referencePatternBoard,
13370
+ designVectors
13371
+ });
13052
13372
  const advancedBriefMarkdown = renderReferenceFirstAdvancedBrief(
13053
13373
  effectiveBriefExpansion,
13054
13374
  referencePatternBoard,
@@ -13156,6 +13476,8 @@ var buildInspiredesignPacket = (input) => {
13156
13476
  "",
13157
13477
  renderDeliverablesSummary(Boolean(input.includePrototypeGuidance))
13158
13478
  ].join("\n");
13479
+ const visualEvidence = buildVisualEvidencePayload(references);
13480
+ const screenshotIndex = buildScreenshotIndex(references);
13159
13481
  return {
13160
13482
  advancedBriefMarkdown,
13161
13483
  designContract,
@@ -13166,6 +13488,10 @@ var buildInspiredesignPacket = (input) => {
13166
13488
  implementationPlan,
13167
13489
  implementationPlanMarkdown,
13168
13490
  prototypeGuidanceMarkdown,
13491
+ visualEvidence,
13492
+ screenshotIndex,
13493
+ rankedReferences: referencePatternBoard.references,
13494
+ metaPromptMarkdown,
13169
13495
  evidence: buildEvidencePayload({
13170
13496
  brief,
13171
13497
  briefExpansion: effectiveBriefExpansion,
@@ -13451,6 +13777,11 @@ var buildInspiredesignSuccessHandoff = (input) => createSuccessHandoff(
13451
13777
  reason: "Load the Canvas contract lane before patching.",
13452
13778
  command: input.commandExamples.loadDesignAgent
13453
13779
  },
13780
+ {
13781
+ reason: "Load the motion-design lane before translating visual evidence into animation, timing, or reduced-motion behavior.",
13782
+ command: input.commandExamples.loadMotionDesign
13783
+ },
13784
+ { reason: INSPIREDESIGN_HANDOFF_GUIDANCE.visualArtifactRecommendation },
13454
13785
  {
13455
13786
  reason: INSPIREDESIGN_HANDOFF_GUIDANCE.prepareCanvasPlanRequest,
13456
13787
  command: input.commandExamples.continueInCanvas
@@ -13986,6 +14317,18 @@ var renderShopping = (args) => {
13986
14317
  var renderInspiredesign = (args) => {
13987
14318
  const captureAttemptReport = inspiredesignCaptureAttemptReportFromMeta(args.meta);
13988
14319
  const captureAttemptSummary = inspiredesignCaptureAttemptSummaryFromMeta(args.meta);
14320
+ const visualEvidence = args.visualEvidence ?? [];
14321
+ const screenshotIndex = args.screenshotIndex ?? [];
14322
+ const rankedReferences = args.rankedReferences ?? [];
14323
+ const rankedReferencesArtifact = args.referencePatternBoard ? {
14324
+ references: args.referencePatternBoard.references,
14325
+ rejectedReferences: args.referencePatternBoard.rejectedReferences,
14326
+ synthesis: args.referencePatternBoard.synthesis
14327
+ } : {
14328
+ references: rankedReferences,
14329
+ rejectedReferences: []
14330
+ };
14331
+ const metaPromptMarkdown = args.metaPromptMarkdown ?? "";
13989
14332
  const summary = buildInspiredesignSummary({
13990
14333
  brief: args.brief,
13991
14334
  referenceCount: args.urls.length,
@@ -14006,6 +14349,10 @@ var renderInspiredesign = (args) => {
14006
14349
  implementationPlanMarkdown: args.implementationPlanMarkdown,
14007
14350
  prototypeGuidanceMarkdown: args.prototypeGuidanceMarkdown,
14008
14351
  evidence: args.evidence,
14352
+ visualEvidence,
14353
+ screenshotIndex,
14354
+ rankedReferences,
14355
+ metaPromptMarkdown,
14009
14356
  meta: args.meta
14010
14357
  };
14011
14358
  const handoff = buildInspiredesignSuccessHandoff({
@@ -14023,7 +14370,11 @@ var renderInspiredesign = (args) => {
14023
14370
  { path: INSPIREDESIGN_HANDOFF_FILES.generationPlan, content: args.generationPlan },
14024
14371
  { path: INSPIREDESIGN_HANDOFF_FILES.implementationPlanMarkdown, content: args.implementationPlanMarkdown },
14025
14372
  { path: INSPIREDESIGN_HANDOFF_FILES.implementationPlan, content: args.implementationPlan },
14026
- { path: INSPIREDESIGN_HANDOFF_FILES.evidence, content: args.evidence }
14373
+ { path: INSPIREDESIGN_HANDOFF_FILES.evidence, content: args.evidence },
14374
+ { path: INSPIREDESIGN_HANDOFF_FILES.visualEvidence, content: { visualEvidence } },
14375
+ { path: INSPIREDESIGN_HANDOFF_FILES.screenshotIndex, content: { screenshots: screenshotIndex } },
14376
+ { path: INSPIREDESIGN_HANDOFF_FILES.rankedReferences, content: rankedReferencesArtifact },
14377
+ { path: INSPIREDESIGN_HANDOFF_FILES.metaPrompt, content: metaPromptMarkdown }
14027
14378
  ];
14028
14379
  if (args.prototypeGuidanceMarkdown) {
14029
14380
  files.push({ path: INSPIREDESIGN_HANDOFF_FILES.prototypeGuidance, content: args.prototypeGuidanceMarkdown });
@@ -14058,6 +14409,10 @@ var renderInspiredesign = (args) => {
14058
14409
  implementationPlan: args.implementationPlan,
14059
14410
  prototypeGuidanceMarkdown: args.prototypeGuidanceMarkdown,
14060
14411
  evidence: args.evidence,
14412
+ visualEvidence,
14413
+ screenshotIndex,
14414
+ rankedReferences,
14415
+ metaPromptMarkdown,
14061
14416
  ...handoff,
14062
14417
  ...captureAttemptFields,
14063
14418
  meta: args.meta
@@ -14102,6 +14457,140 @@ var renderInspiredesign = (args) => {
14102
14457
  };
14103
14458
  };
14104
14459
 
14460
+ // src/inspiredesign/reference-discovery.ts
14461
+ var normalizeHttpUrl = (value) => {
14462
+ try {
14463
+ const url = new URL(value);
14464
+ if (url.protocol !== "http:" && url.protocol !== "https:") return null;
14465
+ url.hash = "";
14466
+ if (url.pathname === "/" && !/^https?:\/\/[^/]+\/[^?#]/i.test(value)) {
14467
+ return `${url.origin}${url.search}`;
14468
+ }
14469
+ return url.toString();
14470
+ } catch (error) {
14471
+ void error;
14472
+ return null;
14473
+ }
14474
+ };
14475
+ var extractInspiredesignDiscoveryUrl = (record) => {
14476
+ if (typeof record.url !== "string") return null;
14477
+ const trimmed = record.url.trim();
14478
+ if (!trimmed) return null;
14479
+ return normalizeHttpUrl(trimmed);
14480
+ };
14481
+ var normalizeInspiredesignDiscoveryRecords = (records) => {
14482
+ const seen = /* @__PURE__ */ new Set();
14483
+ const accepted = [];
14484
+ const rejected = [];
14485
+ records.forEach((record, index) => {
14486
+ const rawUrl = typeof record.url === "string" ? record.url.trim() : void 0;
14487
+ const url = extractInspiredesignDiscoveryUrl(record);
14488
+ const base = {
14489
+ ...record.title ? { title: record.title } : {},
14490
+ source: record.source,
14491
+ provider: record.provider,
14492
+ rank: index + 1
14493
+ };
14494
+ if (!rawUrl) {
14495
+ rejected.push({ ...base, status: "rejected", reason: "missing_url" });
14496
+ return;
14497
+ }
14498
+ if (!url) {
14499
+ rejected.push({ ...base, status: "rejected", reason: "invalid_url", rawUrl });
14500
+ return;
14501
+ }
14502
+ if (seen.has(url)) {
14503
+ rejected.push({ ...base, status: "rejected", reason: "duplicate_url", rawUrl });
14504
+ return;
14505
+ }
14506
+ seen.add(url);
14507
+ accepted.push({ ...base, status: "accepted", url });
14508
+ });
14509
+ return { accepted, rejected };
14510
+ };
14511
+ var mergeInspiredesignReferenceUrls = (explicitUrls, discoveredUrls, maxReferences) => {
14512
+ const merged = [];
14513
+ const seen = /* @__PURE__ */ new Set();
14514
+ for (const url of [...explicitUrls, ...discoveredUrls]) {
14515
+ const normalized = normalizeHttpUrl(url.trim());
14516
+ if (!normalized || seen.has(normalized)) continue;
14517
+ seen.add(normalized);
14518
+ merged.push(normalized);
14519
+ if (merged.length >= maxReferences) return merged;
14520
+ }
14521
+ return merged;
14522
+ };
14523
+ var normalizeInspiredesignProviders = (providers) => {
14524
+ const normalized = (providers ?? []).map((provider) => provider.trim()).filter((provider) => provider.length > 0);
14525
+ return [...new Set(normalized)];
14526
+ };
14527
+
14528
+ // src/inspiredesign/visual-policy.ts
14529
+ var VISUAL_BLOCKER_REASONS = /* @__PURE__ */ new Set([
14530
+ "policy_blocked",
14531
+ "auth_required",
14532
+ "challenge_detected",
14533
+ "rate_limited"
14534
+ ]);
14535
+ var toVisualPolicyReason = (reasonCode) => {
14536
+ if (!VISUAL_BLOCKER_REASONS.has(reasonCode)) return null;
14537
+ if (reasonCode === "policy_blocked" || reasonCode === "auth_required" || reasonCode === "challenge_detected" || reasonCode === "rate_limited") {
14538
+ return reasonCode;
14539
+ }
14540
+ return null;
14541
+ };
14542
+ var blockerFromFailures = (failures) => {
14543
+ for (const failure of failures ?? []) {
14544
+ const reasonCode = failure.error.reasonCode;
14545
+ if (!reasonCode) continue;
14546
+ const blocker = toVisualPolicyReason(reasonCode);
14547
+ if (blocker) return blocker;
14548
+ }
14549
+ return null;
14550
+ };
14551
+ var blockerFromTopLevelError = (error) => {
14552
+ if (!error?.reasonCode) return null;
14553
+ return toVisualPolicyReason(error.reasonCode);
14554
+ };
14555
+ var messageForBlocker = (reason) => {
14556
+ switch (reason) {
14557
+ case "policy_blocked":
14558
+ return "Visual capture skipped because provider policy blocked the reference.";
14559
+ case "auth_required":
14560
+ return "Visual capture skipped because authenticated access is unresolved.";
14561
+ case "challenge_detected":
14562
+ return "Visual capture skipped because a challenge was detected.";
14563
+ case "rate_limited":
14564
+ return "Visual capture skipped because the provider is rate limited.";
14565
+ case "visual_evidence_off":
14566
+ return "Visual evidence is disabled for this run.";
14567
+ case "visual_capture_allowed":
14568
+ return "Visual capture is allowed for this reference.";
14569
+ }
14570
+ };
14571
+ var decideInspiredesignVisualCapturePolicy = (input) => {
14572
+ if (input.visualEvidence === "off") {
14573
+ return {
14574
+ status: "skipped",
14575
+ reason: "visual_evidence_off",
14576
+ message: messageForBlocker("visual_evidence_off")
14577
+ };
14578
+ }
14579
+ const blocker = input.hasUsableRecords === true ? null : blockerFromFailures(input.failures) ?? blockerFromTopLevelError(input.topLevelError);
14580
+ if (blocker) {
14581
+ return {
14582
+ status: "skipped",
14583
+ reason: blocker,
14584
+ message: messageForBlocker(blocker)
14585
+ };
14586
+ }
14587
+ return {
14588
+ status: "allowed",
14589
+ reason: "visual_capture_allowed",
14590
+ message: messageForBlocker("visual_capture_allowed")
14591
+ };
14592
+ };
14593
+
14105
14594
  // src/canvas/types.ts
14106
14595
  var CANVAS_SCHEMA_VERSION = "1.0.0";
14107
14596
  var CANVAS_SESSION_MODES = ["low-fi-wireframe", "high-fi-live-edit", "dual-track", "document-only"];
@@ -14230,7 +14719,7 @@ var CANVAS_VALIDATION_TARGET_BLOCK_ON_CODES = [
14230
14719
  var CANVAS_PUBLIC_WARNING_CLASSES = CANVAS_VALIDATION_TARGET_BLOCK_ON_CODES;
14231
14720
 
14232
14721
  // src/providers/shopping-postprocess.ts
14233
- import { createHash as createHash4 } from "crypto";
14722
+ import { createHash as createHash5 } from "crypto";
14234
14723
  var LOOKS_LIKE_URL_RE = /^https?:\/\/\S+$/i;
14235
14724
  var PRICE_TOKEN_RE = /((?:US\$|CA\$|C\$|USD|CAD|EUR|GBP|[$€£]))\s*([0-9]{1,4}(?:[.,][0-9]{3})*(?:[.,][0-9]{1,2})?)/gi;
14236
14725
  var CONTEXTUAL_PRICE_TOKEN_RE = /(?:connect to any carrier later|starting at|starts at|starting from|from|buy now for|buy for)\s*((?:US\$|CA\$|C\$|USD|CAD|EUR|GBP|[$€£]))\s*([0-9]{1,4}(?:[.,][0-9]{3})*(?:[.,][0-9]{1,2})?)/gi;
@@ -14316,7 +14805,7 @@ var REGION_CURRENCY_BY_REGION = {
14316
14805
  uk: "GBP",
14317
14806
  eu: "EUR"
14318
14807
  };
14319
- var hash = (value) => createHash4("sha1").update(value).digest("hex").slice(0, 16);
14808
+ var hash = (value) => createHash5("sha1").update(value).digest("hex").slice(0, 16);
14320
14809
  var normalizePlainText = (value) => {
14321
14810
  if (!value) return "";
14322
14811
  return extractText(value).replace(/[\u0000-\u001F\u007F-\u009F]+/g, " ").replace(/\s+/g, " ").trim();
@@ -14945,7 +15434,7 @@ var compileShoppingWorkflow = (input, options = {}) => {
14945
15434
  };
14946
15435
 
14947
15436
  // src/providers/shopping-compiler.ts
14948
- import { createHash as createHash5 } from "crypto";
15437
+ import { createHash as createHash6 } from "crypto";
14949
15438
  var DEFAULT_SHOPPING_SEARCH_LIMIT = 8;
14950
15439
  var SHOPPING_FETCH_RECOVERY_LIMIT = 2;
14951
15440
  var SEARCH_INDEX_RETRIEVAL_PATHS = /* @__PURE__ */ new Set(["shopping:search:index", "shopping:search:link"]);
@@ -14962,7 +15451,7 @@ var emptyCheckpointState = () => ({
14962
15451
  step_results_by_id: {}
14963
15452
  });
14964
15453
  var createShoppingSearchStepId = (providerId) => `search:${providerId}`;
14965
- var createShoppingFetchStepId = (providerId, url) => `fetch:${providerId}:${createHash5("sha1").update(canonicalizeUrl(url)).digest("hex").slice(0, 16)}`;
15454
+ var createShoppingFetchStepId = (providerId, url) => `fetch:${providerId}:${createHash6("sha1").update(canonicalizeUrl(url)).digest("hex").slice(0, 16)}`;
14966
15455
  var serializeShoppingCheckpointState = (state) => ({
14967
15456
  completed_step_ids: [...state.completed_step_ids],
14968
15457
  step_results_by_id: state.step_results_by_id
@@ -15448,7 +15937,7 @@ var compileProductVideoExecutionPlan = (args) => {
15448
15937
  };
15449
15938
 
15450
15939
  // src/providers/research-compiler.ts
15451
- import { createHash as createHash6 } from "crypto";
15940
+ import { createHash as createHash7 } from "crypto";
15452
15941
  var RESEARCH_AUTO_SOURCES = ["web", "community", "social"];
15453
15942
  var RESEARCH_ALL_SOURCES = [...RESEARCH_AUTO_SOURCES];
15454
15943
  var DEFAULT_RESEARCH_SEARCH_LIMIT = 10;
@@ -15474,7 +15963,7 @@ var toProviderSource = (providerId) => {
15474
15963
  return null;
15475
15964
  };
15476
15965
  var createResearchSearchStepId = (source) => `search:${source}`;
15477
- var createResearchFetchStepId = (url) => `fetch:web:${createHash6("sha1").update(canonicalizeUrl(url)).digest("hex").slice(0, 16)}`;
15966
+ var createResearchFetchStepId = (url) => `fetch:web:${createHash7("sha1").update(canonicalizeUrl(url)).digest("hex").slice(0, 16)}`;
15478
15967
  var serializeResearchCheckpointState = (state) => ({
15479
15968
  completed_step_ids: [...state.completed_step_ids],
15480
15969
  step_results_by_id: state.step_results_by_id
@@ -16396,6 +16885,9 @@ var workflowTestUtils = {
16396
16885
  redactRawCapture: (record) => redactRawCapture(record),
16397
16886
  toProviderSource: (providerId) => toProviderSource2(providerId),
16398
16887
  resolveShoppingProviderIdForUrl: (url) => resolveShoppingProviderIdForUrl(url),
16888
+ resolveShoppingSourceForUrl: (url) => resolveShoppingSourceForUrl(url),
16889
+ resolveProductCopy: (record, productUrl, refreshedDescription, featureList) => resolveProductCopy(record, productUrl, refreshedDescription, featureList),
16890
+ getRequiredProductVideoExecutionStep: (steps, stepId) => getRequiredProductVideoExecutionStep(steps, stepId),
16399
16891
  normalizeProductVideoProviderHint: (productUrl, providerHint, fallbackProvider) => normalizeProductVideoProviderHint(productUrl, providerHint, fallbackProvider),
16400
16892
  hasTranscriptSuccess: (record) => hasTranscriptSuccess(record),
16401
16893
  sanitizeFeatureList: (values) => sanitizeFeatureList(values),
@@ -16407,7 +16899,15 @@ var workflowTestUtils = {
16407
16899
  fetchBinary: (url, timeoutMs) => fetchBinary(url, timeoutMs),
16408
16900
  rankResearchRecords: (records) => rankResearchRecords(records),
16409
16901
  isValidHttpUrl: (url) => isValidHttpUrl3(url),
16410
- buildWorkflowResumePayload: (kind, input) => buildWorkflowResumePayload(kind, input)
16902
+ buildWorkflowResumePayload: (kind, input) => buildWorkflowResumePayload(kind, input),
16903
+ withPrimaryConstraintSummaryOverride: (meta, summary, guidance) => withPrimaryConstraintSummaryOverride(meta, summary, guidance),
16904
+ withReasonCodeDistributionMeta: (meta, reasonCodeDistribution) => withReasonCodeDistributionMeta(meta, reasonCodeDistribution),
16905
+ incrementReasonCodeDistribution: (reasonCodeDistribution, reasonCode, count) => incrementReasonCodeDistribution(reasonCodeDistribution, reasonCode, count),
16906
+ summarizeShoppingOfferFilterConstraint: (args) => summarizeShoppingOfferFilterConstraint(args),
16907
+ parseInspiredesignEnvelopeInput: (input) => parseInspiredesignEnvelopeInput(input),
16908
+ failureFromInspiredesignDiscoveryError: (workflowInput, error) => failureFromInspiredesignDiscoveryError(workflowInput, error),
16909
+ failureFromInspiredesignFetchError: (result) => failureFromInspiredesignFetchError(result),
16910
+ extractProductBrandFromTitle: (title, productUrl) => extractProductBrandFromTitle(title, productUrl)
16411
16911
  };
16412
16912
  var PRODUCT_ASSET_FETCH_TIMEOUT_MS = 15e3;
16413
16913
  var RESEARCH_PROVIDER_STEP_TIMEOUT_MS = 3e4;
@@ -16459,7 +16959,7 @@ var rankResearchRecords = (records) => {
16459
16959
  return left.id.localeCompare(right.id);
16460
16960
  });
16461
16961
  };
16462
- var hash2 = (value) => createHash7("sha1").update(value).digest("hex").slice(0, 16);
16962
+ var hash2 = (value) => createHash8("sha1").update(value).digest("hex").slice(0, 16);
16463
16963
  var RESEARCH_ALWAYS_SANITIZED_PATHS = /* @__PURE__ */ new Set([
16464
16964
  "community:search:index",
16465
16965
  "community:search:url",
@@ -16655,8 +17155,17 @@ var INSPIREDESIGN_RENDER_MODES = /* @__PURE__ */ new Set(["compact", "json", "md
16655
17155
  var INSPIREDESIGN_CAPTURE_MODES = /* @__PURE__ */ new Set(["off", "deep"]);
16656
17156
  var INSPIREDESIGN_COOKIE_POLICIES = /* @__PURE__ */ new Set(["off", "auto", "required"]);
16657
17157
  var WORKFLOW_BROWSER_MODES = /* @__PURE__ */ new Set(["auto", "extension", "managed"]);
17158
+ var INSPIREDESIGN_DEFAULT_MAX_REFERENCES = 5;
17159
+ var INSPIREDESIGN_MAX_REFERENCES_LIMIT = 10;
16658
17160
  var isJsonRecord7 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
16659
17161
  var INSPIREDESIGN_CAPTURE_UNAVAILABLE_FAILURE = "Deep capture requested, but browser capture is unavailable in this execution lane.";
17162
+ var REQUIRED_VISUAL_EVIDENCE_MISSING_FAILURE = "Required visual evidence was not captured.";
17163
+ var INSPIREDESIGN_VISUAL_POLICY_BLOCKER_REASONS = /* @__PURE__ */ new Set([
17164
+ "policy_blocked",
17165
+ "auth_required",
17166
+ "challenge_detected",
17167
+ "rate_limited"
17168
+ ]);
16660
17169
  var isCanvasVisualDirectionProfile = (value) => {
16661
17170
  return CANVAS_VISUAL_DIRECTION_PROFILES.includes(value);
16662
17171
  };
@@ -16670,6 +17179,11 @@ var serializeInspiredesignBriefExpansion = (expansion) => structuredClone(expans
16670
17179
  var serializeInspiredesignRunInput = (input) => ({
16671
17180
  brief: input.brief,
16672
17181
  briefExpansion: serializeInspiredesignBriefExpansion(input.briefExpansion),
17182
+ ...input.harvest === true ? { harvest: true } : {},
17183
+ ...input.query ? { query: input.query } : {},
17184
+ ...input.providers.length > 0 ? { providers: input.providers } : {},
17185
+ ...input.referenceLimit !== void 0 ? { maxReferences: input.maxReferences } : {},
17186
+ visualEvidence: input.visualEvidence,
16673
17187
  urls: input.urls,
16674
17188
  captureMode: input.captureMode,
16675
17189
  mode: input.mode,
@@ -16745,6 +17259,11 @@ var parseInspiredesignEnvelopeInput = (input) => {
16745
17259
  return {
16746
17260
  brief: typeof input.brief === "string" ? input.brief : "",
16747
17261
  mode: typeof input.mode === "string" && INSPIREDESIGN_RENDER_MODES.has(input.mode) ? input.mode : "compact",
17262
+ ...typeof input.harvest === "boolean" ? { harvest: input.harvest } : {},
17263
+ ...typeof input.query === "string" && input.query.trim().length > 0 ? { query: input.query.trim() } : {},
17264
+ ...Array.isArray(input.providers) ? { providers: input.providers.filter((provider) => typeof provider === "string") } : {},
17265
+ ...typeof input.maxReferences === "number" ? { maxReferences: input.maxReferences } : {},
17266
+ ...isInspiredesignVisualEvidenceMode(input.visualEvidence) ? { visualEvidence: input.visualEvidence } : {},
16748
17267
  ...briefExpansion ? { briefExpansion } : {},
16749
17268
  ...Array.isArray(input.urls) ? { urls: input.urls.filter((url) => typeof url === "string") } : {},
16750
17269
  ...typeof input.captureMode === "string" && INSPIREDESIGN_CAPTURE_MODES.has(input.captureMode) ? { captureMode: input.captureMode } : {},
@@ -16767,6 +17286,24 @@ var normalizeInspiredesignUrls = (urls) => {
16767
17286
  }
16768
17287
  return [...new Set(normalized.map((url) => canonicalizeUrl(url)))];
16769
17288
  };
17289
+ var normalizeInspiredesignMaxReferences = (value, fallbackCount) => {
17290
+ if (typeof value === "undefined") {
17291
+ return Math.max(1, Math.min(Math.max(fallbackCount, 1), INSPIREDESIGN_MAX_REFERENCES_LIMIT));
17292
+ }
17293
+ if (!Number.isInteger(value) || value < 1 || value > INSPIREDESIGN_MAX_REFERENCES_LIMIT) {
17294
+ throw new Error("Inspiredesign workflow maxReferences must be an integer from 1 to 10.");
17295
+ }
17296
+ return value;
17297
+ };
17298
+ var normalizeInspiredesignVisualEvidenceMode = (value, harvest) => {
17299
+ if (typeof value === "undefined") {
17300
+ return harvest === true ? "required" : "off";
17301
+ }
17302
+ if (!isInspiredesignVisualEvidenceMode(value)) {
17303
+ throw new Error("Inspiredesign workflow visualEvidence must be one of off, auto, or required.");
17304
+ }
17305
+ return value;
17306
+ };
16770
17307
  var hasValidInspiredesignBriefRoute = (route) => {
16771
17308
  return isCanvasVisualDirectionProfile(route.profile) && isCanvasThemeStrategy(route.themeStrategy) && isCanvasNavigationModel(route.navigationModel);
16772
17309
  };
@@ -16788,6 +17325,23 @@ var normalizeInspiredesignInput = (input) => {
16788
17325
  throw new Error("Inspiredesign workflow requires a non-empty brief.");
16789
17326
  }
16790
17327
  const urls = normalizeInspiredesignUrls(input.urls);
17328
+ const query = typeof input.query === "string" && input.query.trim().length > 0 ? input.query.trim() : void 0;
17329
+ const providers = normalizeInspiredesignProviders(input.providers);
17330
+ const hasExplicitMaxReferences = typeof input.maxReferences !== "undefined";
17331
+ if (query && input.harvest !== true) {
17332
+ throw new Error("Inspiredesign workflow query is only supported when harvest is true.");
17333
+ }
17334
+ if (providers.length > 0 && !query) {
17335
+ throw new Error("Inspiredesign workflow providers require query.");
17336
+ }
17337
+ if (input.harvest === true && !query && urls.length === 0) {
17338
+ throw new Error("Inspiredesign harvest requires query or URL references.");
17339
+ }
17340
+ const visualEvidence = normalizeInspiredesignVisualEvidenceMode(
17341
+ input.visualEvidence,
17342
+ input.harvest
17343
+ );
17344
+ const maxReferencesFallback = query || input.harvest === true ? INSPIREDESIGN_DEFAULT_MAX_REFERENCES : urls.length;
16791
17345
  const normalizedBrief = normalizeInspiredesignBriefText(brief);
16792
17346
  const preferredFormatId = shouldReuseInspiredesignBriefExpansion(input.briefExpansion, normalizedBrief) ? input.briefExpansion.format.id : void 0;
16793
17347
  const briefExpansion = expandInspiredesignBrief(brief, preferredFormatId);
@@ -16795,9 +17349,14 @@ var normalizeInspiredesignInput = (input) => {
16795
17349
  ...input,
16796
17350
  brief,
16797
17351
  briefExpansion,
17352
+ ...query ? { query } : {},
17353
+ providers,
17354
+ maxReferences: normalizeInspiredesignMaxReferences(input.maxReferences, maxReferencesFallback),
17355
+ ...query || input.harvest === true || hasExplicitMaxReferences ? { referenceLimit: normalizeInspiredesignMaxReferences(input.maxReferences, maxReferencesFallback) } : {},
17356
+ visualEvidence,
16798
17357
  urls,
16799
17358
  captureMode: resolveInspiredesignCaptureMode(input.captureMode, urls),
16800
- mode: input.mode ?? "compact"
17359
+ mode: input.mode ?? (input.harvest === true ? "path" : "compact")
16801
17360
  };
16802
17361
  };
16803
17362
  var isInspiredesignWorkflowEnvelopeInput = (input) => {
@@ -16858,6 +17417,89 @@ var buildInspiredesignFetchOptions = (workflowInput, envelope, timeoutMs) => wit
16858
17417
  "workflow.inspiredesign",
16859
17418
  envelope
16860
17419
  );
17420
+ var emptyInspiredesignDiscoveryDiagnostics = (workflowInput, searchAvailable, failure) => ({
17421
+ requested: Boolean(workflowInput.query),
17422
+ searchAvailable,
17423
+ ...workflowInput.query ? { query: workflowInput.query } : {},
17424
+ providers: workflowInput.providers,
17425
+ acceptedUrls: [],
17426
+ rejected: [],
17427
+ failures: [],
17428
+ ...failure ? { failure } : {}
17429
+ });
17430
+ var providerFromInspiredesignDiscoveryFailure = (workflowInput, error) => {
17431
+ const provider = error.provider ?? workflowInput.providers[0];
17432
+ const source = error.source ?? (provider ? toProviderSource2(provider) : null);
17433
+ return provider && source ? { provider, source } : void 0;
17434
+ };
17435
+ var failureFromInspiredesignDiscoveryError = (workflowInput, error) => {
17436
+ if (!error) return [];
17437
+ const provider = providerFromInspiredesignDiscoveryFailure(workflowInput, error);
17438
+ if (!provider) return [];
17439
+ return [{
17440
+ provider: provider.provider,
17441
+ source: provider.source,
17442
+ error
17443
+ }];
17444
+ };
17445
+ var providerFromInspiredesignFetchFailure = (result) => {
17446
+ const provider = result.error?.provider ?? result.providerOrder[0];
17447
+ const source = result.error?.source ?? (provider ? toProviderSource2(provider) : null);
17448
+ return provider && source ? { provider, source } : void 0;
17449
+ };
17450
+ var failureFromInspiredesignFetchError = (result) => {
17451
+ if (!result.error || result.failures.length > 0) return [];
17452
+ const provider = providerFromInspiredesignFetchFailure(result);
17453
+ if (!provider) return [];
17454
+ return [{
17455
+ provider: provider.provider,
17456
+ source: provider.source,
17457
+ error: result.error
17458
+ }];
17459
+ };
17460
+ var discoverInspiredesignReferences = async (runtime, workflowInput, envelope, timeoutMs) => {
17461
+ if (!workflowInput.query) {
17462
+ return emptyInspiredesignDiscoveryDiagnostics(workflowInput, typeof runtime.search === "function");
17463
+ }
17464
+ if (typeof runtime.search !== "function") {
17465
+ return emptyInspiredesignDiscoveryDiagnostics(
17466
+ workflowInput,
17467
+ false,
17468
+ "Reference discovery requested, but provider search is unavailable in this execution lane."
17469
+ );
17470
+ }
17471
+ let searchResult;
17472
+ try {
17473
+ searchResult = await runtime.search(
17474
+ {
17475
+ query: workflowInput.query,
17476
+ limit: workflowInput.maxReferences
17477
+ },
17478
+ {
17479
+ ...buildInspiredesignFetchOptions(workflowInput, envelope, timeoutMs),
17480
+ ...workflowInput.providers.length > 0 ? { providerIds: workflowInput.providers } : {}
17481
+ }
17482
+ );
17483
+ } catch (error) {
17484
+ return emptyInspiredesignDiscoveryDiagnostics(
17485
+ workflowInput,
17486
+ true,
17487
+ error instanceof Error ? error.message : "Reference discovery failed."
17488
+ );
17489
+ }
17490
+ const discovery = normalizeInspiredesignDiscoveryRecords(searchResult.records);
17491
+ const discoveryFailures = searchResult.failures.length > 0 ? searchResult.failures : failureFromInspiredesignDiscoveryError(workflowInput, searchResult.error);
17492
+ return {
17493
+ requested: true,
17494
+ searchAvailable: true,
17495
+ query: workflowInput.query,
17496
+ providers: workflowInput.providers,
17497
+ acceptedUrls: discovery.accepted.map((candidate) => candidate.url),
17498
+ rejected: discovery.rejected,
17499
+ failures: discoveryFailures,
17500
+ ...searchResult.error?.message ? { failure: searchResult.error.message } : {}
17501
+ };
17502
+ };
16861
17503
  var buildEmptyInspiredesignCaptureAttemptCounts = () => ({
16862
17504
  snapshot: { captured: 0, failed: 0, skipped: 0 },
16863
17505
  clone: { captured: 0, failed: 0, skipped: 0 },
@@ -16870,6 +17512,78 @@ var buildUnavailableInspiredesignCaptureEvidence = () => ({
16870
17512
  dom: { status: "skipped", detail: INSPIREDESIGN_CAPTURE_UNAVAILABLE_FAILURE }
16871
17513
  }
16872
17514
  });
17515
+ var getInspiredesignReferenceId = (url) => createHash8("sha256").update(url).digest("hex").slice(0, 12);
17516
+ var buildVisualPolicyMetadata = (decision) => {
17517
+ if (decision.status === "allowed") return void 0;
17518
+ return {
17519
+ status: decision.status,
17520
+ kind: "viewport",
17521
+ fullPage: false,
17522
+ capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
17523
+ warnings: [`policy:${decision.reason}`],
17524
+ failure: decision.message
17525
+ };
17526
+ };
17527
+ var mergeCaptureVisualEvidence = (capture, visual) => {
17528
+ if (!visual) return capture;
17529
+ return {
17530
+ ...capture ?? {},
17531
+ visual
17532
+ };
17533
+ };
17534
+ var isVisualPolicyBlockerDecision = (decision) => INSPIREDESIGN_VISUAL_POLICY_BLOCKER_REASONS.has(decision.reason);
17535
+ var buildMissingRequiredVisualEvidence = (failure, _visualPlan) => ({
17536
+ status: "failed",
17537
+ kind: "viewport",
17538
+ fullPage: false,
17539
+ capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
17540
+ warnings: ["required_visual_evidence_missing"],
17541
+ failure
17542
+ });
17543
+ var getRequiredVisualEvidenceFailure = (workflowInput, visualPlan, capture) => {
17544
+ if (workflowInput.visualEvidence !== "required" || visualPlan.policy.status !== "allowed") return void 0;
17545
+ const visual = normalizeInspiredesignCaptureEvidence(capture)?.visual;
17546
+ if (!visual) return REQUIRED_VISUAL_EVIDENCE_MISSING_FAILURE;
17547
+ if (visual.status === "captured") return void 0;
17548
+ return visual.failure ?? REQUIRED_VISUAL_EVIDENCE_MISSING_FAILURE;
17549
+ };
17550
+ var addRequiredVisualEvidenceFailure = (capture, visualPlan, failure) => {
17551
+ const visual = normalizeInspiredesignCaptureEvidence(capture)?.visual;
17552
+ if (visual) return capture;
17553
+ return mergeCaptureVisualEvidence(capture, buildMissingRequiredVisualEvidence(failure, visualPlan));
17554
+ };
17555
+ var VISUAL_TEMP_PATH_MISMATCH_FAILURE = "Visual evidence temp path did not match the workflow capture plan.";
17556
+ var VISUAL_KIND_MISMATCH_FAILURE = "Visual evidence kind did not match the workflow capture contract.";
17557
+ var hasTrustedVisualTempPath = (visual, visualPlan) => {
17558
+ if (visual.status === "captured" && !visual.tempPath) return false;
17559
+ if (!visual.tempPath) return true;
17560
+ if (!visualPlan.tempPath) return false;
17561
+ return resolve(visual.tempPath) === resolve(visualPlan.tempPath);
17562
+ };
17563
+ var hasTrustedVisualKind = (visual) => isInspiredesignVisualEvidenceKind(visual.kind);
17564
+ var readRuntimeVisualWarnings = (visual) => {
17565
+ const warnings = visual.warnings;
17566
+ return Array.isArray(warnings) ? warnings.filter((warning) => typeof warning === "string") : [];
17567
+ };
17568
+ var failMismatchedVisualTempPath = (visual, failure = VISUAL_TEMP_PATH_MISMATCH_FAILURE, warning = "visual_temp_path_mismatch") => ({
17569
+ status: "failed",
17570
+ kind: hasTrustedVisualKind(visual) ? visual.kind : "viewport",
17571
+ fullPage: visual.fullPage,
17572
+ capturedAt: visual.capturedAt,
17573
+ warnings: [...readRuntimeVisualWarnings(visual), warning],
17574
+ failure
17575
+ });
17576
+ var trustRuntimeVisualEvidence = (visual, visualPlan) => {
17577
+ if (!visual) return void 0;
17578
+ if (!hasTrustedVisualKind(visual)) {
17579
+ return failMismatchedVisualTempPath(
17580
+ visual,
17581
+ VISUAL_KIND_MISMATCH_FAILURE,
17582
+ "visual_kind_mismatch"
17583
+ );
17584
+ }
17585
+ return hasTrustedVisualTempPath(visual, visualPlan) ? visual : failMismatchedVisualTempPath(visual);
17586
+ };
16873
17587
  var PRE_ARTIFACT_CAPTURE_SKIP_MESSAGE = "Skipped after deep capture failed before artifact capture started.";
16874
17588
  var buildFailedInspiredesignCaptureEvidence = (detail) => ({
16875
17589
  attempts: {
@@ -16904,41 +17618,74 @@ var summarizeInspiredesignCaptureAttempts = (references) => {
16904
17618
  summary: formatInspiredesignCaptureAttemptSummary({ worked, didNotWork })
16905
17619
  };
16906
17620
  };
16907
- var captureInspiredesignReference = async (url, captureMode, workflowInput, captureReference, timeoutMs) => {
17621
+ var captureInspiredesignReference = async (url, captureMode, workflowInput, captureReference, visualPlan, timeoutMs) => {
17622
+ const visualPolicyMetadata = buildVisualPolicyMetadata(visualPlan.policy);
16908
17623
  if (captureMode === "off") {
16909
- return { captureStatus: "off" };
17624
+ return visualPolicyMetadata ? { captureStatus: "off", capture: { visual: visualPolicyMetadata } } : { captureStatus: "off" };
17625
+ }
17626
+ if (visualPolicyMetadata && isVisualPolicyBlockerDecision(visualPlan.policy)) {
17627
+ const captureStatus = visualPlan.policy.status === "failed" ? "failed" : "off";
17628
+ return {
17629
+ captureStatus,
17630
+ ...captureStatus === "failed" ? { captureFailure: visualPlan.policy.message } : {},
17631
+ capture: { visual: visualPolicyMetadata }
17632
+ };
16910
17633
  }
16911
17634
  if (!captureReference) {
17635
+ const visualFailureMetadata = visualPolicyMetadata ?? (workflowInput.visualEvidence === "required" && visualPlan.policy.status === "allowed" ? buildMissingRequiredVisualEvidence(INSPIREDESIGN_CAPTURE_UNAVAILABLE_FAILURE, visualPlan) : void 0);
16912
17636
  return {
16913
17637
  captureStatus: "failed",
16914
17638
  captureFailure: INSPIREDESIGN_CAPTURE_UNAVAILABLE_FAILURE,
16915
- capture: buildUnavailableInspiredesignCaptureEvidence()
17639
+ capture: mergeCaptureVisualEvidence(
17640
+ buildUnavailableInspiredesignCaptureEvidence(),
17641
+ visualFailureMetadata
17642
+ )
16916
17643
  };
16917
17644
  }
16918
17645
  try {
16919
- const capture = normalizeInspiredesignCaptureEvidence(await captureReference(url, {
17646
+ const rawCapture = await captureReference(url, {
16920
17647
  timeoutMs,
16921
17648
  useCookies: workflowInput.useCookies,
16922
17649
  challengeAutomationMode: workflowInput.challengeAutomationMode,
16923
- cookiePolicyOverride: workflowInput.cookiePolicyOverride
16924
- }));
17650
+ cookiePolicyOverride: workflowInput.cookiePolicyOverride,
17651
+ visualEvidence: visualPlan.policy.status === "allowed" ? workflowInput.visualEvidence : "off",
17652
+ visualEvidencePath: visualPlan.policy.status === "allowed" ? visualPlan.tempPath : void 0
17653
+ });
17654
+ const capture = normalizeInspiredesignCaptureEvidence(rawCapture);
17655
+ const runtimeVisual = rawCapture?.visual;
17656
+ const trustedRuntimeVisual = trustRuntimeVisualEvidence(runtimeVisual, visualPlan);
17657
+ const captureWithRuntimeVisual = trustedRuntimeVisual ? mergeCaptureVisualEvidence(capture, trustedRuntimeVisual) : capture;
17658
+ const captureWithVisualPolicy = trustedRuntimeVisual ? captureWithRuntimeVisual : mergeCaptureVisualEvidence(captureWithRuntimeVisual, visualPolicyMetadata);
17659
+ const requiredVisualFailure = getRequiredVisualEvidenceFailure(workflowInput, visualPlan, captureWithVisualPolicy);
17660
+ const captureWithRequiredVisual = requiredVisualFailure ? addRequiredVisualEvidenceFailure(captureWithVisualPolicy, visualPlan, requiredVisualFailure) : captureWithVisualPolicy;
16925
17661
  if (!hasInspiredesignCaptureArtifacts(capture)) {
16926
17662
  return {
16927
17663
  captureStatus: "failed",
16928
17664
  captureFailure: "Deep capture did not return usable snapshot, DOM, or clone evidence.",
16929
- ...capture ? { capture } : {}
17665
+ ...captureWithRequiredVisual ? { capture: captureWithRequiredVisual } : {}
17666
+ };
17667
+ }
17668
+ if (requiredVisualFailure) {
17669
+ return {
17670
+ captureStatus: "failed",
17671
+ captureFailure: requiredVisualFailure,
17672
+ ...captureWithRequiredVisual ? { capture: captureWithRequiredVisual } : {}
16930
17673
  };
16931
17674
  }
16932
17675
  return {
16933
17676
  captureStatus: "captured",
16934
- ...capture ? { capture } : {}
17677
+ ...captureWithRequiredVisual ? { capture: captureWithRequiredVisual } : {}
16935
17678
  };
16936
17679
  } catch (error) {
16937
17680
  const captureFailure = error instanceof Error && error.message.trim() ? error.message : "Deep capture failed.";
17681
+ const visualFailureMetadata = visualPolicyMetadata ?? (workflowInput.visualEvidence === "required" && visualPlan.policy.status === "allowed" ? buildMissingRequiredVisualEvidence(captureFailure, visualPlan) : void 0);
16938
17682
  return {
16939
17683
  captureStatus: "failed",
16940
17684
  captureFailure,
16941
- capture: buildFailedInspiredesignCaptureEvidence(captureFailure)
17685
+ capture: mergeCaptureVisualEvidence(
17686
+ buildFailedInspiredesignCaptureEvidence(captureFailure),
17687
+ visualFailureMetadata
17688
+ )
16942
17689
  };
16943
17690
  }
16944
17691
  };
@@ -16983,7 +17730,11 @@ var toInspiredesignIssueFailure = (record, hint) => {
16983
17730
  };
16984
17731
  var normalizeInspiredesignFetchResult = (result) => {
16985
17732
  if (result.records.length === 0) {
16986
- return result;
17733
+ const synthesizedFailures = failureFromInspiredesignFetchError(result);
17734
+ return synthesizedFailures.length > 0 ? {
17735
+ ...result,
17736
+ failures: synthesizedFailures
17737
+ } : result;
16987
17738
  }
16988
17739
  const usableRecords = [];
16989
17740
  const unusableRecords = [];
@@ -17043,12 +17794,14 @@ var summarizeInspiredesignRecoveredFetches = (references) => references.filter(i
17043
17794
  }));
17044
17795
  var buildInspiredesignReference = (url, result, capture) => {
17045
17796
  const primary = getInspiredesignPrimaryRecord(result, url);
17046
- const normalizedCapture = normalizeInspiredesignCaptureEvidence(capture.capture);
17797
+ const baseCapture = normalizeInspiredesignCaptureEvidence(capture.capture);
17798
+ const runtimeVisual = capture.capture?.visual;
17799
+ const normalizedCapture = runtimeVisual?.tempPath ? mergeCaptureVisualEvidence(baseCapture, runtimeVisual) : baseCapture;
17047
17800
  const title = normalizePlainText(primary?.title) || titleFromInspiredesignCapture(normalizedCapture);
17048
17801
  const excerpt = excerptFromInspiredesignRecord(primary) ?? excerptFromInspiredesignCapture(normalizedCapture);
17049
17802
  const fetchStatus = result.records.length > 0 ? "captured" : "failed";
17050
17803
  return {
17051
- id: createHash7("sha256").update(url).digest("hex").slice(0, 12),
17804
+ id: getInspiredesignReferenceId(url),
17052
17805
  url,
17053
17806
  ...title ? { title } : {},
17054
17807
  ...excerpt ? { excerpt } : {},
@@ -17059,6 +17812,102 @@ var buildInspiredesignReference = (url, result, capture) => {
17059
17812
  ...normalizedCapture ? { capture: normalizedCapture } : {}
17060
17813
  };
17061
17814
  };
17815
+ var failReferenceForRequiredVisualEvidence = (reference, failure, visualEvidence, shouldFail = true) => {
17816
+ if (visualEvidence !== "required" || !shouldFail) return reference;
17817
+ return {
17818
+ ...reference,
17819
+ captureStatus: "failed",
17820
+ captureFailure: reference.captureFailure ?? failure
17821
+ };
17822
+ };
17823
+ var isPolicySkippedVisualEvidence = (visual) => visual.status === "skipped" && visual.warnings.some((warning) => warning.startsWith("policy:"));
17824
+ var finalizeInspiredesignReferenceVisual = async (reference, visualEvidence) => {
17825
+ const visual = reference.capture?.visual;
17826
+ if (!visual) {
17827
+ return { reference };
17828
+ }
17829
+ const runtimeVisual = visual;
17830
+ if (visual.status !== "captured" || !runtimeVisual.tempPath) {
17831
+ const persisted = persistInspiredesignVisualEvidence(visual);
17832
+ const referenceWithPersistedVisual = {
17833
+ ...reference,
17834
+ capture: mergeCaptureVisualEvidence(reference.capture, persisted)
17835
+ };
17836
+ return {
17837
+ reference: failReferenceForRequiredVisualEvidence(
17838
+ referenceWithPersistedVisual,
17839
+ persisted.failure ?? REQUIRED_VISUAL_EVIDENCE_MISSING_FAILURE,
17840
+ visualEvidence,
17841
+ !isPolicySkippedVisualEvidence(persisted)
17842
+ )
17843
+ };
17844
+ }
17845
+ const artifactPath = buildVisualEvidenceArtifactPath(reference.id, visual.kind);
17846
+ try {
17847
+ const buffer = await readFile(runtimeVisual.tempPath);
17848
+ if (buffer.byteLength === 0) {
17849
+ throw new Error("Visual evidence screenshot file was empty.");
17850
+ }
17851
+ const persisted = persistInspiredesignVisualEvidence(visual, {
17852
+ artifactPath,
17853
+ sha256: hashVisualEvidenceBuffer(buffer),
17854
+ bytes: buffer.byteLength
17855
+ });
17856
+ return {
17857
+ reference: {
17858
+ ...reference,
17859
+ capture: mergeCaptureVisualEvidence(reference.capture, persisted)
17860
+ },
17861
+ file: {
17862
+ path: artifactPath,
17863
+ content: buffer
17864
+ }
17865
+ };
17866
+ } catch (error) {
17867
+ const errorMessage = error instanceof Error ? error.message.trim() : "";
17868
+ const failure = errorMessage === "Visual evidence screenshot file was empty." ? errorMessage : "Visual evidence screenshot file was unavailable.";
17869
+ const persisted = persistInspiredesignVisualEvidence({
17870
+ ...visual,
17871
+ status: "failed",
17872
+ warnings: [...readRuntimeVisualWarnings(runtimeVisual), "finalize_failed"],
17873
+ failure
17874
+ });
17875
+ const referenceWithPersistedVisual = {
17876
+ ...reference,
17877
+ capture: mergeCaptureVisualEvidence(reference.capture, persisted)
17878
+ };
17879
+ return {
17880
+ reference: failReferenceForRequiredVisualEvidence(referenceWithPersistedVisual, failure, visualEvidence)
17881
+ };
17882
+ }
17883
+ };
17884
+ var finalizeInspiredesignVisualArtifacts = async (references, visualEvidence) => {
17885
+ const finalized = await Promise.all(
17886
+ references.map((reference) => finalizeInspiredesignReferenceVisual(reference, visualEvidence))
17887
+ );
17888
+ return {
17889
+ references: finalized.map((entry) => entry.reference),
17890
+ files: finalized.map((entry) => entry.file).filter((file) => Boolean(file))
17891
+ };
17892
+ };
17893
+ var buildInspiredesignVisualCapturePlan = (url, workflowInput, result, visualEvidenceTempDir) => {
17894
+ const referenceId = getInspiredesignReferenceId(url);
17895
+ const policy = decideInspiredesignVisualCapturePolicy({
17896
+ visualEvidence: workflowInput.visualEvidence,
17897
+ failures: result.failures,
17898
+ topLevelError: result.error,
17899
+ cookiePolicy: workflowInput.cookiePolicyOverride,
17900
+ hasUsableRecords: result.records.length > 0
17901
+ });
17902
+ if (policy.status !== "allowed" || !visualEvidenceTempDir) {
17903
+ return { policy, referenceId };
17904
+ }
17905
+ return {
17906
+ policy,
17907
+ referenceId,
17908
+ tempPath: join3(visualEvidenceTempDir, `${referenceId}-viewport.png`)
17909
+ };
17910
+ };
17062
17911
  var summarizeInspiredesignCaptureConstraint = (references) => {
17063
17912
  const failedReferences = references.filter((reference) => reference.captureStatus === "failed");
17064
17913
  if (failedReferences.length === 0) {
@@ -17084,14 +17933,26 @@ var summarizeInspiredesignCaptureConstraint = (references) => {
17084
17933
  var summarizeInspiredesignFetchConstraint = (references) => {
17085
17934
  return references.find((reference) => reference.fetchStatus === "failed" && !isInspiredesignFetchRecovered(reference) && typeof reference.fetchFailure === "string" && reference.fetchFailure.trim().length > 0)?.fetchFailure;
17086
17935
  };
17087
- var buildInspiredesignMeta = (runtime, workflowInput, references, failures, followthrough) => {
17936
+ var hasSurvivingInspiredesignReference = (references) => references.some((reference) => reference.fetchStatus === "captured" || reference.captureStatus === "captured");
17937
+ var selectInspiredesignPrimaryConstraintFailures = (failures, references, discovery) => {
17938
+ if (!hasSurvivingInspiredesignReference(references)) return failures;
17939
+ if (discovery.failures.length === 0) return failures;
17940
+ return failures.slice(discovery.failures.length);
17941
+ };
17942
+ var buildInspiredesignMeta = (runtime, workflowInput, references, failures, followthrough, discovery) => {
17088
17943
  const failedCaptures = references.filter((reference) => reference.captureStatus === "failed");
17089
17944
  const captureAttemptReport = summarizeInspiredesignCaptureAttempts(references);
17090
17945
  const recoveredFetches = summarizeInspiredesignRecoveredFetches(references);
17946
+ const hasSurvivingReference = hasSurvivingInspiredesignReference(references);
17947
+ const primaryConstraintFailures = selectInspiredesignPrimaryConstraintFailures(failures, references, discovery);
17091
17948
  let reasonCodeDistribution = summarizeReasonCodeDistribution(failures);
17092
17949
  let meta = withCamelCasePrimaryConstraintMeta(withReasonCodeDistributionMeta({
17093
17950
  selection: {
17094
17951
  urls: workflowInput.urls,
17952
+ ...workflowInput.query ? { query: workflowInput.query } : {},
17953
+ ...workflowInput.providers.length > 0 ? { providers: workflowInput.providers } : {},
17954
+ ...workflowInput.referenceLimit !== void 0 ? { max_references: workflowInput.referenceLimit } : {},
17955
+ ...workflowInput.visualEvidence !== "off" ? { visual_evidence: workflowInput.visualEvidence } : {},
17095
17956
  capture_mode: workflowInput.captureMode,
17096
17957
  ...workflowInput.browserMode ? { requested_browser_mode: workflowInput.browserMode } : {},
17097
17958
  include_prototype_guidance: Boolean(workflowInput.includePrototypeGuidance)
@@ -17109,7 +17970,7 @@ var buildInspiredesignMeta = (runtime, workflowInput, references, failures, foll
17109
17970
  ...captureAttemptReport ? { capture_attempts: captureAttemptReport.counts } : {}
17110
17971
  },
17111
17972
  alerts: buildWorkflowAlerts(runtime, failures)
17112
- }, reasonCodeDistribution), failures);
17973
+ }, reasonCodeDistribution), primaryConstraintFailures);
17113
17974
  if (!meta.primaryConstraint) {
17114
17975
  const fetchConstraint = summarizeInspiredesignFetchConstraint(references);
17115
17976
  if (fetchConstraint) {
@@ -17119,6 +17980,16 @@ var buildInspiredesignMeta = (runtime, workflowInput, references, failures, foll
17119
17980
  };
17120
17981
  }
17121
17982
  }
17983
+ if (!hasSurvivingReference && !meta.primaryConstraint && !meta.primaryConstraintSummary) {
17984
+ const discoveryConstraint = summarizeInspiredesignDiscoveryConstraint(discovery);
17985
+ if (discoveryConstraint) {
17986
+ meta = withPrimaryConstraintSummaryOverride(
17987
+ meta,
17988
+ discoveryConstraint.summary,
17989
+ discoveryConstraint.guidance
17990
+ );
17991
+ }
17992
+ }
17122
17993
  if (!meta.primaryConstraint && !meta.primaryConstraintSummary) {
17123
17994
  const captureConstraint = summarizeInspiredesignCaptureConstraint(references);
17124
17995
  if (captureConstraint) {
@@ -17143,9 +18014,26 @@ var buildInspiredesignMeta = (runtime, workflowInput, references, failures, foll
17143
18014
  } : {},
17144
18015
  recommendedSkills: followthrough.recommendedSkills,
17145
18016
  deepCaptureRecommendation: followthrough.deepCaptureRecommendation,
18017
+ discovery,
17146
18018
  contractScope: followthrough.contractScope
17147
18019
  };
17148
18020
  };
18021
+ var buildInspiredesignDiscoveryGuidance = (discovery) => ({
18022
+ reason: discovery.failure ?? "Reference discovery did not produce usable design references.",
18023
+ recommendedNextCommands: [
18024
+ "Rerun inspiredesign harvest with explicit --url references from usable inspiration pages.",
18025
+ "Retry provider discovery in a lane with provider search support and any required authenticated browser session."
18026
+ ]
18027
+ });
18028
+ var summarizeInspiredesignDiscoveryConstraint = (discovery) => {
18029
+ if (!discovery.requested || discovery.acceptedUrls.length > 0) return void 0;
18030
+ const queryDetail = discovery.query ? ` for query "${discovery.query}"` : "";
18031
+ const summary = discovery.failure ?? `Reference discovery returned no usable references${queryDetail}.`;
18032
+ return {
18033
+ summary,
18034
+ guidance: buildInspiredesignDiscoveryGuidance(discovery)
18035
+ };
18036
+ };
17149
18037
  var inferBrandFromContent = (content, productUrl) => {
17150
18038
  const normalized = normalizePlainText(content);
17151
18039
  if (!normalized) return void 0;
@@ -17617,6 +18505,15 @@ var resolveShoppingSourceForUrl = (url) => {
17617
18505
  return "web";
17618
18506
  }
17619
18507
  };
18508
+ var getRequiredProductVideoExecutionStep = (steps, stepId) => {
18509
+ const step = steps.find(
18510
+ (candidate) => candidate.id === stepId
18511
+ );
18512
+ if (!step) {
18513
+ throw new Error(`Product-video workflow plan is missing required step ${stepId}.`);
18514
+ }
18515
+ return step;
18516
+ };
17620
18517
  var RESEARCH_REJECTED_CANDIDATE_LIMIT = 25;
17621
18518
  var isResearchPrivacyPreferenceShell = (content) => {
17622
18519
  const matchIndex = content.slice(0, 400).search(RESEARCH_PRIVACY_PREFERENCE_SHELL_RE);
@@ -17909,8 +18806,9 @@ var runResearchWorkflow = async (runtime, input) => {
17909
18806
  challengeOrchestration
17910
18807
  });
17911
18808
  const responseMeta = withFollowthroughMeta(meta, handoff);
18809
+ const renderMode = workflowInput.mode ?? "compact";
17912
18810
  const rendered = renderResearch({
17913
- mode: workflowInput.mode,
18811
+ mode: renderMode,
17914
18812
  topic: plan.compiled.topic,
17915
18813
  records: ranked,
17916
18814
  meta: responseMeta
@@ -17921,7 +18819,7 @@ var runResearchWorkflow = async (runtime, input) => {
17921
18819
  ttlHours: workflowInput.ttlHours,
17922
18820
  files: rendered.files
17923
18821
  });
17924
- if (workflowInput.mode === "path") {
18822
+ if (renderMode === "path") {
17925
18823
  return {
17926
18824
  ...rendered.response,
17927
18825
  ...handoff,
@@ -18135,85 +19033,134 @@ var runShoppingWorkflow = async (runtime, input) => {
18135
19033
  var runInspiredesignWorkflow = async (runtime, input, options = {}) => {
18136
19034
  const { envelope, workflowInput: rawWorkflowInput } = buildInspiredesignEnvelope(input);
18137
19035
  const artifactRoot = resolveWorkflowArtifactRoot(rawWorkflowInput.outputDir);
18138
- const workflowInput = { ...rawWorkflowInput, outputDir: artifactRoot };
19036
+ let workflowInput = { ...rawWorkflowInput, outputDir: artifactRoot };
18139
19037
  const remainingTimeoutMs = createRemainingTimeoutResolver(workflowInput.timeoutMs);
18140
- let trace = appendWorkflowTrace(envelope.trace ?? [], "compile", "compile_started", {
18141
- kind: "inspiredesign"
18142
- });
18143
- trace = appendWorkflowTrace(trace, "compile", "compile_completed", {
18144
- kind: "inspiredesign",
18145
- urlCount: workflowInput.urls.length,
18146
- captureMode: workflowInput.captureMode
18147
- });
18148
- const references = [];
18149
- const failures = [];
18150
- for (const [index, url] of workflowInput.urls.entries()) {
18151
- const stepTrace = appendWorkflowTrace(trace, "execute", "reference_started", {
18152
- stepIndex: index,
18153
- url
19038
+ const visualEvidenceTempDir = workflowInput.visualEvidence !== "off" ? await mkdtemp2(join3(tmpdir2(), "inspiredesign-visual-")) : void 0;
19039
+ try {
19040
+ const discovery = await discoverInspiredesignReferences(
19041
+ runtime,
19042
+ workflowInput,
19043
+ envelope,
19044
+ workflowInput.query ? remainingTimeoutMs() : void 0
19045
+ );
19046
+ workflowInput = {
19047
+ ...workflowInput,
19048
+ urls: mergeInspiredesignReferenceUrls(
19049
+ workflowInput.urls,
19050
+ discovery.acceptedUrls,
19051
+ workflowInput.referenceLimit ?? workflowInput.urls.length + discovery.acceptedUrls.length
19052
+ ),
19053
+ captureMode: resolveInspiredesignCaptureMode(workflowInput.captureMode, [
19054
+ ...workflowInput.urls,
19055
+ ...discovery.acceptedUrls
19056
+ ])
19057
+ };
19058
+ let trace = appendWorkflowTrace(envelope.trace ?? [], "compile", "compile_started", {
19059
+ kind: "inspiredesign"
18154
19060
  });
18155
- const fetchTimeoutMs = remainingTimeoutMs();
18156
- const fetchResult = await runtime.fetch(
18157
- { url },
18158
- buildInspiredesignFetchOptions(
19061
+ trace = appendWorkflowTrace(trace, "compile", "compile_completed", {
19062
+ kind: "inspiredesign",
19063
+ urlCount: workflowInput.urls.length,
19064
+ captureMode: workflowInput.captureMode
19065
+ });
19066
+ const references = [];
19067
+ const failures = [...discovery.failures];
19068
+ for (const [index, url] of workflowInput.urls.entries()) {
19069
+ const stepTrace = appendWorkflowTrace(trace, "execute", "reference_started", {
19070
+ stepIndex: index,
19071
+ url
19072
+ });
19073
+ const fetchTimeoutMs = remainingTimeoutMs();
19074
+ const fetchResult = await runtime.fetch(
19075
+ { url },
19076
+ buildInspiredesignFetchOptions(
19077
+ workflowInput,
19078
+ buildInspiredesignStepEnvelope(workflowInput, stepTrace, index, url),
19079
+ fetchTimeoutMs
19080
+ )
19081
+ );
19082
+ const result = normalizeInspiredesignFetchResult(fetchResult);
19083
+ observeWorkflowSignals(runtime, result);
19084
+ const captureTimeoutMs = remainingTimeoutMs();
19085
+ const visualPlan = buildInspiredesignVisualCapturePlan(
19086
+ url,
18159
19087
  workflowInput,
18160
- buildInspiredesignStepEnvelope(workflowInput, stepTrace, index, url),
18161
- fetchTimeoutMs
18162
- )
18163
- );
18164
- const result = normalizeInspiredesignFetchResult(fetchResult);
18165
- observeWorkflowSignals(runtime, result);
18166
- const captureTimeoutMs = remainingTimeoutMs();
18167
- const capture = await captureInspiredesignReference(
18168
- url,
18169
- workflowInput.captureMode,
19088
+ result,
19089
+ visualEvidenceTempDir
19090
+ );
19091
+ const capture = await captureInspiredesignReference(
19092
+ url,
19093
+ workflowInput.captureMode,
19094
+ workflowInput,
19095
+ options.captureReference,
19096
+ visualPlan,
19097
+ captureTimeoutMs
19098
+ );
19099
+ const reference = buildInspiredesignReference(url, result, capture);
19100
+ references.push(reference);
19101
+ if (reference.fetchStatus === "failed" && !isInspiredesignFetchRecovered(reference)) {
19102
+ failures.push(...result.failures);
19103
+ }
19104
+ trace = appendWorkflowTrace(stepTrace, "execute", "reference_completed", {
19105
+ stepIndex: index,
19106
+ url,
19107
+ fetchStatus: result.records.length > 0 ? "captured" : "failed",
19108
+ captureStatus: capture.captureStatus
19109
+ });
19110
+ }
19111
+ const visualCollation = await finalizeInspiredesignVisualArtifacts(references, workflowInput.visualEvidence);
19112
+ const packet = buildInspiredesignPacket({
19113
+ brief: workflowInput.brief,
19114
+ briefExpansion: workflowInput.briefExpansion,
19115
+ urls: workflowInput.urls,
19116
+ references: visualCollation.references,
19117
+ includePrototypeGuidance: workflowInput.includePrototypeGuidance
19118
+ });
19119
+ const meta = buildInspiredesignMeta(
19120
+ runtime,
18170
19121
  workflowInput,
18171
- options.captureReference,
18172
- captureTimeoutMs
19122
+ visualCollation.references,
19123
+ failures,
19124
+ packet.followthrough,
19125
+ discovery
18173
19126
  );
18174
- const reference = buildInspiredesignReference(url, result, capture);
18175
- references.push(reference);
18176
- if (reference.fetchStatus === "failed" && !isInspiredesignFetchRecovered(reference)) {
18177
- failures.push(...result.failures);
18178
- }
18179
- trace = appendWorkflowTrace(stepTrace, "execute", "reference_completed", {
18180
- stepIndex: index,
18181
- url,
18182
- fetchStatus: result.records.length > 0 ? "captured" : "failed",
18183
- captureStatus: capture.captureStatus
19127
+ const rendered = renderInspiredesign({
19128
+ mode: workflowInput.mode,
19129
+ brief: workflowInput.brief,
19130
+ advancedBriefMarkdown: packet.advancedBriefMarkdown,
19131
+ urls: workflowInput.urls,
19132
+ designContract: packet.designContract,
19133
+ canvasPlanRequest: packet.canvasPlanRequest,
19134
+ designAgentHandoff: packet.followthrough,
19135
+ generationPlan: packet.generationPlan,
19136
+ implementationPlan: packet.implementationPlan,
19137
+ designMarkdown: packet.designMarkdown,
19138
+ implementationPlanMarkdown: packet.implementationPlanMarkdown,
19139
+ prototypeGuidanceMarkdown: packet.prototypeGuidanceMarkdown,
19140
+ evidence: packet.evidence,
19141
+ visualEvidence: packet.visualEvidence,
19142
+ screenshotIndex: packet.screenshotIndex,
19143
+ rankedReferences: packet.rankedReferences,
19144
+ referencePatternBoard: packet.generationPlan.referencePatternBoard,
19145
+ metaPromptMarkdown: packet.metaPromptMarkdown,
19146
+ meta
18184
19147
  });
18185
- }
18186
- const packet = buildInspiredesignPacket({
18187
- brief: workflowInput.brief,
18188
- briefExpansion: workflowInput.briefExpansion,
18189
- urls: workflowInput.urls,
18190
- references,
18191
- includePrototypeGuidance: workflowInput.includePrototypeGuidance
18192
- });
18193
- const meta = buildInspiredesignMeta(runtime, workflowInput, references, failures, packet.followthrough);
18194
- const rendered = renderInspiredesign({
18195
- mode: workflowInput.mode,
18196
- brief: workflowInput.brief,
18197
- advancedBriefMarkdown: packet.advancedBriefMarkdown,
18198
- urls: workflowInput.urls,
18199
- designContract: packet.designContract,
18200
- canvasPlanRequest: packet.canvasPlanRequest,
18201
- designAgentHandoff: packet.followthrough,
18202
- generationPlan: packet.generationPlan,
18203
- implementationPlan: packet.implementationPlan,
18204
- designMarkdown: packet.designMarkdown,
18205
- implementationPlanMarkdown: packet.implementationPlanMarkdown,
18206
- prototypeGuidanceMarkdown: packet.prototypeGuidanceMarkdown,
18207
- evidence: packet.evidence,
18208
- meta
18209
- });
18210
- const bundle = await createArtifactBundle({
18211
- namespace: "inspiredesign",
18212
- outputDir: artifactRoot,
18213
- ttlHours: workflowInput.ttlHours,
18214
- files: rendered.files
18215
- });
18216
- if (workflowInput.mode === "path") {
19148
+ const bundle = await createArtifactBundle({
19149
+ namespace: "inspiredesign",
19150
+ outputDir: artifactRoot,
19151
+ ttlHours: workflowInput.ttlHours,
19152
+ files: [...rendered.files, ...visualCollation.files]
19153
+ });
19154
+ if (workflowInput.mode === "path") {
19155
+ return {
19156
+ ...rendered.response,
19157
+ artifact_path: bundle.basePath,
19158
+ meta: {
19159
+ ...meta,
19160
+ artifact_manifest: bundle.manifest
19161
+ }
19162
+ };
19163
+ }
18217
19164
  return {
18218
19165
  ...rendered.response,
18219
19166
  artifact_path: bundle.basePath,
@@ -18222,15 +19169,11 @@ var runInspiredesignWorkflow = async (runtime, input, options = {}) => {
18222
19169
  artifact_manifest: bundle.manifest
18223
19170
  }
18224
19171
  };
18225
- }
18226
- return {
18227
- ...rendered.response,
18228
- artifact_path: bundle.basePath,
18229
- meta: {
18230
- ...meta,
18231
- artifact_manifest: bundle.manifest
19172
+ } finally {
19173
+ if (visualEvidenceTempDir) {
19174
+ await rm2(visualEvidenceTempDir, { recursive: true, force: true }).catch(() => void 0);
18232
19175
  }
18233
- };
19176
+ }
18234
19177
  };
18235
19178
  var runProductVideoWorkflow = async (runtime, input, options = {}) => {
18236
19179
  const envelope = isWorkflowResumeEnvelope(input) ? input : buildWorkflowResumeEnvelope("product_video", input);
@@ -18294,15 +19237,7 @@ var runProductVideoWorkflow = async (runtime, input, options = {}) => {
18294
19237
  ...updates,
18295
19238
  completed_step_ids: checkpointState2.completed_step_ids.includes(stepId) ? checkpointState2.completed_step_ids : [...checkpointState2.completed_step_ids, stepId]
18296
19239
  });
18297
- const getRequiredProductVideoStep = (stepId) => {
18298
- const step = plan.plan.steps.find(
18299
- (candidate) => candidate.id === stepId
18300
- );
18301
- if (!step) {
18302
- throw new Error(`Product-video workflow plan is missing required step ${stepId}.`);
18303
- }
18304
- return step;
18305
- };
19240
+ const getRequiredProductVideoStep = (stepId) => getRequiredProductVideoExecutionStep(plan.plan.steps, stepId);
18306
19241
  let checkpointState = {
18307
19242
  ...plan.checkpointState,
18308
19243
  completed_step_ids: [...plan.checkpointState.completed_step_ids]
@@ -18732,10 +19667,10 @@ var Semaphore = class {
18732
19667
  this.active += 1;
18733
19668
  return;
18734
19669
  }
18735
- await new Promise((resolve) => {
19670
+ await new Promise((resolve2) => {
18736
19671
  this.queue.push(() => {
18737
19672
  this.active += 1;
18738
- resolve();
19673
+ resolve2();
18739
19674
  });
18740
19675
  });
18741
19676
  }
@@ -21085,4 +22020,4 @@ export {
21085
22020
  createProviderRuntime,
21086
22021
  createDefaultRuntime
21087
22022
  };
21088
- //# sourceMappingURL=chunk-4BEJVZRK.js.map
22023
+ //# sourceMappingURL=chunk-RO3SMXF3.js.map