opendevbrowser 0.0.33 → 0.0.35
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.
- package/README.md +1 -1
- package/dist/{accessibility-snapshot-JSPFVWZ6.js → accessibility-snapshot-TAFPVLZN.js} +9 -9
- package/dist/{active-window-2OB2MSCR.js → active-window-MHFMC6NQ.js} +9 -9
- package/dist/{annotate-VDZBZBKZ.js → annotate-5ZFRFQ4B.js} +8 -8
- package/dist/{attr-7XIO4MCH.js → attr-MBF2UCRF.js} +8 -8
- package/dist/browser/browser-manager.d.ts +6 -1
- package/dist/browser/browser-manager.d.ts.map +1 -1
- package/dist/browser/manager-types.d.ts +51 -0
- package/dist/browser/manager-types.d.ts.map +1 -1
- package/dist/browser/ops-browser-manager.d.ts +2 -1
- package/dist/browser/ops-browser-manager.d.ts.map +1 -1
- package/dist/browser/screencast-recorder.d.ts +1 -0
- package/dist/browser/screencast-recorder.d.ts.map +1 -1
- package/dist/{canvas-N4PAA274.js → canvas-CAMD22YU.js} +8 -8
- package/dist/{capture-desktop-T5YO3EBI.js → capture-desktop-TMZSFA5R.js} +9 -9
- package/dist/{capture-window-UKEUBWKH.js → capture-window-NZDKD2AE.js} +9 -9
- package/dist/{check-PQB6KKMN.js → check-MO33GTQ4.js} +8 -8
- package/dist/{checked-RNZIMCU6.js → checked-3HDF5X2M.js} +8 -8
- package/dist/{chunk-YRRRUGSQ.js → chunk-32ZSOZND.js} +2 -2
- package/dist/{chunk-EOX6U6Q4.js → chunk-AHQC4A6P.js} +896 -118
- package/dist/chunk-AHQC4A6P.js.map +1 -0
- package/dist/{chunk-IBIHDGTZ.js → chunk-B5XIJQXO.js} +32 -4
- package/dist/chunk-B5XIJQXO.js.map +1 -0
- package/dist/{chunk-FDBUB7BM.js → chunk-BHZLEFXW.js} +2 -2
- package/dist/{chunk-JROW6ZNN.js → chunk-FJZY3Z3X.js} +3 -3
- package/dist/{chunk-J3KYGJRQ.js → chunk-G6NQ7WYD.js} +2 -2
- package/dist/{chunk-27W46IKI.js → chunk-HM4CO3EW.js} +38 -23
- package/dist/chunk-HM4CO3EW.js.map +1 -0
- package/dist/{chunk-SKFB5ICF.js → chunk-TI5I6UWY.js} +8 -3
- package/dist/chunk-TI5I6UWY.js.map +1 -0
- package/dist/{chunk-52ZIOWVU.js → chunk-UEAXTWGT.js} +3 -3
- package/dist/{chunk-ZGCTC5YM.js → chunk-UVD34RA2.js} +33 -1
- package/dist/chunk-UVD34RA2.js.map +1 -0
- package/dist/{chunk-W6YPVNDX.js → chunk-VTGG5ZU2.js} +2 -2
- package/dist/{chunk-FBKPDILE.js → chunk-WTWSBEBW.js} +5954 -436
- package/dist/chunk-WTWSBEBW.js.map +1 -0
- package/dist/{chunk-NURQB55J.js → chunk-WY72GYAH.js} +2 -2
- package/dist/{chunk-MJF67OTH.js → chunk-XSSPNVMS.js} +3 -3
- package/dist/{chunk-MJF67OTH.js.map → chunk-XSSPNVMS.js.map} +1 -1
- package/dist/{chunk-HMRANSDX.js → chunk-Z3ADLR7I.js} +698 -18
- package/dist/chunk-Z3ADLR7I.js.map +1 -0
- package/dist/cli/commands/inspiredesign.d.ts +12 -1
- package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
- package/dist/cli/daemon-commands.d.ts.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.js +76 -76
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/parse.d.ts +1 -0
- package/dist/cli/utils/parse.d.ts.map +1 -1
- package/dist/cli/utils/workflow-message.d.ts.map +1 -1
- package/dist/{click-U7ZFKSB4.js → click-SWZPJO2U.js} +8 -8
- package/dist/{clone-component-SWYAORTU.js → clone-component-YTB46YU4.js} +7 -7
- package/dist/{clone-page-WJ6UJOJG.js → clone-page-5FMPHQ3A.js} +7 -7
- package/dist/{close-NAVIHZ2T.js → close-22SNMDX3.js} +7 -7
- package/dist/{close-VKIGIKVT.js → close-ORQZCZ2E.js} +7 -7
- package/dist/{connect-XVG2MOZL.js → connect-EWYITNQU.js} +8 -8
- package/dist/{console-poll-XI5BZPL7.js → console-poll-LJR6ZTDK.js} +8 -8
- package/dist/{cookie-import-QELKE7TK.js → cookie-import-PTAIWPEC.js} +7 -7
- package/dist/{cookie-list-QDA6KWIY.js → cookie-list-76C35B5B.js} +7 -7
- package/dist/{daemon-CA4UIIZQ.js → daemon-UKJMDLCB.js} +6 -6
- package/dist/daemon-fingerprint.json +1 -1
- package/dist/{debug-trace-snapshot-AT4GAO57.js → debug-trace-snapshot-PQ5FJART.js} +8 -8
- package/dist/{dialog-O3V2IBFH.js → dialog-WLJDWJV4.js} +8 -8
- package/dist/{disconnect-NAX5TPTG.js → disconnect-FNB4JC2U.js} +7 -7
- package/dist/{enabled-VT4FJXDX.js → enabled-PYMCOQPC.js} +8 -8
- package/dist/{goto-GBJG5NC4.js → goto-UNTEW4VI.js} +8 -8
- package/dist/guidance/context.d.ts +10 -0
- package/dist/guidance/context.d.ts.map +1 -1
- package/dist/guidance/readiness.d.ts.map +1 -1
- package/dist/guidance/recipes/generic.d.ts.map +1 -1
- package/dist/guidance/recipes/pinterest.d.ts.map +1 -1
- package/dist/guidance/recipes/site-recipe-validation.d.ts +27 -0
- package/dist/guidance/recipes/site-recipe-validation.d.ts.map +1 -0
- package/dist/guidance/types.d.ts +5 -0
- package/dist/guidance/types.d.ts.map +1 -1
- package/dist/{help-SUI4H77K.js → help-QOLCIB3P.js} +8 -7
- package/dist/{help-SUI4H77K.js.map → help-QOLCIB3P.js.map} +1 -1
- package/dist/{hover-476ZNQZE.js → hover-ZWY4YOM4.js} +8 -8
- package/dist/{html-5C4TXOV3.js → html-M46YBFT3.js} +8 -8
- package/dist/index.js +83 -23
- package/dist/index.js.map +1 -1
- package/dist/{inspector-73ARPCIV.js → inspector-6YAOI74U.js} +10 -10
- package/dist/{inspector-audit-QT6QY7KS.js → inspector-audit-PF64X6SJ.js} +12 -12
- package/dist/{inspector-plan-JRNSGN2Z.js → inspector-plan-IUGTQV3Q.js} +10 -10
- package/dist/inspiredesign/capture-mode.d.ts +8 -0
- package/dist/inspiredesign/capture-mode.d.ts.map +1 -1
- package/dist/inspiredesign/capture.d.ts +36 -1
- package/dist/inspiredesign/capture.d.ts.map +1 -1
- package/dist/inspiredesign/contract.d.ts +25 -0
- package/dist/inspiredesign/contract.d.ts.map +1 -1
- package/dist/inspiredesign/handoff.d.ts +6 -2
- package/dist/inspiredesign/handoff.d.ts.map +1 -1
- package/dist/inspiredesign/media-analysis/analyzer.d.ts +13 -0
- package/dist/inspiredesign/media-analysis/analyzer.d.ts.map +1 -0
- package/dist/inspiredesign/media-analysis/design-guidance.d.ts +11 -0
- package/dist/inspiredesign/media-analysis/design-guidance.d.ts.map +1 -0
- package/dist/inspiredesign/media-analysis/ffmpeg.d.ts +21 -0
- package/dist/inspiredesign/media-analysis/ffmpeg.d.ts.map +1 -0
- package/dist/inspiredesign/media-analysis/ffprobe.d.ts +8 -0
- package/dist/inspiredesign/media-analysis/ffprobe.d.ts.map +1 -0
- package/dist/inspiredesign/media-analysis/index.d.ts +10 -0
- package/dist/inspiredesign/media-analysis/index.d.ts.map +1 -0
- package/dist/inspiredesign/media-analysis/persist.d.ts +6 -0
- package/dist/inspiredesign/media-analysis/persist.d.ts.map +1 -0
- package/dist/inspiredesign/media-analysis/pixel.d.ts +9 -0
- package/dist/inspiredesign/media-analysis/pixel.d.ts.map +1 -0
- package/dist/inspiredesign/media-analysis/types.d.ts +163 -0
- package/dist/inspiredesign/media-analysis/types.d.ts.map +1 -0
- package/dist/inspiredesign/media-analysis/typography-structure.d.ts +3 -0
- package/dist/inspiredesign/media-analysis/typography-structure.d.ts.map +1 -0
- package/dist/inspiredesign/meta-prompt.d.ts.map +1 -1
- package/dist/inspiredesign/motion-evidence.d.ts +73 -0
- package/dist/inspiredesign/motion-evidence.d.ts.map +1 -0
- package/dist/inspiredesign/pinterest-media-classification.d.ts +27 -0
- package/dist/inspiredesign/pinterest-media-classification.d.ts.map +1 -0
- package/dist/inspiredesign/pinterest-pin-media-evidence.d.ts +151 -0
- package/dist/inspiredesign/pinterest-pin-media-evidence.d.ts.map +1 -0
- package/dist/inspiredesign/product-readiness.d.ts +97 -0
- package/dist/inspiredesign/product-readiness.d.ts.map +1 -0
- package/dist/inspiredesign/reference-pattern-board.d.ts +32 -2
- package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
- package/dist/inspiredesign/visual-evidence.d.ts +5 -0
- package/dist/inspiredesign/visual-evidence.d.ts.map +1 -1
- package/dist/{inspiredesign-IPVZDLSQ.js → inspiredesign-GZIEXETS.js} +101 -31
- package/dist/inspiredesign-GZIEXETS.js.map +1 -0
- package/dist/{launch-B35YDRQC.js → launch-I7WNLWLY.js} +8 -8
- package/dist/{list-YETWKTKY.js → list-BAECFJI7.js} +7 -7
- package/dist/{list-JV55JVGB.js → list-BCF4HZ2K.js} +7 -7
- package/dist/{macro-resolve-DQK4B3W3.js → macro-resolve-4GNZYHHW.js} +9 -9
- package/dist/{network-poll-4GWHCJXI.js → network-poll-DCZ5ZNLP.js} +8 -8
- package/dist/{new-XDCQPIEG.js → new-6KZYJTJG.js} +7 -7
- package/dist/{open-GIM3ZCSV.js → open-JPGEAJHJ.js} +7 -7
- package/dist/opendevbrowser.js +83 -23
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/{perf-26VBXDPI.js → perf-5X367PRP.js} +8 -8
- package/dist/{pointer-down-O3VSNAXW.js → pointer-down-5OAUDDNR.js} +9 -9
- package/dist/{pointer-drag-WQ5QGE6J.js → pointer-drag-LIW5PY5P.js} +9 -9
- package/dist/{pointer-move-4N4D7JY2.js → pointer-move-7AMURLJD.js} +9 -9
- package/dist/{pointer-up-CQC4NPDX.js → pointer-up-EY652YWL.js} +9 -9
- package/dist/{press-XGJD45CU.js → press-UIAE5XEF.js} +8 -8
- package/dist/{product-video-HD4ZOUI7.js → product-video-B6TLS7VC.js} +10 -10
- package/dist/providers/browser-native-discovery.d.ts.map +1 -1
- package/dist/providers/browser-output-artifacts.d.ts +13 -0
- package/dist/providers/browser-output-artifacts.d.ts.map +1 -0
- package/dist/providers/renderer.d.ts +10 -1
- package/dist/providers/renderer.d.ts.map +1 -1
- package/dist/providers/workflows.d.ts +53 -2
- package/dist/providers/workflows.d.ts.map +1 -1
- package/dist/{providers-KKNPJSQK.js → providers-AERTX6X4.js} +5 -3
- package/dist/public-surface/generated-manifest.d.ts +4 -4
- package/dist/public-surface/generated-manifest.d.ts.map +1 -1
- package/dist/public-surface/source.d.ts +2 -2
- package/dist/public-surface/source.d.ts.map +1 -1
- package/dist/{research-VUWWEQ4R.js → research-AJH6ECYW.js} +10 -10
- package/dist/{review-LZ3TA7U7.js → review-RN6XF2YB.js} +9 -9
- package/dist/{review-desktop-LAO7U7T3.js → review-desktop-UJOUS7K2.js} +9 -9
- package/dist/{rpc-HKNIVFGC.js → rpc-VS5Y5FUT.js} +8 -8
- package/dist/{run-SHCF53FO.js → run-EVRIQW7S.js} +6 -6
- package/dist/{screencast-start-JHMQZVWJ.js → screencast-start-U6J4FYU4.js} +8 -8
- package/dist/{screencast-stop-RWQTWWQS.js → screencast-stop-EQUPRGMP.js} +8 -8
- package/dist/{screenshot-QHFYO6PB.js → screenshot-BENYGC36.js} +8 -8
- package/dist/{scroll-L3FTMAV4.js → scroll-3OALQLX2.js} +8 -8
- package/dist/{scroll-into-view-JVDHX4WU.js → scroll-into-view-SNZKBIVB.js} +8 -8
- package/dist/{select-X4BO7GTB.js → select-JDZDDC3Y.js} +8 -8
- package/dist/{serve-JIMIBCNO.js → serve-LOC6ESJ4.js} +7 -7
- package/dist/{shopping-EGSDP2GL.js → shopping-267OAYGM.js} +10 -10
- package/dist/{snapshot-QGJ7RDNV.js → snapshot-ASYI5UFR.js} +8 -8
- package/dist/{status-CKGPNYIH.js → status-47CI4LJX.js} +7 -7
- package/dist/{status-LEBY2X7N.js → status-N4O6DJTF.js} +9 -9
- package/dist/{status-capabilities-6QTWNGKM.js → status-capabilities-C777JZG4.js} +9 -9
- package/dist/{text-VUZU7D3L.js → text-MS2653MW.js} +8 -8
- package/dist/tools/inspiredesign_run.d.ts.map +1 -1
- package/dist/tools/product_video_run.d.ts.map +1 -1
- package/dist/{type-N5SURP74.js → type-UMPSDACC.js} +8 -8
- package/dist/{uncheck-JFMK3SSY.js → uncheck-2OZ56D42.js} +8 -8
- package/dist/{upload-KFUYLL7M.js → upload-CD7PRH54.js} +8 -8
- package/dist/{use-CNMPP2ED.js → use-MO67AGG7.js} +7 -7
- package/dist/{value-J335MPZE.js → value-4GI2LRUY.js} +8 -8
- package/dist/{visible-YQZWWPBZ.js → visible-VSUFGRFZ.js} +8 -8
- package/dist/{wait-IC7YJJPJ.js → wait-OQYMFENT.js} +8 -8
- package/dist/{windows-AGVQ3KX3.js → windows-75W2JCW7.js} +9 -9
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/opendevbrowser-best-practices/SKILL.md +41 -30
- package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +12 -8
- package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +1 -0
- package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +19 -0
- package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +23 -13
- package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +3 -1
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +62 -21
- package/skills/opendevbrowser-best-practices/scripts/resolve-odb-cli.sh +28 -0
- package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +15 -0
- package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +13 -0
- package/skills/opendevbrowser-design-agent/SKILL.md +2 -0
- package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +15 -13
- package/skills/opendevbrowser-design-agent/artifacts/isolated-preview-validation.md +1 -1
- package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +14 -7
- package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +1 -0
- package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +10 -7
- package/skills/opendevbrowser-motion-design/SKILL.md +1 -1
- package/skills/opendevbrowser-product-presentation-asset/SKILL.md +5 -4
- package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +1 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +1 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +1 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +4 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +1 -0
- package/skills/opendevbrowser-research/SKILL.md +1 -0
- package/skills/opendevbrowser-research/scripts/render-output.sh +1 -0
- package/skills/opendevbrowser-research/scripts/run-research.sh +1 -0
- package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +4 -0
- package/skills/opendevbrowser-research/scripts/write-artifacts.sh +1 -0
- package/skills/opendevbrowser-shopping/SKILL.md +1 -0
- package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +1 -0
- package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +1 -0
- package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +1 -0
- package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +4 -0
- package/dist/chunk-27W46IKI.js.map +0 -1
- package/dist/chunk-EOX6U6Q4.js.map +0 -1
- package/dist/chunk-FBKPDILE.js.map +0 -1
- package/dist/chunk-HMRANSDX.js.map +0 -1
- package/dist/chunk-IBIHDGTZ.js.map +0 -1
- package/dist/chunk-SKFB5ICF.js.map +0 -1
- package/dist/chunk-ZGCTC5YM.js.map +0 -1
- package/dist/inspiredesign-IPVZDLSQ.js.map +0 -1
- /package/dist/{accessibility-snapshot-JSPFVWZ6.js.map → accessibility-snapshot-TAFPVLZN.js.map} +0 -0
- /package/dist/{active-window-2OB2MSCR.js.map → active-window-MHFMC6NQ.js.map} +0 -0
- /package/dist/{annotate-VDZBZBKZ.js.map → annotate-5ZFRFQ4B.js.map} +0 -0
- /package/dist/{attr-7XIO4MCH.js.map → attr-MBF2UCRF.js.map} +0 -0
- /package/dist/{canvas-N4PAA274.js.map → canvas-CAMD22YU.js.map} +0 -0
- /package/dist/{capture-desktop-T5YO3EBI.js.map → capture-desktop-TMZSFA5R.js.map} +0 -0
- /package/dist/{capture-window-UKEUBWKH.js.map → capture-window-NZDKD2AE.js.map} +0 -0
- /package/dist/{check-PQB6KKMN.js.map → check-MO33GTQ4.js.map} +0 -0
- /package/dist/{checked-RNZIMCU6.js.map → checked-3HDF5X2M.js.map} +0 -0
- /package/dist/{chunk-YRRRUGSQ.js.map → chunk-32ZSOZND.js.map} +0 -0
- /package/dist/{chunk-FDBUB7BM.js.map → chunk-BHZLEFXW.js.map} +0 -0
- /package/dist/{chunk-JROW6ZNN.js.map → chunk-FJZY3Z3X.js.map} +0 -0
- /package/dist/{chunk-J3KYGJRQ.js.map → chunk-G6NQ7WYD.js.map} +0 -0
- /package/dist/{chunk-52ZIOWVU.js.map → chunk-UEAXTWGT.js.map} +0 -0
- /package/dist/{chunk-W6YPVNDX.js.map → chunk-VTGG5ZU2.js.map} +0 -0
- /package/dist/{chunk-NURQB55J.js.map → chunk-WY72GYAH.js.map} +0 -0
- /package/dist/{click-U7ZFKSB4.js.map → click-SWZPJO2U.js.map} +0 -0
- /package/dist/{clone-component-SWYAORTU.js.map → clone-component-YTB46YU4.js.map} +0 -0
- /package/dist/{clone-page-WJ6UJOJG.js.map → clone-page-5FMPHQ3A.js.map} +0 -0
- /package/dist/{close-NAVIHZ2T.js.map → close-22SNMDX3.js.map} +0 -0
- /package/dist/{close-VKIGIKVT.js.map → close-ORQZCZ2E.js.map} +0 -0
- /package/dist/{connect-XVG2MOZL.js.map → connect-EWYITNQU.js.map} +0 -0
- /package/dist/{console-poll-XI5BZPL7.js.map → console-poll-LJR6ZTDK.js.map} +0 -0
- /package/dist/{cookie-import-QELKE7TK.js.map → cookie-import-PTAIWPEC.js.map} +0 -0
- /package/dist/{cookie-list-QDA6KWIY.js.map → cookie-list-76C35B5B.js.map} +0 -0
- /package/dist/{daemon-CA4UIIZQ.js.map → daemon-UKJMDLCB.js.map} +0 -0
- /package/dist/{debug-trace-snapshot-AT4GAO57.js.map → debug-trace-snapshot-PQ5FJART.js.map} +0 -0
- /package/dist/{dialog-O3V2IBFH.js.map → dialog-WLJDWJV4.js.map} +0 -0
- /package/dist/{disconnect-NAX5TPTG.js.map → disconnect-FNB4JC2U.js.map} +0 -0
- /package/dist/{enabled-VT4FJXDX.js.map → enabled-PYMCOQPC.js.map} +0 -0
- /package/dist/{goto-GBJG5NC4.js.map → goto-UNTEW4VI.js.map} +0 -0
- /package/dist/{hover-476ZNQZE.js.map → hover-ZWY4YOM4.js.map} +0 -0
- /package/dist/{html-5C4TXOV3.js.map → html-M46YBFT3.js.map} +0 -0
- /package/dist/{inspector-73ARPCIV.js.map → inspector-6YAOI74U.js.map} +0 -0
- /package/dist/{inspector-audit-QT6QY7KS.js.map → inspector-audit-PF64X6SJ.js.map} +0 -0
- /package/dist/{inspector-plan-JRNSGN2Z.js.map → inspector-plan-IUGTQV3Q.js.map} +0 -0
- /package/dist/{launch-B35YDRQC.js.map → launch-I7WNLWLY.js.map} +0 -0
- /package/dist/{list-YETWKTKY.js.map → list-BAECFJI7.js.map} +0 -0
- /package/dist/{list-JV55JVGB.js.map → list-BCF4HZ2K.js.map} +0 -0
- /package/dist/{macro-resolve-DQK4B3W3.js.map → macro-resolve-4GNZYHHW.js.map} +0 -0
- /package/dist/{network-poll-4GWHCJXI.js.map → network-poll-DCZ5ZNLP.js.map} +0 -0
- /package/dist/{new-XDCQPIEG.js.map → new-6KZYJTJG.js.map} +0 -0
- /package/dist/{open-GIM3ZCSV.js.map → open-JPGEAJHJ.js.map} +0 -0
- /package/dist/{perf-26VBXDPI.js.map → perf-5X367PRP.js.map} +0 -0
- /package/dist/{pointer-down-O3VSNAXW.js.map → pointer-down-5OAUDDNR.js.map} +0 -0
- /package/dist/{pointer-drag-WQ5QGE6J.js.map → pointer-drag-LIW5PY5P.js.map} +0 -0
- /package/dist/{pointer-move-4N4D7JY2.js.map → pointer-move-7AMURLJD.js.map} +0 -0
- /package/dist/{pointer-up-CQC4NPDX.js.map → pointer-up-EY652YWL.js.map} +0 -0
- /package/dist/{press-XGJD45CU.js.map → press-UIAE5XEF.js.map} +0 -0
- /package/dist/{product-video-HD4ZOUI7.js.map → product-video-B6TLS7VC.js.map} +0 -0
- /package/dist/{providers-KKNPJSQK.js.map → providers-AERTX6X4.js.map} +0 -0
- /package/dist/{research-VUWWEQ4R.js.map → research-AJH6ECYW.js.map} +0 -0
- /package/dist/{review-LZ3TA7U7.js.map → review-RN6XF2YB.js.map} +0 -0
- /package/dist/{review-desktop-LAO7U7T3.js.map → review-desktop-UJOUS7K2.js.map} +0 -0
- /package/dist/{rpc-HKNIVFGC.js.map → rpc-VS5Y5FUT.js.map} +0 -0
- /package/dist/{run-SHCF53FO.js.map → run-EVRIQW7S.js.map} +0 -0
- /package/dist/{screencast-start-JHMQZVWJ.js.map → screencast-start-U6J4FYU4.js.map} +0 -0
- /package/dist/{screencast-stop-RWQTWWQS.js.map → screencast-stop-EQUPRGMP.js.map} +0 -0
- /package/dist/{screenshot-QHFYO6PB.js.map → screenshot-BENYGC36.js.map} +0 -0
- /package/dist/{scroll-L3FTMAV4.js.map → scroll-3OALQLX2.js.map} +0 -0
- /package/dist/{scroll-into-view-JVDHX4WU.js.map → scroll-into-view-SNZKBIVB.js.map} +0 -0
- /package/dist/{select-X4BO7GTB.js.map → select-JDZDDC3Y.js.map} +0 -0
- /package/dist/{serve-JIMIBCNO.js.map → serve-LOC6ESJ4.js.map} +0 -0
- /package/dist/{shopping-EGSDP2GL.js.map → shopping-267OAYGM.js.map} +0 -0
- /package/dist/{snapshot-QGJ7RDNV.js.map → snapshot-ASYI5UFR.js.map} +0 -0
- /package/dist/{status-CKGPNYIH.js.map → status-47CI4LJX.js.map} +0 -0
- /package/dist/{status-LEBY2X7N.js.map → status-N4O6DJTF.js.map} +0 -0
- /package/dist/{status-capabilities-6QTWNGKM.js.map → status-capabilities-C777JZG4.js.map} +0 -0
- /package/dist/{text-VUZU7D3L.js.map → text-MS2653MW.js.map} +0 -0
- /package/dist/{type-N5SURP74.js.map → type-UMPSDACC.js.map} +0 -0
- /package/dist/{uncheck-JFMK3SSY.js.map → uncheck-2OZ56D42.js.map} +0 -0
- /package/dist/{upload-KFUYLL7M.js.map → upload-CD7PRH54.js.map} +0 -0
- /package/dist/{use-CNMPP2ED.js.map → use-MO67AGG7.js.map} +0 -0
- /package/dist/{value-J335MPZE.js.map → value-4GI2LRUY.js.map} +0 -0
- /package/dist/{visible-YQZWWPBZ.js.map → visible-VSUFGRFZ.js.map} +0 -0
- /package/dist/{wait-IC7YJJPJ.js.map → wait-OQYMFENT.js.map} +0 -0
- /package/dist/{windows-AGVQ3KX3.js.map → windows-75W2JCW7.js.map} +0 -0
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
readCookiesFromSource,
|
|
8
8
|
resolveBundledProviderRuntime,
|
|
9
9
|
resolveSessionRelayRoute
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-AHQC4A6P.js";
|
|
11
11
|
import {
|
|
12
12
|
loadGlobalConfig,
|
|
13
13
|
resolveConfig
|
|
@@ -17,14 +17,16 @@ import {
|
|
|
17
17
|
} from "./chunk-ASMHEEKY.js";
|
|
18
18
|
import {
|
|
19
19
|
buildMacroResolveSuccessHandoff,
|
|
20
|
+
classifyPinterestCandidate,
|
|
20
21
|
detectSocialSearchShell,
|
|
22
|
+
isCanonicalPinterestPinUrl,
|
|
21
23
|
isChallengeAutomationMode,
|
|
22
24
|
resolveWorkflowArtifactRoot,
|
|
23
25
|
runInspiredesignWorkflow,
|
|
24
26
|
runProductVideoWorkflow,
|
|
25
27
|
runResearchWorkflow,
|
|
26
28
|
runShoppingWorkflow
|
|
27
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-WTWSBEBW.js";
|
|
28
30
|
import {
|
|
29
31
|
buildBlockerArtifacts,
|
|
30
32
|
classifyBlockerSignal,
|
|
@@ -171,11 +173,14 @@ import { createServer } from "http";
|
|
|
171
173
|
import { createHash, timingSafeEqual } from "crypto";
|
|
172
174
|
import { mkdirSync, readFileSync, writeFileSync, unlinkSync, existsSync } from "fs";
|
|
173
175
|
import { homedir } from "os";
|
|
174
|
-
import { basename, dirname as dirname2, join, resolve as resolve2 } from "path";
|
|
176
|
+
import { basename, dirname as dirname2, join as join2, resolve as resolve2 } from "path";
|
|
175
177
|
import { fileURLToPath } from "url";
|
|
176
178
|
|
|
177
179
|
// src/cli/daemon-commands.ts
|
|
178
180
|
import { randomUUID as randomUUID3 } from "crypto";
|
|
181
|
+
import { mkdtemp, readFile, rm } from "fs/promises";
|
|
182
|
+
import { tmpdir } from "os";
|
|
183
|
+
import { join } from "path";
|
|
179
184
|
|
|
180
185
|
// src/browser/session-inspector.ts
|
|
181
186
|
import { randomUUID } from "crypto";
|
|
@@ -416,15 +421,31 @@ import { mkdir } from "fs/promises";
|
|
|
416
421
|
import { dirname, resolve } from "path";
|
|
417
422
|
var INSPIREDESIGN_CAPTURE_TIMEOUT_MS = 3e4;
|
|
418
423
|
var INSPIREDESIGN_CAPTURE_MAX_CHARS = 12e3;
|
|
424
|
+
var INSPIREDESIGN_MOTION_INTERVAL_MS = 500;
|
|
425
|
+
var INSPIREDESIGN_MOTION_MAX_FRAMES = 3;
|
|
426
|
+
var INSPIREDESIGN_LATE_SCREENCAST_STOP_TIMEOUT_MS = 1e3;
|
|
427
|
+
var INSPIREDESIGN_PIN_MEDIA_CAPTURE_TIMEOUT_MS = 9e4;
|
|
428
|
+
var PINTEREST_PIN_MEDIA_EXTENSION_WARMUP_TIMEOUT_MS = 3e4;
|
|
429
|
+
var PINTEREST_PIN_MEDIA_NETWORK_IDLE_TIMEOUT_MS = 5e3;
|
|
430
|
+
var EXACT_CANONICAL_PINTEREST_PIN_HOST = "www.pinterest.com";
|
|
419
431
|
var ACTIVE_SESSION_COOKIE_REUSE_UNAVAILABLE_MESSAGE = "Deep capture only honors configured provider cookie sources; active session cookies are not reused.";
|
|
420
432
|
var DOM_CAPTURE_HELPER_UNAVAILABLE_MESSAGE = "DOM capture helper unavailable in this execution lane.";
|
|
421
433
|
var VISUAL_CAPTURE_HELPER_UNAVAILABLE_MESSAGE = "Visual evidence screenshot helper unavailable in this execution lane.";
|
|
422
434
|
var VISUAL_CAPTURE_PATH_UNAVAILABLE_MESSAGE = "Visual evidence path was not configured for screenshot capture.";
|
|
423
435
|
var VISUAL_CAPTURE_EMPTY_MESSAGE = "Visual evidence screenshot did not return a file path.";
|
|
436
|
+
var PIN_MEDIA_CAPTURE_HELPER_UNAVAILABLE_MESSAGE = "Pinterest pin media capture helper unavailable in this execution lane.";
|
|
437
|
+
var PIN_MEDIA_CAPTURE_PATH_UNAVAILABLE_MESSAGE = "Pinterest pin media evidence path was not configured.";
|
|
438
|
+
var PIN_MEDIA_CAPTURE_NOT_FOUND_MESSAGE = "Pinterest pin media capture did not find a primary media candidate.";
|
|
439
|
+
var PIN_MEDIA_CAPTURE_PATH_MISMATCH_MESSAGE = "Pinterest pin media evidence temp path did not match the requested artifact path.";
|
|
440
|
+
var PRIMARY_CAPTURE_SESSION_UNAVAILABLE_MESSAGE = "Primary media capture session helper unavailable in this execution lane.";
|
|
441
|
+
var VISUAL_VIEWPORT_PROBE_FAILED_WARNING = "viewport_url_unverified";
|
|
442
|
+
var PINTEREST_VIEWPORT_LOGIN_WARNING = "login_or_challenge_state";
|
|
443
|
+
var PINTEREST_VIEWPORT_CHROME_WARNING = "interface_chrome_shell";
|
|
424
444
|
var SNAPSHOT_CAPTURE_EMPTY_MESSAGE = "Snapshot capture returned empty content.";
|
|
425
445
|
var CLONE_CAPTURE_EMPTY_MESSAGE = "Clone capture returned empty component and CSS previews.";
|
|
426
446
|
var DOM_CAPTURE_EMPTY_MESSAGE = "DOM capture returned empty HTML.";
|
|
427
447
|
var SKIPPED_AFTER_TRANSPORT_TIMEOUT_SUFFIX = "transport timeout.";
|
|
448
|
+
var PINTEREST_VIEWPORT_MEDIA_PROBE_MAX_NODES = 400;
|
|
428
449
|
var createRemainingCaptureTimeout = (timeoutMs) => {
|
|
429
450
|
const startedAtMs = Date.now();
|
|
430
451
|
let firstRead = true;
|
|
@@ -436,10 +457,18 @@ var createRemainingCaptureTimeout = (timeoutMs) => {
|
|
|
436
457
|
return Math.max(1, timeoutMs - Math.max(0, Date.now() - startedAtMs));
|
|
437
458
|
};
|
|
438
459
|
};
|
|
460
|
+
var createCappedRemainingCaptureTimeout = (remainingTimeoutMs, capMs) => {
|
|
461
|
+
const cappedRemainingTimeoutMs = createRemainingCaptureTimeout(capMs);
|
|
462
|
+
return () => Math.min(remainingTimeoutMs(), cappedRemainingTimeoutMs());
|
|
463
|
+
};
|
|
439
464
|
var clampInspiredesignCaptureTimeout = (timeoutMs) => {
|
|
440
465
|
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs)) return INSPIREDESIGN_CAPTURE_TIMEOUT_MS;
|
|
441
466
|
return Math.max(1, Math.min(timeoutMs, INSPIREDESIGN_CAPTURE_TIMEOUT_MS));
|
|
442
467
|
};
|
|
468
|
+
var clampInspiredesignPinMediaCaptureTimeout = (timeoutMs) => {
|
|
469
|
+
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs)) return INSPIREDESIGN_PIN_MEDIA_CAPTURE_TIMEOUT_MS;
|
|
470
|
+
return Math.max(1, Math.min(timeoutMs, INSPIREDESIGN_PIN_MEDIA_CAPTURE_TIMEOUT_MS));
|
|
471
|
+
};
|
|
443
472
|
function sanitizeInspiredesignCaptureText(value) {
|
|
444
473
|
if (value === void 0) return void 0;
|
|
445
474
|
const redacted = redactSensitive(value);
|
|
@@ -473,6 +502,61 @@ var buildSkippedAfterTransportTimeoutAttempt = (label) => {
|
|
|
473
502
|
var hasUsableCaptureText = (value) => {
|
|
474
503
|
return typeof value === "string" && value.trim().length > 0;
|
|
475
504
|
};
|
|
505
|
+
var isPinterestUrl = (value) => {
|
|
506
|
+
if (!value) return false;
|
|
507
|
+
try {
|
|
508
|
+
const hostname = new URL(value).hostname.toLowerCase();
|
|
509
|
+
return hostname === "pinterest.com" || hostname.endsWith(".pinterest.com");
|
|
510
|
+
} catch {
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
var pinterestViewportClassification = (args) => {
|
|
515
|
+
if (!isPinterestUrl(args.url)) return void 0;
|
|
516
|
+
return classifyPinterestCandidate({
|
|
517
|
+
url: args.url,
|
|
518
|
+
title: args.title,
|
|
519
|
+
content: [
|
|
520
|
+
args.content,
|
|
521
|
+
...args.warnings ?? []
|
|
522
|
+
].filter((value) => typeof value === "string" && value.trim().length > 0).join(" "),
|
|
523
|
+
html: args.html
|
|
524
|
+
});
|
|
525
|
+
};
|
|
526
|
+
var pinterestViewportWarnings = (args) => {
|
|
527
|
+
const quality = pinterestViewportClassification(args)?.sourcePageQuality;
|
|
528
|
+
if (quality === "login_challenge") return [PINTEREST_VIEWPORT_LOGIN_WARNING];
|
|
529
|
+
if (quality === "search_shell" || quality === "chrome_only") return [PINTEREST_VIEWPORT_CHROME_WARNING];
|
|
530
|
+
return [];
|
|
531
|
+
};
|
|
532
|
+
var pinterestViewportPageQuality = (args) => {
|
|
533
|
+
return pinterestViewportClassification(args)?.sourcePageQuality;
|
|
534
|
+
};
|
|
535
|
+
var normalizeMotionSourceUrlForComparison = (value) => {
|
|
536
|
+
if (!value) return void 0;
|
|
537
|
+
try {
|
|
538
|
+
const url = new URL(value);
|
|
539
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return void 0;
|
|
540
|
+
url.hash = "";
|
|
541
|
+
url.search = "";
|
|
542
|
+
return url.toString();
|
|
543
|
+
} catch {
|
|
544
|
+
return void 0;
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
var motionSourceDiagnosticReasons = (startedProbe, endedProbe) => {
|
|
548
|
+
const startedUrl = normalizeMotionSourceUrlForComparison(startedProbe.sourceUrl);
|
|
549
|
+
const endedUrl = normalizeMotionSourceUrlForComparison(endedProbe.sourceUrl);
|
|
550
|
+
if (!startedUrl || !endedUrl) return ["motion_source_unverified"];
|
|
551
|
+
return startedUrl === endedUrl ? [] : ["motion_source_changed"];
|
|
552
|
+
};
|
|
553
|
+
var motionPageQualityDiagnosticReasons = (startedProbe, endedProbe) => {
|
|
554
|
+
const qualities = [
|
|
555
|
+
{ sourceUrl: startedProbe.sourceUrl, quality: startedProbe.pinterestPageQuality },
|
|
556
|
+
{ sourceUrl: endedProbe.sourceUrl, quality: endedProbe.pinterestPageQuality }
|
|
557
|
+
];
|
|
558
|
+
return qualities.some((entry) => isPinterestUrl(entry.sourceUrl) && entry.quality !== "pin_media") ? ["motion_source_page_quality_not_pin_media"] : [];
|
|
559
|
+
};
|
|
476
560
|
var resolveInspiredesignCaptureCookiePolicy = (options) => {
|
|
477
561
|
if (options.cookiePolicyOverride) return options.cookiePolicyOverride;
|
|
478
562
|
return options.useCookies === false ? "off" : "auto";
|
|
@@ -529,6 +613,25 @@ var importConfiguredCaptureCookies = async (manager, sessionId, source, timeoutM
|
|
|
529
613
|
sourceMessage: loaded.message
|
|
530
614
|
};
|
|
531
615
|
};
|
|
616
|
+
var prepareCaptureSessionState = async ({
|
|
617
|
+
manager,
|
|
618
|
+
sessionId,
|
|
619
|
+
url,
|
|
620
|
+
remainingTimeoutMs,
|
|
621
|
+
options
|
|
622
|
+
}) => {
|
|
623
|
+
const cookiePolicy = resolveInspiredesignCaptureCookiePolicy(options);
|
|
624
|
+
const importState = cookiePolicy === "off" ? { sourceConfigured: false, sourceAvailable: false } : await importConfiguredCaptureCookies(
|
|
625
|
+
manager,
|
|
626
|
+
sessionId,
|
|
627
|
+
options.cookieSource,
|
|
628
|
+
remainingTimeoutMs()
|
|
629
|
+
);
|
|
630
|
+
if (cookiePolicy === "required") {
|
|
631
|
+
await verifyRequiredCaptureCookies(manager, sessionId, url, importState, remainingTimeoutMs());
|
|
632
|
+
}
|
|
633
|
+
manager.setSessionChallengeAutomationMode?.(sessionId, options.challengeAutomationMode);
|
|
634
|
+
};
|
|
532
635
|
var captureSnapshotArtifact = async (manager, sessionId, remainingTimeoutMs) => {
|
|
533
636
|
try {
|
|
534
637
|
const snapshot = await withCaptureDeadline(
|
|
@@ -628,15 +731,145 @@ var captureDomArtifact = async (manager, sessionId, remainingTimeoutMs) => {
|
|
|
628
731
|
};
|
|
629
732
|
}
|
|
630
733
|
};
|
|
631
|
-
var buildVisualEvidenceMetadata = (status, detail, warnings = [], tempPath) => ({
|
|
734
|
+
var buildVisualEvidenceMetadata = (status, detail, warnings = [], tempPath, sourceUrl, pinterestPageQuality) => ({
|
|
632
735
|
status,
|
|
633
736
|
kind: "viewport",
|
|
634
737
|
fullPage: false,
|
|
635
738
|
capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
739
|
+
...sourceUrl ? { sourceUrl } : {},
|
|
740
|
+
...pinterestPageQuality ? { pinterestPageQuality } : {},
|
|
636
741
|
...tempPath ? { tempPath } : {},
|
|
637
742
|
warnings,
|
|
638
743
|
...detail ? { failure: sanitizeInspiredesignCaptureText(detail) } : {}
|
|
639
744
|
});
|
|
745
|
+
var collectPinterestPinMediaNotFoundReasons = (result) => {
|
|
746
|
+
const reasons = result.rejectedCandidates.flatMap((candidate) => candidate.reasons);
|
|
747
|
+
return [...new Set(reasons.length > 0 ? reasons : ["pin_media_candidate_not_found"])].map((reason) => sanitizeInspiredesignCaptureText(reason)).filter((reason) => Boolean(reason));
|
|
748
|
+
};
|
|
749
|
+
var buildPinMediaEvidenceMetadata = (status, referenceId, url, detail, options = {}) => ({
|
|
750
|
+
status,
|
|
751
|
+
kind: options.kind ?? "image",
|
|
752
|
+
capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
753
|
+
referenceId,
|
|
754
|
+
url,
|
|
755
|
+
...options.sourceUrl ? { sourceUrl: options.sourceUrl } : {},
|
|
756
|
+
...options.startedSourceUrl ? { startedSourceUrl: options.startedSourceUrl } : {},
|
|
757
|
+
...options.endedSourceUrl ? { endedSourceUrl: options.endedSourceUrl } : {},
|
|
758
|
+
...options.pinterestPageQuality ? { pinterestPageQuality: options.pinterestPageQuality } : {},
|
|
759
|
+
...options.mediaUrl ? { mediaUrl: options.mediaUrl } : {},
|
|
760
|
+
...options.candidateSelector ? { candidateSelector: options.candidateSelector } : {},
|
|
761
|
+
...options.candidateRole ? { candidateRole: options.candidateRole } : {},
|
|
762
|
+
...options.candidateAlt ? { candidateAlt: options.candidateAlt } : {},
|
|
763
|
+
...options.width ? { width: options.width } : {},
|
|
764
|
+
...options.height ? { height: options.height } : {},
|
|
765
|
+
...options.contentType ? { contentType: options.contentType } : {},
|
|
766
|
+
...options.tempPath ? { tempPath: options.tempPath } : {},
|
|
767
|
+
warnings: options.warnings ?? [],
|
|
768
|
+
...detail ? { failure: sanitizeInspiredesignCaptureText(detail) } : {},
|
|
769
|
+
rejectionReasons: options.rejectionReasons ?? []
|
|
770
|
+
});
|
|
771
|
+
var mergePinMediaWarnings = (viewportProbe, result) => [...viewportProbe.warnings, ...result.warnings ?? []];
|
|
772
|
+
var viewportProbeFromPinMediaResult = (result) => ({
|
|
773
|
+
...result.sourceUrl ? { sourceUrl: result.sourceUrl } : {},
|
|
774
|
+
warnings: []
|
|
775
|
+
});
|
|
776
|
+
var hasCapturedPinMediaDirectProof = (result, sourceUrl) => Boolean(sourceUrl && result.mediaUrl && result.path);
|
|
777
|
+
var buildCapturedPinMediaMetadata = (result, referenceId, url, requestedPath, viewportProbe, fallbackPageQuality) => {
|
|
778
|
+
const sourceUrl = result.sourceUrl || viewportProbe.sourceUrl;
|
|
779
|
+
if (!result.path || resolve(result.path) !== resolve(requestedPath)) {
|
|
780
|
+
return buildPinMediaEvidenceMetadata(
|
|
781
|
+
"failed",
|
|
782
|
+
referenceId,
|
|
783
|
+
url,
|
|
784
|
+
PIN_MEDIA_CAPTURE_PATH_MISMATCH_MESSAGE,
|
|
785
|
+
{
|
|
786
|
+
kind: result.kind ?? "image",
|
|
787
|
+
sourceUrl,
|
|
788
|
+
endedSourceUrl: sourceUrl,
|
|
789
|
+
pinterestPageQuality: viewportProbe.pinterestPageQuality ?? fallbackPageQuality,
|
|
790
|
+
warnings: [...mergePinMediaWarnings(viewportProbe, result), "pin_media_temp_path_mismatch"],
|
|
791
|
+
rejectionReasons: ["pin_media_temp_path_mismatch"]
|
|
792
|
+
}
|
|
793
|
+
);
|
|
794
|
+
}
|
|
795
|
+
const pinterestPageQuality = hasCapturedPinMediaDirectProof(result, sourceUrl) ? "pin_media" : viewportProbe.pinterestPageQuality ?? fallbackPageQuality ?? "unknown";
|
|
796
|
+
return buildPinMediaEvidenceMetadata("captured", referenceId, url, void 0, {
|
|
797
|
+
kind: result.kind ?? "image",
|
|
798
|
+
tempPath: requestedPath,
|
|
799
|
+
sourceUrl,
|
|
800
|
+
endedSourceUrl: sourceUrl,
|
|
801
|
+
pinterestPageQuality,
|
|
802
|
+
mediaUrl: result.mediaUrl,
|
|
803
|
+
candidateSelector: result.candidateSelector,
|
|
804
|
+
candidateRole: result.candidateRole,
|
|
805
|
+
candidateAlt: result.alt,
|
|
806
|
+
width: result.naturalWidth ?? result.width,
|
|
807
|
+
height: result.naturalHeight ?? result.height,
|
|
808
|
+
contentType: result.contentType,
|
|
809
|
+
warnings: mergePinMediaWarnings(viewportProbe, result)
|
|
810
|
+
});
|
|
811
|
+
};
|
|
812
|
+
var capturePinterestViewportHtml = async (manager, sessionId, sourceUrl, remainingTimeoutMs) => {
|
|
813
|
+
if (!isPinterestUrl(sourceUrl) || typeof manager.clonePageHtmlWithOptions !== "function") return void 0;
|
|
814
|
+
const timeoutMs = remainingTimeoutMs();
|
|
815
|
+
if (timeoutMs <= 1) return void 0;
|
|
816
|
+
try {
|
|
817
|
+
const clone = await withCaptureDeadline(
|
|
818
|
+
manager.clonePageHtmlWithOptions(
|
|
819
|
+
sessionId,
|
|
820
|
+
void 0,
|
|
821
|
+
{
|
|
822
|
+
maxNodes: PINTEREST_VIEWPORT_MEDIA_PROBE_MAX_NODES,
|
|
823
|
+
inlineStyles: false
|
|
824
|
+
},
|
|
825
|
+
timeoutMs
|
|
826
|
+
),
|
|
827
|
+
timeoutMs,
|
|
828
|
+
"Pinterest viewport media probe"
|
|
829
|
+
);
|
|
830
|
+
return sanitizeInspiredesignCaptureText(clone.html);
|
|
831
|
+
} catch {
|
|
832
|
+
return void 0;
|
|
833
|
+
}
|
|
834
|
+
};
|
|
835
|
+
var captureViewportSourceUrl = async (manager, sessionId, remainingTimeoutMs) => {
|
|
836
|
+
try {
|
|
837
|
+
const snapshot = await withCaptureDeadline(
|
|
838
|
+
manager.snapshot(sessionId, "outline", 1e3, void 0, void 0, remainingTimeoutMs()),
|
|
839
|
+
remainingTimeoutMs(),
|
|
840
|
+
"visual evidence viewport probe"
|
|
841
|
+
);
|
|
842
|
+
const warnings = [
|
|
843
|
+
...snapshot.url ? [] : [VISUAL_VIEWPORT_PROBE_FAILED_WARNING],
|
|
844
|
+
...pinterestViewportWarnings({
|
|
845
|
+
url: snapshot.url,
|
|
846
|
+
title: snapshot.title,
|
|
847
|
+
content: snapshot.content,
|
|
848
|
+
warnings: snapshot.warnings
|
|
849
|
+
})
|
|
850
|
+
];
|
|
851
|
+
const html = await capturePinterestViewportHtml(
|
|
852
|
+
manager,
|
|
853
|
+
sessionId,
|
|
854
|
+
snapshot.url,
|
|
855
|
+
remainingTimeoutMs
|
|
856
|
+
);
|
|
857
|
+
const pinterestPageQuality = pinterestViewportPageQuality({
|
|
858
|
+
url: snapshot.url,
|
|
859
|
+
title: snapshot.title,
|
|
860
|
+
content: snapshot.content,
|
|
861
|
+
html,
|
|
862
|
+
warnings: snapshot.warnings
|
|
863
|
+
});
|
|
864
|
+
return {
|
|
865
|
+
...snapshot.url ? { sourceUrl: snapshot.url } : {},
|
|
866
|
+
...pinterestPageQuality ? { pinterestPageQuality } : {},
|
|
867
|
+
warnings
|
|
868
|
+
};
|
|
869
|
+
} catch {
|
|
870
|
+
return { warnings: [VISUAL_VIEWPORT_PROBE_FAILED_WARNING] };
|
|
871
|
+
}
|
|
872
|
+
};
|
|
640
873
|
var captureVisualEvidenceArtifact = async (manager, sessionId, options, remainingTimeoutMs) => {
|
|
641
874
|
const visualEvidence = options.visualEvidence ?? "off";
|
|
642
875
|
if (visualEvidence === "off") return void 0;
|
|
@@ -654,6 +887,7 @@ var captureVisualEvidenceArtifact = async (manager, sessionId, options, remainin
|
|
|
654
887
|
}
|
|
655
888
|
try {
|
|
656
889
|
await mkdir(dirname(options.visualEvidencePath), { recursive: true });
|
|
890
|
+
const viewportProbe = await captureViewportSourceUrl(manager, sessionId, remainingTimeoutMs);
|
|
657
891
|
const screenshot = await withCaptureDeadline(
|
|
658
892
|
manager.screenshot(sessionId, {
|
|
659
893
|
path: options.visualEvidencePath,
|
|
@@ -668,7 +902,14 @@ var captureVisualEvidenceArtifact = async (manager, sessionId, options, remainin
|
|
|
668
902
|
if (resolve(screenshot.path) !== resolve(options.visualEvidencePath)) {
|
|
669
903
|
return buildVisualEvidenceMetadata("failed", "Visual evidence screenshot path did not match the requested artifact path.");
|
|
670
904
|
}
|
|
671
|
-
return buildVisualEvidenceMetadata(
|
|
905
|
+
return buildVisualEvidenceMetadata(
|
|
906
|
+
"captured",
|
|
907
|
+
void 0,
|
|
908
|
+
[...viewportProbe.warnings, ...screenshot.warnings ?? []],
|
|
909
|
+
options.visualEvidencePath,
|
|
910
|
+
viewportProbe.sourceUrl,
|
|
911
|
+
viewportProbe.pinterestPageQuality
|
|
912
|
+
);
|
|
672
913
|
} catch (error) {
|
|
673
914
|
return buildVisualEvidenceMetadata(
|
|
674
915
|
"failed",
|
|
@@ -715,6 +956,412 @@ var captureInspiredesignArtifacts = async (manager, sessionId, remainingTimeoutM
|
|
|
715
956
|
const visual = await captureVisualEvidenceArtifact(manager, sessionId, options, remainingTimeoutMs);
|
|
716
957
|
return buildCaptureEvidence(snapshot, clone, dom, visual);
|
|
717
958
|
};
|
|
959
|
+
var delay = (ms) => new Promise((resolveDelay) => setTimeout(resolveDelay, ms));
|
|
960
|
+
var shouldForceManagedPrimaryCapture = (browserMode) => browserMode === "managed";
|
|
961
|
+
var exactCanonicalPinterestPinCaptureUrl = (url) => {
|
|
962
|
+
const trimmed = url.trim();
|
|
963
|
+
try {
|
|
964
|
+
const parsed = new URL(trimmed);
|
|
965
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return void 0;
|
|
966
|
+
if (!isCanonicalPinterestPinUrl(trimmed)) return void 0;
|
|
967
|
+
const pathSegments = parsed.pathname.split("/").filter(Boolean);
|
|
968
|
+
const pinId = pathSegments[1];
|
|
969
|
+
if (pathSegments[0] !== "pin" || typeof pinId !== "string") return void 0;
|
|
970
|
+
return `https://${EXACT_CANONICAL_PINTEREST_PIN_HOST}/pin/${pinId}/`;
|
|
971
|
+
} catch {
|
|
972
|
+
return void 0;
|
|
973
|
+
}
|
|
974
|
+
};
|
|
975
|
+
var shouldWarmCanonicalPinterestPinInExtension = (url, browserMode) => exactCanonicalPinterestPinCaptureUrl(url) !== void 0 && resolveCanonicalPinterestPinCaptureBrowserMode(url, browserMode) === "extension";
|
|
976
|
+
var captureNetworkIdleWaitTimeout = (remainingTimeoutMs, maxNetworkIdleWaitMs) => {
|
|
977
|
+
const remaining = remainingTimeoutMs();
|
|
978
|
+
if (maxNetworkIdleWaitMs === void 0) return remaining;
|
|
979
|
+
return Math.max(1, Math.min(remaining, maxNetworkIdleWaitMs));
|
|
980
|
+
};
|
|
981
|
+
var resolveCanonicalPinterestPinCaptureBrowserMode = (url, browserMode) => {
|
|
982
|
+
if (exactCanonicalPinterestPinCaptureUrl(url) === void 0) return browserMode;
|
|
983
|
+
return browserMode === "managed" ? "managed" : "extension";
|
|
984
|
+
};
|
|
985
|
+
var warmCanonicalPinterestPinInExtension = async (manager, url, remainingTimeoutMs, options) => {
|
|
986
|
+
if (!shouldWarmCanonicalPinterestPinInExtension(url, options.browserMode)) return;
|
|
987
|
+
const launchTimeoutMs = remainingTimeoutMs();
|
|
988
|
+
const session = await withCaptureDeadline(
|
|
989
|
+
manager.launch({
|
|
990
|
+
headless: false,
|
|
991
|
+
startUrl: "about:blank",
|
|
992
|
+
persistProfile: false,
|
|
993
|
+
noExtension: false
|
|
994
|
+
}, launchTimeoutMs),
|
|
995
|
+
launchTimeoutMs,
|
|
996
|
+
"Pinterest canonical pin extension warmup launch"
|
|
997
|
+
);
|
|
998
|
+
try {
|
|
999
|
+
await prepareCaptureSessionState({
|
|
1000
|
+
manager,
|
|
1001
|
+
sessionId: session.sessionId,
|
|
1002
|
+
url,
|
|
1003
|
+
remainingTimeoutMs,
|
|
1004
|
+
options
|
|
1005
|
+
});
|
|
1006
|
+
const gotoTimeoutMs = remainingTimeoutMs();
|
|
1007
|
+
await withCaptureDeadline(
|
|
1008
|
+
manager.goto(session.sessionId, url, "load", gotoTimeoutMs),
|
|
1009
|
+
gotoTimeoutMs,
|
|
1010
|
+
"Pinterest canonical pin extension warmup navigation"
|
|
1011
|
+
);
|
|
1012
|
+
const waitTimeoutMs = captureNetworkIdleWaitTimeout(remainingTimeoutMs, options.maxNetworkIdleWaitMs);
|
|
1013
|
+
try {
|
|
1014
|
+
await withCaptureDeadline(
|
|
1015
|
+
manager.waitForLoad(session.sessionId, "networkidle", waitTimeoutMs),
|
|
1016
|
+
waitTimeoutMs,
|
|
1017
|
+
"Pinterest canonical pin extension warmup network idle wait"
|
|
1018
|
+
);
|
|
1019
|
+
} catch (error) {
|
|
1020
|
+
if (!isIgnorableNetworkIdleWaitError(error)) throw error;
|
|
1021
|
+
}
|
|
1022
|
+
} finally {
|
|
1023
|
+
await manager.disconnect(session.sessionId, false).catch(() => void 0);
|
|
1024
|
+
}
|
|
1025
|
+
};
|
|
1026
|
+
var launchPrimaryCaptureSession = async (manager, url, remainingTimeoutMs, options) => {
|
|
1027
|
+
const launchTimeoutMs = remainingTimeoutMs();
|
|
1028
|
+
const session = await withCaptureDeadline(
|
|
1029
|
+
manager.launch({
|
|
1030
|
+
headless: options.browserMode !== "extension",
|
|
1031
|
+
startUrl: "about:blank",
|
|
1032
|
+
persistProfile: false,
|
|
1033
|
+
noExtension: shouldForceManagedPrimaryCapture(options.browserMode)
|
|
1034
|
+
}, launchTimeoutMs),
|
|
1035
|
+
launchTimeoutMs,
|
|
1036
|
+
"primary media capture session launch"
|
|
1037
|
+
);
|
|
1038
|
+
try {
|
|
1039
|
+
await prepareCaptureSessionState({
|
|
1040
|
+
manager,
|
|
1041
|
+
sessionId: session.sessionId,
|
|
1042
|
+
url,
|
|
1043
|
+
remainingTimeoutMs,
|
|
1044
|
+
options
|
|
1045
|
+
});
|
|
1046
|
+
const gotoTimeoutMs = remainingTimeoutMs();
|
|
1047
|
+
await withCaptureDeadline(
|
|
1048
|
+
manager.goto(session.sessionId, url, "load", gotoTimeoutMs),
|
|
1049
|
+
gotoTimeoutMs,
|
|
1050
|
+
"primary media capture navigation"
|
|
1051
|
+
);
|
|
1052
|
+
const waitTimeoutMs = captureNetworkIdleWaitTimeout(remainingTimeoutMs, options.maxNetworkIdleWaitMs);
|
|
1053
|
+
try {
|
|
1054
|
+
await withCaptureDeadline(
|
|
1055
|
+
manager.waitForLoad(session.sessionId, "networkidle", waitTimeoutMs),
|
|
1056
|
+
waitTimeoutMs,
|
|
1057
|
+
"primary media capture network idle wait"
|
|
1058
|
+
);
|
|
1059
|
+
} catch (error) {
|
|
1060
|
+
if (!isIgnorableNetworkIdleWaitError(error)) throw error;
|
|
1061
|
+
}
|
|
1062
|
+
} catch (error) {
|
|
1063
|
+
await manager.disconnect(session.sessionId, true).catch(() => void 0);
|
|
1064
|
+
throw error;
|
|
1065
|
+
}
|
|
1066
|
+
return session;
|
|
1067
|
+
};
|
|
1068
|
+
async function captureInspiredesignPrimaryVisualEvidenceFromManager(manager, url, options) {
|
|
1069
|
+
if (typeof manager.launch !== "function") {
|
|
1070
|
+
return buildVisualEvidenceMetadata(
|
|
1071
|
+
"failed",
|
|
1072
|
+
PRIMARY_CAPTURE_SESSION_UNAVAILABLE_MESSAGE,
|
|
1073
|
+
["primary_capture_session_unavailable"]
|
|
1074
|
+
);
|
|
1075
|
+
}
|
|
1076
|
+
const captureTimeoutMs = clampInspiredesignCaptureTimeout(options.timeoutMs);
|
|
1077
|
+
const remainingTimeoutMs = createRemainingCaptureTimeout(captureTimeoutMs);
|
|
1078
|
+
let session;
|
|
1079
|
+
try {
|
|
1080
|
+
session = await launchPrimaryCaptureSession(
|
|
1081
|
+
manager,
|
|
1082
|
+
url,
|
|
1083
|
+
remainingTimeoutMs,
|
|
1084
|
+
options
|
|
1085
|
+
);
|
|
1086
|
+
} catch (error) {
|
|
1087
|
+
return buildVisualEvidenceMetadata(
|
|
1088
|
+
"failed",
|
|
1089
|
+
detailFromCaptureError(error, "Primary visual evidence setup failed."),
|
|
1090
|
+
["primary_capture_setup_failed"]
|
|
1091
|
+
);
|
|
1092
|
+
}
|
|
1093
|
+
try {
|
|
1094
|
+
return await captureVisualEvidenceArtifact(manager, session.sessionId, {
|
|
1095
|
+
visualEvidence: "required",
|
|
1096
|
+
visualEvidencePath: options.visualEvidencePath
|
|
1097
|
+
}, remainingTimeoutMs);
|
|
1098
|
+
} finally {
|
|
1099
|
+
await manager.disconnect(session.sessionId, true).catch(() => void 0);
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
async function captureInspiredesignPrimaryPinMediaEvidenceFromManager(manager, url, options) {
|
|
1103
|
+
if (!options.pinMediaEvidencePath) {
|
|
1104
|
+
return buildPinMediaEvidenceMetadata(
|
|
1105
|
+
"failed",
|
|
1106
|
+
options.referenceId,
|
|
1107
|
+
url,
|
|
1108
|
+
PIN_MEDIA_CAPTURE_PATH_UNAVAILABLE_MESSAGE,
|
|
1109
|
+
{ rejectionReasons: ["pin_media_path_unavailable"] }
|
|
1110
|
+
);
|
|
1111
|
+
}
|
|
1112
|
+
if (typeof manager.launch !== "function") {
|
|
1113
|
+
return buildPinMediaEvidenceMetadata(
|
|
1114
|
+
"failed",
|
|
1115
|
+
options.referenceId,
|
|
1116
|
+
url,
|
|
1117
|
+
PRIMARY_CAPTURE_SESSION_UNAVAILABLE_MESSAGE,
|
|
1118
|
+
{
|
|
1119
|
+
warnings: ["primary_capture_session_unavailable"],
|
|
1120
|
+
rejectionReasons: ["primary_capture_session_unavailable"]
|
|
1121
|
+
}
|
|
1122
|
+
);
|
|
1123
|
+
}
|
|
1124
|
+
if (typeof manager.capturePinterestPinMedia !== "function") {
|
|
1125
|
+
return buildPinMediaEvidenceMetadata(
|
|
1126
|
+
"failed",
|
|
1127
|
+
options.referenceId,
|
|
1128
|
+
url,
|
|
1129
|
+
PIN_MEDIA_CAPTURE_HELPER_UNAVAILABLE_MESSAGE,
|
|
1130
|
+
{
|
|
1131
|
+
warnings: ["pin_media_capture_helper_unavailable"],
|
|
1132
|
+
rejectionReasons: ["pin_media_capture_helper_unavailable"]
|
|
1133
|
+
}
|
|
1134
|
+
);
|
|
1135
|
+
}
|
|
1136
|
+
const captureTimeoutMs = clampInspiredesignPinMediaCaptureTimeout(options.timeoutMs);
|
|
1137
|
+
const captureUrl = exactCanonicalPinterestPinCaptureUrl(url) ?? url;
|
|
1138
|
+
const resolvedBrowserMode = resolveCanonicalPinterestPinCaptureBrowserMode(captureUrl, options.browserMode);
|
|
1139
|
+
const captureOptions = resolvedBrowserMode === options.browserMode ? options : { ...options, browserMode: resolvedBrowserMode };
|
|
1140
|
+
const pinMediaCaptureOptions = {
|
|
1141
|
+
...captureOptions,
|
|
1142
|
+
maxNetworkIdleWaitMs: PINTEREST_PIN_MEDIA_NETWORK_IDLE_TIMEOUT_MS
|
|
1143
|
+
};
|
|
1144
|
+
let session;
|
|
1145
|
+
const remainingTimeoutMs = createRemainingCaptureTimeout(captureTimeoutMs);
|
|
1146
|
+
try {
|
|
1147
|
+
const warmupTimeoutMs = Math.min(captureTimeoutMs, PINTEREST_PIN_MEDIA_EXTENSION_WARMUP_TIMEOUT_MS);
|
|
1148
|
+
await warmCanonicalPinterestPinInExtension(
|
|
1149
|
+
manager,
|
|
1150
|
+
captureUrl,
|
|
1151
|
+
createCappedRemainingCaptureTimeout(remainingTimeoutMs, warmupTimeoutMs),
|
|
1152
|
+
pinMediaCaptureOptions
|
|
1153
|
+
).catch(() => void 0);
|
|
1154
|
+
session = await launchPrimaryCaptureSession(
|
|
1155
|
+
manager,
|
|
1156
|
+
captureUrl,
|
|
1157
|
+
remainingTimeoutMs,
|
|
1158
|
+
pinMediaCaptureOptions
|
|
1159
|
+
);
|
|
1160
|
+
} catch (error) {
|
|
1161
|
+
return buildPinMediaEvidenceMetadata(
|
|
1162
|
+
"failed",
|
|
1163
|
+
options.referenceId,
|
|
1164
|
+
url,
|
|
1165
|
+
detailFromCaptureError(error, "Primary Pinterest pin media evidence setup failed."),
|
|
1166
|
+
{
|
|
1167
|
+
warnings: ["primary_capture_setup_failed"],
|
|
1168
|
+
rejectionReasons: ["primary_capture_setup_failed"]
|
|
1169
|
+
}
|
|
1170
|
+
);
|
|
1171
|
+
}
|
|
1172
|
+
try {
|
|
1173
|
+
await mkdir(dirname(options.pinMediaEvidencePath), { recursive: true });
|
|
1174
|
+
const captureTimeout = remainingTimeoutMs();
|
|
1175
|
+
const result = await withCaptureDeadline(
|
|
1176
|
+
manager.capturePinterestPinMedia(session.sessionId, {
|
|
1177
|
+
path: options.pinMediaEvidencePath,
|
|
1178
|
+
timeoutMs: captureTimeout
|
|
1179
|
+
}),
|
|
1180
|
+
captureTimeout,
|
|
1181
|
+
"Pinterest pin media evidence capture"
|
|
1182
|
+
);
|
|
1183
|
+
const viewportProbe = viewportProbeFromPinMediaResult(result);
|
|
1184
|
+
if (result.status === "not_found") {
|
|
1185
|
+
const sourceUrl = result.sourceUrl || viewportProbe.sourceUrl;
|
|
1186
|
+
return buildPinMediaEvidenceMetadata(
|
|
1187
|
+
"skipped",
|
|
1188
|
+
options.referenceId,
|
|
1189
|
+
url,
|
|
1190
|
+
PIN_MEDIA_CAPTURE_NOT_FOUND_MESSAGE,
|
|
1191
|
+
{
|
|
1192
|
+
sourceUrl,
|
|
1193
|
+
endedSourceUrl: sourceUrl,
|
|
1194
|
+
pinterestPageQuality: viewportProbe.pinterestPageQuality ?? options.pinterestPageQuality ?? "unknown",
|
|
1195
|
+
warnings: mergePinMediaWarnings(viewportProbe, result),
|
|
1196
|
+
rejectionReasons: collectPinterestPinMediaNotFoundReasons(result)
|
|
1197
|
+
}
|
|
1198
|
+
);
|
|
1199
|
+
}
|
|
1200
|
+
return buildCapturedPinMediaMetadata(
|
|
1201
|
+
result,
|
|
1202
|
+
options.referenceId,
|
|
1203
|
+
url,
|
|
1204
|
+
options.pinMediaEvidencePath,
|
|
1205
|
+
viewportProbe,
|
|
1206
|
+
options.pinterestPageQuality
|
|
1207
|
+
);
|
|
1208
|
+
} catch (error) {
|
|
1209
|
+
return buildPinMediaEvidenceMetadata(
|
|
1210
|
+
"failed",
|
|
1211
|
+
options.referenceId,
|
|
1212
|
+
url,
|
|
1213
|
+
detailFromCaptureError(error, "Primary Pinterest pin media evidence capture failed."),
|
|
1214
|
+
{
|
|
1215
|
+
warnings: ["primary_pin_media_capture_failed"],
|
|
1216
|
+
rejectionReasons: ["primary_pin_media_capture_failed"]
|
|
1217
|
+
}
|
|
1218
|
+
);
|
|
1219
|
+
} finally {
|
|
1220
|
+
await manager.disconnect(session.sessionId, true).catch(() => void 0);
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
async function captureInspiredesignPrimaryMotionEvidenceFromManager(manager, url, options) {
|
|
1224
|
+
if (!manager.startScreencast || !manager.stopScreencast) {
|
|
1225
|
+
return {
|
|
1226
|
+
status: "failed",
|
|
1227
|
+
kind: "screencast",
|
|
1228
|
+
capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1229
|
+
frameCount: 0,
|
|
1230
|
+
warnings: ["screencast_helper_unavailable"],
|
|
1231
|
+
failure: "Screencast helper unavailable in this execution lane.",
|
|
1232
|
+
diagnostic: true,
|
|
1233
|
+
diagnosticReasons: ["screencast_helper_unavailable"]
|
|
1234
|
+
};
|
|
1235
|
+
}
|
|
1236
|
+
if (typeof manager.launch !== "function") {
|
|
1237
|
+
return {
|
|
1238
|
+
status: "failed",
|
|
1239
|
+
kind: "screencast",
|
|
1240
|
+
capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1241
|
+
frameCount: 0,
|
|
1242
|
+
warnings: ["primary_capture_session_unavailable"],
|
|
1243
|
+
failure: PRIMARY_CAPTURE_SESSION_UNAVAILABLE_MESSAGE,
|
|
1244
|
+
diagnostic: true,
|
|
1245
|
+
diagnosticReasons: ["primary_capture_session_unavailable"]
|
|
1246
|
+
};
|
|
1247
|
+
}
|
|
1248
|
+
const captureTimeoutMs = clampInspiredesignCaptureTimeout(options.timeoutMs);
|
|
1249
|
+
const remainingTimeoutMs = createRemainingCaptureTimeout(captureTimeoutMs);
|
|
1250
|
+
let session;
|
|
1251
|
+
try {
|
|
1252
|
+
session = await launchPrimaryCaptureSession(
|
|
1253
|
+
manager,
|
|
1254
|
+
url,
|
|
1255
|
+
remainingTimeoutMs,
|
|
1256
|
+
options
|
|
1257
|
+
);
|
|
1258
|
+
} catch (error) {
|
|
1259
|
+
return {
|
|
1260
|
+
status: "failed",
|
|
1261
|
+
kind: "screencast",
|
|
1262
|
+
capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1263
|
+
frameCount: 0,
|
|
1264
|
+
warnings: ["primary_capture_setup_failed"],
|
|
1265
|
+
failure: detailFromCaptureError(error, "Primary motion evidence setup failed."),
|
|
1266
|
+
diagnostic: true,
|
|
1267
|
+
diagnosticReasons: ["primary_capture_setup_failed"]
|
|
1268
|
+
};
|
|
1269
|
+
}
|
|
1270
|
+
try {
|
|
1271
|
+
const startedViewportProbe = await captureViewportSourceUrl(manager, session.sessionId, remainingTimeoutMs);
|
|
1272
|
+
const startTimeoutMs = remainingTimeoutMs();
|
|
1273
|
+
let stopLateStart = false;
|
|
1274
|
+
const startScreencast = manager.startScreencast(session.sessionId, {
|
|
1275
|
+
outputDir: options.outputDir,
|
|
1276
|
+
intervalMs: INSPIREDESIGN_MOTION_INTERVAL_MS,
|
|
1277
|
+
maxFrames: INSPIREDESIGN_MOTION_MAX_FRAMES
|
|
1278
|
+
});
|
|
1279
|
+
startScreencast.then(async (screencast2) => {
|
|
1280
|
+
if (stopLateStart) {
|
|
1281
|
+
const lateStop = manager.stopScreencast?.(session.sessionId, screencast2.screencastId);
|
|
1282
|
+
if (lateStop) {
|
|
1283
|
+
await withCaptureDeadline(
|
|
1284
|
+
lateStop,
|
|
1285
|
+
INSPIREDESIGN_LATE_SCREENCAST_STOP_TIMEOUT_MS,
|
|
1286
|
+
"late primary motion capture stop"
|
|
1287
|
+
).catch(() => void 0);
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
}).catch(() => void 0);
|
|
1291
|
+
const screencast = await withCaptureDeadline(
|
|
1292
|
+
startScreencast.catch((error) => {
|
|
1293
|
+
stopLateStart = false;
|
|
1294
|
+
throw error;
|
|
1295
|
+
}),
|
|
1296
|
+
startTimeoutMs,
|
|
1297
|
+
"primary motion capture start"
|
|
1298
|
+
).catch((error) => {
|
|
1299
|
+
stopLateStart = true;
|
|
1300
|
+
throw error;
|
|
1301
|
+
});
|
|
1302
|
+
let result;
|
|
1303
|
+
try {
|
|
1304
|
+
const sampleTimeoutMs = remainingTimeoutMs();
|
|
1305
|
+
if (sampleTimeoutMs <= 1) {
|
|
1306
|
+
throw new Error("Deep capture primary motion capture sampling exceeded timeout budget.");
|
|
1307
|
+
}
|
|
1308
|
+
await withCaptureDeadline(
|
|
1309
|
+
delay(Math.min(INSPIREDESIGN_MOTION_INTERVAL_MS * INSPIREDESIGN_MOTION_MAX_FRAMES, sampleTimeoutMs)),
|
|
1310
|
+
sampleTimeoutMs,
|
|
1311
|
+
"primary motion capture sampling"
|
|
1312
|
+
);
|
|
1313
|
+
} finally {
|
|
1314
|
+
const stopTimeoutMs = remainingTimeoutMs();
|
|
1315
|
+
result = await withCaptureDeadline(
|
|
1316
|
+
manager.stopScreencast(session.sessionId, screencast.screencastId),
|
|
1317
|
+
stopTimeoutMs,
|
|
1318
|
+
"primary motion capture stop"
|
|
1319
|
+
);
|
|
1320
|
+
}
|
|
1321
|
+
if (!result) {
|
|
1322
|
+
throw new Error("Motion evidence screencast did not return stop metadata.");
|
|
1323
|
+
}
|
|
1324
|
+
const endedViewportProbe = await captureViewportSourceUrl(manager, session.sessionId, remainingTimeoutMs);
|
|
1325
|
+
const diagnosticReasons = [
|
|
1326
|
+
...result.frameCount === 0 ? ["zero_frame_capture"] : [],
|
|
1327
|
+
...motionSourceDiagnosticReasons(startedViewportProbe, endedViewportProbe),
|
|
1328
|
+
...motionPageQualityDiagnosticReasons(startedViewportProbe, endedViewportProbe)
|
|
1329
|
+
];
|
|
1330
|
+
const pinterestPageQuality = endedViewportProbe.pinterestPageQuality ?? startedViewportProbe.pinterestPageQuality;
|
|
1331
|
+
return {
|
|
1332
|
+
status: "captured",
|
|
1333
|
+
kind: "screencast",
|
|
1334
|
+
capturedAt: result.endedAt,
|
|
1335
|
+
replay: { tempPath: result.manifestPath },
|
|
1336
|
+
replayHtml: { tempPath: result.replayHtmlPath },
|
|
1337
|
+
...result.previewPath ? { preview: { tempPath: result.previewPath } } : {},
|
|
1338
|
+
outputDir: result.outputDir,
|
|
1339
|
+
frameCount: result.frameCount,
|
|
1340
|
+
warnings: [...startedViewportProbe.warnings, ...endedViewportProbe.warnings, ...result.warnings ?? []],
|
|
1341
|
+
...endedViewportProbe.sourceUrl ?? startedViewportProbe.sourceUrl ? { sourceUrl: endedViewportProbe.sourceUrl ?? startedViewportProbe.sourceUrl } : {},
|
|
1342
|
+
...startedViewportProbe.sourceUrl ? { startedSourceUrl: startedViewportProbe.sourceUrl } : {},
|
|
1343
|
+
...endedViewportProbe.sourceUrl ? { endedSourceUrl: endedViewportProbe.sourceUrl } : {},
|
|
1344
|
+
...pinterestPageQuality ? { pinterestPageQuality } : {},
|
|
1345
|
+
...startedViewportProbe.pinterestPageQuality ? { startedPinterestPageQuality: startedViewportProbe.pinterestPageQuality } : {},
|
|
1346
|
+
...endedViewportProbe.pinterestPageQuality ? { endedPinterestPageQuality: endedViewportProbe.pinterestPageQuality } : {},
|
|
1347
|
+
diagnostic: diagnosticReasons.length > 0,
|
|
1348
|
+
diagnosticReasons
|
|
1349
|
+
};
|
|
1350
|
+
} catch (error) {
|
|
1351
|
+
return {
|
|
1352
|
+
status: "failed",
|
|
1353
|
+
kind: "screencast",
|
|
1354
|
+
capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1355
|
+
frameCount: 0,
|
|
1356
|
+
warnings: ["motion_capture_failed"],
|
|
1357
|
+
failure: detailFromCaptureError(error, "Motion evidence screencast failed."),
|
|
1358
|
+
diagnostic: true,
|
|
1359
|
+
diagnosticReasons: ["motion_capture_failed"]
|
|
1360
|
+
};
|
|
1361
|
+
} finally {
|
|
1362
|
+
await manager.disconnect(session.sessionId, true).catch(() => void 0);
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
718
1365
|
async function captureInspiredesignReferenceFromManager(manager, url, options = {}) {
|
|
719
1366
|
const cookiePolicy = resolveInspiredesignCaptureCookiePolicy(options);
|
|
720
1367
|
const captureTimeoutMs = clampInspiredesignCaptureTimeout(options.timeoutMs);
|
|
@@ -1440,6 +2087,26 @@ var createDaemonWorkflowRuntime = (core, options) => resolveBundledProviderRunti
|
|
|
1440
2087
|
init: options?.init
|
|
1441
2088
|
});
|
|
1442
2089
|
var resolveDaemonWorkflowOutputDir = (core, outputDir) => resolveWorkflowArtifactRoot(outputDir, { workspaceRoot: core.cacheRoot });
|
|
2090
|
+
var captureScreenshotBuffer = async (core, sessionId) => {
|
|
2091
|
+
let captureDir = null;
|
|
2092
|
+
try {
|
|
2093
|
+
captureDir = await mkdtemp(join(tmpdir(), "odb-daemon-shot-"));
|
|
2094
|
+
const capturePath = join(captureDir, "capture.png");
|
|
2095
|
+
const screenshot = await core.manager.screenshot(sessionId, { path: capturePath });
|
|
2096
|
+
if (typeof screenshot.path === "string" && screenshot.path.length > 0) {
|
|
2097
|
+
return await readFile(screenshot.path);
|
|
2098
|
+
}
|
|
2099
|
+
if (typeof screenshot.base64 === "string" && screenshot.base64.length > 0) {
|
|
2100
|
+
return Buffer.from(screenshot.base64, "base64");
|
|
2101
|
+
}
|
|
2102
|
+
return null;
|
|
2103
|
+
} finally {
|
|
2104
|
+
if (captureDir) {
|
|
2105
|
+
await rm(captureDir, { recursive: true, force: true }).catch(() => {
|
|
2106
|
+
});
|
|
2107
|
+
}
|
|
2108
|
+
}
|
|
2109
|
+
};
|
|
1443
2110
|
async function handleDaemonCommand(core, request) {
|
|
1444
2111
|
const params = request.params ?? {};
|
|
1445
2112
|
const bindingId = optionalString(params.bindingId);
|
|
@@ -2207,6 +2874,18 @@ async function handleDaemonCommand(core, request) {
|
|
|
2207
2874
|
captureReference: async (url, options) => captureInspiredesignReferenceFromManager(core.manager, url, {
|
|
2208
2875
|
...options,
|
|
2209
2876
|
cookieSource: core.config.providers?.cookieSource
|
|
2877
|
+
}),
|
|
2878
|
+
captureVisualEvidence: async (url, options) => captureInspiredesignPrimaryVisualEvidenceFromManager(core.manager, url, {
|
|
2879
|
+
...options,
|
|
2880
|
+
cookieSource: core.config.providers?.cookieSource
|
|
2881
|
+
}),
|
|
2882
|
+
captureMotionEvidence: async (url, options) => captureInspiredesignPrimaryMotionEvidenceFromManager(core.manager, url, {
|
|
2883
|
+
...options,
|
|
2884
|
+
cookieSource: core.config.providers?.cookieSource
|
|
2885
|
+
}),
|
|
2886
|
+
capturePinMediaEvidence: async (url, options) => captureInspiredesignPrimaryPinMediaEvidenceFromManager(core.manager, url, {
|
|
2887
|
+
...options,
|
|
2888
|
+
cookieSource: core.config.providers?.cookieSource
|
|
2210
2889
|
})
|
|
2211
2890
|
}
|
|
2212
2891
|
);
|
|
@@ -2241,14 +2920,12 @@ async function handleDaemonCommand(core, request) {
|
|
|
2241
2920
|
});
|
|
2242
2921
|
try {
|
|
2243
2922
|
await core.manager.goto(session.sessionId, url, "load", captureTimeoutMs);
|
|
2244
|
-
|
|
2245
|
-
core
|
|
2923
|
+
return await Promise.race([
|
|
2924
|
+
captureScreenshotBuffer(core, session.sessionId),
|
|
2246
2925
|
new Promise((resolve3) => {
|
|
2247
2926
|
setTimeout(() => resolve3(null), captureTimeoutMs);
|
|
2248
2927
|
})
|
|
2249
2928
|
]);
|
|
2250
|
-
if (!screenshot || typeof screenshot.base64 !== "string" || screenshot.base64.length === 0) return null;
|
|
2251
|
-
return Buffer.from(screenshot.base64, "base64");
|
|
2252
2929
|
} catch {
|
|
2253
2930
|
return null;
|
|
2254
2931
|
} finally {
|
|
@@ -3040,7 +3717,7 @@ function clampWaitTimeout(timeoutMs) {
|
|
|
3040
3717
|
}
|
|
3041
3718
|
async function waitForRelayHandshake(relay, observedPort, timeoutMs) {
|
|
3042
3719
|
const start = Date.now();
|
|
3043
|
-
let
|
|
3720
|
+
let delay2 = WAIT_MIN_DELAY_MS;
|
|
3044
3721
|
while (Date.now() - start < timeoutMs) {
|
|
3045
3722
|
const relayStatus = relay.status();
|
|
3046
3723
|
if (relayStatus.extensionHandshakeComplete) {
|
|
@@ -3053,8 +3730,8 @@ async function waitForRelayHandshake(relay, observedPort, timeoutMs) {
|
|
|
3053
3730
|
if (observedStatus?.extensionHandshakeComplete) {
|
|
3054
3731
|
return true;
|
|
3055
3732
|
}
|
|
3056
|
-
await new Promise((resolve3) => setTimeout(resolve3,
|
|
3057
|
-
|
|
3733
|
+
await new Promise((resolve3) => setTimeout(resolve3, delay2));
|
|
3734
|
+
delay2 = Math.min(delay2 * 2, WAIT_MAX_DELAY_MS);
|
|
3058
3735
|
}
|
|
3059
3736
|
return false;
|
|
3060
3737
|
}
|
|
@@ -3227,11 +3904,11 @@ var RECOVERABLE_PLAYWRIGHT_TRANSPORT_ERRORS = [
|
|
|
3227
3904
|
];
|
|
3228
3905
|
var DAEMON_FINGERPRINT_VERSION = "v1";
|
|
3229
3906
|
function getCacheRoot() {
|
|
3230
|
-
const base = process.env.OPENCODE_CACHE_DIR ?? process.env.XDG_CACHE_HOME ??
|
|
3231
|
-
return
|
|
3907
|
+
const base = process.env.OPENCODE_CACHE_DIR ?? process.env.XDG_CACHE_HOME ?? join2(homedir(), ".cache");
|
|
3908
|
+
return join2(base, "opendevbrowser");
|
|
3232
3909
|
}
|
|
3233
3910
|
function getDaemonMetadataPath() {
|
|
3234
|
-
return
|
|
3911
|
+
return join2(getCacheRoot(), "daemon.json");
|
|
3235
3912
|
}
|
|
3236
3913
|
function readDaemonMetadata() {
|
|
3237
3914
|
const metadataPath = getDaemonMetadataPath();
|
|
@@ -3247,7 +3924,7 @@ function readDaemonMetadata() {
|
|
|
3247
3924
|
}
|
|
3248
3925
|
function writeDaemonMetadata(state) {
|
|
3249
3926
|
const metadataPath = getDaemonMetadataPath();
|
|
3250
|
-
mkdirSync(
|
|
3927
|
+
mkdirSync(join2(getCacheRoot()), { recursive: true });
|
|
3251
3928
|
writeFileSync(metadataPath, JSON.stringify(state, null, 2), { encoding: "utf-8", mode: 384 });
|
|
3252
3929
|
}
|
|
3253
3930
|
function clearDaemonMetadata() {
|
|
@@ -3297,7 +3974,7 @@ function readDaemonFingerprintArtifact(modulePath) {
|
|
|
3297
3974
|
return null;
|
|
3298
3975
|
}
|
|
3299
3976
|
try {
|
|
3300
|
-
const content = readFileSync(
|
|
3977
|
+
const content = readFileSync(join2(distRoot, DAEMON_FINGERPRINT_FILE), "utf-8");
|
|
3301
3978
|
const payload = JSON.parse(content);
|
|
3302
3979
|
if (typeof payload.fingerprint === "string" && payload.fingerprint.trim().length > 0) {
|
|
3303
3980
|
return payload.fingerprint.trim();
|
|
@@ -3719,6 +4396,9 @@ function persistDaemonStatusMetadata(base, status, config) {
|
|
|
3719
4396
|
export {
|
|
3720
4397
|
inspectSession,
|
|
3721
4398
|
buildCorrelatedAuditBundle,
|
|
4399
|
+
captureInspiredesignPrimaryVisualEvidenceFromManager,
|
|
4400
|
+
captureInspiredesignPrimaryPinMediaEvidenceFromManager,
|
|
4401
|
+
captureInspiredesignPrimaryMotionEvidenceFromManager,
|
|
3722
4402
|
captureInspiredesignReferenceFromManager,
|
|
3723
4403
|
executeMacroWithRuntime,
|
|
3724
4404
|
fetchWithTimeout,
|
|
@@ -3740,4 +4420,4 @@ export {
|
|
|
3740
4420
|
fetchDaemonStatusFromMetadata,
|
|
3741
4421
|
persistDaemonStatusMetadata
|
|
3742
4422
|
};
|
|
3743
|
-
//# sourceMappingURL=chunk-
|
|
4423
|
+
//# sourceMappingURL=chunk-Z3ADLR7I.js.map
|