opendevbrowser 0.0.15 → 0.0.17
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/LICENSE +1 -1
- package/README.md +262 -43
- package/dist/annotate/direct-annotator.d.ts +22 -0
- package/dist/annotate/direct-annotator.d.ts.map +1 -0
- package/dist/annotate/output.d.ts +10 -0
- package/dist/annotate/output.d.ts.map +1 -0
- package/dist/browser/annotation-manager.d.ts +33 -0
- package/dist/browser/annotation-manager.d.ts.map +1 -0
- package/dist/browser/browser-manager.d.ts +402 -0
- package/dist/browser/browser-manager.d.ts.map +1 -0
- package/dist/browser/canvas-client.d.ts +53 -0
- package/dist/browser/canvas-client.d.ts.map +1 -0
- package/dist/browser/canvas-code-sync-manager.d.ts +79 -0
- package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
- package/dist/browser/canvas-manager.d.ts +94 -0
- package/dist/browser/canvas-manager.d.ts.map +1 -0
- package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
- package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
- package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
- package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
- package/dist/browser/fingerprint/adapters.d.ts +26 -0
- package/dist/browser/fingerprint/adapters.d.ts.map +1 -0
- package/dist/browser/fingerprint/canary.d.ts +25 -0
- package/dist/browser/fingerprint/canary.d.ts.map +1 -0
- package/dist/browser/fingerprint/profiles.d.ts +16 -0
- package/dist/browser/fingerprint/profiles.d.ts.map +1 -0
- package/dist/browser/fingerprint/tier1-coherence.d.ts +36 -0
- package/dist/browser/fingerprint/tier1-coherence.d.ts.map +1 -0
- package/dist/browser/fingerprint/tier2-runtime.d.ts +40 -0
- package/dist/browser/fingerprint/tier2-runtime.d.ts.map +1 -0
- package/dist/browser/fingerprint/tier3-adaptive.d.ts +30 -0
- package/dist/browser/fingerprint/tier3-adaptive.d.ts.map +1 -0
- package/dist/browser/manager-types.d.ts +15 -0
- package/dist/browser/manager-types.d.ts.map +1 -0
- package/dist/browser/ops-browser-manager.d.ts +141 -0
- package/dist/browser/ops-browser-manager.d.ts.map +1 -0
- package/dist/browser/ops-client.d.ts +56 -0
- package/dist/browser/ops-client.d.ts.map +1 -0
- package/dist/browser/parallelism-governor.d.ts +31 -0
- package/dist/browser/parallelism-governor.d.ts.map +1 -0
- package/dist/browser/script-runner.d.ts +23 -0
- package/dist/browser/script-runner.d.ts.map +1 -0
- package/dist/browser/session-store.d.ts +63 -0
- package/dist/browser/session-store.d.ts.map +1 -0
- package/dist/browser/target-manager.d.ts +36 -0
- package/dist/browser/target-manager.d.ts.map +1 -0
- package/dist/cache/chrome-locator.d.ts +2 -0
- package/dist/cache/chrome-locator.d.ts.map +1 -0
- package/dist/cache/downloader.d.ts +6 -0
- package/dist/cache/downloader.d.ts.map +1 -0
- package/dist/cache/paths.d.ts +9 -0
- package/dist/cache/paths.d.ts.map +1 -0
- package/dist/canvas/code-sync/apply-tsx.d.ts +23 -0
- package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
- package/dist/canvas/code-sync/graph.d.ts +5 -0
- package/dist/canvas/code-sync/graph.d.ts.map +1 -0
- package/dist/canvas/code-sync/hash.d.ts +3 -0
- package/dist/canvas/code-sync/hash.d.ts.map +1 -0
- package/dist/canvas/code-sync/import.d.ts +18 -0
- package/dist/canvas/code-sync/import.d.ts.map +1 -0
- package/dist/canvas/code-sync/manifest.d.ts +5 -0
- package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
- package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
- package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
- package/dist/canvas/code-sync/types.d.ts +152 -0
- package/dist/canvas/code-sync/types.d.ts.map +1 -0
- package/dist/canvas/code-sync/write.d.ts +9 -0
- package/dist/canvas/code-sync/write.d.ts.map +1 -0
- package/dist/canvas/document-store.d.ts +81 -0
- package/dist/canvas/document-store.d.ts.map +1 -0
- package/dist/canvas/export.d.ts +12 -0
- package/dist/canvas/export.d.ts.map +1 -0
- package/dist/canvas/repo-store.d.ts +10 -0
- package/dist/canvas/repo-store.d.ts.map +1 -0
- package/dist/canvas/surface-palette.d.ts +15 -0
- package/dist/canvas/surface-palette.d.ts.map +1 -0
- package/dist/canvas/types.d.ts +255 -0
- package/dist/canvas/types.d.ts.map +1 -0
- package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
- package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
- package/dist/chunk-5J3IFL3X.js +16706 -0
- package/dist/chunk-5J3IFL3X.js.map +1 -0
- package/dist/chunk-D633UO34.js +8149 -0
- package/dist/chunk-D633UO34.js.map +1 -0
- package/dist/chunk-FUSXMW3G.js +169 -0
- package/dist/chunk-FUSXMW3G.js.map +1 -0
- package/dist/chunk-TBUCZX4A.js +34 -0
- package/dist/chunk-TBUCZX4A.js.map +1 -0
- package/dist/chunk-V7KUDHDG.js +276 -0
- package/dist/chunk-V7KUDHDG.js.map +1 -0
- package/dist/chunk-Y2KL55OG.js +59 -0
- package/dist/chunk-Y2KL55OG.js.map +1 -0
- package/dist/cli/args.d.ts +25 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/client.d.ts +2 -0
- package/dist/cli/client.d.ts.map +1 -0
- package/dist/cli/commands/annotate.d.ts +38 -0
- package/dist/cli/commands/annotate.d.ts.map +1 -0
- package/dist/cli/commands/artifacts.d.ts +24 -0
- package/dist/cli/commands/artifacts.d.ts.map +1 -0
- package/dist/cli/commands/canvas.d.ts +45 -0
- package/dist/cli/commands/canvas.d.ts.map +1 -0
- package/dist/cli/commands/daemon.d.ts +35 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/devtools/console-poll.d.ts +7 -0
- package/dist/cli/commands/devtools/console-poll.d.ts.map +1 -0
- package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts +20 -0
- package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts.map +1 -0
- package/dist/cli/commands/devtools/network-poll.d.ts +7 -0
- package/dist/cli/commands/devtools/network-poll.d.ts.map +1 -0
- package/dist/cli/commands/devtools/perf.d.ts +7 -0
- package/dist/cli/commands/devtools/perf.d.ts.map +1 -0
- package/dist/cli/commands/devtools/screenshot.d.ts +18 -0
- package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -0
- package/dist/cli/commands/dom/attr.d.ts +7 -0
- package/dist/cli/commands/dom/attr.d.ts.map +1 -0
- package/dist/cli/commands/dom/checked.d.ts +7 -0
- package/dist/cli/commands/dom/checked.d.ts.map +1 -0
- package/dist/cli/commands/dom/enabled.d.ts +7 -0
- package/dist/cli/commands/dom/enabled.d.ts.map +1 -0
- package/dist/cli/commands/dom/html.d.ts +7 -0
- package/dist/cli/commands/dom/html.d.ts.map +1 -0
- package/dist/cli/commands/dom/text.d.ts +7 -0
- package/dist/cli/commands/dom/text.d.ts.map +1 -0
- package/dist/cli/commands/dom/value.d.ts +7 -0
- package/dist/cli/commands/dom/value.d.ts.map +1 -0
- package/dist/cli/commands/dom/visible.d.ts +7 -0
- package/dist/cli/commands/dom/visible.d.ts.map +1 -0
- package/dist/cli/commands/export/clone-component.d.ts +16 -0
- package/dist/cli/commands/export/clone-component.d.ts.map +1 -0
- package/dist/cli/commands/export/clone-page.d.ts +15 -0
- package/dist/cli/commands/export/clone-page.d.ts.map +1 -0
- package/dist/cli/commands/interact/check.d.ts +7 -0
- package/dist/cli/commands/interact/check.d.ts.map +1 -0
- package/dist/cli/commands/interact/click.d.ts +7 -0
- package/dist/cli/commands/interact/click.d.ts.map +1 -0
- package/dist/cli/commands/interact/hover.d.ts +7 -0
- package/dist/cli/commands/interact/hover.d.ts.map +1 -0
- package/dist/cli/commands/interact/press.d.ts +7 -0
- package/dist/cli/commands/interact/press.d.ts.map +1 -0
- package/dist/cli/commands/interact/scroll-into-view.d.ts +7 -0
- package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -0
- package/dist/cli/commands/interact/scroll.d.ts +7 -0
- package/dist/cli/commands/interact/scroll.d.ts.map +1 -0
- package/dist/cli/commands/interact/select.d.ts +7 -0
- package/dist/cli/commands/interact/select.d.ts.map +1 -0
- package/dist/cli/commands/interact/type.d.ts +7 -0
- package/dist/cli/commands/interact/type.d.ts.map +1 -0
- package/dist/cli/commands/interact/uncheck.d.ts +7 -0
- package/dist/cli/commands/interact/uncheck.d.ts.map +1 -0
- package/dist/cli/commands/macro-resolve.d.ts +18 -0
- package/dist/cli/commands/macro-resolve.d.ts.map +1 -0
- package/dist/cli/commands/native.d.ts +93 -0
- package/dist/cli/commands/native.d.ts.map +1 -0
- package/dist/cli/commands/nav/goto.d.ts +7 -0
- package/dist/cli/commands/nav/goto.d.ts.map +1 -0
- package/dist/cli/commands/nav/snapshot.d.ts +7 -0
- package/dist/cli/commands/nav/snapshot.d.ts.map +1 -0
- package/dist/cli/commands/nav/wait.d.ts +7 -0
- package/dist/cli/commands/nav/wait.d.ts.map +1 -0
- package/dist/cli/commands/pages/close.d.ts +6 -0
- package/dist/cli/commands/pages/close.d.ts.map +1 -0
- package/dist/cli/commands/pages/list.d.ts +7 -0
- package/dist/cli/commands/pages/list.d.ts.map +1 -0
- package/dist/cli/commands/pages/open.d.ts +7 -0
- package/dist/cli/commands/pages/open.d.ts.map +1 -0
- package/dist/cli/commands/product-video.d.ts +25 -0
- package/dist/cli/commands/product-video.d.ts.map +1 -0
- package/dist/cli/commands/registry.d.ts +5 -0
- package/dist/cli/commands/registry.d.ts.map +1 -0
- package/dist/cli/commands/research.d.ts +27 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/rpc.d.ts +28 -0
- package/dist/cli/commands/rpc.d.ts.map +1 -0
- package/dist/cli/commands/run.d.ts +17 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/serve.d.ts +64 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/session/connect.d.ts +9 -0
- package/dist/cli/commands/session/connect.d.ts.map +1 -0
- package/dist/cli/commands/session/cookie-import.d.ts +31 -0
- package/dist/cli/commands/session/cookie-import.d.ts.map +1 -0
- package/dist/cli/commands/session/cookie-list.d.ts +17 -0
- package/dist/cli/commands/session/cookie-list.d.ts.map +1 -0
- package/dist/cli/commands/session/disconnect.d.ts +6 -0
- package/dist/cli/commands/session/disconnect.d.ts.map +1 -0
- package/dist/cli/commands/session/launch.d.ts +29 -0
- package/dist/cli/commands/session/launch.d.ts.map +1 -0
- package/dist/cli/commands/session/status.d.ts +7 -0
- package/dist/cli/commands/session/status.d.ts.map +1 -0
- package/dist/cli/commands/shopping.d.ts +25 -0
- package/dist/cli/commands/shopping.d.ts.map +1 -0
- package/dist/cli/commands/status.d.ts +24 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/targets/close.d.ts +6 -0
- package/dist/cli/commands/targets/close.d.ts.map +1 -0
- package/dist/cli/commands/targets/list.d.ts +7 -0
- package/dist/cli/commands/targets/list.d.ts.map +1 -0
- package/dist/cli/commands/targets/new.d.ts +7 -0
- package/dist/cli/commands/targets/new.d.ts.map +1 -0
- package/dist/cli/commands/targets/use.d.ts +7 -0
- package/dist/cli/commands/targets/use.d.ts.map +1 -0
- package/dist/cli/commands/types.d.ts +13 -0
- package/dist/cli/commands/types.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +14 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/update.d.ts +7 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/daemon-autostart.d.ts +46 -0
- package/dist/cli/daemon-autostart.d.ts.map +1 -0
- package/dist/cli/daemon-client.d.ts +33 -0
- package/dist/cli/daemon-client.d.ts.map +1 -0
- package/dist/cli/daemon-commands.d.ts +7 -0
- package/dist/cli/daemon-commands.d.ts.map +1 -0
- package/dist/cli/daemon-state.d.ts +56 -0
- package/dist/cli/daemon-state.d.ts.map +1 -0
- package/dist/cli/daemon-status.d.ts +19 -0
- package/dist/cli/daemon-status.d.ts.map +1 -0
- package/dist/cli/daemon.d.ts +29 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/errors.d.ts +20 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/help.d.ts +33 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2825 -326
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installers/global.d.ts +9 -0
- package/dist/cli/installers/global.d.ts.map +1 -0
- package/dist/cli/installers/local.d.ts +9 -0
- package/dist/cli/installers/local.d.ts.map +1 -0
- package/dist/cli/installers/skills.d.ts +19 -0
- package/dist/cli/installers/skills.d.ts.map +1 -0
- package/dist/cli/output.d.ts +7 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/remote-canvas-manager.d.ts +8 -0
- package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
- package/dist/cli/remote-manager.d.ts +98 -0
- package/dist/cli/remote-manager.d.ts.map +1 -0
- package/dist/cli/remote-relay.d.ts +19 -0
- package/dist/cli/remote-relay.d.ts.map +1 -0
- package/dist/cli/templates/config.d.ts +7 -0
- package/dist/cli/templates/config.d.ts.map +1 -0
- package/dist/cli/utils/config.d.ts +20 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/http.d.ts +5 -0
- package/dist/cli/utils/http.d.ts.map +1 -0
- package/dist/cli/utils/parse.d.ts +9 -0
- package/dist/cli/utils/parse.d.ts.map +1 -0
- package/dist/cli/utils/skills.d.ts +12 -0
- package/dist/cli/utils/skills.d.ts.map +1 -0
- package/dist/config.d.ts +208 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/core/bootstrap.d.ts +3 -0
- package/dist/core/bootstrap.d.ts.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/logging.d.ts +34 -0
- package/dist/core/logging.d.ts.map +1 -0
- package/dist/core/types.d.ts +36 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/devtools/console-tracker.d.ts +44 -0
- package/dist/devtools/console-tracker.d.ts.map +1 -0
- package/dist/devtools/exception-tracker.d.ts +42 -0
- package/dist/devtools/exception-tracker.d.ts.map +1 -0
- package/dist/devtools/network-tracker.d.ts +34 -0
- package/dist/devtools/network-tracker.d.ts.map +1 -0
- package/dist/export/css-extract.d.ts +5 -0
- package/dist/export/css-extract.d.ts.map +1 -0
- package/dist/export/dom-capture.d.ts +15 -0
- package/dist/export/dom-capture.d.ts.map +1 -0
- package/dist/export/react-emitter.d.ts +11 -0
- package/dist/export/react-emitter.d.ts.map +1 -0
- package/dist/extension-extractor.d.ts +3 -0
- package/dist/extension-extractor.d.ts.map +1 -0
- package/dist/fs-UMRKOBNN.js +7 -0
- package/dist/fs-UMRKOBNN.js.map +1 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1028 -123
- package/dist/index.js.map +1 -1
- package/dist/macros/execute.d.ts +44 -0
- package/dist/macros/execute.d.ts.map +1 -0
- package/dist/macros/index.d.ts +9 -0
- package/dist/macros/index.d.ts.map +1 -0
- package/dist/macros/packs/core.d.ts +3 -0
- package/dist/macros/packs/core.d.ts.map +1 -0
- package/dist/macros/registry.d.ts +48 -0
- package/dist/macros/registry.d.ts.map +1 -0
- package/dist/macros-ND2M7LWU.js +399 -0
- package/dist/macros-ND2M7LWU.js.map +1 -0
- package/dist/opendevbrowser.d.ts +3 -4
- package/dist/opendevbrowser.d.ts.map +1 -0
- package/dist/opendevbrowser.js +1028 -123
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/providers/adaptive-concurrency.d.ts +42 -0
- package/dist/providers/adaptive-concurrency.d.ts.map +1 -0
- package/dist/providers/artifacts.d.ts +34 -0
- package/dist/providers/artifacts.d.ts.map +1 -0
- package/dist/providers/blocker.d.ts +47 -0
- package/dist/providers/blocker.d.ts.map +1 -0
- package/dist/providers/community/index.d.ts +44 -0
- package/dist/providers/community/index.d.ts.map +1 -0
- package/dist/providers/enrichment.d.ts +33 -0
- package/dist/providers/enrichment.d.ts.map +1 -0
- package/dist/providers/errors.d.ts +41 -0
- package/dist/providers/errors.d.ts.map +1 -0
- package/dist/providers/index.d.ts +121 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/normalize.d.ts +39 -0
- package/dist/providers/normalize.d.ts.map +1 -0
- package/dist/providers/policy.d.ts +5 -0
- package/dist/providers/policy.d.ts.map +1 -0
- package/dist/providers/registry.d.ts +22 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/renderer.d.ts +49 -0
- package/dist/providers/renderer.d.ts.map +1 -0
- package/dist/providers/runtime-factory.d.ts +20 -0
- package/dist/providers/runtime-factory.d.ts.map +1 -0
- package/dist/providers/safety/prompt-guard.d.ts +34 -0
- package/dist/providers/safety/prompt-guard.d.ts.map +1 -0
- package/dist/providers/shared/anti-bot-policy.d.ts +51 -0
- package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -0
- package/dist/providers/shared/post-policy.d.ts +31 -0
- package/dist/providers/shared/post-policy.d.ts.map +1 -0
- package/dist/providers/shared/request-headers.d.ts +5 -0
- package/dist/providers/shared/request-headers.d.ts.map +1 -0
- package/dist/providers/shared/traversal-url.d.ts +2 -0
- package/dist/providers/shared/traversal-url.d.ts.map +1 -0
- package/dist/providers/shopping/index.d.ts +63 -0
- package/dist/providers/shopping/index.d.ts.map +1 -0
- package/dist/providers/social/bluesky.d.ts +3 -0
- package/dist/providers/social/bluesky.d.ts.map +1 -0
- package/dist/providers/social/facebook.d.ts +3 -0
- package/dist/providers/social/facebook.d.ts.map +1 -0
- package/dist/providers/social/index.d.ts +31 -0
- package/dist/providers/social/index.d.ts.map +1 -0
- package/dist/providers/social/instagram.d.ts +3 -0
- package/dist/providers/social/instagram.d.ts.map +1 -0
- package/dist/providers/social/linkedin.d.ts +3 -0
- package/dist/providers/social/linkedin.d.ts.map +1 -0
- package/dist/providers/social/platform.d.ts +40 -0
- package/dist/providers/social/platform.d.ts.map +1 -0
- package/dist/providers/social/reddit.d.ts +3 -0
- package/dist/providers/social/reddit.d.ts.map +1 -0
- package/dist/providers/social/threads.d.ts +3 -0
- package/dist/providers/social/threads.d.ts.map +1 -0
- package/dist/providers/social/tiktok.d.ts +3 -0
- package/dist/providers/social/tiktok.d.ts.map +1 -0
- package/dist/providers/social/x.d.ts +3 -0
- package/dist/providers/social/x.d.ts.map +1 -0
- package/dist/providers/social/youtube-resolver.d.ts +78 -0
- package/dist/providers/social/youtube-resolver.d.ts.map +1 -0
- package/dist/providers/social/youtube.d.ts +34 -0
- package/dist/providers/social/youtube.d.ts.map +1 -0
- package/dist/providers/tier-router.d.ts +30 -0
- package/dist/providers/tier-router.d.ts.map +1 -0
- package/dist/providers/timebox.d.ts +20 -0
- package/dist/providers/timebox.d.ts.map +1 -0
- package/dist/providers/types.d.ts +344 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/web/crawl-worker.d.ts +36 -0
- package/dist/providers/web/crawl-worker.d.ts.map +1 -0
- package/dist/providers/web/crawler.d.ts +101 -0
- package/dist/providers/web/crawler.d.ts.map +1 -0
- package/dist/providers/web/extract.d.ts +11 -0
- package/dist/providers/web/extract.d.ts.map +1 -0
- package/dist/providers/web/index.d.ts +24 -0
- package/dist/providers/web/index.d.ts.map +1 -0
- package/dist/providers/web/policy.d.ts +14 -0
- package/dist/providers/web/policy.d.ts.map +1 -0
- package/dist/providers/workflows.d.ts +67 -0
- package/dist/providers/workflows.d.ts.map +1 -0
- package/dist/providers-G3LRHQXX.js +121 -0
- package/dist/providers-G3LRHQXX.js.map +1 -0
- package/dist/relay/protocol.d.ts +399 -0
- package/dist/relay/protocol.d.ts.map +1 -0
- package/dist/relay/relay-endpoints.d.ts +16 -0
- package/dist/relay/relay-endpoints.d.ts.map +1 -0
- package/dist/relay/relay-server.d.ts +124 -0
- package/dist/relay/relay-server.d.ts.map +1 -0
- package/dist/relay/relay-types.d.ts +12 -0
- package/dist/relay/relay-types.d.ts.map +1 -0
- package/dist/runtime-factory-BICHDPE7.js +13 -0
- package/dist/runtime-factory-BICHDPE7.js.map +1 -0
- package/dist/skills/continuity-nudge.d.ts +12 -0
- package/dist/skills/continuity-nudge.d.ts.map +1 -0
- package/dist/skills/skill-loader.d.ts +20 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-nudge.d.ts +18 -0
- package/dist/skills/skill-nudge.d.ts.map +1 -0
- package/dist/skills/types.d.ts +12 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/snapshot/ops-snapshot.d.ts +16 -0
- package/dist/snapshot/ops-snapshot.d.ts.map +1 -0
- package/dist/snapshot/refs.d.ts +23 -0
- package/dist/snapshot/refs.d.ts.map +1 -0
- package/dist/snapshot/snapshotter.d.ts +27 -0
- package/dist/snapshot/snapshotter.d.ts.map +1 -0
- package/dist/tools/annotate.d.ts +4 -0
- package/dist/tools/annotate.d.ts.map +1 -0
- package/dist/tools/canvas.d.ts +4 -0
- package/dist/tools/canvas.d.ts.map +1 -0
- package/dist/tools/check.d.ts +4 -0
- package/dist/tools/check.d.ts.map +1 -0
- package/dist/tools/click.d.ts +4 -0
- package/dist/tools/click.d.ts.map +1 -0
- package/dist/tools/clone_component.d.ts +4 -0
- package/dist/tools/clone_component.d.ts.map +1 -0
- package/dist/tools/clone_page.d.ts +4 -0
- package/dist/tools/clone_page.d.ts.map +1 -0
- package/dist/tools/close.d.ts +4 -0
- package/dist/tools/close.d.ts.map +1 -0
- package/dist/tools/connect.d.ts +4 -0
- package/dist/tools/connect.d.ts.map +1 -0
- package/dist/tools/console_poll.d.ts +4 -0
- package/dist/tools/console_poll.d.ts.map +1 -0
- package/dist/tools/cookie_import.d.ts +25 -0
- package/dist/tools/cookie_import.d.ts.map +1 -0
- package/dist/tools/cookie_list.d.ts +9 -0
- package/dist/tools/cookie_list.d.ts.map +1 -0
- package/dist/tools/debug_trace_snapshot.d.ts +4 -0
- package/dist/tools/debug_trace_snapshot.d.ts.map +1 -0
- package/dist/tools/deps.d.ts +28 -0
- package/dist/tools/deps.d.ts.map +1 -0
- package/dist/tools/disconnect.d.ts +4 -0
- package/dist/tools/disconnect.d.ts.map +1 -0
- package/dist/tools/dom_get_html.d.ts +4 -0
- package/dist/tools/dom_get_html.d.ts.map +1 -0
- package/dist/tools/dom_get_text.d.ts +4 -0
- package/dist/tools/dom_get_text.d.ts.map +1 -0
- package/dist/tools/get_attr.d.ts +4 -0
- package/dist/tools/get_attr.d.ts.map +1 -0
- package/dist/tools/get_value.d.ts +4 -0
- package/dist/tools/get_value.d.ts.map +1 -0
- package/dist/tools/goto.d.ts +4 -0
- package/dist/tools/goto.d.ts.map +1 -0
- package/dist/tools/hover.d.ts +4 -0
- package/dist/tools/hover.d.ts.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/is_checked.d.ts +4 -0
- package/dist/tools/is_checked.d.ts.map +1 -0
- package/dist/tools/is_enabled.d.ts +4 -0
- package/dist/tools/is_enabled.d.ts.map +1 -0
- package/dist/tools/is_visible.d.ts +4 -0
- package/dist/tools/is_visible.d.ts.map +1 -0
- package/dist/tools/launch.d.ts +4 -0
- package/dist/tools/launch.d.ts.map +1 -0
- package/dist/tools/list.d.ts +4 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/macro_resolve.d.ts +25 -0
- package/dist/tools/macro_resolve.d.ts.map +1 -0
- package/dist/tools/network_poll.d.ts +4 -0
- package/dist/tools/network_poll.d.ts.map +1 -0
- package/dist/tools/page.d.ts +4 -0
- package/dist/tools/page.d.ts.map +1 -0
- package/dist/tools/perf.d.ts +4 -0
- package/dist/tools/perf.d.ts.map +1 -0
- package/dist/tools/press.d.ts +4 -0
- package/dist/tools/press.d.ts.map +1 -0
- package/dist/tools/product_video_run.d.ts +4 -0
- package/dist/tools/product_video_run.d.ts.map +1 -0
- package/dist/tools/prompting_guide.d.ts +4 -0
- package/dist/tools/prompting_guide.d.ts.map +1 -0
- package/dist/tools/research_run.d.ts +4 -0
- package/dist/tools/research_run.d.ts.map +1 -0
- package/dist/tools/response.d.ts +19 -0
- package/dist/tools/response.d.ts.map +1 -0
- package/dist/tools/run.d.ts +4 -0
- package/dist/tools/run.d.ts.map +1 -0
- package/dist/tools/screenshot.d.ts +4 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/scroll.d.ts +4 -0
- package/dist/tools/scroll.d.ts.map +1 -0
- package/dist/tools/scroll_into_view.d.ts +4 -0
- package/dist/tools/scroll_into_view.d.ts.map +1 -0
- package/dist/tools/select.d.ts +4 -0
- package/dist/tools/select.d.ts.map +1 -0
- package/dist/tools/shopping_run.d.ts +4 -0
- package/dist/tools/shopping_run.d.ts.map +1 -0
- package/dist/tools/skill_list.d.ts +4 -0
- package/dist/tools/skill_list.d.ts.map +1 -0
- package/dist/tools/skill_load.d.ts +4 -0
- package/dist/tools/skill_load.d.ts.map +1 -0
- package/dist/tools/snapshot.d.ts +4 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/status.d.ts +4 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/target_close.d.ts +4 -0
- package/dist/tools/target_close.d.ts.map +1 -0
- package/dist/tools/target_new.d.ts +4 -0
- package/dist/tools/target_new.d.ts.map +1 -0
- package/dist/tools/target_use.d.ts +4 -0
- package/dist/tools/target_use.d.ts.map +1 -0
- package/dist/tools/targets_list.d.ts +4 -0
- package/dist/tools/targets_list.d.ts.map +1 -0
- package/dist/tools/type.d.ts +4 -0
- package/dist/tools/type.d.ts.map +1 -0
- package/dist/tools/uncheck.d.ts +4 -0
- package/dist/tools/uncheck.d.ts.map +1 -0
- package/dist/tools/wait.d.ts +4 -0
- package/dist/tools/wait.d.ts.map +1 -0
- package/dist/tools/workflow-runtime.d.ts +3 -0
- package/dist/tools/workflow-runtime.d.ts.map +1 -0
- package/dist/utils/crypto.d.ts +2 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/endpoint-validation.d.ts +2 -0
- package/dist/utils/endpoint-validation.d.ts.map +1 -0
- package/dist/utils/fs.d.ts +5 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/hub-enabled.d.ts +3 -0
- package/dist/utils/hub-enabled.d.ts.map +1 -0
- package/extension/canvas.html +636 -0
- package/extension/dist/annotate-content.css +15 -6
- package/extension/dist/annotate-content.js +119 -9
- package/extension/dist/annotation-payload.js +163 -0
- package/extension/dist/background.js +158 -22
- package/extension/dist/canvas/canvas-runtime.js +1061 -0
- package/extension/dist/canvas/model.js +213 -0
- package/extension/dist/canvas/viewport-fit.js +67 -0
- package/extension/dist/canvas-page.js +1801 -0
- package/extension/dist/ops/dom-bridge.js +116 -3
- package/extension/dist/ops/ops-runtime.js +1014 -48
- package/extension/dist/ops/ops-session-store.js +37 -116
- package/extension/dist/ops/parallelism-governor.js +117 -0
- package/extension/dist/ops/snapshot-shared.js +21 -5
- package/extension/dist/ops/target-session-coordinator.js +157 -0
- package/extension/dist/popup.js +155 -31
- package/extension/dist/services/CDPRouter.js +70 -5
- package/extension/dist/services/ConnectionManager.js +22 -3
- package/extension/dist/services/RelayClient.js +9 -0
- package/extension/dist/services/TabManager.js +35 -12
- package/extension/dist/types.js +2 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/manifest.json +1 -1
- package/extension/popup.html +52 -0
- package/package.json +30 -19
- package/scripts/native/host.cjs +230 -0
- package/scripts/native/install.ps1 +73 -0
- package/scripts/native/install.sh +66 -0
- package/scripts/native/uninstall.ps1 +25 -0
- package/scripts/native/uninstall.sh +26 -0
- package/skills/AGENTS.md +20 -8
- package/skills/opendevbrowser-best-practices/SKILL.md +248 -74
- package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +44 -0
- package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
- package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +191 -0
- package/skills/opendevbrowser-best-practices/artifacts/debug-trace-playbook.md +36 -0
- package/skills/opendevbrowser-best-practices/artifacts/fingerprint-tiers.md +36 -0
- package/skills/opendevbrowser-best-practices/artifacts/macro-workflows.md +43 -0
- package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +36 -0
- package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +89 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
- package/skills/opendevbrowser-best-practices/assets/templates/cdp-forward-envelope.json +11 -0
- package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +56 -0
- package/skills/opendevbrowser-best-practices/assets/templates/ops-request-envelope.json +9 -0
- package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +136 -0
- package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +28 -0
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +170 -0
- package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +164 -0
- package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +234 -0
- package/skills/opendevbrowser-continuity-ledger/SKILL.md +10 -0
- package/skills/opendevbrowser-data-extraction/SKILL.md +126 -0
- package/skills/opendevbrowser-data-extraction/artifacts/extraction-workflows.md +31 -0
- package/skills/opendevbrowser-data-extraction/assets/templates/compliance-checklist.md +7 -0
- package/skills/opendevbrowser-data-extraction/assets/templates/extraction-schema.json +17 -0
- package/skills/opendevbrowser-data-extraction/assets/templates/pagination-state.json +11 -0
- package/skills/opendevbrowser-data-extraction/assets/templates/quality-gates.json +10 -0
- package/skills/opendevbrowser-data-extraction/examples/sample-schema.json +19 -0
- package/skills/opendevbrowser-data-extraction/scripts/run-extraction-workflow.sh +83 -0
- package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +49 -0
- package/skills/opendevbrowser-form-testing/SKILL.md +143 -0
- package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +37 -0
- package/skills/opendevbrowser-form-testing/assets/templates/a11y-assertions.md +7 -0
- package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +16 -0
- package/skills/opendevbrowser-form-testing/assets/templates/multi-step-state.json +11 -0
- package/skills/opendevbrowser-form-testing/assets/templates/validation-matrix.json +24 -0
- package/skills/opendevbrowser-form-testing/examples/sample-validation-matrix.json +29 -0
- package/skills/opendevbrowser-form-testing/scripts/run-form-workflow.sh +82 -0
- package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +49 -0
- package/skills/opendevbrowser-login-automation/SKILL.md +159 -0
- package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +39 -0
- package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +21 -0
- package/skills/opendevbrowser-login-automation/assets/templates/challenge-checkpoint.md +10 -0
- package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +26 -0
- package/skills/opendevbrowser-login-automation/examples/sample-auth-signals.json +14 -0
- package/skills/opendevbrowser-login-automation/scripts/record-auth-signals.sh +18 -0
- package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +99 -0
- package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +50 -0
- package/skills/opendevbrowser-product-presentation-asset/SKILL.md +98 -0
- package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +23 -0
- package/skills/opendevbrowser-product-presentation-asset/artifacts/ugc-creative-guide.md +21 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/claims-evidence-map.md +5 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/copy.md +5 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/features.md +4 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/manifest.schema.json +14 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +7 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/ugc-concepts.md +17 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/user-actions.md +7 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +18 -0
- package/skills/opendevbrowser-product-presentation-asset/examples/sample-input.json +6 -0
- package/skills/opendevbrowser-product-presentation-asset/examples/sample-manifest.json +18 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +9 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +14 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +9 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +96 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +56 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +43 -0
- package/skills/opendevbrowser-research/SKILL.md +73 -0
- package/skills/opendevbrowser-research/artifacts/research-workflows.md +29 -0
- package/skills/opendevbrowser-research/assets/templates/compact.md +7 -0
- package/skills/opendevbrowser-research/assets/templates/context.json +18 -0
- package/skills/opendevbrowser-research/assets/templates/report.md +9 -0
- package/skills/opendevbrowser-research/examples/sample-input.json +6 -0
- package/skills/opendevbrowser-research/examples/sample-output.md +4 -0
- package/skills/opendevbrowser-research/scripts/render-output.sh +12 -0
- package/skills/opendevbrowser-research/scripts/run-research.sh +23 -0
- package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +48 -0
- package/skills/opendevbrowser-research/scripts/write-artifacts.sh +29 -0
- package/skills/opendevbrowser-shopping/SKILL.md +118 -0
- package/skills/opendevbrowser-shopping/artifacts/deal-hunting-workflows.md +37 -0
- package/skills/opendevbrowser-shopping/assets/templates/deal-thresholds.json +8 -0
- package/skills/opendevbrowser-shopping/assets/templates/deals-context.json +9 -0
- package/skills/opendevbrowser-shopping/assets/templates/deals-table.md +4 -0
- package/skills/opendevbrowser-shopping/assets/templates/market-analysis.json +30 -0
- package/skills/opendevbrowser-shopping/examples/sample-deals.md +4 -0
- package/skills/opendevbrowser-shopping/examples/sample-query.json +5 -0
- package/skills/opendevbrowser-shopping/scripts/analyze-market.sh +307 -0
- package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +28 -0
- package/skills/opendevbrowser-shopping/scripts/render-deals.sh +13 -0
- package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +32 -0
- package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +19 -0
- package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +53 -0
- package/dist/chunk-JVBMT2O5.js +0 -7173
- package/dist/chunk-JVBMT2O5.js.map +0 -1
- package/skills/data-extraction/SKILL.md +0 -128
- package/skills/form-testing/SKILL.md +0 -106
- package/skills/login-automation/SKILL.md +0 -108
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/normalize.ts","../src/providers/policy.ts","../src/providers/registry.ts","../src/providers/adaptive-concurrency.ts","../src/providers/safety/prompt-guard.ts","../src/providers/tier-router.ts","../src/core/logging.ts","../src/providers/shared/anti-bot-policy.ts","../src/providers/shared/post-policy.ts","../src/providers/shared/traversal-url.ts","../src/providers/web/policy.ts","../src/providers/web/crawl-worker.ts","../src/providers/web/extract.ts","../src/providers/web/crawler.ts","../src/providers/community/index.ts","../src/providers/social/platform.ts","../src/providers/social/bluesky.ts","../src/providers/social/facebook.ts","../src/providers/social/instagram.ts","../src/providers/social/linkedin.ts","../src/providers/social/reddit.ts","../src/providers/social/threads.ts","../src/providers/social/tiktok.ts","../src/providers/social/x.ts","../src/providers/shared/request-headers.ts","../src/providers/social/youtube-resolver.ts","../src/providers/social/youtube.ts","../src/providers/social/index.ts","../src/providers/shopping/index.ts","../src/providers/web/index.ts","../src/providers/blocker.ts","../src/providers/timebox.ts","../src/providers/enrichment.ts","../src/providers/renderer.ts","../src/providers/artifacts.ts","../src/providers/workflows.ts","../src/providers/index.ts"],"sourcesContent":["import { createHash, randomUUID } from \"crypto\";\nimport { createProviderError, toProviderError } from \"./errors\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderExecutionMetadata,\n ProviderError,\n ProviderOperationFailure,\n ProviderOperationSuccess,\n ProviderSource,\n ProviderTierMetadata,\n TraceContext\n} from \"./types\";\n\nexport interface NormalizeRecordInput {\n id?: string;\n url?: string;\n title?: string;\n content?: string;\n timestamp?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n}\n\nexport const createTraceContext = (\n seed: Partial<TraceContext> = {},\n provider?: string\n): TraceContext => {\n return {\n requestId: seed.requestId ?? randomUUID(),\n ...(seed.sessionId ? { sessionId: seed.sessionId } : {}),\n ...(seed.targetId ? { targetId: seed.targetId } : {}),\n ...(provider ?? seed.provider ? { provider: provider ?? seed.provider } : {}),\n ts: seed.ts ?? new Date().toISOString()\n };\n};\n\nexport const clampConfidence = (value: number | undefined): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 0.5;\n if (value < 0) return 0;\n if (value > 1) return 1;\n return value;\n};\n\nexport const createStableRecordId = (\n provider: string,\n source: ProviderSource,\n value: NormalizeRecordInput\n): string => {\n const payload = stableStringify({\n provider,\n source,\n url: value.url ?? \"\",\n title: value.title ?? \"\",\n content: value.content ?? \"\",\n attributes: value.attributes ?? {}\n });\n\n return createHash(\"sha1\").update(payload).digest(\"hex\").slice(0, 16);\n};\n\nexport const normalizeRecord = (\n provider: string,\n source: ProviderSource,\n value: NormalizeRecordInput\n): NormalizedRecord => {\n const id = value.id ?? createStableRecordId(provider, source, value);\n const timestamp = value.timestamp ?? new Date().toISOString();\n\n return {\n id,\n source,\n provider,\n ...(value.url ? { url: value.url } : {}),\n ...(value.title ? { title: value.title } : {}),\n ...(value.content ? { content: value.content } : {}),\n timestamp,\n confidence: clampConfidence(value.confidence),\n attributes: value.attributes ?? {}\n };\n};\n\nexport const normalizeRecords = (\n provider: string,\n source: ProviderSource,\n records: NormalizeRecordInput[]\n): NormalizedRecord[] => {\n return records.map((record) => normalizeRecord(provider, source, record));\n};\n\nexport const normalizeSuccess = (\n provider: string,\n source: ProviderSource,\n records: NormalizeRecordInput[],\n options: {\n trace?: Partial<TraceContext>;\n startedAtMs?: number;\n attempts?: number;\n retries?: number;\n meta?: ProviderExecutionMetadata;\n provenance?: Record<string, JsonValue>;\n } = {}\n): ProviderOperationSuccess => {\n const trace = createTraceContext(options.trace, provider);\n const startedAtMs = options.startedAtMs ?? Date.now();\n\n return {\n ok: true,\n provider,\n source,\n trace,\n records: normalizeRecords(provider, source, records),\n latencyMs: Math.max(0, Date.now() - startedAtMs),\n attempts: options.attempts ?? 1,\n retries: options.retries ?? Math.max(0, (options.attempts ?? 1) - 1),\n ...(options.meta ? { meta: options.meta } : {}),\n ...(options.provenance ? { provenance: options.provenance } : {})\n };\n};\n\nexport const normalizeFailure = (\n provider: string,\n source: ProviderSource,\n error: unknown,\n options: {\n trace?: Partial<TraceContext>;\n startedAtMs?: number;\n attempts?: number;\n retries?: number;\n meta?: ProviderExecutionMetadata;\n defaultMessage?: string;\n defaultErrorCode?: ProviderError[\"code\"];\n } = {}\n): ProviderOperationFailure => {\n const trace = createTraceContext(options.trace, provider);\n const startedAtMs = options.startedAtMs ?? Date.now();\n const mapped = isProviderError(error)\n ? error\n : toProviderError(error, {\n provider,\n source,\n defaultCode: options.defaultErrorCode\n });\n const resolvedError = mapped.message\n ? mapped\n : createProviderError(mapped.code, options.defaultMessage ?? \"Provider request failed\", {\n retryable: mapped.retryable,\n provider,\n source\n });\n\n return {\n ok: false,\n provider,\n source,\n trace,\n error: resolvedError,\n latencyMs: Math.max(0, Date.now() - startedAtMs),\n attempts: options.attempts ?? 1,\n retries: options.retries ?? Math.max(0, (options.attempts ?? 1) - 1),\n ...(options.meta ? { meta: options.meta } : {})\n };\n};\n\nexport const createExecutionMetadata = (params: {\n tier: ProviderTierMetadata;\n provider: string;\n retrievalPath: string;\n retrievedAt?: string;\n}): ProviderExecutionMetadata => {\n return {\n tier: params.tier,\n provenance: {\n provider: params.provider,\n retrievalPath: params.retrievalPath,\n retrievedAt: params.retrievedAt ?? new Date().toISOString()\n }\n };\n};\n\nconst isProviderError = (value: unknown): value is ProviderError => {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Record<string, unknown>;\n return typeof candidate.code === \"string\"\n && typeof candidate.message === \"string\"\n && typeof candidate.retryable === \"boolean\";\n};\n\nconst stableStringify = (value: JsonValue | Record<string, unknown>): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n\n const entries = Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => `${JSON.stringify(key)}:${stableStringify(entryValue as JsonValue | Record<string, unknown>)}`);\n return `{${entries.join(\",\")}}`;\n};\n","import type { ProviderAdapter, ProviderOperation, ProviderSelection } from \"./types\";\nimport type { ProviderRegistry } from \"./registry\";\n\nconst SOURCE_ORDER = [\"web\", \"community\", \"social\", \"shopping\"] as const;\n\ntype HealthStatus = ReturnType<ProviderRegistry[\"getHealth\"]>[\"status\"];\n\nconst hasOperation = (provider: ProviderAdapter, operation: ProviderOperation): boolean => {\n switch (operation) {\n case \"search\":\n return typeof provider.search === \"function\";\n case \"fetch\":\n return typeof provider.fetch === \"function\";\n case \"crawl\":\n return typeof provider.crawl === \"function\";\n case \"post\":\n return typeof provider.post === \"function\";\n }\n};\n\nconst rankHealth = (status: HealthStatus): number => {\n if (status === \"healthy\") return 0;\n if (status === \"degraded\") return 1;\n return 2;\n};\n\nexport const selectProviders = (\n registry: ProviderRegistry,\n operation: ProviderOperation,\n selection: ProviderSelection = \"auto\"\n): ProviderAdapter[] => {\n const providers = registry.list().filter((provider) => hasOperation(provider, operation));\n\n const bySelection = providers.filter((provider) => {\n if (selection === \"all\") return true;\n if (selection === \"auto\") return provider.source !== \"shopping\";\n return provider.source === selection;\n });\n\n return bySelection.sort((left, right) => {\n const healthDelta = rankHealth(registry.getHealth(left.id).status) - rankHealth(registry.getHealth(right.id).status);\n if (healthDelta !== 0) return healthDelta;\n\n const leftSourceRank = SOURCE_ORDER.indexOf(left.source);\n const rightSourceRank = SOURCE_ORDER.indexOf(right.source);\n const sourceDelta = leftSourceRank - rightSourceRank;\n if (sourceDelta !== 0) return sourceDelta;\n\n return left.id.localeCompare(right.id);\n });\n};\n\nexport const shouldFallbackToNextProvider = (selection: ProviderSelection): boolean => {\n return selection === \"all\" || selection === \"auto\";\n};\n","import { createProviderError } from \"./errors\";\nimport type { ProviderAdapter, ProviderCapabilities, ProviderError, ProviderHealth, ProviderSource } from \"./types\";\n\ninterface ProviderState {\n health: ProviderHealth;\n failures: number;\n circuitOpenUntil: number;\n lastError?: ProviderError;\n}\n\nconst defaultHealth = (): ProviderHealth => ({\n status: \"healthy\",\n updatedAt: new Date().toISOString()\n});\n\nexport class ProviderRegistry {\n private readonly providers = new Map<string, ProviderAdapter>();\n private readonly state = new Map<string, ProviderState>();\n\n register(provider: ProviderAdapter): void {\n if (this.providers.has(provider.id)) {\n throw new Error(`Provider already registered: ${provider.id}`);\n }\n\n this.providers.set(provider.id, provider);\n this.state.set(provider.id, {\n health: defaultHealth(),\n failures: 0,\n circuitOpenUntil: 0\n });\n }\n\n get(providerId: string): ProviderAdapter {\n const provider = this.providers.get(providerId);\n if (!provider) {\n throw new Error(`Unknown provider: ${providerId}`);\n }\n return provider;\n }\n\n list(): ProviderAdapter[] {\n return [...this.providers.values()];\n }\n\n listBySource(source: ProviderSource): ProviderAdapter[] {\n return this.list().filter((provider) => provider.source === source);\n }\n\n capabilities(): ProviderCapabilities[] {\n return this.list().map((provider) => provider.capabilities());\n }\n\n setHealth(providerId: string, health: ProviderHealth): void {\n const existing = this.getState(providerId);\n existing.health = {\n ...health,\n updatedAt: health.updatedAt || new Date().toISOString()\n };\n }\n\n getHealth(providerId: string): ProviderHealth {\n return this.getState(providerId).health;\n }\n\n markSuccess(providerId: string, latencyMs: number): void {\n const existing = this.getState(providerId);\n existing.failures = 0;\n existing.circuitOpenUntil = 0;\n existing.lastError = undefined;\n existing.health = {\n status: \"healthy\",\n updatedAt: new Date().toISOString(),\n latencyMs\n };\n }\n\n markFailure(\n providerId: string,\n error: ProviderError,\n circuit: { failureThreshold: number; cooldownMs: number }\n ): void {\n const existing = this.getState(providerId);\n existing.failures += 1;\n existing.lastError = error;\n\n const now = Date.now();\n const threshold = Math.max(1, circuit.failureThreshold);\n if (existing.failures >= threshold) {\n existing.circuitOpenUntil = now + Math.max(0, circuit.cooldownMs);\n existing.health = {\n status: \"unhealthy\",\n updatedAt: new Date(now).toISOString(),\n reason: error.message\n };\n return;\n }\n\n existing.health = {\n status: \"degraded\",\n updatedAt: new Date(now).toISOString(),\n reason: error.message\n };\n }\n\n isCircuitOpen(providerId: string, nowMs = Date.now()): boolean {\n const existing = this.getState(providerId);\n if (existing.circuitOpenUntil <= 0) return false;\n if (existing.circuitOpenUntil > nowMs) return true;\n\n existing.circuitOpenUntil = 0;\n if (existing.health.status === \"unhealthy\") {\n existing.health = {\n status: \"degraded\",\n updatedAt: new Date(nowMs).toISOString(),\n reason: \"Circuit cooldown elapsed\"\n };\n }\n return false;\n }\n\n getCircuitError(providerId: string): ProviderError {\n const existing = this.getState(providerId);\n return createProviderError(\"circuit_open\", \"Provider circuit is open\", {\n provider: providerId,\n retryable: true,\n details: {\n openUntil: existing.circuitOpenUntil,\n failures: existing.failures,\n lastErrorCode: existing.lastError?.code ?? null\n }\n });\n }\n\n reset(providerId: string): void {\n const existing = this.getState(providerId);\n existing.failures = 0;\n existing.circuitOpenUntil = 0;\n existing.lastError = undefined;\n existing.health = defaultHealth();\n }\n\n private getState(providerId: string): ProviderState {\n const state = this.state.get(providerId);\n if (!state) {\n throw new Error(`Unknown provider state: ${providerId}`);\n }\n return state;\n }\n}\n","import type { AdaptiveConcurrencyDiagnostics } from \"./types\";\n\nexport interface AdaptiveConcurrencyConfig {\n enabled: boolean;\n baselineGlobal: number;\n baselineScoped: number;\n minGlobal?: number;\n maxGlobal: number;\n minScoped?: number;\n maxScoped: number;\n windowSize?: number;\n cooldownMs?: number;\n increaseStep?: number;\n decreaseFactor?: number;\n healthyLatencyMs?: number;\n}\n\nexport interface AdaptiveSignal {\n latencyMs: number;\n timeout?: boolean;\n challenge?: boolean;\n http4xx?: boolean;\n http5xx?: boolean;\n queuePressure?: number;\n}\n\ntype TrackState = {\n limit: number;\n lastAdjustedAt: number;\n samples: AdaptiveSignal[];\n};\n\nconst clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value));\n};\n\nconst percentile = (values: number[], ratio: number): number => {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((left, right) => left - right);\n const index = Math.min(sorted.length - 1, Math.max(0, Math.ceil(sorted.length * ratio) - 1));\n return sorted[index] ?? 0;\n};\n\nconst rate = (values: AdaptiveSignal[], key: keyof AdaptiveSignal): number => {\n if (values.length === 0) return 0;\n const total = values.reduce((count, sample) => count + (sample[key] ? 1 : 0), 0);\n return total / values.length;\n};\n\nconst queuePressure = (values: AdaptiveSignal[]): number => {\n if (values.length === 0) return 0;\n const total = values.reduce((sum, sample) => sum + (sample.queuePressure ?? 0), 0);\n return total / values.length;\n};\n\nexport class AdaptiveConcurrencyController {\n private readonly global: TrackState;\n private readonly scoped = new Map<string, TrackState>();\n private readonly minGlobal: number;\n private readonly minScoped: number;\n private readonly windowSize: number;\n private readonly cooldownMs: number;\n private readonly increaseStep: number;\n private readonly decreaseFactor: number;\n private readonly healthyLatencyMs: number;\n\n constructor(private readonly config: AdaptiveConcurrencyConfig) {\n this.minGlobal = Math.max(1, config.minGlobal ?? 1);\n this.minScoped = Math.max(1, config.minScoped ?? 1);\n this.windowSize = clamp(Math.floor(config.windowSize ?? 20), 5, 100);\n this.cooldownMs = clamp(Math.floor(config.cooldownMs ?? 3000), 250, 60000);\n this.increaseStep = clamp(Math.floor(config.increaseStep ?? 1), 1, 8);\n this.decreaseFactor = clamp(config.decreaseFactor ?? 0.7, 0.1, 0.95);\n this.healthyLatencyMs = clamp(Math.floor(config.healthyLatencyMs ?? 1200), 50, 60000);\n this.global = {\n limit: clamp(config.baselineGlobal, this.minGlobal, Math.max(this.minGlobal, config.maxGlobal)),\n lastAdjustedAt: 0,\n samples: []\n };\n }\n\n snapshot(scope: string): AdaptiveConcurrencyDiagnostics {\n if (!this.config.enabled) {\n return {\n enabled: false,\n scope,\n global: {\n limit: this.global.limit,\n min: this.minGlobal,\n max: this.config.maxGlobal\n },\n scoped: {\n limit: clamp(this.config.baselineScoped, this.minScoped, this.config.maxScoped),\n min: this.minScoped,\n max: this.config.maxScoped\n }\n };\n }\n\n const scoped = this.getScoped(scope);\n return {\n enabled: true,\n scope,\n global: {\n limit: this.global.limit,\n min: this.minGlobal,\n max: this.config.maxGlobal\n },\n scoped: {\n limit: scoped.limit,\n min: this.minScoped,\n max: this.config.maxScoped\n }\n };\n }\n\n observe(scope: string, signal: AdaptiveSignal, nowMs = Date.now()): void {\n if (!this.config.enabled) return;\n\n this.record(this.global, signal);\n const scoped = this.getScoped(scope);\n this.record(scoped, signal);\n\n this.adjust(this.global, this.minGlobal, this.config.maxGlobal, nowMs);\n this.adjust(scoped, this.minScoped, this.config.maxScoped, nowMs);\n }\n\n private getScoped(scope: string): TrackState {\n const existing = this.scoped.get(scope);\n if (existing) return existing;\n const next: TrackState = {\n limit: clamp(this.config.baselineScoped, this.minScoped, this.config.maxScoped),\n lastAdjustedAt: 0,\n samples: []\n };\n this.scoped.set(scope, next);\n return next;\n }\n\n private record(track: TrackState, signal: AdaptiveSignal): void {\n track.samples.push(signal);\n if (track.samples.length > this.windowSize) {\n track.samples.splice(0, track.samples.length - this.windowSize);\n }\n }\n\n private adjust(track: TrackState, min: number, max: number, nowMs: number): void {\n if (nowMs - track.lastAdjustedAt < this.cooldownMs) {\n return;\n }\n\n const samples = track.samples;\n const p95Latency = percentile(samples.map((sample) => sample.latencyMs), 0.95);\n const timeoutRate = rate(samples, \"timeout\");\n const challengeRate = rate(samples, \"challenge\");\n const http5xxRate = rate(samples, \"http5xx\");\n const http4xxRate = rate(samples, \"http4xx\");\n const avgQueuePressure = queuePressure(samples);\n\n const unhealthy = timeoutRate > 0\n || challengeRate > 0\n || http5xxRate > 0.15\n || http4xxRate > 0.3\n || p95Latency > this.healthyLatencyMs * 1.35\n || avgQueuePressure > 0.85;\n\n if (unhealthy) {\n const reduced = Math.floor(track.limit * this.decreaseFactor);\n track.limit = clamp(reduced, min, max);\n track.lastAdjustedAt = nowMs;\n return;\n }\n\n const healthy = timeoutRate === 0\n && challengeRate === 0\n && http5xxRate === 0\n && p95Latency <= this.healthyLatencyMs\n && avgQueuePressure < 0.6;\n\n if (healthy) {\n track.limit = clamp(track.limit + this.increaseStep, min, max);\n track.lastAdjustedAt = nowMs;\n }\n }\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 type { ProviderTier, ProviderTierMetadata } from \"./types\";\n\nexport interface TierRouterConfig {\n defaultTier: ProviderTier;\n enableHybrid: boolean;\n enableRestrictedSafe: boolean;\n hybridRiskThreshold?: number;\n restrictedSafeRecoveryIntervalMs?: number;\n}\n\nexport interface TierRouterSignals {\n hybridEligible: boolean;\n preferredTier?: ProviderTier;\n forceRestrictedSafe?: boolean;\n challengePressure?: number;\n highFrictionTarget?: boolean;\n riskScore?: number;\n hybridHealthy?: boolean;\n policyRestrictedSafe?: boolean;\n latencyBudgetExceeded?: boolean;\n errorBudgetExceeded?: boolean;\n recoveryStableForMs?: number;\n policyAllowsRecovery?: boolean;\n}\n\nexport interface TierRouteDecision {\n tier: ProviderTierMetadata;\n fallbackTier: \"A\";\n}\n\nconst canSelectTier = (tier: ProviderTier, config: TierRouterConfig): boolean => {\n if (tier === \"A\") return true;\n if (tier === \"B\") return config.enableHybrid;\n return config.enableRestrictedSafe;\n};\n\nexport const selectTierRoute = (\n config: TierRouterConfig,\n signals: TierRouterSignals\n): TierRouteDecision => {\n const challengePressure = signals.challengePressure ?? 0;\n const hybridRiskThreshold = Math.max(0, Math.min(1, config.hybridRiskThreshold ?? 0.6));\n const riskScore = Math.max(0, Math.min(1, signals.riskScore ?? challengePressure));\n const hybridHealthy = signals.hybridHealthy ?? true;\n const policyRestrictedSafe = signals.policyRestrictedSafe ?? false;\n const latencyBudgetExceeded = signals.latencyBudgetExceeded ?? false;\n const errorBudgetExceeded = signals.errorBudgetExceeded ?? false;\n const policyAllowsRecovery = signals.policyAllowsRecovery ?? true;\n const recoveryStableForMs = Math.max(0, signals.recoveryStableForMs ?? 0);\n\n if (signals.preferredTier && canSelectTier(signals.preferredTier, config)) {\n return {\n tier: {\n selected: signals.preferredTier,\n reasonCode: \"operator_override\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.enableRestrictedSafe && policyRestrictedSafe) {\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"policy_restricted_safe\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.enableRestrictedSafe && signals.forceRestrictedSafe) {\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"restricted_safe_forced\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.enableRestrictedSafe && signals.highFrictionTarget) {\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"high_friction_target\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.enableRestrictedSafe && challengePressure >= 0.5) {\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"challenge_pressure\"\n },\n fallbackTier: \"A\"\n };\n }\n\n const resolveHybridTier = (\n reasonCode: \"default_tier\" | \"hybrid_eligible\"\n ): TierRouteDecision => {\n if (!hybridHealthy) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_unhealthy\"\n },\n fallbackTier: \"A\"\n };\n }\n if (riskScore > hybridRiskThreshold) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_risk_threshold\"\n },\n fallbackTier: \"A\"\n };\n }\n if (latencyBudgetExceeded) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_latency_budget\"\n },\n fallbackTier: \"A\"\n };\n }\n if (errorBudgetExceeded) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_error_budget\"\n },\n fallbackTier: \"A\"\n };\n }\n return {\n tier: {\n selected: \"B\",\n reasonCode\n },\n fallbackTier: \"A\"\n };\n };\n\n if (config.defaultTier === \"C\") {\n if (config.enableRestrictedSafe) {\n const recovered = policyAllowsRecovery\n && recoveryStableForMs >= Math.max(0, config.restrictedSafeRecoveryIntervalMs ?? 60000);\n if (recovered) {\n if (config.enableHybrid && signals.hybridEligible) {\n const route = resolveHybridTier(\"hybrid_eligible\");\n if (route.tier.selected === \"B\") {\n return {\n tier: {\n selected: \"B\",\n reasonCode: \"restricted_safe_recovered\"\n },\n fallbackTier: \"A\"\n };\n }\n }\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"restricted_safe_recovered\"\n },\n fallbackTier: \"A\"\n };\n }\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"default_tier\"\n },\n fallbackTier: \"A\"\n };\n }\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"restricted_safe_disabled\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.defaultTier === \"B\") {\n if (!config.enableHybrid) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_disabled\"\n },\n fallbackTier: \"A\"\n };\n }\n if (signals.hybridEligible) {\n return resolveHybridTier(\"default_tier\");\n }\n }\n\n if (config.enableHybrid && signals.hybridEligible) {\n return resolveHybridTier(\"hybrid_eligible\");\n }\n\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"default_tier\"\n },\n fallbackTier: \"A\"\n };\n};\n\nexport const shouldFallbackToTierA = (tier: ProviderTier): boolean => {\n return tier !== \"A\";\n};\n\nexport const fallbackTierMetadata = (): ProviderTierMetadata => {\n return {\n selected: \"A\",\n reasonCode: \"fallback_to_tier_a\"\n };\n};\n","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\ntype 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 function createLogger(moduleName: string, sink: LogSink = defaultSink): {\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(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 { ProviderOperation, ProviderReasonCode } from \"../types\";\n\nexport interface AntiBotPolicyConfig {\n enabled: boolean;\n cooldownMs: number;\n maxChallengeRetries: number;\n proxyHint?: string;\n sessionHint?: string;\n allowBrowserEscalation: boolean;\n}\n\nexport interface AntiBotPreflightContext {\n providerId: string;\n operation: ProviderOperation;\n nowMs?: number;\n}\n\nexport interface AntiBotPreflightResult {\n allow: boolean;\n reasonCode?: ProviderReasonCode;\n retryAfterMs?: number;\n retryGuidance?: string;\n proxyHint?: string;\n sessionHint?: string;\n escalationIntent: boolean;\n}\n\nexport interface AntiBotPostflightContext {\n providerId: string;\n operation: ProviderOperation;\n success: boolean;\n reasonCode?: ProviderReasonCode;\n retryable: boolean;\n attempt: number;\n maxAttempts: number;\n nowMs?: number;\n}\n\nexport interface AntiBotPostflightResult {\n allowRetry: boolean;\n reasonCode?: ProviderReasonCode;\n retryAfterMs?: number;\n escalationIntent: boolean;\n proxyHint?: string;\n sessionHint?: string;\n}\n\ntype ProviderCooldownState = {\n reasonCode: ProviderReasonCode;\n cooldownUntilMs: number;\n updatedAt: string;\n};\n\nconst clampInt = (value: number | undefined, fallback: number, min: number, max: number): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n const rounded = Math.floor(value);\n if (rounded < min) return min;\n if (rounded > max) return max;\n return rounded;\n};\n\nexport const DEFAULT_ANTI_BOT_POLICY_CONFIG: AntiBotPolicyConfig = {\n enabled: true,\n cooldownMs: 30000,\n maxChallengeRetries: 1,\n allowBrowserEscalation: false\n};\n\nconst COOLDOWN_REASONS = new Set<ProviderReasonCode>([\n \"ip_blocked\",\n \"token_required\",\n \"auth_required\",\n \"challenge_detected\",\n \"rate_limited\"\n]);\n\nconst ESCALATION_REASONS = new Set<ProviderReasonCode>([\n \"ip_blocked\",\n \"token_required\",\n \"auth_required\",\n \"challenge_detected\"\n]);\n\nconst toKey = (providerId: string, operation: ProviderOperation): string => `${providerId}:${operation}`;\n\nexport const resolveAntiBotPolicyConfig = (\n config: Partial<AntiBotPolicyConfig> | undefined\n): AntiBotPolicyConfig => ({\n enabled: config?.enabled ?? DEFAULT_ANTI_BOT_POLICY_CONFIG.enabled,\n cooldownMs: clampInt(config?.cooldownMs, DEFAULT_ANTI_BOT_POLICY_CONFIG.cooldownMs, 0, 300000),\n maxChallengeRetries: clampInt(\n config?.maxChallengeRetries,\n DEFAULT_ANTI_BOT_POLICY_CONFIG.maxChallengeRetries,\n 0,\n 10\n ),\n ...(config?.proxyHint ? { proxyHint: config.proxyHint.trim() } : {}),\n ...(config?.sessionHint ? { sessionHint: config.sessionHint.trim() } : {}),\n allowBrowserEscalation: config?.allowBrowserEscalation ?? DEFAULT_ANTI_BOT_POLICY_CONFIG.allowBrowserEscalation\n});\n\nexport class AntiBotPolicyEngine {\n private readonly config: AntiBotPolicyConfig;\n private readonly cooldownByScope = new Map<string, ProviderCooldownState>();\n\n constructor(config: Partial<AntiBotPolicyConfig> | undefined = {}) {\n this.config = resolveAntiBotPolicyConfig(config);\n }\n\n preflight(context: AntiBotPreflightContext): AntiBotPreflightResult {\n if (!this.config.enabled) {\n return {\n allow: true,\n escalationIntent: false\n };\n }\n\n const key = toKey(context.providerId, context.operation);\n const nowMs = context.nowMs ?? Date.now();\n const cooldown = this.cooldownByScope.get(key);\n if (cooldown && cooldown.cooldownUntilMs > nowMs) {\n const retryAfterMs = cooldown.cooldownUntilMs - nowMs;\n return {\n allow: false,\n reasonCode: cooldown.reasonCode,\n retryAfterMs,\n retryGuidance: \"cooldown_active\",\n ...(this.config.proxyHint ? { proxyHint: this.config.proxyHint } : {}),\n ...(this.config.sessionHint ? { sessionHint: this.config.sessionHint } : {}),\n escalationIntent: this.config.allowBrowserEscalation && ESCALATION_REASONS.has(cooldown.reasonCode)\n };\n }\n\n if (cooldown && cooldown.cooldownUntilMs <= nowMs) {\n this.cooldownByScope.delete(key);\n }\n\n return {\n allow: true,\n escalationIntent: false\n };\n }\n\n postflight(context: AntiBotPostflightContext): AntiBotPostflightResult {\n if (!this.config.enabled) {\n return {\n allowRetry: context.retryable && context.attempt < context.maxAttempts,\n escalationIntent: false\n };\n }\n\n const key = toKey(context.providerId, context.operation);\n if (context.success) {\n this.cooldownByScope.delete(key);\n return {\n allowRetry: false,\n escalationIntent: false\n };\n }\n\n const reasonCode = context.reasonCode;\n const nowMs = context.nowMs ?? Date.now();\n if (reasonCode && COOLDOWN_REASONS.has(reasonCode) && this.config.cooldownMs > 0) {\n this.cooldownByScope.set(key, {\n reasonCode,\n cooldownUntilMs: nowMs + this.config.cooldownMs,\n updatedAt: new Date(nowMs).toISOString()\n });\n }\n\n const canRetryByAttempt = context.attempt < context.maxAttempts;\n const challengeRetryBudgetExceeded = reasonCode === \"challenge_detected\"\n && context.attempt > this.config.maxChallengeRetries + 1;\n const allowRetry = context.retryable && canRetryByAttempt && !challengeRetryBudgetExceeded;\n\n return {\n allowRetry,\n ...(reasonCode ? { reasonCode } : {}),\n ...(reasonCode && COOLDOWN_REASONS.has(reasonCode) && this.config.cooldownMs > 0\n ? { retryAfterMs: this.config.cooldownMs }\n : {}),\n ...(this.config.proxyHint ? { proxyHint: this.config.proxyHint } : {}),\n ...(this.config.sessionHint ? { sessionHint: this.config.sessionHint } : {}),\n escalationIntent: Boolean(\n reasonCode\n && this.config.allowBrowserEscalation\n && ESCALATION_REASONS.has(reasonCode)\n )\n };\n }\n}\n","import { createHash } from \"crypto\";\nimport { ProviderRuntimeError } from \"../errors\";\nimport type { JsonValue, ProviderPostInput, TraceContext } from \"../types\";\n\nexport interface PostPolicyContext {\n providerId: string;\n source: \"community\" | \"social\";\n payload: ProviderPostInput;\n trace: TraceContext;\n}\n\nexport interface PostPolicyDecision {\n allow: boolean;\n reason?: string;\n metadata?: Record<string, JsonValue>;\n}\n\nexport interface PostPolicyAuditEntry {\n providerId: string;\n source: \"community\" | \"social\";\n decision: \"allow\" | \"deny\";\n reason?: string;\n payloadHash: string;\n ts: string;\n requestId: string;\n}\n\nexport type PostPolicyHook = (context: PostPolicyContext) => Promise<PostPolicyDecision> | PostPolicyDecision;\n\nconst defaultPolicy: PostPolicyHook = (context) => {\n if (!context.payload.riskAccepted) {\n return {\n allow: false,\n reason: \"Posting requires risk acknowledgement\"\n };\n }\n\n if (!context.payload.confirm) {\n return {\n allow: false,\n reason: \"Posting requires explicit confirmation\"\n };\n }\n\n return { allow: true };\n};\n\nexport const hashPostPayload = (payload: ProviderPostInput): string => {\n const normalized = JSON.stringify({\n target: payload.target,\n content: payload.content,\n mediaUrls: payload.mediaUrls ?? [],\n metadata: payload.metadata ?? {}\n });\n return createHash(\"sha256\").update(normalized).digest(\"hex\");\n};\n\nexport const evaluatePostPolicy = async (\n context: PostPolicyContext,\n hooks: PostPolicyHook[] = []\n): Promise<{ allowed: boolean; reason?: string; audit: PostPolicyAuditEntry; metadata?: Record<string, JsonValue> }> => {\n const chain = [defaultPolicy, ...hooks];\n const payloadHash = hashPostPayload(context.payload);\n\n for (const hook of chain) {\n const decision = await hook(context);\n if (!decision.allow) {\n return {\n allowed: false,\n reason: decision.reason,\n ...(decision.metadata ? { metadata: decision.metadata } : {}),\n audit: {\n providerId: context.providerId,\n source: context.source,\n decision: \"deny\",\n reason: decision.reason,\n payloadHash,\n ts: new Date().toISOString(),\n requestId: context.trace.requestId\n }\n };\n }\n }\n\n return {\n allowed: true,\n audit: {\n providerId: context.providerId,\n source: context.source,\n decision: \"allow\",\n payloadHash,\n ts: new Date().toISOString(),\n requestId: context.trace.requestId\n }\n };\n};\n\nexport const assertPostPolicy = async (\n context: PostPolicyContext,\n hooks: PostPolicyHook[] = []\n): Promise<PostPolicyAuditEntry> => {\n const result = await evaluatePostPolicy(context, hooks);\n if (!result.allowed) {\n throw new ProviderRuntimeError(\"policy_blocked\", result.reason ?? \"Post policy blocked the request\", {\n provider: context.providerId,\n source: context.source,\n retryable: false,\n details: {\n payloadHash: result.audit.payloadHash,\n reason: result.reason ?? null,\n ...(result.metadata ? { metadata: result.metadata } : {})\n }\n });\n }\n\n return result.audit;\n};\n","const STATIC_HOST_PATTERNS = [\n /(^|\\.)redditstatic\\.com$/i,\n /(^|\\.)twimg\\.com$/i,\n /(^|\\.)static\\.licdn\\.com$/i,\n /(^|\\.)ytimg\\.com$/i,\n /(^|\\.)fbcdn\\.net$/i,\n /(^|\\.)cdninstagram\\.com$/i\n];\n\nconst STATIC_PATH_EXT_RE = /\\.(?:avif|bmp|css|csv|gif|ico|jpe?g|js|json|map|mjs|mp3|mp4|ogg|pdf|png|svg|txt|wav|webm|webp|woff2?|xml|zip)$/i;\n\nexport const isLikelyDocumentUrl = (value: string): boolean => {\n try {\n const parsed = new URL(value);\n const protocol = parsed.protocol.toLowerCase();\n if (protocol !== \"http:\" && protocol !== \"https:\") return false;\n\n if (STATIC_HOST_PATTERNS.some((pattern) => pattern.test(parsed.hostname))) {\n return false;\n }\n\n return !STATIC_PATH_EXT_RE.test(parsed.pathname);\n } catch {\n return false;\n }\n};\n","export type RobotsMode = \"strict\" | \"warn\" | \"off\";\n\nexport interface WebCrawlPolicy {\n robotsMode?: RobotsMode;\n allowDomains?: string[];\n denyDomains?: string[];\n robotsBlockedDomains?: string[];\n}\n\nexport interface CrawlPolicyDecision {\n allowed: boolean;\n warnings: string[];\n reason?: string;\n}\n\nconst normalizeDomain = (value: string): string => value.trim().toLowerCase();\n\nconst includesDomain = (list: string[] | undefined, value: string): boolean => {\n if (!list || list.length === 0) return false;\n const normalized = normalizeDomain(value);\n return list.some((entry) => normalized === normalizeDomain(entry));\n};\n\nexport const evaluateWebCrawlPolicy = (\n rawUrl: string,\n policy: WebCrawlPolicy = {}\n): CrawlPolicyDecision => {\n let hostname = \"\";\n try {\n hostname = new URL(rawUrl).hostname;\n } catch {\n return {\n allowed: false,\n warnings: [],\n reason: \"Invalid URL\"\n };\n }\n\n if (includesDomain(policy.denyDomains, hostname)) {\n return {\n allowed: false,\n warnings: [],\n reason: \"Domain denied by policy\"\n };\n }\n\n if ((policy.allowDomains?.length ?? 0) > 0 && !includesDomain(policy.allowDomains, hostname)) {\n return {\n allowed: false,\n warnings: [],\n reason: \"Domain not in allow list\"\n };\n }\n\n const mode = policy.robotsMode ?? \"warn\";\n if (!includesDomain(policy.robotsBlockedDomains, hostname)) {\n return { allowed: true, warnings: [] };\n }\n\n if (mode === \"off\") {\n return { allowed: true, warnings: [] };\n }\n\n if (mode === \"warn\") {\n return {\n allowed: true,\n warnings: [\"Blocked by robots policy but allowed due to warn mode\"]\n };\n }\n\n return {\n allowed: false,\n warnings: [],\n reason: \"Blocked by robots policy\"\n };\n};\n","import { Worker, isMainThread } from \"node:worker_threads\";\nimport { extractStructuredContent, type ExtractedContent } from \"./extract\";\n\nexport interface CrawlExtractInput {\n url: string;\n html: string;\n selectors: string[];\n}\n\nexport interface CrawlWorkerPoolOptions {\n workerThreads?: number;\n queueMax?: number;\n forceInline?: boolean;\n}\n\ninterface WorkerExtractRequest {\n id: number;\n url: string;\n html: string;\n selectors: string[];\n}\n\ninterface WorkerExtractSuccess {\n id: number;\n ok: true;\n extracted: ExtractedContent;\n}\n\ninterface WorkerExtractFailure {\n id: number;\n ok: false;\n error: string;\n}\n\ntype WorkerExtractResponse = WorkerExtractSuccess | WorkerExtractFailure;\n\ninterface CrawlTask {\n id: number;\n input: CrawlExtractInput;\n resolve: (value: ExtractedContent) => void;\n reject: (error: Error) => void;\n}\n\ninterface WorkerHandle {\n worker: Worker;\n busy: boolean;\n taskId?: number;\n}\n\nconst DEFAULT_WORKER_THREADS = 0;\nconst DEFAULT_QUEUE_MAX = 16;\n\nconst WORKER_SCRIPT = `\nconst { parentPort } = require(\"node:worker_threads\");\n\nconst SCRIPT_STYLE_RE = /<(script|style)[^>]*>[\\\\s\\\\S]*?<\\\\/\\\\1>/gi;\nconst TAG_RE = /<[^>]+>/g;\nconst SPACE_RE = /\\\\s+/g;\nconst HREF_RE = /href\\\\s*=\\\\s*([\"'])(.*?)\\\\1/gi;\n\nconst extractText = (html) => {\n return String(html)\n .replace(SCRIPT_STYLE_RE, \" \")\n .replace(TAG_RE, \" \")\n .replace(SPACE_RE, \" \")\n .trim();\n};\n\nconst normalizeLink = (href, baseUrl) => {\n if (!href || href.startsWith(\"javascript:\") || href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")) {\n return null;\n }\n try {\n return new URL(href, baseUrl).toString();\n } catch {\n return null;\n }\n};\n\nconst extractLinks = (html, baseUrl) => {\n const links = new Set();\n for (const match of String(html).matchAll(HREF_RE)) {\n const raw = match[2]?.trim();\n if (!raw) continue;\n const normalized = normalizeLink(raw, baseUrl);\n if (!normalized) continue;\n links.add(normalized);\n }\n return [...links];\n};\n\nconst selectorRegex = (selector) => {\n const safe = selector.replace(/[-/\\\\\\\\^$*+?.()|[\\\\]{}]/g, \"\\\\\\\\$&\");\n if (selector.startsWith(\"#\")) {\n const id = selector.slice(1).replace(/[-/\\\\\\\\^$*+?.()|[\\\\]{}]/g, \"\\\\\\\\$&\");\n return new RegExp(\\`<([a-z0-9-]+)[^>]*id=[\"']\\${id}[\"'][^>]*>([\\\\\\\\s\\\\\\\\S]*?)<\\\\\\\\/\\\\\\\\1>\\`, \"gi\");\n }\n if (selector.startsWith(\".\")) {\n const className = selector.slice(1).replace(/[-/\\\\\\\\^$*+?.()|[\\\\]{}]/g, \"\\\\\\\\$&\");\n return new RegExp(\\`<([a-z0-9-]+)[^>]*class=[\"'][^\"']*\\\\\\\\b\\${className}\\\\\\\\b[^\"']*[\"'][^>]*>([\\\\\\\\s\\\\\\\\S]*?)<\\\\\\\\/\\\\\\\\1>\\`, \"gi\");\n }\n return new RegExp(\\`<\\${safe}[^>]*>([\\\\\\\\s\\\\\\\\S]*?)<\\\\\\\\/\\${safe}>\\`, \"gi\");\n};\n\nconst extractSelectors = (html, selectors = []) => {\n const out = {};\n for (const selector of selectors) {\n const values = [];\n for (const match of String(html).matchAll(selectorRegex(selector))) {\n const text = extractText(match[2] ?? match[1] ?? \"\");\n if (text) values.push(text);\n }\n out[selector] = values;\n }\n return out;\n};\n\nconst extractStructuredContent = (html, baseUrl, selectors = []) => {\n return {\n text: extractText(html),\n links: extractLinks(html, baseUrl),\n selectors: extractSelectors(html, selectors)\n };\n};\n\nparentPort?.on(\"message\", (message) => {\n const id = typeof message?.id === \"number\" ? message.id : null;\n if (id === null) return;\n\n try {\n const extracted = extractStructuredContent(\n String(message.html ?? \"\"),\n String(message.url ?? \"\"),\n Array.isArray(message.selectors) ? message.selectors.map((value) => String(value)) : []\n );\n parentPort?.postMessage({\n id,\n ok: true,\n extracted\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n parentPort?.postMessage({\n id,\n ok: false,\n error: reason\n });\n }\n});\n`;\n\nconst supportsWorkerThreads = (): boolean => {\n return isMainThread && typeof Worker === \"function\";\n};\n\nconst toError = (error: unknown, fallback: string): Error => {\n if (error instanceof Error) return error;\n return new Error(error === undefined ? fallback : String(error));\n};\n\nexport class CrawlWorkerPool {\n private readonly queueMax: number;\n private readonly queue: CrawlTask[] = [];\n private readonly inFlight = new Map<number, CrawlTask>();\n private readonly workers: WorkerHandle[] = [];\n private nextTaskId = 1;\n private inlineOnly: boolean;\n private closed = false;\n\n constructor(options: CrawlWorkerPoolOptions = {}) {\n const requestedWorkers = Math.max(0, Math.floor(options.workerThreads ?? DEFAULT_WORKER_THREADS));\n this.queueMax = Math.max(1, Math.floor(options.queueMax ?? DEFAULT_QUEUE_MAX));\n this.inlineOnly = options.forceInline === true || requestedWorkers === 0 || !supportsWorkerThreads();\n\n if (!this.inlineOnly) {\n for (let index = 0; index < requestedWorkers; index += 1) {\n this.spawnWorker();\n }\n if (this.workers.length === 0) {\n this.inlineOnly = true;\n }\n }\n }\n\n async extract(input: CrawlExtractInput): Promise<ExtractedContent> {\n if (this.closed) {\n throw new Error(\"crawl_worker_pool_closed\");\n }\n\n if (this.inlineOnly) {\n return extractStructuredContent(input.html, input.url, input.selectors);\n }\n\n if (this.queue.length + this.inFlight.size >= this.queueMax) {\n throw new Error(`crawl_worker_queue_overflow:${this.queueMax}`);\n }\n\n const taskId = this.nextTaskId;\n this.nextTaskId += 1;\n\n return new Promise<ExtractedContent>((resolve, reject) => {\n this.queue.push({ id: taskId, input, resolve, reject });\n this.dispatch();\n });\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n const closingError = new Error(\"crawl_worker_pool_closed\");\n for (const task of this.queue.splice(0)) {\n task.reject(closingError);\n }\n for (const task of this.inFlight.values()) {\n task.reject(closingError);\n }\n this.inFlight.clear();\n\n const handles = this.workers.splice(0);\n await Promise.all(handles.map((handle) => {\n return handle.worker.terminate()\n .then(() => undefined)\n .catch(() => undefined);\n }));\n }\n\n private spawnWorker(): void {\n try {\n const worker = new Worker(WORKER_SCRIPT, {\n eval: true\n });\n const handle: WorkerHandle = {\n worker,\n busy: false\n };\n\n worker.on(\"message\", (message: unknown) => {\n this.handleWorkerMessage(handle, message);\n });\n\n worker.on(\"error\", (error) => {\n this.handleWorkerFailure(handle, error);\n });\n\n worker.on(\"exit\", (code) => {\n if (code !== 0) {\n this.handleWorkerFailure(handle, new Error(`crawl_worker_exit:${code}`));\n }\n });\n\n this.workers.push(handle);\n } catch {\n this.inlineOnly = true;\n }\n }\n\n private dispatch(): void {\n if (this.inlineOnly || this.closed) return;\n for (const handle of this.workers) {\n if (handle.busy) continue;\n const task = this.queue.shift();\n if (!task) return;\n\n handle.busy = true;\n handle.taskId = task.id;\n this.inFlight.set(task.id, task);\n\n const request: WorkerExtractRequest = {\n id: task.id,\n url: task.input.url,\n html: task.input.html,\n selectors: task.input.selectors\n };\n\n try {\n handle.worker.postMessage(request);\n } catch (error) {\n this.inFlight.delete(task.id);\n handle.busy = false;\n handle.taskId = undefined;\n this.resolveTaskInline(task, error);\n }\n }\n }\n\n private handleWorkerMessage(handle: WorkerHandle, message: unknown): void {\n const response = this.parseWorkerResponse(message);\n const taskId = response?.id ?? handle.taskId;\n if (taskId === undefined) {\n handle.busy = false;\n handle.taskId = undefined;\n this.dispatch();\n return;\n }\n\n const task = this.inFlight.get(taskId);\n this.inFlight.delete(taskId);\n handle.busy = false;\n handle.taskId = undefined;\n\n if (!task) {\n this.dispatch();\n return;\n }\n\n if (response?.ok === true) {\n task.resolve(response.extracted);\n this.dispatch();\n return;\n }\n\n this.resolveTaskInline(task, response?.error);\n this.dispatch();\n }\n\n private handleWorkerFailure(handle: WorkerHandle, error: unknown): void {\n const taskId = handle.taskId;\n handle.busy = false;\n handle.taskId = undefined;\n\n if (taskId !== undefined) {\n const task = this.inFlight.get(taskId);\n if (task) {\n this.inFlight.delete(taskId);\n this.resolveTaskInline(task, error);\n }\n }\n\n const index = this.workers.indexOf(handle);\n if (index >= 0) {\n this.workers.splice(index, 1);\n }\n\n if (this.workers.length === 0) {\n this.inlineOnly = true;\n while (this.queue.length > 0) {\n const queuedTask = this.queue.shift();\n if (!queuedTask) continue;\n this.resolveTaskInline(queuedTask, error);\n }\n return;\n }\n\n this.dispatch();\n }\n\n private parseWorkerResponse(message: unknown): WorkerExtractResponse | null {\n if (!message || typeof message !== \"object\") return null;\n const candidate = message as Record<string, unknown>;\n if (typeof candidate.id !== \"number\") return null;\n if (candidate.ok === true) {\n const extracted = candidate.extracted;\n if (!extracted || typeof extracted !== \"object\") return null;\n const typedExtracted = extracted as Record<string, unknown>;\n if (typeof typedExtracted.text !== \"string\") return null;\n if (!Array.isArray(typedExtracted.links)) return null;\n if (!typedExtracted.selectors || typeof typedExtracted.selectors !== \"object\") return null;\n const selectors: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(typedExtracted.selectors as Record<string, unknown>)) {\n selectors[key] = Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n }\n return {\n id: candidate.id,\n ok: true,\n extracted: {\n text: typedExtracted.text,\n links: typedExtracted.links\n .filter((value): value is string => typeof value === \"string\"),\n selectors\n }\n };\n }\n\n return {\n id: candidate.id,\n ok: false,\n error: typeof candidate.error === \"string\" ? candidate.error : \"worker_parse_failed\"\n };\n }\n\n private resolveTaskInline(task: CrawlTask, cause: unknown): void {\n try {\n task.resolve(extractStructuredContent(task.input.html, task.input.url, task.input.selectors));\n } catch (error) {\n task.reject(toError(error, toError(cause, \"crawl_worker_inline_failed\").message));\n }\n }\n}\n\nexport const extractCrawlContentInline = (input: CrawlExtractInput): ExtractedContent => {\n return extractStructuredContent(input.html, input.url, input.selectors);\n};\n\nexport const createCrawlWorkerPool = (\n options: CrawlWorkerPoolOptions = {}\n): CrawlWorkerPool => {\n return new CrawlWorkerPool(options);\n};\n\nexport const __test__ = {\n supportsWorkerThreads,\n toError\n};\n","export interface ExtractedContent {\n text: string;\n links: string[];\n selectors: Record<string, string[]>;\n}\n\nconst SCRIPT_STYLE_RE = /<(script|style)[^>]*>[\\s\\S]*?<\\/\\1>/gi;\nconst TAG_RE = /<[^>]+>/g;\nconst SPACE_RE = /\\s+/g;\nconst HREF_RE = /href\\s*=\\s*([\"'])(.*?)\\1/gi;\n\nexport const extractText = (html: string): string => {\n return html\n .replace(SCRIPT_STYLE_RE, \" \")\n .replace(TAG_RE, \" \")\n .replace(SPACE_RE, \" \")\n .trim();\n};\n\nconst normalizeLink = (href: string, baseUrl: string): string | null => {\n if (!href || href.startsWith(\"javascript:\") || href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")) {\n return null;\n }\n\n try {\n return new URL(href, baseUrl).toString();\n } catch {\n return null;\n }\n};\n\nexport const extractLinks = (html: string, baseUrl: string): string[] => {\n const links = new Set<string>();\n for (const match of html.matchAll(HREF_RE)) {\n const raw = match[2]?.trim();\n if (!raw) continue;\n const normalized = normalizeLink(raw, baseUrl);\n if (!normalized) continue;\n links.add(normalized);\n }\n return [...links];\n};\n\nconst selectorRegex = (selector: string): RegExp => {\n const safe = selector.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n if (selector.startsWith(\"#\")) {\n const id = selector.slice(1).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n return new RegExp(`<([a-z0-9-]+)[^>]*id=[\"']${id}[\"'][^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>`, \"gi\");\n }\n if (selector.startsWith(\".\")) {\n const className = selector.slice(1).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n return new RegExp(`<([a-z0-9-]+)[^>]*class=[\"'][^\"']*\\\\b${className}\\\\b[^\"']*[\"'][^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>`, \"gi\");\n }\n return new RegExp(`<${safe}[^>]*>([\\\\s\\\\S]*?)<\\\\/${safe}>`, \"gi\");\n};\n\nexport const extractSelectors = (html: string, selectors: string[] = []): Record<string, string[]> => {\n const out: Record<string, string[]> = {};\n for (const selector of selectors) {\n const values: string[] = [];\n for (const match of html.matchAll(selectorRegex(selector))) {\n const text = extractText(match[2] ?? match[1] ?? \"\");\n if (text) {\n values.push(text);\n }\n }\n out[selector] = values;\n }\n return out;\n};\n\nexport const extractStructuredContent = (\n html: string,\n baseUrl: string,\n selectors: string[] = []\n): ExtractedContent => {\n return {\n text: extractText(html),\n links: extractLinks(html, baseUrl),\n selectors: extractSelectors(html, selectors)\n };\n};\n\nexport const toSnippet = (text: string, maxChars = 280): string => {\n if (text.length <= maxChars) return text;\n return `${text.slice(0, Math.max(0, maxChars - 1))}…`;\n};\n","import { evaluateWebCrawlPolicy, type WebCrawlPolicy } from \"./policy\";\nimport { createCrawlWorkerPool, extractCrawlContentInline, type CrawlWorkerPool } from \"./crawl-worker\";\nimport type { CrawlStrategy } from \"../types\";\n\nexport interface CrawlBudget {\n maxDepth: number;\n maxPages: number;\n maxPerDomain: number;\n}\n\nexport interface CrawlPipelineBudget {\n workerThreads: number;\n queueMax: number;\n fetchConcurrency: number;\n frontierMax: number;\n}\n\nexport interface CrawlPage {\n url: string;\n canonicalUrl: string;\n depth: number;\n status: number;\n text: string;\n links: string[];\n selectors: Record<string, string[]>;\n warnings: string[];\n}\n\nexport interface CrawlMetrics {\n visited: number;\n fetched: number;\n deduped: number;\n elapsedMs: number;\n pagesPerMinute: number;\n p50LatencyMs: number;\n p95LatencyMs: number;\n}\n\nexport interface CrawlResult {\n pages: CrawlPage[];\n graph: Array<{ from: string; to: string }>;\n warnings: string[];\n metrics: CrawlMetrics;\n}\n\nexport interface CrawlFetcherResponse {\n url?: string;\n html: string;\n status?: number;\n}\n\nexport type CrawlFetcher = (url: string) => Promise<CrawlFetcherResponse>;\n\nexport interface CrawlOptions {\n seeds: string[];\n strategy?: CrawlStrategy;\n budget?: Partial<CrawlBudget>;\n policy?: WebCrawlPolicy;\n selectors?: string[];\n pipeline?: Partial<CrawlPipelineBudget>;\n workerThreads?: number;\n queueMax?: number;\n forceInlineParse?: boolean;\n fetcher: CrawlFetcher;\n}\n\ninterface FrontierNode {\n url: string;\n depth: number;\n sequence: number;\n firstSeenOrder: number;\n firstSeenAtMs: number;\n sourcePriority: number;\n stableRecordId: string;\n}\n\ninterface CrawlTaskResult {\n sequence: number;\n firstSeenAtMs: number;\n sourcePriority: number;\n stableRecordId: string;\n page: CrawlPage | null;\n links: string[];\n warnings: string[];\n latencyMs: number;\n}\n\ninterface CrawlPageEntry {\n page: CrawlPage;\n firstSeenAtMs: number;\n sourcePriority: number;\n stableRecordId: string;\n sequence: number;\n}\n\nconst DEFAULT_BUDGET: CrawlBudget = {\n maxDepth: 2,\n maxPages: 20,\n maxPerDomain: 10\n};\n\nconst DEFAULT_PIPELINE: CrawlPipelineBudget = {\n workerThreads: 2,\n queueMax: 64,\n fetchConcurrency: 4,\n frontierMax: 256\n};\n\nconst TRACKING_QUERY_KEYS = new Set([\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n \"gclid\",\n \"fbclid\"\n]);\n\nexport const canonicalizeUrl = (rawUrl: string): string => {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return rawUrl.trim();\n }\n\n parsed.hash = \"\";\n parsed.protocol = parsed.protocol.toLowerCase();\n parsed.hostname = parsed.hostname.toLowerCase();\n\n if ((parsed.protocol === \"http:\" && parsed.port === \"80\") || (parsed.protocol === \"https:\" && parsed.port === \"443\")) {\n parsed.port = \"\";\n }\n\n const next = new URL(parsed.toString());\n const params = [...next.searchParams.entries()]\n .filter(([key]) => !TRACKING_QUERY_KEYS.has(key.toLowerCase()))\n .sort(([a], [b]) => a.localeCompare(b));\n next.search = \"\";\n for (const [key, value] of params) {\n next.searchParams.append(key, value);\n }\n\n if (next.pathname.length > 1 && next.pathname.endsWith(\"/\")) {\n next.pathname = next.pathname.slice(0, -1);\n }\n\n if (next.pathname === \"/\") {\n return `${next.protocol}//${next.host}${next.search}`;\n }\n\n return next.toString();\n};\n\nconst percentile = (values: number[], ratio: number): number => {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.min(sorted.length - 1, Math.max(0, Math.ceil(sorted.length * ratio) - 1));\n return sorted[index] ?? 0;\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst compareFrontierNodes = (\n left: FrontierNode,\n right: FrontierNode,\n strategy: CrawlStrategy\n): number => {\n if (left.depth !== right.depth) {\n return strategy === \"dfs\"\n ? right.depth - left.depth\n : left.depth - right.depth;\n }\n if (left.firstSeenOrder !== right.firstSeenOrder) {\n return strategy === \"dfs\"\n ? right.firstSeenOrder - left.firstSeenOrder\n : left.firstSeenOrder - right.firstSeenOrder;\n }\n if (left.sourcePriority !== right.sourcePriority) {\n return left.sourcePriority - right.sourcePriority;\n }\n if (left.sequence !== right.sequence) {\n return strategy === \"dfs\"\n ? right.sequence - left.sequence\n : left.sequence - right.sequence;\n }\n return left.url.localeCompare(right.url);\n};\n\nconst dequeueNode = (\n frontier: FrontierNode[],\n strategy: CrawlStrategy\n): FrontierNode | undefined => {\n if (frontier.length === 0) return undefined;\n frontier.sort((left, right) => compareFrontierNodes(left, right, strategy));\n return frontier.shift();\n};\n\nconst resolveFrontierDomain = (url: string): string => {\n try {\n return new URL(url).hostname.toLowerCase();\n } catch {\n return \"__invalid__\";\n }\n};\n\nconst enqueueFrontierNode = (\n frontierByDomain: Map<string, FrontierNode[]>,\n node: FrontierNode\n): void => {\n const domain = resolveFrontierDomain(node.url);\n const queue = frontierByDomain.get(domain) ?? [];\n queue.push(node);\n frontierByDomain.set(domain, queue);\n};\n\nconst frontierSize = (frontierByDomain: Map<string, FrontierNode[]>): number => {\n let size = 0;\n for (const queue of frontierByDomain.values()) {\n size += queue.length;\n }\n return size;\n};\n\nconst dequeueFrontierByDomain = (\n frontierByDomain: Map<string, FrontierNode[]>,\n strategy: CrawlStrategy\n): FrontierNode | undefined => {\n let selectedDomain: string | undefined;\n let selected: FrontierNode | undefined;\n\n for (const [domain, queue] of frontierByDomain.entries()) {\n if (queue.length === 0) continue;\n queue.sort((left, right) => compareFrontierNodes(left, right, strategy));\n const candidate = queue[0];\n if (!candidate) continue;\n if (!selected || compareFrontierNodes(candidate, selected, strategy) < 0) {\n selected = candidate;\n selectedDomain = domain;\n }\n }\n\n if (!selectedDomain || !selected) {\n return undefined;\n }\n\n const queue = frontierByDomain.get(selectedDomain);\n if (!queue || queue.length === 0) {\n return undefined;\n }\n const next = queue.shift();\n if (queue.length === 0) {\n frontierByDomain.delete(selectedDomain);\n }\n return next;\n};\n\nconst waitForNextTask = async (\n tasks: Map<number, Promise<CrawlTaskResult>>\n): Promise<CrawlTaskResult> => {\n return Promise.race([...tasks.values()]);\n};\n\nconst sortPageEntries = (entries: CrawlPageEntry[]): CrawlPage[] => {\n return [...entries]\n .sort((left, right) => {\n if (left.firstSeenAtMs !== right.firstSeenAtMs) {\n return left.firstSeenAtMs - right.firstSeenAtMs;\n }\n if (left.sourcePriority !== right.sourcePriority) {\n return left.sourcePriority - right.sourcePriority;\n }\n if (left.stableRecordId !== right.stableRecordId) {\n return left.stableRecordId.localeCompare(right.stableRecordId);\n }\n return left.sequence - right.sequence;\n })\n .map((entry) => entry.page);\n};\n\nconst executeTask = async (args: {\n node: FrontierNode;\n fetcher: CrawlFetcher;\n selectors: string[];\n policyWarnings: string[];\n workerPool: CrawlWorkerPool;\n}): Promise<CrawlTaskResult> => {\n const startedAt = Date.now();\n const taskWarnings: string[] = [];\n let status = 0;\n let html = \"\";\n\n try {\n const response = await args.fetcher(args.node.url);\n status = response.status ?? 200;\n html = response.html;\n } catch {\n taskWarnings.push(`${args.node.url}: fetch failed`);\n return {\n sequence: args.node.sequence,\n firstSeenAtMs: args.node.firstSeenAtMs,\n sourcePriority: args.node.sourcePriority,\n stableRecordId: args.node.stableRecordId,\n page: null,\n links: [],\n warnings: taskWarnings,\n latencyMs: Math.max(0, Date.now() - startedAt)\n };\n }\n\n let extracted = extractCrawlContentInline({\n url: args.node.url,\n html,\n selectors: args.selectors\n });\n try {\n extracted = await args.workerPool.extract({\n url: args.node.url,\n html,\n selectors: args.selectors\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.startsWith(\"crawl_worker_queue_overflow:\")) {\n taskWarnings.push(`${args.node.url}: worker queue saturated`);\n } else {\n taskWarnings.push(`${args.node.url}: worker extraction fallback`);\n }\n }\n\n const links = extracted.links\n .map((link) => canonicalizeUrl(link))\n .filter((link) => isHttpUrl(link));\n\n return {\n sequence: args.node.sequence,\n firstSeenAtMs: args.node.firstSeenAtMs,\n sourcePriority: args.node.sourcePriority,\n stableRecordId: args.node.stableRecordId,\n page: {\n url: args.node.url,\n canonicalUrl: args.node.url,\n depth: args.node.depth,\n status,\n text: extracted.text,\n links,\n selectors: extracted.selectors,\n warnings: args.policyWarnings\n },\n links,\n warnings: taskWarnings,\n latencyMs: Math.max(0, Date.now() - startedAt)\n };\n};\n\nexport const crawlWeb = async (options: CrawlOptions): Promise<CrawlResult> => {\n const startedAt = Date.now();\n const budget: CrawlBudget = {\n ...DEFAULT_BUDGET,\n ...(options.budget ?? {})\n };\n const pipeline: CrawlPipelineBudget = {\n ...DEFAULT_PIPELINE,\n ...(options.pipeline ?? {}),\n ...(typeof options.workerThreads === \"number\" ? { workerThreads: options.workerThreads } : {}),\n ...(typeof options.queueMax === \"number\" ? { queueMax: options.queueMax } : {})\n };\n\n const strategy: CrawlStrategy = options.strategy ?? \"bfs\";\n const fetchConcurrency = Math.max(1, Math.floor(pipeline.fetchConcurrency));\n const workerPool = createCrawlWorkerPool({\n workerThreads: pipeline.workerThreads,\n queueMax: pipeline.queueMax,\n forceInline: options.forceInlineParse\n });\n\n let nextSequence = 0;\n let nextFirstSeenOrder = 0;\n const frontierByDomain = new Map<string, FrontierNode[]>();\n const visited = new Set<string>();\n const queued = new Set<string>();\n for (const seed of options.seeds) {\n const canonicalSeed = canonicalizeUrl(seed);\n const node: FrontierNode = {\n url: canonicalSeed,\n depth: 0,\n sequence: nextSequence++,\n firstSeenOrder: nextFirstSeenOrder,\n firstSeenAtMs: startedAt + nextFirstSeenOrder,\n sourcePriority: 0,\n stableRecordId: canonicalSeed\n };\n nextFirstSeenOrder += 1;\n enqueueFrontierNode(frontierByDomain, node);\n queued.add(canonicalSeed);\n }\n const domainCounts = new Map<string, number>();\n const pageEntries: CrawlPageEntry[] = [];\n const graph: Array<{ from: string; to: string }> = [];\n const warnings: string[] = [];\n const latencies: number[] = [];\n let deduped = 0;\n\n const inFlight = new Map<number, Promise<CrawlTaskResult>>();\n const completed = new Map<number, CrawlTaskResult>();\n const scheduledOrder: number[] = [];\n let appliedOrderIndex = 0;\n\n try {\n while (frontierSize(frontierByDomain) > 0 || inFlight.size > 0) {\n while (\n frontierSize(frontierByDomain) > 0\n && inFlight.size < fetchConcurrency\n && pageEntries.length + inFlight.size < budget.maxPages\n ) {\n const node = dequeueFrontierByDomain(frontierByDomain, strategy);\n if (!node) break;\n\n queued.delete(node.url);\n if (visited.has(node.url)) {\n deduped += 1;\n continue;\n }\n\n const decision = evaluateWebCrawlPolicy(node.url, options.policy);\n if (!decision.allowed) {\n warnings.push(`${node.url}: ${decision.reason ?? \"blocked\"}`);\n continue;\n }\n if (decision.warnings.length > 0) {\n warnings.push(...decision.warnings.map((warning) => `${node.url}: ${warning}`));\n }\n\n let hostname: string;\n try {\n hostname = new URL(node.url).hostname.toLowerCase();\n } catch {\n warnings.push(`${node.url}: invalid hostname`);\n continue;\n }\n\n const currentDomainCount = domainCounts.get(hostname) ?? 0;\n if (currentDomainCount >= budget.maxPerDomain) {\n warnings.push(`${node.url}: per-domain budget exceeded`);\n continue;\n }\n\n visited.add(node.url);\n domainCounts.set(hostname, currentDomainCount + 1);\n\n const task = executeTask({\n node,\n fetcher: options.fetcher,\n selectors: options.selectors ?? [],\n policyWarnings: decision.warnings,\n workerPool\n });\n inFlight.set(node.sequence, task);\n scheduledOrder.push(node.sequence);\n }\n\n if (inFlight.size === 0) {\n break;\n }\n\n const completedTask = await waitForNextTask(inFlight);\n inFlight.delete(completedTask.sequence);\n completed.set(completedTask.sequence, completedTask);\n\n while (appliedOrderIndex < scheduledOrder.length) {\n const sequence = scheduledOrder[appliedOrderIndex];\n if (typeof sequence !== \"number\") break;\n const ready = completed.get(sequence);\n if (!ready) break;\n\n appliedOrderIndex += 1;\n completed.delete(sequence);\n latencies.push(ready.latencyMs);\n if (ready.warnings.length > 0) {\n warnings.push(...ready.warnings);\n }\n if (!ready.page) {\n continue;\n }\n\n pageEntries.push({\n page: ready.page,\n firstSeenAtMs: ready.firstSeenAtMs,\n sourcePriority: ready.sourcePriority,\n stableRecordId: ready.stableRecordId,\n sequence: ready.sequence\n });\n if (pageEntries.length >= budget.maxPages) {\n continue;\n }\n\n for (const link of ready.links) {\n graph.push({ from: ready.page.url, to: link });\n if (ready.page.depth >= budget.maxDepth) continue;\n\n const linkDecision = evaluateWebCrawlPolicy(link, options.policy);\n if (!linkDecision.allowed) {\n warnings.push(`${link}: ${linkDecision.reason ?? \"blocked\"}`);\n continue;\n }\n if (linkDecision.warnings.length > 0) {\n warnings.push(...linkDecision.warnings.map((warning) => `${link}: ${warning}`));\n }\n\n if (visited.has(link) || queued.has(link)) {\n deduped += 1;\n continue;\n }\n if (frontierSize(frontierByDomain) >= pipeline.frontierMax) {\n warnings.push(`${link}: crawl frontier saturated`);\n continue;\n }\n\n const node: FrontierNode = {\n url: link,\n depth: ready.page.depth + 1,\n sequence: nextSequence++,\n firstSeenOrder: nextFirstSeenOrder,\n firstSeenAtMs: startedAt + nextFirstSeenOrder,\n sourcePriority: 1,\n stableRecordId: canonicalizeUrl(link)\n };\n nextFirstSeenOrder += 1;\n enqueueFrontierNode(frontierByDomain, node);\n queued.add(link);\n }\n }\n }\n } finally {\n await workerPool.close();\n }\n\n const pages = sortPageEntries(pageEntries);\n const elapsedMs = Math.max(1, Date.now() - startedAt);\n const pagesPerMinute = pages.length / (elapsedMs / 60000);\n\n return {\n pages,\n graph,\n warnings,\n metrics: {\n visited: visited.size,\n fetched: pages.length,\n deduped,\n elapsedMs,\n pagesPerMinute,\n p50LatencyMs: percentile(latencies, 0.5),\n p95LatencyMs: percentile(latencies, 0.95)\n }\n };\n};\n\nexport const __test__ = {\n percentile,\n isHttpUrl,\n compareFrontierNodes,\n dequeueNode,\n resolveFrontierDomain,\n enqueueFrontierNode,\n frontierSize,\n dequeueFrontierByDomain,\n sortPageEntries,\n waitForNextTask\n};\n","import { ProviderRuntimeError } from \"../errors\";\nimport { normalizeRecord, normalizeRecords } from \"../normalize\";\nimport { assertPostPolicy, type PostPolicyHook } from \"../shared/post-policy\";\nimport { isLikelyDocumentUrl } from \"../shared/traversal-url\";\nimport { canonicalizeUrl } from \"../web/crawler\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderCapabilities,\n ProviderContext,\n ProviderCrawlInput,\n ProviderFetchInput,\n ProviderPostInput,\n ProviderSearchInput\n} from \"../types\";\n\nconst COMMUNITY_SOURCE = \"community\" as const;\n\ntype CommunityRow = {\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n};\n\ntype CommunityFetchRow = {\n url?: string;\n title?: string;\n content?: string;\n attributes?: Record<string, JsonValue>;\n};\n\ninterface TraversalNode {\n url: string;\n hop: number;\n page: number;\n parent: string;\n}\n\nexport interface CommunityTraversalBudget {\n pageLimit: number;\n hopLimit: number;\n expansionPerRecord: number;\n maxRecords: number;\n}\n\nexport interface CommunityProviderOptions {\n id?: string;\n platform?: string;\n search?: (input: ProviderSearchInput, context: ProviderContext) => Promise<CommunityRow[]>;\n fetch?: (input: ProviderFetchInput, context: ProviderContext) => Promise<CommunityFetchRow>;\n crawl?: (input: ProviderCrawlInput, context: ProviderContext) => Promise<Array<{ url: string; title?: string; content?: string; attributes?: Record<string, JsonValue> }>>;\n post?: (input: ProviderPostInput, context: ProviderContext) => Promise<{ url?: string; title?: string; content?: string; attributes?: Record<string, JsonValue> }>;\n postPolicyHooks?: PostPolicyHook[];\n defaultTraversal?: Partial<CommunityTraversalBudget>;\n}\n\nconst DEFAULT_TRAVERSAL: CommunityTraversalBudget = {\n pageLimit: 2,\n hopLimit: 1,\n expansionPerRecord: 5,\n maxRecords: 25\n};\n\nconst LINK_RE = /https?:\\/\\/[^\\s\"'<>]+/g;\n\nconst createCapabilities = (id: string, platform: string): ProviderCapabilities => ({\n providerId: id,\n source: COMMUNITY_SOURCE,\n operations: {\n search: { op: \"search\", supported: true, description: \"Search community threads\" },\n fetch: { op: \"fetch\", supported: true, description: \"Fetch a community thread or post\" },\n crawl: { op: \"crawl\", supported: true, description: \"Crawl linked community discussions\" },\n post: { op: \"post\", supported: true, description: \"Create a community post with policy gates\" }\n },\n policy: {\n posting: \"gated\",\n riskNoticeRequired: true,\n confirmationRequired: true\n },\n metadata: {\n platform,\n source: COMMUNITY_SOURCE\n }\n});\n\nconst asNumber = (value: JsonValue | undefined): number | undefined => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n};\n\nconst toPositiveInt = (value: number | undefined, fallback: number): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) return fallback;\n return Math.max(1, Math.floor(value));\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst coerceStringArray = (value: JsonValue | undefined): string[] => {\n if (!Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === \"string\");\n};\n\nconst extractLinks = (\n row: { attributes?: Record<string, JsonValue>; content?: string },\n fallbackUrl: string\n): string[] => {\n const attributeLinks = [\n ...coerceStringArray(row.attributes?.links),\n ...coerceStringArray(row.attributes?.threadLinks),\n ...coerceStringArray(row.attributes?.replyLinks),\n ...coerceStringArray(row.attributes?.relatedUrls)\n ];\n const contentLinks = [...(row.content?.match(LINK_RE) ?? [])];\n const deduped = new Set<string>();\n for (const candidate of [...attributeLinks, ...contentLinks]) {\n const canonical = canonicalizeUrl(candidate);\n if (!isHttpUrl(canonical) || canonical === fallbackUrl || !isLikelyDocumentUrl(canonical)) continue;\n deduped.add(canonical);\n }\n return [...deduped].sort((left, right) => left.localeCompare(right));\n};\n\nconst qualityFlags = (args: {\n url: string;\n title?: string;\n content?: string;\n page: number;\n hop: number;\n expandedLinks: number;\n}): Record<string, JsonValue> => ({\n hasUrl: args.url.length > 0,\n hasTitle: typeof args.title === \"string\" && args.title.length > 0,\n hasContent: typeof args.content === \"string\" && args.content.length > 0,\n contentChars: args.content?.length ?? 0,\n page: args.page,\n hop: args.hop,\n expanded: args.hop > 0,\n expandedLinks: args.expandedLinks\n});\n\nconst mergedTraversal = (\n options: CommunityProviderOptions,\n input: { limit?: number; filters?: Record<string, JsonValue> }\n): CommunityTraversalBudget => {\n const filters = input.filters ?? {};\n return {\n pageLimit: toPositiveInt(\n asNumber(filters.pageLimit) ?? options.defaultTraversal?.pageLimit,\n DEFAULT_TRAVERSAL.pageLimit\n ),\n hopLimit: toPositiveInt(\n asNumber(filters.hopLimit) ?? options.defaultTraversal?.hopLimit,\n DEFAULT_TRAVERSAL.hopLimit\n ),\n expansionPerRecord: toPositiveInt(\n asNumber(filters.expansionPerRecord) ?? options.defaultTraversal?.expansionPerRecord,\n DEFAULT_TRAVERSAL.expansionPerRecord\n ),\n maxRecords: toPositiveInt(\n input.limit ?? asNumber(filters.maxRecords) ?? options.defaultTraversal?.maxRecords,\n DEFAULT_TRAVERSAL.maxRecords\n )\n };\n};\n\nconst unavailable = (id: string, message: string): ProviderRuntimeError => {\n return new ProviderRuntimeError(\"unavailable\", message, {\n provider: id,\n source: COMMUNITY_SOURCE\n });\n};\n\nconst shouldSkipExpansionError = (error: unknown): boolean => {\n if (!(error instanceof ProviderRuntimeError)) return false;\n return error.code === \"auth\"\n || error.code === \"network\"\n || error.code === \"rate_limited\"\n || error.code === \"timeout\"\n || error.code === \"unavailable\"\n || error.code === \"upstream\";\n};\n\nconst sortRows = <T extends { url: string; title?: string }>(rows: T[]): T[] => {\n return [...rows].sort((left, right) => {\n const leftUrl = canonicalizeUrl(left.url);\n const rightUrl = canonicalizeUrl(right.url);\n const byUrl = leftUrl.localeCompare(rightUrl);\n if (byUrl !== 0) return byUrl;\n return (left.title ?? \"\").localeCompare(right.title ?? \"\");\n });\n};\n\nexport const createCommunityProvider = (options: CommunityProviderOptions = {}): ProviderAdapter => {\n const id = options.id ?? \"community/default\";\n const platform = options.platform ?? \"community\";\n\n const search = async (input: ProviderSearchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!input.query.trim()) {\n throw new ProviderRuntimeError(\"invalid_input\", \"Community search query is required\", {\n provider: id,\n source: COMMUNITY_SOURCE,\n retryable: false\n });\n }\n if (!options.search) {\n throw unavailable(id, \"Community search retrieval is not configured\");\n }\n\n const traversal = mergedTraversal(options, input);\n const seen = new Set<string>();\n const pending: TraversalNode[] = [];\n const rows: CommunityRow[] = [];\n\n for (let page = 1; page <= traversal.pageLimit && rows.length < traversal.maxRecords; page += 1) {\n const pageRows = await options.search({\n ...input,\n filters: {\n ...(input.filters ?? {}),\n page\n }\n }, context);\n for (const row of sortRows(pageRows)) {\n const canonical = canonicalizeUrl(row.url);\n if (!isHttpUrl(canonical) || seen.has(canonical)) continue;\n seen.add(canonical);\n rows.push({\n ...row,\n url: canonical,\n attributes: {\n ...(row.attributes ?? {}),\n traversal: {\n page,\n hop: 0\n },\n extractionQuality: qualityFlags({\n url: canonical,\n title: row.title,\n content: row.content,\n page,\n hop: 0,\n expandedLinks: 0\n })\n }\n });\n if (rows.length >= traversal.maxRecords) break;\n\n const links = extractLinks(row, canonical).slice(0, traversal.expansionPerRecord);\n for (const link of links) {\n pending.push({\n url: link,\n hop: 1,\n page,\n parent: canonical\n });\n }\n }\n }\n\n while (options.fetch && pending.length > 0 && rows.length < traversal.maxRecords) {\n const next = pending.shift();\n if (!next || next.hop > traversal.hopLimit) continue;\n const canonical = canonicalizeUrl(next.url);\n if (seen.has(canonical)) continue;\n\n let fetched: CommunityFetchRow;\n try {\n fetched = await options.fetch({\n url: canonical,\n filters: {\n ...(input.filters ?? {}),\n hop: next.hop,\n parent: next.parent\n }\n }, context);\n } catch (error) {\n if (shouldSkipExpansionError(error)) continue;\n throw error;\n }\n const resolvedUrl = canonicalizeUrl(fetched.url ?? canonical);\n if (!isHttpUrl(resolvedUrl) || seen.has(resolvedUrl)) continue;\n seen.add(resolvedUrl);\n\n const links = extractLinks(fetched, resolvedUrl).slice(0, traversal.expansionPerRecord);\n rows.push({\n url: resolvedUrl,\n title: fetched.title,\n content: fetched.content,\n confidence: 0.6,\n attributes: {\n ...(fetched.attributes ?? {}),\n traversal: {\n page: next.page,\n hop: next.hop,\n parent: next.parent\n },\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: fetched.title,\n content: fetched.content,\n page: next.page,\n hop: next.hop,\n expandedLinks: links.length\n })\n }\n });\n\n if (next.hop < traversal.hopLimit) {\n for (const link of links) {\n if (seen.has(link)) continue;\n pending.push({\n url: link,\n hop: next.hop + 1,\n page: next.page,\n parent: resolvedUrl\n });\n }\n }\n }\n\n return normalizeRecords(id, COMMUNITY_SOURCE, rows.slice(0, traversal.maxRecords).map((row) => ({\n url: row.url,\n title: row.title,\n content: row.content,\n confidence: row.confidence ?? 0.65,\n attributes: row.attributes\n })));\n };\n\n const fetch = async (input: ProviderFetchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!options.fetch) {\n throw unavailable(id, \"Community fetch retrieval is not configured\");\n }\n const row = await options.fetch(input, context);\n const resolvedUrl = canonicalizeUrl(row.url ?? input.url);\n const links = extractLinks(row, resolvedUrl);\n return [normalizeRecord(id, COMMUNITY_SOURCE, {\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n confidence: 0.7,\n attributes: {\n ...(row.attributes ?? {}),\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n page: 0,\n hop: 0,\n expandedLinks: links.length\n })\n }\n })];\n };\n\n const crawl = async (input: ProviderCrawlInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (options.crawl) {\n const rows = await options.crawl(input, context);\n return normalizeRecords(id, COMMUNITY_SOURCE, sortRows(rows).map((row) => ({\n url: canonicalizeUrl(row.url),\n title: row.title,\n content: row.content,\n confidence: 0.6,\n attributes: {\n ...(row.attributes ?? {}),\n extractionQuality: qualityFlags({\n url: canonicalizeUrl(row.url),\n title: row.title,\n content: row.content,\n page: 0,\n hop: 0,\n expandedLinks: 0\n })\n }\n })));\n }\n if (!options.fetch) {\n throw unavailable(id, \"Community crawl retrieval is not configured\");\n }\n\n const maxPages = Math.max(1, input.maxPages ?? DEFAULT_TRAVERSAL.maxRecords);\n const maxDepth = Math.max(0, input.maxDepth ?? DEFAULT_TRAVERSAL.hopLimit);\n const expansionPerRecord = mergedTraversal(options, {\n filters: input.filters\n }).expansionPerRecord;\n\n const records: Array<{\n url: string;\n title?: string;\n content?: string;\n attributes?: Record<string, JsonValue>;\n }> = [];\n const seen = new Set<string>();\n const queue: Array<{ url: string; depth: number; parent?: string }> = input.seedUrls.map((url) => ({\n url: canonicalizeUrl(url),\n depth: 0\n }));\n\n while (queue.length > 0 && records.length < maxPages) {\n const node = queue.shift();\n if (!node || node.depth > maxDepth) continue;\n const canonical = canonicalizeUrl(node.url);\n if (!isHttpUrl(canonical) || seen.has(canonical)) continue;\n seen.add(canonical);\n\n const row = await options.fetch({\n url: canonical,\n filters: {\n ...(input.filters ?? {}),\n depth: node.depth,\n parent: node.parent ?? \"\"\n }\n }, context);\n const resolvedUrl = canonicalizeUrl(row.url ?? canonical);\n const links = extractLinks(row, resolvedUrl).slice(0, expansionPerRecord);\n\n records.push({\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n attributes: {\n ...(row.attributes ?? {}),\n traversal: {\n depth: node.depth,\n parent: node.parent ?? resolvedUrl\n },\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n page: 0,\n hop: node.depth,\n expandedLinks: links.length\n })\n }\n });\n\n if (node.depth >= maxDepth) continue;\n for (const link of links) {\n if (seen.has(link)) continue;\n queue.push({\n url: link,\n depth: node.depth + 1,\n parent: resolvedUrl\n });\n }\n }\n\n return normalizeRecords(id, COMMUNITY_SOURCE, records.map((row) => ({\n url: row.url,\n title: row.title,\n content: row.content,\n confidence: 0.6,\n attributes: row.attributes\n })));\n };\n\n const post = async (input: ProviderPostInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n const audit = await assertPostPolicy({\n providerId: id,\n source: COMMUNITY_SOURCE,\n payload: input,\n trace: context.trace\n }, options.postPolicyHooks);\n\n if (!options.post) {\n throw unavailable(id, \"Community posting transport is not configured\");\n }\n\n const row = await options.post(input, context);\n return [normalizeRecord(id, COMMUNITY_SOURCE, {\n url: row.url ?? \"\",\n title: row.title ?? `Post to ${input.target}`,\n content: row.content ?? input.content,\n confidence: 1,\n attributes: {\n ...(row.attributes ?? {}),\n auditHash: audit.payloadHash,\n decision: audit.decision\n }\n })];\n };\n\n return {\n id,\n source: COMMUNITY_SOURCE,\n search,\n fetch,\n crawl,\n post,\n health: async () => ({\n status: options.search || options.fetch ? \"healthy\" : \"degraded\",\n updatedAt: new Date().toISOString(),\n ...(options.search || options.fetch ? {} : { reason: \"Retrieval not configured\" })\n }),\n capabilities: () => createCapabilities(id, platform)\n };\n};\n","import { ProviderRuntimeError } from \"../errors\";\nimport { normalizeRecords } from \"../normalize\";\nimport { assertPostPolicy, type PostPolicyHook } from \"../shared/post-policy\";\nimport { isLikelyDocumentUrl } from \"../shared/traversal-url\";\nimport { canonicalizeUrl } from \"../web/crawler\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderCapabilities,\n ProviderContext,\n ProviderFetchInput,\n ProviderPostInput,\n ProviderSearchInput\n} from \"../types\";\n\nconst SOCIAL_SOURCE = \"social\" as const;\n\nexport interface SocialSearchRecord {\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n}\n\ntype SocialFetchRecord = {\n url?: string;\n title?: string;\n content?: string;\n attributes?: Record<string, JsonValue>;\n};\n\ninterface SocialTraversalNode {\n url: string;\n page: number;\n hop: number;\n parent: string;\n}\n\nexport interface SocialTraversalBudget {\n pageLimit: number;\n hopLimit: number;\n expansionPerRecord: number;\n maxRecords: number;\n}\n\nexport interface SocialProviderOptions {\n id?: string;\n search?: (input: ProviderSearchInput, context: ProviderContext) => Promise<SocialSearchRecord[]>;\n fetch?: (input: ProviderFetchInput, context: ProviderContext) => Promise<SocialFetchRecord>;\n post?: (input: ProviderPostInput, context: ProviderContext) => Promise<SocialFetchRecord>;\n postPolicyHooks?: PostPolicyHook[];\n defaultTraversal?: Partial<SocialTraversalBudget>;\n}\n\nexport interface SocialPlatformProfile {\n platform: \"x\" | \"reddit\" | \"bluesky\" | \"facebook\" | \"linkedin\" | \"instagram\" | \"tiktok\" | \"threads\" | \"youtube\";\n displayName: string;\n baseUrl: string;\n maxPostLength: number;\n supportsMedia: boolean;\n supportsThreads: boolean;\n}\n\nconst DEFAULT_TRAVERSAL: SocialTraversalBudget = {\n pageLimit: 2,\n hopLimit: 1,\n expansionPerRecord: 4,\n maxRecords: 20\n};\n\nconst LINK_RE = /https?:\\/\\/[^\\s\"'<>]+/g;\n\nconst capabilitiesForProfile = (providerId: string, profile: SocialPlatformProfile): ProviderCapabilities => ({\n providerId,\n source: SOCIAL_SOURCE,\n operations: {\n search: {\n op: \"search\",\n supported: true,\n description: `Search ${profile.displayName}`,\n metadata: {\n platform: profile.platform,\n supportsMedia: profile.supportsMedia\n }\n },\n fetch: {\n op: \"fetch\",\n supported: true,\n description: `Fetch ${profile.displayName} item`\n },\n crawl: {\n op: \"crawl\",\n supported: false,\n description: \"Social crawl is intentionally disabled\"\n },\n post: {\n op: \"post\",\n supported: true,\n description: `Post to ${profile.displayName} with policy confirmation`,\n metadata: {\n maxPostLength: profile.maxPostLength,\n supportsMedia: profile.supportsMedia,\n supportsThreads: profile.supportsThreads\n }\n }\n },\n policy: {\n posting: \"gated\",\n riskNoticeRequired: true,\n confirmationRequired: true\n },\n metadata: {\n platform: profile.platform,\n displayName: profile.displayName,\n source: SOCIAL_SOURCE,\n maxPostLength: profile.maxPostLength,\n supportsMedia: profile.supportsMedia,\n supportsThreads: profile.supportsThreads\n }\n});\n\nconst asNumber = (value: JsonValue | undefined): number | undefined => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n};\n\nconst toPositiveInt = (value: number | undefined, fallback: number): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) return fallback;\n return Math.max(1, Math.floor(value));\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst coerceStringArray = (value: JsonValue | undefined): string[] => {\n if (!Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === \"string\");\n};\n\nconst extractLinks = (\n row: { attributes?: Record<string, JsonValue>; content?: string },\n fallbackUrl: string\n): string[] => {\n const attributeLinks = [\n ...coerceStringArray(row.attributes?.links),\n ...coerceStringArray(row.attributes?.threadLinks),\n ...coerceStringArray(row.attributes?.replyLinks),\n ...coerceStringArray(row.attributes?.relatedUrls)\n ];\n const contentLinks = [...(row.content?.match(LINK_RE) ?? [])];\n const deduped = new Set<string>();\n for (const candidate of [...attributeLinks, ...contentLinks]) {\n const canonical = canonicalizeUrl(candidate);\n if (!isHttpUrl(canonical) || canonical === fallbackUrl || !isLikelyDocumentUrl(canonical)) continue;\n deduped.add(canonical);\n }\n return [...deduped].sort((left, right) => left.localeCompare(right));\n};\n\nconst qualityFlags = (args: {\n url: string;\n title?: string;\n content?: string;\n page: number;\n hop: number;\n expandedLinks: number;\n}): Record<string, JsonValue> => ({\n hasUrl: args.url.length > 0,\n hasTitle: typeof args.title === \"string\" && args.title.length > 0,\n hasContent: typeof args.content === \"string\" && args.content.length > 0,\n contentChars: args.content?.length ?? 0,\n page: args.page,\n hop: args.hop,\n expanded: args.hop > 0,\n expandedLinks: args.expandedLinks\n});\n\nconst unavailable = (providerId: string, message: string): ProviderRuntimeError => {\n return new ProviderRuntimeError(\"unavailable\", message, {\n provider: providerId,\n source: SOCIAL_SOURCE\n });\n};\n\nconst shouldSkipExpansionError = (error: unknown): boolean => {\n if (!(error instanceof ProviderRuntimeError)) return false;\n return error.code === \"auth\"\n || error.code === \"network\"\n || error.code === \"rate_limited\"\n || error.code === \"timeout\"\n || error.code === \"unavailable\"\n || error.code === \"upstream\";\n};\n\nconst sortRows = <T extends { url: string; title?: string }>(rows: T[]): T[] => {\n return [...rows].sort((left, right) => {\n const leftUrl = canonicalizeUrl(left.url);\n const rightUrl = canonicalizeUrl(right.url);\n const byUrl = leftUrl.localeCompare(rightUrl);\n if (byUrl !== 0) return byUrl;\n return (left.title ?? \"\").localeCompare(right.title ?? \"\");\n });\n};\n\nconst mergedTraversal = (\n input: ProviderSearchInput,\n options: SocialProviderOptions\n): SocialTraversalBudget => {\n const filters = input.filters ?? {};\n return {\n pageLimit: toPositiveInt(\n asNumber(filters.pageLimit) ?? options.defaultTraversal?.pageLimit,\n DEFAULT_TRAVERSAL.pageLimit\n ),\n hopLimit: toPositiveInt(\n asNumber(filters.hopLimit) ?? options.defaultTraversal?.hopLimit,\n DEFAULT_TRAVERSAL.hopLimit\n ),\n expansionPerRecord: toPositiveInt(\n asNumber(filters.expansionPerRecord) ?? options.defaultTraversal?.expansionPerRecord,\n DEFAULT_TRAVERSAL.expansionPerRecord\n ),\n maxRecords: toPositiveInt(\n input.limit ?? asNumber(filters.maxRecords) ?? options.defaultTraversal?.maxRecords,\n DEFAULT_TRAVERSAL.maxRecords\n )\n };\n};\n\nconst normalizeSocialRows = (\n providerId: string,\n profile: SocialPlatformProfile,\n rows: Array<{\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n }>\n): NormalizedRecord[] => {\n return normalizeRecords(providerId, SOCIAL_SOURCE, rows.map((row) => ({\n url: row.url,\n title: row.title,\n content: row.content,\n confidence: row.confidence,\n attributes: {\n platform: profile.platform,\n ...(row.attributes ?? {})\n }\n })));\n};\n\nexport const createSocialPlatformProvider = (\n profile: SocialPlatformProfile,\n options: SocialProviderOptions = {}\n): ProviderAdapter => {\n const providerId = options.id ?? `social/${profile.platform}`;\n\n const search = async (input: ProviderSearchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!input.query.trim()) {\n throw new ProviderRuntimeError(\"invalid_input\", `${profile.displayName} search query is required`, {\n provider: providerId,\n source: SOCIAL_SOURCE,\n retryable: false\n });\n }\n if (!options.search) {\n throw unavailable(providerId, `${profile.displayName} search retrieval is not configured`);\n }\n\n const traversal = mergedTraversal(input, options);\n const seen = new Set<string>();\n const queue: SocialTraversalNode[] = [];\n const rows: Array<{\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n }> = [];\n\n for (let page = 1; page <= traversal.pageLimit && rows.length < traversal.maxRecords; page += 1) {\n const pageRows = await options.search({\n ...input,\n filters: {\n ...(input.filters ?? {}),\n page\n }\n }, context);\n\n for (const row of sortRows(pageRows)) {\n const canonical = canonicalizeUrl(row.url);\n if (!isHttpUrl(canonical) || seen.has(canonical)) continue;\n seen.add(canonical);\n\n rows.push({\n ...row,\n url: canonical,\n attributes: {\n ...(row.attributes ?? {}),\n traversal: {\n page,\n hop: 0\n },\n extractionQuality: qualityFlags({\n url: canonical,\n title: row.title,\n content: row.content,\n page,\n hop: 0,\n expandedLinks: 0\n })\n }\n });\n if (rows.length >= traversal.maxRecords) break;\n\n const links = extractLinks(row, canonical).slice(0, traversal.expansionPerRecord);\n for (const link of links) {\n queue.push({\n url: link,\n page,\n hop: 1,\n parent: canonical\n });\n }\n }\n }\n\n while (options.fetch && queue.length > 0 && rows.length < traversal.maxRecords) {\n const next = queue.shift();\n if (!next || next.hop > traversal.hopLimit) continue;\n const canonical = canonicalizeUrl(next.url);\n if (seen.has(canonical)) continue;\n\n let fetched: SocialFetchRecord;\n try {\n fetched = await options.fetch({\n url: canonical,\n filters: {\n ...(input.filters ?? {}),\n hop: next.hop,\n parent: next.parent\n }\n }, context);\n } catch (error) {\n if (shouldSkipExpansionError(error)) continue;\n throw error;\n }\n const resolvedUrl = canonicalizeUrl(fetched.url ?? canonical);\n if (!isHttpUrl(resolvedUrl) || seen.has(resolvedUrl)) continue;\n seen.add(resolvedUrl);\n\n const links = extractLinks(fetched, resolvedUrl).slice(0, traversal.expansionPerRecord);\n rows.push({\n url: resolvedUrl,\n title: fetched.title,\n content: fetched.content,\n confidence: 0.6,\n attributes: {\n ...(fetched.attributes ?? {}),\n traversal: {\n page: next.page,\n hop: next.hop,\n parent: next.parent\n },\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: fetched.title,\n content: fetched.content,\n page: next.page,\n hop: next.hop,\n expandedLinks: links.length\n })\n }\n });\n\n if (next.hop < traversal.hopLimit) {\n for (const link of links) {\n if (seen.has(link)) continue;\n queue.push({\n url: link,\n page: next.page,\n hop: next.hop + 1,\n parent: resolvedUrl\n });\n }\n }\n }\n\n return normalizeSocialRows(providerId, profile, rows.slice(0, traversal.maxRecords));\n };\n\n const fetch = async (input: ProviderFetchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!options.fetch) {\n throw unavailable(providerId, `${profile.displayName} fetch retrieval is not configured`);\n }\n const row = await options.fetch(input, context);\n const resolvedUrl = canonicalizeUrl(row.url ?? input.url);\n const links = extractLinks(row, resolvedUrl);\n return normalizeSocialRows(providerId, profile, [{\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n confidence: 0.7,\n attributes: {\n ...(row.attributes ?? {}),\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n page: 0,\n hop: 0,\n expandedLinks: links.length\n })\n }\n }]);\n };\n\n const post = async (input: ProviderPostInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (input.content.length > profile.maxPostLength) {\n throw new ProviderRuntimeError(\"invalid_input\", `${profile.displayName} post exceeds max length`, {\n provider: providerId,\n source: SOCIAL_SOURCE,\n retryable: false,\n details: {\n maxPostLength: profile.maxPostLength,\n contentLength: input.content.length\n }\n });\n }\n\n const audit = await assertPostPolicy({\n providerId,\n source: SOCIAL_SOURCE,\n payload: input,\n trace: context.trace\n }, options.postPolicyHooks);\n\n if (!options.post) {\n throw new ProviderRuntimeError(\"unavailable\", `${profile.displayName} posting transport is not configured`, {\n provider: providerId,\n source: SOCIAL_SOURCE,\n retryable: false,\n reasonCode: \"policy_blocked\",\n details: {\n reasonCode: \"policy_blocked\",\n postingTransportConfigured: false\n }\n });\n }\n\n const row = await options.post(input, context);\n return normalizeSocialRows(providerId, profile, [{\n url: canonicalizeUrl(row.url ?? `${profile.baseUrl}/${encodeURIComponent(input.target)}`),\n title: row.title ?? `${profile.displayName} post`,\n content: row.content ?? input.content,\n confidence: 1,\n attributes: {\n ...(row.attributes ?? {}),\n auditHash: audit.payloadHash,\n decision: audit.decision\n }\n }]);\n };\n\n return {\n id: providerId,\n source: SOCIAL_SOURCE,\n search,\n fetch,\n post,\n health: async () => ({\n status: options.search || options.fetch || options.post ? \"healthy\" : \"degraded\",\n updatedAt: new Date().toISOString(),\n ...(options.search || options.fetch || options.post ? {} : { reason: \"Retrieval not configured\" })\n }),\n capabilities: () => capabilitiesForProfile(providerId, profile)\n };\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createBlueskyProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"bluesky\",\n displayName: \"Bluesky\",\n baseUrl: \"https://bsky.app\",\n maxPostLength: 300,\n supportsMedia: true,\n supportsThreads: true\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createFacebookProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"facebook\",\n displayName: \"Facebook\",\n baseUrl: \"https://www.facebook.com\",\n maxPostLength: 63206,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createInstagramProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"instagram\",\n displayName: \"Instagram\",\n baseUrl: \"https://www.instagram.com\",\n maxPostLength: 2200,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createLinkedInProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"linkedin\",\n displayName: \"LinkedIn\",\n baseUrl: \"https://www.linkedin.com\",\n maxPostLength: 3000,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createRedditProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"reddit\",\n displayName: \"Reddit\",\n baseUrl: \"https://www.reddit.com\",\n maxPostLength: 40000,\n supportsMedia: true,\n supportsThreads: true\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createThreadsProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"threads\",\n displayName: \"Threads\",\n baseUrl: \"https://www.threads.net\",\n maxPostLength: 500,\n supportsMedia: true,\n supportsThreads: true\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createTikTokProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"tiktok\",\n displayName: \"TikTok\",\n baseUrl: \"https://www.tiktok.com\",\n maxPostLength: 2200,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createXProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"x\",\n displayName: \"X\",\n baseUrl: \"https://x.com\",\n maxPostLength: 280,\n supportsMedia: true,\n supportsThreads: true\n }, options);\n};\n","const DEFAULT_PROVIDER_USER_AGENT = \"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_6_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\";\nconst DEFAULT_PROVIDER_ACCEPT_LANGUAGE = \"en-US,en;q=0.9\";\n\nconst normalizeHeaderValue = (value: string | undefined, fallback: string): string => {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : fallback;\n};\n\nexport const providerRequestHeaders = {\n \"user-agent\": normalizeHeaderValue(process.env.OPDEVBROWSER_PROVIDER_USER_AGENT, DEFAULT_PROVIDER_USER_AGENT),\n \"accept-language\": normalizeHeaderValue(process.env.OPDEVBROWSER_PROVIDER_ACCEPT_LANGUAGE, DEFAULT_PROVIDER_ACCEPT_LANGUAGE)\n} as const;\n\n","import { execFile } from \"child_process\";\nimport { mkdtemp, readdir, rm } from \"fs/promises\";\nimport { tmpdir } from \"os\";\nimport * as path from \"path\";\nimport { promisify } from \"util\";\nimport { providerErrorCodeFromReasonCode } from \"../errors\";\nimport type {\n BrowserFallbackPort,\n JsonValue,\n ProviderContext,\n ProviderReasonCode\n} from \"../types\";\n\nconst execFileAsync = promisify(execFile);\n\nconst TRANSCRIPT_FETCH_HEADERS = {\n accept: \"application/xml,text/xml,text/vtt,*/*\"\n} as const;\n\nconst YOUTUBEI_HEADERS = {\n accept: \"application/json\",\n \"content-type\": \"application/json\"\n} as const;\n\nconst APIFY_HEADERS = {\n accept: \"application/json\",\n \"content-type\": \"application/json\"\n} as const;\n\ntype TranscriptPlannerStrategy = \"youtubei\" | \"native_caption_parse\" | \"ytdlp_audio_asr\" | \"apify\";\n\ntype LegacyTranscriptStrategy = \"ytdlp_subtitle\" | \"optional_asr\";\n\nexport type YouTubeTranscriptMode = \"auto\" | \"web\" | \"no-auto\" | \"yt-dlp\" | \"apify\";\n\nexport type YouTubeTranscriptModeInput = YouTubeTranscriptMode | \"ytdlp\";\n\nexport type YouTubeTranscriptStrategyDetail =\n | \"youtubei\"\n | \"native_caption_parse\"\n | \"ytdlp_audio_asr\"\n | \"apify\"\n | \"browser_assisted\";\n\nexport type YouTubeTranscriptStrategy = \"native_caption_parse\" | \"optional_asr\" | \"browser_assisted\";\n\nexport interface YouTubeTranscriptLegalChecklist {\n approvalExpiryDate: string;\n signedOff: boolean;\n approvedTranscriptStrategies: Array<\n | YouTubeTranscriptStrategyDetail\n | YouTubeTranscriptStrategy\n | LegacyTranscriptStrategy\n >;\n}\n\nexport interface YouTubeTranscriptResolverConfig {\n modeDefault: YouTubeTranscriptMode;\n strategyOrder: Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy>;\n enableYtdlp: boolean;\n enableAsr: boolean;\n enableYtdlpAudioAsr: boolean;\n enableApify: boolean;\n apifyActorId: string;\n enableBrowserFallback: boolean;\n ytdlpTimeoutMs: number;\n}\n\nexport interface YouTubeTranscriptAttempt {\n strategy: YouTubeTranscriptStrategyDetail;\n ok: boolean;\n reasonCode?: ProviderReasonCode;\n message?: string;\n details?: Record<string, JsonValue>;\n}\n\nexport interface YouTubeTranscriptSuccess {\n ok: true;\n mode: YouTubeTranscriptMode;\n text: string;\n language: string;\n transcriptStrategy: YouTubeTranscriptStrategy;\n transcriptStrategyDetail: YouTubeTranscriptStrategyDetail;\n attemptChain: YouTubeTranscriptAttempt[];\n}\n\nexport interface YouTubeTranscriptFailure {\n ok: false;\n mode: YouTubeTranscriptMode;\n reasonCode: ProviderReasonCode;\n attemptChain: YouTubeTranscriptAttempt[];\n}\n\nexport type YouTubeTranscriptResolution = YouTubeTranscriptSuccess | YouTubeTranscriptFailure;\n\nexport interface YouTubeTranscriptResolverDependencies {\n context: ProviderContext;\n watchUrl: string;\n pageHtml: string;\n legalChecklist: YouTubeTranscriptLegalChecklist;\n config?: Partial<YouTubeTranscriptResolverConfig>;\n mode?: YouTubeTranscriptModeInput | null;\n browserFallbackPort?: BrowserFallbackPort;\n allowBrowserFallbackEscalation?: boolean;\n asrTranscribe?: (args: {\n watchUrl: string;\n context: ProviderContext;\n audioFilePath?: string;\n }) => Promise<{ text: string; language?: string } | null>;\n}\n\ntype TranscriptFailureResult = {\n ok: false;\n reasonCode: ProviderReasonCode;\n message: string;\n};\n\ntype TranscriptSuccessResult = {\n ok: true;\n text: string;\n language: string;\n};\n\ntype TranscriptFetchResponse = {\n ok: boolean;\n status: number;\n payload: string;\n};\n\ntype CaptionTrack = {\n baseUrl: string;\n languageCode: string;\n name: string;\n kind?: string;\n vssId?: string;\n};\n\ntype ApifyRunResponse = {\n data?: {\n defaultDatasetId?: string;\n };\n};\n\nconst DEFAULT_TRANSCRIPT_RESOLVER_CONFIG: YouTubeTranscriptResolverConfig = {\n modeDefault: \"auto\",\n strategyOrder: [\"youtubei\", \"native_caption_parse\", \"ytdlp_audio_asr\", \"apify\"],\n enableYtdlp: false,\n enableAsr: false,\n enableYtdlpAudioAsr: true,\n enableApify: true,\n apifyActorId: \"streamers/youtube-scraper\",\n enableBrowserFallback: true,\n ytdlpTimeoutMs: 10000\n};\n\nconst dedupeStrategyOrder = (\n order: Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy>\n): Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy> => {\n const seen = new Set<string>();\n const output: Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy> = [];\n for (const strategy of order) {\n if (seen.has(strategy)) continue;\n seen.add(strategy);\n output.push(strategy);\n }\n return output;\n};\n\nconst mapLegacyModeAlias = (value: string): YouTubeTranscriptMode | null => {\n if (value === \"ytdlp\") return \"yt-dlp\";\n if (value === \"auto\" || value === \"web\" || value === \"no-auto\" || value === \"yt-dlp\" || value === \"apify\") {\n return value;\n }\n return null;\n};\n\nexport const normalizeYouTubeTranscriptMode = (\n value: unknown\n): YouTubeTranscriptMode | null => {\n if (typeof value !== \"string\") return null;\n return mapLegacyModeAlias(value.trim().toLowerCase());\n};\n\nconst resolveMode = (\n inputMode: YouTubeTranscriptModeInput | null | undefined,\n fallbackMode: YouTubeTranscriptMode\n): YouTubeTranscriptMode => {\n const normalizedInput = normalizeYouTubeTranscriptMode(inputMode);\n if (normalizedInput) return normalizedInput;\n return normalizeYouTubeTranscriptMode(fallbackMode) ?? \"auto\";\n};\n\nexport const resolveYouTubeTranscriptConfig = (\n config: Partial<YouTubeTranscriptResolverConfig> | undefined\n): YouTubeTranscriptResolverConfig => {\n const merged: YouTubeTranscriptResolverConfig = {\n ...DEFAULT_TRANSCRIPT_RESOLVER_CONFIG,\n ...(config ?? {})\n };\n const dedupedOrder = dedupeStrategyOrder(merged.strategyOrder);\n const normalizedModeDefault = normalizeYouTubeTranscriptMode(merged.modeDefault) ?? \"auto\";\n const enableYtdlpAudioAsr = merged.enableYtdlpAudioAsr || merged.enableYtdlp || merged.enableAsr;\n\n return {\n ...merged,\n modeDefault: normalizedModeDefault,\n strategyOrder: dedupedOrder.includes(\"native_caption_parse\")\n ? dedupedOrder\n : [\"native_caption_parse\", ...dedupedOrder],\n enableYtdlpAudioAsr,\n ytdlpTimeoutMs: Math.min(120000, Math.max(1000, Math.floor(merged.ytdlpTimeoutMs))),\n apifyActorId: merged.apifyActorId.trim() || DEFAULT_TRANSCRIPT_RESOLVER_CONFIG.apifyActorId\n };\n};\n\nconst decodeHtml = (value: string): string => {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\")\n .replace(/"/g, '\"')\n .replace(/\\s+/g, \" \")\n .trim();\n};\n\nconst normalizeEscapedValue = (value: string): string => {\n return value\n .replace(/\\\\u0026/g, \"&\")\n .replace(/\\\\\\//g, \"/\")\n .replace(/\\\\u003d/g, \"=\")\n .replace(/\\\\u002F/g, \"/\");\n};\n\nconst findBalancedSlice = (\n value: string,\n startIndex: number,\n openChar: string,\n closeChar: string\n): string | null => {\n let depth = 0;\n let inString = false;\n let escaping = false;\n for (let index = startIndex; index < value.length; index += 1) {\n const char = value[index];\n if (escaping) {\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n if (inString) escaping = true;\n continue;\n }\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n if (inString) continue;\n\n if (char === openChar) {\n depth += 1;\n continue;\n }\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) {\n return value.slice(startIndex, index + 1);\n }\n }\n }\n return null;\n};\n\nconst findJsonSegmentAfter = (\n value: string,\n marker: string,\n openChar: \"{\" | \"[\",\n closeChar: \"}\" | \"]\"\n): string | null => {\n const markerIndex = value.indexOf(marker);\n if (markerIndex < 0) return null;\n const openIndex = value.indexOf(openChar, markerIndex + marker.length);\n if (openIndex < 0) return null;\n return findBalancedSlice(value, openIndex, openChar, closeChar);\n};\n\nconst parseJson = <T>(value: string | null): T | null => {\n if (!value) return null;\n try {\n return JSON.parse(value) as T;\n } catch {\n try {\n return JSON.parse(normalizeEscapedValue(value)) as T;\n } catch {\n return null;\n }\n }\n};\n\nconst trackNameFromValue = (value: unknown): string => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\";\n const record = value as Record<string, unknown>;\n if (typeof record.simpleText === \"string\") return decodeHtml(record.simpleText);\n if (Array.isArray(record.runs)) {\n return record.runs\n .filter((run): run is { text: string } => Boolean(run && typeof run === \"object\" && !Array.isArray(run) && typeof (run as { text?: unknown }).text === \"string\"))\n .map((run) => decodeHtml(run.text))\n .join(\"\")\n .trim();\n }\n return \"\";\n};\n\nconst extractCaptionTracks = (html: string): CaptionTrack[] => {\n const block = findJsonSegmentAfter(html, '\"captionTracks\":', \"[\", \"]\");\n const parsed = parseJson<unknown[]>(block);\n if (!Array.isArray(parsed)) return [];\n\n const tracks: CaptionTrack[] = [];\n for (const candidate of parsed) {\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue;\n const record = candidate as Record<string, unknown>;\n const rawBaseUrl = record.baseUrl;\n const rawLanguage = record.languageCode;\n if (typeof rawBaseUrl !== \"string\" || typeof rawLanguage !== \"string\") continue;\n tracks.push({\n baseUrl: normalizeEscapedValue(rawBaseUrl),\n languageCode: rawLanguage,\n name: trackNameFromValue(record.name),\n kind: typeof record.kind === \"string\" ? record.kind : undefined,\n vssId: typeof record.vssId === \"string\" ? record.vssId : undefined\n });\n }\n return tracks;\n};\n\nconst isAutomaticCaptionTrack = (track: CaptionTrack): boolean => {\n if (track.kind?.toLowerCase() === \"asr\") return true;\n if (track.vssId?.startsWith(\"a.\")) return true;\n if (/auto[- ]generated/i.test(track.name)) return true;\n return false;\n};\n\nconst isEnglishLike = (languageCode: string): boolean => {\n return languageCode.toLowerCase().startsWith(\"en\");\n};\n\nconst pickCaptionTrack = (tracks: CaptionTrack[], manualOnly: boolean): CaptionTrack | null => {\n const eligible = manualOnly\n ? tracks.filter((track) => !isAutomaticCaptionTrack(track))\n : tracks;\n if (eligible.length === 0) return null;\n\n const sorted = [...eligible].sort((left, right) => {\n const leftManual = isAutomaticCaptionTrack(left) ? 0 : 1;\n const rightManual = isAutomaticCaptionTrack(right) ? 0 : 1;\n if (leftManual !== rightManual) return rightManual - leftManual;\n\n const leftEnglish = isEnglishLike(left.languageCode) ? 1 : 0;\n const rightEnglish = isEnglishLike(right.languageCode) ? 1 : 0;\n if (leftEnglish !== rightEnglish) return rightEnglish - leftEnglish;\n\n return left.languageCode.localeCompare(right.languageCode);\n });\n\n return sorted[0] ?? null;\n};\n\nexport const findCaptionBaseUrl = (html: string): string | null => {\n const track = pickCaptionTrack(extractCaptionTracks(html), false);\n return track?.baseUrl ?? null;\n};\n\nexport const findTranscriptLanguage = (html: string): string => {\n const track = pickCaptionTrack(extractCaptionTracks(html), false);\n return track?.languageCode ?? \"unknown\";\n};\n\nconst parseTranscriptXml = (xml: string): string => {\n const chunks = [...xml.matchAll(/<text[^>]*>([\\s\\S]*?)<\\/text>/g)]\n .map((match) => decodeHtml(match[1] ?? \"\"))\n .filter(Boolean);\n return chunks.join(\"\\n\").trim();\n};\n\nconst parseTranscriptVtt = (vtt: string): string => {\n return vtt\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .filter((line) => !/^WEBVTT/i.test(line))\n .filter((line) => !/^\\d{1,2}:\\d{2}(?::\\d{2})?\\.\\d{3}\\s+-->\\s+\\d{1,2}:\\d{2}(?::\\d{2})?\\.\\d{3}/.test(line))\n .filter((line) => !/^\\d+$/.test(line))\n .join(\"\\n\")\n .trim();\n};\n\nconst parseTranscriptPayload = (payload: string): string => {\n if (payload.includes(\"<text\")) return parseTranscriptXml(payload);\n return parseTranscriptVtt(payload);\n};\n\nconst parseTranscriptJson3 = (payload: string): string => {\n const parsed = parseJson<Record<string, unknown>>(payload);\n if (!parsed) return \"\";\n const events = parsed.events;\n if (!Array.isArray(events)) return \"\";\n\n const lines = events\n .map((event) => {\n if (!event || typeof event !== \"object\" || Array.isArray(event)) return \"\";\n const segs = (event as Record<string, unknown>).segs;\n if (!Array.isArray(segs)) return \"\";\n const text = segs\n .map((segment) => {\n if (!segment || typeof segment !== \"object\" || Array.isArray(segment)) return \"\";\n const utf8 = (segment as Record<string, unknown>).utf8;\n return typeof utf8 === \"string\" ? decodeHtml(utf8) : \"\";\n })\n .join(\"\")\n .trim();\n return text;\n })\n .filter(Boolean);\n\n return lines.join(\"\\n\").trim();\n};\n\nconst toTranscriptFetchReasonCode = (status: number): ProviderReasonCode => {\n if (status === 401 || status === 403) return \"token_required\";\n if (status === 429) return \"rate_limited\";\n return \"transcript_unavailable\";\n};\n\nconst fetchTranscriptPayload = async (\n transcriptUrl: string,\n context: ProviderContext,\n acceptHeader: string\n): Promise<TranscriptFetchResponse> => {\n try {\n const response = await fetch(transcriptUrl, {\n headers: {\n ...TRANSCRIPT_FETCH_HEADERS,\n accept: acceptHeader\n },\n signal: context.signal,\n redirect: \"follow\"\n });\n return {\n ok: response.ok,\n status: response.status,\n payload: await response.text()\n };\n } catch {\n return {\n ok: false,\n status: 0,\n payload: \"\"\n };\n }\n};\n\nconst withQueryParam = (baseUrl: string, key: string, value: string): string => {\n try {\n const url = new URL(baseUrl);\n url.searchParams.set(key, value);\n return url.toString();\n } catch {\n return baseUrl;\n }\n};\n\nconst resolveNativeCaptionTranscript = async (args: {\n pageHtml: string;\n context: ProviderContext;\n manualOnly: boolean;\n}): Promise<TranscriptSuccessResult | TranscriptFailureResult> => {\n const tracks = extractCaptionTracks(args.pageHtml);\n const selectedTrack = pickCaptionTrack(tracks, args.manualOnly);\n if (!selectedTrack) {\n return {\n ok: false,\n reasonCode: \"caption_missing\",\n message: args.manualOnly\n ? \"No creator-provided caption track was found.\"\n : \"No caption track URL found in page payload.\"\n };\n }\n\n const json3Url = withQueryParam(selectedTrack.baseUrl, \"fmt\", \"json3\");\n const json3Response = await fetchTranscriptPayload(json3Url, args.context, \"application/json,text/plain,*/*\");\n if (json3Response.ok) {\n const json3Text = parseTranscriptJson3(json3Response.payload);\n if (json3Text) {\n return {\n ok: true,\n text: json3Text,\n language: selectedTrack.languageCode || \"unknown\"\n };\n }\n } else if (json3Response.status === 401 || json3Response.status === 403 || json3Response.status === 429) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(json3Response.status),\n message: `Caption JSON3 endpoint returned HTTP ${json3Response.status}.`\n };\n }\n\n const fallbackResponse = await fetchTranscriptPayload(selectedTrack.baseUrl, args.context, TRANSCRIPT_FETCH_HEADERS.accept);\n if (!fallbackResponse.ok) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(fallbackResponse.status),\n message: fallbackResponse.status > 0\n ? `Caption endpoint returned HTTP ${fallbackResponse.status}.`\n : \"Caption endpoint request failed.\"\n };\n }\n\n const text = parseTranscriptPayload(fallbackResponse.payload);\n if (!text) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Caption endpoint returned no transcript payload.\"\n };\n }\n\n return {\n ok: true,\n text,\n language: selectedTrack.languageCode || \"unknown\"\n };\n};\n\nconst firstNonEmptyMatch = (value: string, patterns: RegExp[]): string | null => {\n for (const pattern of patterns) {\n const match = value.match(pattern)?.[1];\n if (match && match.trim().length > 0) {\n return decodeHtml(normalizeEscapedValue(match));\n }\n }\n return null;\n};\n\nconst extractYoutubeiContext = (html: string): Record<string, unknown> | null => {\n const fromObject = parseJson<Record<string, unknown>>(findJsonSegmentAfter(html, '\"INNERTUBE_CONTEXT\":', \"{\", \"}\"));\n if (fromObject) return fromObject;\n\n const clientName = firstNonEmptyMatch(html, [\n /\"INNERTUBE_CONTEXT_CLIENT_NAME\":\"([^\"]+)\"/,\n /\"clientName\":\"([^\"]+)\"/\n ]);\n const clientVersion = firstNonEmptyMatch(html, [\n /\"INNERTUBE_CONTEXT_CLIENT_VERSION\":\"([^\"]+)\"/,\n /\"clientVersion\":\"([^\"]+)\"/\n ]);\n\n if (!clientName || !clientVersion) return null;\n return {\n client: {\n clientName,\n clientVersion\n }\n };\n};\n\nconst extractYoutubeiTranscriptParams = (html: string): string | null => {\n return firstNonEmptyMatch(html, [\n /\"getTranscriptEndpoint\"\\s*:\\s*\\{\\s*\"params\"\\s*:\\s*\"([^\"]+)\"/,\n /\"params\"\\s*:\\s*\"([^\"]+)\"\\s*,\\s*\"commandMetadata\"\\s*:\\s*\\{\\s*\"webCommandMetadata\"\\s*:\\s*\\{\\s*\"apiUrl\"\\s*:\\s*\"\\\\\\/youtubei\\\\\\/v1\\\\\\/get_transcript\"/\n ]);\n};\n\nconst runTextFromRenderer = (value: unknown): string => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\";\n const record = value as Record<string, unknown>;\n if (typeof record.simpleText === \"string\") return decodeHtml(record.simpleText);\n if (!Array.isArray(record.runs)) return \"\";\n return record.runs\n .map((entry) => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return \"\";\n const text = (entry as Record<string, unknown>).text;\n return typeof text === \"string\" ? decodeHtml(text) : \"\";\n })\n .join(\"\")\n .trim();\n};\n\nconst collectYoutubeiSegments = (payload: unknown): string[] => {\n const segments: string[] = [];\n const queue: unknown[] = [payload];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n\n if (Array.isArray(current)) {\n for (const entry of current) {\n queue.push(entry);\n }\n continue;\n }\n\n if (typeof current !== \"object\") continue;\n const record = current as Record<string, unknown>;\n\n const renderer = record.transcriptSegmentRenderer;\n if (renderer && typeof renderer === \"object\" && !Array.isArray(renderer)) {\n const text = runTextFromRenderer((renderer as Record<string, unknown>).snippet);\n if (text) segments.push(text);\n }\n\n for (const value of Object.values(record)) {\n queue.push(value);\n }\n }\n\n return segments;\n};\n\nconst findLanguageInPayload = (payload: unknown): string | null => {\n const stack: unknown[] = [payload];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) continue;\n if (Array.isArray(current)) {\n for (const entry of current) stack.push(entry);\n continue;\n }\n if (typeof current !== \"object\") continue;\n\n const record = current as Record<string, unknown>;\n const languageCode = record.languageCode;\n if (typeof languageCode === \"string\" && languageCode.trim().length > 0) {\n return languageCode;\n }\n\n for (const value of Object.values(record)) {\n stack.push(value);\n }\n }\n\n return null;\n};\n\nconst resolveYoutubeiTranscript = async (args: {\n pageHtml: string;\n context: ProviderContext;\n}): Promise<TranscriptSuccessResult | TranscriptFailureResult> => {\n const apiKey = firstNonEmptyMatch(args.pageHtml, [\n /\"INNERTUBE_API_KEY\"\\s*:\\s*\"([^\"]+)\"/,\n /\"innertubeApiKey\"\\s*:\\s*\"([^\"]+)\"/\n ]);\n const context = extractYoutubeiContext(args.pageHtml);\n const params = extractYoutubeiTranscriptParams(args.pageHtml);\n\n if (!apiKey || !context || !params) {\n return {\n ok: false,\n reasonCode: \"caption_missing\",\n message: \"youtubei transcript bootstrap payload is missing API key, context, or transcript params.\"\n };\n }\n\n let response: Response;\n try {\n response = await fetch(`https://www.youtube.com/youtubei/v1/get_transcript?key=${encodeURIComponent(apiKey)}`, {\n method: \"POST\",\n headers: YOUTUBEI_HEADERS,\n body: JSON.stringify({ context, params }),\n signal: args.context.signal\n });\n } catch {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"youtubei transcript endpoint request failed.\"\n };\n }\n\n if (!response.ok) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(response.status),\n message: `youtubei transcript endpoint returned HTTP ${response.status}.`\n };\n }\n\n const payloadText = await response.text();\n const payload = parseJson<unknown>(payloadText);\n if (!payload) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"youtubei transcript endpoint returned malformed JSON.\"\n };\n }\n\n const segments = collectYoutubeiSegments(payload);\n if (segments.length === 0) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"youtubei transcript payload did not include transcript segments.\"\n };\n }\n\n return {\n ok: true,\n text: segments.join(\"\\n\").trim(),\n language: findLanguageInPayload(payload) ?? findTranscriptLanguage(args.pageHtml)\n };\n};\n\nconst normalizeErrorMessage = (error: unknown): string => {\n if (error instanceof Error) return error.message;\n return String(error);\n};\n\nconst toExecFailureReasonCode = (\n message: string,\n fallback: ProviderReasonCode\n): ProviderReasonCode => {\n if (/ENOENT|not found|spawn\\s+yt-dlp/i.test(message)) return \"env_limited\";\n if (/timeout|timed out|ETIMEDOUT/i.test(message)) return \"transcript_unavailable\";\n if (/429|rate\\s*limit/i.test(message)) return \"rate_limited\";\n if (/401|403|forbidden|unauthorized/i.test(message)) return \"token_required\";\n return fallback;\n};\n\nconst resolveYtdlpAudioAsrTranscript = async (args: {\n watchUrl: string;\n context: ProviderContext;\n timeoutMs: number;\n asrTranscribe: NonNullable<YouTubeTranscriptResolverDependencies[\"asrTranscribe\"]>;\n}): Promise<TranscriptSuccessResult | TranscriptFailureResult> => {\n const tempDir = await mkdtemp(path.join(tmpdir(), \"opendevbrowser-ytdlp-\"));\n try {\n const outputTemplate = path.join(tempDir, \"audio.%(ext)s\");\n await execFileAsync(\n \"yt-dlp\",\n [\n \"-x\",\n \"--audio-format\",\n \"mp3\",\n \"--no-playlist\",\n \"--no-warnings\",\n \"-o\",\n outputTemplate,\n args.watchUrl\n ],\n {\n timeout: args.timeoutMs,\n maxBuffer: 8 * 1024 * 1024\n }\n );\n\n const files = await readdir(tempDir);\n const audioFile = files\n .filter((file) => /\\.(mp3|m4a|wav|opus|ogg)$/i.test(file))\n .sort()[0];\n if (!audioFile) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"yt-dlp audio download did not produce an audio file.\"\n };\n }\n\n const transcript = await args.asrTranscribe({\n watchUrl: args.watchUrl,\n context: args.context,\n audioFilePath: path.join(tempDir, audioFile)\n });\n\n if (!transcript?.text.trim()) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"ASR returned an empty transcript.\"\n };\n }\n\n return {\n ok: true,\n text: transcript.text,\n language: transcript.language ?? \"unknown\"\n };\n } catch (error) {\n const message = normalizeErrorMessage(error);\n return {\n ok: false,\n reasonCode: toExecFailureReasonCode(message, \"transcript_unavailable\"),\n message\n };\n } finally {\n await rm(tempDir, { recursive: true, force: true }).catch(() => {\n // Best-effort temp cleanup.\n });\n }\n};\n\nconst readApifyTextCandidate = (value: unknown): string => {\n if (typeof value === \"string\") return value.trim();\n if (Array.isArray(value)) {\n const joined = value\n .map((entry) => {\n if (typeof entry === \"string\") return entry;\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return \"\";\n const text = (entry as Record<string, unknown>).text;\n return typeof text === \"string\" ? text : \"\";\n })\n .filter(Boolean)\n .join(\"\\n\")\n .trim();\n return joined;\n }\n return \"\";\n};\n\nconst resolveApifyTranscriptFromItems = (items: unknown): { text: string; language: string } | null => {\n if (!Array.isArray(items)) return null;\n const transcriptKeys = [\"transcript\", \"captions\", \"subtitles\", \"text\"];\n\n for (const item of items) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const record = item as Record<string, unknown>;\n\n for (const key of transcriptKeys) {\n const value = readApifyTextCandidate(record[key]);\n if (!value) continue;\n const language = typeof record.languageCode === \"string\"\n ? record.languageCode\n : typeof record.language === \"string\"\n ? record.language\n : \"unknown\";\n return {\n text: value,\n language\n };\n }\n }\n\n return null;\n};\n\nconst resolveApifyTranscript = async (args: {\n watchUrl: string;\n context: ProviderContext;\n actorId: string;\n token: string;\n}): Promise<TranscriptSuccessResult | TranscriptFailureResult> => {\n const encodedActorId = encodeURIComponent(args.actorId);\n const runUrl = `https://api.apify.com/v2/acts/${encodedActorId}/runs?token=${encodeURIComponent(args.token)}&waitForFinish=120`;\n\n let runResponse: Response;\n try {\n runResponse = await fetch(runUrl, {\n method: \"POST\",\n headers: APIFY_HEADERS,\n signal: args.context.signal,\n body: JSON.stringify({\n startUrls: [{ url: args.watchUrl }]\n })\n });\n } catch {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Apify actor request failed.\"\n };\n }\n\n if (!runResponse.ok) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(runResponse.status),\n message: `Apify actor request returned HTTP ${runResponse.status}.`\n };\n }\n\n const runPayload = parseJson<ApifyRunResponse>(await runResponse.text());\n const datasetId = runPayload?.data?.defaultDatasetId;\n if (!datasetId) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Apify actor response did not include a dataset id.\"\n };\n }\n\n const datasetUrl = `https://api.apify.com/v2/datasets/${encodeURIComponent(datasetId)}/items?token=${encodeURIComponent(args.token)}&clean=true&format=json`;\n\n let datasetResponse: Response;\n try {\n datasetResponse = await fetch(datasetUrl, {\n headers: {\n accept: \"application/json\"\n },\n signal: args.context.signal\n });\n } catch {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Apify dataset request failed.\"\n };\n }\n\n if (!datasetResponse.ok) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(datasetResponse.status),\n message: `Apify dataset request returned HTTP ${datasetResponse.status}.`\n };\n }\n\n const transcript = resolveApifyTranscriptFromItems(parseJson<unknown>(await datasetResponse.text()));\n if (!transcript) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Apify dataset did not include transcript text.\"\n };\n }\n\n return {\n ok: true,\n text: transcript.text,\n language: transcript.language\n };\n};\n\nconst isStrategyApproved = (\n checklist: YouTubeTranscriptLegalChecklist,\n strategy: YouTubeTranscriptStrategyDetail\n): boolean => {\n const expiry = Date.parse(checklist.approvalExpiryDate);\n if (!checklist.signedOff || Number.isNaN(expiry) || expiry <= Date.now()) {\n return false;\n }\n\n if (strategy === \"ytdlp_audio_asr\") {\n return checklist.approvedTranscriptStrategies.includes(\"ytdlp_audio_asr\")\n || checklist.approvedTranscriptStrategies.includes(\"optional_asr\")\n || checklist.approvedTranscriptStrategies.includes(\"ytdlp_subtitle\");\n }\n\n return checklist.approvedTranscriptStrategies.includes(strategy);\n};\n\nconst modeBaseStrategies = (mode: YouTubeTranscriptMode): TranscriptPlannerStrategy[] => {\n switch (mode) {\n case \"auto\":\n return [\"youtubei\", \"native_caption_parse\", \"ytdlp_audio_asr\", \"apify\"];\n case \"web\":\n return [\"youtubei\", \"native_caption_parse\"];\n case \"no-auto\":\n return [\"native_caption_parse\", \"ytdlp_audio_asr\"];\n case \"yt-dlp\":\n return [\"ytdlp_audio_asr\"];\n case \"apify\":\n return [\"apify\"];\n }\n};\n\nconst mapStrategyOrderEntry = (\n strategy: TranscriptPlannerStrategy | LegacyTranscriptStrategy\n): TranscriptPlannerStrategy[] => {\n if (strategy === \"youtubei\" || strategy === \"native_caption_parse\" || strategy === \"ytdlp_audio_asr\" || strategy === \"apify\") {\n return [strategy];\n }\n if (strategy === \"ytdlp_subtitle\") {\n return [\"ytdlp_audio_asr\"];\n }\n return [\"ytdlp_audio_asr\", \"apify\"];\n};\n\nconst planStrategies = (\n mode: YouTubeTranscriptMode,\n strategyOrder: Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy>\n): TranscriptPlannerStrategy[] => {\n const base = modeBaseStrategies(mode);\n const allowed = new Set(base);\n const ordered: TranscriptPlannerStrategy[] = [];\n\n for (const entry of strategyOrder) {\n for (const mapped of mapStrategyOrderEntry(entry)) {\n if (!allowed.has(mapped) || ordered.includes(mapped)) continue;\n ordered.push(mapped);\n }\n }\n\n for (const fallback of base) {\n if (ordered.includes(fallback)) continue;\n ordered.push(fallback);\n }\n\n return ordered;\n};\n\nconst mapDetailToBucket = (detail: YouTubeTranscriptStrategyDetail): YouTubeTranscriptStrategy => {\n switch (detail) {\n case \"youtubei\":\n case \"native_caption_parse\":\n return \"native_caption_parse\";\n case \"ytdlp_audio_asr\":\n case \"apify\":\n return \"optional_asr\";\n case \"browser_assisted\":\n return \"browser_assisted\";\n }\n};\n\nconst createFailure = (\n mode: YouTubeTranscriptMode,\n reasonCode: ProviderReasonCode,\n attemptChain: YouTubeTranscriptAttempt[]\n): YouTubeTranscriptFailure => ({\n ok: false,\n mode,\n reasonCode,\n attemptChain\n});\n\nconst createAttempt = (\n strategy: YouTubeTranscriptStrategyDetail,\n reasonCode: ProviderReasonCode,\n message: string,\n details?: Record<string, JsonValue>\n): YouTubeTranscriptAttempt => ({\n strategy,\n ok: false,\n reasonCode,\n message,\n ...(details ? { details } : {})\n});\n\nconst isForcedMode = (mode: YouTubeTranscriptMode): boolean => {\n return mode === \"yt-dlp\" || mode === \"apify\";\n};\n\nconst isYtdlpSubtitleAliasConfigured = (\n config: YouTubeTranscriptResolverConfig\n): boolean => config.strategyOrder.includes(\"ytdlp_subtitle\");\n\nconst resolveApifyToken = (): string | null => {\n const token = process.env.APIFY_TOKEN ?? process.env.APIFY_API_TOKEN;\n if (!token || !token.trim()) return null;\n return token.trim();\n};\n\nconst precheckStrategyAvailability = (args: {\n strategy: TranscriptPlannerStrategy;\n config: YouTubeTranscriptResolverConfig;\n hasAsrTranscriber: boolean;\n apifyToken: string | null;\n}): TranscriptFailureResult | null => {\n if (args.strategy === \"youtubei\") {\n return null;\n }\n\n if (args.strategy === \"ytdlp_audio_asr\") {\n if (!args.config.enableYtdlpAudioAsr) {\n return {\n ok: false,\n reasonCode: \"env_limited\",\n message: \"yt-dlp audio ASR strategy is disabled by configuration.\"\n };\n }\n if (!args.hasAsrTranscriber) {\n return {\n ok: false,\n reasonCode: \"env_limited\",\n message: \"ASR engine is not configured.\"\n };\n }\n return null;\n }\n\n if (args.strategy === \"apify\") {\n if (!args.config.enableApify) {\n return {\n ok: false,\n reasonCode: \"env_limited\",\n message: \"Apify strategy is disabled by configuration.\"\n };\n }\n if (!args.apifyToken) {\n return {\n ok: false,\n reasonCode: \"token_required\",\n message: \"APIFY_TOKEN is required to use the Apify transcript strategy.\"\n };\n }\n return null;\n }\n\n return null;\n};\n\nconst withLegacyYtdlpAliasNote = (\n message: string,\n config: YouTubeTranscriptResolverConfig\n): string => {\n if (!isYtdlpSubtitleAliasConfigured(config)) return message;\n return `${message} (legacy ytdlp_subtitle alias mapped to ytdlp_audio_asr)`;\n};\n\nconst isDeferredFallbackReason = (reasonCode: ProviderReasonCode): boolean => {\n return reasonCode === \"env_limited\" || reasonCode === \"token_required\";\n};\n\nconst resolveStrategyFailureReason = (\n fallback: ProviderReasonCode,\n attempts: YouTubeTranscriptAttempt[]\n): ProviderReasonCode => {\n for (let index = attempts.length - 1; index >= 0; index -= 1) {\n const reasonCode = attempts[index]?.reasonCode;\n if (!reasonCode) continue;\n if (!isDeferredFallbackReason(reasonCode)) {\n return reasonCode;\n }\n }\n for (let index = attempts.length - 1; index >= 0; index -= 1) {\n const reasonCode = attempts[index]?.reasonCode;\n if (!reasonCode || reasonCode === \"env_limited\") continue;\n return reasonCode;\n }\n return attempts.at(-1)?.reasonCode ?? fallback;\n};\n\nexport const resolveYouTubeTranscript = async (\n deps: YouTubeTranscriptResolverDependencies\n): Promise<YouTubeTranscriptResolution> => {\n const config = resolveYouTubeTranscriptConfig(deps.config);\n const mode = resolveMode(deps.mode, config.modeDefault);\n const forcedMode = isForcedMode(mode);\n const attemptChain: YouTubeTranscriptAttempt[] = [];\n const planned = planStrategies(mode, config.strategyOrder);\n const apifyToken = resolveApifyToken();\n\n for (const strategy of planned) {\n const availability = precheckStrategyAvailability({\n strategy,\n config,\n hasAsrTranscriber: Boolean(deps.asrTranscribe),\n apifyToken\n });\n\n if (availability) {\n const message = strategy === \"ytdlp_audio_asr\"\n ? withLegacyYtdlpAliasNote(availability.message, config)\n : availability.message;\n attemptChain.push(createAttempt(strategy, availability.reasonCode, message));\n if (forcedMode) {\n return createFailure(mode, availability.reasonCode, attemptChain);\n }\n continue;\n }\n\n if (!isStrategyApproved(deps.legalChecklist, strategy)) {\n const message = `Legal gate blocked transcript strategy: ${strategy}`;\n attemptChain.push(createAttempt(strategy, \"strategy_unapproved\", message));\n if (forcedMode) {\n return createFailure(mode, \"strategy_unapproved\", attemptChain);\n }\n continue;\n }\n\n if (strategy === \"youtubei\") {\n const resolved = await resolveYoutubeiTranscript({\n pageHtml: deps.pageHtml,\n context: deps.context\n });\n\n if (!resolved.ok) {\n attemptChain.push(createAttempt(strategy, resolved.reasonCode, resolved.message));\n continue;\n }\n\n attemptChain.push({ strategy, ok: true });\n return {\n ok: true,\n mode,\n text: resolved.text,\n language: resolved.language,\n transcriptStrategy: mapDetailToBucket(strategy),\n transcriptStrategyDetail: strategy,\n attemptChain\n };\n }\n\n if (strategy === \"native_caption_parse\") {\n const resolved = await resolveNativeCaptionTranscript({\n pageHtml: deps.pageHtml,\n context: deps.context,\n manualOnly: mode === \"no-auto\"\n });\n\n if (!resolved.ok) {\n attemptChain.push(createAttempt(strategy, resolved.reasonCode, resolved.message));\n continue;\n }\n\n attemptChain.push({ strategy, ok: true });\n return {\n ok: true,\n mode,\n text: resolved.text,\n language: resolved.language,\n transcriptStrategy: mapDetailToBucket(strategy),\n transcriptStrategyDetail: strategy,\n attemptChain\n };\n }\n\n if (strategy === \"ytdlp_audio_asr\") {\n const asrTranscribe = deps.asrTranscribe as NonNullable<YouTubeTranscriptResolverDependencies[\"asrTranscribe\"]>;\n\n const resolved = await resolveYtdlpAudioAsrTranscript({\n watchUrl: deps.watchUrl,\n context: deps.context,\n timeoutMs: config.ytdlpTimeoutMs,\n asrTranscribe\n });\n\n if (!resolved.ok) {\n const message = withLegacyYtdlpAliasNote(resolved.message, config);\n attemptChain.push(createAttempt(strategy, resolved.reasonCode, message));\n continue;\n }\n\n const successMessage = isYtdlpSubtitleAliasConfigured(config)\n ? \"legacy ytdlp_subtitle alias mapped to ytdlp_audio_asr\"\n : undefined;\n attemptChain.push({\n strategy,\n ok: true,\n ...(successMessage ? { message: successMessage } : {})\n });\n return {\n ok: true,\n mode,\n text: resolved.text,\n language: resolved.language,\n transcriptStrategy: mapDetailToBucket(strategy),\n transcriptStrategyDetail: strategy,\n attemptChain\n };\n }\n\n if (strategy === \"apify\") {\n const ensuredApifyToken = apifyToken as string;\n\n const resolved = await resolveApifyTranscript({\n watchUrl: deps.watchUrl,\n context: deps.context,\n actorId: config.apifyActorId,\n token: ensuredApifyToken\n });\n\n if (!resolved.ok) {\n attemptChain.push(createAttempt(strategy, resolved.reasonCode, resolved.message));\n continue;\n }\n\n attemptChain.push({ strategy, ok: true });\n return {\n ok: true,\n mode,\n text: resolved.text,\n language: resolved.language,\n transcriptStrategy: mapDetailToBucket(strategy),\n transcriptStrategyDetail: strategy,\n attemptChain\n };\n }\n }\n\n if (\n !forcedMode\n && config.enableBrowserFallback\n && deps.browserFallbackPort\n && deps.allowBrowserFallbackEscalation\n ) {\n const fallback = await deps.browserFallbackPort.resolve({\n provider: \"social/youtube\",\n source: \"social\",\n operation: \"fetch\",\n reasonCode: \"transcript_unavailable\",\n trace: deps.context.trace,\n url: deps.watchUrl,\n preferredModes: [\"extension\", \"managed_headed\"],\n ...(typeof deps.context.useCookies === \"boolean\"\n ? { useCookies: deps.context.useCookies }\n : {}),\n ...(deps.context.cookiePolicyOverride\n ? { cookiePolicyOverride: deps.context.cookiePolicyOverride }\n : {}),\n details: {\n request: \"youtube_transcript\"\n }\n });\n\n if (!fallback.ok) {\n const fallbackDiagnostics = (\n fallback.details?.cookieDiagnostics\n && typeof fallback.details.cookieDiagnostics === \"object\"\n && !Array.isArray(fallback.details.cookieDiagnostics)\n )\n ? { cookieDiagnostics: fallback.details.cookieDiagnostics as Record<string, JsonValue> }\n : undefined;\n attemptChain.push({\n strategy: \"browser_assisted\",\n ok: false,\n reasonCode: fallback.reasonCode,\n message: typeof fallback.details?.message === \"string\" ? fallback.details.message : \"Browser fallback failed.\",\n ...(fallbackDiagnostics ? { details: fallbackDiagnostics } : {})\n });\n return createFailure(mode, fallback.reasonCode, attemptChain);\n }\n\n const html = fallback.output?.html;\n if (typeof html !== \"string\" || html.trim().length === 0) {\n attemptChain.push(createAttempt(\"browser_assisted\", \"env_limited\", \"Browser fallback did not return page HTML.\"));\n return createFailure(mode, \"env_limited\", attemptChain);\n }\n\n const nativeResolved = await resolveNativeCaptionTranscript({\n pageHtml: html,\n context: deps.context,\n manualOnly: mode === \"no-auto\"\n });\n\n if (!nativeResolved.ok) {\n attemptChain.push(createAttempt(\"browser_assisted\", nativeResolved.reasonCode, nativeResolved.message));\n return createFailure(mode, nativeResolved.reasonCode, attemptChain);\n }\n\n attemptChain.push({ strategy: \"browser_assisted\", ok: true });\n return {\n ok: true,\n mode,\n text: nativeResolved.text,\n language: nativeResolved.language,\n transcriptStrategy: \"browser_assisted\",\n transcriptStrategyDetail: \"browser_assisted\",\n attemptChain\n };\n }\n\n return createFailure(\n mode,\n resolveStrategyFailureReason(\"transcript_unavailable\", attemptChain),\n attemptChain\n );\n};\n\nexport const asTranscriptProviderError = (\n message: string,\n reasonCode: ProviderReasonCode\n): {\n code: ReturnType<typeof providerErrorCodeFromReasonCode>;\n message: string;\n reasonCode: ProviderReasonCode;\n details: Record<string, JsonValue>;\n} => ({\n code: providerErrorCodeFromReasonCode(reasonCode),\n message,\n reasonCode,\n details: {\n reasonCode\n }\n});\n","import { ProviderRuntimeError, providerErrorCodeFromReasonCode } from \"../errors\";\nimport type { AntiBotPolicyConfig } from \"../shared/anti-bot-policy\";\nimport { providerRequestHeaders } from \"../shared/request-headers\";\nimport { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\nimport {\n normalizeYouTubeTranscriptMode,\n resolveYouTubeTranscript,\n resolveYouTubeTranscriptConfig,\n type YouTubeTranscriptLegalChecklist,\n type YouTubeTranscriptMode,\n type YouTubeTranscriptResolverConfig,\n type YouTubeTranscriptStrategy\n} from \"./youtube-resolver\";\nimport { extractStructuredContent, toSnippet } from \"../web/extract\";\nimport type {\n BrowserFallbackPort,\n JsonValue,\n ProviderContext,\n ProviderFetchInput,\n ProviderSearchInput\n} from \"../types\";\n\nconst YOUTUBE_HEADERS = {\n accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n ...providerRequestHeaders\n} as const;\n\nexport interface YouTubeLegalReviewChecklist extends YouTubeTranscriptLegalChecklist {\n providerId: \"social/youtube\";\n termsReviewDate: string;\n allowedExtractionSurfaces: string[];\n prohibitedFlows: string[];\n reviewer: string;\n}\n\nexport type YouTubeLegalReviewReasonCode =\n | \"missing_terms_review_date\"\n | \"invalid_terms_review_date\"\n | \"missing_allowed_surfaces\"\n | \"missing_prohibited_flows\"\n | \"missing_reviewer\"\n | \"missing_approval_expiry\"\n | \"invalid_approval_expiry\"\n | \"approval_expired\"\n | \"not_signed_off\"\n | \"missing_approved_transcript_strategies\";\n\nexport interface YouTubeProviderOptions extends SocialProviderOptions {\n transcriptResolver?: Partial<YouTubeTranscriptResolverConfig>;\n browserFallbackPort?: BrowserFallbackPort;\n antiBotPolicy?: Partial<AntiBotPolicyConfig>;\n asrTranscribe?: (args: {\n watchUrl: string;\n context: ProviderContext;\n audioFilePath?: string;\n }) => Promise<{ text: string; language?: string } | null>;\n}\n\nexport const YOUTUBE_LEGAL_REVIEW_CHECKLIST: YouTubeLegalReviewChecklist = {\n providerId: \"social/youtube\",\n termsReviewDate: \"2026-02-16\",\n allowedExtractionSurfaces: [\n \"public search pages\",\n \"public watch pages\",\n \"public transcript/subtitle endpoints\"\n ],\n prohibitedFlows: [\n \"account pages\",\n \"authenticated user inbox/subscriptions APIs\",\n \"paid membership purchase flows\"\n ],\n reviewer: \"opendevbrowser-compliance\",\n approvalExpiryDate: \"2030-12-31T00:00:00.000Z\",\n signedOff: true,\n approvedTranscriptStrategies: [\n \"youtubei\",\n \"native_caption_parse\",\n \"ytdlp_audio_asr\",\n \"apify\",\n \"browser_assisted\"\n ]\n};\n\nconst hasValues = (values: string[]): boolean => values.some((value) => value.trim().length > 0);\n\nconst parseIsoDate = (value: string): number => {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? NaN : parsed;\n};\n\nexport const validateYouTubeLegalReviewChecklist = (\n now: Date = new Date()\n): { valid: boolean; reasonCode?: YouTubeLegalReviewReasonCode } => {\n const checklist = YOUTUBE_LEGAL_REVIEW_CHECKLIST;\n if (!checklist.termsReviewDate.trim()) return { valid: false, reasonCode: \"missing_terms_review_date\" };\n if (Number.isNaN(parseIsoDate(checklist.termsReviewDate))) return { valid: false, reasonCode: \"invalid_terms_review_date\" };\n if (!hasValues(checklist.allowedExtractionSurfaces)) return { valid: false, reasonCode: \"missing_allowed_surfaces\" };\n if (!hasValues(checklist.prohibitedFlows)) return { valid: false, reasonCode: \"missing_prohibited_flows\" };\n if (!checklist.reviewer.trim()) return { valid: false, reasonCode: \"missing_reviewer\" };\n if (!checklist.approvalExpiryDate.trim()) return { valid: false, reasonCode: \"missing_approval_expiry\" };\n if (!hasValues(checklist.approvedTranscriptStrategies)) return { valid: false, reasonCode: \"missing_approved_transcript_strategies\" };\n\n const expiry = parseIsoDate(checklist.approvalExpiryDate);\n if (Number.isNaN(expiry)) return { valid: false, reasonCode: \"invalid_approval_expiry\" };\n if (expiry <= now.getTime()) return { valid: false, reasonCode: \"approval_expired\" };\n if (!checklist.signedOff) return { valid: false, reasonCode: \"not_signed_off\" };\n return { valid: true };\n};\n\nconst assertYouTubeLegalReviewChecklist = (): void => {\n const validation = validateYouTubeLegalReviewChecklist();\n if (validation.valid) return;\n\n throw new ProviderRuntimeError(\"policy_blocked\", \"social/youtube legal review checklist is invalid or expired\", {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: false,\n reasonCode: \"policy_blocked\",\n details: {\n reasonCode: validation.reasonCode as YouTubeLegalReviewReasonCode,\n policyReasonCode: \"policy_blocked\",\n approvalExpiryDate: YOUTUBE_LEGAL_REVIEW_CHECKLIST.approvalExpiryDate\n }\n });\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst decodeHtml = (value: string): string => {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\")\n .replace(/"/g, '\"')\n .replace(/\\s+/g, \" \")\n .trim();\n};\n\nconst normalizeEscapedValue = (value: string): string => {\n return value\n .replace(/\\\\u0026/g, \"&\")\n .replace(/\\\\\\//g, \"/\")\n .replace(/\\\\u003d/g, \"=\")\n .replace(/\\\\u002F/g, \"/\");\n};\n\nconst parseVideoId = (url: string): string | null => {\n try {\n const parsed = new URL(url);\n if (parsed.hostname === \"youtu.be\") {\n const id = parsed.pathname.replace(/^\\//, \"\").trim();\n return id || null;\n }\n const queryId = parsed.searchParams.get(\"v\");\n if (queryId) return queryId;\n const shortsMatch = parsed.pathname.match(/\\/shorts\\/([^/?#]+)/);\n return shortsMatch?.[1] ?? null;\n } catch {\n return null;\n }\n};\n\nconst firstNonEmptyMatch = (html: string, patterns: RegExp[]): string | null => {\n for (const pattern of patterns) {\n const match = html.match(pattern)?.[1];\n if (match && match.trim()) {\n return decodeHtml(normalizeEscapedValue(match));\n }\n }\n return null;\n};\n\nconst toIsoIfValid = (value: string | null): string | null => {\n if (!value) return null;\n const timestamp = Date.parse(value);\n if (Number.isNaN(timestamp)) return null;\n return new Date(timestamp).toISOString();\n};\n\nconst parseInteger = (value: string | null): number | null => {\n if (!value) return null;\n const normalized = value.replace(/[^\\d]/g, \"\");\n if (!normalized) return null;\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nconst findChannel = (html: string): string | null => {\n return firstNonEmptyMatch(html, [\n /\"ownerChannelName\":\"([^\"]+)\"/,\n /\"channelName\":\"([^\"]+)\"/,\n /\"shortBylineText\":\\{\"runs\":\\[\\{\"text\":\"([^\"]+)\"/,\n /itemprop=\"author\"\\s+content=\"([^\"]+)\"/\n ]);\n};\n\nconst findPublishedAt = (html: string): string | null => {\n const rawDate = firstNonEmptyMatch(html, [\n /\"publishDate\":\"([^\"]+)\"/,\n /\"uploadDate\":\"([^\"]+)\"/,\n /itemprop=\"datePublished\"\\s+content=\"([^\"]+)\"/\n ]);\n return toIsoIfValid(rawDate);\n};\n\nconst findViews = (html: string, extractedText: string): number | null => {\n const viewCount = firstNonEmptyMatch(html, [\n /\"viewCount\":\"([^\"]+)\"/,\n /\"viewCountText\":\\{\"simpleText\":\"([^\"]+)\"/\n ]);\n const parsedFromHtml = parseInteger(viewCount);\n if (parsedFromHtml !== null) return parsedFromHtml;\n\n const parsedFromText = parseInteger(extractedText.match(/([0-9][0-9,]*)\\s+views/i)?.[1] ?? null);\n return parsedFromText;\n};\n\nconst summarizeTranscript = (transcript: string): string => {\n if (!transcript) return \"\";\n const lines = transcript\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter(Boolean);\n return lines.slice(0, 8).join(\" \").slice(0, 800);\n};\n\nconst fetchPage = async (url: string, context: ProviderContext): Promise<{ status: number; url: string; html: string }> => {\n let response: Response;\n try {\n response = await fetch(url, {\n headers: YOUTUBE_HEADERS,\n signal: context.signal,\n redirect: \"follow\"\n });\n } catch (error) {\n throw new ProviderRuntimeError(\"network\", `Failed to retrieve ${url}`, {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: true,\n cause: error\n });\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new ProviderRuntimeError(\"auth\", `Authentication required for ${url}`, {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: false,\n reasonCode: \"token_required\",\n details: { status: response.status, url, reasonCode: \"token_required\" }\n });\n }\n if (response.status === 429) {\n throw new ProviderRuntimeError(\"rate_limited\", `Rate limited while retrieving ${url}`, {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: true,\n reasonCode: \"rate_limited\",\n details: { status: response.status, url, reasonCode: \"rate_limited\" }\n });\n }\n if (response.status >= 400) {\n throw new ProviderRuntimeError(\"unavailable\", `Retrieval failed for ${url}`, {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: response.status >= 500,\n reasonCode: response.status >= 500 ? \"ip_blocked\" : \"transcript_unavailable\",\n details: {\n status: response.status,\n url,\n reasonCode: response.status >= 500 ? \"ip_blocked\" : \"transcript_unavailable\"\n }\n });\n }\n\n return {\n status: response.status,\n url: response.url || url,\n html: await response.text()\n };\n};\n\nconst parseBooleanFilter = (value: unknown, fallback = false): boolean => {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n }\n return fallback;\n};\n\nconst parseYouTubeModeFilter = (value: unknown): YouTubeTranscriptMode | null => {\n return normalizeYouTubeTranscriptMode(value);\n};\n\nconst toJsonRecord = (value: Record<string, unknown>): Record<string, JsonValue> => {\n return JSON.parse(JSON.stringify(value)) as Record<string, JsonValue>;\n};\n\nconst toAttemptChainJson = (attempts: Array<{\n strategy: string;\n ok: boolean;\n reasonCode?: string;\n message?: string;\n details?: Record<string, unknown>;\n}>): Array<Record<string, JsonValue>> => {\n return attempts.map((attempt) => ({\n strategy: attempt.strategy,\n ok: attempt.ok,\n ...(attempt.reasonCode ? { reasonCode: attempt.reasonCode } : {}),\n ...(attempt.message ? { message: attempt.message } : {}),\n ...(attempt.details ? toJsonRecord(attempt.details) : {})\n }));\n};\n\nconst resolveTranscriptStrategyDetail = (\n transcript: Awaited<ReturnType<typeof resolveYouTubeTranscript>>\n): string | undefined => {\n if (transcript.ok) {\n return transcript.transcriptStrategyDetail;\n }\n for (let index = transcript.attemptChain.length - 1; index >= 0; index -= 1) {\n const attempt = transcript.attemptChain[index];\n if (!attempt?.reasonCode) continue;\n if (attempt.reasonCode !== \"env_limited\" && attempt.reasonCode !== \"token_required\") {\n return attempt.strategy;\n }\n }\n for (let index = transcript.attemptChain.length - 1; index >= 0; index -= 1) {\n const attempt = transcript.attemptChain[index];\n if (!attempt?.reasonCode || attempt.reasonCode === \"env_limited\") continue;\n return attempt.strategy;\n }\n return transcript.attemptChain.at(-1)?.strategy;\n};\n\nconst buildSearch = (options: YouTubeProviderOptions[\"search\"]) => {\n if (options) return options;\n return async (input: ProviderSearchInput, context: ProviderContext) => {\n assertYouTubeLegalReviewChecklist();\n const query = input.query.trim();\n if (!query) {\n throw new ProviderRuntimeError(\"invalid_input\", \"YouTube search query is required\", {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: false\n });\n }\n\n const lookupUrl = isHttpUrl(query)\n ? query\n : `https://www.youtube.com/results?search_query=${encodeURIComponent(query)}`;\n const page = await fetchPage(lookupUrl, context);\n const extracted = extractStructuredContent(page.html, page.url);\n const firstVideoId = page.html.match(/\"videoId\":\"([a-zA-Z0-9_-]{11})\"/)?.[1] ?? null;\n const watchUrl = firstVideoId ? `https://www.youtube.com/watch?v=${firstVideoId}` : page.url;\n\n return [{\n url: watchUrl,\n title: toSnippet(extracted.text, 120) || `YouTube search: ${query}`,\n content: toSnippet(extracted.text, 1800),\n confidence: 0.62,\n attributes: {\n platform: \"youtube\",\n query,\n status: page.status,\n retrievalPath: isHttpUrl(query) ? \"social:youtube:search:url\" : \"social:youtube:search:index\",\n video_id: firstVideoId,\n links: extracted.links.slice(0, 20)\n }\n }];\n };\n};\n\nconst buildFetch = (options: YouTubeProviderOptions) => {\n if (options.fetch) return options.fetch;\n return async (input: ProviderFetchInput, context: ProviderContext) => {\n assertYouTubeLegalReviewChecklist();\n const page = await fetchPage(input.url, context);\n const extracted = extractStructuredContent(page.html, page.url);\n\n const includeFullTranscript = parseBooleanFilter(input.filters?.include_full_transcript, false);\n const requireTranscript = parseBooleanFilter(input.filters?.requireTranscript, false);\n const translateToEnglish = parseBooleanFilter(input.filters?.translateToEnglish, true);\n const requestedMode = parseYouTubeModeFilter(input.filters?.youtube_mode);\n\n const transcriptConfig = resolveYouTubeTranscriptConfig(options.transcriptResolver);\n const transcript = await resolveYouTubeTranscript({\n context,\n watchUrl: page.url,\n pageHtml: page.html,\n legalChecklist: YOUTUBE_LEGAL_REVIEW_CHECKLIST,\n config: transcriptConfig,\n mode: requestedMode,\n browserFallbackPort: options.browserFallbackPort,\n allowBrowserFallbackEscalation: options.antiBotPolicy?.allowBrowserEscalation ?? true,\n asrTranscribe: options.asrTranscribe\n });\n\n if (!transcript.ok && requireTranscript) {\n const requiredReasonCode = transcript.reasonCode === \"caption_missing\"\n ? \"transcript_unavailable\"\n : transcript.reasonCode;\n throw new ProviderRuntimeError(\n providerErrorCodeFromReasonCode(requiredReasonCode),\n `YouTube transcript unavailable (${requiredReasonCode})`,\n {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: requiredReasonCode === \"rate_limited\",\n reasonCode: requiredReasonCode,\n details: {\n reasonCode: requiredReasonCode,\n transcriptReasonCode: transcript.reasonCode,\n url: page.url,\n attemptChain: toAttemptChainJson(transcript.attemptChain)\n }\n }\n );\n }\n\n const transcriptRaw = transcript.ok ? transcript.text : \"\";\n const transcriptLanguage = transcript.ok ? transcript.language : \"unknown\";\n const translationApplied = Boolean(transcriptRaw && translateToEnglish && !transcriptLanguage.startsWith(\"en\"));\n const transcriptContent = translationApplied\n ? `[translated:${transcriptLanguage}] ${transcriptRaw}`\n : transcriptRaw;\n const transcriptSummary = summarizeTranscript(transcriptContent || extracted.text);\n const transcriptOutput = includeFullTranscript || transcriptContent.length < 1200\n ? transcriptContent\n : transcriptSummary;\n const transcriptStrategyDetail = resolveTranscriptStrategyDetail(transcript);\n\n const videoId = parseVideoId(page.url);\n const channel = findChannel(page.html);\n const publishedAt = findPublishedAt(page.html);\n const views = findViews(page.html, extracted.text);\n const dateConfidence = publishedAt\n ? { score: 1, source: \"explicit\" as const }\n : { score: 0.8, source: \"inferred\" as const };\n\n return {\n url: page.url,\n title: toSnippet(extracted.text, 120) || page.url,\n content: transcriptOutput || toSnippet(extracted.text, 1800),\n attributes: {\n platform: \"youtube\",\n status: page.status,\n links: extracted.links.slice(0, 30),\n retrievalPath: \"social:youtube:fetch:url\",\n video_id: videoId,\n ...(channel ? { channel } : {}),\n ...(publishedAt ? { published_at: publishedAt } : {}),\n ...(typeof views === \"number\" ? { views } : {}),\n transcript_language: transcriptLanguage,\n transcript_retrieved_at: new Date().toISOString(),\n transcript_available: transcript.ok,\n transcript_mode: transcript.mode,\n translation_applied: translationApplied,\n transcript_summary: transcriptSummary,\n ...(includeFullTranscript ? { transcript_full: transcriptContent } : {}),\n ...(transcriptStrategyDetail ? { transcript_strategy_detail: transcriptStrategyDetail } : {}),\n ...(transcript.ok\n ? {\n transcript_strategy: transcript.transcriptStrategy,\n attempt_chain: toAttemptChainJson(transcript.attemptChain)\n }\n : {\n reasonCode: transcript.reasonCode,\n attempt_chain: toAttemptChainJson(transcript.attemptChain)\n }),\n date_confidence: dateConfidence\n }\n };\n };\n};\n\nexport const createYouTubeProvider = (options: YouTubeProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"youtube\",\n displayName: \"YouTube\",\n baseUrl: \"https://www.youtube.com\",\n maxPostLength: 10000,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n\nexport const withDefaultYouTubeOptions = (options: YouTubeProviderOptions = {}): YouTubeProviderOptions => ({\n ...options,\n defaultTraversal: {\n pageLimit: options.defaultTraversal?.pageLimit ?? 1,\n hopLimit: options.defaultTraversal?.hopLimit ?? 0,\n expansionPerRecord: options.defaultTraversal?.expansionPerRecord ?? 1,\n maxRecords: options.defaultTraversal?.maxRecords ?? 8\n },\n search: buildSearch(options.search),\n fetch: buildFetch(options)\n});\n\nexport type { YouTubeTranscriptStrategy };\n","import { createBlueskyProvider } from \"./bluesky\";\nimport { createFacebookProvider } from \"./facebook\";\nimport { createInstagramProvider } from \"./instagram\";\nimport { createLinkedInProvider } from \"./linkedin\";\nimport { createRedditProvider } from \"./reddit\";\nimport { createThreadsProvider } from \"./threads\";\nimport { createTikTokProvider } from \"./tiktok\";\nimport { createXProvider } from \"./x\";\nimport { createYouTubeProvider, type YouTubeProviderOptions } from \"./youtube\";\nimport type { ProviderAdapter } from \"../types\";\nimport type { SocialProviderOptions } from \"./platform\";\n\nexport { createXProvider } from \"./x\";\nexport { createRedditProvider } from \"./reddit\";\nexport { createBlueskyProvider } from \"./bluesky\";\nexport { createFacebookProvider } from \"./facebook\";\nexport { createLinkedInProvider } from \"./linkedin\";\nexport { createInstagramProvider } from \"./instagram\";\nexport { createTikTokProvider } from \"./tiktok\";\nexport { createThreadsProvider } from \"./threads\";\nexport { createYouTubeProvider } from \"./youtube\";\nexport { withDefaultYouTubeOptions } from \"./youtube\";\nexport { validateYouTubeLegalReviewChecklist, YOUTUBE_LEGAL_REVIEW_CHECKLIST } from \"./youtube\";\nexport type { YouTubeProviderOptions } from \"./youtube\";\nexport type { SocialProviderOptions, SocialPlatformProfile } from \"./platform\";\n\nexport type SocialPlatform =\n | \"x\"\n | \"reddit\"\n | \"bluesky\"\n | \"facebook\"\n | \"linkedin\"\n | \"instagram\"\n | \"tiktok\"\n | \"threads\"\n | \"youtube\";\n\nexport interface SocialProvidersOptions {\n x?: SocialProviderOptions;\n reddit?: SocialProviderOptions;\n bluesky?: SocialProviderOptions;\n facebook?: SocialProviderOptions;\n linkedin?: SocialProviderOptions;\n instagram?: SocialProviderOptions;\n tiktok?: SocialProviderOptions;\n threads?: SocialProviderOptions;\n youtube?: YouTubeProviderOptions;\n}\n\nexport const createSocialProviders = (options: SocialProvidersOptions = {}): ProviderAdapter[] => {\n return [\n createXProvider(options.x),\n createRedditProvider(options.reddit),\n createBlueskyProvider(options.bluesky),\n createFacebookProvider(options.facebook),\n createLinkedInProvider(options.linkedin),\n createInstagramProvider(options.instagram),\n createTikTokProvider(options.tiktok),\n createThreadsProvider(options.threads),\n createYouTubeProvider(options.youtube)\n ];\n};\n\nexport const createSocialProvider = (\n platform: SocialPlatform,\n options: SocialProviderOptions = {}\n): ProviderAdapter => {\n switch (platform) {\n case \"x\":\n return createXProvider(options);\n case \"reddit\":\n return createRedditProvider(options);\n case \"bluesky\":\n return createBlueskyProvider(options);\n case \"facebook\":\n return createFacebookProvider(options);\n case \"linkedin\":\n return createLinkedInProvider(options);\n case \"instagram\":\n return createInstagramProvider(options);\n case \"tiktok\":\n return createTikTokProvider(options);\n case \"threads\":\n return createThreadsProvider(options);\n case \"youtube\":\n return createYouTubeProvider(options);\n }\n};\n","import { ProviderRuntimeError, toProviderError } from \"../errors\";\nimport { normalizeRecord, normalizeRecords } from \"../normalize\";\nimport { providerRequestHeaders } from \"../shared/request-headers\";\nimport { canonicalizeUrl } from \"../web/crawler\";\nimport { extractStructuredContent, toSnippet } from \"../web/extract\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderCapabilities,\n ProviderContext,\n ProviderErrorCode,\n ProviderFetchInput,\n ProviderHealth,\n ProviderReasonCode,\n ProviderSearchInput\n} from \"../types\";\n\nconst SHOPPING_SOURCE = \"shopping\" as const;\nconst DEFAULT_CURRENCY = \"USD\";\n\nexport type ShoppingProviderName =\n | \"amazon\"\n | \"walmart\"\n | \"bestbuy\"\n | \"ebay\"\n | \"target\"\n | \"costco\"\n | \"macys\"\n | \"aliexpress\"\n | \"temu\"\n | \"newegg\"\n | \"others\";\n\nexport type ShoppingProviderId = `shopping/${ShoppingProviderName}`;\n\nexport interface ShoppingProviderProfile {\n name: ShoppingProviderName;\n id: ShoppingProviderId;\n displayName: string;\n domains: string[];\n tier: \"tier1\" | \"tier2\";\n extractionFocus: string;\n legalReview: ProviderLegalReviewChecklist;\n searchPath: (query: string) => string;\n}\n\nexport interface ProviderLegalReviewChecklist {\n providerId: string;\n termsReviewDate: string;\n allowedExtractionSurfaces: string[];\n prohibitedFlows: string[];\n reviewer: string;\n approvalExpiryDate: string;\n signedOff: boolean;\n}\n\nexport type LegalReviewReasonCode =\n | \"missing_checklist\"\n | \"provider_mismatch\"\n | \"missing_terms_review_date\"\n | \"invalid_terms_review_date\"\n | \"missing_allowed_surfaces\"\n | \"missing_prohibited_flows\"\n | \"missing_reviewer\"\n | \"missing_approval_expiry\"\n | \"invalid_approval_expiry\"\n | \"approval_expired\"\n | \"not_signed_off\";\n\nexport interface LegalReviewValidationResult {\n valid: boolean;\n reasonCode?: LegalReviewReasonCode;\n}\n\nexport interface ShoppingSearchRecord {\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n}\n\ninterface ShoppingFetchRecord {\n status: number;\n url: string;\n html: string;\n}\n\nexport type ShoppingFetcher = (args: {\n url: string;\n signal?: AbortSignal;\n provider: string;\n operation: \"search\" | \"fetch\";\n context?: ProviderContext;\n}) => Promise<ShoppingFetchRecord>;\n\nexport interface ShoppingProviderOptions {\n id?: string;\n search?: (input: ProviderSearchInput, context: ProviderContext) => Promise<ShoppingSearchRecord[]>;\n fetch?: (input: ProviderFetchInput, context: ProviderContext) => Promise<ShoppingSearchRecord>;\n fetcher?: ShoppingFetcher;\n}\n\nexport type ShoppingProvidersOptions = Partial<Record<ShoppingProviderName, ShoppingProviderOptions>>;\n\nconst DEFAULT_ALLOWED_SURFACES = [\n \"public search result pages\",\n \"public product detail pages\",\n \"public metadata tags\"\n];\n\nconst DEFAULT_PROHIBITED_FLOWS = [\n \"checkout workflows\",\n \"account/profile pages\",\n \"authenticated purchase APIs\"\n];\n\nconst DEFAULT_REVIEWER = \"opendevbrowser-compliance\";\nconst DEFAULT_TERMS_REVIEW_DATE = \"2026-02-16\";\nconst DEFAULT_APPROVAL_EXPIRY = \"2030-12-31T00:00:00.000Z\";\n\nconst createLegalReviewChecklist = (\n providerId: ShoppingProviderId,\n termsReviewDate = DEFAULT_TERMS_REVIEW_DATE,\n approvalExpiryDate = DEFAULT_APPROVAL_EXPIRY\n): ProviderLegalReviewChecklist => ({\n providerId,\n termsReviewDate,\n allowedExtractionSurfaces: [...DEFAULT_ALLOWED_SURFACES],\n prohibitedFlows: [...DEFAULT_PROHIBITED_FLOWS],\n reviewer: DEFAULT_REVIEWER,\n approvalExpiryDate,\n signedOff: true\n});\n\nexport const SHOPPING_PROVIDER_PROFILES: ShoppingProviderProfile[] = [\n {\n name: \"amazon\",\n id: \"shopping/amazon\",\n displayName: \"Amazon\",\n domains: [\"amazon.com\"],\n tier: \"tier1\",\n extractionFocus: \"PDP title/price/availability, offer blocks, image gallery\",\n legalReview: createLegalReviewChecklist(\"shopping/amazon\"),\n searchPath: (query) => `https://www.amazon.com/s?k=${encodeURIComponent(query)}`\n },\n {\n name: \"walmart\",\n id: \"shopping/walmart\",\n displayName: \"Walmart\",\n domains: [\"walmart.com\"],\n tier: \"tier1\",\n extractionFocus: \"Search cards, PDP price modules, delivery/pickup availability\",\n legalReview: createLegalReviewChecklist(\"shopping/walmart\"),\n searchPath: (query) => `https://www.walmart.com/search?q=${encodeURIComponent(query)}`\n },\n {\n name: \"bestbuy\",\n id: \"shopping/bestbuy\",\n displayName: \"Best Buy\",\n domains: [\"bestbuy.com\"],\n tier: \"tier1\",\n extractionFocus: \"Search results, PDP pricing/condition, fulfillment options\",\n legalReview: createLegalReviewChecklist(\"shopping/bestbuy\"),\n searchPath: (query) => `https://www.bestbuy.com/site/searchpage.jsp?st=${encodeURIComponent(query)}`\n },\n {\n name: \"ebay\",\n id: \"shopping/ebay\",\n displayName: \"eBay\",\n domains: [\"ebay.com\"],\n tier: \"tier1\",\n extractionFocus: \"Listing cards, seller/condition, buy-it-now vs auction fields\",\n legalReview: createLegalReviewChecklist(\"shopping/ebay\"),\n searchPath: (query) => `https://www.ebay.com/sch/i.html?_nkw=${encodeURIComponent(query)}`\n },\n {\n name: \"target\",\n id: \"shopping/target\",\n displayName: \"Target\",\n domains: [\"target.com\"],\n tier: \"tier2\",\n extractionFocus: \"PDP variants, store/ship availability, promotion blocks\",\n legalReview: createLegalReviewChecklist(\"shopping/target\"),\n searchPath: (query) => `https://www.target.com/s?searchTerm=${encodeURIComponent(query)}`\n },\n {\n name: \"costco\",\n id: \"shopping/costco\",\n displayName: \"Costco\",\n domains: [\"costco.com\"],\n tier: \"tier2\",\n extractionFocus: \"Membership-aware price blocks, stock notes, package quantity\",\n legalReview: createLegalReviewChecklist(\"shopping/costco\"),\n searchPath: (query) => `https://www.costco.com/CatalogSearch?dept=All&keyword=${encodeURIComponent(query)}`\n },\n {\n name: \"macys\",\n id: \"shopping/macys\",\n displayName: \"Macy's\",\n domains: [\"macys.com\"],\n tier: \"tier2\",\n extractionFocus: \"Category cards, PDP discounts, variant pricing\",\n legalReview: createLegalReviewChecklist(\"shopping/macys\"),\n searchPath: (query) => `https://www.macys.com/shop/featured/${encodeURIComponent(query)}`\n },\n {\n name: \"aliexpress\",\n id: \"shopping/aliexpress\",\n displayName: \"AliExpress\",\n domains: [\"aliexpress.com\"],\n tier: \"tier2\",\n extractionFocus: \"Listing pricing ranges, shipping estimates, seller signals\",\n legalReview: createLegalReviewChecklist(\"shopping/aliexpress\"),\n searchPath: (query) => `https://www.aliexpress.com/wholesale?SearchText=${encodeURIComponent(query)}`\n },\n {\n name: \"temu\",\n id: \"shopping/temu\",\n displayName: \"Temu\",\n domains: [\"temu.com\"],\n tier: \"tier2\",\n extractionFocus: \"Offer cards, coupon/discount overlays, shipping badges\",\n legalReview: createLegalReviewChecklist(\"shopping/temu\"),\n searchPath: (query) => `https://www.temu.com/search_result.html?search_key=${encodeURIComponent(query)}`\n },\n {\n name: \"newegg\",\n id: \"shopping/newegg\",\n displayName: \"Newegg\",\n domains: [\"newegg.com\"],\n tier: \"tier2\",\n extractionFocus: \"Tech catalog cards, seller conditions, shipping price/time\",\n legalReview: createLegalReviewChecklist(\"shopping/newegg\"),\n searchPath: (query) => `https://www.newegg.com/p/pl?d=${encodeURIComponent(query)}`\n },\n {\n name: \"others\",\n id: \"shopping/others\",\n displayName: \"Others\",\n domains: [],\n tier: \"tier2\",\n extractionFocus: \"JSON-LD Product/Offer, OpenGraph, common PDP selectors\",\n legalReview: createLegalReviewChecklist(\"shopping/others\"),\n searchPath: (query) => `https://duckduckgo.com/?q=${encodeURIComponent(`${query} buy`)}`\n }\n];\n\nexport const SHOPPING_PROVIDER_IDS = SHOPPING_PROVIDER_PROFILES.map((profile) => profile.id);\n\nconst hasValues = (values: string[]): boolean => values.some((value) => value.trim().length > 0);\n\nconst parseIsoDate = (value: string): number => {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? NaN : parsed;\n};\n\nconst fallbackReasonCodeForError = (error: {\n reasonCode?: ProviderReasonCode;\n}): ProviderReasonCode => {\n if (error.reasonCode) return error.reasonCode;\n // resolveBrowserFallback is only reached from the default fetcher's recoverable paths.\n // auth/rate_limited carry explicit reason codes above; the remaining cases are env-limited.\n return \"env_limited\";\n};\n\nconst readFallbackString = (output: Record<string, JsonValue> | undefined, key: \"html\" | \"url\"): string | undefined => {\n const value = output?.[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n};\n\nconst resolveBrowserFallback = async (args: {\n error: ProviderRuntimeError;\n url: string;\n provider: string;\n operation: \"search\" | \"fetch\";\n context?: ProviderContext;\n}): Promise<ShoppingFetchRecord | null> => {\n const fallbackPort = args.context?.browserFallbackPort;\n if (!fallbackPort) return null;\n\n const normalized = toProviderError(args.error, {\n provider: args.provider,\n source: SHOPPING_SOURCE\n });\n const reasonCode = fallbackReasonCodeForError(normalized);\n\n const fallback = await fallbackPort.resolve({\n provider: args.provider,\n source: SHOPPING_SOURCE,\n operation: args.operation,\n reasonCode,\n trace: args.context?.trace ?? {\n requestId: `shopping-fallback-${Date.now()}`,\n provider: args.provider,\n ts: new Date().toISOString()\n },\n url: args.url,\n details: {\n errorCode: normalized.code,\n message: normalized.message,\n ...(normalized.details ?? {})\n },\n ...(typeof args.context?.useCookies === \"boolean\" ? { useCookies: args.context.useCookies } : {}),\n ...(args.context?.cookiePolicyOverride ? { cookiePolicyOverride: args.context.cookiePolicyOverride } : {})\n });\n if (!fallback.ok) {\n return null;\n }\n\n const resolvedUrl = canonicalizeUrl(readFallbackString(fallback.output, \"url\") ?? args.url);\n return {\n status: 200,\n url: resolvedUrl,\n html: readFallbackString(fallback.output, \"html\") ?? \"\"\n };\n};\n\nexport const validateLegalReviewChecklist = (\n checklist: ProviderLegalReviewChecklist | undefined,\n expectedProviderId: string,\n now: Date = new Date()\n): LegalReviewValidationResult => {\n if (!checklist) return { valid: false, reasonCode: \"missing_checklist\" };\n if (checklist.providerId !== expectedProviderId) return { valid: false, reasonCode: \"provider_mismatch\" };\n if (!checklist.termsReviewDate.trim()) return { valid: false, reasonCode: \"missing_terms_review_date\" };\n if (Number.isNaN(parseIsoDate(checklist.termsReviewDate))) return { valid: false, reasonCode: \"invalid_terms_review_date\" };\n if (!hasValues(checklist.allowedExtractionSurfaces)) return { valid: false, reasonCode: \"missing_allowed_surfaces\" };\n if (!hasValues(checklist.prohibitedFlows)) return { valid: false, reasonCode: \"missing_prohibited_flows\" };\n if (!checklist.reviewer.trim()) return { valid: false, reasonCode: \"missing_reviewer\" };\n if (!checklist.approvalExpiryDate.trim()) return { valid: false, reasonCode: \"missing_approval_expiry\" };\n\n const expiry = parseIsoDate(checklist.approvalExpiryDate);\n if (Number.isNaN(expiry)) return { valid: false, reasonCode: \"invalid_approval_expiry\" };\n if (expiry <= now.getTime()) return { valid: false, reasonCode: \"approval_expired\" };\n if (!checklist.signedOff) return { valid: false, reasonCode: \"not_signed_off\" };\n return { valid: true };\n};\n\nexport const getShoppingProviderProfile = (providerId: string): ShoppingProviderProfile | null => {\n return SHOPPING_PROVIDER_PROFILES.find((profile) => profile.id === providerId) ?? null;\n};\n\nexport const validateShoppingLegalReviewChecklist = (\n providerId: string,\n now: Date = new Date()\n): LegalReviewValidationResult => {\n const profile = getShoppingProviderProfile(providerId);\n if (!profile) return { valid: false, reasonCode: \"missing_checklist\" };\n return validateLegalReviewChecklist(profile.legalReview, profile.id, now);\n};\n\nconst defaultFetcher: ShoppingFetcher = async ({ url, signal, provider, operation, context }) => {\n const providerId = provider;\n const resolveFallbackOrThrow = async (error: ProviderRuntimeError): Promise<ShoppingFetchRecord> => {\n const fallback = await resolveBrowserFallback({\n error,\n url,\n provider: providerId,\n operation,\n context\n });\n if (fallback) return fallback;\n throw error;\n };\n\n let response: Response;\n try {\n response = await fetch(url, {\n signal,\n headers: {\n accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n ...providerRequestHeaders\n },\n redirect: \"follow\"\n });\n } catch (error) {\n const runtimeError = new ProviderRuntimeError(\"network\", `Failed to retrieve ${url}`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: true,\n cause: error\n });\n return resolveFallbackOrThrow(runtimeError);\n }\n\n if (response.status === 401 || response.status === 403) {\n const runtimeError = new ProviderRuntimeError(\"auth\", `Authentication required for ${url}`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: false,\n reasonCode: \"token_required\",\n details: { status: response.status, url, reasonCode: \"token_required\" }\n });\n return resolveFallbackOrThrow(runtimeError);\n }\n if (response.status === 429) {\n const runtimeError = new ProviderRuntimeError(\"rate_limited\", `Rate limited while retrieving ${url}`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: true,\n details: { status: response.status, url }\n });\n return resolveFallbackOrThrow(runtimeError);\n }\n if (response.status >= 400) {\n const runtimeError = new ProviderRuntimeError(\"unavailable\", `Retrieval failed for ${url}`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: response.status >= 500,\n details: { status: response.status, url }\n });\n return resolveFallbackOrThrow(runtimeError);\n }\n\n return {\n status: response.status,\n url: response.url || url,\n html: await response.text()\n };\n};\n\nconst PRICE_RE = /([$€£])\\s*([0-9]{1,3}(?:[.,][0-9]{3})*(?:[.,][0-9]{1,2})?)/;\nconst RATING_RE = /([0-5](?:\\.[0-9])?)\\s*(?:out of 5|\\/5)/i;\nconst REVIEWS_RE = /([0-9][0-9,]*)\\s*(?:ratings|reviews)/i;\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst parsePrice = (text: string): { amount: number; currency: string } => {\n const match = text.match(PRICE_RE);\n if (!match) {\n return { amount: 0, currency: DEFAULT_CURRENCY };\n }\n\n const currencySymbol = match[1];\n const raw = match[2]!.replace(/,/g, \"\");\n const amount = Number(raw);\n const currency = currencySymbol === \"€\"\n ? \"EUR\"\n : currencySymbol === \"£\"\n ? \"GBP\"\n : DEFAULT_CURRENCY;\n\n return {\n amount: Number.isFinite(amount) ? amount : 0,\n currency\n };\n};\n\nconst parseRating = (text: string): number => {\n const match = text.match(RATING_RE);\n if (!match) return 0;\n return Math.max(0, Math.min(5, Number(match[1])));\n};\n\nconst parseReviews = (text: string): number => {\n const match = text.match(REVIEWS_RE);\n if (!match) return 0;\n const value = Number(match[1]!.replace(/,/g, \"\"));\n return Number.isFinite(value) ? Math.max(0, value) : 0;\n};\n\nconst parseAvailability = (text: string): \"in_stock\" | \"limited\" | \"out_of_stock\" | \"unknown\" => {\n const lower = text.toLowerCase();\n if (/out of stock|sold out|unavailable/.test(lower)) return \"out_of_stock\";\n if (/limited|few left|only \\d+ left/.test(lower)) return \"limited\";\n if (/in stock|available now|ships/.test(lower)) return \"in_stock\";\n return \"unknown\";\n};\n\nconst dedupeLinks = (links: string[], limit: number): string[] => {\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const link of links) {\n const url = canonicalizeUrl(link);\n if (!isHttpUrl(url) || seen.has(url)) continue;\n seen.add(url);\n normalized.push(url);\n if (normalized.length >= limit) break;\n }\n return normalized.sort((left, right) => left.localeCompare(right));\n};\n\nconst deriveOfferAttributes = (args: {\n profile: ShoppingProviderProfile;\n url: string;\n title: string;\n text: string;\n rank: number;\n}): Record<string, JsonValue> => {\n const nowIso = new Date().toISOString();\n const price = parsePrice(args.text);\n const rating = parseRating(args.text);\n const reviews = parseReviews(args.text);\n const availability = parseAvailability(args.text);\n\n return {\n shopping_offer: {\n provider: args.profile.id,\n product_id: `${args.profile.id}:${args.rank}:${Buffer.from(args.url).toString(\"base64\").slice(0, 8)}`,\n title: args.title,\n url: args.url,\n price: {\n amount: price.amount,\n currency: price.currency,\n retrieved_at: nowIso\n },\n shipping: {\n amount: 0,\n currency: price.currency,\n notes: \"unknown\"\n },\n availability,\n rating,\n reviews_count: reviews,\n capture_timestamp: nowIso\n },\n extractionQuality: {\n hasUrl: args.url.length > 0,\n hasTitle: args.title.length > 0,\n hasContent: args.text.length > 0,\n contentChars: args.text.length,\n linkCount: 0\n },\n providerTier: args.profile.tier,\n extractionFocus: args.profile.extractionFocus,\n canonicalUrl: canonicalizeUrl(args.url)\n };\n};\n\nconst buildCapabilities = (profile: ShoppingProviderProfile, providerId: string): ProviderCapabilities => ({\n providerId,\n source: SHOPPING_SOURCE,\n operations: {\n search: {\n op: \"search\",\n supported: true,\n description: `Search ${profile.displayName}`\n },\n fetch: {\n op: \"fetch\",\n supported: true,\n description: `Fetch ${profile.displayName} product details`\n },\n crawl: {\n op: \"crawl\",\n supported: false,\n description: \"Shopping crawl is disabled by default\"\n },\n post: {\n op: \"post\",\n supported: false,\n description: \"Shopping posting is not supported\"\n }\n },\n policy: {\n posting: \"unsupported\",\n riskNoticeRequired: false,\n confirmationRequired: false\n },\n metadata: {\n provider: profile.displayName,\n domains: profile.domains,\n tier: profile.tier,\n extractionFocus: profile.extractionFocus,\n legalReview: {\n termsReviewDate: profile.legalReview.termsReviewDate,\n approvalExpiryDate: profile.legalReview.approvalExpiryDate,\n reviewer: profile.legalReview.reviewer,\n signedOff: profile.legalReview.signedOff\n }\n }\n});\n\nconst normalizeRows = (\n providerId: string,\n rows: ShoppingSearchRecord[]\n): NormalizedRecord[] => normalizeRecords(providerId, SHOPPING_SOURCE, rows);\n\nconst createDefaultSearch = (\n profile: ShoppingProviderProfile,\n providerId: string,\n fetcher: ShoppingFetcher\n) => async (input: ProviderSearchInput, context: ProviderContext): Promise<ShoppingSearchRecord[]> => {\n const query = input.query.trim();\n if (!query) {\n throw new ProviderRuntimeError(\"invalid_input\", `${profile.displayName} query is required`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: false\n });\n }\n\n const lookupUrl = isHttpUrl(query)\n ? query\n : profile.searchPath(query);\n const fetched = await fetcher({\n url: lookupUrl,\n signal: context.signal,\n provider: providerId,\n operation: \"search\",\n context\n });\n const extracted = extractStructuredContent(fetched.html, fetched.url);\n\n const limit = Math.max(1, Math.min(input.limit ?? 10, 20));\n const links = dedupeLinks(extracted.links, limit);\n const content = toSnippet(extracted.text, 2000);\n\n const rows: ShoppingSearchRecord[] = [\n {\n url: fetched.url,\n title: `${profile.displayName} search: ${query}`,\n content,\n confidence: 0.68,\n attributes: {\n ...deriveOfferAttributes({\n profile,\n url: fetched.url,\n title: `${profile.displayName} search: ${query}`,\n text: extracted.text,\n rank: 0\n }),\n status: fetched.status,\n links,\n retrievalPath: isHttpUrl(query) ? \"shopping:search:url\" : \"shopping:search:index\"\n }\n }\n ];\n\n links.forEach((link, index) => {\n rows.push({\n url: link,\n title: link,\n content: index === 0 ? content : undefined,\n confidence: Math.max(0.45, 0.72 - index * 0.03),\n attributes: {\n ...deriveOfferAttributes({\n profile,\n url: link,\n title: link,\n text: extracted.text,\n rank: index + 1\n }),\n rank: index + 1,\n retrievalPath: \"shopping:search:link\"\n }\n });\n });\n\n return rows.slice(0, limit + 1);\n};\n\nconst createDefaultFetch = (\n profile: ShoppingProviderProfile,\n providerId: string,\n fetcher: ShoppingFetcher\n) => async (input: ProviderFetchInput, context: ProviderContext): Promise<ShoppingSearchRecord> => {\n const fetched = await fetcher({\n url: input.url,\n signal: context.signal,\n provider: providerId,\n operation: \"fetch\",\n context\n });\n const extracted = extractStructuredContent(fetched.html, fetched.url);\n const title = toSnippet(extracted.text, 120) || fetched.url;\n\n return {\n url: fetched.url,\n title,\n content: extracted.text,\n attributes: {\n ...deriveOfferAttributes({\n profile,\n url: fetched.url,\n title,\n text: extracted.text,\n rank: 1\n }),\n status: fetched.status,\n links: dedupeLinks(extracted.links, 30),\n selectors: extracted.selectors,\n retrievalPath: \"shopping:fetch:url\"\n }\n };\n};\n\nconst resolveHealth = (): ProviderHealth => ({\n status: \"healthy\",\n updatedAt: new Date().toISOString()\n});\n\nexport const createShoppingProvider = (\n profile: ShoppingProviderProfile,\n options: ShoppingProviderOptions = {}\n): ProviderAdapter => {\n const providerId = options.id ?? profile.id;\n const fetcher = options.fetcher ?? defaultFetcher;\n const search = options.search ?? createDefaultSearch(profile, providerId, fetcher);\n const fetch = options.fetch ?? createDefaultFetch(profile, providerId, fetcher);\n\n return {\n id: providerId,\n source: SHOPPING_SOURCE,\n search: async (input, context) => normalizeRows(providerId, await search(input, context)),\n fetch: async (input, context) => {\n const row = await fetch(input, context);\n return [normalizeRecord(providerId, SHOPPING_SOURCE, row)];\n },\n health: async () => resolveHealth(),\n capabilities: () => buildCapabilities(profile, providerId)\n };\n};\n\nexport const createShoppingProviders = (options: ShoppingProvidersOptions = {}): ProviderAdapter[] => {\n return SHOPPING_PROVIDER_PROFILES.map((profile) => createShoppingProvider(profile, options[profile.name]));\n};\n\nexport const createShoppingProviderById = (\n providerId: string,\n options: ShoppingProviderOptions = {}\n): ProviderAdapter => {\n const profile = SHOPPING_PROVIDER_PROFILES.find((entry) => entry.id === providerId || entry.name === providerId.replace(/^shopping\\//, \"\"));\n if (!profile) {\n throw new ProviderRuntimeError(\"invalid_input\", `Unknown shopping provider: ${providerId}`, {\n source: SHOPPING_SOURCE,\n retryable: false,\n details: {\n providerId,\n available: SHOPPING_PROVIDER_IDS\n }\n });\n }\n return createShoppingProvider(profile, options);\n};\n","import { ProviderRuntimeError } from \"../errors\";\nimport { normalizeRecord, normalizeRecords } from \"../normalize\";\nimport { crawlWeb, type CrawlBudget, type CrawlFetcher, type CrawlPipelineBudget } from \"./crawler\";\nimport { extractStructuredContent, toSnippet } from \"./extract\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderCapabilities,\n ProviderContext,\n ProviderCrawlInput,\n ProviderFetchInput,\n ProviderSearchInput\n} from \"../types\";\nimport type { WebCrawlPolicy } from \"./policy\";\n\nexport interface WebSearchRecord {\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n}\n\nexport interface WebProviderOptions {\n id?: string;\n fetcher?: CrawlFetcher;\n searchIndex?: (input: ProviderSearchInput, context: ProviderContext) => Promise<WebSearchRecord[]>;\n defaultBudget?: Partial<CrawlBudget>;\n defaultPipeline?: Partial<CrawlPipelineBudget>;\n selectors?: string[];\n workerThreads?: number;\n queueMax?: number;\n forceInlineParse?: boolean;\n policy?: WebCrawlPolicy;\n}\n\nconst WEB_SOURCE = \"web\" as const;\n\nconst capabilities = (id: string, policy: WebCrawlPolicy | undefined): ProviderCapabilities => ({\n providerId: id,\n source: WEB_SOURCE,\n operations: {\n search: { op: \"search\", supported: true, description: \"Query web content\" },\n fetch: { op: \"fetch\", supported: true, description: \"Fetch one web document\" },\n crawl: { op: \"crawl\", supported: true, description: \"Budgeted web crawl\" },\n post: { op: \"post\", supported: false, description: \"Posting is not supported for web provider\" }\n },\n policy: {\n posting: \"unsupported\",\n riskNoticeRequired: false,\n confirmationRequired: false\n },\n metadata: {\n crawler: true,\n robotsMode: policy?.robotsMode ?? \"warn\"\n }\n});\n\nconst fetchOne = async (fetcher: CrawlFetcher, url: string): Promise<{ status: number; html: string }> => {\n const result = await fetcher(url);\n return {\n status: result.status ?? 200,\n html: result.html\n };\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst toQualityFlags = (value: {\n url?: string;\n title?: string;\n content?: string;\n linkCount?: number;\n}): Record<string, JsonValue> => ({\n hasUrl: typeof value.url === \"string\" && value.url.length > 0,\n hasTitle: typeof value.title === \"string\" && value.title.length > 0,\n hasContent: typeof value.content === \"string\" && value.content.length > 0,\n contentChars: value.content?.length ?? 0,\n linkCount: value.linkCount ?? 0\n});\n\nconst asPositiveInt = (value: JsonValue | undefined): number | undefined => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n const normalized = Math.floor(value);\n return normalized > 0 ? normalized : undefined;\n};\n\nexport const createWebProvider = (options: WebProviderOptions = {}): ProviderAdapter => {\n const id = options.id ?? \"web/default\";\n\n const search = async (input: ProviderSearchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!input.query.trim()) {\n throw new ProviderRuntimeError(\"invalid_input\", \"Search query is required\", {\n provider: id,\n source: WEB_SOURCE,\n retryable: false\n });\n }\n\n if (options.searchIndex) {\n const rows = await options.searchIndex(input, context);\n return normalizeRecords(id, WEB_SOURCE, rows.map((row) => ({\n url: row.url,\n title: row.title,\n content: row.content,\n confidence: row.confidence,\n attributes: {\n ...(row.attributes ?? {}),\n extractionQuality: toQualityFlags({\n url: row.url,\n title: row.title,\n content: row.content\n })\n }\n })));\n }\n\n if (!options.fetcher) {\n throw new ProviderRuntimeError(\"unavailable\", \"Web search retrieval is not configured\", {\n provider: id,\n source: WEB_SOURCE\n });\n }\n\n const queryUrl = input.query.trim();\n if (!isHttpUrl(queryUrl)) {\n throw new ProviderRuntimeError(\"invalid_input\", \"Web search query must be an HTTP URL when search index is not configured\", {\n provider: id,\n source: WEB_SOURCE,\n retryable: false\n });\n }\n\n const response = await fetchOne(options.fetcher, queryUrl);\n const extracted = extractStructuredContent(response.html, queryUrl);\n return [normalizeRecord(id, WEB_SOURCE, {\n url: queryUrl,\n title: queryUrl,\n content: toSnippet(extracted.text),\n confidence: 0.4,\n attributes: {\n status: response.status,\n links: extracted.links.length,\n extractionQuality: toQualityFlags({\n url: queryUrl,\n title: queryUrl,\n content: extracted.text,\n linkCount: extracted.links.length\n })\n }\n })];\n };\n\n const fetch = async (input: ProviderFetchInput): Promise<NormalizedRecord[]> => {\n if (!options.fetcher) {\n throw new ProviderRuntimeError(\"unavailable\", \"Web fetcher is not configured\", {\n provider: id,\n source: WEB_SOURCE\n });\n }\n\n const response = await fetchOne(options.fetcher, input.url);\n const extracted = extractStructuredContent(response.html, input.url);\n\n return [normalizeRecord(id, WEB_SOURCE, {\n url: input.url,\n title: input.url,\n content: extracted.text,\n confidence: 0.6,\n attributes: {\n status: response.status,\n links: extracted.links,\n selectors: extracted.selectors,\n extractionQuality: toQualityFlags({\n url: input.url,\n title: input.url,\n content: extracted.text,\n linkCount: extracted.links.length\n })\n }\n })];\n };\n\n const crawl = async (input: ProviderCrawlInput): Promise<NormalizedRecord[]> => {\n if (!options.fetcher) {\n throw new ProviderRuntimeError(\"unavailable\", \"Web crawler fetcher is not configured\", {\n provider: id,\n source: WEB_SOURCE\n });\n }\n\n if (input.seedUrls.length === 0) {\n throw new ProviderRuntimeError(\"invalid_input\", \"At least one crawl seed URL is required\", {\n provider: id,\n source: WEB_SOURCE,\n retryable: false\n });\n }\n\n const adaptiveFetchConcurrency = asPositiveInt(input.filters?.fetchConcurrency);\n const adaptiveFrontierMax = asPositiveInt(input.filters?.frontierMax);\n\n const crawlResult = await crawlWeb({\n fetcher: options.fetcher,\n strategy: input.strategy,\n policy: options.policy,\n selectors: options.selectors,\n seeds: input.seedUrls,\n budget: {\n ...options.defaultBudget,\n maxDepth: input.maxDepth ?? options.defaultBudget?.maxDepth,\n maxPages: input.maxPages ?? options.defaultBudget?.maxPages,\n maxPerDomain: input.maxPerDomain ?? options.defaultBudget?.maxPerDomain\n },\n pipeline: {\n ...(options.defaultPipeline ?? {}),\n ...(adaptiveFetchConcurrency !== undefined ? { fetchConcurrency: adaptiveFetchConcurrency } : {}),\n ...(adaptiveFrontierMax !== undefined ? { frontierMax: adaptiveFrontierMax } : {}),\n ...(typeof options.workerThreads === \"number\" ? { workerThreads: options.workerThreads } : {}),\n ...(typeof options.queueMax === \"number\" ? { queueMax: options.queueMax } : {})\n },\n workerThreads: options.workerThreads,\n queueMax: options.queueMax,\n forceInlineParse: options.forceInlineParse\n });\n\n return crawlResult.pages.map((page) => normalizeRecord(id, WEB_SOURCE, {\n url: page.url,\n title: page.url,\n content: page.text,\n confidence: 0.7,\n attributes: {\n depth: page.depth,\n status: page.status,\n links: page.links,\n warnings: page.warnings,\n crawlWarnings: crawlResult.warnings,\n crawlMetrics: {\n visited: crawlResult.metrics.visited,\n fetched: crawlResult.metrics.fetched,\n deduped: crawlResult.metrics.deduped,\n elapsedMs: crawlResult.metrics.elapsedMs,\n pagesPerMinute: crawlResult.metrics.pagesPerMinute,\n p50LatencyMs: crawlResult.metrics.p50LatencyMs,\n p95LatencyMs: crawlResult.metrics.p95LatencyMs\n },\n extractionQuality: toQualityFlags({\n url: page.url,\n title: page.url,\n content: page.text,\n linkCount: page.links.length\n })\n }\n }));\n };\n\n return {\n id,\n source: WEB_SOURCE,\n search,\n fetch,\n crawl,\n health: async () => ({\n status: options.fetcher ? \"healthy\" : \"degraded\",\n updatedAt: new Date().toISOString(),\n ...(options.fetcher ? {} : { reason: \"Fetcher not configured\" })\n }),\n capabilities: () => capabilities(id, options.policy)\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)\\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(challenge|captcha|verify|interstitial|cf_chl|bot)\\b/i, confidence: 0.88 },\n { id: \"prove_humanity\", regex: /prove your humanity/i, confidence: 0.96 }\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","export interface TimeboxInput {\n days?: number;\n from?: string;\n to?: string;\n now?: Date;\n allowDaysWithRange?: boolean;\n}\n\nexport interface ResolvedTimebox {\n mode: \"days\" | \"range\";\n days?: number;\n from: string;\n to: string;\n applied: true;\n}\n\nconst MAX_DAYS = 365;\n\nconst ensureIsoDate = (value: string, label: string): Date => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid ${label} date: ${value}`);\n }\n return date;\n};\n\nconst clampDays = (days: number): number => {\n if (!Number.isFinite(days) || days <= 0) {\n throw new Error(\"days must be a positive number\");\n }\n return Math.min(MAX_DAYS, Math.floor(days));\n};\n\nexport const resolveTimebox = (input: TimeboxInput): ResolvedTimebox => {\n const now = input.now ?? new Date();\n const hasDays = typeof input.days === \"number\";\n const hasFrom = typeof input.from === \"string\" && input.from.trim().length > 0;\n const hasTo = typeof input.to === \"string\" && input.to.trim().length > 0;\n\n if (hasDays && (hasFrom || hasTo) && !input.allowDaysWithRange) {\n throw new Error(\"days cannot be combined with from/to\");\n }\n\n if (hasTo && !hasFrom && !hasDays) {\n throw new Error(\"to cannot be provided without from or days\");\n }\n\n if (hasDays) {\n const days = clampDays(input.days as number);\n const toDate = now;\n const fromDate = new Date(toDate.getTime() - days * 24 * 60 * 60 * 1000);\n return {\n mode: \"days\",\n days,\n from: fromDate.toISOString(),\n to: toDate.toISOString(),\n applied: true\n };\n }\n\n if (hasFrom) {\n const fromDate = ensureIsoDate(input.from as string, \"from\");\n const toDate = hasTo ? ensureIsoDate(input.to as string, \"to\") : now;\n if (fromDate.getTime() > toDate.getTime()) {\n throw new Error(\"from cannot be later than to\");\n }\n const diffMs = toDate.getTime() - fromDate.getTime();\n const days = Math.max(1, Math.ceil(diffMs / (24 * 60 * 60 * 1000)));\n return {\n mode: \"range\",\n days,\n from: fromDate.toISOString(),\n to: toDate.toISOString(),\n applied: true\n };\n }\n\n const defaultDays = 30;\n const toDate = now;\n const fromDate = new Date(toDate.getTime() - defaultDays * 24 * 60 * 60 * 1000);\n return {\n mode: \"days\",\n days: defaultDays,\n from: fromDate.toISOString(),\n to: toDate.toISOString(),\n applied: true\n };\n};\n\nexport const isWithinTimebox = (\n timestamp: string | undefined,\n timebox: ResolvedTimebox,\n now?: Date\n): boolean => {\n if (!timestamp) return false;\n const value = new Date(timestamp);\n if (Number.isNaN(value.getTime())) return false;\n const from = new Date(timebox.from).getTime();\n const to = new Date(timebox.to).getTime();\n const upperBound =\n timebox.mode === \"days\" ? Math.max(to, now?.getTime() ?? to) : to;\n const current = value.getTime();\n return current >= from && current <= upperBound;\n};\n\nexport const filterByTimebox = <T extends { timestamp?: string }>(\n records: T[],\n timebox: ResolvedTimebox,\n now?: Date\n): T[] => {\n return records.filter((record) =>\n isWithinTimebox(record.timestamp, timebox, now)\n );\n};\n","import type { JsonValue, NormalizedRecord, ProviderSource } from \"./types\";\nimport type { ResolvedTimebox } from \"./timebox\";\nimport { isWithinTimebox } from \"./timebox\";\n\nexport interface EngagementMetrics {\n likes: number;\n comments: number;\n views: number;\n upvotes: number;\n}\n\nexport interface RecencyMetadata {\n within_timebox: boolean;\n age_hours: number;\n}\n\nexport interface DateConfidenceMetadata {\n score: number;\n source: \"explicit\" | \"inferred\" | \"missing\";\n}\n\nexport interface ResearchRecord {\n id: string;\n source: ProviderSource;\n provider: string;\n url?: string;\n title?: string;\n content?: string;\n timestamp: string;\n confidence: number;\n engagement: EngagementMetrics;\n recency: RecencyMetadata;\n date_confidence: DateConfidenceMetadata;\n attributes: Record<string, JsonValue>;\n}\n\nconst asNumber = (value: JsonValue | undefined): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(0, value);\n }\n if (typeof value === \"string\" && value.trim()) {\n const normalized = value.replace(/,/g, \"\").trim();\n const parsed = Number(normalized);\n if (Number.isFinite(parsed)) {\n return Math.max(0, parsed);\n }\n }\n return 0;\n};\n\nconst readEngagement = (attributes: Record<string, JsonValue>): EngagementMetrics => {\n const nested = (attributes.engagement ?? {}) as Record<string, JsonValue>;\n return {\n likes: asNumber(nested.likes ?? attributes.likes),\n comments: asNumber(nested.comments ?? attributes.comments),\n views: asNumber(nested.views ?? attributes.views),\n upvotes: asNumber(nested.upvotes ?? attributes.upvotes)\n };\n};\n\nconst computeDateConfidence = (record: NormalizedRecord): DateConfidenceMetadata => {\n const timestamp = new Date(record.timestamp);\n if (!Number.isNaN(timestamp.getTime())) {\n return {\n score: 1,\n source: \"explicit\"\n };\n }\n\n const inferred = record.attributes.published_at;\n if (typeof inferred === \"string\" && !Number.isNaN(new Date(inferred).getTime())) {\n return {\n score: 0.6,\n source: \"inferred\"\n };\n }\n\n return {\n score: 0,\n source: \"missing\"\n };\n};\n\nconst computeRecency = (\n record: NormalizedRecord,\n timebox: ResolvedTimebox,\n now: Date\n): RecencyMetadata => {\n const parsed = new Date(record.timestamp);\n if (Number.isNaN(parsed.getTime())) {\n return {\n within_timebox: false,\n age_hours: Number.POSITIVE_INFINITY\n };\n }\n\n const ageHours = Math.max(0, (now.getTime() - parsed.getTime()) / (60 * 60 * 1000));\n return {\n within_timebox: isWithinTimebox(record.timestamp, timebox, now),\n age_hours: Number(ageHours.toFixed(2))\n };\n};\n\nexport const toResearchRecord = (\n record: NormalizedRecord,\n timebox: ResolvedTimebox,\n now: Date = new Date()\n): ResearchRecord => {\n const engagement = readEngagement(record.attributes);\n const recency = computeRecency(record, timebox, now);\n const dateConfidence = computeDateConfidence(record);\n\n const engagementJson = {\n likes: engagement.likes,\n comments: engagement.comments,\n views: engagement.views,\n upvotes: engagement.upvotes\n };\n const recencyJson = {\n within_timebox: recency.within_timebox,\n age_hours: recency.age_hours\n };\n const dateConfidenceJson = {\n score: dateConfidence.score,\n source: dateConfidence.source\n };\n\n return {\n id: record.id,\n source: record.source,\n provider: record.provider,\n ...(record.url ? { url: record.url } : {}),\n ...(record.title ? { title: record.title } : {}),\n ...(record.content ? { content: record.content } : {}),\n timestamp: record.timestamp,\n confidence: record.confidence,\n engagement,\n recency,\n date_confidence: dateConfidence,\n attributes: {\n ...record.attributes,\n engagement: engagementJson,\n recency: recencyJson,\n date_confidence: dateConfidenceJson\n }\n };\n};\n\nexport const enrichResearchRecords = (\n records: NormalizedRecord[],\n timebox: ResolvedTimebox,\n now: Date = new Date()\n): ResearchRecord[] => {\n return records.map((record) => toResearchRecord(record, timebox, now));\n};\n","import { canonicalizeUrl } from \"./web/crawler\";\nimport type { ResearchRecord } from \"./enrichment\";\n\nexport type RenderMode = \"compact\" | \"json\" | \"md\" | \"context\" | \"path\";\n\nexport interface ShoppingOffer {\n offer_id: string;\n product_id: string;\n provider: string;\n url: string;\n title: string;\n price: {\n amount: number;\n currency: string;\n retrieved_at: string;\n };\n shipping: {\n amount: number;\n currency: string;\n notes: string;\n };\n availability: \"in_stock\" | \"limited\" | \"out_of_stock\" | \"unknown\";\n rating: number;\n reviews_count: number;\n deal_score: number;\n attributes: Record<string, unknown>;\n}\n\nconst toCurrency = (value: number): string => `$${value.toFixed(2)}`;\n\nconst compactResearchLines = (records: ResearchRecord[]): string[] => {\n if (records.length === 0) {\n return [\"No records matched the requested timebox.\"];\n }\n return records.slice(0, 10).map((record, index) => {\n const title = record.title ?? record.url ?? record.provider;\n const engagement = record.engagement.likes + record.engagement.comments + record.engagement.upvotes;\n return `${index + 1}. ${title} (${record.source}/${record.provider}) score=${record.confidence.toFixed(2)} engagement=${engagement}`;\n });\n};\n\nexport const renderResearch = (args: {\n mode: RenderMode;\n topic: string;\n records: ResearchRecord[];\n meta: Record<string, unknown>;\n}): {\n response: Record<string, unknown>;\n files: Array<{ path: string; content: string | Record<string, unknown> }>;\n} => {\n const lines = compactResearchLines(args.records);\n const summary = lines.join(\"\\n\");\n const markdown = [\n `# Research: ${args.topic}`,\n \"\",\n ...lines,\n \"\",\n \"## Metadata\",\n \"```json\",\n JSON.stringify(args.meta, null, 2),\n \"```\"\n ].join(\"\\n\");\n const contextPayload = {\n topic: args.topic,\n highlights: lines,\n records: args.records,\n meta: args.meta\n };\n\n const files = [\n { path: \"summary.md\", content: markdown },\n { path: \"records.json\", content: { records: args.records } },\n { path: \"context.json\", content: contextPayload },\n { path: \"meta.json\", content: args.meta }\n ];\n\n if (args.mode === \"compact\") {\n return {\n response: {\n mode: args.mode,\n summary,\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"json\") {\n return {\n response: {\n mode: args.mode,\n records: args.records,\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"md\") {\n return {\n response: {\n mode: args.mode,\n markdown,\n meta: args.meta\n },\n files\n };\n }\n\n if (args.mode === \"context\") {\n return {\n response: {\n mode: args.mode,\n context: contextPayload,\n meta: args.meta\n },\n files\n };\n }\n\n return {\n response: {\n mode: \"path\",\n meta: args.meta\n },\n files\n };\n};\n\nconst toComparisonCsv = (offers: ShoppingOffer[]): string => {\n const header = [\"provider\", \"title\", \"price\", \"shipping\", \"deal_score\", \"availability\", \"url\"].join(\",\");\n const rows = offers.map((offer) => {\n return [\n offer.provider,\n JSON.stringify(offer.title),\n offer.price.amount.toFixed(2),\n offer.shipping.amount.toFixed(2),\n offer.deal_score.toFixed(4),\n offer.availability,\n canonicalizeUrl(offer.url)\n ].join(\",\");\n });\n return [header, ...rows].join(\"\\n\");\n};\n\nconst compactShoppingLines = (offers: ShoppingOffer[]): string[] => {\n if (offers.length === 0) {\n return [\"No offers available from the selected providers.\"];\n }\n return offers.slice(0, 10).map((offer, index) => {\n const total = offer.price.amount + offer.shipping.amount;\n return `${index + 1}. ${offer.title} - ${toCurrency(total)} (${offer.provider}, deal=${offer.deal_score.toFixed(2)})`;\n });\n};\n\nexport const renderShopping = (args: {\n mode: RenderMode;\n query: string;\n offers: ShoppingOffer[];\n meta: Record<string, unknown>;\n}): {\n response: Record<string, unknown>;\n files: Array<{ path: string; content: string | Record<string, unknown> }>;\n} => {\n const lines = compactShoppingLines(args.offers);\n const markdown = [\n `# Shopping: ${args.query}`,\n \"\",\n ...lines,\n \"\",\n \"## Metadata\",\n \"```json\",\n JSON.stringify(args.meta, null, 2),\n \"```\"\n ].join(\"\\n\");\n\n const comparisonCsv = toComparisonCsv(args.offers);\n const contextPayload = {\n query: args.query,\n highlights: lines,\n offers: args.offers,\n meta: args.meta\n };\n\n const files = [\n { path: \"deals.md\", content: markdown },\n { path: \"offers.json\", content: { offers: args.offers } },\n { path: \"comparison.csv\", content: comparisonCsv },\n { path: \"meta.json\", content: args.meta },\n { path: \"deals-context.json\", content: contextPayload }\n ];\n\n if (args.mode === \"compact\") {\n return {\n response: {\n mode: args.mode,\n summary: lines.join(\"\\n\"),\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"json\") {\n return {\n response: {\n mode: args.mode,\n offers: args.offers,\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"md\") {\n return {\n response: {\n mode: args.mode,\n markdown,\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"context\") {\n return {\n response: {\n mode: args.mode,\n context: contextPayload,\n meta: args.meta\n },\n files\n };\n }\n\n return {\n response: {\n mode: \"path\",\n meta: args.meta\n },\n files\n };\n};\n","import { mkdir, readdir, readFile, rm, stat, writeFile } from \"fs/promises\";\nimport { dirname, join, resolve } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { tmpdir } from \"os\";\n\nexport const DEFAULT_ARTIFACT_TTL_HOURS = 72;\nexport const MAX_ARTIFACT_TTL_HOURS = 168;\n\ntype ArtifactContent = string | Buffer | Record<string, unknown>;\n\nexport interface ArtifactFile {\n path: string;\n content: ArtifactContent;\n}\n\nexport interface ArtifactManifest {\n run_id: string;\n created_at: string;\n ttl_hours: number;\n expires_at: string;\n files: string[];\n}\n\nexport interface ArtifactBundle {\n runId: string;\n basePath: string;\n manifest: ArtifactManifest;\n manifestFileName: string;\n}\n\nconst clampTtlHours = (value: number | undefined): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return DEFAULT_ARTIFACT_TTL_HOURS;\n }\n return Math.min(MAX_ARTIFACT_TTL_HOURS, Math.floor(value));\n};\n\nconst serializeContent = (content: ArtifactContent): string | Buffer => {\n if (typeof content === \"string\" || Buffer.isBuffer(content)) {\n return content;\n }\n return `${JSON.stringify(content, null, 2)}\\n`;\n};\n\nexport const createArtifactBundle = async (args: {\n namespace: string;\n files: ArtifactFile[];\n outputDir?: string;\n ttlHours?: number;\n manifestFileName?: string;\n now?: Date;\n}): Promise<ArtifactBundle> => {\n const runId = randomUUID();\n const now = args.now ?? new Date();\n const ttlHours = clampTtlHours(args.ttlHours);\n const manifestFileName = args.manifestFileName ?? \"bundle-manifest.json\";\n const expiresAt = new Date(now.getTime() + ttlHours * 60 * 60 * 1000);\n const root = args.outputDir ? resolve(args.outputDir) : join(tmpdir(), \"opendevbrowser\");\n const basePath = join(root, args.namespace, runId);\n\n await mkdir(basePath, { recursive: true, mode: 0o700 });\n\n const writtenFiles: string[] = [];\n for (const file of args.files) {\n const filePath = join(basePath, file.path);\n const directory = dirname(filePath);\n if (directory && directory !== basePath) {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n }\n await writeFile(filePath, serializeContent(file.content), { mode: 0o600 });\n writtenFiles.push(file.path);\n }\n\n const manifest: ArtifactManifest = {\n run_id: runId,\n created_at: now.toISOString(),\n ttl_hours: ttlHours,\n expires_at: expiresAt.toISOString(),\n files: [...writtenFiles, manifestFileName]\n };\n\n await writeFile(join(basePath, manifestFileName), `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n\n return {\n runId,\n basePath,\n manifest,\n manifestFileName\n };\n};\n\nconst isExpired = (manifest: ArtifactManifest, now: Date): boolean => {\n const expiry = new Date(manifest.expires_at);\n if (Number.isNaN(expiry.getTime())) return false;\n return expiry.getTime() <= now.getTime();\n};\n\nexport const cleanupExpiredArtifacts = async (\n rootDir: string,\n now: Date = new Date()\n): Promise<{ removed: string[]; skipped: string[] }> => {\n const removed: string[] = [];\n const skipped: string[] = [];\n\n let namespaces: string[] = [];\n try {\n namespaces = await readdir(rootDir);\n } catch {\n return { removed, skipped };\n }\n\n for (const namespace of namespaces) {\n const namespacePath = join(rootDir, namespace);\n let runs: string[] = [];\n try {\n runs = await readdir(namespacePath);\n } catch {\n continue;\n }\n\n for (const run of runs) {\n const runPath = join(namespacePath, run);\n const manifestCandidates = [join(runPath, \"bundle-manifest.json\"), join(runPath, \"manifest.json\")];\n try {\n let manifestPath: string | null = null;\n for (const candidate of manifestCandidates) {\n try {\n const candidateMetadata = await stat(candidate);\n if (candidateMetadata.isFile()) {\n manifestPath = candidate;\n break;\n }\n } catch {\n // try next manifest path\n }\n }\n if (!manifestPath) {\n skipped.push(runPath);\n continue;\n }\n\n const metadata = await stat(manifestPath);\n if (!metadata.isFile()) {\n skipped.push(runPath);\n continue;\n }\n const manifestRaw = await readFile(manifestPath, \"utf8\");\n const manifest = JSON.parse(manifestRaw) as ArtifactManifest;\n if (isExpired(manifest, now)) {\n await rm(runPath, { recursive: true, force: true });\n removed.push(runPath);\n } else {\n skipped.push(runPath);\n }\n } catch {\n skipped.push(runPath);\n }\n }\n }\n\n return { removed, skipped };\n};\n","import { createHash } from \"crypto\";\nimport { createArtifactBundle, type ArtifactFile } from \"./artifacts\";\nimport { enrichResearchRecords, type ResearchRecord } from \"./enrichment\";\nimport { renderResearch, renderShopping, type RenderMode, type ShoppingOffer } from \"./renderer\";\nimport { filterByTimebox, resolveTimebox } from \"./timebox\";\nimport {\n SHOPPING_PROVIDER_IDS,\n SHOPPING_PROVIDER_PROFILES,\n validateShoppingLegalReviewChecklist\n} from \"./shopping\";\nimport { createLogger, redactSensitive } from \"../core/logging\";\nimport { normalizeProviderReasonCode } from \"./errors\";\nimport { providerRequestHeaders } from \"./shared/request-headers\";\nimport { canonicalizeUrl } from \"./web/crawler\";\nimport { toSnippet } from \"./web/extract\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAggregateResult,\n ProviderCallResultByOperation,\n ProviderCookiePolicy,\n ProviderError,\n ProviderFailureEntry,\n ProviderReasonCode,\n ProviderRunOptions,\n ProviderSelection,\n ProviderSource\n} from \"./types\";\n\nexport interface ProviderExecutor {\n search: (\n input: ProviderCallResultByOperation[\"search\"],\n options?: ProviderRunOptions\n ) => Promise<ProviderAggregateResult>;\n fetch: (\n input: ProviderCallResultByOperation[\"fetch\"],\n options?: ProviderRunOptions\n ) => Promise<ProviderAggregateResult>;\n}\n\nexport interface ResearchRunInput {\n topic: string;\n days?: number;\n from?: string;\n to?: string;\n sourceSelection?: ProviderSelection;\n sources?: ProviderSource[];\n mode: RenderMode;\n includeEngagement?: boolean;\n limitPerSource?: number;\n outputDir?: string;\n ttlHours?: number;\n useCookies?: boolean;\n cookiePolicyOverride?: ProviderCookiePolicy;\n}\n\nexport interface ShoppingRunInput {\n query: string;\n providers?: string[];\n budget?: number;\n region?: string;\n sort?: \"best_deal\" | \"lowest_price\" | \"highest_rating\" | \"fastest_shipping\";\n mode: RenderMode;\n timeoutMs?: number;\n outputDir?: string;\n ttlHours?: number;\n useCookies?: boolean;\n cookiePolicyOverride?: ProviderCookiePolicy;\n}\n\nexport interface ProductVideoRunInput {\n product_url?: string;\n product_name?: string;\n provider_hint?: string;\n include_screenshots?: boolean;\n include_all_images?: boolean;\n include_copy?: boolean;\n output_dir?: string;\n ttl_hours?: number;\n useCookies?: boolean;\n cookiePolicyOverride?: ProviderCookiePolicy;\n}\n\nexport interface ProductVideoWorkflowOptions {\n captureScreenshot?: (url: string) => Promise<Buffer | null>;\n}\n\ntype ProviderSignal = \"ok\" | \"anti_bot_challenge\" | \"rate_limited\" | \"transcript_unavailable\";\ntype TrackedSignal = Exclude<ProviderSignal, \"ok\">;\ntype AlertState = \"none\" | \"warning\" | \"degraded\";\n\ntype ProviderSignalState = {\n entries: ProviderSignal[];\n previousWindowRates: Record<TrackedSignal, number>;\n signalState: Record<TrackedSignal, AlertState>;\n healthyWindows: Record<TrackedSignal, number>;\n};\n\nconst SIGNAL_WINDOW = 50;\nconst RECOVERY_WINDOWS_REQUIRED = 2;\nconst providerSignalMap = new Map<string, ProviderSignalState>();\nconst workflowLogger = createLogger(\"provider-workflows\");\n\nconst detectSignal = (error: ProviderError): ProviderSignal | null => {\n const reasonCode = error.reasonCode\n ?? normalizeProviderReasonCode({\n code: error.code,\n message: error.message,\n details: error.details\n });\n if (reasonCode === \"rate_limited\") return \"rate_limited\";\n if (reasonCode === \"challenge_detected\" || /captcha|challenge|anti.?bot|cf_chl/i.test(error.message)) {\n return \"anti_bot_challenge\";\n }\n if (reasonCode === \"transcript_unavailable\" || reasonCode === \"caption_missing\") {\n return \"transcript_unavailable\";\n }\n return null;\n};\n\nconst trackProviderSignals = (result: ProviderAggregateResult): void => {\n const failureByProvider = new Map<string, ProviderFailureEntry>();\n for (const failure of result.failures) {\n failureByProvider.set(failure.provider, failure);\n }\n\n for (const providerId of result.providerOrder) {\n const failure = failureByProvider.get(providerId);\n const signal = failure ? detectSignal(failure.error) ?? \"ok\" : \"ok\";\n const state = providerSignalMap.get(providerId) ?? {\n entries: [],\n previousWindowRates: {\n anti_bot_challenge: 0,\n rate_limited: 0,\n transcript_unavailable: 0\n },\n signalState: {\n anti_bot_challenge: \"none\",\n rate_limited: \"none\",\n transcript_unavailable: \"none\"\n },\n healthyWindows: {\n anti_bot_challenge: 0,\n rate_limited: 0,\n transcript_unavailable: 0\n }\n };\n state.entries.push(signal);\n if (state.entries.length > SIGNAL_WINDOW) {\n state.entries.splice(0, state.entries.length - SIGNAL_WINDOW);\n }\n providerSignalMap.set(providerId, state);\n }\n};\n\nconst isStagedAutoExclusionCandidate = (providerId: string): boolean => {\n return providerId === \"social/youtube\" || providerId.startsWith(\"shopping/\");\n};\n\nconst nextSignalState = (\n previous: AlertState,\n warning: boolean,\n degraded: boolean,\n healthyWindows: number\n): { state: AlertState; healthyWindows: number } => {\n if (degraded) {\n return { state: \"degraded\", healthyWindows: 0 };\n }\n if (warning) {\n return { state: \"warning\", healthyWindows: 0 };\n }\n\n const nextHealthyWindows = healthyWindows + 1;\n if (previous === \"degraded\" && nextHealthyWindows < RECOVERY_WINDOWS_REQUIRED) {\n return { state: \"degraded\", healthyWindows: nextHealthyWindows };\n }\n return { state: \"none\", healthyWindows: nextHealthyWindows };\n};\n\nconst buildAlerts = (): Array<Record<string, JsonValue>> => {\n const alerts: Array<Record<string, JsonValue>> = [];\n\n for (const [provider, state] of providerSignalMap.entries()) {\n const total = state.entries.length;\n if (total === 0) continue;\n\n for (const signal of [\"anti_bot_challenge\", \"rate_limited\", \"transcript_unavailable\"] as const) {\n const signalCount = state.entries.filter((entry) => entry === signal).length;\n const ratio = signalCount / total;\n\n let consecutive = 0;\n for (let index = state.entries.length - 1; index >= 0; index -= 1) {\n if (state.entries[index] !== signal) break;\n consecutive += 1;\n }\n\n const warning = ratio >= 0.15 || consecutive >= 3;\n const degraded = ratio >= 0.25 && state.previousWindowRates[signal] >= 0.25;\n state.previousWindowRates[signal] = ratio;\n\n const previousState = state.signalState[signal];\n const nextState = nextSignalState(previousState, warning, degraded, state.healthyWindows[signal]);\n state.signalState[signal] = nextState.state;\n state.healthyWindows[signal] = nextState.healthyWindows;\n\n if (\n (nextState.state === \"warning\" || nextState.state === \"degraded\")\n && nextState.state !== previousState\n ) {\n const transitionReason = degraded\n ? \"signal ratio >= 25% for two consecutive windows\"\n : consecutive >= 3\n ? \"3 consecutive events detected\"\n : \"signal ratio >= 15%\";\n workflowLogger.warn(\"provider.signal.transition\", {\n data: {\n provider,\n signal,\n previous_state: previousState,\n next_state: nextState.state,\n window_total: total,\n signal_count: signalCount,\n ratio: Number(ratio.toFixed(4)),\n consecutive,\n reason: transitionReason\n }\n });\n }\n\n if (nextState.state === \"none\") continue;\n\n alerts.push({\n provider,\n signal,\n reasonCode: signal === \"anti_bot_challenge\"\n ? \"challenge_detected\"\n : signal === \"rate_limited\"\n ? \"rate_limited\"\n : \"transcript_unavailable\",\n state: nextState.state,\n window_total: total,\n signal_count: signalCount,\n ratio: Number(ratio.toFixed(4)),\n consecutive,\n reason: nextState.state === \"degraded\" && !degraded\n ? `waiting for ${RECOVERY_WINDOWS_REQUIRED} healthy windows before recovery`\n : degraded\n ? \"signal ratio >= 25% for two consecutive windows\"\n : consecutive >= 3\n ? \"3 consecutive events detected\"\n : \"signal ratio >= 15%\"\n });\n }\n }\n\n return alerts;\n};\n\nconst getDegradedProviders = (): Set<string> => {\n const degradedProviders = new Set<string>();\n for (const [provider, state] of providerSignalMap.entries()) {\n if (!isStagedAutoExclusionCandidate(provider)) continue;\n if (state.signalState.anti_bot_challenge === \"degraded\" || state.signalState.rate_limited === \"degraded\") {\n degradedProviders.add(provider);\n }\n }\n return degradedProviders;\n};\n\nconst toProviderSource = (providerId: string): ProviderSource | null => {\n if (providerId.startsWith(\"web/\")) return \"web\";\n if (providerId.startsWith(\"community/\")) return \"community\";\n if (providerId.startsWith(\"social/\")) return \"social\";\n if (providerId.startsWith(\"shopping/\")) return \"shopping\";\n return null;\n};\n\nconst resolveAutoExcludedProviders = (\n sourceSelection: ProviderSelection,\n resolvedSources: ProviderSource[]\n): string[] => {\n if (sourceSelection !== \"auto\") return [];\n const sourceSet = new Set(resolvedSources);\n return [...getDegradedProviders()]\n .filter((provider) => {\n const source = toProviderSource(provider);\n return source !== null && sourceSet.has(source);\n })\n .sort((left, right) => left.localeCompare(right));\n};\n\nconst removeExcludedProviders = <T extends { provider: string }>(\n items: T[],\n excludedProviders: Set<string>\n): T[] => {\n if (excludedProviders.size === 0) return items;\n return items.filter((item) => !excludedProviders.has(item.provider));\n};\n\nconst redactRawCapture = (record: Record<string, unknown>): Record<string, unknown> => {\n const redacted = redactSensitive(record);\n if (!redacted || typeof redacted !== \"object\" || Array.isArray(redacted)) {\n return {};\n }\n return redacted as Record<string, unknown>;\n};\n\nconst withExcludedProviders = (\n selection: { source_selection: ProviderSelection; resolved_sources: ProviderSource[] },\n excludedProviders: string[]\n): { source_selection: ProviderSelection; resolved_sources: ProviderSource[]; excluded_providers?: string[] } => {\n if (excludedProviders.length === 0) return selection;\n return {\n ...selection,\n excluded_providers: excludedProviders\n };\n};\n\nconst withCookieOverrides = (\n options: ProviderRunOptions,\n input: { useCookies?: boolean; cookiePolicyOverride?: ProviderCookiePolicy }\n): ProviderRunOptions => {\n return {\n ...options,\n ...(typeof input.useCookies === \"boolean\" ? { useCookies: input.useCookies } : {}),\n ...(input.cookiePolicyOverride ? { cookiePolicyOverride: input.cookiePolicyOverride } : {})\n };\n};\n\nconst detectFailureReasonCode = (failure: ProviderFailureEntry): ProviderReasonCode | undefined => {\n return failure.error.reasonCode\n ?? normalizeProviderReasonCode({\n code: failure.error.code,\n message: failure.error.message,\n details: failure.error.details\n });\n};\n\nconst summarizeReasonCodeDistribution = (failures: ProviderFailureEntry[]): Record<string, number> => {\n const counts = new Map<string, number>();\n for (const failure of failures) {\n const reasonCode = detectFailureReasonCode(failure);\n if (!reasonCode) continue;\n counts.set(reasonCode, (counts.get(reasonCode) ?? 0) + 1);\n }\n return Object.fromEntries([...counts.entries()].sort(([left], [right]) => left.localeCompare(right)));\n};\n\nconst summarizeTranscriptStrategyFailures = (failures: ProviderFailureEntry[]): Record<string, number> => {\n const counts = new Map<string, number>();\n for (const failure of failures) {\n const attemptChain = failure.error.details?.attemptChain;\n if (!Array.isArray(attemptChain)) continue;\n for (const item of attemptChain) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const strategy = (item as Record<string, unknown>).strategy;\n const reasonCode = (item as Record<string, unknown>).reasonCode;\n if (typeof strategy !== \"string\" || typeof reasonCode !== \"string\") continue;\n const key = `${strategy}:${reasonCode}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n return Object.fromEntries([...counts.entries()].sort(([left], [right]) => left.localeCompare(right)));\n};\n\nconst summarizeTranscriptStrategyDetailDistribution = (records: NormalizedRecord[]): Record<string, number> => {\n const counts = new Map<string, number>();\n for (const record of records) {\n const strategyDetail = record.attributes.transcript_strategy_detail;\n const transcriptStrategy = record.attributes.transcript_strategy;\n const resolved = typeof strategyDetail === \"string\" && strategyDetail.trim().length > 0\n ? strategyDetail\n : typeof transcriptStrategy === \"string\" && transcriptStrategy.trim().length > 0\n ? transcriptStrategy\n : null;\n if (!resolved) continue;\n counts.set(resolved, (counts.get(resolved) ?? 0) + 1);\n }\n return Object.fromEntries([...counts.entries()].sort(([left], [right]) => left.localeCompare(right)));\n};\n\nconst TRANSCRIPT_REASON_CODES = new Set<ProviderReasonCode>([\n \"caption_missing\",\n \"transcript_unavailable\",\n \"strategy_unapproved\"\n]);\n\nconst ANTI_BOT_REASON_CODES = new Set<ProviderReasonCode>([\n \"ip_blocked\",\n \"token_required\",\n \"auth_required\",\n \"challenge_detected\",\n \"rate_limited\",\n \"cooldown_active\"\n]);\n\nconst summarizeCookieDiagnostics = (\n failures: ProviderFailureEntry[],\n records: NormalizedRecord[]\n): Array<Record<string, JsonValue>> => {\n const diagnostics: Array<Record<string, JsonValue>> = [];\n for (const failure of failures) {\n const candidate = failure.error.details?.cookieDiagnostics;\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue;\n diagnostics.push({\n provider: failure.provider,\n source: failure.source,\n ...(detectFailureReasonCode(failure) ? { reasonCode: detectFailureReasonCode(failure) as JsonValue } : {}),\n ...(candidate as Record<string, JsonValue>)\n });\n }\n\n for (const record of records) {\n const candidate = record.attributes.browser_fallback_cookie_diagnostics;\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue;\n diagnostics.push({\n provider: record.provider,\n source: record.source,\n ...(candidate as Record<string, JsonValue>)\n });\n }\n\n for (const record of records) {\n const attemptChain = record.attributes.attempt_chain;\n if (!Array.isArray(attemptChain)) continue;\n for (const attempt of attemptChain) {\n if (!attempt || typeof attempt !== \"object\" || Array.isArray(attempt)) continue;\n const cookieDiagnostics = (attempt as Record<string, unknown>).cookieDiagnostics;\n if (!cookieDiagnostics || typeof cookieDiagnostics !== \"object\" || Array.isArray(cookieDiagnostics)) continue;\n diagnostics.push({\n provider: record.provider,\n source: record.source,\n ...(cookieDiagnostics as Record<string, JsonValue>)\n });\n }\n }\n return diagnostics;\n};\n\nconst hasTranscriptSuccess = (record: NormalizedRecord): boolean => {\n const transcriptAvailable = record.attributes.transcript_available;\n if (transcriptAvailable === true) return true;\n const transcriptStrategy = record.attributes.transcript_strategy;\n return typeof transcriptStrategy === \"string\" && transcriptStrategy.trim().length > 0;\n};\n\nconst summarizeTranscriptDurability = (\n records: NormalizedRecord[],\n failures: ProviderFailureEntry[]\n): {\n attempted: number;\n successful: number;\n failed: number;\n success_rate: number;\n} => {\n const successful = records.filter((record) => hasTranscriptSuccess(record)).length;\n const failed = failures.filter((failure) => {\n const reasonCode = detectFailureReasonCode(failure);\n if (reasonCode && TRANSCRIPT_REASON_CODES.has(reasonCode)) return true;\n return Array.isArray(failure.error.details?.attemptChain);\n }).length;\n const attempted = successful + failed;\n return {\n attempted,\n successful,\n failed,\n success_rate: attempted > 0 ? Number((successful / attempted).toFixed(4)) : 0\n };\n};\n\nconst summarizeAntiBotPressure = (failures: ProviderFailureEntry[]): {\n total_failures: number;\n anti_bot_failures: number;\n anti_bot_failure_ratio: number;\n} => {\n const totalFailures = failures.length;\n const antiBotFailures = failures.filter((failure) => {\n const reasonCode = detectFailureReasonCode(failure);\n return Boolean(reasonCode && ANTI_BOT_REASON_CODES.has(reasonCode));\n }).length;\n return {\n total_failures: totalFailures,\n anti_bot_failures: antiBotFailures,\n anti_bot_failure_ratio: totalFailures > 0 ? Number((antiBotFailures / totalFailures).toFixed(4)) : 0\n };\n};\n\nexport const workflowTestUtils = {\n resetProviderSignalState: (): void => {\n providerSignalMap.clear();\n },\n getDegradedProviders: (): string[] => [...getDegradedProviders()],\n nextSignalState: (\n previous: \"none\" | \"warning\" | \"degraded\",\n warning: boolean,\n degraded: boolean,\n healthyWindows: number\n ): { state: \"none\" | \"warning\" | \"degraded\"; healthyWindows: number } =>\n nextSignalState(previous, warning, degraded, healthyWindows),\n redactRawCapture: (record: unknown): Record<string, unknown> =>\n redactRawCapture(record as Record<string, unknown>),\n toProviderSource: (providerId: string): ProviderSource | null => toProviderSource(providerId),\n resolveShoppingProviderIdForUrl: (url: string): string | null => resolveShoppingProviderIdForUrl(url),\n fetchBinary: (url: string): Promise<Buffer | null> => fetchBinary(url),\n rankResearchRecords: (records: ResearchRecord[]): ResearchRecord[] => rankResearchRecords(records)\n};\n\nconst RESEARCH_AUTO_SOURCES: ProviderSource[] = [\"web\", \"community\", \"social\"];\nconst RESEARCH_ALL_SOURCES: ProviderSource[] = [\"web\", \"community\", \"social\", \"shopping\"];\n\nconst resolveResearchSources = (input: ResearchRunInput): { sourceSelection: ProviderSelection; resolved: ProviderSource[] } => {\n if (input.sources && input.sources.length > 0) {\n const deduped = [...new Set(input.sources)];\n return {\n sourceSelection: input.sourceSelection ?? \"auto\",\n resolved: deduped\n };\n }\n\n const selection = input.sourceSelection ?? \"auto\";\n if (selection === \"all\") {\n return { sourceSelection: selection, resolved: RESEARCH_ALL_SOURCES };\n }\n if (selection === \"auto\") {\n return { sourceSelection: selection, resolved: RESEARCH_AUTO_SOURCES };\n }\n return {\n sourceSelection: selection,\n resolved: [selection]\n };\n};\n\nconst toDedupeKey = (record: { url?: string; title?: string }): string => {\n const url = record.url ? canonicalizeUrl(record.url) : \"\";\n const title = (record.title ?? \"\").trim().toLowerCase();\n return `${url}::${title}`;\n};\n\nconst dedupeResearchRecords = (records: ResearchRecord[]): ResearchRecord[] => {\n const deduped = new Map<string, ResearchRecord>();\n for (const record of records) {\n const key = toDedupeKey(record);\n if (!deduped.has(key)) {\n deduped.set(key, record);\n continue;\n }\n\n const existing = deduped.get(key);\n if (!existing) continue;\n const existingScore = (existing.date_confidence.score * 2) + existing.confidence - existing.recency.age_hours * 0.001;\n const nextScore = (record.date_confidence.score * 2) + record.confidence - record.recency.age_hours * 0.001;\n if (nextScore > existingScore) {\n deduped.set(key, record);\n }\n }\n return [...deduped.values()];\n};\n\nconst rankResearchRecords = (records: ResearchRecord[]): ResearchRecord[] => {\n return [...records].sort((left, right) => {\n if (left.recency.within_timebox !== right.recency.within_timebox) {\n return left.recency.within_timebox ? -1 : 1;\n }\n if (left.date_confidence.score !== right.date_confidence.score) {\n return right.date_confidence.score - left.date_confidence.score;\n }\n if (left.recency.age_hours !== right.recency.age_hours) {\n return left.recency.age_hours - right.recency.age_hours;\n }\n if (left.confidence !== right.confidence) {\n return right.confidence - left.confidence;\n }\n return left.id.localeCompare(right.id);\n });\n};\n\nconst hash = (value: string): string => createHash(\"sha1\").update(value).digest(\"hex\").slice(0, 16);\n\nconst asNumber = (value: unknown): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value.replace(/,/g, \"\"));\n if (Number.isFinite(parsed)) return parsed;\n }\n return 0;\n};\n\nconst parsePriceFromContent = (content: string | undefined): { amount: number; currency: string } => {\n if (!content) return { amount: 0, currency: \"USD\" };\n const match = content.match(/([$€£])\\s*([0-9]{1,3}(?:[.,][0-9]{3})*(?:[.,][0-9]{1,2})?)/);\n if (!match) return { amount: 0, currency: \"USD\" };\n const currency = match[1] === \"€\" ? \"EUR\" : match[1] === \"£\" ? \"GBP\" : \"USD\";\n const amount = Number((match[2] ?? \"0\").replace(/,/g, \"\"));\n return {\n amount: Number.isFinite(amount) ? amount : 0,\n currency\n };\n};\n\nconst availabilityRank = (availability: ShoppingOffer[\"availability\"]): number => {\n switch (availability) {\n case \"in_stock\":\n return 1;\n case \"limited\":\n return 0.75;\n case \"unknown\":\n return 0.45;\n case \"out_of_stock\":\n return 0.1;\n }\n};\n\nconst computeDealScore = (offer: ShoppingOffer, now: Date): number => {\n const total = Math.max(0, offer.price.amount + offer.shipping.amount);\n const priceScore = total > 0 ? 1 / (1 + total / 100) : 0.5;\n const availabilityScore = availabilityRank(offer.availability);\n const ratingScore = Math.max(0, Math.min(1, offer.rating / 5));\n const recencyHours = Math.max(0, (now.getTime() - new Date(offer.price.retrieved_at).getTime()) / (60 * 60 * 1000));\n const recencyScore = 1 / (1 + recencyHours / 24);\n const score = (priceScore * 0.55) + (availabilityScore * 0.2) + (ratingScore * 0.15) + (recencyScore * 0.1);\n return Number(score.toFixed(6));\n};\n\nconst resolveShoppingProviders = (providers?: string[]): string[] => {\n if (!providers || providers.length === 0) {\n return [...SHOPPING_PROVIDER_IDS];\n }\n\n const normalized = providers\n .map((provider) => provider.trim().toLowerCase())\n .filter(Boolean)\n .map((provider) => provider.startsWith(\"shopping/\") ? provider : `shopping/${provider}`);\n\n const deduped = [...new Set(normalized)].filter((provider) => SHOPPING_PROVIDER_IDS.includes(provider as (typeof SHOPPING_PROVIDER_IDS)[number]));\n if (deduped.length === 0) {\n throw new Error(\"No valid shopping providers were requested\");\n }\n return deduped;\n};\n\nconst enforceShoppingLegalReviewGate = (providerIds: string[], now: Date): void => {\n const blocked = providerIds\n .map((providerId) => ({ providerId, validation: validateShoppingLegalReviewChecklist(providerId, now) }))\n .filter((entry) => !entry.validation.valid);\n\n if (blocked.length === 0) return;\n const summary = blocked\n .map((entry) => `${entry.providerId}:${entry.validation.reasonCode ?? \"missing_checklist\"}`)\n .join(\", \");\n throw new Error(`Provider legal review checklist invalid or expired: ${summary}`);\n};\n\nconst resolveShoppingProviderIdForUrl = (url: string): string | null => {\n try {\n const host = new URL(url).hostname.toLowerCase();\n for (const profile of SHOPPING_PROVIDER_PROFILES) {\n if (profile.domains.some((domain) => host === domain || host.endsWith(`.${domain}`))) {\n return profile.id;\n }\n }\n return \"shopping/others\";\n } catch {\n return null;\n }\n};\n\nconst extractShoppingOffer = (record: NormalizedRecord, now: Date): ShoppingOffer => {\n const nested = (record.attributes.shopping_offer ?? {}) as Record<string, unknown>;\n const nestedPrice = (nested.price ?? {}) as Record<string, unknown>;\n const nestedShipping = (nested.shipping ?? {}) as Record<string, unknown>;\n\n const fallbackPrice = parsePriceFromContent(record.content);\n const priceAmount = asNumber(nestedPrice.amount) || fallbackPrice.amount;\n const priceCurrency = typeof nestedPrice.currency === \"string\" && nestedPrice.currency.trim()\n ? nestedPrice.currency\n : fallbackPrice.currency;\n const retrievedAt = typeof nestedPrice.retrieved_at === \"string\" && nestedPrice.retrieved_at.trim()\n ? nestedPrice.retrieved_at\n : now.toISOString();\n\n const title = (typeof nested.title === \"string\" && nested.title.trim())\n ? nested.title\n : record.title ?? record.url ?? record.provider;\n const url = (typeof nested.url === \"string\" && nested.url.trim())\n ? nested.url\n : record.url ?? \"\";\n\n const shippingAmount = asNumber(nestedShipping.amount);\n const shippingCurrency = typeof nestedShipping.currency === \"string\" && nestedShipping.currency.trim()\n ? nestedShipping.currency\n : priceCurrency;\n\n const availabilityRaw = typeof nested.availability === \"string\" ? nested.availability : \"unknown\";\n const availability: ShoppingOffer[\"availability\"] = availabilityRaw === \"in_stock\" || availabilityRaw === \"limited\" || availabilityRaw === \"out_of_stock\"\n ? availabilityRaw\n : \"unknown\";\n\n const offer: ShoppingOffer = {\n offer_id: `${record.provider}:${record.id}`,\n product_id: typeof nested.product_id === \"string\" && nested.product_id.trim()\n ? nested.product_id\n : hash(`${canonicalizeUrl(url)}::${title.toLowerCase()}`),\n provider: record.provider,\n url,\n title,\n price: {\n amount: priceAmount,\n currency: priceCurrency,\n retrieved_at: retrievedAt\n },\n shipping: {\n amount: shippingAmount,\n currency: shippingCurrency,\n notes: typeof nestedShipping.notes === \"string\" ? nestedShipping.notes : \"unknown\"\n },\n availability,\n rating: asNumber(nested.rating),\n reviews_count: asNumber(nested.reviews_count),\n deal_score: 0,\n attributes: {\n ...record.attributes,\n source_record_id: record.id\n }\n };\n\n offer.deal_score = computeDealScore(offer, now);\n return offer;\n};\n\nconst dedupeOffers = (offers: ShoppingOffer[]): ShoppingOffer[] => {\n const deduped = new Map<string, ShoppingOffer>();\n for (const offer of offers) {\n const key = `${canonicalizeUrl(offer.url)}::${offer.title.toLowerCase()}`;\n const existing = deduped.get(key);\n if (!existing || offer.deal_score > existing.deal_score) {\n deduped.set(key, offer);\n }\n }\n return [...deduped.values()];\n};\n\nconst rankOffers = (\n offers: ShoppingOffer[],\n sort: ShoppingRunInput[\"sort\"]\n): ShoppingOffer[] => {\n const ordered = [...offers];\n switch (sort) {\n case \"lowest_price\":\n return ordered.sort((left, right) => {\n const leftTotal = left.price.amount + left.shipping.amount;\n const rightTotal = right.price.amount + right.shipping.amount;\n return leftTotal - rightTotal;\n });\n case \"highest_rating\":\n return ordered.sort((left, right) => right.rating - left.rating || right.reviews_count - left.reviews_count);\n case \"fastest_shipping\":\n return ordered.sort((left, right) => left.shipping.amount - right.shipping.amount || right.deal_score - left.deal_score);\n case \"best_deal\":\n default:\n return ordered.sort((left, right) => right.deal_score - left.deal_score || (left.price.amount + left.shipping.amount) - (right.price.amount + right.shipping.amount));\n }\n};\n\nconst extractImageUrls = (record: NormalizedRecord): string[] => {\n const links = Array.isArray(record.attributes.links)\n ? record.attributes.links.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n\n const imageLinks = links.filter((link) => /\\.(?:png|jpg|jpeg|webp|gif)(?:[?#].*)?$/i.test(link));\n return [...new Set(imageLinks.map((link) => canonicalizeUrl(link)))].slice(0, 50);\n};\n\nconst fetchBinary = async (url: string): Promise<Buffer | null> => {\n try {\n const response = await fetch(url, {\n headers: {\n accept: \"image/*,*/*;q=0.8\",\n ...providerRequestHeaders\n },\n redirect: \"follow\"\n });\n if (!response.ok) return null;\n const bytes = await response.arrayBuffer();\n return Buffer.from(bytes);\n } catch {\n return null;\n }\n};\n\nconst deriveFeatureList = (content: string | undefined): string[] => {\n if (!content) return [];\n const candidates = content\n .split(/[\\n.]/)\n .map((line) => line.trim())\n .filter((line) => line.length >= 20)\n .filter((line) => /[a-z]/i.test(line));\n return [...new Set(candidates)].slice(0, 12);\n};\n\nconst resolveShoppingSourceForUrl = (url: string): ProviderSource => {\n try {\n const host = new URL(url).hostname.toLowerCase();\n const match = SHOPPING_PROVIDER_PROFILES.some((profile) => profile.domains.some((domain) => host === domain || host.endsWith(`.${domain}`)));\n return match ? \"shopping\" : \"web\";\n } catch {\n return \"web\";\n }\n};\n\nexport const runResearchWorkflow = async (\n runtime: ProviderExecutor,\n input: ResearchRunInput\n): Promise<Record<string, unknown>> => {\n const topic = input.topic?.trim();\n if (!topic) {\n throw new Error(\"topic is required\");\n }\n\n const { sourceSelection, resolved } = resolveResearchSources(input);\n const now = new Date();\n const timebox = resolveTimebox({\n days: input.days,\n from: input.from,\n to: input.to,\n now\n });\n if (resolved.includes(\"shopping\")) {\n enforceShoppingLegalReviewGate(SHOPPING_PROVIDER_IDS, now);\n }\n const excludedProviders = resolveAutoExcludedProviders(sourceSelection, resolved);\n const excludedProviderSet = new Set(excludedProviders);\n\n const runs = await Promise.all(resolved.map(async (source) => {\n const result = await runtime.search({\n query: topic,\n limit: input.limitPerSource ?? 10,\n filters: {\n include_engagement: input.includeEngagement ?? false,\n timebox_from: timebox.from,\n timebox_to: timebox.to\n }\n }, withCookieOverrides({\n source\n }, input));\n trackProviderSignals(result);\n return {\n source,\n result\n };\n }));\n\n const mergedRecords = removeExcludedProviders(\n runs.flatMap((run) => run.result.records),\n excludedProviderSet\n );\n const mergedFailures = removeExcludedProviders(\n runs.flatMap((run) => run.result.failures),\n excludedProviderSet\n );\n const reasonCodeDistribution = summarizeReasonCodeDistribution(mergedFailures);\n const transcriptStrategyFailures = summarizeTranscriptStrategyFailures(mergedFailures);\n const evaluationNow = new Date();\n const withinTimebox = filterByTimebox(mergedRecords, timebox, evaluationNow);\n const enriched = enrichResearchRecords(withinTimebox, timebox, evaluationNow);\n const deduped = dedupeResearchRecords(enriched);\n const ranked = rankResearchRecords(deduped);\n const cookieDiagnostics = summarizeCookieDiagnostics(mergedFailures, mergedRecords);\n const transcriptStrategyDetailDistribution = summarizeTranscriptStrategyDetailDistribution(ranked);\n const transcriptDurability = summarizeTranscriptDurability(ranked, mergedFailures);\n const antiBotPressure = summarizeAntiBotPressure(mergedFailures);\n const resolvedTimebox = timebox.mode === \"days\"\n ? {\n ...timebox,\n to: new Date(Math.max(new Date(timebox.to).getTime(), evaluationNow.getTime())).toISOString()\n }\n : timebox;\n\n const meta = {\n timebox: resolvedTimebox,\n selection: withExcludedProviders({\n source_selection: sourceSelection,\n resolved_sources: resolved\n }, excludedProviders),\n metrics: {\n total_records: mergedRecords.length,\n within_timebox: withinTimebox.length,\n final_records: ranked.length,\n failed_sources: runs.filter((run) => !run.result.ok).map((run) => run.source),\n reason_code_distribution: reasonCodeDistribution,\n reasonCodeDistribution,\n transcript_strategy_failures: transcriptStrategyFailures,\n transcriptStrategyFailures,\n transcript_strategy_detail_failures: transcriptStrategyFailures,\n transcriptStrategyDetailFailures: transcriptStrategyFailures,\n transcript_strategy_detail_distribution: transcriptStrategyDetailDistribution,\n transcriptStrategyDetailDistribution,\n transcript_durability: transcriptDurability,\n transcriptDurability,\n cookie_diagnostics: cookieDiagnostics,\n cookieDiagnostics,\n anti_bot_pressure: antiBotPressure,\n antiBotPressure\n },\n failures: mergedFailures,\n alerts: buildAlerts()\n } as Record<string, unknown>;\n\n const rendered = renderResearch({\n mode: input.mode,\n topic,\n records: ranked,\n meta\n });\n\n const bundle = await createArtifactBundle({\n namespace: \"research\",\n outputDir: input.outputDir,\n ttlHours: input.ttlHours,\n files: rendered.files\n });\n\n if (input.mode === \"path\") {\n return {\n ...rendered.response,\n path: bundle.basePath,\n records: ranked,\n meta: {\n ...meta,\n artifact_manifest: bundle.manifest\n }\n };\n }\n\n return {\n ...rendered.response,\n artifact_path: bundle.basePath,\n records: ranked,\n meta: {\n ...meta,\n artifact_manifest: bundle.manifest\n }\n };\n};\n\nexport const runShoppingWorkflow = async (\n runtime: ProviderExecutor,\n input: ShoppingRunInput\n): Promise<Record<string, unknown>> => {\n const query = input.query?.trim();\n if (!query) {\n throw new Error(\"query is required\");\n }\n\n const providerIds = resolveShoppingProviders(input.providers);\n const hasExplicitProviderSelection = Boolean(input.providers && input.providers.length > 0);\n const degradedProviders = getDegradedProviders();\n const autoExcludedProviders = hasExplicitProviderSelection\n ? []\n : providerIds.filter((providerId) => degradedProviders.has(providerId));\n const effectiveProviderIds = hasExplicitProviderSelection\n ? providerIds\n : providerIds.filter((providerId) => !degradedProviders.has(providerId));\n const now = new Date();\n if (effectiveProviderIds.length === 0) {\n throw new Error(\"All default shopping providers are temporarily excluded due to degraded anti-bot/rate-limit state\");\n }\n enforceShoppingLegalReviewGate(effectiveProviderIds, now);\n\n const runs = await Promise.all(effectiveProviderIds.map(async (providerId) => {\n const result = await runtime.search({\n query,\n limit: 8,\n filters: {\n ...(typeof input.budget === \"number\" ? { budget: input.budget } : {}),\n ...(input.region ? { region: input.region } : {})\n }\n }, withCookieOverrides({\n source: \"shopping\",\n providerIds: [providerId],\n ...(typeof input.timeoutMs === \"number\" ? { timeoutMs: input.timeoutMs } : {})\n }, input));\n trackProviderSignals(result);\n return {\n providerId,\n result\n };\n }));\n\n const offers = rankOffers(\n dedupeOffers(\n runs\n .flatMap((run) => run.result.records)\n .map((record) => extractShoppingOffer(record, now))\n ),\n input.sort ?? \"best_deal\"\n );\n\n const failures = runs.flatMap((run) => run.result.failures);\n const records = runs.flatMap((run) => run.result.records);\n const reasonCodeDistribution = summarizeReasonCodeDistribution(failures);\n const transcriptStrategyFailures = summarizeTranscriptStrategyFailures(failures);\n const transcriptStrategyDetailDistribution = summarizeTranscriptStrategyDetailDistribution(records);\n const transcriptDurability = summarizeTranscriptDurability(records, failures);\n const cookieDiagnostics = summarizeCookieDiagnostics(failures, records);\n const antiBotPressure = summarizeAntiBotPressure(failures);\n const meta = {\n selection: {\n providers: effectiveProviderIds,\n ...(autoExcludedProviders.length > 0 ? { excluded_providers: autoExcludedProviders } : {})\n },\n metrics: {\n total_offers: offers.length,\n failed_providers: failures.map((entry) => entry.provider),\n reason_code_distribution: reasonCodeDistribution,\n reasonCodeDistribution,\n transcript_strategy_failures: transcriptStrategyFailures,\n transcriptStrategyFailures,\n transcript_strategy_detail_failures: transcriptStrategyFailures,\n transcriptStrategyDetailFailures: transcriptStrategyFailures,\n transcript_strategy_detail_distribution: transcriptStrategyDetailDistribution,\n transcriptStrategyDetailDistribution,\n transcript_durability: transcriptDurability,\n transcriptDurability,\n cookie_diagnostics: cookieDiagnostics,\n cookieDiagnostics,\n anti_bot_pressure: antiBotPressure,\n antiBotPressure\n },\n failures,\n alerts: buildAlerts()\n } as Record<string, unknown>;\n\n const rendered = renderShopping({\n mode: input.mode,\n query,\n offers,\n meta\n });\n\n const bundle = await createArtifactBundle({\n namespace: \"shopping\",\n outputDir: input.outputDir,\n ttlHours: input.ttlHours,\n files: rendered.files\n });\n\n if (input.mode === \"path\") {\n return {\n ...rendered.response,\n path: bundle.basePath,\n offers,\n meta: {\n ...meta,\n artifact_manifest: bundle.manifest\n }\n };\n }\n\n return {\n ...rendered.response,\n offers,\n artifact_path: bundle.basePath,\n meta: {\n ...meta,\n artifact_manifest: bundle.manifest\n }\n };\n};\n\nexport const runProductVideoWorkflow = async (\n runtime: ProviderExecutor,\n input: ProductVideoRunInput,\n options: ProductVideoWorkflowOptions = {}\n): Promise<Record<string, unknown>> => {\n const includeScreenshots = input.include_screenshots ?? true;\n const includeAllImages = input.include_all_images ?? true;\n const includeCopy = input.include_copy ?? true;\n\n const candidateUrl = input.product_url?.trim();\n const candidateName = input.product_name?.trim();\n\n if (!candidateUrl && !candidateName) {\n throw new Error(\"product_url or product_name is required\");\n }\n\n let productUrl = candidateUrl;\n let providerHint = input.provider_hint?.trim();\n\n if (!productUrl && candidateName) {\n const shoppingResult = await runShoppingWorkflow(runtime, {\n query: candidateName,\n providers: providerHint ? [providerHint] : undefined,\n mode: \"json\",\n useCookies: input.useCookies,\n cookiePolicyOverride: input.cookiePolicyOverride\n });\n\n const offers = Array.isArray(shoppingResult.offers)\n ? shoppingResult.offers as ShoppingOffer[]\n : [];\n if (offers.length === 0) {\n throw new Error(\"Unable to resolve product URL from product_name\");\n }\n productUrl = offers[0]?.url;\n providerHint = offers[0]?.provider;\n }\n\n if (!productUrl) {\n throw new Error(\"Unable to resolve product URL\");\n }\n\n const source = resolveShoppingSourceForUrl(productUrl);\n const shoppingProviderId = source === \"shopping\"\n ? (\n providerHint\n ? (providerHint.startsWith(\"shopping/\") ? providerHint : `shopping/${providerHint}`)\n : resolveShoppingProviderIdForUrl(productUrl)\n )\n : null;\n if (shoppingProviderId) {\n enforceShoppingLegalReviewGate([shoppingProviderId], new Date());\n }\n const details = await runtime.fetch(\n { url: productUrl },\n withCookieOverrides({\n source,\n providerIds: shoppingProviderId ? [shoppingProviderId] : undefined\n }, input)\n );\n trackProviderSignals(details);\n\n if (!details.ok || details.records.length === 0) {\n const reason = details.error?.message ?? \"Product details unavailable\";\n throw new Error(reason);\n }\n\n const primary = details.records[0] as NormalizedRecord;\n const primaryOffer = extractShoppingOffer(primary, new Date());\n\n const featureList = deriveFeatureList(primary.content);\n const imageUrls = extractImageUrls(primary);\n const selectedImageUrls = includeAllImages ? imageUrls : imageUrls.slice(0, 1);\n\n const files: ArtifactFile[] = [];\n const imagePaths: string[] = [];\n for (let index = 0; index < selectedImageUrls.length; index += 1) {\n const imageUrl = selectedImageUrls[index];\n if (!imageUrl) continue;\n const imageContent = await fetchBinary(imageUrl);\n if (!imageContent) continue;\n const extension = imageUrl.match(/\\.(png|jpg|jpeg|webp|gif)(?:[?#].*)?$/i)?.[1]?.toLowerCase() ?? \"jpg\";\n const relativePath = `images/image-${String(index + 1).padStart(2, \"0\")}.${extension}`;\n files.push({ path: relativePath, content: imageContent });\n imagePaths.push(relativePath);\n }\n\n const screenshotPaths: string[] = [];\n if (includeScreenshots) {\n const screenshotBuffer = options.captureScreenshot ? await options.captureScreenshot(productUrl) : null;\n if (screenshotBuffer) {\n const screenshotPath = \"screenshots/screenshot-01.png\";\n files.push({ path: screenshotPath, content: screenshotBuffer });\n screenshotPaths.push(screenshotPath);\n } else if (imagePaths[0]) {\n const firstImage = files.find((entry) => entry.path === imagePaths[0]);\n if (firstImage) {\n const fallbackPath = \"screenshots/screenshot-01.png\";\n files.push({ path: fallbackPath, content: firstImage.content });\n screenshotPaths.push(fallbackPath);\n }\n }\n }\n\n const copyText = includeCopy ? toSnippet(primary.content ?? \"\", 8000) : \"\";\n const pricing = {\n amount: primaryOffer.price.amount,\n currency: primaryOffer.price.currency,\n retrieved_at: primaryOffer.price.retrieved_at\n };\n\n const productPayload = {\n title: primary.title ?? primaryOffer.title,\n brand: typeof primary.attributes.brand === \"string\" ? primary.attributes.brand : \"unknown\",\n provider: providerHint ?? primary.provider,\n url: productUrl,\n features: featureList,\n copy: copyText\n };\n\n const manifestPayload = {\n run_id: hash(`${productUrl}:${Date.now()}`),\n created_at: new Date().toISOString(),\n source_url: productUrl,\n provider: providerHint ?? primary.provider,\n product: {\n title: productPayload.title,\n brand: productPayload.brand,\n price: pricing,\n features: featureList,\n copy: copyText\n },\n assets: {\n images: imagePaths,\n screenshots: screenshotPaths,\n raw: [\"raw/source-record.json\"]\n }\n };\n\n files.push(\n { path: \"manifest.json\", content: manifestPayload },\n { path: \"product.json\", content: productPayload },\n { path: \"pricing.json\", content: pricing },\n { path: \"copy.md\", content: copyText || \"\" },\n { path: \"features.md\", content: featureList.map((feature) => `- ${feature}`).join(\"\\n\") },\n {\n path: \"raw/source-record.json\",\n content: redactRawCapture(JSON.parse(JSON.stringify(primary)) as Record<string, unknown>)\n }\n );\n\n const bundle = await createArtifactBundle({\n namespace: \"product-assets\",\n outputDir: input.output_dir,\n ttlHours: input.ttl_hours,\n files,\n manifestFileName: \"bundle-manifest.json\"\n });\n\n const reasonCodeDistribution = summarizeReasonCodeDistribution(details.failures);\n const transcriptStrategyFailures = summarizeTranscriptStrategyFailures(details.failures);\n const transcriptStrategyDetailDistribution = summarizeTranscriptStrategyDetailDistribution(details.records);\n const transcriptDurability = summarizeTranscriptDurability(details.records, details.failures);\n const cookieDiagnostics = summarizeCookieDiagnostics(details.failures, details.records);\n const antiBotPressure = summarizeAntiBotPressure(details.failures);\n\n return {\n path: bundle.basePath,\n manifest: manifestPayload,\n product: productPayload,\n pricing,\n screenshots: screenshotPaths,\n images: imagePaths,\n meta: {\n alerts: buildAlerts(),\n failures: details.failures,\n reason_code_distribution: reasonCodeDistribution,\n reasonCodeDistribution,\n transcript_strategy_failures: transcriptStrategyFailures,\n transcriptStrategyFailures,\n transcript_strategy_detail_failures: transcriptStrategyFailures,\n transcriptStrategyDetailFailures: transcriptStrategyFailures,\n transcript_strategy_detail_distribution: transcriptStrategyDetailDistribution,\n transcriptStrategyDetailDistribution,\n transcript_durability: transcriptDurability,\n transcriptDurability,\n cookie_diagnostics: cookieDiagnostics,\n cookieDiagnostics,\n anti_bot_pressure: antiBotPressure,\n antiBotPressure,\n artifact_manifest: bundle.manifest\n }\n };\n};\n","import {\n ProviderRuntimeError,\n normalizeProviderReasonCode,\n providerErrorCodeFromReasonCode,\n toProviderError\n} from \"./errors\";\nimport { createExecutionMetadata, normalizeFailure, normalizeSuccess, createTraceContext } from \"./normalize\";\nimport { selectProviders } from \"./policy\";\nimport { ProviderRegistry } from \"./registry\";\nimport { AdaptiveConcurrencyController } from \"./adaptive-concurrency\";\nimport { applyPromptGuard } from \"./safety/prompt-guard\";\nimport { fallbackTierMetadata, selectTierRoute, shouldFallbackToTierA } from \"./tier-router\";\nimport { createLogger } from \"../core/logging\";\nimport {\n AntiBotPolicyEngine,\n type AntiBotPolicyConfig\n} from \"./shared/anti-bot-policy\";\nimport { createCommunityProvider, type CommunityProviderOptions } from \"./community\";\nimport {\n createSocialProviders,\n withDefaultYouTubeOptions,\n type SocialPlatform,\n type SocialProviderOptions,\n type SocialProvidersOptions\n} from \"./social\";\nimport { createShoppingProviders, type ShoppingProvidersOptions } from \"./shopping\";\nimport { providerRequestHeaders } from \"./shared/request-headers\";\nimport { isLikelyDocumentUrl } from \"./shared/traversal-url\";\nimport { createWebProvider, type WebProviderOptions } from \"./web\";\nimport { classifyBlockerSignal } from \"./blocker\";\nimport { canonicalizeUrl } from \"./web/crawler\";\nimport { extractStructuredContent, toSnippet } from \"./web/extract\";\nimport type {\n AdaptiveConcurrencyDiagnostics,\n BrowserFallbackPort,\n BlockerSignalV1,\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderAggregateResult,\n ProviderCallResultByOperation,\n ProviderCookiePolicy,\n ProviderCookieSourceConfig,\n ProviderContext,\n ProviderExecutionMetadata,\n ProviderErrorCode,\n ProviderOperation,\n ProviderOperationResult,\n ProviderReasonCode,\n ProviderRunOptions,\n ProviderRuntimeBudgets,\n ProviderRuntimeDiagnostics,\n ProviderSelection,\n ProviderSource,\n ProviderTierMetadata,\n TraceContext\n} from \"./types\";\n\nclass Semaphore {\n private active = 0;\n private readonly queue: Array<() => void> = [];\n\n constructor(private limit: number) {}\n\n setLimit(limit: number): void {\n this.limit = Math.max(1, Math.floor(limit));\n this.drain();\n }\n\n snapshot(): { limit: number; active: number; queued: number } {\n return {\n limit: this.limit,\n active: this.active,\n queued: this.queue.length\n };\n }\n\n async use<T>(task: () => Promise<T>): Promise<T> {\n await this.acquire();\n try {\n return await task();\n } finally {\n this.release();\n }\n }\n\n private async acquire(): Promise<void> {\n if (this.limit <= 0) return;\n if (this.active < this.limit) {\n this.active += 1;\n return;\n }\n\n await new Promise<void>((resolve) => {\n this.queue.push(() => {\n this.active += 1;\n resolve();\n });\n });\n }\n\n private release(): void {\n if (this.limit <= 0) return;\n this.active = Math.max(0, this.active - 1);\n this.drain();\n }\n\n private drain(): void {\n if (this.limit <= 0) return;\n while (this.active < this.limit) {\n const next = this.queue.shift();\n if (!next) return;\n next();\n }\n }\n}\n\nexport const DEFAULT_PROVIDER_BUDGETS: ProviderRuntimeBudgets = {\n timeoutMs: {\n search: 12000,\n fetch: 12000,\n crawl: 20000,\n post: 15000\n },\n retries: {\n read: 1,\n write: 0\n },\n concurrency: {\n global: 4,\n perProvider: 2,\n perDomain: 2\n },\n circuitBreaker: {\n failureThreshold: 3,\n cooldownMs: 30000\n }\n};\n\nconst isReadOperation = (operation: ProviderOperation): boolean => operation !== \"post\";\n\ntype RuntimeTierConfig = {\n defaultTier: \"A\" | \"B\" | \"C\";\n enableHybrid: boolean;\n enableRestrictedSafe: boolean;\n hybridRiskThreshold: number;\n restrictedSafeRecoveryIntervalMs: number;\n};\n\nconst DEFAULT_TIER_CONFIG = {\n defaultTier: \"A\",\n enableHybrid: false,\n enableRestrictedSafe: false,\n hybridRiskThreshold: 0.6,\n restrictedSafeRecoveryIntervalMs: 60000\n} satisfies RuntimeTierConfig;\n\nconst PLACEHOLDER_PATTERNS: Array<{ code: string; regex: RegExp }> = [\n { code: \"placeholder_local_url\", regex: /https?:\\/\\/(?:placeholder|synthetic|example)\\.local(?:\\/|$)/i },\n { code: \"placeholder_token\", regex: /\\b(?:todo|placeholder|lorem ipsum)\\b/i },\n { code: \"echo_input\", regex: /\\b(?:seed url|query):\\s*[\"'`].{1,120}[\"'`]/i }\n];\n\nconst RUNTIME_FETCH_HEADERS = {\n accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n ...providerRequestHeaders\n} as const;\n\nconst SOCIAL_SEARCH_ENDPOINTS: Record<SocialPlatform, (query: string, page: number) => string> = {\n x: (query, page) => `https://x.com/search?q=${encodeURIComponent(query)}&f=live&page=${page}`,\n reddit: (query, page) => `https://www.reddit.com/search/?q=${encodeURIComponent(query)}&sort=relevance&t=all&page=${page}`,\n bluesky: (query, page) => `https://bsky.app/search?q=${encodeURIComponent(query)}&page=${page}`,\n facebook: (query, page) => `https://www.facebook.com/search/top?q=${encodeURIComponent(query)}&page=${page}`,\n linkedin: (query, page) => `https://www.linkedin.com/search/results/content/?keywords=${encodeURIComponent(query)}&page=${page}`,\n instagram: (query, page) => `https://www.instagram.com/explore/search/keyword/?q=${encodeURIComponent(query)}&page=${page}`,\n tiktok: (query, page) => `https://www.tiktok.com/search?q=${encodeURIComponent(query)}&page=${page}`,\n threads: (query, page) => `https://www.threads.net/search?q=${encodeURIComponent(query)}&page=${page}`,\n youtube: (query, page) => `https://www.youtube.com/results?search_query=${encodeURIComponent(query)}&page=${page}`\n};\n\ntype RuntimeFetchSource = ProviderSource;\n\ntype RuntimeFetchedDocument = {\n url: string;\n status: number;\n html: string;\n text: string;\n links: string[];\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst toPositiveInt = (value: unknown, fallback: number): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(1, Math.floor(value));\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return Math.max(1, Math.floor(parsed));\n }\n }\n return fallback;\n};\n\nconst clampBlockerThreshold = (value: number | undefined): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 0.7;\n if (value < 0) return 0;\n if (value > 1) return 1;\n return value;\n};\n\nconst stripUrls = (value: string): string => {\n return value.replace(/https?:\\/\\/[^\\s]+/gi, \" \").replace(/\\s+/g, \" \").trim();\n};\n\nconst normalizeHttpLink = (candidate: string, baseUrl: string): string | null => {\n try {\n const resolved = new URL(candidate, baseUrl).toString();\n if (!isHttpUrl(resolved)) return null;\n return canonicalizeUrl(resolved);\n } catch {\n return null;\n }\n};\n\nconst dedupeLinks = (links: string[], baseUrl: string, limit: number): string[] => {\n const seen = new Set<string>();\n const deduped: string[] = [];\n for (const candidate of links) {\n const normalized = normalizeHttpLink(candidate, baseUrl);\n if (!normalized || !isLikelyDocumentUrl(normalized) || seen.has(normalized)) continue;\n seen.add(normalized);\n deduped.push(normalized);\n if (deduped.length >= limit) break;\n }\n return deduped;\n};\n\nconst RUNTIME_FALLBACK_ERROR_CODES = new Set<ProviderErrorCode>([\n \"auth\",\n \"rate_limited\",\n \"timeout\",\n \"network\",\n \"upstream\",\n \"unavailable\"\n]);\n\nconst fallbackReasonCodeForError = (error: {\n code: ProviderErrorCode;\n message: string;\n details?: Record<string, JsonValue>;\n reasonCode?: ProviderReasonCode;\n}): ProviderReasonCode | undefined => {\n if (error.reasonCode) return error.reasonCode;\n const normalized = normalizeProviderReasonCode({\n code: error.code,\n message: error.message,\n details: error.details\n });\n if (normalized) return normalized;\n // auth/rate_limited normalize directly from the provider error code above.\n if (error.code === \"upstream\") return \"ip_blocked\";\n if (error.code === \"timeout\" || error.code === \"network\" || error.code === \"unavailable\") return \"env_limited\";\n return undefined;\n};\n\nconst readFallbackString = (output: Record<string, JsonValue> | undefined, key: \"html\" | \"url\"): string | undefined => {\n const value = output?.[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n};\n\nconst fetchRuntimeDocument = async (args: {\n url: string;\n provider: string;\n source: RuntimeFetchSource;\n signal?: AbortSignal;\n}): Promise<RuntimeFetchedDocument> => {\n if (!isHttpUrl(args.url)) {\n throw new ProviderRuntimeError(\"invalid_input\", \"Retrieval URL must be an HTTP(S) URL\", {\n provider: args.provider,\n source: args.source,\n retryable: false,\n details: { url: args.url }\n });\n }\n\n let response: Response;\n try {\n response = await fetch(args.url, {\n headers: RUNTIME_FETCH_HEADERS,\n redirect: \"follow\",\n signal: args.signal\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.toLowerCase().includes(\"abort\")) {\n throw new ProviderRuntimeError(\"timeout\", `Timed out retrieving ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: true,\n cause: error\n });\n }\n throw new ProviderRuntimeError(\"network\", `Failed to retrieve ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: true,\n cause: error\n });\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new ProviderRuntimeError(\"auth\", `Authentication required for ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: false\n });\n }\n if (response.status === 429) {\n throw new ProviderRuntimeError(\"rate_limited\", `Rate limited while retrieving ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: true\n });\n }\n if (response.status >= 500) {\n throw new ProviderRuntimeError(\"upstream\", `Upstream failed while retrieving ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: true\n });\n }\n if (response.status >= 400) {\n throw new ProviderRuntimeError(\"unavailable\", `Retrieval failed for ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: false\n });\n }\n\n const resolvedUrl = canonicalizeUrl(response.url || args.url);\n const html = await response.text();\n const extracted = extractStructuredContent(html, resolvedUrl);\n return {\n url: resolvedUrl,\n status: response.status,\n html,\n text: extracted.text,\n links: extracted.links\n };\n};\n\nconst fetchRuntimeDocumentWithFallback = async (args: {\n url: string;\n provider: string;\n source: RuntimeFetchSource;\n operation: \"search\" | \"fetch\";\n signal?: AbortSignal;\n context?: ProviderContext;\n browserFallbackPort?: BrowserFallbackPort;\n}): Promise<RuntimeFetchedDocument> => {\n try {\n return await fetchRuntimeDocument({\n url: args.url,\n provider: args.provider,\n source: args.source,\n signal: args.signal\n });\n } catch (error) {\n const normalized = toProviderError(error, {\n provider: args.provider,\n source: args.source\n });\n const fallbackPort = args.context?.browserFallbackPort ?? args.browserFallbackPort;\n if (!fallbackPort) {\n throw error;\n }\n if (!RUNTIME_FALLBACK_ERROR_CODES.has(normalized.code)) {\n throw error;\n }\n const reasonCode = fallbackReasonCodeForError(normalized) ?? \"env_limited\";\n\n const fallback = await fallbackPort.resolve({\n provider: args.provider,\n source: args.source,\n operation: args.operation,\n reasonCode,\n trace: args.context?.trace ?? {\n requestId: `runtime-fallback-${Date.now()}`,\n provider: args.provider,\n ts: new Date().toISOString()\n },\n url: args.url,\n details: {\n errorCode: normalized.code,\n message: normalized.message,\n ...(normalized.details ?? {})\n },\n ...(typeof args.context?.useCookies === \"boolean\" ? { useCookies: args.context.useCookies } : {}),\n ...(args.context?.cookiePolicyOverride ? { cookiePolicyOverride: args.context.cookiePolicyOverride } : {})\n });\n if (!fallback.ok) {\n throw error;\n }\n\n const resolvedUrl = canonicalizeUrl(readFallbackString(fallback.output, \"url\") ?? args.url);\n const html = readFallbackString(fallback.output, \"html\") ?? \"\";\n const extracted = extractStructuredContent(html, resolvedUrl);\n return {\n url: resolvedUrl,\n status: 200,\n html,\n text: extracted.text,\n links: extracted.links\n };\n }\n};\n\nexport interface RuntimeInit {\n budgets?: Partial<ProviderRuntimeBudgets>;\n providers?: ProviderAdapter[];\n tiers?: Partial<RuntimeTierConfig>;\n adaptiveConcurrency?: {\n enabled?: boolean;\n maxGlobal?: number;\n maxPerDomain?: number;\n };\n blockerDetectionThreshold?: number;\n promptInjectionGuard?: {\n enabled?: boolean;\n };\n antiBotPolicy?: Partial<AntiBotPolicyConfig>;\n transcript?: {\n modeDefault?: \"auto\" | \"web\" | \"no-auto\" | \"yt-dlp\" | \"apify\";\n strategyOrder?: Array<\n \"youtubei\"\n | \"native_caption_parse\"\n | \"ytdlp_audio_asr\"\n | \"apify\"\n | \"ytdlp_subtitle\"\n | \"optional_asr\"\n >;\n enableYtdlp?: boolean;\n enableAsr?: boolean;\n enableYtdlpAudioAsr?: boolean;\n enableApify?: boolean;\n apifyActorId?: string;\n enableBrowserFallback?: boolean;\n ytdlpTimeoutMs?: number;\n };\n cookies?: {\n policy?: ProviderCookiePolicy;\n source?: ProviderCookieSourceConfig;\n };\n browserFallbackPort?: BrowserFallbackPort;\n}\n\nexport interface RuntimeDefaults {\n web?: WebProviderOptions;\n community?: CommunityProviderOptions;\n social?: SocialProvidersOptions;\n shopping?: ShoppingProvidersOptions;\n}\n\nexport class ProviderRuntime {\n readonly registry: ProviderRegistry;\n private readonly logger = createLogger(\"provider-runtime\");\n private budgets: ProviderRuntimeBudgets;\n private globalSemaphore: Semaphore;\n private readonly scopedSemaphores = new Map<string, Semaphore>();\n private readonly tierConfig: RuntimeTierConfig;\n private readonly promptGuardEnabled: boolean;\n private readonly blockerDetectionThreshold: number;\n private readonly antiBotPolicy: AntiBotPolicyEngine;\n private readonly adaptiveConfig: Required<NonNullable<RuntimeInit[\"adaptiveConcurrency\"]>>;\n private adaptiveConcurrency: AdaptiveConcurrencyController;\n private readonly browserFallbackPort?: BrowserFallbackPort;\n\n constructor(init: RuntimeInit = {}) {\n this.registry = new ProviderRegistry();\n this.budgets = mergeBudgets(DEFAULT_PROVIDER_BUDGETS, init.budgets);\n this.globalSemaphore = new Semaphore(this.budgets.concurrency.global);\n this.tierConfig = {\n ...DEFAULT_TIER_CONFIG,\n ...(init.tiers ?? {})\n };\n this.promptGuardEnabled = init.promptInjectionGuard?.enabled ?? true;\n this.blockerDetectionThreshold = clampBlockerThreshold(init.blockerDetectionThreshold);\n this.antiBotPolicy = new AntiBotPolicyEngine(init.antiBotPolicy);\n this.browserFallbackPort = init.browserFallbackPort;\n this.adaptiveConfig = {\n enabled: init.adaptiveConcurrency?.enabled ?? false,\n maxGlobal: Math.max(this.budgets.concurrency.global, init.adaptiveConcurrency?.maxGlobal ?? this.budgets.concurrency.global),\n maxPerDomain: Math.max(\n this.budgets.concurrency.perDomain ?? this.budgets.concurrency.perProvider,\n init.adaptiveConcurrency?.maxPerDomain ?? (this.budgets.concurrency.perDomain ?? this.budgets.concurrency.perProvider)\n )\n };\n this.adaptiveConcurrency = this.createAdaptiveConcurrencyController();\n\n for (const provider of init.providers ?? []) {\n this.register(provider);\n }\n }\n\n register(provider: ProviderAdapter): void {\n this.registry.register(provider);\n this.scopedSemaphores.set(provider.id, new Semaphore(this.budgets.concurrency.perProvider));\n }\n\n listProviders(): ProviderAdapter[] {\n return this.registry.list();\n }\n\n listCapabilities() {\n return this.registry.capabilities();\n }\n\n getHealth(providerId: string) {\n return this.registry.getHealth(providerId);\n }\n\n updateBudgets(partial: Partial<ProviderRuntimeBudgets>): ProviderRuntimeBudgets {\n this.budgets = mergeBudgets(this.budgets, partial);\n this.globalSemaphore = new Semaphore(this.budgets.concurrency.global);\n this.scopedSemaphores.clear();\n for (const provider of this.registry.list()) {\n this.scopedSemaphores.set(provider.id, new Semaphore(this.budgets.concurrency.perProvider));\n }\n this.adaptiveConcurrency = this.createAdaptiveConcurrencyController();\n return this.budgets;\n }\n\n getBudgets(): ProviderRuntimeBudgets {\n return this.budgets;\n }\n\n async search(input: ProviderCallResultByOperation[\"search\"], options: ProviderRunOptions = {}): Promise<ProviderAggregateResult> {\n return this.execute(\"search\", input, options);\n }\n\n async fetch(input: ProviderCallResultByOperation[\"fetch\"], options: ProviderRunOptions = {}): Promise<ProviderAggregateResult> {\n return this.execute(\"fetch\", input, options);\n }\n\n async crawl(input: ProviderCallResultByOperation[\"crawl\"], options: ProviderRunOptions = {}): Promise<ProviderAggregateResult> {\n return this.execute(\"crawl\", input, options);\n }\n\n async post(input: ProviderCallResultByOperation[\"post\"], options: ProviderRunOptions = {}): Promise<ProviderAggregateResult> {\n return this.execute(\"post\", input, options);\n }\n\n async execute<Operation extends ProviderOperation>(\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n options: ProviderRunOptions = {}\n ): Promise<ProviderAggregateResult> {\n const startedAt = Date.now();\n const selection = options.source ?? \"auto\";\n const trace = createTraceContext(options.trace);\n\n const selectedProviders = selectProviders(this.registry, operation, selection)\n .filter((provider) => (options.providerIds?.length ?? 0) === 0 || options.providerIds?.includes(provider.id));\n const challengePressure = options.tier?.challengePressure ?? this.calculateChallengePressure(selectedProviders);\n const tierRoute = selectTierRoute(this.tierConfig, {\n hybridEligible: this.isHybridEligible(selectedProviders),\n preferredTier: options.tier?.preferred,\n forceRestrictedSafe: options.tier?.forceRestrictedSafe,\n challengePressure,\n highFrictionTarget: options.tier?.highFrictionTarget,\n riskScore: options.tier?.riskScore ?? this.calculateRiskScore(selectedProviders, challengePressure),\n hybridHealthy: options.tier?.hybridHealthy ?? this.isHybridHealthy(selectedProviders),\n policyRestrictedSafe: options.tier?.policyRestrictedSafe ?? false,\n latencyBudgetExceeded: options.tier?.latencyBudgetExceeded ?? this.isLatencyBudgetExceeded(selectedProviders, operation),\n errorBudgetExceeded: options.tier?.errorBudgetExceeded ?? this.isErrorBudgetExceeded(selectedProviders),\n recoveryStableForMs: options.tier?.recoveryStableForMs,\n policyAllowsRecovery: options.tier?.policyAllowsRecovery\n });\n const tierMetadata = tierRoute.tier;\n\n this.logger.info(\"provider.tier.selected\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n selected: tierMetadata.selected,\n reasonCode: tierMetadata.reasonCode,\n operation,\n selection\n }\n });\n\n if (selectedProviders.length === 0) {\n const meta = createExecutionMetadata({\n tier: tierMetadata,\n provider: \"runtime\",\n retrievalPath: `${operation}:${selection}:unavailable`\n });\n const failure = normalizeFailure(\"runtime\", \"web\", new ProviderRuntimeError(\"unavailable\", \"No providers available\", {\n retryable: false,\n details: {\n operation,\n selection\n }\n }), {\n trace,\n startedAtMs: startedAt,\n meta\n });\n\n return {\n ok: false,\n records: [],\n trace: failure.trace,\n partial: false,\n failures: [{ provider: failure.provider, source: failure.source, error: failure.error }],\n metrics: {\n attempted: 0,\n succeeded: 0,\n failed: 1,\n retries: 0,\n latencyMs: failure.latencyMs\n },\n sourceSelection: selection,\n providerOrder: [],\n meta,\n diagnostics: this.buildDiagnostics({\n enabled: false,\n scope: \"runtime\",\n global: { limit: this.budgets.concurrency.global, min: 1, max: this.budgets.concurrency.global },\n scoped: { limit: this.budgets.concurrency.perProvider, min: 1, max: this.budgets.concurrency.perProvider }\n }, { enabled: this.promptGuardEnabled, quarantinedSegments: 0, entries: 0 }, []),\n error: failure.error\n };\n }\n\n const timeout = options.timeoutMs ?? this.budgets.timeoutMs[operation];\n if (selection === \"all\") {\n return this.executeAll(\n selectedProviders,\n operation,\n input,\n trace,\n timeout,\n selection,\n startedAt,\n tierMetadata,\n options.providerIds,\n options\n );\n }\n\n return this.executeSequential(\n selectedProviders,\n operation,\n input,\n trace,\n timeout,\n selection,\n startedAt,\n tierMetadata,\n options.providerIds,\n options\n );\n }\n\n private async executeSequential<Operation extends ProviderOperation>(\n providers: ProviderAdapter[],\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n trace: TraceContext,\n timeoutMs: number,\n selection: ProviderSelection,\n startedAt: number,\n tierMetadata: ProviderTierMetadata,\n providerIds?: string[],\n runOptions: ProviderRunOptions = {}\n ): Promise<ProviderAggregateResult> {\n const failures: ProviderAggregateResult[\"failures\"] = [];\n let retries = 0;\n const attemptedOrder: string[] = [];\n let diagnostics: ProviderRuntimeDiagnostics | undefined;\n let blocker: BlockerSignalV1 | undefined;\n\n for (const provider of providers) {\n attemptedOrder.push(provider.id);\n const result = await this.invokeProvider(provider, operation, input, trace, timeoutMs, tierMetadata, runOptions);\n retries += result.retries;\n diagnostics = result.diagnostics ?? diagnostics;\n blocker = result.meta?.blocker ?? blocker;\n if (result.ok) {\n return {\n ok: true,\n records: result.records,\n trace: result.trace,\n partial: failures.length > 0,\n failures,\n metrics: {\n attempted: failures.length + 1,\n succeeded: 1,\n failed: failures.length,\n retries,\n latencyMs: Math.max(0, Date.now() - startedAt)\n },\n sourceSelection: selection,\n providerOrder: providers.map((candidate) => candidate.id),\n ...(result.meta ? { meta: result.meta } : {}),\n ...(result.diagnostics ? { diagnostics: result.diagnostics } : {})\n };\n }\n failures.push({\n provider: result.provider,\n source: result.source,\n error: result.error\n });\n }\n\n if (shouldFallbackToTierA(tierMetadata.selected)) {\n const fallbackProviders = this.selectTierAProviders(operation, providerIds, attemptedOrder);\n if (fallbackProviders.length > 0) {\n this.logger.warn(\"provider.tier.transition\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n previousTier: tierMetadata.selected,\n nextTier: \"A\",\n reasonCode: \"fallback_to_tier_a\"\n }\n });\n }\n\n const fallbackTier = fallbackTierMetadata();\n for (const provider of fallbackProviders) {\n attemptedOrder.push(provider.id);\n const fallback = await this.invokeProvider(provider, operation, input, trace, timeoutMs, fallbackTier, runOptions);\n retries += fallback.retries;\n diagnostics = fallback.diagnostics ?? diagnostics;\n blocker = fallback.meta?.blocker ?? blocker;\n if (fallback.ok) {\n return {\n ok: true,\n records: fallback.records,\n trace: fallback.trace,\n partial: failures.length > 0,\n failures,\n metrics: {\n attempted: failures.length + 1,\n succeeded: 1,\n failed: failures.length,\n retries,\n latencyMs: Math.max(0, Date.now() - startedAt)\n },\n sourceSelection: selection,\n providerOrder: [...providers, ...fallbackProviders].map((candidate) => candidate.id),\n ...(fallback.meta ? { meta: fallback.meta } : {}),\n ...(fallback.diagnostics ? { diagnostics: fallback.diagnostics } : {})\n };\n }\n failures.push({\n provider: fallback.provider,\n source: fallback.source,\n error: fallback.error\n });\n }\n }\n\n const error = failures.at(-1)?.error;\n const meta = failures.length > 0\n ? createExecutionMetadata({\n tier: tierMetadata,\n provider: failures.at(-1)?.provider ?? \"runtime\",\n retrievalPath: `${operation}:${selection}:failure`\n })\n : undefined;\n if (meta && blocker) {\n meta.blocker = blocker;\n }\n return {\n ok: false,\n records: [],\n trace,\n partial: false,\n failures,\n metrics: {\n attempted: failures.length,\n succeeded: 0,\n failed: failures.length,\n retries,\n latencyMs: Math.max(0, Date.now() - startedAt)\n },\n sourceSelection: selection,\n providerOrder: attemptedOrder.length > 0 ? attemptedOrder : providers.map((provider) => provider.id),\n ...(meta ? { meta } : {}),\n ...(diagnostics ? { diagnostics } : {}),\n ...(error ? { error } : {})\n };\n }\n\n private async executeAll<Operation extends ProviderOperation>(\n providers: ProviderAdapter[],\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n trace: TraceContext,\n timeoutMs: number,\n selection: ProviderSelection,\n startedAt: number,\n tierMetadata: ProviderTierMetadata,\n providerIds?: string[],\n runOptions: ProviderRunOptions = {}\n ): Promise<ProviderAggregateResult> {\n const results = await Promise.all(\n providers.map((provider) => this.invokeProvider(provider, operation, input, trace, timeoutMs, tierMetadata, runOptions))\n );\n\n const records: NormalizedRecord[] = [];\n const failures: ProviderAggregateResult[\"failures\"] = [];\n let retries = 0;\n let attempted = results.length;\n let meta: ProviderExecutionMetadata | undefined;\n let diagnostics: ProviderRuntimeDiagnostics | undefined;\n let fallbackProviderIds: string[] = [];\n let blocker: BlockerSignalV1 | undefined;\n\n for (const result of results) {\n retries += result.retries;\n if (result.ok) {\n records.push(...result.records);\n meta = result.meta ?? meta;\n blocker = result.meta?.blocker ?? blocker;\n diagnostics = result.diagnostics ?? diagnostics;\n continue;\n }\n failures.push({\n provider: result.provider,\n source: result.source,\n error: result.error\n });\n diagnostics = result.diagnostics ?? diagnostics;\n meta = result.meta ?? meta;\n blocker = result.meta?.blocker ?? blocker;\n }\n\n if (records.length === 0 && shouldFallbackToTierA(tierMetadata.selected)) {\n const fallbackTier = fallbackTierMetadata();\n const fallbackProviders = this.selectTierAProviders(operation, providerIds, providers.map((provider) => provider.id));\n fallbackProviderIds = fallbackProviders.map((provider) => provider.id);\n if (fallbackProviders.length > 0) {\n this.logger.warn(\"provider.tier.transition\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n previousTier: tierMetadata.selected,\n nextTier: \"A\",\n reasonCode: \"fallback_to_tier_a\"\n }\n });\n }\n\n const fallbackResults = await Promise.all(\n fallbackProviders.map((provider) => this.invokeProvider(provider, operation, input, trace, timeoutMs, fallbackTier, runOptions))\n );\n\n for (const result of fallbackResults) {\n attempted += 1;\n retries += result.retries;\n diagnostics = result.diagnostics ?? diagnostics;\n meta = result.meta ?? meta;\n blocker = result.meta?.blocker ?? blocker;\n if (result.ok) {\n records.push(...result.records);\n continue;\n }\n failures.push({\n provider: result.provider,\n source: result.source,\n error: result.error\n });\n }\n }\n\n const ok = records.length > 0;\n const attemptedProviders = [\n ...providers.map((provider) => provider.id),\n ...fallbackProviderIds\n ];\n if (meta && blocker) {\n meta.blocker = blocker;\n }\n return {\n ok,\n records,\n trace,\n partial: ok && failures.length > 0,\n failures,\n metrics: {\n attempted,\n succeeded: attempted - failures.length,\n failed: failures.length,\n retries,\n latencyMs: Math.max(0, Date.now() - startedAt)\n },\n sourceSelection: selection,\n providerOrder: attemptedProviders,\n ...(meta ? { meta } : {}),\n ...(diagnostics ? { diagnostics } : {}),\n ...(!ok && failures[0] ? { error: failures[0].error } : {})\n };\n }\n\n private async invokeProvider<Operation extends ProviderOperation>(\n provider: ProviderAdapter,\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n trace: TraceContext,\n timeoutMs: number,\n tierMetadata: ProviderTierMetadata,\n runOptions: ProviderRunOptions\n ): Promise<ProviderOperationResult> {\n const startedAt = Date.now();\n const scopeKey = this.resolveScopeKey(provider.id, operation, input);\n const initialAdaptive = this.adaptiveConcurrency.snapshot(scopeKey);\n\n if (this.registry.isCircuitOpen(provider.id)) {\n const failure = normalizeFailure(provider.id, provider.source, this.registry.getCircuitError(provider.id), {\n trace,\n startedAtMs: startedAt,\n attempts: 1,\n retries: 0,\n meta: createExecutionMetadata({\n tier: tierMetadata,\n provider: provider.id,\n retrievalPath: `${operation}:${scopeKey}:circuit_open`\n })\n });\n failure.diagnostics = this.buildDiagnostics(initialAdaptive, {\n enabled: this.promptGuardEnabled,\n quarantinedSegments: 0,\n entries: 0\n }, []);\n return failure;\n }\n\n const retries = isReadOperation(operation)\n ? this.budgets.retries.read\n : this.budgets.retries.write;\n const maxAttempts = Math.max(1, retries + 1);\n const preparedInput = this.applyAdaptiveOperationInput(provider, operation, input, initialAdaptive);\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n const preflight = this.antiBotPolicy.preflight({\n providerId: provider.id,\n operation\n });\n if (!preflight.allow) {\n const reasonCode = preflight.reasonCode ?? \"cooldown_active\";\n throw new ProviderRuntimeError(\n providerErrorCodeFromReasonCode(reasonCode),\n `Provider execution paused by anti-bot policy for ${provider.id}`,\n {\n provider: provider.id,\n source: provider.source,\n retryable: false,\n reasonCode,\n details: {\n reasonCode,\n ...(typeof preflight.retryAfterMs === \"number\" ? { retryAfterMs: preflight.retryAfterMs } : {}),\n ...(preflight.retryGuidance ? { retryGuidance: preflight.retryGuidance } : {}),\n ...(preflight.proxyHint ? { proxyHint: preflight.proxyHint } : {}),\n ...(preflight.sessionHint ? { sessionHint: preflight.sessionHint } : {})\n }\n }\n );\n }\n\n const records = await this.withProviderConcurrency(provider.id, scopeKey, async () => {\n return this.withTimeout(timeoutMs, async (signal) => {\n const context: ProviderContext = {\n trace: createTraceContext(trace, provider.id),\n timeoutMs,\n attempt,\n signal,\n ...(typeof runOptions.useCookies === \"boolean\" ? { useCookies: runOptions.useCookies } : {}),\n ...(runOptions.cookiePolicyOverride\n ? { cookiePolicyOverride: runOptions.cookiePolicyOverride }\n : {}),\n ...(this.browserFallbackPort\n ? { browserFallbackPort: this.browserFallbackPort }\n : {})\n };\n return this.callOperation(provider, operation, preparedInput, context);\n });\n });\n const guarded = applyPromptGuard(records, this.promptGuardEnabled);\n if (guarded.audit.entries.length > 0) {\n this.logger.audit(\"provider.prompt_guard\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n provider: provider.id,\n operation,\n entries: guarded.audit.entries.length,\n quarantinedSegments: guarded.audit.quarantinedSegments\n }\n });\n }\n const realismPatterns = this.detectRealismViolations(guarded.records);\n if (realismPatterns.length > 0) {\n this.logger.warn(\"provider.realism.violation\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n provider: provider.id,\n operation,\n patterns: realismPatterns\n }\n });\n }\n\n const meta = createExecutionMetadata({\n tier: tierMetadata,\n provider: provider.id,\n retrievalPath: `${operation}:${scopeKey}`\n });\n\n const success = normalizeSuccess(provider.id, provider.source, guarded.records, {\n trace,\n startedAtMs: startedAt,\n attempts: attempt,\n retries: attempt - 1,\n meta,\n provenance: {\n provider: provider.id,\n source: provider.source,\n operation,\n retrievalPath: meta.provenance.retrievalPath,\n retrievedAt: meta.provenance.retrievedAt\n }\n });\n this.adaptiveConcurrency.observe(scopeKey, {\n latencyMs: success.latencyMs,\n queuePressure: this.queuePressure(scopeKey)\n });\n const adaptive = this.adaptiveConcurrency.snapshot(scopeKey);\n success.diagnostics = this.buildDiagnostics(adaptive, {\n enabled: guarded.audit.enabled,\n quarantinedSegments: guarded.audit.quarantinedSegments,\n entries: guarded.audit.entries.length\n }, realismPatterns);\n if (operation === \"post\") {\n this.logger.audit(\"provider.post\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n provider: provider.id,\n source: provider.source,\n operation,\n decision: \"allow\",\n recordCount: success.records.length,\n payloadHashes: success.records\n .map((record) => record.attributes?.auditHash)\n .filter((hash): hash is string => typeof hash === \"string\")\n }\n });\n }\n this.registry.markSuccess(provider.id, success.latencyMs);\n this.antiBotPolicy.postflight({\n providerId: provider.id,\n operation,\n success: true,\n retryable: false,\n attempt,\n maxAttempts\n });\n return success;\n } catch (error) {\n let normalizedError = toProviderError(error, {\n provider: provider.id,\n source: provider.source\n });\n const reasonCode = normalizedError.reasonCode\n ?? normalizeProviderReasonCode({\n code: normalizedError.code,\n message: normalizedError.message,\n details: normalizedError.details\n });\n if (reasonCode && normalizedError.reasonCode !== reasonCode) {\n normalizedError = {\n ...normalizedError,\n reasonCode,\n details: {\n ...(normalizedError.details ?? {}),\n reasonCode\n }\n };\n }\n this.adaptiveConcurrency.observe(scopeKey, {\n latencyMs: Math.max(0, Date.now() - startedAt),\n timeout: normalizedError.code === \"timeout\",\n challenge: this.isChallengeError(normalizedError.message),\n http4xx: this.isClientError(normalizedError.code, normalizedError.message),\n http5xx: this.isServerError(normalizedError.code, normalizedError.message),\n queuePressure: this.queuePressure(scopeKey)\n });\n this.registry.markFailure(provider.id, normalizedError, this.budgets.circuitBreaker);\n\n const postflight = this.antiBotPolicy.postflight({\n providerId: provider.id,\n operation,\n success: false,\n reasonCode,\n retryable: normalizedError.retryable,\n attempt,\n maxAttempts\n });\n if (attempt < maxAttempts && postflight.allowRetry) {\n continue;\n }\n\n const meta = createExecutionMetadata({\n tier: tierMetadata,\n provider: provider.id,\n retrievalPath: `${operation}:${scopeKey}:failure`\n });\n const blocker = this.detectRuntimeBlocker({\n operation,\n code: normalizedError.code,\n message: normalizedError.message,\n details: normalizedError.details,\n retryable: normalizedError.retryable,\n trace\n });\n if (blocker) {\n meta.blocker = blocker;\n }\n const failure = normalizeFailure(provider.id, provider.source, normalizedError, {\n trace,\n startedAtMs: startedAt,\n attempts: attempt,\n retries: attempt - 1,\n meta\n });\n failure.diagnostics = this.buildDiagnostics(this.adaptiveConcurrency.snapshot(scopeKey), {\n enabled: this.promptGuardEnabled,\n quarantinedSegments: 0,\n entries: 0\n }, []);\n if (operation === \"post\") {\n this.logger.audit(\"provider.post\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n provider: provider.id,\n source: provider.source,\n operation,\n decision: \"deny\",\n error: failure.error.code\n }\n });\n }\n return failure;\n }\n }\n\n const exhausted = normalizeFailure(provider.id, provider.source, new ProviderRuntimeError(\"internal\", \"Provider invocation exhausted attempts\", {\n provider: provider.id,\n source: provider.source\n }), {\n trace,\n startedAtMs: startedAt,\n attempts: maxAttempts,\n retries: Math.max(0, maxAttempts - 1),\n meta: createExecutionMetadata({\n tier: tierMetadata,\n provider: provider.id,\n retrievalPath: `${operation}:${scopeKey}:exhausted`\n })\n });\n exhausted.diagnostics = this.buildDiagnostics(this.adaptiveConcurrency.snapshot(scopeKey), {\n enabled: this.promptGuardEnabled,\n quarantinedSegments: 0,\n entries: 0\n }, []);\n return exhausted;\n }\n\n private async callOperation<Operation extends ProviderOperation>(\n provider: ProviderAdapter,\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n context: ProviderContext\n ): Promise<NormalizedRecord[]> {\n switch (operation) {\n case \"search\":\n if (!provider.search) {\n throw new ProviderRuntimeError(\"not_supported\", \"Search operation is not supported\", {\n provider: provider.id,\n source: provider.source,\n retryable: false\n });\n }\n return provider.search(input as ProviderCallResultByOperation[\"search\"], context);\n case \"fetch\":\n if (!provider.fetch) {\n throw new ProviderRuntimeError(\"not_supported\", \"Fetch operation is not supported\", {\n provider: provider.id,\n source: provider.source,\n retryable: false\n });\n }\n return provider.fetch(input as ProviderCallResultByOperation[\"fetch\"], context);\n case \"crawl\":\n if (!provider.crawl) {\n throw new ProviderRuntimeError(\"not_supported\", \"Crawl operation is not supported\", {\n provider: provider.id,\n source: provider.source,\n retryable: false\n });\n }\n return provider.crawl(input as ProviderCallResultByOperation[\"crawl\"], context);\n case \"post\":\n if (!provider.post) {\n throw new ProviderRuntimeError(\"not_supported\", \"Post operation is not supported\", {\n provider: provider.id,\n source: provider.source,\n retryable: false\n });\n }\n return provider.post(input as ProviderCallResultByOperation[\"post\"], context);\n }\n }\n\n private async withProviderConcurrency<T>(providerId: string, scopeKey: string, task: () => Promise<T>): Promise<T> {\n const adaptive = this.adaptiveConcurrency.snapshot(scopeKey);\n this.globalSemaphore.setLimit(adaptive.global.limit);\n const scopedSemaphore = this.scopedSemaphores.get(scopeKey)\n ?? this.scopedSemaphores.get(providerId)\n ?? new Semaphore(adaptive.scoped.limit);\n scopedSemaphore.setLimit(adaptive.scoped.limit);\n this.scopedSemaphores.set(scopeKey, scopedSemaphore);\n\n return this.globalSemaphore.use(async () => scopedSemaphore.use(task));\n }\n\n private createAdaptiveConcurrencyController(): AdaptiveConcurrencyController {\n return new AdaptiveConcurrencyController({\n enabled: this.adaptiveConfig.enabled,\n baselineGlobal: this.budgets.concurrency.global,\n baselineScoped: this.budgets.concurrency.perDomain ?? this.budgets.concurrency.perProvider,\n maxGlobal: this.adaptiveConfig.maxGlobal,\n maxScoped: this.adaptiveConfig.maxPerDomain\n });\n }\n\n private selectTierAProviders(\n operation: ProviderOperation,\n providerIds: string[] | undefined,\n excludeProviderIds: string[] = []\n ): ProviderAdapter[] {\n return selectProviders(this.registry, operation, \"web\")\n .filter((provider) => !excludeProviderIds.includes(provider.id))\n .filter((provider) => (providerIds?.length ?? 0) === 0 || providerIds?.includes(provider.id));\n }\n\n private calculateChallengePressure(providers: ProviderAdapter[]): number {\n if (providers.length === 0) return 0;\n let total = 0;\n for (const provider of providers) {\n const status = this.registry.getHealth(provider.id).status;\n if (status === \"unhealthy\") total += 1;\n else if (status === \"degraded\") total += 0.5;\n }\n return total / providers.length;\n }\n\n private calculateRiskScore(providers: ProviderAdapter[], challengePressure: number): number {\n if (providers.length === 0) return Math.max(0, Math.min(1, challengePressure));\n let unhealthy = 0;\n let degraded = 0;\n for (const provider of providers) {\n const health = this.registry.getHealth(provider.id);\n if (health.status === \"unhealthy\") unhealthy += 1;\n else if (health.status === \"degraded\") degraded += 1;\n }\n const healthPressure = (unhealthy + degraded * 0.5) / providers.length;\n return Math.max(0, Math.min(1, Math.max(challengePressure, healthPressure)));\n }\n\n private isHybridHealthy(providers: ProviderAdapter[]): boolean {\n const hybridProviders = providers.filter((provider) => provider.source !== \"web\");\n if (hybridProviders.length === 0) return false;\n return hybridProviders.some((provider) => {\n const health = this.registry.getHealth(provider.id);\n return health.status !== \"unhealthy\" && !this.registry.isCircuitOpen(provider.id);\n });\n }\n\n private isLatencyBudgetExceeded(\n providers: ProviderAdapter[],\n operation: ProviderOperation\n ): boolean {\n const timeoutBudget = this.budgets.timeoutMs[operation];\n return providers.some((provider) => {\n if (provider.source === \"web\") return false;\n const latency = this.registry.getHealth(provider.id).latencyMs;\n return typeof latency === \"number\" && latency > timeoutBudget;\n });\n }\n\n private isErrorBudgetExceeded(providers: ProviderAdapter[]): boolean {\n if (providers.length === 0) return false;\n let violations = 0;\n for (const provider of providers) {\n const status = this.registry.getHealth(provider.id).status;\n if (status === \"unhealthy\") {\n violations += 1;\n }\n }\n return violations / providers.length >= 0.5;\n }\n\n private isHybridEligible(providers: ProviderAdapter[]): boolean {\n return providers.some((provider) => provider.source !== \"web\");\n }\n\n private resolveScopeKey<Operation extends ProviderOperation>(\n providerId: string,\n operation: Operation,\n input: ProviderCallResultByOperation[Operation]\n ): string {\n const extractHost = (value: string | undefined): string | null => {\n if (!value) return null;\n try {\n return new URL(value).hostname.toLowerCase();\n } catch {\n return null;\n }\n };\n\n if (operation === \"fetch\") {\n return extractHost((input as ProviderCallResultByOperation[\"fetch\"]).url) ?? providerId;\n }\n if (operation === \"crawl\") {\n const first = (input as ProviderCallResultByOperation[\"crawl\"]).seedUrls[0];\n return extractHost(first) ?? providerId;\n }\n if (operation === \"search\") {\n return extractHost((input as ProviderCallResultByOperation[\"search\"]).query) ?? providerId;\n }\n return providerId;\n }\n\n private queuePressure(scopeKey: string): number {\n const global = this.globalSemaphore.snapshot();\n const scoped = this.scopedSemaphores.get(scopeKey)?.snapshot();\n const globalPressure = global.limit <= 0 ? 0 : Math.min(1, (global.active + global.queued) / global.limit);\n const scopedPressure = !scoped || scoped.limit <= 0\n ? 0\n : Math.min(1, (scoped.active + scoped.queued) / scoped.limit);\n return Math.max(globalPressure, scopedPressure);\n }\n\n private detectRealismViolations(records: NormalizedRecord[]): string[] {\n const matched = new Set<string>();\n for (const record of records) {\n const haystacks = [record.url ?? \"\", record.title ?? \"\", record.content ?? \"\"];\n for (const pattern of PLACEHOLDER_PATTERNS) {\n if (haystacks.some((value) => pattern.regex.test(value))) {\n matched.add(pattern.code);\n }\n }\n }\n return [...matched];\n }\n\n private applyAdaptiveOperationInput<Operation extends ProviderOperation>(\n provider: ProviderAdapter,\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n adaptive: AdaptiveConcurrencyDiagnostics\n ): ProviderCallResultByOperation[Operation] {\n if (!adaptive.enabled || operation !== \"crawl\" || provider.source !== \"web\") {\n return input;\n }\n\n const crawlInput = input as ProviderCallResultByOperation[\"crawl\"];\n const scopedLimit = Math.max(1, Math.floor(adaptive.scoped.limit));\n const currentMaxPerDomain = typeof crawlInput.maxPerDomain === \"number\"\n ? Math.max(1, Math.floor(crawlInput.maxPerDomain))\n : undefined;\n const currentFetchConcurrency = toPositiveInt(crawlInput.filters?.fetchConcurrency, scopedLimit);\n const nextMaxPerDomain = currentMaxPerDomain !== undefined\n ? Math.min(currentMaxPerDomain, scopedLimit)\n : scopedLimit;\n const nextFetchConcurrency = Math.min(currentFetchConcurrency, scopedLimit);\n\n if (currentMaxPerDomain === nextMaxPerDomain && currentFetchConcurrency === nextFetchConcurrency) {\n return input;\n }\n\n return {\n ...crawlInput,\n maxPerDomain: nextMaxPerDomain,\n filters: {\n ...(crawlInput.filters ?? {}),\n fetchConcurrency: nextFetchConcurrency as JsonValue\n }\n } as unknown as ProviderCallResultByOperation[Operation];\n }\n\n private isChallengeError(message: string): boolean {\n return /captcha|challenge|cf_chl|interstitial|bot/i.test(message);\n }\n\n private isClientError(code: string, message: string): boolean {\n return code === \"auth\"\n || code === \"invalid_input\"\n || code === \"policy_blocked\"\n || /\\b4\\d{2}\\b/.test(message);\n }\n\n private isServerError(code: string, message: string): boolean {\n return code === \"upstream\"\n || code === \"unavailable\"\n || /\\b5\\d{2}\\b/.test(message);\n }\n\n private buildDiagnostics(\n adaptive: AdaptiveConcurrencyDiagnostics,\n promptGuard: { enabled: boolean; quarantinedSegments: number; entries: number },\n realismPatterns: string[]\n ): ProviderRuntimeDiagnostics {\n return {\n adaptiveConcurrency: adaptive,\n promptGuard,\n realism: {\n violations: realismPatterns.length,\n patterns: realismPatterns\n }\n };\n }\n\n private detectRuntimeBlocker(params: {\n operation: ProviderOperation;\n code: string;\n message: string;\n details?: Record<string, JsonValue>;\n retryable: boolean;\n trace: TraceContext;\n }): BlockerSignalV1 | undefined {\n const details = params.details;\n const url = typeof details?.url === \"string\"\n ? details.url\n : undefined;\n const hostFromUrl = (() => {\n if (!url) return null;\n try {\n return new URL(url).hostname.toLowerCase();\n } catch {\n return null;\n }\n })();\n const status = typeof details?.status === \"number\" ? details.status : undefined;\n const normalizedReasonCode = normalizeProviderReasonCode({\n code: params.code as ProviderErrorCode,\n message: params.message,\n status,\n details\n });\n const envLimited = normalizedReasonCode === \"env_limited\"\n || (\n params.code === \"unavailable\"\n && /extension not connected|not available in this environment|manual interaction/i.test(params.message)\n );\n const blocker = classifyBlockerSignal({\n source: params.operation === \"post\" ? \"macro_execution\" : \"runtime_fetch\",\n ...(url ? { url } : {}),\n ...(status !== undefined ? { status } : {}),\n providerErrorCode: params.code,\n message: params.message,\n networkHosts: hostFromUrl ? [hostFromUrl] : undefined,\n traceRequestId: params.trace.requestId,\n retryable: params.retryable,\n envLimited,\n promptGuardEnabled: this.promptGuardEnabled,\n threshold: this.blockerDetectionThreshold\n });\n if (!blocker) return undefined;\n if (blocker.reasonCode || !normalizedReasonCode) {\n return blocker;\n }\n return {\n ...blocker,\n reasonCode: normalizedReasonCode\n };\n }\n\n private async withTimeout<T>(\n timeoutMs: number,\n task: (signal: AbortSignal) => Promise<T>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort(\"timeout\");\n }, timeoutMs);\n\n try {\n const result = await task(controller.signal);\n if (controller.signal.aborted) {\n throw new ProviderRuntimeError(\"timeout\", `Provider request timed out after ${timeoutMs}ms`);\n }\n return result;\n } catch (error) {\n if (controller.signal.aborted) {\n throw new ProviderRuntimeError(\"timeout\", `Provider request timed out after ${timeoutMs}ms`, {\n retryable: true,\n cause: error\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n\nexport const createProviderRuntime = (init: RuntimeInit = {}): ProviderRuntime => {\n return new ProviderRuntime(init);\n};\n\nconst withDefaultWebOptions = (\n options: WebProviderOptions | undefined,\n browserFallbackPort?: BrowserFallbackPort\n): WebProviderOptions => {\n const providerId = options?.id ?? \"web/default\";\n return {\n ...options,\n fetcher: options?.fetcher ?? (async (url: string) => {\n const document = await fetchRuntimeDocumentWithFallback({\n url,\n provider: providerId,\n source: \"web\",\n operation: \"fetch\",\n browserFallbackPort\n });\n return {\n url: document.url,\n status: document.status,\n html: document.html\n };\n }),\n searchIndex: options?.searchIndex ?? (async (input, context) => {\n const query = input.query.trim();\n const lookupUrl = isHttpUrl(query)\n ? query\n : `https://duckduckgo.com/html/?q=${encodeURIComponent(query)}&ia=web`;\n const document = await fetchRuntimeDocumentWithFallback({\n url: lookupUrl,\n provider: providerId,\n source: \"web\",\n operation: \"search\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n\n const limit = Math.max(1, Math.min(input.limit ?? 5, 10));\n const links = dedupeLinks(document.links, document.url, limit);\n const searchPath = isHttpUrl(query) ? \"web:search:url\" : \"web:search:index\";\n if (links.length === 0) {\n return [{\n url: document.url,\n title: document.url,\n content: toSnippet(stripUrls(document.text), 1500),\n confidence: isHttpUrl(query) ? 0.75 : 0.55,\n attributes: {\n query,\n status: document.status,\n retrievalPath: searchPath\n }\n }];\n }\n\n return links.map((url, index) => ({\n url,\n title: url,\n ...(index === 0 ? { content: toSnippet(stripUrls(document.text), 700) } : {}),\n confidence: Math.max(0.35, 0.75 - index * 0.05),\n attributes: {\n query,\n rank: index + 1,\n status: document.status,\n retrievalPath: searchPath\n }\n }));\n })\n };\n};\n\nconst withDefaultCommunityOptions = (\n options: CommunityProviderOptions | undefined,\n browserFallbackPort?: BrowserFallbackPort\n): CommunityProviderOptions => {\n const providerId = options?.id ?? \"community/default\";\n return {\n ...options,\n search: options?.search ?? (async (input, context) => {\n const query = input.query.trim();\n const page = toPositiveInt(input.filters?.page, 1);\n const lookupUrl = isHttpUrl(query)\n ? query\n : `https://www.reddit.com/search/?q=${encodeURIComponent(query)}&sort=relevance&t=all&page=${page}`;\n const document = await fetchRuntimeDocumentWithFallback({\n url: lookupUrl,\n provider: providerId,\n source: \"community\",\n operation: \"search\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n const links = dedupeLinks(document.links, document.url, 20);\n\n return [{\n url: document.url,\n title: isHttpUrl(query) ? document.url : `Community search: ${query}`,\n content: toSnippet(stripUrls(document.text), 1800),\n confidence: isHttpUrl(query) ? 0.75 : 0.6,\n attributes: {\n query,\n page,\n status: document.status,\n links,\n retrievalPath: isHttpUrl(query) ? \"community:search:url\" : \"community:search:index\"\n }\n }];\n }),\n fetch: options?.fetch ?? (async (input, context) => {\n const document = await fetchRuntimeDocumentWithFallback({\n url: input.url,\n provider: providerId,\n source: \"community\",\n operation: \"fetch\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n const links = dedupeLinks(document.links, document.url, 20);\n return {\n url: document.url,\n title: document.url,\n content: document.text,\n attributes: {\n status: document.status,\n links,\n retrievalPath: \"community:fetch:url\"\n }\n };\n })\n };\n};\n\nconst withDefaultSocialPlatformOptions = (\n platform: SocialPlatform,\n options: SocialProviderOptions | undefined,\n browserFallbackPort?: BrowserFallbackPort\n): SocialProviderOptions => {\n const providerId = options?.id ?? `social/${platform}`;\n return {\n ...options,\n search: options?.search ?? (async (input, context) => {\n const query = input.query.trim();\n const page = toPositiveInt(input.filters?.page, 1);\n const lookupUrl = isHttpUrl(query)\n ? query\n : SOCIAL_SEARCH_ENDPOINTS[platform](query, page);\n const document = await fetchRuntimeDocumentWithFallback({\n url: lookupUrl,\n provider: providerId,\n source: \"social\",\n operation: \"search\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n const links = dedupeLinks(document.links, document.url, 20);\n\n return [{\n url: document.url,\n title: isHttpUrl(query) ? document.url : `${platform} search: ${query}`,\n content: toSnippet(stripUrls(document.text), 1600),\n confidence: isHttpUrl(query) ? 0.72 : 0.58,\n attributes: {\n platform,\n query,\n page,\n status: document.status,\n links,\n retrievalPath: isHttpUrl(query) ? \"social:search:url\" : \"social:search:index\"\n }\n }];\n }),\n fetch: options?.fetch ?? (async (input, context) => {\n const document = await fetchRuntimeDocumentWithFallback({\n url: input.url,\n provider: providerId,\n source: \"social\",\n operation: \"fetch\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n const links = dedupeLinks(document.links, document.url, 20);\n return {\n url: document.url,\n title: document.url,\n content: document.text,\n attributes: {\n platform,\n status: document.status,\n links,\n retrievalPath: \"social:fetch:url\"\n }\n };\n })\n };\n};\n\nconst withDefaultSocialOptions = (\n options: SocialProvidersOptions | undefined,\n runtimeInit: Pick<RuntimeInit, \"transcript\" | \"browserFallbackPort\" | \"antiBotPolicy\">\n): SocialProvidersOptions => ({\n x: withDefaultSocialPlatformOptions(\"x\", options?.x, runtimeInit.browserFallbackPort),\n reddit: withDefaultSocialPlatformOptions(\"reddit\", options?.reddit, runtimeInit.browserFallbackPort),\n bluesky: withDefaultSocialPlatformOptions(\"bluesky\", options?.bluesky, runtimeInit.browserFallbackPort),\n facebook: withDefaultSocialPlatformOptions(\"facebook\", options?.facebook, runtimeInit.browserFallbackPort),\n linkedin: withDefaultSocialPlatformOptions(\"linkedin\", options?.linkedin, runtimeInit.browserFallbackPort),\n instagram: withDefaultSocialPlatformOptions(\"instagram\", options?.instagram, runtimeInit.browserFallbackPort),\n tiktok: withDefaultSocialPlatformOptions(\"tiktok\", options?.tiktok, runtimeInit.browserFallbackPort),\n threads: withDefaultSocialPlatformOptions(\"threads\", options?.threads, runtimeInit.browserFallbackPort),\n youtube: withDefaultYouTubeOptions({\n ...(options?.youtube ?? {}),\n ...(runtimeInit.transcript\n ? {\n transcriptResolver: {\n modeDefault: runtimeInit.transcript.modeDefault,\n strategyOrder: runtimeInit.transcript.strategyOrder,\n enableYtdlp: runtimeInit.transcript.enableYtdlp,\n enableAsr: runtimeInit.transcript.enableAsr,\n enableYtdlpAudioAsr: runtimeInit.transcript.enableYtdlpAudioAsr,\n enableApify: runtimeInit.transcript.enableApify,\n apifyActorId: runtimeInit.transcript.apifyActorId,\n enableBrowserFallback: runtimeInit.transcript.enableBrowserFallback,\n ytdlpTimeoutMs: runtimeInit.transcript.ytdlpTimeoutMs\n }\n }\n : {}),\n ...(runtimeInit.browserFallbackPort\n ? { browserFallbackPort: runtimeInit.browserFallbackPort }\n : {}),\n ...(runtimeInit.antiBotPolicy\n ? { antiBotPolicy: runtimeInit.antiBotPolicy }\n : {})\n })\n});\n\nexport const createDefaultRuntime = (\n defaults: RuntimeDefaults = {},\n init: Omit<RuntimeInit, \"providers\"> = {}\n): ProviderRuntime => {\n const runtime = new ProviderRuntime(init);\n runtime.register(createWebProvider(withDefaultWebOptions(defaults.web, init.browserFallbackPort)));\n runtime.register(createCommunityProvider(withDefaultCommunityOptions(defaults.community, init.browserFallbackPort)));\n for (const provider of createSocialProviders(withDefaultSocialOptions(defaults.social, {\n transcript: init.transcript,\n browserFallbackPort: init.browserFallbackPort,\n antiBotPolicy: init.antiBotPolicy\n }))) {\n runtime.register(provider);\n }\n for (const provider of createShoppingProviders(defaults.shopping)) {\n runtime.register(provider);\n }\n return runtime;\n};\n\nconst mergeBudgets = (\n base: ProviderRuntimeBudgets,\n partial: Partial<ProviderRuntimeBudgets> | undefined\n): ProviderRuntimeBudgets => {\n if (!partial) return base;\n\n return {\n timeoutMs: {\n ...base.timeoutMs,\n ...(partial.timeoutMs ?? {})\n },\n retries: {\n ...base.retries,\n ...(partial.retries ?? {})\n },\n concurrency: {\n ...base.concurrency,\n ...(partial.concurrency ?? {})\n },\n circuitBreaker: {\n ...base.circuitBreaker,\n ...(partial.circuitBreaker ?? {})\n }\n };\n};\n\nexport { ProviderRegistry } from \"./registry\";\nexport { selectProviders } from \"./policy\";\nexport { createWebProvider } from \"./web\";\nexport { createCommunityProvider } from \"./community\";\nexport { createSocialProvider, createSocialProviders } from \"./social\";\nexport { createShoppingProvider, createShoppingProviders, createShoppingProviderById, SHOPPING_PROVIDER_IDS } from \"./shopping\";\nexport * from \"./timebox\";\nexport * from \"./enrichment\";\nexport * from \"./renderer\";\nexport * from \"./artifacts\";\nexport * from \"./workflows\";\nexport * from \"./types\";\nexport * from \"./errors\";\nexport * from \"./normalize\";\nexport * from \"./tier-router\";\nexport * from \"./adaptive-concurrency\";\nexport * from \"./blocker\";\n"],"mappings":"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","names":["randomUUID","createHash","createHash","resolve","percentile","queue","percentile","isHttpUrl","extractLinks","fetch","DEFAULT_TRAVERSAL","LINK_RE","asNumber","toPositiveInt","isHttpUrl","coerceStringArray","extractLinks","qualityFlags","unavailable","shouldSkipExpansionError","sortRows","mergedTraversal","fetch","isHttpUrl","decodeHtml","normalizeEscapedValue","firstNonEmptyMatch","hasValues","parseIsoDate","isHttpUrl","fetch","isHttpUrl","fetch","console","toDate","fromDate","asNumber","readdir","rm","join","randomUUID","tmpdir","createHash","createHash","asNumber","resolve","isHttpUrl","toPositiveInt","dedupeLinks","fallbackReasonCodeForError","readFallbackString","hash","extractHost"]}
|