opendevbrowser 0.0.27 → 0.0.29
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 +2 -2
- package/dist/accessibility-snapshot-PA6NWNS7.js +39 -0
- package/dist/accessibility-snapshot-PA6NWNS7.js.map +1 -0
- package/dist/active-window-YNYTIPZN.js +37 -0
- package/dist/active-window-YNYTIPZN.js.map +1 -0
- package/dist/annotate-STYHXZYJ.js +205 -0
- package/dist/annotate-STYHXZYJ.js.map +1 -0
- package/dist/artifacts-KJ6RNDO2.js +120 -0
- package/dist/artifacts-KJ6RNDO2.js.map +1 -0
- package/dist/attr-GHFZZ4SA.js +84 -0
- package/dist/attr-GHFZZ4SA.js.map +1 -0
- package/dist/browser/canvas-manager.d.ts.map +1 -1
- package/dist/browser/ops-client.d.ts +1 -0
- package/dist/browser/ops-client.d.ts.map +1 -1
- package/dist/canvas/document-store.d.ts.map +1 -1
- package/dist/canvas/guidance.d.ts +22 -0
- package/dist/canvas/guidance.d.ts.map +1 -0
- package/dist/canvas-54FBOEGP.js +309 -0
- package/dist/canvas-54FBOEGP.js.map +1 -0
- package/dist/capture-desktop-SNABC24E.js +38 -0
- package/dist/capture-desktop-SNABC24E.js.map +1 -0
- package/dist/capture-window-UJSB5AMP.js +40 -0
- package/dist/capture-window-UJSB5AMP.js.map +1 -0
- package/dist/check-ST5UQ2F5.js +71 -0
- package/dist/check-ST5UQ2F5.js.map +1 -0
- package/dist/checked-IEMWI5CU.js +71 -0
- package/dist/checked-IEMWI5CU.js.map +1 -0
- package/dist/chunk-2CG4SW3E.js +64 -0
- package/dist/chunk-2CG4SW3E.js.map +1 -0
- package/dist/chunk-2SIMIPLY.js +67 -0
- package/dist/chunk-2SIMIPLY.js.map +1 -0
- package/dist/chunk-37VSRUW4.js +141 -0
- package/dist/chunk-37VSRUW4.js.map +1 -0
- package/dist/chunk-5SWZDVOW.js +144 -0
- package/dist/chunk-5SWZDVOW.js.map +1 -0
- package/dist/chunk-6PVZ2ABC.js +429 -0
- package/dist/chunk-6PVZ2ABC.js.map +1 -0
- package/dist/chunk-7GVOUZMQ.js +64 -0
- package/dist/chunk-7GVOUZMQ.js.map +1 -0
- package/dist/chunk-7THCPS52.js +84 -0
- package/dist/chunk-7THCPS52.js.map +1 -0
- package/dist/chunk-ASMHEEKY.js +10 -0
- package/dist/chunk-ASMHEEKY.js.map +1 -0
- package/dist/chunk-DBF5OKH3.js +111 -0
- package/dist/chunk-DBF5OKH3.js.map +1 -0
- package/dist/chunk-DW4TX7MU.js +54 -0
- package/dist/chunk-DW4TX7MU.js.map +1 -0
- package/dist/chunk-IPE7TF2P.js +54 -0
- package/dist/chunk-IPE7TF2P.js.map +1 -0
- package/dist/chunk-IQTJHXZJ.js +126 -0
- package/dist/chunk-IQTJHXZJ.js.map +1 -0
- package/dist/chunk-J47N77VG.js +2969 -0
- package/dist/chunk-J47N77VG.js.map +1 -0
- package/dist/chunk-JZXD6FWR.js +25 -0
- package/dist/chunk-JZXD6FWR.js.map +1 -0
- package/dist/{chunk-QVWOPIZJ.js → chunk-KDSNXS6N.js} +75 -149
- package/dist/chunk-KDSNXS6N.js.map +1 -0
- package/dist/chunk-KZ2IXVQT.js +219 -0
- package/dist/chunk-KZ2IXVQT.js.map +1 -0
- package/dist/chunk-LBPELU7L.js +3649 -0
- package/dist/chunk-LBPELU7L.js.map +1 -0
- package/dist/chunk-MX3NFLCE.js +940 -0
- package/dist/chunk-MX3NFLCE.js.map +1 -0
- package/dist/chunk-N44UXKIB.js +26 -0
- package/dist/chunk-N44UXKIB.js.map +1 -0
- package/dist/chunk-OW5HMYMI.js +19 -0
- package/dist/chunk-OW5HMYMI.js.map +1 -0
- package/dist/chunk-OYNLAZQU.js +838 -0
- package/dist/chunk-OYNLAZQU.js.map +1 -0
- package/dist/chunk-PDPJN2OP.js +17 -0
- package/dist/chunk-PDPJN2OP.js.map +1 -0
- package/dist/chunk-RCZZGGJS.js +226 -0
- package/dist/chunk-RCZZGGJS.js.map +1 -0
- package/dist/chunk-RJNI3BHT.js +1 -0
- package/dist/chunk-RPXWUCQQ.js +112 -0
- package/dist/chunk-RPXWUCQQ.js.map +1 -0
- package/dist/chunk-S5KZQJJI.js +107 -0
- package/dist/chunk-S5KZQJJI.js.map +1 -0
- package/dist/{chunk-V5DJUSPV.js → chunk-S6S2UP6U.js} +2255 -1577
- package/dist/chunk-S6S2UP6U.js.map +1 -0
- package/dist/{chunk-MWBDO2L5.js → chunk-SXAGSEKZ.js} +1369 -9584
- package/dist/chunk-SXAGSEKZ.js.map +1 -0
- package/dist/chunk-T4GMCW6Z.js +46 -0
- package/dist/chunk-T4GMCW6Z.js.map +1 -0
- package/dist/chunk-WHQZBUNY.js +982 -0
- package/dist/chunk-WHQZBUNY.js.map +1 -0
- package/dist/chunk-WOXBLP7V.js +610 -0
- package/dist/chunk-WOXBLP7V.js.map +1 -0
- package/dist/cli/commands/inspiredesign.d.ts +2 -0
- package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
- package/dist/cli/commands/macro-resolve.d.ts +5 -0
- package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
- package/dist/cli/commands/product-video.d.ts +2 -0
- package/dist/cli/commands/product-video.d.ts.map +1 -1
- package/dist/cli/commands/research.d.ts +2 -0
- package/dist/cli/commands/research.d.ts.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/shopping.d.ts.map +1 -1
- package/dist/cli/commands/workflow-output.d.ts +2 -0
- package/dist/cli/commands/workflow-output.d.ts.map +1 -0
- package/dist/cli/daemon-commands.d.ts.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.js +207 -8029
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installers/postinstall-skill-sync.js +2 -1
- package/dist/cli/installers/postinstall-skill-sync.js.map +1 -1
- package/dist/cli/remote-relay.d.ts.map +1 -1
- package/dist/cli/utils/workflow-message.d.ts +3 -0
- package/dist/cli/utils/workflow-message.d.ts.map +1 -1
- package/dist/click-TENZA3Y6.js +81 -0
- package/dist/click-TENZA3Y6.js.map +1 -0
- package/dist/clone-component-STH5AR6M.js +82 -0
- package/dist/clone-component-STH5AR6M.js.map +1 -0
- package/dist/clone-page-BSTWAPAJ.js +69 -0
- package/dist/clone-page-BSTWAPAJ.js.map +1 -0
- package/dist/close-CEMMAAM7.js +63 -0
- package/dist/close-CEMMAAM7.js.map +1 -0
- package/dist/close-QCWUNRAI.js +63 -0
- package/dist/close-QCWUNRAI.js.map +1 -0
- package/dist/connect-J3RVSEZF.js +107 -0
- package/dist/connect-J3RVSEZF.js.map +1 -0
- package/dist/console-poll-HL7BVIVX.js +76 -0
- package/dist/console-poll-HL7BVIVX.js.map +1 -0
- package/dist/cookie-import-WMUCIIHN.js +177 -0
- package/dist/cookie-import-WMUCIIHN.js.map +1 -0
- package/dist/cookie-list-PB2N4RPH.js +117 -0
- package/dist/cookie-list-PB2N4RPH.js.map +1 -0
- package/dist/daemon-5KSVMGN4.js +194 -0
- package/dist/daemon-5KSVMGN4.js.map +1 -0
- package/dist/daemon-fingerprint.json +1 -1
- package/dist/debug-trace-snapshot-RK7KDXA5.js +136 -0
- package/dist/debug-trace-snapshot-RK7KDXA5.js.map +1 -0
- package/dist/dialog-P6P4U7XE.js +75 -0
- package/dist/dialog-P6P4U7XE.js.map +1 -0
- package/dist/disconnect-32F7IDIP.js +58 -0
- package/dist/disconnect-32F7IDIP.js.map +1 -0
- package/dist/enabled-A6C6ZM2O.js +71 -0
- package/dist/enabled-A6C6ZM2O.js.map +1 -0
- package/dist/extension-extractor-GKWSFHPN.js +11 -0
- package/dist/extension-extractor-GKWSFHPN.js.map +1 -0
- package/dist/global-D6WLWBXA.js +56 -0
- package/dist/global-D6WLWBXA.js.map +1 -0
- package/dist/goto-ULTSABDM.js +98 -0
- package/dist/goto-ULTSABDM.js.map +1 -0
- package/dist/help-EKKKEDL5.js +491 -0
- package/dist/help-EKKKEDL5.js.map +1 -0
- package/dist/hover-UF2ZUMTQ.js +71 -0
- package/dist/hover-UF2ZUMTQ.js.map +1 -0
- package/dist/html-B6TX7GK7.js +84 -0
- package/dist/html-B6TX7GK7.js.map +1 -0
- package/dist/index.js +100 -42
- package/dist/index.js.map +1 -1
- package/dist/inspector-6S5FKUZQ.js +62 -0
- package/dist/inspector-6S5FKUZQ.js.map +1 -0
- package/dist/inspector-audit-ARGEGOS7.js +84 -0
- package/dist/inspector-audit-ARGEGOS7.js.map +1 -0
- package/dist/inspector-plan-CSG5HZOC.js +69 -0
- package/dist/inspector-plan-CSG5HZOC.js.map +1 -0
- package/dist/inspiredesign/contract.d.ts +52 -1
- package/dist/inspiredesign/contract.d.ts.map +1 -1
- package/dist/inspiredesign/handoff.d.ts +12 -0
- package/dist/inspiredesign/handoff.d.ts.map +1 -1
- package/dist/inspiredesign/reference-pattern-board.d.ts +1 -0
- package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
- package/dist/inspiredesign-7VRMMZN4.js +234 -0
- package/dist/inspiredesign-7VRMMZN4.js.map +1 -0
- package/dist/install-autostart-output-5DOMKCQL.js +41 -0
- package/dist/install-autostart-output-5DOMKCQL.js.map +1 -0
- package/dist/install-autostart-reconciliation-NHKOFYTD.js +73 -0
- package/dist/install-autostart-reconciliation-NHKOFYTD.js.map +1 -0
- package/dist/launch-REYCIR3Z.js +225 -0
- package/dist/launch-REYCIR3Z.js.map +1 -0
- package/dist/list-NPRXRQY2.js +51 -0
- package/dist/list-NPRXRQY2.js.map +1 -0
- package/dist/list-STYD2ZWA.js +54 -0
- package/dist/list-STYD2ZWA.js.map +1 -0
- package/dist/local-HXJLUUNT.js +54 -0
- package/dist/local-HXJLUUNT.js.map +1 -0
- package/dist/macro-resolve-ZIJZ65QI.js +253 -0
- package/dist/macro-resolve-ZIJZ65QI.js.map +1 -0
- package/dist/macros/execute-runtime.d.ts +4 -1
- package/dist/macros/execute-runtime.d.ts.map +1 -1
- package/dist/macros/execute.d.ts +6 -2
- package/dist/macros/execute.d.ts.map +1 -1
- package/dist/native-UPLVQ2SG.js +22 -0
- package/dist/native-UPLVQ2SG.js.map +1 -0
- package/dist/network-poll-HLDOSC72.js +76 -0
- package/dist/network-poll-HLDOSC72.js.map +1 -0
- package/dist/new-HXLLN6UT.js +69 -0
- package/dist/new-HXLLN6UT.js.map +1 -0
- package/dist/onboarding-metadata-7E3KLYSZ.js +27 -0
- package/dist/onboarding-metadata-7E3KLYSZ.js.map +1 -0
- package/dist/open-KDR25LQZ.js +81 -0
- package/dist/open-KDR25LQZ.js.map +1 -0
- package/dist/opendevbrowser.js +100 -42
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/perf-EM6SWFJ6.js +58 -0
- package/dist/perf-EM6SWFJ6.js.map +1 -0
- package/dist/pointer-down-ZYWRZNCH.js +55 -0
- package/dist/pointer-down-ZYWRZNCH.js.map +1 -0
- package/dist/pointer-drag-LVEAVJO4.js +54 -0
- package/dist/pointer-drag-LVEAVJO4.js.map +1 -0
- package/dist/pointer-move-7SRKUS66.js +52 -0
- package/dist/pointer-move-7SRKUS66.js.map +1 -0
- package/dist/pointer-up-KLDBSK37.js +55 -0
- package/dist/pointer-up-KLDBSK37.js.map +1 -0
- package/dist/press-UIIXFTD7.js +83 -0
- package/dist/press-UIIXFTD7.js.map +1 -0
- package/dist/product-video-PYOXJVAI.js +235 -0
- package/dist/product-video-PYOXJVAI.js.map +1 -0
- package/dist/providers/artifacts.d.ts +0 -2
- package/dist/providers/artifacts.d.ts.map +1 -1
- package/dist/providers/blocker.d.ts.map +1 -1
- package/dist/providers/bounded-map.d.ts +2 -0
- package/dist/providers/bounded-map.d.ts.map +1 -0
- package/dist/providers/browser-fallback.d.ts +7 -0
- package/dist/providers/browser-fallback.d.ts.map +1 -1
- package/dist/providers/community/index.d.ts.map +1 -1
- package/dist/providers/constraint.d.ts.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/renderer.d.ts.map +1 -1
- package/dist/providers/research-compiler.d.ts +1 -1
- package/dist/providers/research-compiler.d.ts.map +1 -1
- package/dist/providers/research-executor.d.ts.map +1 -1
- package/dist/providers/runtime-bundle.d.ts +1 -1
- package/dist/providers/runtime-bundle.d.ts.map +1 -1
- package/dist/providers/runtime-factory.d.ts.map +1 -1
- package/dist/providers/shared/traversal-url.d.ts +3 -0
- package/dist/providers/shared/traversal-url.d.ts.map +1 -1
- package/dist/providers/shopping/index.d.ts.map +1 -1
- package/dist/providers/social/platform.d.ts.map +1 -1
- package/dist/providers/social/search-quality.d.ts.map +1 -1
- package/dist/providers/social/youtube.d.ts.map +1 -1
- package/dist/providers/workflow-handoff.d.ts +22 -1
- package/dist/providers/workflow-handoff.d.ts.map +1 -1
- package/dist/providers/workflows.d.ts +3 -0
- package/dist/providers/workflows.d.ts.map +1 -1
- package/dist/{providers-TR3DUJZV.js → providers-4YY2BLXG.js} +19 -14
- package/dist/providers-4YY2BLXG.js.map +1 -0
- package/dist/public-surface/generated-manifest.d.ts +6 -6
- package/dist/public-surface/generated-manifest.d.ts.map +1 -1
- package/dist/public-surface/source.d.ts +8 -8
- package/dist/public-surface/source.d.ts.map +1 -1
- package/dist/relay/protocol.d.ts +3 -1
- package/dist/relay/protocol.d.ts.map +1 -1
- package/dist/relay/relay-server.d.ts +6 -0
- package/dist/relay/relay-server.d.ts.map +1 -1
- package/dist/research-CKXMJ2DK.js +295 -0
- package/dist/research-CKXMJ2DK.js.map +1 -0
- package/dist/review-7HWJPZOD.js +48 -0
- package/dist/review-7HWJPZOD.js.map +1 -0
- package/dist/review-desktop-2IBJHFB5.js +54 -0
- package/dist/review-desktop-2IBJHFB5.js.map +1 -0
- package/dist/rpc-3HGIEJUO.js +159 -0
- package/dist/rpc-3HGIEJUO.js.map +1 -0
- package/dist/run-ADRYI3MS.js +180 -0
- package/dist/run-ADRYI3MS.js.map +1 -0
- package/dist/screencast-start-DTLUHD5H.js +67 -0
- package/dist/screencast-start-DTLUHD5H.js.map +1 -0
- package/dist/screencast-stop-54C5LRSS.js +59 -0
- package/dist/screencast-stop-54C5LRSS.js.map +1 -0
- package/dist/screenshot-HOAKR7P7.js +68 -0
- package/dist/screenshot-HOAKR7P7.js.map +1 -0
- package/dist/scroll-IAOO5COY.js +84 -0
- package/dist/scroll-IAOO5COY.js.map +1 -0
- package/dist/scroll-into-view-RKWSLAPH.js +71 -0
- package/dist/scroll-into-view-RKWSLAPH.js.map +1 -0
- package/dist/select-IGD3T6X4.js +86 -0
- package/dist/select-IGD3T6X4.js.map +1 -0
- package/dist/serve-7X4INUCU.js +498 -0
- package/dist/serve-7X4INUCU.js.map +1 -0
- package/dist/shopping-FC6DRW76.js +273 -0
- package/dist/shopping-FC6DRW76.js.map +1 -0
- package/dist/skill-lifecycle-5UAZGKSN.js +89 -0
- package/dist/skill-lifecycle-5UAZGKSN.js.map +1 -0
- package/dist/skills-NSXDX6YM.js +26 -0
- package/dist/skills-NSXDX6YM.js.map +1 -0
- package/dist/snapshot-X22GG324.js +113 -0
- package/dist/snapshot-X22GG324.js.map +1 -0
- package/dist/status-SP55LMNW.js +132 -0
- package/dist/status-SP55LMNW.js.map +1 -0
- package/dist/status-VH2WXIDG.js +35 -0
- package/dist/status-VH2WXIDG.js.map +1 -0
- package/dist/status-capabilities-YBERLRRA.js +57 -0
- package/dist/status-capabilities-YBERLRRA.js.map +1 -0
- package/dist/text-6TB5WNLI.js +84 -0
- package/dist/text-6TB5WNLI.js.map +1 -0
- package/dist/tools/inspiredesign_run.d.ts.map +1 -1
- package/dist/tools/macro_resolve.d.ts.map +1 -1
- package/dist/tools/product_video_run.d.ts.map +1 -1
- package/dist/tools/research_run.d.ts.map +1 -1
- package/dist/tools/shopping_run.d.ts.map +1 -1
- package/dist/type-3UI3TQH3.js +94 -0
- package/dist/type-3UI3TQH3.js.map +1 -0
- package/dist/uncheck-5L3D2D4U.js +71 -0
- package/dist/uncheck-5L3D2D4U.js.map +1 -0
- package/dist/uninstall-KYKGJAX7.js +91 -0
- package/dist/uninstall-KYKGJAX7.js.map +1 -0
- package/dist/update-SMXPYGXS.js +305 -0
- package/dist/update-SMXPYGXS.js.map +1 -0
- package/dist/update-skill-modes-BVX7IVMW.js +38 -0
- package/dist/update-skill-modes-BVX7IVMW.js.map +1 -0
- package/dist/upload-YG4J2EMI.js +56 -0
- package/dist/upload-YG4J2EMI.js.map +1 -0
- package/dist/use-V3LGFP3K.js +63 -0
- package/dist/use-V3LGFP3K.js.map +1 -0
- package/dist/value-3247D57X.js +71 -0
- package/dist/value-3247D57X.js.map +1 -0
- package/dist/visible-A7HEV36U.js +71 -0
- package/dist/visible-A7HEV36U.js.map +1 -0
- package/dist/wait-UZPP4Y4R.js +109 -0
- package/dist/wait-UZPP4Y4R.js.map +1 -0
- package/dist/windows-76TR3AIP.js +37 -0
- package/dist/windows-76TR3AIP.js.map +1 -0
- package/extension/dist/background.js +99 -22
- package/extension/dist/ops/ops-runtime.js +85 -7
- package/extension/dist/ops/ops-session-store.js +3 -0
- package/extension/dist/ops/target-session-coordinator.js +3 -0
- package/extension/dist/services/CDPRouter.js +9 -0
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/opendevbrowser-best-practices/SKILL.md +13 -11
- package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +1 -1
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +3 -2
- package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +39 -2
- package/skills/opendevbrowser-design-agent/SKILL.md +5 -0
- package/skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md +6 -1
- package/skills/opendevbrowser-design-agent/assets/templates/design-contract.v1.json +15 -1
- package/skills/opendevbrowser-design-agent/assets/templates/inspiredesign-advanced-brief.v1.json +5 -2
- package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +2 -0
- package/skills/opendevbrowser-research/SKILL.md +64 -12
- package/skills/opendevbrowser-research/artifacts/research-workflows.md +56 -19
- package/skills/opendevbrowser-research/assets/templates/compact.md +31 -5
- package/skills/opendevbrowser-research/assets/templates/context.json +52 -1
- package/skills/opendevbrowser-research/assets/templates/report.md +57 -4
- package/skills/opendevbrowser-research/examples/sample-input.json +1 -1
- package/skills/opendevbrowser-research/examples/sample-output.md +27 -2
- package/skills/opendevbrowser-research/scripts/run-research.sh +2 -6
- package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +115 -1
- package/dist/chunk-MWBDO2L5.js.map +0 -1
- package/dist/chunk-QVWOPIZJ.js.map +0 -1
- package/dist/chunk-V5DJUSPV.js.map +0 -1
- /package/dist/{providers-TR3DUJZV.js.map → chunk-RJNI3BHT.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/logging.ts","../src/providers/safety/prompt-guard.ts","../src/providers/blocker.ts","../src/providers/constraint.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"audit\";\n\nexport type LogEnvelope = {\n ts: string;\n level: LogLevel;\n module: string;\n event: string;\n requestId: string;\n sessionId?: string;\n traceId?: string;\n data?: unknown;\n};\n\ntype LogFields = {\n requestId?: string;\n sessionId?: string;\n traceId?: string;\n data?: unknown;\n};\n\nexport type LogSink = (entry: LogEnvelope) => void;\n\nconst SECRET_KEY_PATTERN = /(token|secret|password|authorization|cookie|api[-_]?key|session)/i;\nconst SECRET_VALUE_PATTERN = /(bearer\\s+[a-z0-9._-]+|sk_[a-z0-9_-]+|pk_[a-z0-9_-]+|eyJ[a-z0-9_-]+\\.[a-z0-9_-]+\\.[a-z0-9_-]+)/gi;\n\nfunction redactString(value: string): string {\n return value.replace(SECRET_VALUE_PATTERN, \"[REDACTED]\");\n}\n\nexport function redactSensitive(value: unknown, seen = new WeakSet<object>()): unknown {\n if (typeof value === \"string\") {\n return redactString(value);\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((item) => redactSensitive(item, seen));\n }\n\n const output: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (SECRET_KEY_PATTERN.test(key)) {\n output[key] = \"[REDACTED]\";\n continue;\n }\n output[key] = redactSensitive(entry, seen);\n }\n return output;\n}\n\nexport function createRequestId(): string {\n return randomUUID();\n}\n\nconst defaultSink: LogSink = (entry) => {\n const payload = JSON.stringify(entry);\n if (entry.level === \"error\") {\n console.error(payload);\n return;\n }\n if (entry.level === \"warn\") {\n console.warn(payload);\n return;\n }\n console.log(payload);\n};\n\nexport const stderrSink: LogSink = (entry) => {\n process.stderr.write(`${JSON.stringify(entry)}\\n`);\n};\n\nlet configuredDefaultSink: LogSink = defaultSink;\n\nexport function setDefaultLogSink(sink?: LogSink | null): void {\n configuredDefaultSink = sink ?? defaultSink;\n}\n\nexport function createLogger(moduleName: string, sink?: LogSink): {\n debug: (event: string, fields?: LogFields) => LogEnvelope;\n info: (event: string, fields?: LogFields) => LogEnvelope;\n warn: (event: string, fields?: LogFields) => LogEnvelope;\n error: (event: string, fields?: LogFields) => LogEnvelope;\n audit: (event: string, fields?: LogFields) => LogEnvelope;\n} {\n const emit = (level: LogLevel, event: string, fields: LogFields = {}): LogEnvelope => {\n const entry: LogEnvelope = {\n ts: new Date().toISOString(),\n level,\n module: moduleName,\n event,\n requestId: fields.requestId ?? createRequestId(),\n ...(fields.sessionId ? { sessionId: fields.sessionId } : {}),\n ...(fields.traceId ? { traceId: fields.traceId } : {}),\n ...(typeof fields.data === \"undefined\" ? {} : { data: redactSensitive(fields.data) })\n };\n (sink ?? configuredDefaultSink)(entry);\n return entry;\n };\n\n return {\n debug: (event, fields) => emit(\"debug\", event, fields),\n info: (event, fields) => emit(\"info\", event, fields),\n warn: (event, fields) => emit(\"warn\", event, fields),\n error: (event, fields) => emit(\"error\", event, fields),\n audit: (event, fields) => emit(\"audit\", event, fields)\n };\n}\n\nexport const __test__ = {\n redactString,\n defaultSink\n};\n","import type { JsonValue, NormalizedRecord } from \"../types\";\n\ntype PromptGuardSeverity = \"low\" | \"medium\" | \"high\";\ntype PromptGuardAction = \"strip\" | \"quarantine\";\ntype PromptGuardField = \"title\" | \"content\";\n\ntype PromptGuardRule = {\n id: string;\n regex: RegExp;\n severity: PromptGuardSeverity;\n action: PromptGuardAction;\n};\n\nexport interface PromptGuardEntry {\n pattern: string;\n action: PromptGuardAction;\n severity: PromptGuardSeverity;\n excerpt: string;\n}\n\nexport interface PromptGuardRecordEntry extends PromptGuardEntry {\n recordId: string;\n field: PromptGuardField;\n}\n\nexport interface PromptGuardTextResult {\n text: string;\n diagnostics: {\n entries: number;\n quarantinedSegments: number;\n };\n entries: PromptGuardEntry[];\n}\n\nexport interface PromptGuardResult {\n records: NormalizedRecord[];\n audit: {\n enabled: boolean;\n quarantinedSegments: number;\n entries: PromptGuardRecordEntry[];\n };\n}\n\nconst MAX_EXCERPT_LENGTH = 120;\n\nconst RULES: PromptGuardRule[] = [\n {\n id: \"reveal_system_prompt\",\n regex: /\\b(reveal|show|print|dump|expose|leak)\\b[^.!?\\n]{0,80}\\b(system prompt|hidden prompt|internal prompt)\\b/gi,\n severity: \"high\",\n action: \"quarantine\"\n },\n {\n id: \"tool_abuse_directive\",\n regex: /\\buse (?:the )?tool(?:ing)?\\b[^.!?\\n]{0,120}\\b(delete|remove|drop|wipe|exfiltrat|override|bypass)\\w*/gi,\n severity: \"high\",\n action: \"quarantine\"\n },\n {\n id: \"ignore_previous_instructions\",\n regex: /\\bignore (?:all )?previous instructions?\\b/gi,\n severity: \"medium\",\n action: \"strip\"\n },\n {\n id: \"reveal_hidden_data\",\n regex: /\\breveal (?:hidden|secret|confidential) (?:data|information)\\b/gi,\n severity: \"high\",\n action: \"quarantine\"\n }\n];\n\nconst sanitizeExcerpt = (value: string): string => {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_EXCERPT_LENGTH) return compact;\n return `${compact.slice(0, MAX_EXCERPT_LENGTH - 3)}...`;\n};\n\nconst isJsonObject = (value: JsonValue | undefined): value is Record<string, JsonValue> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst withSecurityAttributes = (\n record: NormalizedRecord,\n enabled: boolean,\n guardEntries: number,\n quarantinedSegments: number\n): Record<string, JsonValue> => {\n const existingSecurity = isJsonObject(record.attributes.security)\n ? record.attributes.security\n : {};\n\n return {\n ...record.attributes,\n security: {\n ...existingSecurity,\n untrustedContent: true,\n dataOnlyContext: true,\n promptGuardEnabled: enabled,\n guardEntries,\n quarantinedSegments\n }\n };\n};\n\nexport function sanitizePromptGuardText(text: string, enabled: boolean): PromptGuardTextResult {\n if (!enabled || !text) {\n return {\n text,\n diagnostics: { entries: 0, quarantinedSegments: 0 },\n entries: []\n };\n }\n\n let output = text;\n const entries: PromptGuardEntry[] = [];\n\n for (const rule of RULES) {\n rule.regex.lastIndex = 0;\n output = output.replace(rule.regex, (match) => {\n entries.push({\n pattern: rule.id,\n action: rule.action,\n severity: rule.severity,\n excerpt: sanitizeExcerpt(match)\n });\n return rule.action === \"quarantine\" ? \"[QUARANTINED]\" : \" \";\n });\n }\n\n const normalized = output.replace(/\\s{2,}/g, \" \").trim();\n const quarantinedSegments = entries.reduce((count, entry) => {\n return entry.action === \"quarantine\" ? count + 1 : count;\n }, 0);\n\n return {\n text: normalized,\n diagnostics: {\n entries: entries.length,\n quarantinedSegments\n },\n entries\n };\n}\n\nexport function applyPromptGuard(records: NormalizedRecord[], enabled: boolean): PromptGuardResult {\n const auditEntries: PromptGuardRecordEntry[] = [];\n let totalQuarantinedSegments = 0;\n\n const guardedRecords = records.map((record) => {\n if (!enabled) {\n return {\n ...record,\n attributes: withSecurityAttributes(record, false, 0, 0)\n };\n }\n\n let title = record.title;\n let content = record.content;\n let recordEntries = 0;\n let recordQuarantinedSegments = 0;\n\n if (typeof record.title === \"string\") {\n const sanitizedTitle = sanitizePromptGuardText(record.title, true);\n title = sanitizedTitle.text;\n recordEntries += sanitizedTitle.diagnostics.entries;\n recordQuarantinedSegments += sanitizedTitle.diagnostics.quarantinedSegments;\n for (const entry of sanitizedTitle.entries) {\n auditEntries.push({\n ...entry,\n recordId: record.id,\n field: \"title\"\n });\n }\n }\n\n if (typeof record.content === \"string\") {\n const sanitizedContent = sanitizePromptGuardText(record.content, true);\n content = sanitizedContent.text;\n recordEntries += sanitizedContent.diagnostics.entries;\n recordQuarantinedSegments += sanitizedContent.diagnostics.quarantinedSegments;\n for (const entry of sanitizedContent.entries) {\n auditEntries.push({\n ...entry,\n recordId: record.id,\n field: \"content\"\n });\n }\n }\n\n totalQuarantinedSegments += recordQuarantinedSegments;\n\n return {\n ...record,\n ...(typeof title === \"string\" ? { title } : {}),\n ...(typeof content === \"string\" ? { content } : {}),\n attributes: withSecurityAttributes(record, true, recordEntries, recordQuarantinedSegments)\n };\n });\n\n return {\n records: guardedRecords,\n audit: {\n enabled,\n quarantinedSegments: enabled ? totalQuarantinedSegments : 0,\n entries: enabled ? auditEntries : []\n }\n };\n}\n","import { redactSensitive } from \"../core/logging\";\nimport { sanitizePromptGuardText } from \"./safety/prompt-guard\";\nimport type {\n BlockerActionHint,\n BlockerArtifactCaps,\n BlockerArtifactsV1,\n BlockerSignalV1,\n BlockerType,\n JsonValue,\n ProviderReasonCode\n} from \"./types\";\n\nconst AUTH_URL_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"redirect_login_flow\", regex: /\\/i\\/flow\\/login/i, confidence: 0.97 },\n { id: \"auth_login_path\", regex: /\\/(login|signin|sign-in|auth)(?:[./?]|$)/i, confidence: 0.9 }\n];\n\nconst AUTH_TITLE_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"title_login\", regex: /\\b(log ?in|sign ?in|login|signin)\\b/i, confidence: 0.92 },\n { id: \"title_auth_required\", regex: /authentication required/i, confidence: 0.9 }\n];\n\nconst CHALLENGE_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"challenge_keyword\", regex: /\\b(?:captcha|interstitial|cf_chl|recaptcha|hcaptcha|security challenge|browser challenge|bot check|bot detection)\\b/i, confidence: 0.88 },\n { id: \"complete_challenge_prompt\", regex: /\\b(?:complete|solve|pass) (?:the )?(?:security )?challenge\\b/i, confidence: 0.9 },\n { id: \"prove_humanity\", regex: /prove your humanity/i, confidence: 0.96 },\n { id: \"verify_humanity\", regex: /verify (?:you(?:'|’)re|you are) human/i, confidence: 0.96 },\n { id: \"robot_or_human\", regex: /robot or human/i, confidence: 0.98 },\n { id: \"confirm_human\", regex: /confirm that you(?:'|’)re human/i, confidence: 0.96 },\n { id: \"confirm_not_bot\", regex: /sign in to confirm (?:you(?:'|’)re|you are) not a bot/i, confidence: 0.96 },\n { id: \"click_and_hold\", regex: /\\b(?:click|press|tap|activate)\\s+(?:and\\s+)?hold\\b/i, confidence: 0.95 },\n { id: \"press_and_hold\", regex: /activate and hold the button/i, confidence: 0.95 },\n { id: \"drag_slider\", regex: /\\b(?:drag|slide|move)(?:\\s+the)?\\s+(?:slider|puzzle(?:\\s+piece)?|piece|button)\\b/i, confidence: 0.95 },\n { id: \"pardon_interruption\", regex: /pardon our interruption/i, confidence: 0.97 },\n { id: \"checking_browser_gate\", regex: /checking your browser before you access/i, confidence: 0.97 }\n];\n\nconst RECAPTCHA_HOST_PATTERNS = [/recaptcha/i, /hcaptcha/i, /challenges\\.cloudflare\\.com/i];\nconst STATIC_BLOCK_HOST_PATTERNS = [/redditstatic\\.com$/i, /abs\\.twimg\\.com$/i, /twimg\\.com$/i];\n\nconst ENV_LIMITED_PATTERNS = [\n /extension not connected/i,\n /connect the extension/i,\n /manual interaction/i,\n /timed out/i,\n /not available in this environment/i\n];\n\nconst RESTRICTED_TARGET_PATTERNS = [/^chrome:\\/\\//i, /^chrome-extension:\\/\\//i, /^about:blank$/i, /^devtools:\\/\\//i];\n\nexport const DEFAULT_BLOCKER_ARTIFACT_CAPS: BlockerArtifactCaps = {\n maxNetworkEvents: 20,\n maxConsoleEvents: 20,\n maxExceptionEvents: 10,\n maxHosts: 10,\n maxTextLength: 512\n};\n\nexport interface BlockerClassificationInput {\n source: BlockerSignalV1[\"source\"];\n url?: string;\n finalUrl?: string;\n title?: string;\n status?: number;\n providerErrorCode?: string;\n message?: string;\n matchedPatterns?: string[];\n networkHosts?: string[];\n traceRequestId?: string;\n retryable?: boolean;\n envLimited?: boolean;\n restrictedTarget?: boolean;\n promptGuardEnabled?: boolean;\n threshold?: number;\n detectedAt?: string;\n}\n\nexport interface BlockerArtifactInput {\n networkEvents?: unknown[];\n consoleEvents?: unknown[];\n exceptionEvents?: unknown[];\n promptGuardEnabled?: boolean;\n caps?: Partial<BlockerArtifactCaps>;\n}\n\nconst toLower = (value: string): string => value.trim().toLowerCase();\n\nconst clampNumber = (value: number, min: number, max: number): number => {\n if (!Number.isFinite(value)) return min;\n if (value < min) return min;\n if (value > max) return max;\n return value;\n};\n\nexport const clampBlockerConfidence = (value: number): number => {\n return clampNumber(value, 0, 1);\n};\n\nconst clampThreshold = (value: number | undefined): number => {\n if (typeof value !== \"number\") return 0.7;\n return clampNumber(value, 0, 1);\n};\n\nexport const clampText = (value: string | undefined, maxLength: number): string | undefined => {\n if (typeof value !== \"string\") return undefined;\n if (maxLength <= 0) return \"\";\n return value.length <= maxLength ? value : `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n};\n\nexport const boundedUniqueList = (\n values: readonly string[] | undefined,\n maxLength: number\n): string[] => {\n if (!values || values.length === 0 || maxLength <= 0) return [];\n const seen = new Set<string>();\n const list: string[] = [];\n for (const value of values) {\n if (typeof value !== \"string\") continue;\n const normalized = value.trim();\n if (!normalized) continue;\n const key = normalized.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n list.push(normalized);\n if (list.length >= maxLength) break;\n }\n return list;\n};\n\nconst extractHost = (value: string | undefined): string | null => {\n if (!value) return null;\n try {\n return toLower(new URL(value).hostname);\n } catch {\n return null;\n }\n};\n\nconst scorePatternMatches = (\n text: string,\n patterns: Array<{ id: string; regex: RegExp; confidence: number }>\n): { matched: string[]; confidence: number } => {\n const matched: string[] = [];\n let confidence = 0;\n for (const pattern of patterns) {\n if (!pattern.regex.test(text)) continue;\n matched.push(pattern.id);\n confidence = Math.max(confidence, pattern.confidence);\n }\n return { matched, confidence };\n};\n\nconst hasAnyPattern = (value: string, patterns: RegExp[]): boolean => {\n return patterns.some((pattern) => pattern.test(value));\n};\n\nconst isLoopbackHost = (value: string): boolean => {\n const normalized = toLower(value).replace(/^\\[|\\]$/g, \"\");\n if (!normalized) return false;\n if (normalized === \"localhost\" || normalized === \"::1\") return true;\n if (normalized === \"127.0.0.1\" || normalized.startsWith(\"127.\")) return true;\n return /^::ffff:127\\.\\d+\\.\\d+\\.\\d+$/.test(normalized);\n};\n\nconst buildHints = (type: BlockerType): BlockerActionHint[] => {\n switch (type) {\n case \"auth_required\":\n return [\n { id: \"manual_login\", reason: \"Authentication flow requires interactive login.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Headed mode can complete login and persist session state.\", priority: 2 },\n { id: \"switch_extension_mode\", reason: \"Extension mode can reuse an already logged-in browser profile.\", priority: 3 }\n ];\n case \"anti_bot_challenge\":\n return [\n { id: \"manual_challenge\", reason: \"Challenge page requires manual completion.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Headed mode improves challenge completion reliability.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Collect trace artifacts to compare challenge indicators before and after manual action.\", priority: 3 }\n ];\n case \"rate_limited\":\n return [\n { id: \"retry_after_backoff\", reason: \"Rate-limited responses should be retried after a bounded delay.\", priority: 1 },\n { id: \"collect_debug_trace\", reason: \"Trace data can confirm cooldown and request pacing behavior.\", priority: 2 }\n ];\n case \"upstream_block\":\n return [\n { id: \"retry_after_backoff\", reason: \"Upstream blocks may clear after network or host recovery.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Browser-assisted retrieval may bypass runtime fetch limitations.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Trace host evidence helps confirm blocked upstream dependencies.\", priority: 3 }\n ];\n case \"restricted_target\":\n return [\n { id: \"switch_managed_headed\", reason: \"Restricted internal targets require navigation to a normal http(s) tab.\", priority: 1 },\n { id: \"collect_debug_trace\", reason: \"Trace confirms blocked scheme or tab restriction source.\", priority: 2 }\n ];\n case \"env_limited\":\n return [\n { id: \"switch_extension_mode\", reason: \"Extension relay availability is required for this operation.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Managed headed mode is a deterministic fallback when extension is unavailable.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Diagnostics can confirm environment capability gaps.\", priority: 3 }\n ];\n case \"unknown\":\n return [{ id: \"collect_debug_trace\", reason: \"Additional trace evidence is required for reliable classification.\", priority: 1 }];\n }\n};\n\nconst classifyFromInputs = (\n input: BlockerClassificationInput,\n normalizedHosts: string[],\n matchedPatterns: string[]\n): { type: BlockerType; reasonCode?: ProviderReasonCode; confidence: number; retryable: boolean; matches: string[] } | null => {\n const status = input.status;\n const code = toLower(input.providerErrorCode ?? \"\");\n const url = input.url ?? \"\";\n const finalUrl = input.finalUrl ?? \"\";\n const title = input.title ?? \"\";\n const message = input.message ?? \"\";\n const challengeText = `${title} ${message}`;\n const urlSignals = `${url} ${finalUrl}`;\n const isUpstreamCode = code === \"upstream\" || code === \"network\" || code === \"unavailable\";\n const hasStaticBlockHost = normalizedHosts.some((host) => hasAnyPattern(host, STATIC_BLOCK_HOST_PATTERNS));\n const isLoopbackContext = [\n extractHost(url),\n extractHost(finalUrl),\n ...normalizedHosts\n ].some((host): host is string => typeof host === \"string\" && isLoopbackHost(host));\n\n const authMatches: string[] = [];\n let authConfidence = 0;\n if (status === 401 || status === 403) {\n authMatches.push(`status:${status}`);\n authConfidence = Math.max(authConfidence, status === 401 ? 0.94 : 0.9);\n }\n if (code === \"auth\") {\n authMatches.push(\"provider_code:auth\");\n authConfidence = Math.max(authConfidence, 0.9);\n }\n const authPathMatches = scorePatternMatches(`${url} ${finalUrl}`, AUTH_URL_PATTERNS);\n authMatches.push(...authPathMatches.matched);\n authConfidence = Math.max(authConfidence, authPathMatches.confidence);\n const authTitleMatches = scorePatternMatches(title, AUTH_TITLE_PATTERNS);\n authMatches.push(...authTitleMatches.matched);\n authConfidence = Math.max(authConfidence, authTitleMatches.confidence);\n if (authConfidence > 0) {\n return {\n type: \"auth_required\",\n reasonCode: \"token_required\",\n confidence: authConfidence,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, ...authMatches], 16)\n };\n }\n\n if (!isLoopbackContext) {\n const challengeMatches: string[] = [];\n let challengeConfidence = 0;\n const challengePatternMatches = scorePatternMatches(challengeText, CHALLENGE_PATTERNS);\n challengeMatches.push(...challengePatternMatches.matched);\n challengeConfidence = Math.max(challengeConfidence, challengePatternMatches.confidence);\n if (/(captcha|cf_chl|hcaptcha|recaptcha|interstitial)/i.test(urlSignals)) {\n challengeMatches.push(\"url:challenge_token\");\n challengeConfidence = Math.max(challengeConfidence, 0.9);\n }\n if (hasAnyPattern(title, CHALLENGE_PATTERNS.map((entry) => entry.regex)) && status === 200) {\n challengeMatches.push(\"status:200_challenge_title\");\n challengeConfidence = Math.max(challengeConfidence, 0.92);\n }\n if (normalizedHosts.some((host) => hasAnyPattern(host, RECAPTCHA_HOST_PATTERNS))) {\n challengeMatches.push(\"network:challenge_host\");\n challengeConfidence = Math.max(challengeConfidence, 0.96);\n }\n if (challengeConfidence > 0) {\n return {\n type: \"anti_bot_challenge\",\n reasonCode: \"challenge_detected\",\n confidence: challengeConfidence,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, ...challengeMatches], 16)\n };\n }\n }\n\n if (status === 429 || code === \"rate_limited\") {\n return {\n type: \"rate_limited\",\n reasonCode: \"rate_limited\",\n confidence: 0.95,\n retryable: true,\n matches: boundedUniqueList([...matchedPatterns, status === 429 ? \"status:429\" : \"provider_code:rate_limited\"], 16)\n };\n }\n\n if (isUpstreamCode && (hasStaticBlockHost || /retrieval failed/i.test(message) || (typeof status === \"number\" && status >= 500))) {\n return {\n type: \"upstream_block\",\n reasonCode: \"ip_blocked\",\n confidence: hasStaticBlockHost ? 0.9 : 0.8,\n retryable: input.retryable ?? true,\n matches: boundedUniqueList(\n [\n ...matchedPatterns,\n `provider_code:${code}`,\n ...(hasStaticBlockHost ? [\"network:blocked_static_host\"] : [])\n ],\n 16\n )\n };\n }\n\n if (\n input.restrictedTarget\n || RESTRICTED_TARGET_PATTERNS.some((pattern) => pattern.test(url))\n || RESTRICTED_TARGET_PATTERNS.some((pattern) => pattern.test(finalUrl))\n ) {\n return {\n type: \"restricted_target\",\n confidence: 0.92,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, \"restricted_target\"], 16)\n };\n }\n\n if (input.envLimited || (code === \"unavailable\" && ENV_LIMITED_PATTERNS.some((pattern) => pattern.test(message)))) {\n return {\n type: \"env_limited\",\n reasonCode: \"env_limited\",\n confidence: input.envLimited ? 0.9 : 0.78,\n retryable: true,\n matches: boundedUniqueList([...matchedPatterns, \"env_limited\"], 16)\n };\n }\n\n if (status || code || title || message || normalizedHosts.length > 0) {\n return {\n type: \"unknown\",\n confidence: 0.5,\n retryable: input.retryable ?? false,\n matches: boundedUniqueList(matchedPatterns, 16)\n };\n }\n\n return null;\n};\n\nconst coerceJsonValue = (\n value: unknown,\n maxTextLength: number,\n promptGuardEnabled: boolean,\n diagnostics: { entries: number; quarantinedSegments: number },\n seen: WeakSet<object>\n): JsonValue => {\n if (value === null || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n const sanitized = sanitizePromptGuardText(value, promptGuardEnabled);\n diagnostics.entries += sanitized.diagnostics.entries;\n diagnostics.quarantinedSegments += sanitized.diagnostics.quarantinedSegments;\n const redacted = redactSensitive(sanitized.text);\n const asString = typeof redacted === \"string\" ? redacted : String(redacted);\n return clampText(asString, maxTextLength) ?? \"\";\n }\n\n if (Array.isArray(value)) {\n return value.slice(0, 20).map((entry) => coerceJsonValue(entry, maxTextLength, promptGuardEnabled, diagnostics, seen));\n }\n\n if (typeof value !== \"object\") {\n return String(value);\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n const objectValue = value as Record<string, unknown>;\n const entries = Object.entries(objectValue).slice(0, 30);\n const output: Record<string, JsonValue> = {};\n for (const [key, entryValue] of entries) {\n output[key] = coerceJsonValue(entryValue, maxTextLength, promptGuardEnabled, diagnostics, seen);\n }\n return output;\n};\n\nconst coerceEventList = (\n values: unknown[] | undefined,\n maxItems: number,\n maxTextLength: number,\n promptGuardEnabled: boolean,\n diagnostics: { entries: number; quarantinedSegments: number }\n): Array<Record<string, JsonValue>> => {\n if (!Array.isArray(values) || maxItems <= 0) return [];\n return values.slice(-maxItems).map((entry) => {\n const sanitized = coerceJsonValue(\n redactSensitive(entry),\n maxTextLength,\n promptGuardEnabled,\n diagnostics,\n new WeakSet<object>()\n );\n if (!sanitized || typeof sanitized !== \"object\" || Array.isArray(sanitized)) {\n return { value: sanitized };\n }\n return sanitized as Record<string, JsonValue>;\n });\n};\n\nexport const resolveBlockerArtifactCaps = (\n partial: Partial<BlockerArtifactCaps> | undefined\n): BlockerArtifactCaps => {\n return {\n maxNetworkEvents: clampNumber(partial?.maxNetworkEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxNetworkEvents, 1, 500),\n maxConsoleEvents: clampNumber(partial?.maxConsoleEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxConsoleEvents, 1, 500),\n maxExceptionEvents: clampNumber(partial?.maxExceptionEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxExceptionEvents, 1, 200),\n maxHosts: clampNumber(partial?.maxHosts ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxHosts, 1, 200),\n maxTextLength: clampNumber(partial?.maxTextLength ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxTextLength, 32, 4096)\n };\n};\n\nexport const classifyBlockerSignal = (\n input: BlockerClassificationInput\n): BlockerSignalV1 | null => {\n const promptGuardEnabled = input.promptGuardEnabled ?? true;\n const titleSanitized = sanitizePromptGuardText(input.title ?? \"\", promptGuardEnabled);\n const messageSanitized = sanitizePromptGuardText(input.message ?? \"\", promptGuardEnabled);\n const matchedPatterns = boundedUniqueList(input.matchedPatterns, 16);\n const normalizedHosts = boundedUniqueList(input.networkHosts?.map(toLower), 20);\n\n const classification = classifyFromInputs({\n ...input,\n title: titleSanitized.text,\n message: messageSanitized.text\n }, normalizedHosts, matchedPatterns);\n if (!classification) {\n return null;\n }\n\n const threshold = clampThreshold(input.threshold);\n const confidence = clampBlockerConfidence(classification.confidence);\n if (confidence < threshold) {\n return null;\n }\n\n const evidence = {\n ...(input.url ? { url: clampText(input.url, 512) } : {}),\n ...(input.finalUrl ? { finalUrl: clampText(input.finalUrl, 512) } : {}),\n ...(titleSanitized.text ? { title: clampText(titleSanitized.text, 512) } : {}),\n ...(typeof input.status === \"number\" ? { status: input.status } : {}),\n ...(input.providerErrorCode ? { providerErrorCode: input.providerErrorCode } : {}),\n matchedPatterns: boundedUniqueList(classification.matches, 16),\n networkHosts: boundedUniqueList(normalizedHosts, 10),\n ...(input.traceRequestId ? { traceRequestId: input.traceRequestId } : {})\n };\n\n const sanitationEntries = titleSanitized.diagnostics.entries + messageSanitized.diagnostics.entries;\n const sanitationQuarantined = titleSanitized.diagnostics.quarantinedSegments + messageSanitized.diagnostics.quarantinedSegments;\n\n return {\n schemaVersion: \"1.0\",\n type: classification.type,\n source: input.source,\n ...(classification.reasonCode ? { reasonCode: classification.reasonCode } : {}),\n confidence,\n retryable: classification.retryable,\n detectedAt: input.detectedAt ?? new Date().toISOString(),\n evidence,\n actionHints: buildHints(classification.type),\n ...(sanitationEntries > 0 || sanitationQuarantined > 0\n ? {\n sanitation: {\n entries: sanitationEntries,\n quarantinedSegments: sanitationQuarantined\n }\n }\n : {})\n };\n};\n\nexport const buildBlockerArtifacts = (input: BlockerArtifactInput): BlockerArtifactsV1 => {\n const caps = resolveBlockerArtifactCaps(input.caps);\n const promptGuardEnabled = input.promptGuardEnabled ?? true;\n const diagnostics = {\n entries: 0,\n quarantinedSegments: 0\n };\n\n const network = coerceEventList(\n input.networkEvents,\n caps.maxNetworkEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n const console = coerceEventList(\n input.consoleEvents,\n caps.maxConsoleEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n const exception = coerceEventList(\n input.exceptionEvents,\n caps.maxExceptionEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n\n const hosts = boundedUniqueList(\n network\n .map((event) => (typeof event.url === \"string\" ? extractHost(event.url) : null))\n .filter((host): host is string => typeof host === \"string\"),\n caps.maxHosts\n );\n\n return {\n schemaVersion: \"1.0\",\n network,\n console,\n exception,\n hosts,\n sanitation: diagnostics\n };\n};\n\nexport const __test__ = {\n classifyFromInputs,\n extractHost,\n hasAnyPattern,\n clampThreshold,\n isLoopbackHost\n};\n","import { classifyBlockerSignal } from \"./blocker\";\nimport { isProviderReasonCode } from \"./errors\";\nimport type {\n BlockerSignalV1,\n BlockerType,\n JsonValue,\n NormalizedRecord,\n ProviderConstraint,\n ProviderConstraintKind,\n ProviderReasonCode\n} from \"./types\";\n\nexport interface ProviderIssueHint {\n reasonCode: ProviderReasonCode;\n blockerType?: BlockerType;\n constraint?: ProviderConstraint;\n}\n\nexport interface ProviderNextStepGuidance {\n [key: string]: JsonValue;\n reason: string;\n recommendedNextCommands: string[];\n}\n\nexport interface ProviderIssueSummary extends ProviderIssueHint {\n provider?: string;\n summary: string;\n guidance?: ProviderNextStepGuidance;\n}\n\nconst BLOCKER_TYPES = new Set<BlockerType>([\n \"auth_required\",\n \"anti_bot_challenge\",\n \"rate_limited\",\n \"upstream_block\",\n \"restricted_target\",\n \"env_limited\",\n \"unknown\"\n]);\n\nconst CONSTRAINT_KINDS = new Set<ProviderConstraintKind>([\n \"session_required\",\n \"render_required\"\n]);\n\nconst RENDER_REQUIRED_SHELLS = new Set<string>([\n \"bestbuy_international_gate\",\n \"bestbuy_pdp_error_shell\",\n \"duckduckgo_non_js_redirect\",\n \"macys_access_denied_shell\",\n \"social_first_party_help_shell\",\n \"social_js_required_shell\",\n \"social_render_shell\",\n \"target_shell_page\",\n \"temu_empty_shell\"\n]);\n\nconst CHALLENGE_SHELLS = new Set<string>([\"social_verification_wall\", \"temu_challenge_shell\"]);\n\nconst toNonEmptyString = (value: unknown): string | undefined => {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n};\n\nconst normalizeBlockerType = (value: unknown): BlockerType | undefined => {\n return typeof value === \"string\" && BLOCKER_TYPES.has(value as BlockerType)\n ? value as BlockerType\n : undefined;\n};\n\nconst buildConstraint = (\n kind: ProviderConstraintKind,\n evidenceCode: string,\n providerShell?: string,\n message?: string\n): ProviderConstraint => ({\n kind,\n evidenceCode,\n ...(providerShell ? { providerShell } : {}),\n ...(message ? { message } : {})\n});\n\nexport const isProviderConstraint = (value: unknown): value is ProviderConstraint => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return CONSTRAINT_KINDS.has(candidate.kind as ProviderConstraintKind)\n && typeof candidate.evidenceCode === \"string\"\n && candidate.evidenceCode.trim().length > 0\n && (candidate.providerShell === undefined || typeof candidate.providerShell === \"string\")\n && (candidate.message === undefined || typeof candidate.message === \"string\");\n};\n\nexport const classifyProviderIssue = (input: {\n url?: string;\n title?: string;\n message?: string;\n providerShell?: string;\n browserRequired?: boolean;\n status?: number;\n providerErrorCode?: string;\n source?: BlockerSignalV1[\"source\"];\n retryable?: boolean;\n}): ProviderIssueHint | null => {\n const providerShell = toNonEmptyString(input.providerShell);\n const message = toNonEmptyString(input.message);\n\n if (providerShell && CHALLENGE_SHELLS.has(providerShell)) {\n return {\n reasonCode: \"challenge_detected\",\n blockerType: \"anti_bot_challenge\"\n };\n }\n\n if (providerShell && RENDER_REQUIRED_SHELLS.has(providerShell)) {\n return {\n reasonCode: \"env_limited\",\n blockerType: \"env_limited\",\n constraint: buildConstraint(\"render_required\", providerShell, providerShell, message)\n };\n }\n\n const blocker = classifyBlockerSignal({\n source: input.source ?? \"runtime_fetch\",\n ...(input.url ? { url: input.url, finalUrl: input.url } : {}),\n ...(input.title ? { title: input.title } : {}),\n ...(message ? { message } : {}),\n ...(typeof input.status === \"number\" ? { status: input.status } : {}),\n ...(input.providerErrorCode ? { providerErrorCode: input.providerErrorCode } : {}),\n ...(typeof input.retryable === \"boolean\" ? { retryable: input.retryable } : {}),\n envLimited: input.browserRequired === true\n });\n\n if (blocker?.type === \"auth_required\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies token_required for auth_required blockers */\n reasonCode: blocker.reasonCode ?? \"token_required\",\n blockerType: blocker.type,\n constraint: buildConstraint(\"session_required\", providerShell ?? \"auth_required\", providerShell, message)\n };\n }\n\n if (blocker?.type === \"anti_bot_challenge\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies challenge_detected for anti-bot blockers */\n reasonCode: blocker.reasonCode ?? \"challenge_detected\",\n blockerType: blocker.type\n };\n }\n\n if (input.browserRequired === true) {\n return {\n /* c8 ignore next -- browserRequired inputs always classify to a blocker payload in the shared classifier */\n reasonCode: blocker?.reasonCode ?? \"env_limited\",\n /* c8 ignore next -- browserRequired fallbacks only normalize unknown blocker types */\n blockerType: blocker?.type === \"unknown\" ? \"env_limited\" : blocker?.type,\n /* c8 ignore next -- providerShell or blocker type always survives before the defensive browser_required fallback */\n constraint: buildConstraint(\"render_required\", providerShell ?? blocker?.type ?? \"browser_required\", providerShell, message)\n };\n }\n\n if (blocker?.type === \"env_limited\") {\n return {\n /* c8 ignore next -- classifyBlockerSignal always supplies env_limited for env_limited blockers */\n reasonCode: blocker.reasonCode ?? \"env_limited\",\n blockerType: blocker.type\n };\n }\n\n return null;\n};\n\nexport const readProviderIssueHint = (args: {\n reasonCode?: unknown;\n blockerType?: unknown;\n code?: unknown;\n message?: unknown;\n details?: Record<string, unknown> | undefined;\n}): ProviderIssueHint | null => {\n const details = args.details;\n const reasonCode = isProviderReasonCode(args.reasonCode)\n ? args.reasonCode\n : (isProviderReasonCode(details?.reasonCode) ? details.reasonCode : undefined);\n const blockerType = normalizeBlockerType(args.blockerType ?? details?.blockerType);\n const constraint = isProviderConstraint(details?.constraint)\n ? details.constraint\n : undefined;\n\n if (reasonCode || blockerType || constraint) {\n return {\n reasonCode: reasonCode\n ?? (constraint?.kind === \"session_required\" ? \"token_required\" : \"env_limited\"),\n ...(blockerType ? { blockerType } : {}),\n ...(constraint ? { constraint } : {})\n };\n }\n\n return classifyProviderIssue({\n url: toNonEmptyString(details?.url),\n title: toNonEmptyString(details?.title),\n message: toNonEmptyString(details?.message ?? args.message),\n providerShell: toNonEmptyString(details?.providerShell),\n browserRequired: details?.browserRequired === true,\n providerErrorCode: toNonEmptyString(args.code),\n source: \"runtime_fetch\"\n });\n};\n\nexport const readProviderIssueHintFromRecord = (\n record: Pick<NormalizedRecord, \"url\" | \"title\" | \"content\" | \"attributes\">\n): ProviderIssueHint | null => {\n const details = record.attributes as Record<string, unknown>;\n return readProviderIssueHint({\n reasonCode: details.reasonCode,\n blockerType: details.blockerType,\n message: record.content,\n details: {\n url: record.url,\n title: record.title,\n message: record.content,\n providerShell: details.providerShell,\n browserRequired: details.browserRequired,\n constraint: details.constraint\n }\n });\n};\n\nexport const applyProviderIssueHint = (\n details: Record<string, JsonValue> | undefined,\n hint: ProviderIssueHint | null\n): Record<string, JsonValue> | undefined => {\n if (!hint) return details;\n const next: Record<string, JsonValue> = {\n ...(details ?? {}),\n reasonCode: hint.reasonCode\n };\n if (hint.blockerType && typeof next.blockerType !== \"string\") {\n next.blockerType = hint.blockerType;\n }\n if (hint.constraint && !isProviderConstraint(next.constraint)) {\n next.constraint = hint.constraint;\n }\n if (typeof next.guidance === \"undefined\") {\n const guidance = buildProviderIssueGuidance({ hint, details: next });\n if (guidance) {\n next.guidance = guidance;\n }\n }\n return next;\n};\n\nconst providerLabel = (provider: string | undefined): string => {\n const normalized = toNonEmptyString(provider);\n if (!normalized) return \"Provider\";\n const separator = normalized.lastIndexOf(\"/\");\n const tail = separator >= 0 ? normalized.slice(separator + 1) : normalized;\n return tail.charAt(0).toUpperCase() + tail.slice(1);\n};\n\nconst hasPreservedBrowserState = (details: Record<string, JsonValue> | undefined): boolean => {\n return typeof details?.preservedSessionId === \"string\" || typeof details?.preservedTargetId === \"string\";\n};\n\nconst buildGuidance = (\n reason: string,\n recommendedNextCommands: string[]\n): ProviderNextStepGuidance => ({\n reason,\n recommendedNextCommands\n});\n\nconst buildAuthGuidance = (\n subject: string,\n preservedBrowserState: boolean\n): ProviderNextStepGuidance => {\n return preservedBrowserState\n ? buildGuidance(\n `${subject} preserved browser state that can finish authentication.`,\n [\n \"Complete the login or account checkpoint in the preserved browser session.\",\n \"Rerun the same provider or workflow after the session is fully authenticated.\"\n ]\n )\n : buildGuidance(\n `${subject} needs an authenticated session before retrying.`,\n [\n \"Reuse an authenticated browser session, import logged-in cookies, or use the provider sign-in flow.\",\n \"Rerun the same provider or workflow once the session is active.\"\n ]\n );\n};\n\nconst buildChallengeGuidance = (\n subject: string,\n preservedBrowserState: boolean\n): ProviderNextStepGuidance => {\n return preservedBrowserState\n ? buildGuidance(\n `${subject} preserved browser state that can complete the current challenge.`,\n [\n \"Finish the login or anti-bot challenge in the preserved browser session.\",\n \"Rerun the same provider or workflow after the page unlocks.\"\n ]\n )\n : buildGuidance(\n `${subject} hit a challenge that still needs browser-assisted follow-up.`,\n [\n \"Retry with browser assistance so the challenge can be completed interactively.\",\n \"Only ask for manual credentials if browser-assisted recovery still cannot unlock the page.\"\n ]\n );\n};\n\nconst buildRenderGuidance = (\n subject: string,\n preservedBrowserState: boolean,\n constraint?: ProviderConstraint\n): ProviderNextStepGuidance => {\n if (constraint?.providerShell === \"bestbuy_international_gate\") {\n return buildGuidance(\n `${subject} needs the Best Buy country-selection interstitial cleared before retrying.`,\n [\n \"Choose the shopping country or region in the preserved browser session.\",\n \"Rerun the same provider or workflow after the Best Buy PDP or search results are visible.\"\n ]\n );\n }\n if (constraint?.providerShell === \"bestbuy_pdp_error_shell\") {\n return buildGuidance(\n `${subject} needs a valid Best Buy product detail page before retrying.`,\n [\n \"Open the Best Buy product URL in the preserved browser session and confirm the PDP is visible.\",\n \"Rerun the workflow after the product title, price, and media are visible instead of the generic error page.\"\n ]\n );\n }\n return preservedBrowserState\n ? buildGuidance(\n `${subject} still needs a live browser-rendered page, but browser state is already preserved.`,\n [\n \"Inspect the preserved browser session until usable content is visible.\",\n \"Rerun the same provider or workflow after the rendered page is ready.\"\n ]\n )\n : buildGuidance(\n `${subject} needs a live browser-rendered page before retrying.`,\n [\n \"Retry with browser assistance or a headed browser session.\",\n \"Rerun the same provider or workflow after the rendered page is ready.\"\n ]\n );\n};\n\nexport const buildProviderIssueGuidance = (args: {\n provider?: string;\n hint: ProviderIssueHint;\n details?: Record<string, JsonValue>;\n}): ProviderNextStepGuidance | undefined => {\n const subject = providerLabel(args.provider);\n const preservedBrowserState = hasPreservedBrowserState(args.details);\n const disposition = toNonEmptyString(args.details?.disposition);\n if (disposition === \"completed\") return undefined;\n if (disposition === \"challenge_preserved\") {\n return buildChallengeGuidance(subject, true);\n }\n if (args.hint.reasonCode === \"token_required\" || args.hint.reasonCode === \"auth_required\") {\n return buildAuthGuidance(subject, preservedBrowserState);\n }\n if (args.hint.reasonCode === \"challenge_detected\") {\n return buildChallengeGuidance(subject, preservedBrowserState);\n }\n if (args.hint.constraint?.kind === \"render_required\" || args.hint.reasonCode === \"env_limited\") {\n return buildRenderGuidance(subject, preservedBrowserState, args.hint.constraint);\n }\n return undefined;\n};\n\nconst summaryPriority = (hint: ProviderIssueHint): number => {\n /* c8 ignore next -- providerLabel always passes a concrete tail string into this helper */\n if (hint.reasonCode === \"token_required\" || hint.reasonCode === \"auth_required\") return 3;\n if (hint.reasonCode === \"challenge_detected\") return 2;\n if (hint.constraint?.kind === \"render_required\") return 1;\n return 0;\n};\n\nconst summarizeRenderConstraint = (\n subject: string,\n constraint?: ProviderConstraint\n): string => {\n if (constraint?.providerShell === \"bestbuy_international_gate\") {\n return `${subject} is blocked by the Best Buy country-selection interstitial.`;\n }\n if (constraint?.providerShell === \"bestbuy_pdp_error_shell\") {\n return `${subject} is blocked by a Best Buy product-detail error shell.`;\n }\n return `${subject} requires a live browser-rendered page.`;\n};\n\nexport const summarizeProviderIssue = (args: {\n provider?: string;\n hint: ProviderIssueHint;\n}): string => {\n const subject = providerLabel(args.provider);\n if (args.hint.reasonCode === \"token_required\" || args.hint.reasonCode === \"auth_required\") {\n return `${subject} requires login or an existing session.`;\n }\n if (args.hint.reasonCode === \"challenge_detected\") {\n return `${subject} hit an anti-bot challenge that requires manual completion.`;\n }\n if (args.hint.constraint?.kind === \"render_required\") {\n return summarizeRenderConstraint(subject, args.hint.constraint);\n }\n return `${subject} requires manual browser follow-up; this run did not determine whether login or page rendering is required.`;\n};\n\nexport const summarizePrimaryProviderIssue = (\n failures: Array<{ provider?: string; error?: { reasonCode?: unknown; code?: unknown; message?: unknown; details?: Record<string, unknown> } }> | undefined\n): ProviderIssueSummary | null => {\n if (!Array.isArray(failures) || failures.length === 0) return null;\n let best: ProviderIssueSummary | null = null;\n\n for (const failure of failures) {\n const hint = readProviderIssueHint({\n reasonCode: failure.error?.reasonCode,\n code: failure.error?.code,\n message: failure.error?.message,\n details: failure.error?.details\n });\n if (!hint) continue;\n const summary = summarizeProviderIssue({ provider: failure.provider, hint });\n const guidance = buildProviderIssueGuidance({\n provider: failure.provider,\n hint,\n details: failure.error?.details as Record<string, JsonValue> | undefined\n });\n const candidate: ProviderIssueSummary = {\n provider: failure.provider,\n summary,\n ...hint,\n ...(guidance ? { guidance } : {})\n };\n if (!best || summaryPriority(candidate) > summaryPriority(best)) {\n best = candidate;\n }\n }\n\n return best;\n};\n"],"mappings":"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","names":["console"]}
|