@fusengine/browser-mcp 0.1.0
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 +21 -0
- package/README.md +175 -0
- package/dist/actions/act-by-ref.d.ts +13 -0
- package/dist/actions/act-by-ref.d.ts.map +1 -0
- package/dist/actions/act-by-ref.js +25 -0
- package/dist/actions/act-by-ref.js.map +1 -0
- package/dist/actions/human.d.ts +8 -0
- package/dist/actions/human.d.ts.map +1 -0
- package/dist/actions/human.js +6 -0
- package/dist/actions/human.js.map +1 -0
- package/dist/actions/login.d.ts +17 -0
- package/dist/actions/login.d.ts.map +1 -0
- package/dist/actions/login.js +11 -0
- package/dist/actions/login.js.map +1 -0
- package/dist/actions/navigation.d.ts +15 -0
- package/dist/actions/navigation.d.ts.map +1 -0
- package/dist/actions/navigation.js +33 -0
- package/dist/actions/navigation.js.map +1 -0
- package/dist/actions/perform.d.ts +15 -0
- package/dist/actions/perform.d.ts.map +1 -0
- package/dist/actions/perform.js +41 -0
- package/dist/actions/perform.js.map +1 -0
- package/dist/actions/smart-click.d.ts +9 -0
- package/dist/actions/smart-click.d.ts.map +1 -0
- package/dist/actions/smart-click.js +55 -0
- package/dist/actions/smart-click.js.map +1 -0
- package/dist/actions/smart-fill.d.ts +9 -0
- package/dist/actions/smart-fill.d.ts.map +1 -0
- package/dist/actions/smart-fill.js +46 -0
- package/dist/actions/smart-fill.js.map +1 -0
- package/dist/actions/wait-for.d.ts +21 -0
- package/dist/actions/wait-for.d.ts.map +1 -0
- package/dist/actions/wait-for.js +28 -0
- package/dist/actions/wait-for.js.map +1 -0
- package/dist/agent/actions-loop.d.ts +18 -0
- package/dist/agent/actions-loop.d.ts.map +1 -0
- package/dist/agent/actions-loop.js +44 -0
- package/dist/agent/actions-loop.js.map +1 -0
- package/dist/agent/browser-agent.d.ts +24 -0
- package/dist/agent/browser-agent.d.ts.map +1 -0
- package/dist/agent/browser-agent.js +36 -0
- package/dist/agent/browser-agent.js.map +1 -0
- package/dist/agent/compact.d.ts +8 -0
- package/dist/agent/compact.d.ts.map +1 -0
- package/dist/agent/compact.js +24 -0
- package/dist/agent/compact.js.map +1 -0
- package/dist/agent/config.d.ts +30 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +49 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/detect.d.ts +17 -0
- package/dist/agent/detect.d.ts.map +1 -0
- package/dist/agent/detect.js +9 -0
- package/dist/agent/detect.js.map +1 -0
- package/dist/agent/network.d.ts +16 -0
- package/dist/agent/network.d.ts.map +1 -0
- package/dist/agent/network.js +16 -0
- package/dist/agent/network.js.map +1 -0
- package/dist/agent/probe-run.d.ts +6 -0
- package/dist/agent/probe-run.d.ts.map +1 -0
- package/dist/agent/probe-run.js +90 -0
- package/dist/agent/probe-run.js.map +1 -0
- package/dist/agent/report.d.ts +29 -0
- package/dist/agent/report.d.ts.map +1 -0
- package/dist/agent/report.js +53 -0
- package/dist/agent/report.js.map +1 -0
- package/dist/agent/run-steps.d.ts +22 -0
- package/dist/agent/run-steps.d.ts.map +1 -0
- package/dist/agent/run-steps.js +59 -0
- package/dist/agent/run-steps.js.map +1 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +84 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/mcp.d.ts +3 -0
- package/dist/bin/mcp.d.ts.map +1 -0
- package/dist/bin/mcp.js +28 -0
- package/dist/bin/mcp.js.map +1 -0
- package/dist/captcha/solve.d.ts +17 -0
- package/dist/captcha/solve.d.ts.map +1 -0
- package/dist/captcha/solve.js +42 -0
- package/dist/captcha/solve.js.map +1 -0
- package/dist/consent/booking-currency.d.ts +14 -0
- package/dist/consent/booking-currency.d.ts.map +1 -0
- package/dist/consent/booking-currency.js +82 -0
- package/dist/consent/booking-currency.js.map +1 -0
- package/dist/consent/consent.d.ts +11 -0
- package/dist/consent/consent.d.ts.map +1 -0
- package/dist/consent/consent.js +27 -0
- package/dist/consent/consent.js.map +1 -0
- package/dist/consent/currency-url.d.ts +10 -0
- package/dist/consent/currency-url.d.ts.map +1 -0
- package/dist/consent/currency-url.js +18 -0
- package/dist/consent/currency-url.js.map +1 -0
- package/dist/consent/currency.d.ts +14 -0
- package/dist/consent/currency.d.ts.map +1 -0
- package/dist/consent/currency.js +48 -0
- package/dist/consent/currency.js.map +1 -0
- package/dist/engine/cdp-engine.d.ts +21 -0
- package/dist/engine/cdp-engine.d.ts.map +1 -0
- package/dist/engine/cdp-engine.js +36 -0
- package/dist/engine/cdp-engine.js.map +1 -0
- package/dist/engine/cdp-launch.d.ts +11 -0
- package/dist/engine/cdp-launch.d.ts.map +1 -0
- package/dist/engine/cdp-launch.js +54 -0
- package/dist/engine/cdp-launch.js.map +1 -0
- package/dist/engine/context.d.ts +14 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +22 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/launch.d.ts +6 -0
- package/dist/engine/launch.d.ts.map +1 -0
- package/dist/engine/launch.js +53 -0
- package/dist/engine/launch.js.map +1 -0
- package/dist/engine/loader.d.ts +13 -0
- package/dist/engine/loader.d.ts.map +1 -0
- package/dist/engine/loader.js +24 -0
- package/dist/engine/loader.js.map +1 -0
- package/dist/engine/patchright-engine.d.ts +4 -0
- package/dist/engine/patchright-engine.d.ts.map +1 -0
- package/dist/engine/patchright-engine.js +10 -0
- package/dist/engine/patchright-engine.js.map +1 -0
- package/dist/engine/playwright-engine.d.ts +8 -0
- package/dist/engine/playwright-engine.d.ts.map +1 -0
- package/dist/engine/playwright-engine.js +24 -0
- package/dist/engine/playwright-engine.js.map +1 -0
- package/dist/engine/registry.d.ts +13 -0
- package/dist/engine/registry.d.ts.map +1 -0
- package/dist/engine/registry.js +18 -0
- package/dist/engine/registry.js.map +1 -0
- package/dist/extraction/challenges.d.ts +9 -0
- package/dist/extraction/challenges.d.ts.map +1 -0
- package/dist/extraction/challenges.js +24 -0
- package/dist/extraction/challenges.js.map +1 -0
- package/dist/extraction/hotel-offers.d.ts +11 -0
- package/dist/extraction/hotel-offers.d.ts.map +1 -0
- package/dist/extraction/hotel-offers.js +63 -0
- package/dist/extraction/hotel-offers.js.map +1 -0
- package/dist/extraction/main-text.d.ts +13 -0
- package/dist/extraction/main-text.d.ts.map +1 -0
- package/dist/extraction/main-text.js +20 -0
- package/dist/extraction/main-text.js.map +1 -0
- package/dist/extraction/prices.d.ts +18 -0
- package/dist/extraction/prices.d.ts.map +1 -0
- package/dist/extraction/prices.js +74 -0
- package/dist/extraction/prices.js.map +1 -0
- package/dist/extraction/snapshot-diff.d.ts +28 -0
- package/dist/extraction/snapshot-diff.d.ts.map +1 -0
- package/dist/extraction/snapshot-diff.js +30 -0
- package/dist/extraction/snapshot-diff.js.map +1 -0
- package/dist/extraction/snapshot.d.ts +14 -0
- package/dist/extraction/snapshot.d.ts.map +1 -0
- package/dist/extraction/snapshot.js +26 -0
- package/dist/extraction/snapshot.js.map +1 -0
- package/dist/extraction/structured.d.ts +26 -0
- package/dist/extraction/structured.d.ts.map +1 -0
- package/dist/extraction/structured.js +28 -0
- package/dist/extraction/structured.js.map +1 -0
- package/dist/extraction/visual.d.ts +9 -0
- package/dist/extraction/visual.d.ts.map +1 -0
- package/dist/extraction/visual.js +29 -0
- package/dist/extraction/visual.js.map +1 -0
- package/dist/guardrails/preflight.d.ts +25 -0
- package/dist/guardrails/preflight.d.ts.map +1 -0
- package/dist/guardrails/preflight.js +27 -0
- package/dist/guardrails/preflight.js.map +1 -0
- package/dist/identity/country-profiles.d.ts +12 -0
- package/dist/identity/country-profiles.d.ts.map +1 -0
- package/dist/identity/country-profiles.js +58 -0
- package/dist/identity/country-profiles.js.map +1 -0
- package/dist/identity/identity.d.ts +19 -0
- package/dist/identity/identity.d.ts.map +1 -0
- package/dist/identity/identity.js +31 -0
- package/dist/identity/identity.js.map +1 -0
- package/dist/identity/resolve.d.ts +25 -0
- package/dist/identity/resolve.d.ts.map +1 -0
- package/dist/identity/resolve.js +21 -0
- package/dist/identity/resolve.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/engine-types.d.ts +15 -0
- package/dist/interfaces/engine-types.d.ts.map +1 -0
- package/dist/interfaces/engine-types.js +6 -0
- package/dist/interfaces/engine-types.js.map +1 -0
- package/dist/interfaces/engine.d.ts +30 -0
- package/dist/interfaces/engine.d.ts.map +1 -0
- package/dist/interfaces/engine.js +2 -0
- package/dist/interfaces/engine.js.map +1 -0
- package/dist/interfaces/extraction.d.ts +63 -0
- package/dist/interfaces/extraction.d.ts.map +1 -0
- package/dist/interfaces/extraction.js +6 -0
- package/dist/interfaces/extraction.js.map +1 -0
- package/dist/interfaces/net.d.ts +48 -0
- package/dist/interfaces/net.d.ts.map +1 -0
- package/dist/interfaces/net.js +6 -0
- package/dist/interfaces/net.js.map +1 -0
- package/dist/interfaces/report.d.ts +87 -0
- package/dist/interfaces/report.d.ts.map +1 -0
- package/dist/interfaces/report.js +2 -0
- package/dist/interfaces/report.js.map +1 -0
- package/dist/interfaces/types.d.ts +90 -0
- package/dist/interfaces/types.d.ts.map +1 -0
- package/dist/interfaces/types.js +6 -0
- package/dist/interfaces/types.js.map +1 -0
- package/dist/lib/errors.d.ts +19 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +30 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/evaluate.d.ts +17 -0
- package/dist/lib/evaluate.d.ts.map +1 -0
- package/dist/lib/evaluate.js +10 -0
- package/dist/lib/evaluate.js.map +1 -0
- package/dist/lib/fs.d.ts +11 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +34 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/logger.d.ts +14 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +22 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/output-dir.d.ts +12 -0
- package/dist/lib/output-dir.d.ts.map +1 -0
- package/dist/lib/output-dir.js +37 -0
- package/dist/lib/output-dir.js.map +1 -0
- package/dist/lib/retry.d.ts +28 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +41 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/text.d.ts +9 -0
- package/dist/lib/text.d.ts.map +1 -0
- package/dist/lib/text.js +13 -0
- package/dist/lib/text.js.map +1 -0
- package/dist/net/captcha-client.d.ts +10 -0
- package/dist/net/captcha-client.d.ts.map +1 -0
- package/dist/net/captcha-client.js +48 -0
- package/dist/net/captcha-client.js.map +1 -0
- package/dist/net/captcha-inject.d.ts +10 -0
- package/dist/net/captcha-inject.d.ts.map +1 -0
- package/dist/net/captcha-inject.js +24 -0
- package/dist/net/captcha-inject.js.map +1 -0
- package/dist/net/navigate.d.ts +19 -0
- package/dist/net/navigate.d.ts.map +1 -0
- package/dist/net/navigate.js +32 -0
- package/dist/net/navigate.js.map +1 -0
- package/dist/net/throttle.d.ts +3 -0
- package/dist/net/throttle.d.ts.map +1 -0
- package/dist/net/throttle.js +23 -0
- package/dist/net/throttle.js.map +1 -0
- package/dist/proxy/country-map.d.ts +13 -0
- package/dist/proxy/country-map.d.ts.map +1 -0
- package/dist/proxy/country-map.js +38 -0
- package/dist/proxy/country-map.js.map +1 -0
- package/dist/server/env-defaults.d.ts +11 -0
- package/dist/server/env-defaults.d.ts.map +1 -0
- package/dist/server/env-defaults.js +20 -0
- package/dist/server/env-defaults.js.map +1 -0
- package/dist/server/map-options.d.ts +6 -0
- package/dist/server/map-options.d.ts.map +1 -0
- package/dist/server/map-options.js +43 -0
- package/dist/server/map-options.js.map +1 -0
- package/dist/server/resources.d.ts +4 -0
- package/dist/server/resources.d.ts.map +1 -0
- package/dist/server/resources.js +28 -0
- package/dist/server/resources.js.map +1 -0
- package/dist/server/result.d.ts +12 -0
- package/dist/server/result.d.ts.map +1 -0
- package/dist/server/result.js +18 -0
- package/dist/server/result.js.map +1 -0
- package/dist/server/schemas.d.ts +191 -0
- package/dist/server/schemas.d.ts.map +1 -0
- package/dist/server/schemas.js +72 -0
- package/dist/server/schemas.js.map +1 -0
- package/dist/server/server.d.ts +14 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +37 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/tools/act.d.ts +10 -0
- package/dist/server/tools/act.d.ts.map +1 -0
- package/dist/server/tools/act.js +62 -0
- package/dist/server/tools/act.js.map +1 -0
- package/dist/server/tools/connect.d.ts +10 -0
- package/dist/server/tools/connect.d.ts.map +1 -0
- package/dist/server/tools/connect.js +37 -0
- package/dist/server/tools/connect.js.map +1 -0
- package/dist/server/tools/extract-schema.d.ts +9 -0
- package/dist/server/tools/extract-schema.d.ts.map +1 -0
- package/dist/server/tools/extract-schema.js +29 -0
- package/dist/server/tools/extract-schema.js.map +1 -0
- package/dist/server/tools/extract.d.ts +9 -0
- package/dist/server/tools/extract.d.ts.map +1 -0
- package/dist/server/tools/extract.js +35 -0
- package/dist/server/tools/extract.js.map +1 -0
- package/dist/server/tools/navigate.d.ts +9 -0
- package/dist/server/tools/navigate.d.ts.map +1 -0
- package/dist/server/tools/navigate.js +27 -0
- package/dist/server/tools/navigate.js.map +1 -0
- package/dist/server/tools/probe.d.ts +8 -0
- package/dist/server/tools/probe.d.ts.map +1 -0
- package/dist/server/tools/probe.js +44 -0
- package/dist/server/tools/probe.js.map +1 -0
- package/dist/server/tools/run.d.ts +10 -0
- package/dist/server/tools/run.d.ts.map +1 -0
- package/dist/server/tools/run.js +30 -0
- package/dist/server/tools/run.js.map +1 -0
- package/dist/server/tools/screenshot.d.ts +10 -0
- package/dist/server/tools/screenshot.d.ts.map +1 -0
- package/dist/server/tools/screenshot.js +26 -0
- package/dist/server/tools/screenshot.js.map +1 -0
- package/dist/server/tools/session.d.ts +9 -0
- package/dist/server/tools/session.d.ts.map +1 -0
- package/dist/server/tools/session.js +33 -0
- package/dist/server/tools/session.js.map +1 -0
- package/dist/server/tools/snapshot.d.ts +12 -0
- package/dist/server/tools/snapshot.d.ts.map +1 -0
- package/dist/server/tools/snapshot.js +59 -0
- package/dist/server/tools/snapshot.js.map +1 -0
- package/dist/server/tools/wait.d.ts +9 -0
- package/dist/server/tools/wait.d.ts.map +1 -0
- package/dist/server/tools/wait.js +32 -0
- package/dist/server/tools/wait.js.map +1 -0
- package/dist/server/tools/with-session.d.ts +10 -0
- package/dist/server/tools/with-session.d.ts.map +1 -0
- package/dist/server/tools/with-session.js +16 -0
- package/dist/server/tools/with-session.js.map +1 -0
- package/dist/session/manager.d.ts +39 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +76 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/session.d.ts +28 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +51 -0
- package/dist/session/session.js.map +1 -0
- package/dist/state/dom-signature.d.ts +8 -0
- package/dist/state/dom-signature.d.ts.map +1 -0
- package/dist/state/dom-signature.js +13 -0
- package/dist/state/dom-signature.js.map +1 -0
- package/dist/state/realtime.d.ts +11 -0
- package/dist/state/realtime.d.ts.map +1 -0
- package/dist/state/realtime.js +34 -0
- package/dist/state/realtime.js.map +1 -0
- package/dist/state/replay.d.ts +4 -0
- package/dist/state/replay.d.ts.map +1 -0
- package/dist/state/replay.js +21 -0
- package/dist/state/replay.js.map +1 -0
- package/dist/state/site-memory.d.ts +35 -0
- package/dist/state/site-memory.d.ts.map +1 -0
- package/dist/state/site-memory.js +56 -0
- package/dist/state/site-memory.js.map +1 -0
- package/package.json +70 -0
- package/proxies.example.json +9 -0
- package/scripts/postinstall.mjs +24 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const AMOUNT = "([0-9][0-9'’.,]*)";
|
|
2
|
+
/** [currency code, regex prefix alternative]. Order matters: generic $ goes last. */
|
|
3
|
+
const CURRENCY_PREFIXES = [
|
|
4
|
+
["CHF", "CHF|Fr\\.?|SFr\\.?"],
|
|
5
|
+
["CAD", "CAD|CA\\$|C\\$"],
|
|
6
|
+
["AUD", "AUD|A\\$"],
|
|
7
|
+
["NZD", "NZD|NZ\\$"],
|
|
8
|
+
["SGD", "SGD|S\\$"],
|
|
9
|
+
["HKD", "HKD|HK\\$"],
|
|
10
|
+
["BRL", "BRL|R\\$"],
|
|
11
|
+
["MXN", "MXN|Mex\\$"],
|
|
12
|
+
["GBP", "GBP|£"],
|
|
13
|
+
["EUR", "EUR|€"],
|
|
14
|
+
["JPY", "JPY|¥"],
|
|
15
|
+
["CNY", "CNY|CN¥|RMB|元"],
|
|
16
|
+
["KRW", "KRW|₩"],
|
|
17
|
+
["INR", "INR|₹"],
|
|
18
|
+
["AED", "AED|د\\.إ"],
|
|
19
|
+
["SAR", "SAR|ر\\.س"],
|
|
20
|
+
["NOK", "NOK|kr"],
|
|
21
|
+
["SEK", "SEK|kr"],
|
|
22
|
+
["DKK", "DKK|kr"],
|
|
23
|
+
["PLN", "PLN|zł"],
|
|
24
|
+
["CZK", "CZK|Kč"],
|
|
25
|
+
["ILS", "ILS|₪"],
|
|
26
|
+
["ZAR", "ZAR|(?<![A-Za-z])R"],
|
|
27
|
+
["USD", "USD|US\\$|\\$"],
|
|
28
|
+
];
|
|
29
|
+
const PATTERNS = CURRENCY_PREFIXES.map(([currency, prefix]) => [
|
|
30
|
+
currency,
|
|
31
|
+
new RegExp(`(?:${prefix})\\s*${AMOUNT}`, "gi"),
|
|
32
|
+
]);
|
|
33
|
+
const SKIP_WORDS = ["restaurant", "parking", "breakfast", "déjeuner"];
|
|
34
|
+
/** Normalize a raw amount: float when it has decimals, otherwise integer (separators stripped). */
|
|
35
|
+
export function normaliseAmount(raw) {
|
|
36
|
+
const cleaned = raw.replace(/['’]/g, "");
|
|
37
|
+
if (/[.,]\d{2}$/.test(cleaned))
|
|
38
|
+
return Number(cleaned.replace(/,/g, ""));
|
|
39
|
+
return Number(cleaned.replace(/,/g, "").replace(/\./g, ""));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Extract visible prices, skipping ranges (e.g. "20–30") and irrelevant lines
|
|
43
|
+
* (restaurant, parking…). Deduplicates by currency+amount.
|
|
44
|
+
*/
|
|
45
|
+
export function extractPrices(text) {
|
|
46
|
+
const prices = [];
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
const lines = text.split("\n");
|
|
49
|
+
lines.forEach((line, lineNo) => {
|
|
50
|
+
if ((line.includes("–") || line.includes("-")) && /\d\s*[-–]\s*\d/.test(line))
|
|
51
|
+
return;
|
|
52
|
+
const lowered = line.toLowerCase();
|
|
53
|
+
if (SKIP_WORDS.some((w) => lowered.includes(w)))
|
|
54
|
+
return;
|
|
55
|
+
for (const [currency, pattern] of PATTERNS) {
|
|
56
|
+
for (const match of line.matchAll(pattern)) {
|
|
57
|
+
const amount = normaliseAmount(match[1]);
|
|
58
|
+
const key = `${currency}:${amount}`;
|
|
59
|
+
if (seen.has(key))
|
|
60
|
+
continue;
|
|
61
|
+
seen.add(key);
|
|
62
|
+
prices.push({ currency, amount, line: line.trim(), lineNo });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return prices;
|
|
67
|
+
}
|
|
68
|
+
/** First price of a line, or null. */
|
|
69
|
+
export function parseSinglePrice(line) {
|
|
70
|
+
const prices = extractPrices(line);
|
|
71
|
+
const first = prices[0];
|
|
72
|
+
return first ? { currency: first.currency, amount: first.amount } : null;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=prices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prices.js","sourceRoot":"","sources":["../../src/extraction/prices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff two interactive snapshots to report what changed after an action,
|
|
3
|
+
* so an agent sees the *effect* of its action without a full re-snapshot.
|
|
4
|
+
* Pure and testable (no browser).
|
|
5
|
+
* @module extraction/snapshot-diff
|
|
6
|
+
*/
|
|
7
|
+
import type { InteractiveElement } from "../interfaces/extraction.js";
|
|
8
|
+
/** A ref whose visible text changed between two snapshots. */
|
|
9
|
+
export interface TextChange {
|
|
10
|
+
index: number;
|
|
11
|
+
before: string;
|
|
12
|
+
after: string;
|
|
13
|
+
}
|
|
14
|
+
/** Summary of what changed between a before/after snapshot pair. */
|
|
15
|
+
export interface SnapshotDiff {
|
|
16
|
+
added: InteractiveElement[];
|
|
17
|
+
removed: InteractiveElement[];
|
|
18
|
+
textChanged: TextChange[];
|
|
19
|
+
urlChanged: boolean;
|
|
20
|
+
changed: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compute the diff between `before` and `after` snapshots. Add/remove AND text
|
|
24
|
+
* changes are matched by the structural key (not the positional index), so the
|
|
25
|
+
* result stays correct when the DOM reorders.
|
|
26
|
+
*/
|
|
27
|
+
export declare function diffSnapshots(before: InteractiveElement[], after: InteractiveElement[], urlChanged?: boolean): SnapshotDiff;
|
|
28
|
+
//# sourceMappingURL=snapshot-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-diff.d.ts","sourceRoot":"","sources":["../../src/extraction/snapshot-diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,8DAA8D;AAC9D,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oEAAoE;AACpE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAYD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,kBAAkB,EAAE,EAC5B,KAAK,EAAE,kBAAkB,EAAE,EAC3B,UAAU,UAAQ,GACjB,YAAY,CAiBd"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural identity key, excluding `text` and the volatile positional
|
|
3
|
+
* `index`. A pure text change keeps the same key, so it surfaces via
|
|
4
|
+
* `textChanged` (matched on this key too) rather than as a false add+remove,
|
|
5
|
+
* and reordered elements no longer produce spurious text diffs.
|
|
6
|
+
*/
|
|
7
|
+
function keyOf(el) {
|
|
8
|
+
return `${el.tag}#${el.id ?? ""}|${el.name ?? ""}|${el.href ?? ""}|${el.type ?? ""}`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Compute the diff between `before` and `after` snapshots. Add/remove AND text
|
|
12
|
+
* changes are matched by the structural key (not the positional index), so the
|
|
13
|
+
* result stays correct when the DOM reorders.
|
|
14
|
+
*/
|
|
15
|
+
export function diffSnapshots(before, after, urlChanged = false) {
|
|
16
|
+
const beforeByKey = new Map(before.map((el) => [keyOf(el), el]));
|
|
17
|
+
const afterByKey = new Map(after.map((el) => [keyOf(el), el]));
|
|
18
|
+
const added = after.filter((el) => !beforeByKey.has(keyOf(el)));
|
|
19
|
+
const removed = before.filter((el) => !afterByKey.has(keyOf(el)));
|
|
20
|
+
const textChanged = [];
|
|
21
|
+
for (const [key, el] of afterByKey) {
|
|
22
|
+
const prev = beforeByKey.get(key);
|
|
23
|
+
if (prev && prev.text !== el.text) {
|
|
24
|
+
textChanged.push({ index: el.index, before: prev.text, after: el.text });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const changed = urlChanged || added.length > 0 || removed.length > 0 || textChanged.length > 0;
|
|
28
|
+
return { added, removed, textChanged, urlChanged, changed };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=snapshot-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-diff.js","sourceRoot":"","sources":["../../src/extraction/snapshot-diff.ts"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH,SAAS,KAAK,CAAC,EAAsB;IACnC,OAAO,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AACvF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA4B,EAC5B,KAA2B,EAC3B,UAAU,GAAG,KAAK;IAElB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElE,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GACX,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility-style snapshot: tag each interactive element with a stable
|
|
3
|
+
* `data-fuse-ref` and return an indexed list the LLM can reason about.
|
|
4
|
+
* The ref survives until the page re-renders, enabling deterministic
|
|
5
|
+
* `browser_act` targeting via `[data-fuse-ref="N"]`.
|
|
6
|
+
* @module extraction/snapshot
|
|
7
|
+
*/
|
|
8
|
+
import type { Page } from "playwright";
|
|
9
|
+
import type { InteractiveElement } from "../interfaces/extraction.js";
|
|
10
|
+
/** Attribute injected on each interactive element to anchor a stable ref. */
|
|
11
|
+
export declare const REF_ATTRIBUTE = "data-fuse-ref";
|
|
12
|
+
/** Capture the indexed interactive snapshot, tagging each element with a ref. */
|
|
13
|
+
export declare function captureSnapshot(page: Page): Promise<InteractiveElement[]>;
|
|
14
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/extraction/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGtE,6EAA6E;AAC7E,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAqB7C,iFAAiF;AACjF,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE/E"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { evalScript } from "../lib/evaluate.js";
|
|
2
|
+
/** Attribute injected on each interactive element to anchor a stable ref. */
|
|
3
|
+
export const REF_ATTRIBUTE = "data-fuse-ref";
|
|
4
|
+
const SNAPSHOT_SCRIPT = `() => [...document.querySelectorAll('button,a,input,select,textarea,[role=button]')]
|
|
5
|
+
.slice(0, 120)
|
|
6
|
+
.map((el, index) => {
|
|
7
|
+
el.setAttribute('${REF_ATTRIBUTE}', String(index));
|
|
8
|
+
const rect = el.getBoundingClientRect();
|
|
9
|
+
return {
|
|
10
|
+
index,
|
|
11
|
+
tag: el.tagName.toLowerCase(),
|
|
12
|
+
text: (el.innerText || el.value || el.getAttribute('aria-label') || el.getAttribute('placeholder') || '').trim().slice(0, 120),
|
|
13
|
+
role: el.getAttribute('role'),
|
|
14
|
+
id: el.id || null,
|
|
15
|
+
name: el.getAttribute('name'),
|
|
16
|
+
type: el.getAttribute('type'),
|
|
17
|
+
href: el.getAttribute('href'),
|
|
18
|
+
visible: rect.width > 0 && rect.height > 0,
|
|
19
|
+
box: {x: Math.round(rect.x), y: Math.round(rect.y), width: Math.round(rect.width), height: Math.round(rect.height)}
|
|
20
|
+
};
|
|
21
|
+
})`;
|
|
22
|
+
/** Capture the indexed interactive snapshot, tagging each element with a ref. */
|
|
23
|
+
export async function captureSnapshot(page) {
|
|
24
|
+
return evalScript(page, SNAPSHOT_SCRIPT);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/extraction/snapshot.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,MAAM,eAAe,GAAG;;;uBAGD,aAAa;;;;;;;;;;;;;;KAc/B,CAAC;AAEN,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU;IAC9C,OAAO,UAAU,CAAuB,IAAI,EAAE,eAAe,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-based structured extraction: the caller provides a field map
|
|
3
|
+
* (field -> { selector, attr?, all?, abs? }) and gets typed data pulled from
|
|
4
|
+
* the live DOM. Deterministic, no LLM. Works on Next.js/SPA pages because it
|
|
5
|
+
* reads the rendered DOM after hydration, not the HTML source.
|
|
6
|
+
* @module extraction/structured
|
|
7
|
+
*/
|
|
8
|
+
import type { Page } from "playwright";
|
|
9
|
+
/** How to extract one field from the page. */
|
|
10
|
+
export interface FieldSpec {
|
|
11
|
+
/** CSS selector to locate the element(s). */
|
|
12
|
+
selector: string;
|
|
13
|
+
/** Attribute to read; omit to read trimmed innerText. */
|
|
14
|
+
attr?: string;
|
|
15
|
+
/** When true, return an array from querySelectorAll instead of the first match. */
|
|
16
|
+
all?: boolean;
|
|
17
|
+
/** When true, read the IDL property (e.g. el.href) for absolute URLs. */
|
|
18
|
+
abs?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** A field map: result key -> extraction spec. */
|
|
21
|
+
export type ExtractionSchema = Record<string, FieldSpec>;
|
|
22
|
+
/** Extracted value: string, null, or an array thereof. */
|
|
23
|
+
export type ExtractedValue = string | null | Array<string | null>;
|
|
24
|
+
/** Read `schema` fields from the page's live DOM into a typed record. */
|
|
25
|
+
export declare function extractStructured(page: Page, schema: ExtractionSchema): Promise<Record<string, ExtractedValue>>;
|
|
26
|
+
//# sourceMappingURL=structured.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured.d.ts","sourceRoot":"","sources":["../../src/extraction/structured.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,8CAA8C;AAC9C,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEzD,0DAA0D;AAC1D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAyBlE,yEAAyE;AACzE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAEzC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { evalScriptArg } from "../lib/evaluate.js";
|
|
2
|
+
// Browser-side reader. `selector` is passed as data (no string interpolation),
|
|
3
|
+
// so it cannot inject code; an invalid selector throws and is caught per field.
|
|
4
|
+
const READ_SCRIPT = `(fields) => {
|
|
5
|
+
const read = (el, f) => {
|
|
6
|
+
if (!el) return null;
|
|
7
|
+
if (f.abs && f.attr) return el[f.attr] ?? null;
|
|
8
|
+
if (f.attr) return el.getAttribute(f.attr);
|
|
9
|
+
return (el.innerText || '').trim() || null;
|
|
10
|
+
};
|
|
11
|
+
const out = {};
|
|
12
|
+
for (const key in fields) {
|
|
13
|
+
const f = fields[key];
|
|
14
|
+
try {
|
|
15
|
+
out[key] = f.all
|
|
16
|
+
? [...document.querySelectorAll(f.selector)].map((el) => read(el, f))
|
|
17
|
+
: read(document.querySelector(f.selector), f);
|
|
18
|
+
} catch {
|
|
19
|
+
out[key] = null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}`;
|
|
24
|
+
/** Read `schema` fields from the page's live DOM into a typed record. */
|
|
25
|
+
export async function extractStructured(page, schema) {
|
|
26
|
+
return evalScriptArg(page, READ_SCRIPT, schema);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=structured.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured.js","sourceRoot":"","sources":["../../src/extraction/structured.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAoBnD,+EAA+E;AAC/E,gFAAgF;AAChF,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;EAmBlB,CAAC;AAEH,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAU,EACV,MAAwB;IAExB,OAAO,aAAa,CAAmD,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visual observation: interactive elements with positions + viewport.
|
|
3
|
+
* @module extraction/visual
|
|
4
|
+
*/
|
|
5
|
+
import type { Page } from "playwright";
|
|
6
|
+
import type { Visual } from "../interfaces/extraction.js";
|
|
7
|
+
/** Capture the list of visible interactive elements and their boxes. */
|
|
8
|
+
export declare function visualObservation(page: Page, screenshotPath: string): Promise<Visual>;
|
|
9
|
+
//# sourceMappingURL=visual.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual.d.ts","sourceRoot":"","sources":["../../src/extraction/visual.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAsB,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAqB9E,wEAAwE;AACxE,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { VIEWPORT } from "../engine/context.js";
|
|
2
|
+
import { evalScript } from "../lib/evaluate.js";
|
|
3
|
+
const INTERACTIVE_SCRIPT = `() => [...document.querySelectorAll('button,a,input,select,textarea,[role=button]')]
|
|
4
|
+
.slice(0, 80)
|
|
5
|
+
.map((el, index) => {
|
|
6
|
+
const rect = el.getBoundingClientRect();
|
|
7
|
+
return {
|
|
8
|
+
index,
|
|
9
|
+
tag: el.tagName.toLowerCase(),
|
|
10
|
+
text: (el.innerText || el.value || el.getAttribute('aria-label') || '').trim(),
|
|
11
|
+
role: el.getAttribute('role'),
|
|
12
|
+
id: el.id || null,
|
|
13
|
+
name: el.getAttribute('name'),
|
|
14
|
+
type: el.getAttribute('type'),
|
|
15
|
+
href: el.getAttribute('href'),
|
|
16
|
+
visible: rect.width > 0 && rect.height > 0,
|
|
17
|
+
box: {x: Math.round(rect.x), y: Math.round(rect.y), width: Math.round(rect.width), height: Math.round(rect.height)}
|
|
18
|
+
};
|
|
19
|
+
})`;
|
|
20
|
+
/** Capture the list of visible interactive elements and their boxes. */
|
|
21
|
+
export async function visualObservation(page, screenshotPath) {
|
|
22
|
+
const interactiveElements = await evalScript(page, INTERACTIVE_SCRIPT);
|
|
23
|
+
return {
|
|
24
|
+
screenshotPath,
|
|
25
|
+
viewport: { ...VIEWPORT },
|
|
26
|
+
interactiveElements,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=visual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual.js","sourceRoot":"","sources":["../../src/extraction/visual.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;KAgBtB,CAAC;AAEN,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAU,EAAE,cAAsB;IACxE,MAAM,mBAAmB,GAAG,MAAM,UAAU,CAAuB,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC7F,OAAO;QACL,cAAc;QACd,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE;QACzB,mBAAmB;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrails: block irreversible actions without human approval.
|
|
3
|
+
* @module guardrails/preflight
|
|
4
|
+
*/
|
|
5
|
+
/** Words that trigger a human-approval requirement (payment/booking). */
|
|
6
|
+
export declare const SENSITIVE_WORDS: RegExp;
|
|
7
|
+
/** Result of the actions preflight. */
|
|
8
|
+
export interface PreflightResult {
|
|
9
|
+
allowed: boolean;
|
|
10
|
+
reason: string;
|
|
11
|
+
blockedActions: string[];
|
|
12
|
+
}
|
|
13
|
+
/** Minimal shape of an action evaluated by the preflight. */
|
|
14
|
+
type ActionLike = {
|
|
15
|
+
type?: string;
|
|
16
|
+
target?: string;
|
|
17
|
+
text?: string;
|
|
18
|
+
} & Record<string, unknown>;
|
|
19
|
+
/**
|
|
20
|
+
* Check the actions: if one targets a sensitive operation and no human approval
|
|
21
|
+
* is provided, deny execution.
|
|
22
|
+
*/
|
|
23
|
+
export declare function preflight(actions: ActionLike[], humanApproved: boolean): PreflightResult;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/guardrails/preflight.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yEAAyE;AACzE,eAAO,MAAM,eAAe,QAC2G,CAAC;AAExI,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,6DAA6D;AAC7D,KAAK,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAM9F;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,OAAO,GAAG,eAAe,CAWxF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrails: block irreversible actions without human approval.
|
|
3
|
+
* @module guardrails/preflight
|
|
4
|
+
*/
|
|
5
|
+
/** Words that trigger a human-approval requirement (payment/booking). */
|
|
6
|
+
export const SENSITIVE_WORDS = /\b(pay|payment|checkout|card|book|booking|reserve|reservation|confirm|ticket|purchase|acheter|payer|réserver|reserver|confirmer)\b/i;
|
|
7
|
+
function targetOf(action) {
|
|
8
|
+
return String(action.target ?? action.text ?? JSON.stringify(action));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Check the actions: if one targets a sensitive operation and no human approval
|
|
12
|
+
* is provided, deny execution.
|
|
13
|
+
*/
|
|
14
|
+
export function preflight(actions, humanApproved) {
|
|
15
|
+
const blocked = [];
|
|
16
|
+
for (const action of actions) {
|
|
17
|
+
const target = targetOf(action);
|
|
18
|
+
const haystack = `${action.type ?? ""} ${target}`;
|
|
19
|
+
if (SENSITIVE_WORDS.test(haystack))
|
|
20
|
+
blocked.push(target);
|
|
21
|
+
}
|
|
22
|
+
if (blocked.length > 0 && !humanApproved) {
|
|
23
|
+
return { allowed: false, reason: "human_approval_required", blockedActions: blocked };
|
|
24
|
+
}
|
|
25
|
+
return { allowed: true, reason: "ok", blockedActions: [] };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/guardrails/preflight.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAC1B,qIAAqI,CAAC;AAYxI,SAAS,QAAQ,CAAC,MAAkB;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAqB,EAAE,aAAsB;IACrE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;QAClD,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;IACxF,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profils d'identité par pays : locale, devise, fuseau, géoloc, Accept-Language.
|
|
3
|
+
* @module identity/country-profiles
|
|
4
|
+
*/
|
|
5
|
+
import type { CountryProfile } from "../interfaces/types.js";
|
|
6
|
+
/** User-agent desktop réaliste (Chrome stable). */
|
|
7
|
+
export declare const REALISTIC_DESKTOP_UA: string;
|
|
8
|
+
/** Profils indexés par code pays (majuscules). */
|
|
9
|
+
export declare const COUNTRY_PROFILES: Record<string, CountryProfile>;
|
|
10
|
+
/** Inverse locale -> code pays (pour inférer le pays depuis une locale). */
|
|
11
|
+
export declare const LOCALE_COUNTRY_HINTS: Record<string, string>;
|
|
12
|
+
//# sourceMappingURL=country-profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"country-profiles.d.ts","sourceRoot":"","sources":["../../src/identity/country-profiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,QAGC,CAAC;AAwDnC,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAE3D,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEvD,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** User-agent desktop réaliste (Chrome stable). */
|
|
2
|
+
export const REALISTIC_DESKTOP_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
|
|
3
|
+
"AppleWebKit/537.36 (KHTML, like Gecko) " +
|
|
4
|
+
"Chrome/125.0.0.0 Safari/537.36";
|
|
5
|
+
const ROWS = [
|
|
6
|
+
["CH", "fr-CH", "CHF", "Europe/Zurich", 46.5197, 6.6323],
|
|
7
|
+
["US", "en-US", "USD", "America/New_York", 40.7128, -74.006, "en-US,en;q=0.9"],
|
|
8
|
+
["GB", "en-GB", "GBP", "Europe/London", 51.5074, -0.1278, "en-GB,en;q=0.9"],
|
|
9
|
+
["UK", "en-GB", "GBP", "Europe/London", 51.5074, -0.1278, "en-GB,en;q=0.9"],
|
|
10
|
+
["FR", "fr-FR", "EUR", "Europe/Paris", 48.8566, 2.3522],
|
|
11
|
+
["DE", "de-DE", "EUR", "Europe/Berlin", 52.52, 13.405],
|
|
12
|
+
["IT", "it-IT", "EUR", "Europe/Rome", 41.9028, 12.4964],
|
|
13
|
+
["ES", "es-ES", "EUR", "Europe/Madrid", 40.4168, -3.7038],
|
|
14
|
+
["PT", "pt-PT", "EUR", "Europe/Lisbon", 38.7223, -9.1393],
|
|
15
|
+
["NL", "nl-NL", "EUR", "Europe/Amsterdam", 52.3676, 4.9041],
|
|
16
|
+
["BE", "fr-BE", "EUR", "Europe/Brussels", 50.8503, 4.3517],
|
|
17
|
+
["AT", "de-AT", "EUR", "Europe/Vienna", 48.2082, 16.3738],
|
|
18
|
+
["IE", "en-IE", "EUR", "Europe/Dublin", 53.3498, -6.2603],
|
|
19
|
+
["LU", "fr-LU", "EUR", "Europe/Luxembourg", 49.6116, 6.1319],
|
|
20
|
+
["NO", "nb-NO", "NOK", "Europe/Oslo", 59.9139, 10.7522],
|
|
21
|
+
["SE", "sv-SE", "SEK", "Europe/Stockholm", 59.3293, 18.0686],
|
|
22
|
+
["DK", "da-DK", "DKK", "Europe/Copenhagen", 55.6761, 12.5683],
|
|
23
|
+
["PL", "pl-PL", "PLN", "Europe/Warsaw", 52.2297, 21.0122],
|
|
24
|
+
["CZ", "cs-CZ", "CZK", "Europe/Prague", 50.0755, 14.4378],
|
|
25
|
+
["CA", "en-CA", "CAD", "America/Toronto", 43.6532, -79.3832, "en-CA,en;q=0.9,fr;q=0.8"],
|
|
26
|
+
["MX", "es-MX", "MXN", "America/Mexico_City", 19.4326, -99.1332],
|
|
27
|
+
["BR", "pt-BR", "BRL", "America/Sao_Paulo", -23.5505, -46.6333],
|
|
28
|
+
["AR", "es-AR", "ARS", "America/Argentina/Buenos_Aires", -34.6037, -58.3816],
|
|
29
|
+
["CL", "es-CL", "CLP", "America/Santiago", -33.4489, -70.6693],
|
|
30
|
+
["CO", "es-CO", "COP", "America/Bogota", 4.711, -74.0721],
|
|
31
|
+
["AU", "en-AU", "AUD", "Australia/Sydney", -33.8688, 151.2093, "en-AU,en;q=0.9"],
|
|
32
|
+
["NZ", "en-NZ", "NZD", "Pacific/Auckland", -36.8509, 174.7645, "en-NZ,en;q=0.9"],
|
|
33
|
+
["JP", "ja-JP", "JPY", "Asia/Tokyo", 35.6762, 139.6503],
|
|
34
|
+
["KR", "ko-KR", "KRW", "Asia/Seoul", 37.5665, 126.978],
|
|
35
|
+
["CN", "zh-CN", "CNY", "Asia/Shanghai", 31.2304, 121.4737],
|
|
36
|
+
["HK", "zh-HK", "HKD", "Asia/Hong_Kong", 22.3193, 114.1694, "zh-HK,zh;q=0.9,en;q=0.8"],
|
|
37
|
+
["SG", "en-SG", "SGD", "Asia/Singapore", 1.3521, 103.8198, "en-SG,en;q=0.9,zh;q=0.8"],
|
|
38
|
+
["IN", "en-IN", "INR", "Asia/Kolkata", 28.6139, 77.209, "en-IN,en;q=0.9,hi;q=0.8"],
|
|
39
|
+
["AE", "en-AE", "AED", "Asia/Dubai", 25.2048, 55.2708, "en-AE,en;q=0.9,ar;q=0.8"],
|
|
40
|
+
["SA", "ar-SA", "SAR", "Asia/Riyadh", 24.7136, 46.6753],
|
|
41
|
+
["IL", "he-IL", "ILS", "Asia/Jerusalem", 31.7683, 35.2137, "he-IL,he;q=0.9,en;q=0.8"],
|
|
42
|
+
["ZA", "en-ZA", "ZAR", "Africa/Johannesburg", -26.2041, 28.0473, "en-ZA,en;q=0.9"],
|
|
43
|
+
];
|
|
44
|
+
function toProfile([, locale, currency, timezoneId, lat, lon, accept]) {
|
|
45
|
+
const primary = locale.split("-", 1)[0];
|
|
46
|
+
return {
|
|
47
|
+
locale,
|
|
48
|
+
currency,
|
|
49
|
+
timezoneId,
|
|
50
|
+
geolocation: { latitude: lat, longitude: lon },
|
|
51
|
+
acceptLanguage: accept ?? `${locale},${primary};q=0.9,en;q=0.8`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Profils indexés par code pays (majuscules). */
|
|
55
|
+
export const COUNTRY_PROFILES = Object.fromEntries(ROWS.map((row) => [row[0], toProfile(row)]));
|
|
56
|
+
/** Inverse locale -> code pays (pour inférer le pays depuis une locale). */
|
|
57
|
+
export const LOCALE_COUNTRY_HINTS = Object.fromEntries(Object.entries(COUNTRY_PROFILES).map(([code, p]) => [p.locale, code]));
|
|
58
|
+
//# sourceMappingURL=country-profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"country-profiles.js","sourceRoot":"","sources":["../../src/identity/country-profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Construction du rapport d'identité + masquage des credentials proxy.
|
|
3
|
+
* @module identity/identity
|
|
4
|
+
*/
|
|
5
|
+
import type { Identity } from "../interfaces/report.js";
|
|
6
|
+
import type { ResolvedIdentity } from "./resolve.js";
|
|
7
|
+
/** Masque user:password dans une URL de proxy pour les rapports. */
|
|
8
|
+
export declare function redactProxyUrl(proxyUrl: string | null | undefined): string | null;
|
|
9
|
+
/** Entrée pour construire le rapport d'identité. */
|
|
10
|
+
export interface IdentityInput {
|
|
11
|
+
identity: ResolvedIdentity;
|
|
12
|
+
realisticProfile: boolean;
|
|
13
|
+
userDataDir: string | null;
|
|
14
|
+
proxyUrl: string | null;
|
|
15
|
+
proxySource: string | null;
|
|
16
|
+
}
|
|
17
|
+
/** Assemble le rapport d'identité exposé dans les probes. */
|
|
18
|
+
export declare function buildIdentity(input: IdentityInput): Identity;
|
|
19
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/identity/identity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAOjF;AAED,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,CAkB5D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Masque user:password dans une URL de proxy pour les rapports. */
|
|
2
|
+
export function redactProxyUrl(proxyUrl) {
|
|
3
|
+
if (!proxyUrl || !proxyUrl.includes("@"))
|
|
4
|
+
return proxyUrl ?? null;
|
|
5
|
+
const [scheme, rest] = proxyUrl.includes("://")
|
|
6
|
+
? proxyUrl.split("://", 2)
|
|
7
|
+
: ["", proxyUrl];
|
|
8
|
+
const host = rest.split("@").pop() ?? rest;
|
|
9
|
+
return scheme ? `${scheme}://***:***@${host}` : `***:***@${host}`;
|
|
10
|
+
}
|
|
11
|
+
/** Assemble le rapport d'identité exposé dans les probes. */
|
|
12
|
+
export function buildIdentity(input) {
|
|
13
|
+
const { identity, proxyUrl, proxySource } = input;
|
|
14
|
+
return {
|
|
15
|
+
countryCode: identity.countryCode,
|
|
16
|
+
locale: identity.locale,
|
|
17
|
+
timezoneId: identity.timezoneId,
|
|
18
|
+
currency: identity.currency,
|
|
19
|
+
geolocation: identity.geolocation,
|
|
20
|
+
acceptLanguage: identity.acceptLanguage,
|
|
21
|
+
realisticProfile: input.realisticProfile,
|
|
22
|
+
persistentProfile: Boolean(input.userDataDir),
|
|
23
|
+
userDataDir: input.userDataDir,
|
|
24
|
+
proxyEnabled: Boolean(proxyUrl),
|
|
25
|
+
proxyUrl: redactProxyUrl(proxyUrl),
|
|
26
|
+
proxySource,
|
|
27
|
+
proxyCountryCode: proxySource === "country_map" ? identity.countryCode : null,
|
|
28
|
+
proxyRequiredForIpAlignment: proxyUrl === null,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/identity/identity.ts"],"names":[],"mappings":"AAOA,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,QAAmC;IAChE,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,IAAI,IAAI,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC7C,CAAC,CAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAsB;QAChD,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;AACpE,CAAC;AAWD,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,KAAoB;IAChD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAClD,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,iBAAiB,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QAC7C,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC;QAC/B,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;QAClC,WAAW;QACX,gBAAgB,EAAE,WAAW,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;QAC7E,2BAA2B,EAAE,QAAQ,KAAK,IAAI;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Résolution de l'identité navigateur depuis les options.
|
|
3
|
+
* @module identity/resolve
|
|
4
|
+
*/
|
|
5
|
+
import type { CountryProfile } from "../interfaces/types.js";
|
|
6
|
+
/** Identité effective dérivée du pays + surcharges explicites. */
|
|
7
|
+
export interface ResolvedIdentity {
|
|
8
|
+
countryCode: string;
|
|
9
|
+
locale: string;
|
|
10
|
+
timezoneId: string;
|
|
11
|
+
currency: string;
|
|
12
|
+
geolocation: CountryProfile["geolocation"];
|
|
13
|
+
acceptLanguage: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Dérive locale/devise/fuseau/géoloc à partir du pays (ou de la locale),
|
|
17
|
+
* en laissant les valeurs explicites surcharger le profil pays.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveIdentity(opts: {
|
|
20
|
+
countryCode?: string;
|
|
21
|
+
locale?: string;
|
|
22
|
+
timezoneId?: string;
|
|
23
|
+
currency?: string;
|
|
24
|
+
}): ResolvedIdentity;
|
|
25
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/identity/resolve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;CACxB;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,gBAAgB,CAenB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { COUNTRY_PROFILES, LOCALE_COUNTRY_HINTS } from "./country-profiles.js";
|
|
2
|
+
const DEFAULT = COUNTRY_PROFILES.CH;
|
|
3
|
+
/**
|
|
4
|
+
* Dérive locale/devise/fuseau/géoloc à partir du pays (ou de la locale),
|
|
5
|
+
* en laissant les valeurs explicites surcharger le profil pays.
|
|
6
|
+
*/
|
|
7
|
+
export function resolveIdentity(opts) {
|
|
8
|
+
const inferred = (opts.countryCode ||
|
|
9
|
+
LOCALE_COUNTRY_HINTS[opts.locale ?? ""] ||
|
|
10
|
+
"CH").toUpperCase();
|
|
11
|
+
const profile = COUNTRY_PROFILES[inferred] ?? DEFAULT;
|
|
12
|
+
return {
|
|
13
|
+
countryCode: inferred,
|
|
14
|
+
locale: opts.locale || profile.locale,
|
|
15
|
+
timezoneId: opts.timezoneId || profile.timezoneId,
|
|
16
|
+
currency: (opts.currency || profile.currency).toUpperCase(),
|
|
17
|
+
geolocation: { ...profile.geolocation },
|
|
18
|
+
acceptLanguage: profile.acceptLanguage,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/identity/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAY/E,MAAM,OAAO,GAAmB,gBAAgB,CAAC,EAAoB,CAAC;AAEtE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAK/B;IACC,MAAM,QAAQ,GAAG,CACf,IAAI,CAAC,WAAW;QAChB,oBAAoB,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACvC,IAAI,CACL,CAAC,WAAW,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC;IACtD,OAAO;QACL,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;QACrC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU;QACjD,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;QAC3D,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE;QACvC,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API of the fuse-browser package.
|
|
3
|
+
* @module index
|
|
4
|
+
*/
|
|
5
|
+
export { BrowserAgent } from "./agent/browser-agent.js";
|
|
6
|
+
export { compactReport } from "./agent/compact.js";
|
|
7
|
+
export { resolveConfig, type ResolvedConfig } from "./agent/config.js";
|
|
8
|
+
export { createServer, type BuiltServer } from "./server/server.js";
|
|
9
|
+
export { SessionManager } from "./session/manager.js";
|
|
10
|
+
export type { ProbeReport } from "./interfaces/report.js";
|
|
11
|
+
export type { AgentOptions, BrowserAction, ProbeOptions } from "./interfaces/types.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API of the fuse-browser package.
|
|
3
|
+
* @module index
|
|
4
|
+
*/
|
|
5
|
+
export { BrowserAgent } from "./agent/browser-agent.js";
|
|
6
|
+
export { compactReport } from "./agent/compact.js";
|
|
7
|
+
export { resolveConfig } from "./agent/config.js";
|
|
8
|
+
export { createServer } from "./server/server.js";
|
|
9
|
+
export { SessionManager } from "./session/manager.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAuB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|