opendevbrowser 0.0.33 → 0.0.34

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 (216) hide show
  1. package/README.md +1 -1
  2. package/dist/{accessibility-snapshot-JSPFVWZ6.js → accessibility-snapshot-VCBXK47S.js} +7 -7
  3. package/dist/{active-window-2OB2MSCR.js → active-window-7EUN36LZ.js} +7 -7
  4. package/dist/{annotate-VDZBZBKZ.js → annotate-VLBK7YB6.js} +6 -6
  5. package/dist/{attr-7XIO4MCH.js → attr-JNANQKM6.js} +6 -6
  6. package/dist/browser/browser-manager.d.ts.map +1 -1
  7. package/dist/browser/manager-types.d.ts +3 -0
  8. package/dist/browser/manager-types.d.ts.map +1 -1
  9. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  10. package/dist/browser/screencast-recorder.d.ts +1 -0
  11. package/dist/browser/screencast-recorder.d.ts.map +1 -1
  12. package/dist/{canvas-N4PAA274.js → canvas-V5LO4JVL.js} +6 -6
  13. package/dist/{capture-desktop-T5YO3EBI.js → capture-desktop-FKVDWTVG.js} +7 -7
  14. package/dist/{capture-window-UKEUBWKH.js → capture-window-QVPM2DN2.js} +7 -7
  15. package/dist/{check-PQB6KKMN.js → check-V3CWZ56S.js} +6 -6
  16. package/dist/{checked-RNZIMCU6.js → checked-Q27Q6YZN.js} +6 -6
  17. package/dist/{chunk-FBKPDILE.js → chunk-5FDXH4CS.js} +315 -37
  18. package/dist/chunk-5FDXH4CS.js.map +1 -0
  19. package/dist/{chunk-J3KYGJRQ.js → chunk-G6NQ7WYD.js} +2 -2
  20. package/dist/{chunk-27W46IKI.js → chunk-GC2FWISX.js} +22 -11
  21. package/dist/chunk-GC2FWISX.js.map +1 -0
  22. package/dist/{chunk-MJF67OTH.js → chunk-NX2XYJP5.js} +2 -2
  23. package/dist/{chunk-FDBUB7BM.js → chunk-OJAUKABV.js} +2 -2
  24. package/dist/{chunk-HMRANSDX.js → chunk-QXJDJDSZ.js} +34 -13
  25. package/dist/chunk-QXJDJDSZ.js.map +1 -0
  26. package/dist/{chunk-SKFB5ICF.js → chunk-TI5I6UWY.js} +8 -3
  27. package/dist/chunk-TI5I6UWY.js.map +1 -0
  28. package/dist/{chunk-W6YPVNDX.js → chunk-VTGG5ZU2.js} +2 -2
  29. package/dist/{chunk-YRRRUGSQ.js → chunk-VX47SJZM.js} +2 -2
  30. package/dist/{chunk-JROW6ZNN.js → chunk-VY47VKXU.js} +3 -3
  31. package/dist/{chunk-NURQB55J.js → chunk-WY72GYAH.js} +2 -2
  32. package/dist/{chunk-EOX6U6Q4.js → chunk-XRDCSHKZ.js} +158 -110
  33. package/dist/chunk-XRDCSHKZ.js.map +1 -0
  34. package/dist/{chunk-52ZIOWVU.js → chunk-Z3HIX2SE.js} +3 -3
  35. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  36. package/dist/cli/daemon-commands.d.ts.map +1 -1
  37. package/dist/cli/index.js +75 -75
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/cli/utils/parse.d.ts +1 -0
  40. package/dist/cli/utils/parse.d.ts.map +1 -1
  41. package/dist/{click-U7ZFKSB4.js → click-EQDRSLR3.js} +6 -6
  42. package/dist/{clone-component-SWYAORTU.js → clone-component-SISUXTJS.js} +5 -5
  43. package/dist/{clone-page-WJ6UJOJG.js → clone-page-MLDPCBOY.js} +5 -5
  44. package/dist/{close-VKIGIKVT.js → close-2LQMJVOA.js} +5 -5
  45. package/dist/{close-NAVIHZ2T.js → close-7J7EV237.js} +5 -5
  46. package/dist/{connect-XVG2MOZL.js → connect-JFRSIW5M.js} +6 -6
  47. package/dist/{console-poll-XI5BZPL7.js → console-poll-NSVVUNEC.js} +6 -6
  48. package/dist/{cookie-import-QELKE7TK.js → cookie-import-B7IQTGTN.js} +5 -5
  49. package/dist/{cookie-list-QDA6KWIY.js → cookie-list-YHG7JCZZ.js} +5 -5
  50. package/dist/{daemon-CA4UIIZQ.js → daemon-ENU4FOV4.js} +4 -4
  51. package/dist/daemon-fingerprint.json +1 -1
  52. package/dist/{debug-trace-snapshot-AT4GAO57.js → debug-trace-snapshot-KLGU2AWY.js} +6 -6
  53. package/dist/{dialog-O3V2IBFH.js → dialog-MUVQIERS.js} +6 -6
  54. package/dist/{disconnect-NAX5TPTG.js → disconnect-KELQJ45J.js} +5 -5
  55. package/dist/{enabled-VT4FJXDX.js → enabled-SF6UU5HG.js} +6 -6
  56. package/dist/{goto-GBJG5NC4.js → goto-AZQWXYPG.js} +6 -6
  57. package/dist/guidance/context.d.ts.map +1 -1
  58. package/dist/guidance/recipes/generic.d.ts.map +1 -1
  59. package/dist/guidance/recipes/pinterest.d.ts.map +1 -1
  60. package/dist/guidance/recipes/site-recipe-validation.d.ts +27 -0
  61. package/dist/guidance/recipes/site-recipe-validation.d.ts.map +1 -0
  62. package/dist/guidance/types.d.ts +1 -0
  63. package/dist/guidance/types.d.ts.map +1 -1
  64. package/dist/{help-SUI4H77K.js → help-B44IBHXL.js} +3 -3
  65. package/dist/{hover-476ZNQZE.js → hover-MQRAKKVU.js} +6 -6
  66. package/dist/{html-5C4TXOV3.js → html-PLRTU2WS.js} +6 -6
  67. package/dist/index.js +49 -14
  68. package/dist/index.js.map +1 -1
  69. package/dist/{inspector-73ARPCIV.js → inspector-IY4GBIT6.js} +7 -7
  70. package/dist/{inspector-audit-QT6QY7KS.js → inspector-audit-7MQCRJHD.js} +9 -9
  71. package/dist/{inspector-plan-JRNSGN2Z.js → inspector-plan-ZAUDHBET.js} +7 -7
  72. package/dist/inspiredesign/contract.d.ts +1 -0
  73. package/dist/inspiredesign/contract.d.ts.map +1 -1
  74. package/dist/inspiredesign/reference-pattern-board.d.ts +5 -0
  75. package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
  76. package/dist/{inspiredesign-IPVZDLSQ.js → inspiredesign-VHPEO3UK.js} +80 -27
  77. package/dist/inspiredesign-VHPEO3UK.js.map +1 -0
  78. package/dist/{launch-B35YDRQC.js → launch-OCTWPTV5.js} +6 -6
  79. package/dist/{list-YETWKTKY.js → list-HUSYADUS.js} +5 -5
  80. package/dist/{list-JV55JVGB.js → list-JWKAMAUA.js} +5 -5
  81. package/dist/{macro-resolve-DQK4B3W3.js → macro-resolve-WOXMPZDQ.js} +6 -6
  82. package/dist/{network-poll-4GWHCJXI.js → network-poll-WHB62OEF.js} +6 -6
  83. package/dist/{new-XDCQPIEG.js → new-IKZBYBNK.js} +5 -5
  84. package/dist/{open-GIM3ZCSV.js → open-UA2VI6ZP.js} +5 -5
  85. package/dist/opendevbrowser.js +49 -14
  86. package/dist/opendevbrowser.js.map +1 -1
  87. package/dist/{perf-26VBXDPI.js → perf-DICS3VKH.js} +6 -6
  88. package/dist/{pointer-down-O3VSNAXW.js → pointer-down-2XPRZFJC.js} +7 -7
  89. package/dist/{pointer-drag-WQ5QGE6J.js → pointer-drag-7NY4BOLH.js} +7 -7
  90. package/dist/{pointer-move-4N4D7JY2.js → pointer-move-FWEXMH37.js} +7 -7
  91. package/dist/{pointer-up-CQC4NPDX.js → pointer-up-VU2OHK5D.js} +7 -7
  92. package/dist/{press-XGJD45CU.js → press-W7IZ3FCX.js} +6 -6
  93. package/dist/{product-video-HD4ZOUI7.js → product-video-XCZ6CHR5.js} +7 -7
  94. package/dist/providers/browser-output-artifacts.d.ts +13 -0
  95. package/dist/providers/browser-output-artifacts.d.ts.map +1 -0
  96. package/dist/providers/renderer.d.ts.map +1 -1
  97. package/dist/providers/workflows.d.ts.map +1 -1
  98. package/dist/{providers-KKNPJSQK.js → providers-XCNSU3T6.js} +2 -2
  99. package/dist/public-surface/generated-manifest.d.ts +3 -3
  100. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  101. package/dist/public-surface/source.d.ts.map +1 -1
  102. package/dist/{research-VUWWEQ4R.js → research-AYCKHOWK.js} +7 -7
  103. package/dist/{review-LZ3TA7U7.js → review-PP2UNSMJ.js} +7 -7
  104. package/dist/{review-desktop-LAO7U7T3.js → review-desktop-3JOJFUEJ.js} +7 -7
  105. package/dist/{rpc-HKNIVFGC.js → rpc-7EPTJQQ6.js} +6 -6
  106. package/dist/{run-SHCF53FO.js → run-P6UJS3D4.js} +4 -4
  107. package/dist/{screencast-start-JHMQZVWJ.js → screencast-start-ZZYNH2HT.js} +6 -6
  108. package/dist/{screencast-stop-RWQTWWQS.js → screencast-stop-Y6ADFOFA.js} +6 -6
  109. package/dist/{screenshot-QHFYO6PB.js → screenshot-CJB7PMAF.js} +6 -6
  110. package/dist/{scroll-L3FTMAV4.js → scroll-BP5MA4ZT.js} +6 -6
  111. package/dist/{scroll-into-view-JVDHX4WU.js → scroll-into-view-O3RDWLM2.js} +6 -6
  112. package/dist/{select-X4BO7GTB.js → select-QLCNRI36.js} +6 -6
  113. package/dist/{serve-JIMIBCNO.js → serve-OO2MQWGL.js} +5 -5
  114. package/dist/{shopping-EGSDP2GL.js → shopping-UYHCYPAH.js} +7 -7
  115. package/dist/{snapshot-QGJ7RDNV.js → snapshot-SXYZ3CMC.js} +6 -6
  116. package/dist/{status-CKGPNYIH.js → status-AL2AHVA5.js} +5 -5
  117. package/dist/{status-LEBY2X7N.js → status-QQW7REK4.js} +7 -7
  118. package/dist/{status-capabilities-6QTWNGKM.js → status-capabilities-AVHJYQQQ.js} +7 -7
  119. package/dist/{text-VUZU7D3L.js → text-B6Z47EOA.js} +6 -6
  120. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  121. package/dist/tools/product_video_run.d.ts.map +1 -1
  122. package/dist/{type-N5SURP74.js → type-LR3F3SQY.js} +6 -6
  123. package/dist/{uncheck-JFMK3SSY.js → uncheck-5PJEHR7J.js} +6 -6
  124. package/dist/{upload-KFUYLL7M.js → upload-HQ3QN2OW.js} +6 -6
  125. package/dist/{use-CNMPP2ED.js → use-KFZLMRUH.js} +5 -5
  126. package/dist/{value-J335MPZE.js → value-TKUFUK5I.js} +6 -6
  127. package/dist/{visible-YQZWWPBZ.js → visible-P5Z2N2QR.js} +6 -6
  128. package/dist/{wait-IC7YJJPJ.js → wait-BYSHJPSC.js} +6 -6
  129. package/dist/{windows-AGVQ3KX3.js → windows-6GTD25EU.js} +7 -7
  130. package/extension/manifest.json +1 -1
  131. package/package.json +1 -1
  132. package/dist/chunk-27W46IKI.js.map +0 -1
  133. package/dist/chunk-EOX6U6Q4.js.map +0 -1
  134. package/dist/chunk-FBKPDILE.js.map +0 -1
  135. package/dist/chunk-HMRANSDX.js.map +0 -1
  136. package/dist/chunk-SKFB5ICF.js.map +0 -1
  137. package/dist/inspiredesign-IPVZDLSQ.js.map +0 -1
  138. /package/dist/{accessibility-snapshot-JSPFVWZ6.js.map → accessibility-snapshot-VCBXK47S.js.map} +0 -0
  139. /package/dist/{active-window-2OB2MSCR.js.map → active-window-7EUN36LZ.js.map} +0 -0
  140. /package/dist/{annotate-VDZBZBKZ.js.map → annotate-VLBK7YB6.js.map} +0 -0
  141. /package/dist/{attr-7XIO4MCH.js.map → attr-JNANQKM6.js.map} +0 -0
  142. /package/dist/{canvas-N4PAA274.js.map → canvas-V5LO4JVL.js.map} +0 -0
  143. /package/dist/{capture-desktop-T5YO3EBI.js.map → capture-desktop-FKVDWTVG.js.map} +0 -0
  144. /package/dist/{capture-window-UKEUBWKH.js.map → capture-window-QVPM2DN2.js.map} +0 -0
  145. /package/dist/{check-PQB6KKMN.js.map → check-V3CWZ56S.js.map} +0 -0
  146. /package/dist/{checked-RNZIMCU6.js.map → checked-Q27Q6YZN.js.map} +0 -0
  147. /package/dist/{chunk-J3KYGJRQ.js.map → chunk-G6NQ7WYD.js.map} +0 -0
  148. /package/dist/{chunk-MJF67OTH.js.map → chunk-NX2XYJP5.js.map} +0 -0
  149. /package/dist/{chunk-FDBUB7BM.js.map → chunk-OJAUKABV.js.map} +0 -0
  150. /package/dist/{chunk-W6YPVNDX.js.map → chunk-VTGG5ZU2.js.map} +0 -0
  151. /package/dist/{chunk-YRRRUGSQ.js.map → chunk-VX47SJZM.js.map} +0 -0
  152. /package/dist/{chunk-JROW6ZNN.js.map → chunk-VY47VKXU.js.map} +0 -0
  153. /package/dist/{chunk-NURQB55J.js.map → chunk-WY72GYAH.js.map} +0 -0
  154. /package/dist/{chunk-52ZIOWVU.js.map → chunk-Z3HIX2SE.js.map} +0 -0
  155. /package/dist/{click-U7ZFKSB4.js.map → click-EQDRSLR3.js.map} +0 -0
  156. /package/dist/{clone-component-SWYAORTU.js.map → clone-component-SISUXTJS.js.map} +0 -0
  157. /package/dist/{clone-page-WJ6UJOJG.js.map → clone-page-MLDPCBOY.js.map} +0 -0
  158. /package/dist/{close-VKIGIKVT.js.map → close-2LQMJVOA.js.map} +0 -0
  159. /package/dist/{close-NAVIHZ2T.js.map → close-7J7EV237.js.map} +0 -0
  160. /package/dist/{connect-XVG2MOZL.js.map → connect-JFRSIW5M.js.map} +0 -0
  161. /package/dist/{console-poll-XI5BZPL7.js.map → console-poll-NSVVUNEC.js.map} +0 -0
  162. /package/dist/{cookie-import-QELKE7TK.js.map → cookie-import-B7IQTGTN.js.map} +0 -0
  163. /package/dist/{cookie-list-QDA6KWIY.js.map → cookie-list-YHG7JCZZ.js.map} +0 -0
  164. /package/dist/{daemon-CA4UIIZQ.js.map → daemon-ENU4FOV4.js.map} +0 -0
  165. /package/dist/{debug-trace-snapshot-AT4GAO57.js.map → debug-trace-snapshot-KLGU2AWY.js.map} +0 -0
  166. /package/dist/{dialog-O3V2IBFH.js.map → dialog-MUVQIERS.js.map} +0 -0
  167. /package/dist/{disconnect-NAX5TPTG.js.map → disconnect-KELQJ45J.js.map} +0 -0
  168. /package/dist/{enabled-VT4FJXDX.js.map → enabled-SF6UU5HG.js.map} +0 -0
  169. /package/dist/{goto-GBJG5NC4.js.map → goto-AZQWXYPG.js.map} +0 -0
  170. /package/dist/{help-SUI4H77K.js.map → help-B44IBHXL.js.map} +0 -0
  171. /package/dist/{hover-476ZNQZE.js.map → hover-MQRAKKVU.js.map} +0 -0
  172. /package/dist/{html-5C4TXOV3.js.map → html-PLRTU2WS.js.map} +0 -0
  173. /package/dist/{inspector-73ARPCIV.js.map → inspector-IY4GBIT6.js.map} +0 -0
  174. /package/dist/{inspector-audit-QT6QY7KS.js.map → inspector-audit-7MQCRJHD.js.map} +0 -0
  175. /package/dist/{inspector-plan-JRNSGN2Z.js.map → inspector-plan-ZAUDHBET.js.map} +0 -0
  176. /package/dist/{launch-B35YDRQC.js.map → launch-OCTWPTV5.js.map} +0 -0
  177. /package/dist/{list-YETWKTKY.js.map → list-HUSYADUS.js.map} +0 -0
  178. /package/dist/{list-JV55JVGB.js.map → list-JWKAMAUA.js.map} +0 -0
  179. /package/dist/{macro-resolve-DQK4B3W3.js.map → macro-resolve-WOXMPZDQ.js.map} +0 -0
  180. /package/dist/{network-poll-4GWHCJXI.js.map → network-poll-WHB62OEF.js.map} +0 -0
  181. /package/dist/{new-XDCQPIEG.js.map → new-IKZBYBNK.js.map} +0 -0
  182. /package/dist/{open-GIM3ZCSV.js.map → open-UA2VI6ZP.js.map} +0 -0
  183. /package/dist/{perf-26VBXDPI.js.map → perf-DICS3VKH.js.map} +0 -0
  184. /package/dist/{pointer-down-O3VSNAXW.js.map → pointer-down-2XPRZFJC.js.map} +0 -0
  185. /package/dist/{pointer-drag-WQ5QGE6J.js.map → pointer-drag-7NY4BOLH.js.map} +0 -0
  186. /package/dist/{pointer-move-4N4D7JY2.js.map → pointer-move-FWEXMH37.js.map} +0 -0
  187. /package/dist/{pointer-up-CQC4NPDX.js.map → pointer-up-VU2OHK5D.js.map} +0 -0
  188. /package/dist/{press-XGJD45CU.js.map → press-W7IZ3FCX.js.map} +0 -0
  189. /package/dist/{product-video-HD4ZOUI7.js.map → product-video-XCZ6CHR5.js.map} +0 -0
  190. /package/dist/{providers-KKNPJSQK.js.map → providers-XCNSU3T6.js.map} +0 -0
  191. /package/dist/{research-VUWWEQ4R.js.map → research-AYCKHOWK.js.map} +0 -0
  192. /package/dist/{review-LZ3TA7U7.js.map → review-PP2UNSMJ.js.map} +0 -0
  193. /package/dist/{review-desktop-LAO7U7T3.js.map → review-desktop-3JOJFUEJ.js.map} +0 -0
  194. /package/dist/{rpc-HKNIVFGC.js.map → rpc-7EPTJQQ6.js.map} +0 -0
  195. /package/dist/{run-SHCF53FO.js.map → run-P6UJS3D4.js.map} +0 -0
  196. /package/dist/{screencast-start-JHMQZVWJ.js.map → screencast-start-ZZYNH2HT.js.map} +0 -0
  197. /package/dist/{screencast-stop-RWQTWWQS.js.map → screencast-stop-Y6ADFOFA.js.map} +0 -0
  198. /package/dist/{screenshot-QHFYO6PB.js.map → screenshot-CJB7PMAF.js.map} +0 -0
  199. /package/dist/{scroll-L3FTMAV4.js.map → scroll-BP5MA4ZT.js.map} +0 -0
  200. /package/dist/{scroll-into-view-JVDHX4WU.js.map → scroll-into-view-O3RDWLM2.js.map} +0 -0
  201. /package/dist/{select-X4BO7GTB.js.map → select-QLCNRI36.js.map} +0 -0
  202. /package/dist/{serve-JIMIBCNO.js.map → serve-OO2MQWGL.js.map} +0 -0
  203. /package/dist/{shopping-EGSDP2GL.js.map → shopping-UYHCYPAH.js.map} +0 -0
  204. /package/dist/{snapshot-QGJ7RDNV.js.map → snapshot-SXYZ3CMC.js.map} +0 -0
  205. /package/dist/{status-CKGPNYIH.js.map → status-AL2AHVA5.js.map} +0 -0
  206. /package/dist/{status-LEBY2X7N.js.map → status-QQW7REK4.js.map} +0 -0
  207. /package/dist/{status-capabilities-6QTWNGKM.js.map → status-capabilities-AVHJYQQQ.js.map} +0 -0
  208. /package/dist/{text-VUZU7D3L.js.map → text-B6Z47EOA.js.map} +0 -0
  209. /package/dist/{type-N5SURP74.js.map → type-LR3F3SQY.js.map} +0 -0
  210. /package/dist/{uncheck-JFMK3SSY.js.map → uncheck-5PJEHR7J.js.map} +0 -0
  211. /package/dist/{upload-KFUYLL7M.js.map → upload-HQ3QN2OW.js.map} +0 -0
  212. /package/dist/{use-CNMPP2ED.js.map → use-KFZLMRUH.js.map} +0 -0
  213. /package/dist/{value-J335MPZE.js.map → value-TKUFUK5I.js.map} +0 -0
  214. /package/dist/{visible-YQZWWPBZ.js.map → visible-P5Z2N2QR.js.map} +0 -0
  215. /package/dist/{wait-IC7YJJPJ.js.map → wait-BYSHJPSC.js.map} +0 -0
  216. /package/dist/{windows-AGVQ3KX3.js.map → windows-6GTD25EU.js.map} +0 -0
@@ -11245,10 +11245,15 @@ var pinterestGuidance = {
11245
11245
  var PINTEREST_PIN_ID_PATTERN = /^\d+$/;
11246
11246
  var RESERVED_PINTEREST_BOARD_PATHS = /* @__PURE__ */ new Set([
11247
11247
  "about",
11248
+ "ads",
11248
11249
  "board",
11249
11250
  "business",
11251
+ "careers",
11252
+ "contact",
11250
11253
  "create",
11254
+ "developers",
11251
11255
  "explore",
11256
+ "help",
11252
11257
  "ideas",
11253
11258
  "login",
11254
11259
  "messages",
@@ -11257,11 +11262,13 @@ var RESERVED_PINTEREST_BOARD_PATHS = /* @__PURE__ */ new Set([
11257
11262
  "search",
11258
11263
  "settings",
11259
11264
  "shopping",
11265
+ "terms",
11260
11266
  "today"
11261
11267
  ]);
11262
11268
  var RESERVED_PINTEREST_IDEA_PATHS = /* @__PURE__ */ new Set(["create", "edit", "search"]);
11263
11269
  var RESERVED_PINTEREST_PROFILE_TABS = /* @__PURE__ */ new Set([
11264
11270
  "activity",
11271
+ "boards",
11265
11272
  "comments",
11266
11273
  "created",
11267
11274
  "followers",
@@ -11870,13 +11877,25 @@ var rejectionReasonForReference = (reference) => {
11870
11877
  }
11871
11878
  return "Reference evidence was diagnostic, empty, or too weak for creative synthesis.";
11872
11879
  };
11873
- var buildRejectedReferences = (references) => references.filter((reference) => !hasInspiredesignUsableReferenceEvidence(reference)).map((reference) => ({
11874
- id: reference.id,
11875
- url: reference.url,
11876
- reason: rejectionReasonForReference(reference),
11877
- fetchStatus: reference.fetchStatus,
11878
- captureStatus: reference.captureStatus
11879
- }));
11880
+ var hasCapturedEvidence = (reference) => reference.captureStatus === "captured" || reference.capture?.visual?.status === "captured";
11881
+ var capturedButRejectedReason = (diagnosticReasons) => diagnosticReasons.length > 0 ? `Captured browser evidence was rejected because it only exposed diagnostic signals: ${diagnosticReasons.join(", ")}.` : "Captured browser evidence was rejected because it did not contain usable creative reference evidence.";
11882
+ var buildRejectedReferences = (references) => references.filter((reference) => !hasInspiredesignUsableReferenceEvidence(reference)).map((reference) => {
11883
+ const diagnosticReasons = referenceDiagnosticReasons(reference);
11884
+ const captured = hasCapturedEvidence(reference);
11885
+ return {
11886
+ id: reference.id,
11887
+ url: reference.url,
11888
+ reason: rejectionReasonForReference(reference),
11889
+ fetchStatus: reference.fetchStatus,
11890
+ captureStatus: reference.captureStatus,
11891
+ ...captured ? { captured: true } : {},
11892
+ ...diagnosticReasons.length > 0 ? { diagnosticReasons } : {},
11893
+ ...captured ? {
11894
+ capturedButRejectedReason: capturedButRejectedReason(diagnosticReasons),
11895
+ evidenceGap: "Design-facing artifacts require creative layout evidence; diagnostic browser chrome is kept only as rejection metadata."
11896
+ } : {}
11897
+ };
11898
+ });
11880
11899
  var buildQualitySummary = (references, rankedEntries, rejectedReferences) => {
11881
11900
  const diagnosticOnlyReasons = [...new Set(references.flatMap(referenceDiagnosticReasons))];
11882
11901
  const rankedIds = new Set(rankedEntries.map((entry) => entry.id));
@@ -11900,6 +11919,40 @@ var buildQualitySummary = (references, rankedEntries, rejectedReferences) => {
11900
11919
  var summarizeInspiredesignReferenceQuality = (board) => ({ ...board.qualitySummary });
11901
11920
  var isInspiredesignReadyReference = (reference) => reference.intentMatched && reference.score >= MIN_READY_REFERENCE_SCORE && reference.confidence >= MIN_READY_REFERENCE_CONFIDENCE;
11902
11921
  var isInspiredesignDesignReference = (reference) => !isPinterestOwnedReferenceUrl(reference.url) || isPinterestVisualReferenceUrl(reference.url) && isInspiredesignReadyReference(reference);
11922
+ var buildNotReadyRejectedReference = (reference) => {
11923
+ const captured = reference.capturedVia.length > 0;
11924
+ return {
11925
+ id: reference.id,
11926
+ url: reference.url,
11927
+ reason: reference.intentMatched ? "Reference evidence did not meet the design-ready ranking threshold." : "Reference evidence did not match the requested design intent.",
11928
+ fetchStatus: reference.capturedVia.includes("fetch") ? "captured" : "skipped",
11929
+ captureStatus: reference.capturedVia.some((method) => method !== "fetch") ? "captured" : "off",
11930
+ ...captured ? {
11931
+ captured: true,
11932
+ capturedButRejectedReason: "Captured reference evidence did not satisfy design-ready ranking gates.",
11933
+ evidenceGap: "Design-facing artifacts require design-ready creative evidence; non-ready captures are kept only as rejection metadata."
11934
+ } : {}
11935
+ };
11936
+ };
11937
+ var mergeRejectedReferences = (rejectedReferences) => {
11938
+ const seen = /* @__PURE__ */ new Set();
11939
+ return rejectedReferences.filter((reference) => {
11940
+ if (seen.has(reference.id)) return false;
11941
+ seen.add(reference.id);
11942
+ return true;
11943
+ });
11944
+ };
11945
+ var buildInspiredesignRankedArtifactPatternBoard = (designBoard, sourceBoard) => {
11946
+ const designReferenceIds = new Set(designBoard.references.map((reference) => reference.id));
11947
+ const notReadyReferences = sourceBoard.references.filter((reference) => !designReferenceIds.has(reference.id)).map(buildNotReadyRejectedReference);
11948
+ return {
11949
+ ...designBoard,
11950
+ rejectedReferences: mergeRejectedReferences([
11951
+ ...sourceBoard.rejectedReferences,
11952
+ ...notReadyReferences
11953
+ ])
11954
+ };
11955
+ };
11903
11956
  var buildInspiredesignDesignReferencePatternBoard = (board, designVectors) => {
11904
11957
  const references = board.references.filter(isInspiredesignDesignReference);
11905
11958
  const notReadyCount = board.references.length - references.length;
@@ -13906,6 +13959,7 @@ var buildInspiredesignPacket = (input) => {
13906
13959
  visualEvidence,
13907
13960
  screenshotIndex,
13908
13961
  rankedReferences: designReferencePatternBoard.references,
13962
+ referencePatternBoard,
13909
13963
  metaPromptMarkdown,
13910
13964
  evidence: buildEvidencePayload({
13911
13965
  brief,
@@ -14498,6 +14552,7 @@ var DEFAULT_INSPIREDESIGN_BRIEF = "Digital photography studio landing page";
14498
14552
  var DEFAULT_INSPIREDESIGN_QUERY = "cinematic photography studio landing page inspiration";
14499
14553
  var DEFAULT_RESEARCH_TOPIC = "browser automation provider recovery";
14500
14554
  var DEFAULT_PROVIDER = "provider diagnostics";
14555
+ var DEFAULT_PINTEREST_REFERENCE_URL = "https://www.pinterest.com/pin/27654985208435505/";
14501
14556
  var isCanvasGenerationPlanIssue = (value) => {
14502
14557
  if (!value || typeof value !== "object" || Array.isArray(value)) return false;
14503
14558
  const record = value;
@@ -14522,12 +14577,28 @@ var inspiredesignCookieFlags = (context) => {
14522
14577
  if (selectedProviderIsPinterest(context)) return " --use-cookies --cookie-policy required";
14523
14578
  return context.useCookies === true ? " --use-cookies" : "";
14524
14579
  };
14580
+ var pinterestRecoveryUrls = (context) => {
14581
+ if (!isPinterestScopedRecovery(context)) return [];
14582
+ const urls = context.referenceUrls ?? [];
14583
+ const canonicalUrls = urls.map(normalizePinterestReferenceUrl).filter((url) => url !== null);
14584
+ return [...new Set(canonicalUrls)];
14585
+ };
14586
+ var inspiredesignRecoveryExampleUrls = (context) => selectedProviderIsPinterest(context) ? [DEFAULT_PINTEREST_REFERENCE_URL] : ["https://example.com/usable-reference"];
14525
14587
  var inspiredesignHarvestCommand = (context) => {
14526
14588
  const brief = typeof context.details?.brief === "string" ? context.details.brief : DEFAULT_INSPIREDESIGN_BRIEF;
14527
14589
  const query = context.query ?? DEFAULT_INSPIREDESIGN_QUERY;
14528
14590
  const provider = selectedInspiredesignProvider(context);
14529
14591
  const browserMode = inspiredesignBrowserMode(context);
14530
14592
  const cookieFlags = inspiredesignCookieFlags(context);
14593
+ const urls = pinterestRecoveryUrls(context);
14594
+ if (urls.length > 0) {
14595
+ const urlFlags = urls.map((url) => `--url ${quote(url)}`).join(" ");
14596
+ return {
14597
+ id: "inspiredesign-harvest-url-recovery",
14598
+ label: "Recover Inspired Design harvest with explicit Pinterest URLs",
14599
+ command: `npx opendevbrowser inspiredesign harvest --brief ${quote(brief)} --provider social/pinterest ${urlFlags} --max-references 5 --visual-evidence required --browser-mode extension --use-cookies --cookie-policy required --challenge-automation-mode browser_with_helper --mode json --output-format json`
14600
+ };
14601
+ }
14531
14602
  return {
14532
14603
  id: "inspiredesign-harvest-rerun",
14533
14604
  label: "Rerun Inspired Design harvest with explicit evidence settings",
@@ -14848,7 +14919,7 @@ var buildEvidenceRecoveryGuidance = (context, readiness, reasonCode, actionLabel
14848
14919
  label: "Use explicit high-quality visual references when provider discovery is blocked",
14849
14920
  params: {
14850
14921
  brief: typeof context.details?.brief === "string" ? context.details.brief : DEFAULT_INSPIREDESIGN_BRIEF,
14851
- urls: ["https://example.com/usable-reference"],
14922
+ urls: inspiredesignRecoveryExampleUrls(context),
14852
14923
  visualEvidence: "required",
14853
14924
  browserMode: inspiredesignBrowserMode(context),
14854
14925
  ...selectedProviderIsPinterest(context) ? { useCookies: true, cookiePolicy: "required" } : {}
@@ -15538,22 +15609,75 @@ var researchFailureMessage = (content) => boundedInlineText({
15538
15609
  target: "meta.json"
15539
15610
  });
15540
15611
  var CANVAS_CONTINUATION_BLOCKED_COMMAND = "Unavailable until nextStepGuidance.readiness is ready.";
15612
+ var CANVAS_PLAN_OMITTED_GUIDANCE = "Canvas plan request omitted until nextStepGuidance.readiness is ready.";
15541
15613
  var canContinueInspiredesignInCanvas = (guidance) => guidance?.readiness === "ready";
15542
- var blockInspiredesignCanvasArtifactGuide = (handoff, recoverySummary) => ({
15543
- ...handoff.artifactGuide,
15544
- [INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest]: {
15545
- ...handoff.artifactGuide[INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest],
15546
- purpose: "Diagnostic Canvas request preview only until nextStepGuidance.readiness is ready.",
15547
- howToUse: [
15548
- recoverySummary,
15549
- "Do not submit this payload to Canvas until usable ranked references pass the readiness checks."
15550
- ],
15551
- mustNot: [
15552
- "Do not submit canvas.plan.set while nextStepGuidance.readiness is not ready.",
15553
- "Do not treat rejected or not-ready references as Canvas design direction."
15554
- ]
15555
- }
15614
+ var scrubCanvasPlanReference = (value) => value.includes(INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest) ? CANVAS_PLAN_OMITTED_GUIDANCE : value;
15615
+ var scrubGuideEntryCanvasReferences = (entry) => ({
15616
+ ...entry,
15617
+ expectedContents: entry.expectedContents.map(scrubCanvasPlanReference),
15618
+ howToUse: entry.howToUse.map(scrubCanvasPlanReference),
15619
+ mustNot: entry.mustNot.map(scrubCanvasPlanReference)
15556
15620
  });
15621
+ var scrubArtifactGuideCanvasReferences = (guide) => {
15622
+ const scrubbed = {};
15623
+ for (const [key, entry] of Object.entries(guide)) {
15624
+ if (entry) {
15625
+ scrubbed[key] = scrubGuideEntryCanvasReferences(entry);
15626
+ }
15627
+ }
15628
+ return scrubbed;
15629
+ };
15630
+ var scrubContractSectionGuideCanvasReferences = (guide) => {
15631
+ const scrubbed = {};
15632
+ for (const [key, entry] of Object.entries(guide)) {
15633
+ scrubbed[key] = scrubGuideEntryCanvasReferences(entry);
15634
+ }
15635
+ return scrubbed;
15636
+ };
15637
+ var blockInspiredesignCanvasArtifactGuide = (handoff) => {
15638
+ const artifactGuide = { ...handoff.artifactGuide };
15639
+ delete artifactGuide[INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest];
15640
+ return artifactGuide;
15641
+ };
15642
+ var blockInspiredesignNotReadyArtifacts = (handoff) => {
15643
+ const referenceSynthesis = plainObject(handoff.implementationContext.referenceSynthesis);
15644
+ const blockedArtifacts = /* @__PURE__ */ new Set([
15645
+ INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest,
15646
+ INSPIREDESIGN_HANDOFF_FILES.prototypeGuidance
15647
+ ]);
15648
+ const requiredArtifacts = isStringArray(referenceSynthesis.requiredArtifacts) ? referenceSynthesis.requiredArtifacts.filter((artifact) => !blockedArtifacts.has(artifact)) : [];
15649
+ const artifactGuide = { ...handoff.artifactGuide };
15650
+ delete artifactGuide[INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest];
15651
+ delete artifactGuide[INSPIREDESIGN_HANDOFF_FILES.prototypeGuidance];
15652
+ return {
15653
+ ...handoff,
15654
+ artifactGuide: scrubArtifactGuideCanvasReferences(artifactGuide),
15655
+ contractSectionGuide: scrubContractSectionGuideCanvasReferences(handoff.contractSectionGuide),
15656
+ implementationContext: {
15657
+ ...handoff.implementationContext,
15658
+ referenceSynthesis: {
15659
+ ...referenceSynthesis,
15660
+ requiredArtifacts
15661
+ }
15662
+ }
15663
+ };
15664
+ };
15665
+ var blockPrototypeGuidanceInDesignMarkdown = (markdown, prototypeGuidanceMarkdown) => {
15666
+ const withoutCanvasDeliverable = markdown.replace(
15667
+ /\n- Diagnostic `canvasPlanRequest` preview; do not submit to Canvas until next-step guidance is ready/g,
15668
+ `
15669
+ - ${CANVAS_PLAN_OMITTED_GUIDANCE}`
15670
+ );
15671
+ const withoutPrototypeDeliverable = withoutCanvasDeliverable.replace(
15672
+ /\n- Prototype guidance Markdown for the first HTML pass/g,
15673
+ ""
15674
+ );
15675
+ if (!prototypeGuidanceMarkdown) return withoutPrototypeDeliverable;
15676
+ return withoutPrototypeDeliverable.replace(
15677
+ prototypeGuidanceMarkdown,
15678
+ "# 6. Optional Prototype Plan\n\n- Prototype guidance omitted because next-step guidance is not ready."
15679
+ );
15680
+ };
15557
15681
  var buildMissingInspiredesignGuidanceHandoff = () => {
15558
15682
  const summary = "Canvas continuation unavailable until nextStepGuidance.readiness is ready.";
15559
15683
  return {
@@ -16010,6 +16134,7 @@ var renderInspiredesign = (args) => {
16010
16134
  const followthroughSummary = prependPrimaryConstraint(args.designAgentHandoff.summary, args.meta);
16011
16135
  const canContinueInCanvas = canContinueInspiredesignInCanvas(args.nextStepGuidance);
16012
16136
  const prototypeGuidanceMarkdown = canContinueInCanvas ? args.prototypeGuidanceMarkdown : null;
16137
+ const designMarkdown = canContinueInCanvas ? args.designMarkdown : blockPrototypeGuidanceInDesignMarkdown(args.designMarkdown, args.prototypeGuidanceMarkdown);
16013
16138
  const commandExamples2 = {
16014
16139
  ...args.designAgentHandoff.commandExamples,
16015
16140
  continueInCanvas: canContinueInCanvas ? args.designAgentHandoff.commandExamples.continueInCanvas : CANVAS_CONTINUATION_BLOCKED_COMMAND
@@ -16022,8 +16147,8 @@ var renderInspiredesign = (args) => {
16022
16147
  ...args.nextStepGuidance ? { nextStepGuidance: args.nextStepGuidance } : {}
16023
16148
  });
16024
16149
  const handoff = args.nextStepGuidance ? renderedWorkflowHandoff : buildMissingInspiredesignGuidanceHandoff();
16025
- const blockedCanvasArtifactGuide = canContinueInCanvas ? args.designAgentHandoff.artifactGuide : blockInspiredesignCanvasArtifactGuide(args.designAgentHandoff, handoff.suggestedNextAction);
16026
- const renderedDesignAgentHandoff = {
16150
+ const blockedCanvasArtifactGuide = canContinueInCanvas ? args.designAgentHandoff.artifactGuide : blockInspiredesignCanvasArtifactGuide(args.designAgentHandoff);
16151
+ const renderedDesignAgentHandoffBase = {
16027
16152
  ...args.designAgentHandoff,
16028
16153
  ...handoff,
16029
16154
  summary: handoff.followthroughSummary,
@@ -16031,17 +16156,18 @@ var renderInspiredesign = (args) => {
16031
16156
  artifactGuide: blockedCanvasArtifactGuide,
16032
16157
  commandExamples: commandExamples2
16033
16158
  };
16159
+ const renderedDesignAgentHandoff = canContinueInCanvas ? renderedDesignAgentHandoffBase : blockInspiredesignNotReadyArtifacts(renderedDesignAgentHandoffBase);
16034
16160
  const contextPayload = {
16035
16161
  brief: args.brief,
16036
16162
  advancedBriefMarkdown: args.advancedBriefMarkdown,
16037
16163
  urls: args.urls,
16038
16164
  designContract: args.designContract,
16039
- canvasPlanRequest: args.canvasPlanRequest,
16165
+ ...canContinueInCanvas ? { canvasPlanRequest: args.canvasPlanRequest } : {},
16040
16166
  designAgentHandoff: renderedDesignAgentHandoff,
16041
16167
  ...args.nextStepGuidance ? { nextStepGuidance: args.nextStepGuidance } : {},
16042
16168
  generationPlan: args.generationPlan,
16043
16169
  implementationPlan: args.implementationPlan,
16044
- designMarkdown: args.designMarkdown,
16170
+ designMarkdown,
16045
16171
  implementationPlanMarkdown: args.implementationPlanMarkdown,
16046
16172
  prototypeGuidanceMarkdown,
16047
16173
  evidence: args.evidence,
@@ -16052,10 +16178,9 @@ var renderInspiredesign = (args) => {
16052
16178
  meta: args.meta
16053
16179
  };
16054
16180
  const files = [
16055
- { path: INSPIREDESIGN_HANDOFF_FILES.designMarkdown, content: args.designMarkdown },
16181
+ { path: INSPIREDESIGN_HANDOFF_FILES.designMarkdown, content: designMarkdown },
16056
16182
  { path: INSPIREDESIGN_HANDOFF_FILES.advancedBrief, content: args.advancedBriefMarkdown },
16057
16183
  { path: INSPIREDESIGN_HANDOFF_FILES.designContract, content: args.designContract },
16058
- { path: INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest, content: args.canvasPlanRequest },
16059
16184
  {
16060
16185
  path: INSPIREDESIGN_HANDOFF_FILES.designAgentHandoff,
16061
16186
  content: renderedDesignAgentHandoff
@@ -16072,6 +16197,9 @@ var renderInspiredesign = (args) => {
16072
16197
  if (prototypeGuidanceMarkdown) {
16073
16198
  files.push({ path: INSPIREDESIGN_HANDOFF_FILES.prototypeGuidance, content: prototypeGuidanceMarkdown });
16074
16199
  }
16200
+ if (canContinueInCanvas) {
16201
+ files.push({ path: INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest, content: args.canvasPlanRequest });
16202
+ }
16075
16203
  const captureAttemptFields = {
16076
16204
  ...captureAttemptSummary ? { captureAttemptSummary } : {},
16077
16205
  ...captureAttemptReport ? { captureAttemptReport } : {}
@@ -16095,7 +16223,7 @@ var renderInspiredesign = (args) => {
16095
16223
  brief: args.brief,
16096
16224
  advancedBriefMarkdown: args.advancedBriefMarkdown,
16097
16225
  urls: args.urls,
16098
- canvasPlanRequest: args.canvasPlanRequest,
16226
+ ...canContinueInCanvas ? { canvasPlanRequest: args.canvasPlanRequest } : {},
16099
16227
  designAgentHandoff: renderedDesignAgentHandoff,
16100
16228
  ...args.nextStepGuidance ? { nextStepGuidance: args.nextStepGuidance } : {},
16101
16229
  designContract: args.designContract,
@@ -16118,7 +16246,7 @@ var renderInspiredesign = (args) => {
16118
16246
  return {
16119
16247
  response: {
16120
16248
  mode: args.mode,
16121
- markdown: args.designMarkdown,
16249
+ markdown: designMarkdown,
16122
16250
  implementationPlanMarkdown: args.implementationPlanMarkdown,
16123
16251
  prototypeGuidanceMarkdown,
16124
16252
  ...handoff,
@@ -16242,6 +16370,10 @@ var reasonCodeForInspiredesign = (source) => {
16242
16370
  if (hasWeakTopReference2(source)) return "weak_reference";
16243
16371
  return "design_ready";
16244
16372
  };
16373
+ var dedupeInspiredesignReferenceUrls = (source) => {
16374
+ const urls = [...source.urls ?? [], ...source.discovery.acceptedUrls].map((url) => url.trim()).filter((url) => url.length > 0);
16375
+ return [...new Set(urls)];
16376
+ };
16245
16377
  var resolveInspiredesignSiteRecipe = (source) => {
16246
16378
  const providerRecipe = source.requestedProviders.map((providerId) => resolveSiteRecipeForProvider(providerId)).find((recipe) => recipe !== void 0);
16247
16379
  if (providerRecipe) return providerRecipe.id;
@@ -16250,12 +16382,14 @@ var resolveInspiredesignSiteRecipe = (source) => {
16250
16382
  };
16251
16383
  var createInspiredesignGuidanceContext = (source) => {
16252
16384
  const siteRecipeId = resolveInspiredesignSiteRecipe(source);
16385
+ const referenceUrls = dedupeInspiredesignReferenceUrls(source);
16253
16386
  return {
16254
16387
  workflow: "inspiredesign",
16255
16388
  reasonCode: reasonCodeForInspiredesign(source),
16256
16389
  requestedProviders: source.requestedProviders,
16257
16390
  ...siteRecipeId ? { siteRecipeId } : {},
16258
16391
  ...source.query ? { query: source.query } : {},
16392
+ ...referenceUrls.length > 0 ? { referenceUrls } : {},
16259
16393
  ...source.browserMode ? { browserMode: source.browserMode } : {},
16260
16394
  ...source.cookiePolicy ? { cookiePolicy: source.cookiePolicy } : {},
16261
16395
  ...typeof source.useCookies === "boolean" ? { useCookies: source.useCookies } : {},
@@ -16282,6 +16416,110 @@ var createInspiredesignGuidanceContext = (source) => {
16282
16416
  };
16283
16417
  };
16284
16418
 
16419
+ // src/guidance/recipes/site-recipe-validation.ts
16420
+ var normalizeNonBlank = (values) => values.map((value) => value.trim()).filter((value) => value.length > 0);
16421
+ var incompatible = (message) => ({ ok: false, message });
16422
+ var supportsBrowserNativeRecovery = (recipe) => typeof recipe?.browserNativeDiscovery?.buildSearchUrl === "function";
16423
+ var isCanonicalRecipeReferenceUrl = (recipe, url) => {
16424
+ if (recipe.id === "social/pinterest") {
16425
+ return normalizePinterestReferenceUrl(url) !== null;
16426
+ }
16427
+ return true;
16428
+ };
16429
+ var isPinterestLikeHostname = (value) => {
16430
+ const hostname = value.toLowerCase();
16431
+ return [
16432
+ hostname === "pinterest.com",
16433
+ hostname.endsWith(".pinterest.com"),
16434
+ hostname.startsWith("pinterest."),
16435
+ hostname.includes(".pinterest.")
16436
+ ].some(Boolean);
16437
+ };
16438
+ var isPinterestLikeUrl = (value) => {
16439
+ try {
16440
+ return isPinterestLikeHostname(new URL(value).hostname);
16441
+ } catch {
16442
+ return false;
16443
+ }
16444
+ };
16445
+ var isNonCanonicalPinterestLikeUrl = (url) => (resolveSiteRecipeForUrl(url)?.id === "social/pinterest" || isPinterestLikeUrl(url)) && normalizePinterestReferenceUrl(url) === null;
16446
+ var requiresProviderUrlSiteRecipeCompatibility = ({
16447
+ providers,
16448
+ urls,
16449
+ query
16450
+ }) => {
16451
+ const providerIds = normalizeNonBlank(providers);
16452
+ if (providerIds.length === 0) return false;
16453
+ if (!query?.trim()) return true;
16454
+ return false;
16455
+ };
16456
+ var validateProviderScopedUrlCanonicality = ({
16457
+ providers,
16458
+ urls
16459
+ }) => {
16460
+ const providerHasPinterest = normalizeNonBlank(providers).some((providerId) => resolveSiteRecipeForProvider(providerId)?.id === "social/pinterest");
16461
+ if (!providerHasPinterest) return { ok: true };
16462
+ const nonCanonicalPinterestUrl = normalizeNonBlank(urls).find((url) => normalizePinterestReferenceUrl(url) === null);
16463
+ if (!nonCanonicalPinterestUrl) return { ok: true };
16464
+ return incompatible(
16465
+ `URL ${nonCanonicalPinterestUrl} is not a canonical social/pinterest reference URL for provider-scoped recovery.`
16466
+ );
16467
+ };
16468
+ var validateProviderUrlSiteRecipeCompatibility = ({
16469
+ providers,
16470
+ urls
16471
+ }) => {
16472
+ const providerIds = normalizeNonBlank(providers);
16473
+ const referenceUrls = normalizeNonBlank(urls);
16474
+ if (providerIds.length === 0) {
16475
+ return incompatible("Provider-scoped URL recovery requires at least one provider.");
16476
+ }
16477
+ if (referenceUrls.length === 0) {
16478
+ return incompatible("Provider-scoped URL recovery requires at least one URL.");
16479
+ }
16480
+ const providerRecipes = providerIds.map((providerId) => ({
16481
+ providerId,
16482
+ recipe: resolveSiteRecipeForProvider(providerId)
16483
+ }));
16484
+ const missingProviderRecipe = providerRecipes.find((entry) => entry.recipe === void 0);
16485
+ if (missingProviderRecipe) {
16486
+ return incompatible(`Provider ${missingProviderRecipe.providerId} does not support URL-only site recipe recovery.`);
16487
+ }
16488
+ const nonNativeProviderRecipe = providerRecipes.find((entry) => !supportsBrowserNativeRecovery(entry.recipe));
16489
+ if (nonNativeProviderRecipe) {
16490
+ return incompatible(`Provider ${nonNativeProviderRecipe.providerId} does not support browser-native URL-only site recipe recovery.`);
16491
+ }
16492
+ const urlRecipes = referenceUrls.map((url) => ({
16493
+ url,
16494
+ recipe: resolveSiteRecipeForUrl(url)
16495
+ }));
16496
+ const missingUrlRecipe = urlRecipes.find((entry) => entry.recipe === void 0);
16497
+ if (missingUrlRecipe) {
16498
+ return incompatible(`URL ${missingUrlRecipe.url} does not match a browser-native site recipe for provider-scoped recovery.`);
16499
+ }
16500
+ const nonNativeUrlRecipe = urlRecipes.find((entry) => !supportsBrowserNativeRecovery(entry.recipe));
16501
+ if (nonNativeUrlRecipe) {
16502
+ return incompatible(`URL ${nonNativeUrlRecipe.url} does not match a browser-native site recipe for provider-scoped recovery.`);
16503
+ }
16504
+ const recipeIds = /* @__PURE__ */ new Set([
16505
+ ...providerRecipes.map((entry) => entry.recipe?.id),
16506
+ ...urlRecipes.map((entry) => entry.recipe?.id)
16507
+ ]);
16508
+ if (recipeIds.size !== 1) {
16509
+ return incompatible("Provider-scoped URL recovery requires every provider and URL to resolve to the same site recipe.");
16510
+ }
16511
+ const recipeId = providerRecipes[0]?.recipe?.id;
16512
+ if (!recipeId) {
16513
+ return incompatible("Provider-scoped URL recovery could not resolve a site recipe.");
16514
+ }
16515
+ const recipe = providerRecipes[0]?.recipe;
16516
+ const nonReferenceUrl = recipe ? urlRecipes.find((entry) => !isCanonicalRecipeReferenceUrl(recipe, entry.url)) : void 0;
16517
+ if (nonReferenceUrl) {
16518
+ return incompatible(`URL ${nonReferenceUrl.url} is not a canonical ${recipeId} reference URL for provider-scoped recovery.`);
16519
+ }
16520
+ return { ok: true, recipeId };
16521
+ };
16522
+
16285
16523
  // src/inspiredesign/reference-discovery.ts
16286
16524
  var normalizeHttpUrl = (value) => {
16287
16525
  try {
@@ -19465,8 +19703,18 @@ var normalizeInspiredesignInput = (input) => {
19465
19703
  if (query && input.harvest !== true) {
19466
19704
  throw new Error("Inspiredesign workflow query is only supported when harvest is true.");
19467
19705
  }
19468
- if (providers.length > 0 && !query) {
19469
- throw new Error("Inspiredesign workflow providers require query.");
19706
+ const canonicality = validateProviderScopedUrlCanonicality({ providers, urls });
19707
+ if (!canonicality.ok) {
19708
+ throw new Error(`Inspiredesign workflow ${canonicality.message}`);
19709
+ }
19710
+ if (requiresProviderUrlSiteRecipeCompatibility({ providers, urls, query })) {
19711
+ if (input.harvest !== true) {
19712
+ throw new Error("Inspiredesign workflow providers require query unless harvest uses compatible URL recovery.");
19713
+ }
19714
+ const compatibility = validateProviderUrlSiteRecipeCompatibility({ providers, urls });
19715
+ if (!compatibility.ok) {
19716
+ throw new Error(`Inspiredesign workflow ${compatibility.message}`);
19717
+ }
19470
19718
  }
19471
19719
  if (input.harvest === true && !query && urls.length === 0) {
19472
19720
  throw new Error("Inspiredesign harvest requires query or URL references.");
@@ -19656,6 +19904,27 @@ var capMixedInspiredesignDiscovery = (siteDiscovery, standardDiscovery, maxRefer
19656
19904
  rejected: [...siteDiscovery.rejected, ...standardDiscovery.rejected]
19657
19905
  };
19658
19906
  };
19907
+ var filterStandardDiscoveryForSiteRecipe = (siteRecipe, discovery) => {
19908
+ if (siteRecipe.id !== "social/pinterest") return discovery;
19909
+ const accepted = [];
19910
+ const rejected = [...discovery.rejected];
19911
+ discovery.accepted.forEach((candidate) => {
19912
+ if (!isNonCanonicalPinterestLikeUrl(candidate.url)) {
19913
+ accepted.push(candidate);
19914
+ return;
19915
+ }
19916
+ rejected.push({
19917
+ status: "rejected",
19918
+ reason: "invalid_url",
19919
+ rawUrl: candidate.url,
19920
+ ...candidate.title ? { title: candidate.title } : {},
19921
+ source: candidate.source,
19922
+ provider: candidate.provider,
19923
+ rank: candidate.rank
19924
+ });
19925
+ });
19926
+ return { accepted, rejected };
19927
+ };
19659
19928
  var discoverInspiredesignReferences = async (runtime, workflowInput, envelope, timeoutMs) => {
19660
19929
  if (!workflowInput.query) {
19661
19930
  return emptyInspiredesignDiscoveryDiagnostics(workflowInput, typeof runtime.search === "function");
@@ -19700,7 +19969,10 @@ var discoverInspiredesignReferences = async (runtime, workflowInput, envelope, t
19700
19969
  }
19701
19970
  );
19702
19971
  const searchFailures = searchResult2.failures.length > 0 ? searchResult2.failures : failureFromInspiredesignDiscoveryError({ ...workflowInput, providers: standardProviderIds }, searchResult2.error);
19703
- const discovery3 = normalizeInspiredesignDiscoveryRecords(searchResult2.records);
19972
+ const discovery3 = filterStandardDiscoveryForSiteRecipe(
19973
+ siteRecipe,
19974
+ normalizeInspiredesignDiscoveryRecords(searchResult2.records)
19975
+ );
19704
19976
  const siteResult2 = await runSiteRecipeDiscovery();
19705
19977
  const siteDiscovery = normalizeInspiredesignDiscoveryRecords(siteResult2.records);
19706
19978
  const combinedDiscovery = capMixedInspiredesignDiscovery(
@@ -21539,7 +21811,10 @@ var runInspiredesignWorkflow = async (runtime, input, options = {}) => {
21539
21811
  visualEvidence: packet.visualEvidence,
21540
21812
  screenshotIndex: packet.screenshotIndex,
21541
21813
  rankedReferences: packet.rankedReferences,
21542
- referencePatternBoard: packet.generationPlan.referencePatternBoard,
21814
+ referencePatternBoard: buildInspiredesignRankedArtifactPatternBoard(
21815
+ packet.generationPlan.referencePatternBoard,
21816
+ packet.referencePatternBoard
21817
+ ),
21543
21818
  metaPromptMarkdown: packet.metaPromptMarkdown,
21544
21819
  nextStepGuidance,
21545
21820
  meta: metaWithGuidance
@@ -24346,6 +24621,8 @@ var mergeBudgets = (base, partial) => {
24346
24621
  };
24347
24622
 
24348
24623
  export {
24624
+ WORKFLOW_ARTIFACT_DIRECTORY,
24625
+ resolveWorkflowArtifactRoot,
24349
24626
  CHALLENGE_AUTOMATION_MODES,
24350
24627
  isChallengeAutomationMode,
24351
24628
  resolveChallengeAutomationPolicy,
@@ -24399,8 +24676,6 @@ export {
24399
24676
  createShoppingProviders,
24400
24677
  createShoppingProviderById,
24401
24678
  createWebProvider,
24402
- WORKFLOW_ARTIFACT_DIRECTORY,
24403
- resolveWorkflowArtifactRoot,
24404
24679
  resolveTimebox,
24405
24680
  isWithinTimebox,
24406
24681
  filterByTimebox,
@@ -24410,6 +24685,9 @@ export {
24410
24685
  renderResearch,
24411
24686
  renderShopping,
24412
24687
  renderInspiredesign,
24688
+ requiresProviderUrlSiteRecipeCompatibility,
24689
+ validateProviderScopedUrlCanonicality,
24690
+ validateProviderUrlSiteRecipeCompatibility,
24413
24691
  resolveInspiredesignCaptureMode,
24414
24692
  workflowTestUtils,
24415
24693
  runResearchWorkflow,
@@ -24421,4 +24699,4 @@ export {
24421
24699
  createProviderRuntime,
24422
24700
  createDefaultRuntime
24423
24701
  };
24424
- //# sourceMappingURL=chunk-FBKPDILE.js.map
24702
+ //# sourceMappingURL=chunk-5FDXH4CS.js.map