mcp-scraper 0.95.1 → 0.95.2
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/CHANGELOG.md +51 -39
- package/README.md +8 -6
- package/THIRD_PARTY_NOTICES.html +203 -0
- package/dist/{analytics-repository-A7VMA24D.js → analytics-repository-DZZKDZL6.js} +1 -1
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-core.js +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.js +1 -1
- package/dist/bin/paa-harvest.js +1 -1
- package/dist/{chunk-FCJXL4PU.js → chunk-6DRKDSXY.js} +1 -1
- package/dist/chunk-7XDBGQDY.js +6 -0
- package/dist/{chunk-ZPK5LYEN.js → chunk-7YOXSMHG.js} +23 -23
- package/dist/{chunk-OS4XFDIG.js → chunk-BLVBUMH5.js} +2 -2
- package/dist/{chunk-FN7U6KRI.js → chunk-ENZUJEIM.js} +1 -1
- package/dist/{chunk-MVDMZ3N2.js → chunk-GLTECY3U.js} +77 -77
- package/dist/chunk-GPSPSJBJ.js +1 -1
- package/dist/{chunk-56C243PX.js → chunk-IXJQHXDC.js} +1 -1
- package/dist/{chunk-RPA5ADXW.js → chunk-K3D2S36Q.js} +4 -4
- package/dist/{chunk-DOJMTFLB.js → chunk-KFOFU3LA.js} +1 -1
- package/dist/{chunk-ZUGTYD2I.js → chunk-LMWU7VPZ.js} +5 -5
- package/dist/{chunk-Y6STAKF3.js → chunk-M5QHXNFZ.js} +3 -3
- package/dist/{chunk-DYDAQQMC.js → chunk-MC4W6TZT.js} +3 -3
- package/dist/{chunk-YK4OAZRQ.js → chunk-O4LUUIYG.js} +1 -1
- package/dist/{chunk-ZJTUAWZA.js → chunk-OLSW4AN4.js} +1 -1
- package/dist/{chunk-QQ7OD7BJ.js → chunk-RLFCJGHA.js} +1 -1
- package/dist/{chunk-L552AQQY.js → chunk-T4VTJNDZ.js} +1 -1
- package/dist/{chunk-NA76FFGD.js → chunk-VREXSMC6.js} +15 -15
- package/dist/chunk-VXOXB3IB.js +1 -0
- package/dist/chunk-WO46LTBW.js +1 -0
- package/dist/{chunk-AK6HVF5F.js → chunk-XG6GCEUE.js} +1 -1
- package/dist/chunk-XPEJB4BZ.js +1 -1
- package/dist/{chunk-I3HNHCIJ.js → chunk-Y3Q4FIKK.js} +2 -2
- package/dist/{chunk-DYKSPHHR.js → chunk-ZH75KWBI.js} +1 -1
- package/dist/{db-B6RNXKEI.js → db-CDEZHBRN.js} +1 -1
- package/dist/{extract-bundle-X7SRN63Y.js → extract-bundle-SXC6EWJR.js} +1 -1
- package/dist/{gmail-service-FZVJBSUT.js → gmail-service-EWR76XE7.js} +1 -1
- package/dist/index.cjs +21 -21
- package/dist/index.d.cts +14 -14
- package/dist/index.d.ts +14 -14
- package/dist/index.js +1 -1
- package/dist/{lead-list-enrichment-repository-SXYSS7ZX.js → lead-list-enrichment-repository-SIWGXWQV.js} +1 -1
- package/dist/{location-data-repository-NWWKDYG6.js → location-data-repository-A2QZVP7O.js} +1 -1
- package/dist/{operation-metering-OBKSWJVJ.js → operation-metering-UJ53YX7S.js} +1 -1
- package/dist/{server-JV6L7F2X.js → server-QVEKDIDQ.js} +369 -369
- package/dist/{site-extract-repository-UVE7TWJO.js → site-extract-repository-23ND4N77.js} +1 -1
- package/dist/{stripe-event-worker-2LSUVQOM.js → stripe-event-worker-LPXTITVC.js} +1 -1
- package/dist/worker-EDN2TJH3.js +1 -0
- package/package.json +17 -137
- package/dist/chunk-6NE4OIXR.js +0 -6
- package/dist/chunk-NZSDHDX3.js +0 -1
- package/dist/chunk-YWUNN24S.js +0 -1
- package/dist/worker-XPIO5TAV.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as s,B as t,C as u,D as v,E as w,F as x,G as y,H as z,I as A,J as B,K as C,L as D,M as E,i as a,j as b,k as c,l as d,m as e,n as f,o as g,p as h,q as i,r as j,s as k,t as l,u as m,v as n,w as o,x as p,y as q,z as r}from"./chunk-
|
|
1
|
+
import{A as s,B as t,C as u,D as v,E as w,F as x,G as y,H as z,I as A,J as B,K as C,L as D,M as E,i as a,j as b,k as c,l as d,m as e,n as f,o as g,p as h,q as i,r as j,s as k,t as l,u as m,v as n,w as o,x as p,y as q,z as r}from"./chunk-6DRKDSXY.js";import"./chunk-TMB56NCA.js";import"./chunk-EDQ57S4P.js";import"./chunk-7YOXSMHG.js";export{a as XRAY_ENTITLED_EXTRACT_BILLING_CLASS,q as abandonExtractSettlement,p as claimFailedExtractJobForRefinalize,z as completeExtractJob,w as countSuccessfulPages,d as createExtractJob,f as createOrGetExtractJob,b as extractJobLimitInfo,A as failExtractJob,o as failStaleRunningExtractJob,B as failUnfundedExtractJob,E as finalizeXRayEntitledExtractJobCharge,y as finishExtractJob,g as getExtractJob,e as getExtractJobByIdempotencyKey,v as getExtractedImageLinks,u as getExtractedPages,x as getExtractedUrls,h as listExtractJobs,t as listExtractPages,j as listFundedPendingExtractJobs,n as listStaleRunningExtractJobs,i as listUnsettledExtractJobs,k as markExtractJobDispatchAttempt,l as recordExtractJobDispatchFailure,m as recordExtractSettlementFailure,s as saveExtractPages,C as setExtractJobPublicError,r as setExtractJobTotal,D as settleExtractJob,c as terminalExtractJobStatus};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{fb as S,hb as h}from"./chunk-
|
|
1
|
+
import{fb as S,hb as h}from"./chunk-Y3Q4FIKK.js";import"./chunk-OLSW4AN4.js";import"./chunk-IXJQHXDC.js";import"./chunk-T4VTJNDZ.js";import"./chunk-YGBTTW5D.js";import"./chunk-EDQ57S4P.js";import"./chunk-VREXSMC6.js";import"./chunk-6DTXIZY2.js";import{I as d,J as u,K as l,L as f,M as v}from"./chunk-7YOXSMHG.js";var g=12;function b(e){return e&&typeof e=="object"&&"code"in e&&typeof e.code=="string"?e.code:e instanceof Error?e.name:"unknown_error"}function k(e){return Math.min(21600,30*2**Math.max(0,e-1))}async function x(e={}){let w=e.stripeClient??S,E=Math.max(1,Math.min(100,e.limit??100)),r=500,i=0,s=0,c=0,m=0;for(;i<r;){let a=await d(Math.min(E,r-i),e.leaseSeconds??300);if(a.length===0)break;i+=a.length;for(let t of a)try{let n=await w.events.retrieve(t.eventId);await h(n),await u(t.eventId,t.token)&&(s+=1)}catch(n){let p=n instanceof Error?n.message:String(n),o=b(n);t.attemptCount>=g||o==="resource_missing"?await f(t.eventId,t.token,p,o)&&(m+=1):await l(t.eventId,t.token,p,o,k(t.attemptCount))&&(c+=1)}}return{claimed:i,processed:s,retried:c,deadLettered:m,capped:i>=r,health:await v()}}export{x as drainStripeEventQueue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as a,s as b,t as c}from"./chunk-7XDBGQDY.js";import"./chunk-XG6GCEUE.js";import"./chunk-MC4W6TZT.js";import"./chunk-M5QHXNFZ.js";import"./chunk-WO46LTBW.js";import"./chunk-LMWU7VPZ.js";import"./chunk-EDQ57S4P.js";import"./chunk-GPSPSJBJ.js";import"./chunk-VREXSMC6.js";import"./chunk-6DTXIZY2.js";import"./chunk-XPEJB4BZ.js";import"./chunk-7YOXSMHG.js";export{b as drainQueue,c as startWorker,a as tickOnce};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-scraper",
|
|
3
|
-
"version": "0.95.
|
|
3
|
+
"version": "0.95.2",
|
|
4
4
|
"description": "MCP server for MCP Scraper web intelligence tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -23,110 +23,11 @@
|
|
|
23
23
|
"mcp-scraper-install": "dist/bin/mcp-scraper-install.js",
|
|
24
24
|
"mcp-scraper-cli": "dist/bin/mcp-scraper-cli.js"
|
|
25
25
|
},
|
|
26
|
-
"files": [
|
|
27
|
-
"dist/*.js",
|
|
28
|
-
"dist/*.cjs",
|
|
29
|
-
"dist/*.d.ts",
|
|
30
|
-
"dist/*.d.cts",
|
|
31
|
-
"dist/bin/*.js",
|
|
32
|
-
"dist/editorial-reading-room/assets",
|
|
33
|
-
"public/agent-install.md",
|
|
34
|
-
"public/.well-known/xray-install.json",
|
|
35
|
-
"README.md",
|
|
36
|
-
"CHANGELOG.md"
|
|
37
|
-
],
|
|
38
|
-
"repository": {
|
|
39
|
-
"type": "git",
|
|
40
|
-
"url": "git+https://github.com/VilovietaSEO/mcp-scraper.git"
|
|
41
|
-
},
|
|
42
26
|
"homepage": "https://mcpscraper.dev",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
},
|
|
46
|
-
"scripts": {
|
|
47
|
-
"build": "tsup",
|
|
48
|
-
"build:md": "node scripts/build-md-mirror.mjs",
|
|
49
|
-
"build:mcpb": "npm run build && node scripts/build-mcpb.mjs",
|
|
50
|
-
"build:mcpb:candidate": "npm run build && node scripts/build-mcpb.mjs --candidate",
|
|
51
|
-
"build:rates": "node --import tsx scripts/gen-rates.ts",
|
|
52
|
-
"build:geotargets": "node --import tsx scripts/gen-geotargets.ts",
|
|
53
|
-
"build:blog": "node scripts/run-ts-sandbox-safe.mjs scripts/build-blog.ts",
|
|
54
|
-
"mcp:manifest": "node scripts/run-ts-sandbox-safe.mjs scripts/generate-mcp-tool-manifest.ts",
|
|
55
|
-
"mcp:cost-coverage": "node scripts/generate-operation-coverage.mjs",
|
|
56
|
-
"mcp:cost-coverage:check": "node scripts/generate-operation-coverage.mjs --check",
|
|
57
|
-
"mcp:cost-closure:check": "node scripts/verify-operation-cost-closure.mjs",
|
|
58
|
-
"mcp:paid-action-register:check": "python3 scripts/billing/verify-paid-action-register.py",
|
|
59
|
-
"paa:benchmark:dry-run": "node --import tsx scripts/paa-provider-benchmark.ts --dry-run",
|
|
60
|
-
"contracts:memory": "node --import tsx scripts/generate-memory-tool-contract.ts",
|
|
61
|
-
"contracts:memory-governed": "node --import tsx scripts/generate-governed-memory-mcp-schemas.ts",
|
|
62
|
-
"verify:crm-authority": "node --import tsx scripts/verify-crm-authority-boundary.ts",
|
|
63
|
-
"mcp:memory-image-schemas": "node scripts/generate-memory-image-mcp-schemas.mjs",
|
|
64
|
-
"mcp:measure-catalog": "node scripts/run-ts-sandbox-safe.mjs scripts/measure-mcp-catalog.ts",
|
|
65
|
-
"mcp:lint-tools": "node scripts/run-ts-sandbox-safe.mjs scripts/lint-mcp-tool-craft.ts",
|
|
66
|
-
"mcp:lint-tools:write": "node scripts/run-ts-sandbox-safe.mjs scripts/lint-mcp-tool-craft.ts --write",
|
|
67
|
-
"xray:install-contract": "node --import tsx scripts/generate-xray-install-contract.ts",
|
|
68
|
-
"xray:install-contract:check": "node --import tsx scripts/generate-xray-install-contract.ts --check",
|
|
69
|
-
"api": "node scripts/run-ts-sandbox-safe.mjs bin/api-server.ts",
|
|
70
|
-
"dev": "node scripts/run-ts-sandbox-safe.mjs src/cli.ts",
|
|
71
|
-
"test": "vitest run tests/unit tests/contract",
|
|
72
|
-
"test:live": "vitest run --config vitest.live.config.ts",
|
|
73
|
-
"test:site-similarity": "node --import tsx scripts/run-site-similarity-live.ts",
|
|
74
|
-
"reanalyze:site-similarity": "node --import tsx scripts/reanalyze-site-similarity-zip.ts",
|
|
75
|
-
"test:headless-harvest": "node scripts/run-ts-sandbox-safe.mjs tests/live/harness/headless-harvest-canary.ts",
|
|
76
|
-
"test:integration": "node scripts/run-integration-tests.mjs",
|
|
77
|
-
"test:smoke": "vitest run tests/smoke",
|
|
78
|
-
"test:stripe": "node scripts/stripe-setup-smoke.mjs",
|
|
79
|
-
"typecheck": "tsc --noEmit",
|
|
80
|
-
"test:kernel": "vitest run tests/integration/kernel.smoke.test.ts",
|
|
81
|
-
"sync:env": "bash scripts/push-env.sh",
|
|
82
|
-
"sync:env:apply": "bash scripts/push-env.sh --apply",
|
|
83
|
-
"locations:publish-geonames": "node --import tsx scripts/publish-geonames-location-data.ts",
|
|
84
|
-
"locations:sync": "node --import tsx scripts/sync-hosted-location-data.ts",
|
|
85
|
-
"integrations:migrate-scheduler": "node --import tsx scripts/migrate-scheduler-integrations.ts",
|
|
86
|
-
"test:webhook": "node scripts/test-webhook.mjs",
|
|
87
|
-
"test:e2e": "playwright test",
|
|
88
|
-
"email:preview": "node scripts/run-ts-sandbox-safe.mjs scripts/email/render-previews.ts",
|
|
89
|
-
"email:preflight": "node --import tsx scripts/email/preflight.ts",
|
|
90
|
-
"email:avatar": "node --import tsx scripts/email/generate-sender-avatar.ts",
|
|
91
|
-
"email:inbound:setup": "node --import tsx scripts/email/setup-resend-inbound.ts",
|
|
92
|
-
"email:audience": "node scripts/run-ts-sandbox-safe.mjs scripts/email/sync-resend-audience.ts",
|
|
93
|
-
"email:drafts": "node scripts/run-ts-sandbox-safe.mjs scripts/email/create-resend-drafts.ts",
|
|
94
|
-
"email:workshop-reminders": "node --import tsx scripts/email/refresh-workshop-reminders.ts",
|
|
95
|
-
"email:workshop-reminders:apply": "node --import tsx scripts/email/refresh-workshop-reminders.ts --apply",
|
|
96
|
-
"billing:preview-credit-lot-repair": "node --import tsx scripts/billing/preview-credit-lot-repair.ts",
|
|
97
|
-
"billing:apply-credit-lot-repair": "node --import tsx scripts/billing/apply-credit-lot-repair.ts",
|
|
98
|
-
"brightdata:usage": "node scripts/brightdata-usage-report.mjs",
|
|
99
|
-
"brightdata:premium-domains:refresh": "node scripts/refresh-brightdata-premium-domains.mjs",
|
|
100
|
-
"brightdata:test:bandwidth": "node --import tsx scripts/brightdata-paa-bandwidth-test.ts",
|
|
101
|
-
"db:migrate": "node --import tsx scripts/run-core-migration.ts",
|
|
102
|
-
"db:verify": "node --import tsx scripts/verify-core-schema.ts",
|
|
103
|
-
"release:server:predeploy": "npm run db:migrate && npm run db:verify && npm run version:check:core",
|
|
104
|
-
"oauth-store:migrate": "node --import tsx scripts/migrate-oauth-store.ts --apply-schema",
|
|
105
|
-
"oauth-store:verify": "node --import tsx scripts/migrate-oauth-store.ts --verify",
|
|
106
|
-
"oauth-store:test": "vitest run tests/unit/oauth-store.test.ts",
|
|
107
|
-
"oauth-store:test-remote": "OAUTH_STORE_REMOTE_REQUIRED=1 vitest run --config vitest.live.config.ts tests/live/oauth-store-remote.live.test.ts",
|
|
108
|
-
"oauth:prepare-production-canary": "node --import tsx scripts/prepare-mcp-oauth-production-canary.ts",
|
|
109
|
-
"oauth:verify-live": "node scripts/verify-mcp-oauth-live.mjs",
|
|
110
|
-
"analytics:migrate": "node --import tsx scripts/run-analytics-migration.ts",
|
|
111
|
-
"analytics:contract": "node --import tsx scripts/analytics/export-analytics-rest-contract.ts",
|
|
112
|
-
"analytics:contract:check": "node --import tsx scripts/analytics/export-analytics-rest-contract.ts --check",
|
|
113
|
-
"analytics:rollups": "node --import tsx scripts/run-analytics-rollups.ts",
|
|
114
|
-
"test:mcp-output-contract": "vitest run --config vitest.mcp-output-contract.config.ts tests/unit/golden-payloads.test.ts tests/unit/mcp-formatter-structured.test.ts tests/unit/mcp-2026-stdio.test.ts",
|
|
115
|
-
"version:check": "node scripts/verify-release-version-sync.mjs",
|
|
116
|
-
"version:check:core": "node scripts/verify-release-version-sync.mjs --core",
|
|
117
|
-
"prebuild": "npm run version:check:core",
|
|
118
|
-
"mcp:verify": "npm run xray:install-contract:check && npm run build && npm run mcp:manifest && npm run mcp:cost-coverage:check && npm run mcp:cost-closure:check && npm run mcp:paid-action-register:check && npm run version:check && npm run build:rates && npm run mcp:measure-catalog && npm run mcp:lint-tools && npm run test:mcp-output-contract && npm run typecheck && npm test && npm run package:verify-entrypoints",
|
|
119
|
-
"prepack": "npm run mcp:verify",
|
|
120
|
-
"package:verify-entrypoints": "node scripts/verify-package-entrypoints.mjs",
|
|
121
|
-
"product:install": "node scripts/run-product-command.mjs install",
|
|
122
|
-
"product:build": "node scripts/run-product-command.mjs build",
|
|
123
|
-
"product:typecheck": "node scripts/run-product-command.mjs typecheck",
|
|
124
|
-
"product:test": "node scripts/run-product-command.mjs test",
|
|
125
|
-
"product:verify-layout": "node scripts/verify-product-repository-layout.mjs",
|
|
126
|
-
"professional:verify": "node scripts/professional-verify.mjs",
|
|
127
|
-
"package:public": "npm run mcp:verify && node scripts/build-public-package.mjs",
|
|
128
|
-
"prepublishOnly": "node -e \"throw new Error('Publish the verified archive produced by npm run package:public')\""
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20.18.1"
|
|
129
29
|
},
|
|
30
|
+
"license": "ISC",
|
|
130
31
|
"dependencies": {
|
|
131
32
|
"@anthropic-ai/sdk": "^0.96.0",
|
|
132
33
|
"@fal-ai/client": "^1.10.1",
|
|
@@ -166,38 +67,17 @@
|
|
|
166
67
|
"youtube-transcript": "^1.3.1",
|
|
167
68
|
"zod": "4.4.3"
|
|
168
69
|
},
|
|
169
|
-
"
|
|
170
|
-
"
|
|
171
|
-
"
|
|
172
|
-
"
|
|
173
|
-
"
|
|
174
|
-
"
|
|
175
|
-
"
|
|
176
|
-
"
|
|
177
|
-
"
|
|
178
|
-
"
|
|
179
|
-
"
|
|
180
|
-
"
|
|
181
|
-
|
|
182
|
-
"dotenv": "^17.4.2",
|
|
183
|
-
"esbuild": "^0.27.7",
|
|
184
|
-
"fflate": "^0.7.4",
|
|
185
|
-
"jsdom": "^29.1.1",
|
|
186
|
-
"tsup": "^8.0.0",
|
|
187
|
-
"tsx": "^4.0.0",
|
|
188
|
-
"typescript": "^5.4.0",
|
|
189
|
-
"vitest": "^1.6.0",
|
|
190
|
-
"youtubei.js": "^17.0.1",
|
|
191
|
-
"@onkernel/sdk": "^0.93.0"
|
|
192
|
-
},
|
|
193
|
-
"engines": {
|
|
194
|
-
"node": ">=20.18.1"
|
|
195
|
-
},
|
|
196
|
-
"directories": {
|
|
197
|
-
"doc": "docs",
|
|
198
|
-
"test": "tests"
|
|
199
|
-
},
|
|
200
|
-
"keywords": [],
|
|
201
|
-
"author": "",
|
|
202
|
-
"license": "ISC"
|
|
70
|
+
"files": [
|
|
71
|
+
"dist/*.js",
|
|
72
|
+
"dist/*.cjs",
|
|
73
|
+
"dist/*.d.ts",
|
|
74
|
+
"dist/*.d.cts",
|
|
75
|
+
"dist/bin/*.js",
|
|
76
|
+
"dist/editorial-reading-room/assets",
|
|
77
|
+
"public/agent-install.md",
|
|
78
|
+
"public/.well-known/xray-install.json",
|
|
79
|
+
"README.md",
|
|
80
|
+
"CHANGELOG.md",
|
|
81
|
+
"THIRD_PARTY_NOTICES.html"
|
|
82
|
+
]
|
|
203
83
|
}
|
package/dist/chunk-6NE4OIXR.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{a as Dt}from"./chunk-AK6HVF5F.js";import{k as H,m as kt,n as Ot,z as ue}from"./chunk-DYDAQQMC.js";import{a as L,c as xe,d as ce,e as V,f as de,j as Me,k as Nt}from"./chunk-NZSDHDX3.js";import{b as It,c as Tt,d as $,f as z,g as B,h as U,i as Ct,k as F,n as xt,q as Mt}from"./chunk-ZUGTYD2I.js";import{a as Ne,b as De,g as qe}from"./chunk-EDQ57S4P.js";import{a as pt,b as mt}from"./chunk-GPSPSJBJ.js";import{a as Rt,b as Pt,d as Et}from"./chunk-NA76FFGD.js";import{b as St,c as At}from"./chunk-6DTXIZY2.js";import{e as dt}from"./chunk-XPEJB4BZ.js";import{Nb as le,Rb as Te,Tb as Ce,Va as Oe,b as Ee,g as M,h as gt,hb as vt,ia as bt,j as ft,ja as _t,jb as Ie,la as wt,m as ht,o as yt,oa as ke}from"./chunk-ZPK5LYEN.js";import{request as Rr}from"https";import{HttpsProxyAgent as Pr}from"https-proxy-agent";var pe={source:"https://brightdata.com/users/zone/premium_domains",retrievedAt:"2026-09-23T20:14:30.483Z",includedStatuses:["premium","remove_candidate"],domains:["advanceautoparts.com","affitto.it","agoda.cn","albertsons.com","allpeople.com","autozone.com","bestbuy.com","bestwestern.com","billiger.de","bottlerover.com","carousell.com","carousell.com.hk","carousell.com.my","carousell.ph","carousell.sg","carsales.com.au","cdiscount.com","chewy.com","costco.com","cvs.com","despegar.com.mx","dickssportinggoods.com","dynos.es","emaxme.com","familytreenow.com","feuvert.fr","flooranddecor.com","foodlion.com","footlocker.co.uk","footlocker.com","giantfoodstores.com","gopuff.com","gplay.bg","hermes.com","hyatt.com","idealo.de","immobilienscout24.de","ingatlan.com","instacart.com","intersport.fr","joann.com","kroger.com","lazada.co.id","lazada.co.th","lazada.com.my","lazada.com.ph","lazada.sg","lazada.vn","lowes.ca","lowes.com","mcmaster.com","mediamarkt.de","mediamarkt.es","medline.com","mscdirect.com","napaonline.com","nofrills.ca","peoplefinders.com","platt.com","publicdatausa.com","realcanadiansuperstore.ca","realestate.com.au","restaurantguru.com","searchpeoplefree.com","shopee.cl","shopee.co.id","shopee.co.th","shopee.com.br","shopee.com.co","shopee.com.mx","shopee.com.my","shopee.ph","shopee.sg","shopee.tw","shopee.vn","similarweb.com","skyscanner.co.kr","skyscanner.net","stopandshop.com","target.com","temu.com","ticketmaster.com","totalwine.com","tractorsupply.com","walmart.com.mx","wayfair.com","weismarkets.com","wizzair.com","worten.pt"]};var oo=pe.source,qt=pe.retrievedAt,vr=new Set(pe.domains);function Z(e){let t=new URL(e).hostname.toLowerCase().replace(/\.$/,"");for(let o of vr)if(t===o||t.endsWith(`.${o}`))return"premium";return"standard"}function ee(e){for(let t of["providerProduct","billingTier","billableEvent","unitType","source","policyVersion","effectiveAt"])if(!e[t]?.trim())throw new Error(`Provider rate ${t} is required`);if(!Number.isSafeInteger(e.numeratorUsdNanos)||e.numeratorUsdNanos<0)throw new Error("Provider rate numerator must be a non-negative safe integer");if(!Number.isSafeInteger(e.denominatorUnits)||e.denominatorUnits<1)throw new Error("Provider rate denominator must be a positive safe integer");if(Number.isNaN(Date.parse(e.effectiveAt)))throw new Error("Provider rate effectiveAt must be a date");return e}function me(e,t){if(ee(e),!Number.isSafeInteger(t)||t<0)throw new Error("Billable units must be a non-negative safe integer");let o=BigInt(e.numeratorUsdNanos)*BigInt(t),r=BigInt(e.denominatorUnits),n=(o*2n+r)/(r*2n);if(n>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("Provider amount exceeds safe integer range");return Number(n)}function Sr(){return ee({providerProduct:"brightdata_serp_api",billingTier:"payg",billableEvent:"successful_delivery",unitType:"request",numeratorUsdNanos:15e8,denominatorUnits:1e3,source:"owner_confirmed_2026-09-24;docs/decisions/2026-08-11-preserve-questions-only-paa-while-evaluating-serp-api.md",policyVersion:"brightdata-serp-payg-2026-09-24",effectiveAt:"2026-08-11T00:00:00Z"})}function Ht(e=process.env){let t=e.BRIGHTDATA_SERP_CONTRACT_USD_PER_1000?.trim(),o=e.BRIGHTDATA_SERP_RATE_SOURCE?.trim(),r=e.BRIGHTDATA_SERP_RATE_POLICY_VERSION?.trim(),n=e.BRIGHTDATA_SERP_RATE_EFFECTIVE_AT?.trim();if(!t&&!o&&!r&&!n)return Sr();if(!t||!o||!r||!n)throw new Error("Bright Data SERP contract rate requires amount, source, policy version, and effective date");let s=Number(t);if(!Number.isFinite(s)||s<0)throw new Error("Invalid Bright Data SERP contract amount");return ee({providerProduct:"brightdata_serp_api",billingTier:"payg",billableEvent:"successful_delivery",unitType:"request",numeratorUsdNanos:Math.round(s*1e9),denominatorUnits:1e3,source:o,policyVersion:r,effectiveAt:n})}function Ar(e){return ee({providerProduct:"brightdata_browser_api",billingTier:e,billableEvent:"transferred_byte",unitType:"byte",numeratorUsdNanos:(e==="premium"?11:8)*1e9,denominatorUnits:1e9,source:`owner_confirmed_payg_2026-09-23;brightdata_domain_snapshot_${qt}`,policyVersion:"brightdata-browser-domain-tier-2026-09-23",effectiveAt:"2026-09-23T00:00:00Z"})}function so(e){return Ar(Z(e))}function Bt(){return ee({providerProduct:"apify_google_serp_scraperlink",billingTier:"store_pay_per_event",billableEvent:"serp_page",unitType:"page",numeratorUsdNanos:5e8,denominatorUnits:1e3,source:"https://apify.com/scraperlink/google-search-results-serp-scraper",policyVersion:"scraperlink-listing-2026-09-24",effectiveAt:"2026-09-24T00:00:00Z"})}var Er="https://api.brightdata.com/request",kr=8e3,Or="brd.superproxy.io",Ir="44445",Tr=10*1024*1024;async function Cr(e,t){let o=new URL(`http://${t.host}:${t.port}`);o.username=t.username,o.password=t.password;let r=new Pr(o);try{return await new Promise((n,s)=>{let a=Rr(e,{agent:r,headers:{"x-unblock-data-format":"parsed"},rejectUnauthorized:!1,signal:t.signal},i=>{let u=[],l=0;i.on("data",c=>{let p=Buffer.isBuffer(c)?c:Buffer.from(c);if(l+=p.length,l>Tr){a.destroy(new Error("Bright Data SERP response exceeded the maximum size"));return}u.push(p)}),i.on("end",()=>n({ok:(i.statusCode??500)>=200&&(i.statusCode??500)<300,status:i.statusCode??500,rawText:Buffer.concat(u).toString("utf8"),providerRequestId:typeof i.headers["x-response-id"]=="string"?i.headers["x-response-id"]:typeof i.headers["x-request-id"]=="string"?i.headers["x-request-id"]:null}))});a.on("error",()=>s(new Error("Bright Data native SERP request failed"))),a.end()})}finally{r.destroy()}}function ye(e=process.env){let t=!!(e.BRIGHTDATA_SERP_PROXY_USERNAME?.trim()&&e.BRIGHTDATA_SERP_PROXY_PASSWORD?.trim()),o=!!((e.BRIGHTDATA_SERP_API_KEY||e.BRIGHTDATA_API_KEY)?.trim()&&e.BRIGHTDATA_SERP_ZONE?.trim());return t||o}function m(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)?e:null}function N(e){return Array.isArray(e)?e:[]}function Be(e){return typeof e=="string"&&e.trim()?e.trim():null}function R(e){return typeof e=="number"&&Number.isFinite(e)?e:typeof e=="string"&&e.trim()&&Number.isFinite(Number(e))?Number(e):null}function g(e,t){for(let o of t){let r=Be(e[o]);if(r)return r}return null}function J(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch{return""}}function Qt(e){return{rawUrl:e,resolvedUrl:e,linkType:"plain",resolutionStatus:"not_needed"}}function xr(e){let t=e;if(typeof t=="string")try{t=JSON.parse(t)}catch{throw new Error("Bright Data SERP API returned invalid JSON")}let o=m(t);if(!o)throw new Error("Bright Data SERP API returned an invalid payload");if(typeof o.body=="string")try{let n=JSON.parse(o.body);if(m(n))return m(n)}catch{}let r=m(o.body);return r?m(r.result)??m(r.data)??r:m(o.result)??m(o.data)??o}function j(e,t){for(let r of t){let n=N(e[r]);if(n.length)return n}let o=m(e.results);if(o)for(let r of t){let n=N(o[r]);if(n.length)return n}return[]}function K(e,t){let o=[e,m(e.results)].filter(r=>!!r);for(let r of o)for(let n of t)if(Object.prototype.hasOwnProperty.call(r,n))return{observed:!0,rawShapeValid:Array.isArray(r[n]),rawCount:N(r[n]).length};return{observed:!1,rawShapeValid:!1,rawCount:0}}function He(e,t){let o=[e,m(e.results)].filter(r=>!!r);for(let r of o)for(let n of t){if(!Object.prototype.hasOwnProperty.call(r,n))continue;let s=m(r[n]);return{observed:!0,rawShapeValid:s!==null,rawCount:s&&Object.keys(s).length>0?1:0}}return{observed:!1,rawShapeValid:!1,rawCount:0}}function Ut(e){return j(e,["organic","organic_results","organicResults"]).flatMap((t,o)=>{let r=m(t);if(!r)return[];let n=g(r,["link","url","href"]),s=g(r,["title","name"]);if(!n||!s)return[];let a=m(r.rating)??m(r.inline_rating);return[{position:Math.max(1,Math.trunc(R(r.global_rank)??R(r.rank)??R(r.position)??o+1)),title:s,url:n,...Qt(n),domain:J(n),cite:g(r,["display_link","displayLink","cite"]),snippet:g(r,["description","snippet","text"]),isRedditStyle:J(n)==="reddit.com",inlineRating:a?{value:String(a.value??a.rating??""),count:String(a.count??a.reviews??"")}:null}]}).sort((t,o)=>t.position-o.position)}function Ft(e){return j(e,["snack_pack","local","local_results","local_pack","localPack"]).flatMap((t,o)=>{let r=m(t);if(!r)return[];let n=g(r,["title","name"]);if(!n)return[];let s=N(r.extensions??r.metadata).map(Be).filter(a=>!!a);return[{position:Math.max(1,Math.trunc(R(r.global_rank)??R(r.rank)??R(r.position)??o+1)),name:n,cid:g(r,["cid"]),rating:g(r,["rating"])??(R(r.rating)!=null?String(R(r.rating)):null),reviewCount:g(r,["reviews_cnt","reviews","review_count","reviewCount"])??(R(r.reviews_cnt)!=null?String(R(r.reviews_cnt)):R(r.reviews)!=null?String(R(r.reviews)):null),metadata:s,websiteUrl:g(r,["website","website_url","link"]),directionsUrl:g(r,["directions","directions_url"])}]})}function Wt(e){let t=m(e);return N(t?.citations??t?.sources??t?.references).flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url","href"]);return n?[{text:g(r,["title","text","name"])??J(n),href:n,...Qt(n)}]:[]})}function he(e,t=0){if(t>4)return[];if(Array.isArray(e))return e.flatMap(s=>he(s,t+1));let o=m(e);if(!o)return[];let r=g(o,["snippet","text","answer"]),n=he(o.texts??o.list??o.items,t+1);return[...r?[r]:[],...n]}function Gt(e,t){if(!t)return{detected:!1,text:null,citations:[]};let o=m(e.ai_overview)??m(e.aiOverview)??m(e.overview);if(!o)return{detected:!1,text:null,citations:[]};let r=g(o,["text","answer","description"])??(he(o.texts).join(`
|
|
2
|
-
|
|
3
|
-
`).slice(0,5e4)||null),n=Wt(o);return{detected:!!(r||n.length),text:r,citations:n}}function Lt(e,t){if(!t)return{detected:!1,text:null,citations:[]};let o=m(e.ai_mode)??m(e.aiMode);if(!o)return{detected:!1,text:null,citations:[]};let r=g(o,["text","answer","description"])??(he(o.texts).join(`
|
|
4
|
-
|
|
5
|
-
`).slice(0,5e4)||null),n=Wt(o);return{detected:!!(r||n.length),text:r,citations:n}}function Vt(e,t){return t?[...j(e,["videos","video_results"]),...j(e,["short_videos","shorts"])].flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url"]),s=g(r,["title","name"]);return!n||!s?[]:[{type:"video",title:s,channel:g(r,["channel","source"])??"",platform:J(n),duration:g(r,["duration"])??"",url:n}]}):[]}function $t(e,t){if(!t)return[];let o=m(e.forums);return[...j(e,["discussions","forums","forum_results"]),...N(o?.items)].flatMap(r=>{let n=m(r);if(!n)return[];let s=g(n,["link","url"]),a=g(n,["title","name"]);return!s||!a?[]:[{title:a,source:g(n,["source"])??J(s),url:s}]})}function zt(e,t){return t?j(e,["what_people_are_saying","whatPeopleSaying"]).flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url"]),s=g(r,["title","name"]);if(!n||!s)return[];let a=g(r,["platform","source"])??J(n),i=a.toLowerCase();return[{type:i.includes("reddit")?"reddit":i.includes("facebook")?"facebook":i.includes("instagram")?"instagram":i.includes("tiktok")?"tiktok":i.includes("youtube")?"youtube":i.includes("news")?"news":"unknown",title:s,url:n,source:a,platform:a,popularComment:g(r,["comment","popular_comment"]),engagement:g(r,["engagement"])??"",date:g(r,["date"])??"",duration:g(r,["duration"]),authorNote:g(r,["author_note"])}]}):[]}var Mr={featuredSnippets:["featured_snippets","featured_snippet","featuredSnippet"],knowledgePanel:["knowledge","knowledge_graph","knowledgeGraph"],topStories:["top_stories","topStories"],news:["news","news_results"],images:["images","image_results"],shopping:["shopping","shopping_results"],relatedSearches:["related","related_searches","relatedSearches"],recipes:["recipes","recipe_results"],jobs:["jobs","job_results"],topAds:["top_ads"],bottomAds:["bottom_ads"],topProducts:["top_pla"],bottomProducts:["bottom_pla"],jackpotProducts:["jackpot_pla"],shortVideos:["short_videos","shorts"],localMap:["snack_pack_map"],flights:["flights"],hotels:["hotels_selection"],popularProducts:["popular_products"],weather:["weather"],currencyExchange:["currency_exchange"],latestPosts:["latest_posts"],perspectives:["perspectives"],navigation:["navigation"],chips:["chips"],spelling:["spelling"]};function ge(e,t){for(let o of[e,m(e.results)])if(o){for(let r of t)if(Object.prototype.hasOwnProperty.call(o,r))return{observed:!0,value:o[r]}}return{observed:!1,value:null}}function fe(e,t,o){return e?t==null||Array.isArray(t)&&t.length===0?"observed_absent":Array.isArray(t)?o>0?"observed_present":"incomplete":m(t)?o>0?"observed_present":Object.keys(m(t)).length===0?"observed_absent":"incomplete":"incomplete":"unknown"}function Nr(e,t){let o={},r=[["localPack",["snack_pack","local","local_results","local_pack","localPack"],t.localPack],["forums",["discussions","forums","forum_results"],t.forums],["videos",["videos","video_results","short_videos","shorts"],t.videos],["aiOverview",["ai_overview","aiOverview","overview"],t.aiOverview],["whatPeopleSaying",["what_people_are_saying","whatPeopleSaying"],t.whatPeopleSaying],["entityIds",["knowledge","knowledge_graph","knowledgeGraph"],t.entityIds]];for(let[u,l,c]of r){let p=ge(e,l);o[u]=fe(p.observed,p.value,c)}let n=ge(e,["ai_mode","aiMode"]);o.aiMode=fe(n.observed,n.value,t.aiMode);let s=ge(e,["people_also_ask","peopleAlsoAsk","related_questions","paa"]),a=N(s.value).slice(0,30).flatMap(u=>{let l=m(u);if(!l)return[];let c=g(l,["question","title"]);return c?[{question:c.slice(0,1e3),answer:g(l,["answer","snippet","text"])?.slice(0,1e4)??null,url:g(l,["link","url"])??null}]:[]});o.paaPreview=fe(s.observed,s.value,a.length);let i=[];for(let[u,l]of Object.entries(Mr)){let c=ge(e,l);if(!c.observed)continue;let p=m(c.value),w=(Array.isArray(c.value)?c.value:p&&(Array.isArray(p.items)||Array.isArray(p.posts))?[...N(p.items),...N(p.posts)]:[c.value]).slice(0,20).flatMap(S=>{let y=m(S);if(!y)return[];let T=g(y,["title","name","heading"]),k=g(y,["link","url","website"]),D=g(y,["description","snippet","text","summary","story"]);return!T&&!k&&!D?[]:[{title:T?.slice(0,1e3)??null,url:k,description:D?.slice(0,1e4)??null,position:R(y.global_rank)??R(y.rank)??R(y.position)??null}]});o[u]=fe(c.observed,c.value,w.length);let A=Object.fromEntries(Object.entries(p??{}).slice(0,30).flatMap(([S,y])=>/^[a-zA-Z0-9_]{1,80}$/.test(S)&&(y===null||["string","number","boolean"].includes(typeof y))?[[S,typeof y=="string"?y.slice(0,2e3):y]]:[]));i.push({name:u,attributes:A,items:w})}return{status:o,paaPreview:a,additional:i}}function Kt(e,t){let o=new Set,r=new Set(t.map(a=>a.cid).filter(a=>!!a)),n=new Set,s=(a,i=0)=>{if(i>6||a==null)return;if(Array.isArray(a)){for(let l of a)s(l,i+1);return}let u=m(a);if(u)for(let[l,c]of Object.entries(u)){let p=l.toLowerCase().replace(/[^a-z]/g,""),b=Be(c);b&&(p==="kgid"||p==="kgmid"||p==="mid")?o.add(b):b&&p==="cid"?r.add(b):b&&p==="gcid"?n.add(b):typeof c=="object"&&s(c,i+1)}};return s(e),{entities:[],kgIds:[...o],cids:[...r],gcids:[...n]}}function Jt(e,t){let o=e instanceof Error?e.message:String(e);return t.aborted||/timeout|timed out/i.test(o)?"timeout":/captcha|recaptcha|unusual traffic|google\.com\/sorry|blocked/i.test(o)?"captcha":/invalid (?:json|payload)/i.test(o)?"invalid_payload":"provider_error"}function jt(e){return e==="invalid_payload"?"invalid_payload":e==="captcha"?"serp_readiness":e==="timeout"||e==="provider_error"?"provider_transport":"pagination"}async function Ue(e,t=process.env,o=fetch,r=Cr,n){if(e.pages!==1)throw new Error("Bright Data SERP supports one page only; use Apify for two pages");let s=(t.BRIGHTDATA_SERP_API_KEY||t.BRIGHTDATA_API_KEY)?.trim(),a=t.BRIGHTDATA_SERP_ZONE?.trim(),i=t.BRIGHTDATA_SERP_PROXY_USERNAME?.trim(),u=t.BRIGHTDATA_SERP_PROXY_PASSWORD?.trim(),l=!!(i&&u);if(!l&&(!s||!a))throw new Error("Direct SERP API is not configured");let c=Date.now(),p=At(),b=null,w=e.location?Ot(e.location):null;if(e.location&&!w?.canonical)throw new L("query_integrity","location_unresolved",`SERP location could not be resolved without changing the query (candidates: ${w?.ambiguousCandidates??0})`);let A=w?.canonical?kt(w.canonical):null,S=AbortSignal.timeout(e.includeAllSerpFeatures?33e3:kr),y=e.signal?AbortSignal.any([e.signal,S]):S,T=1,k=[],D=[],We=0,Ye=async d=>{let O=Date.now(),_=l?"brightdata_serp_native_proxy":"brightdata_serp_rest",I=null,q=null,Q=!1,W=!1,G=null,Y=null;if(p?.operationRunId&&(d===1||b))try{I=await $({runId:p.operationRunId,attemptNumber:n?n.attemptNumber+d-1:d,method:_,provider:"brightdata",...d===2?{parentAttemptId:b,edgeKind:"next_phase"}:n?{parentAttemptId:n.parentAttemptId,edgeKind:"provider_fallback",retryKind:"provider_fallback"}:{},normalizedFlags:{page:d,device:e.device,hasLocation:!!e.location}}),d===1&&(b=I),q=(await B({attemptId:I,provider:"brightdata",providerProduct:"brightdata_serp_api",accountScope:p.operationAccountScope??"production-default",method:_,providerStatus:"started"})).id}catch(h){throw console.warn(JSON.stringify({event:"direct_serp_telemetry_start_failed",page:d,message:h instanceof Error?h.message:String(h)})),h}let P=new URLSearchParams({q:e.query,gl:e.gl,hl:e.hl,pws:"0",num:"10",...d===2?{start:"10"}:{}}),ie=dt(e.recency);ie&&P.set("tbs",ie),e.device==="mobile"&&P.set("brd_mobile","1"),(e.includeAiOverview||e.includeAllSerpFeatures)&&P.set("brd_ai_overview","2"),A&&P.set("uule",A),l&&P.set("brd_json","1"),We+=1;let x;try{if(l){let E=t.BRIGHTDATA_SERP_PROXY_HOST?.trim()||Or,X=t.BRIGHTDATA_SERP_PROXY_PORT?.trim()||Ir;x=await r(`https://www.google.com/search?${P}`,{username:i,password:u,host:E,port:X,signal:y})}else{let E=await o(Er,{method:"POST",headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"},body:JSON.stringify({zone:a,url:`https://www.google.com/search?${P}`,format:"json",data_format:"parsed"}),signal:y});x={ok:E.ok,status:E.status,rawText:await E.text(),providerRequestId:E.headers.get("x-response-id")??E.headers.get("x-request-id")}}if(Y=`http_${x.status}`,q&&x.providerRequestId&&await U(q,x.providerRequestId),!x.ok)throw new Error(`Bright Data SERP API failed with HTTP ${x.status}`);Q=!0;let h;try{h=xr(JSON.parse(x.rawText))}catch(E){let X=E instanceof Error&&E.message!=="Unexpected end of JSON input"?E.message:"Bright Data SERP API returned invalid JSON";throw new L("invalid_payload","invalid_provider_payload",X)}let f=Ut(h);return k.push({page:d,attempted:!0,captured:f.length>0,resultCount:f.length,requestOffset:d===2?10:0,providerRequestIdObserved:!!x.providerRequestId,...f.length===0?{failureCode:"empty_page"}:{}}),W=!0,h}catch(h){G=h;let f=Jt(h,y);if(k.some(X=>X.page===d)||k.push({page:d,attempted:!0,captured:!1,resultCount:0,requestOffset:d===2?10:0,providerRequestIdObserved:!1,failureCode:f}),d===2)throw h;let E=h instanceof L?h.stage:jt(f);throw h instanceof L?h:new L(E,f,h instanceof Error?h.message:String(h))}finally{let h=null;if(q&&Q)try{let f=Ht(t);await F({receiptId:q,costState:"measured",units:1,unitType:"request",amountUsdNanos:me(f,1),rateSource:f.source,providerProduct:f.providerProduct,billingTier:f.billingTier,billableEvent:f.billableEvent,measurementSource:"provider_http_delivery",rateNumerator:f.numeratorUsdNanos,rateDenominator:f.denominatorUnits,ratePolicyVersion:f.policyVersion,rateEffectiveAt:f.effectiveAt,providerStatus:Y??"delivered",providerDurationMs:Date.now()-O})}catch(f){console.warn(JSON.stringify({event:"direct_serp_receipt_finalize_failed",page:d,message:f instanceof Error?f.message:String(f)})),h=f}if(I&&await z({attemptId:I,status:W?"succeeded":y.aborted?"timed_out":"failed",errorCode:G?Jt(G,y):null,durationMs:Date.now()-O}).catch(f=>console.warn(JSON.stringify({event:"direct_serp_attempt_finish_failed",page:d,message:f instanceof Error?f.message:String(f)}))),h)throw h}};try{D.push({page:1,payload:await Ye(1)})}catch(d){throw d}let Xe=null;if(T===2)try{D.push({page:2,payload:await Ye(2)})}catch(d){Xe=d}let dr=Date.now()-c,pr=Date.now(),v=D[0].payload,mr=D.flatMap(({page:d,payload:O})=>Ut(O).map(_=>({..._,position:d===2&&_.position<=10?_.position+10:_.position,sourcePage:d}))).filter((d,O,_)=>_.findIndex(I=>xe(I.url)===xe(d.url))===O),Ze=e.includeLocalPack||e.includeAllSerpFeatures,ve=Ze?Ft(v):[],Se=K(v,["snack_pack","local","local_results","local_pack","localPack"]),gr=V({requested:Ze,moduleObserved:Se.observed,rawCount:Se.rawCount,mappedCount:ve.length,rawShapeValid:Se.rawShapeValid}),et=e.includeAiOverview||e.includeAllSerpFeatures,tt=Gt(v,et),rt=e.includeForums||e.includeAllSerpFeatures,ot=$t(v,rt),nt=e.includeVideos||e.includeAllSerpFeatures,at=Vt(v,nt),st=e.includeWhatPeopleSaying||e.includeAllSerpFeatures,it=zt(v,st),Ae=m(v.forums),Re=Ae&&Array.isArray(Ae.items)?{observed:!0,rawCount:Ae.items.length,rawShapeValid:!0}:K(v,["discussions","forums","forum_results"]),Pe=K(v,["videos","video_results","short_videos","shorts"]),lt={localPack:gr,forums:V({requested:rt,moduleObserved:Re.observed,rawCount:Re.rawCount,mappedCount:ot.length,rawShapeValid:Re.rawShapeValid}),videos:V({requested:nt,moduleObserved:Pe.observed,rawCount:Pe.rawCount,mappedCount:at.length,rawShapeValid:Pe.rawShapeValid}),aiOverview:V({requested:et,moduleObserved:He(v,["ai_overview","aiOverview","overview"]).observed,rawCount:He(v,["ai_overview","aiOverview","overview"]).rawCount,mappedCount:tt.detected?1:0,rawShapeValid:He(v,["ai_overview","aiOverview","overview"]).rawShapeValid}),whatPeopleSaying:V({requested:st,moduleObserved:K(v,["what_people_are_saying","whatPeopleSaying"]).observed,rawCount:K(v,["what_people_are_saying","whatPeopleSaying"]).rawCount,mappedCount:it.length,rawShapeValid:K(v,["what_people_are_saying","whatPeopleSaying"]).rawShapeValid})},fr=ce(1,k),hr=k.find(d=>d.page===1)?.resultCount??0,ae=k.find(d=>d.page===2)?.resultCount??0,yr=de({query:e.query,finalQuery:e.query,canonicalLocation:w?.canonical??null,locationResolutionSource:w?.source??"not_requested",locationAmbiguousCandidates:w?.ambiguousCandidates??0,uule:A,outboundProviderMethod:l?"brightdata_serp_native_proxy":"brightdata_serp_rest"}),se=Xe?jt(k.find(d=>d.page===2)?.failureCode??"provider_error"):Object.values(lt).some(d=>d==="incomplete"||d==="unknown")?"optional_feature_parsing":null,br={pagination:{...fr,providerRequestCount:We},features:lt,queryIntegrity:yr,failureStage:se},ut=e.includeAllSerpFeatures?(()=>{let d=D.map(({page:O,payload:_})=>{let I=Ft(_),q=$t(_,!0),Q=Vt(_,!0),W=zt(_,!0),G=Gt(_,!0),Y=Lt(_,!0),P=Kt(_,I),ie=Nr(_,{localPack:I.length,forums:q.length,videos:Q.length,aiOverview:G.detected?1:0,aiMode:Y.detected?1:0,whatPeopleSaying:W.length,entityIds:P.entities.length+P.kgIds.length+P.cids.length+P.gcids.length});return{page:O,...ie,localPack:I,forums:q,videos:Q,whatPeopleSaying:W,aiOverview:G,aiMode:Y,entityIds:P}});return{status:d[0].status,paaPreview:d.flatMap(O=>O.paaPreview),additional:d.flatMap(O=>O.additional),pages:d}})():void 0,_r=new Date().toISOString(),ct=Date.now()-c;return{seed:e.query,location:e.location??null,extractedAt:_r,diagnostics:{phaseTimings:{providerConnectMs:dr,serpParseMs:Date.now()-pr,totalServerMs:ct},pagination:{requestedPages:T,capturedPages:T===2&&ae>0?2:1,page2Status:T===2?ae>0?"captured":"failed":"not_requested",page1OrganicCount:hr,page2OrganicCount:ae,...T===2&&ae===0?{failureCode:k.find(d=>d.page===2)?.failureCode==="captcha"?"captcha":k.find(d=>d.page===2)?.failureCode==="timeout"?"timeout":"empty_page"}:{}},completionStatus:"serp_only",problem:null,resultQuality:se?"partial":"complete",degradedResult:!!se,degradationReasons:[],retryRecommended:!!se,serpCompleteness:br},totalQuestions:0,surface:"web",aiOverview:tt,aiMode:Lt(v,e.includeAllSerpFeatures),...ut?{fullSerpFeatures:ut}:{},whatPeopleSaying:it,tree:[],flat:[],videos:at,forums:ot,organicResults:mr,localPack:ve,entityIds:Kt(v,ve),stats:{seed:e.query,totalQuestions:0,maxDepthReached:0,durationMs:ct,errorCount:0}}}var Dr="scraperlink~google-search-results-serp-scraper",te="https://api.apify.com/v2";var C=class extends Error{constructor(o,r=null,n=!1,s=null){super(o);this.runId=r;this.retrySafe=n;this.terminalStatus=s;this.name="ApifyGoogleRunError"}runId;retrySafe;terminalStatus};function re(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function oe(e){return typeof e=="string"&&e.trim()?e.trim():null}function qr(e){try{return["http:","https:"].includes(new URL(e).protocol)}catch{return!1}}function Hr(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{throw new Error("Apify searchResults is not valid JSON")}}function Yt(e,t){if(!Array.isArray(e)||e.length===0)throw new Error("Apify dataset contains no search results");let o=[];for(let[s,a]of e.entries()){let i=re(a);if(!i)throw new Error("Apify dataset contains an invalid row");let u=Hr(i.searchResults??i),l=re(u),c=Array.isArray(u)?u:Array.isArray(l?.results)?l.results:Array.isArray(l?.organicResults)?l.organicResults:Array.isArray(l?.organic)?l.organic:l&&(l.position!==void 0||l.title!==void 0)?[l]:null;if(!c)throw new Error("Apify dataset search result shape is unsupported");let p=Number(i.page_number??l?.page_number??s+1);if(!Number.isInteger(p)||p<1||p>t)throw new Error("Apify dataset has an unexpected page number");o.push(...c.map(b=>({row:b,page:p})))}let r=o.map(({row:s,page:a},i)=>{let u=re(s),l=u?.position,c=oe(u?.title),p=oe(u?.url??u?.link);if(!u||!c||!p||!qr(p)||l!==void 0&&(!Number.isInteger(l)||l<1))throw new Error(`Apify search result ${i+1} is missing a valid position, URL, or title`);let b=oe(u.description??u.snippet),w=typeof l=="number"?l:i%10+1;return{position:a>1&&w<=10?w+(a-1)*10:w,url:p,title:c,description:b}});if(r.length>t*10)throw new Error("Apify returned more results than requested");let n={page1:r.filter(s=>s.position<=10).length,page2:r.filter(s=>s.position>10).length};if(n.page1===0)throw new Error("Apify did not return the first result page");return{results:r,pageResultCounts:n}}async function be(e,t,o,r){let n=await o(e,{headers:{Authorization:`Bearer ${t}`},signal:r});if(!n.ok)throw new Error(`Apify API returned HTTP ${n.status}`);return n.json()}function Fe(e){let t=re(re(e)?.data),o=oe(t?.id),r=oe(t?.status);if(!o||!r)throw new Error("Apify returned an invalid run receipt");return{id:o,status:r}}async function Br(e,t=fetch){let o=performance.now(),r=AbortSignal.timeout(9e4),n=e.signal?AbortSignal.any([e.signal,r]):r,s=e.runId,a=!1,i=null;try{if(!/^[A-Za-z0-9]+$/.test(s))throw new Error("Invalid Apify run ID");let u=Fe(await be(`${te}/actor-runs/${s}?waitForFinish=30`,e.token,t,n));for(;["READY","RUNNING","TIMING-OUT","ABORTING"].includes(u.status);)u=Fe(await be(`${te}/actor-runs/${s}?waitForFinish=30`,e.token,t,n));if(a=!0,i=u.status,u.status!=="SUCCEEDED")throw new Error(`Apify run ended with status ${u.status}`);let l=e.pages??1,c=await be(`${te}/actor-runs/${s}/dataset/items?format=json`,e.token,t,n);return{query:e.query,...Yt(c,l),requestedPages:l,runId:s,elapsedMs:Math.round(performance.now()-o)}}catch(u){throw new C(u instanceof Error?u.message:String(u),s,a,i)}}async function Xt(e,t,o=fetch){let r=performance.now(),n=e.query.trim(),s=e.pages??1;if(!n||n.includes(`
|
|
6
|
-
`))throw new Error("Apify search requires one nonempty query");if(s!==1&&s!==2)throw new Error("Apify search supports one or two pages");let a=t.token.trim();if(!a)throw new Error("Apify API token is required");let i=t.maxChargeUsd??.01;if(!Number.isFinite(i)||i<=0)throw new Error("Invalid Apify charge cap");let u=AbortSignal.timeout(9e4),l=e.signal?AbortSignal.any([e.signal,u]):u,c=`${te}/actors/${Dr}/runs?maxTotalChargeUsd=${i}&restartOnError=false&waitForFinish=30`,p=null,b=!1,w=null;try{let A=await o(c,{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({keyword:n,limit:s===2?"20":"10",page:1,proxy_location:"us",include_merged:!1}),signal:l});if(!A.ok)throw new Error(`Apify run start returned HTTP ${A.status}`);let S=Fe(await A.json());if(p=S.id,b=!["READY","RUNNING","TIMING-OUT","ABORTING"].includes(S.status),b&&(w=S.status),S.status!=="SUCCEEDED"&&S.status!=="READY"&&S.status!=="RUNNING")throw new Error(`Apify run ended with status ${S.status}`);if(S.status==="SUCCEEDED"){let T=await be(`${te}/actor-runs/${p}/dataset/items?format=json`,a,o,l);return{query:n,...Yt(T,s),requestedPages:s,runId:p,elapsedMs:Math.round(performance.now()-r)}}return{...await Br({runId:p,query:n,token:a,pages:s,signal:l},o),elapsedMs:Math.round(performance.now()-r)}}catch(A){throw A instanceof C?A:new C(A instanceof Error?A.message:String(A),p,b,w)}}var Zt="apify_google_serp",er="apify",Ur="apify_google_serp_scraperlink";async function tr(e,t,o,r){let n=Bt();await F({receiptId:e,costState:"estimated",units:t,unitType:n.unitType,amountUsdNanos:me(n,t),rateSource:n.source,providerProduct:n.providerProduct,billingTier:n.billingTier,billableEvent:n.billableEvent,measurementSource:"actor_run_succeeded",rateNumerator:n.numeratorUsdNanos,rateDenominator:n.denominatorUnits,ratePolicyVersion:n.policyVersion,rateEffectiveAt:n.effectiveAt,providerStatus:r,providerDurationMs:o})}async function rr(e){let t=performance.now(),o=await $({runId:e.operationRunId,attemptNumber:e.attemptNumber,method:Zt,provider:er,parentAttemptId:e.parentAttemptId,edgeKind:e.edgeKind,retryKind:e.retryKind,normalizedFlags:{page:1,pages:e.options.pages??1,proxyLocation:"us"}}),r=await B({attemptId:o,provider:er,providerProduct:Ur,billingTier:"store_pay_per_event",accountScope:e.accountScope,method:Zt,providerStatus:"before_actor_start"}),n=null,s=null;try{return n=await Xt(e.options,{token:e.token},e.fetchImpl),await U(r.id,n.runId),await tr(r.id,n.requestedPages,n.elapsedMs,"succeeded_estimated"),{...n,attemptId:o}}catch(a){throw s=a,n?Object.assign(new C("Apify cost tracking failed after run completion",n.runId),{attemptId:o}):(a instanceof C&&a.runId&&(await U(r.id,a.runId),a.terminalStatus==="SUCCEEDED"?await tr(r.id,e.options.pages??1,Math.round(performance.now()-t),"succeeded_dataset_unavailable"):await Ct({receiptId:r.id,units:e.options.pages??1,unitType:"page",providerStatus:"run_outcome_or_cost_pending"})),Object.assign(a instanceof Error?a:new Error(String(a)),{attemptId:o}))}finally{await z({attemptId:o,status:s?e.options.signal?.aborted?"timed_out":"failed":"succeeded",errorCode:s?"apify_search_failed":null,durationMs:Math.round(performance.now()-t)})}}function or(e,t=e.requestedPages){let o=e.results.map(a=>{let i=new URL(a.url).hostname.replace(/^www\./,"");return{position:a.position,title:a.title,url:a.url,rawUrl:a.url,resolvedUrl:a.url,linkType:"plain",resolutionStatus:"not_needed",domain:i,cite:null,snippet:a.description,isRedditStyle:i==="reddit.com",inlineRating:null}}),r=t===2&&e.pageResultCounts.page2>0?2:1,n=t===2&&r===1,s=ce(t,[{page:1,attempted:!0,captured:!0,resultCount:e.pageResultCounts.page1,requestOffset:0,providerRequestIdObserved:!0},...t===2?[{page:2,attempted:!0,captured:!n,resultCount:e.pageResultCounts.page2,requestOffset:10,providerRequestIdObserved:!0,...n?{failureCode:"empty_page"}:{}}]:[]]);return{seed:e.query,location:null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:{providerConnectMs:e.elapsedMs,totalServerMs:e.elapsedMs},pagination:{requestedPages:t,capturedPages:r,page2Status:t===2?n?"failed":"captured":"not_requested",page1OrganicCount:e.pageResultCounts.page1,page2OrganicCount:e.pageResultCounts.page2},completionStatus:"serp_only",problem:null,resultQuality:n?"partial":"complete",degradedResult:n,degradationReasons:n?["page_two_missing"]:[],retryRecommended:!1,serpCompleteness:{pagination:s,features:{localPack:"not_requested",forums:"not_requested",videos:"not_requested",aiOverview:"not_requested",whatPeopleSaying:"not_requested"},queryIntegrity:de({query:e.query,finalQuery:e.query,locationResolutionSource:"not_requested",outboundProviderMethod:"default_search"}),failureStage:null}},totalQuestions:0,surface:"web",aiOverview:{detected:!1,text:null,citations:[],shareUrl:null},aiMode:{detected:!1,text:null,citations:[]},whatPeopleSaying:[],tree:[],flat:[],videos:[],forums:[],organicResults:o,localPack:[],entityIds:{entities:[],kgIds:[],cids:[],gcids:[]},stats:{seed:e.query,totalQuestions:0,maxDepthReached:0,durationMs:e.elapsedMs,errorCount:0}}}var Fr=12e3;function ar(e){return e.recency?H():e.pages===2?!!e.token||H():e.mode==="full"?ye()||H():!!e.token||ye()||H()}async function Ge(e){if(e.recency)return ne(e);if(e.mode==="full")return Gr(e);if(!e.token)return nr(e);let t=performance.now(),o;for(let r=1;r<=2;r++){let n=AbortSignal.any([e.signal,AbortSignal.timeout(Fr)]),s=e.pages===2&&r===2?1:e.pages;try{let a=await rr({options:{query:e.query,pages:s,signal:n},token:e.token,operationRunId:e.operationRunId,accountScope:e.accountScope,attemptNumber:r,...o?{parentAttemptId:o,edgeKind:"same_method_retry",retryKind:"same_method"}:{}});console.info(JSON.stringify({event:"serp_provider_succeeded",provider:"apify",operationRunId:e.operationRunId,attemptNumber:r,durationMs:a.elapsedMs,resultCount:a.results.length,requestedPages:e.pages,providerRequestedPages:a.requestedPages,deliveredPages:a.pageResultCounts.page2>0?2:1,runId:a.runId}));let i=or(a,e.pages);return i.stats.durationMs=Math.round(performance.now()-t),i.diagnostics.phaseTimings&&(i.diagnostics.phaseTimings.totalServerMs=i.stats.durationMs),{result:i,mode:"light",deliveryProvider:"apify",deliveredPages:a.pageResultCounts.page2>0?2:1}}catch(a){o=a&&typeof a=="object"&&"attemptId"in a?String(a.attemptId):void 0;let i=a instanceof C?a:null;if(console.warn(JSON.stringify({event:"serp_provider_failed",provider:"apify",operationRunId:e.operationRunId,attemptNumber:r,runId:i?.runId??null,requestedPages:e.pages,attemptPages:s,retrySafe:i?.retrySafe===!0,error:a instanceof Error?a.message:String(a)})),e.signal.aborted||!o||i?.retrySafe!==!0)throw a}}return nr(e,o)}async function nr(e,t){if(e.pages===2||!ye())return ne(e);let o=performance.now(),r={query:e.query,gl:"us",hl:"en",device:"desktop",pages:1,includeAllSerpFeatures:!1,includeLocalPack:!1,includeForums:!1,includeVideos:!1,includeAiOverview:!1,includeWhatPeopleSaying:!1,signal:e.signal};console.info(JSON.stringify({event:"serp_provider_fallback",provider:"brightdata",operationRunId:e.operationRunId,attemptNumber:3,requestedPages:e.pages,providerRequestedPages:1}));try{let n=await Ue(r,process.env,fetch,void 0,t?{attemptNumber:3,parentAttemptId:t}:void 0);if(n.organicResults.length===0)throw new Error("Search returned no organic results");return n.stats.durationMs=Math.round(performance.now()-o),n.diagnostics.phaseTimings&&(n.diagnostics.phaseTimings.totalServerMs=n.stats.durationMs),console.info(JSON.stringify({event:"serp_provider_succeeded",provider:"brightdata",operationRunId:e.operationRunId,attemptNumber:3,durationMs:n.stats.durationMs,resultCount:n.organicResults.length,requestedPages:e.pages,providerRequestedPages:1,deliveredPages:1,resultQuality:n.diagnostics.resultQuality})),{result:n,mode:"light",deliveryProvider:"brightdata",deliveredPages:1}}catch(n){if(console.warn(JSON.stringify({event:"serp_provider_failed",provider:"brightdata",operationRunId:e.operationRunId,attemptNumber:3,error:n instanceof Error?n.message:String(n)})),e.signal.aborted||!H())throw n;return ne(e)}}async function ne(e){let t=await ue({query:e.query,gl:"us",hl:"en",device:"desktop",pages:e.pages,recency:e.recency,serpOnly:!0,forceManagedSerp:!0,maxAttempts:2,proxyMode:"none",maxQuestions:1,depth:1,headless:!0,format:"json",outputDir:"/tmp/paa-output-api",softDeadlineMs:Date.now()+23e4,signal:e.signal,onAttemptEvent:e.onAttemptEvent});if(t.organicResults.length===0)throw new Error("Search returned no organic results");let o=t.diagnostics.pagination?.capturedPages===2?2:1;if(e.pages===2&&o===1&&(t.diagnostics.resultQuality="partial",t.diagnostics.degradedResult=!0,t.diagnostics.degradationReasons=["page_two_missing"],t.diagnostics.retryRecommended=!0),e.mode==="full"){let r=Object.fromEntries(["localPack","forums","videos","aiOverview","aiMode","whatPeopleSaying","entityIds","paaPreview","topStories"].map(n=>[n,"unsupported"]));t.fullSerpFeatures={status:r,paaPreview:[],additional:[],pages:[]}}return{result:t,mode:e.mode==="full"?"full":"light",deliveryProvider:"brightdata",deliveredPages:o}}async function Gr(e){if(e.pages===2){let t=await Ge({...e,mode:"light",pages:2}),o=Object.fromEntries(["localPack","forums","videos","aiOverview","aiMode","whatPeopleSaying","entityIds","paaPreview","topStories"].map(n=>[n,"unsupported"]));t.result.fullSerpFeatures={status:o,paaPreview:[],additional:[],pages:[]};let r=t.result.diagnostics;return r.serpCompleteness&&(r.serpCompleteness.features={localPack:"unsupported",forums:"unsupported",videos:"unsupported",aiOverview:"unsupported",whatPeopleSaying:"unsupported"}),{...t,mode:"full"}}try{return await Lr({...e,mode:"full"})}catch(t){if(e.signal.aborted||!H())throw t;return ne({...e,mode:"full"})}}async function Lr(e){let t=performance.now(),o=e.mode==="full",r={query:e.query,gl:"us",hl:"en",device:"desktop",pages:1,...e.recency?{recency:e.recency}:{},includeAllSerpFeatures:o,includeLocalPack:o,includeForums:o,includeVideos:o,includeAiOverview:o,includeWhatPeopleSaying:o,signal:e.signal},n=await Ue(r);if(n.organicResults.length===0)throw new Error("Search returned no organic results");return n.stats.durationMs=Math.round(performance.now()-t),n.diagnostics.phaseTimings&&(n.diagnostics.phaseTimings.totalServerMs=n.stats.durationMs),{result:n,mode:o?"full":"light",deliveryProvider:"brightdata",deliveredPages:n.diagnostics.pagination?.capturedPages===2?2:1}}async function Le(e,t,o=3){for(let r=1;r<=o;r++){try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t),signal:AbortSignal.timeout(1e4)});if(n.ok)return;console.warn(`[webhook] attempt ${r} \u2192 ${n.status} from ${e}`)}catch(n){console.warn(`[webhook] attempt ${r} failed:`,n instanceof Error?n.message:n)}r<o&&await new Promise(n=>setTimeout(n,1e3*r*2))}console.error(`[webhook] gave up after ${o} attempts for ${e}`)}function Vr(e){return e instanceof Error?e.message:String(e)}function $r(e,t){return e instanceof DOMException&&(e.name==="TimeoutError"||e.name==="AbortError")?!0:/timeout|timed out|Timeout \d+ms exceeded|deadline/i.test(t)}function zr(e){return/captcha|recaptcha|unusual traffic|google\.com\/sorry|blocked/i.test(e)}function Kr(e){return/ERR_TUNNEL_CONNECTION_FAILED|ERR_PROXY_CONNECTION_FAILED|ERR_SOCKS_CONNECTION_FAILED|tunnel connection failed|proxy connection failed|transport error: proxy/i.test(e)}function Jr(e){return/proxy unavailable|proxy_unavailable|connection_test_failed|did not return a proxy id|configured fallback/i.test(e)}function jr(e){return/(?:spending|billing|organization|account).{0,80}(?:cap|limit|blocked|disabled)|(?:quota|capacity).{0,40}(?:reached|exceeded)|https?:\/\/\S*dashboard/i.test(e)}function Qr(e){return/browser (?:has been )?closed|context (?:has been )?closed|target page, context or browser has been closed|session closed|page has been closed/i.test(e)}function Ve(e){let t=Vr(e);return e instanceof ht?{error_code:"request_aborted",error_type:"request_aborted",message:M("request_aborted"),retryable:!0,httpStatus:408,terminalStatus:"cancelled"}:e instanceof ft||zr(t)?{error_code:"captcha_exhausted",error_type:"captcha",message:M("captcha_exhausted"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Dt(e,t)?{error_code:"vendor_unavailable",error_type:"service_unavailable",message:M("vendor_unavailable"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:e instanceof yt?{error_code:"location_mismatch",error_type:"location_mismatch",message:M("location_mismatch"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Kr(t)?{error_code:"proxy_tunnel_failed",error_type:"connection",message:M("proxy_tunnel_failed"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Jr(t)?{error_code:"proxy_unavailable",error_type:"connection",message:M("proxy_unavailable"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Qr(t)?{error_code:"browser_session_interrupted",error_type:"extraction",message:M("browser_session_interrupted"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:$r(e,t)?{error_code:"harvest_timeout",error_type:"timeout",message:M("harvest_timeout"),retryable:!0,httpStatus:504,terminalStatus:"failed"}:jr(t)?{error_code:"service_unavailable",error_type:"service_unavailable",message:Ee,retryable:!0,httpStatus:503,terminalStatus:"failed"}:{error_code:"extraction_failed",error_type:"extraction",message:Ee,retryable:!1,httpStatus:500,terminalStatus:"failed"}}function $e(e){return JSON.stringify({error_code:e.error_code,error_type:e.error_type,message:e.message,retryable:e.retryable})}function _e(e,t={}){let o=gt({errorCode:e.error_code,errorType:e.error_type,retryable:e.retryable,retryAfterSeconds:t.retryAfterSeconds,chargeStatus:t.chargeStatus,details:t.details});return{error:o.message,...o}}function ze(e,t={}){let{error:o,...r}=_e(e,t);return r}function qo(e,t={}){let o=Ve(e);return{body:_e(o,t),status:o.httpStatus}}import{createHash as Wr}from"crypto";var Yr=1e9;function Xr(e){return Wr("sha256").update(JSON.stringify(e)).digest("hex")}function we(e){return`harvest:${e}`}async function Lo(e){let t=we(e.jobId);try{return(await It({id:t,userId:e.userId,ownerScope:`user:${e.userId}`,tool:e.tool,normalizedFlags:e.normalizedFlags,idempotencyKey:`job:${e.jobId}`,requestFingerprint:Xr(e.normalizedFlags),jobId:e.jobId,requestId:e.requestId??null,deploymentCommit:process.env.VERCEL_GIT_COMMIT_SHA?.trim()||process.env.GIT_COMMIT_SHA?.trim()||null})).id}catch(o){return console.warn(JSON.stringify({event:"operation_run_start_failed",job_id:e.jobId,tool:e.tool,message:o instanceof Error?o.message:String(o)})),null}}async function Je(e,t,o){if(e)try{await Tt({runId:e,status:t,failureClass:o})}catch(r){console.warn(JSON.stringify({event:"operation_run_finish_failed",operation_run_id:e,message:r instanceof Error?r.message:String(r)}))}}async function Vo(e,t,o,r){if(!(!e||!t))try{await xt({runId:e,billingTable:"billing_debits",billingKey:t,relation:o,amountMc:r})}catch(n){console.warn(JSON.stringify({event:"operation_billing_link_failed",operation_run_id:e,relation:o,message:n instanceof Error?n.message:String(n)}))}}function Ke(e){return e==="timeout"?"timed_out":e==="request_aborted"?"cancelled":e==="browser_session_interrupted"?"interrupted":e==="captcha"||e==="proxy_tunnel_failed"||e==="proxy_unavailable"||e==="location_mismatch"||e==="error"?"failed":"succeeded"}function Zr(e){return e==="bright_data_browser_api"?"brightdata":"kernel"}function sr(e,t,o=0){let r=new Map,n=null;return async s=>{if(e)try{if(s.type==="started"){let i=o+s.attemptNumber;if(i>1&&!n){let p=(await Mt(e))?.attempts.at(-1);n=p?.id==null?null:String(p.id)}let u=await $({runId:e,attemptNumber:i,method:s.method,provider:s.provider,parentAttemptId:i===1?null:n,edgeKind:i===1?null:o>0&&s.attemptNumber===1?"durable_resume":s.retryKind==="provider_fallback"?"provider_fallback":"same_method_retry",retryKind:i===1?null:o>0&&s.attemptNumber===1?"durable_resume":s.retryKind,retryReason:i===1?null:o>0&&s.attemptNumber===1?"durable_worker_resume":s.retryReason,retryOwner:i===1?null:o>0&&s.attemptNumber===1?"durable_reconciler":"harvest",normalizedFlags:{maxAttempts:s.maxAttempts,maxQuestions:s.maxQuestions,hasLocation:!!s.location,plannedProvider:s.provider,planReason:s.planReason??null,planTimeoutMs:s.planTimeoutMs??null},startedAt:s.startedAt}),l=await B({attemptId:u,provider:s.provider,providerProduct:s.provider==="brightdata"?"brightdata_browser_api":"kernel_browser",billingTier:s.provider==="brightdata"?Z("https://www.google.com/search"):null,accountScope:t,method:s.method,providerStatus:"started"});r.set(s.attemptNumber,{attemptId:u,receiptId:l.id,plannedProvider:s.provider,observedProvider:null,providerMismatch:!1,method:s.method,startedAtMs:Date.parse(s.startedAt),billingMode:null}),n=u;return}let a=r.get(s.attemptNumber);if(!a)throw new Error(`Missing operation attempt state for attempt ${s.attemptNumber}`);if(s.type==="provider_session_started"){let i=Zr(s.provider);if(a.observedProvider=i,a.billingMode=s.billingMode??null,i!==a.plannedProvider){a.providerMismatch=!0,await F({receiptId:a.receiptId,costState:"unavailable",providerStatus:"provider_mismatch",errorCode:"provider_mismatch",errorMessage:`Planned ${a.plannedProvider}; observed ${i}`,finalizedAt:s.observedAt});let u=i==="brightdata"?"brightdata_browser":"kernel_browser",l=await B({attemptId:a.attemptId,provider:i,providerProduct:i==="brightdata"?"brightdata_browser_api":"kernel_browser",billingTier:i==="brightdata"?Z("https://www.google.com/search"):null,accountScope:t,method:u,providerStatus:"observed_provider_mismatch"});a.receiptId=l.id,a.method=u}await U(a.receiptId,s.providerSessionId);return}if(await z({attemptId:a.attemptId,status:a.providerMismatch?"failed":Ke(s.outcome),errorCode:a.providerMismatch?"provider_mismatch":Ke(s.outcome)==="succeeded"?null:s.outcome,errorMessage:s.error,durationMs:s.durationMs,endedAt:s.completedAt}),(a.observedProvider??a.plannedProvider)==="kernel"){let i=a.billingMode==="headful",u=a.billingMode==="headless"||a.billingMode==="headful"?Et(s.durationMs,i):null;await F({receiptId:a.receiptId,costState:"estimated",units:s.durationMs/1e3,unitType:"wall_open_second",amountUsdNanos:u==null?null:Math.round(u*Yr),providerProduct:"kernel_browser",billingTier:a.billingMode,billableEvent:"provider_active_gb_second",measurementSource:"wall_open_time_proxy",rateSource:u!=null?`kernel_${a.billingMode}_usd_per_second:${i?Pt:Rt}`:null,providerStatus:a.providerMismatch?"provider_mismatch":s.outcome,providerDurationMs:s.durationMs,errorCode:a.providerMismatch?"provider_mismatch":Ke(s.outcome)==="succeeded"?null:s.outcome,errorMessage:s.error,finalizedAt:s.completedAt})}}catch(a){console.warn(JSON.stringify({event:"operation_attempt_telemetry_failed",operation_run_id:e,attempt_number:s.attemptNumber,message:a instanceof Error?a.message:String(a)}))}}}function je(e,t,o=null,r="production-default",n=0){let s=sr(o,r,n);return async a=>{if(await s(a),a.type==="started"){await bt({jobId:e,userId:t,attemptNumber:a.attemptNumber,maxAttempts:a.maxAttempts,query:a.query,location:a.location,maxQuestions:a.maxQuestions,startedAt:a.startedAt});return}if(a.type==="provider_session_started"){await _t({jobId:e,attemptNumber:a.attemptNumber,browserProvider:a.provider,providerSessionId:a.providerSessionId,observedAt:a.observedAt});return}await wt({jobId:e,attemptNumber:a.attemptNumber,outcome:a.outcome,kernelSessionId:a.kernelSessionId,questionCount:a.questionCount,durationMs:a.durationMs,error:a.error,willRetry:a.willRetry,kernelDeleteStarted:a.cleanup.kernelDeleteStarted,kernelDeleteSucceeded:a.cleanup.kernelDeleteSucceeded,kernelDeleteError:a.cleanup.kernelDeleteError,browserCloseSucceeded:a.cleanup.browserCloseSucceeded,browserCloseError:a.cleanup.browserCloseError,browserProvider:a.cleanup.provider??null,providerSessionId:a.cleanup.providerSessionId??null,providerLookupStatus:a.cleanup.providerSessionId?"pending":"not_applicable",providerErrorCode:a.cleanup.providerDisconnectObserved?"browser_session_interrupted":null,providerErrorMessage:a.cleanup.providerDisconnectMessage??null,providerReasonSource:a.cleanup.providerDisconnectObserved?"client_runtime":null,providerDisconnectObserved:a.cleanup.providerDisconnectObserved??!1,providerDisconnectMessage:a.cleanup.providerDisconnectMessage??null,debug:a.debug,completedAt:a.completedAt})}}var ir=2,Qe=0;function lr(e){if(!e||typeof e!="object")return 0;let t=e;return typeof t.totalQuestions=="number"?t.totalQuestions:Array.isArray(t.flat)?t.flat.length:0}function ur(e){return Ne.paa_base+Math.max(1,e)*Ne.paa}async function cr(e){Qe++;try{let t=typeof e.options=="string"?JSON.parse(e.options):e.options,o={value:null},r=null,n=t.serpOnly&&!t.serpIdentity,s=we(e.id),a=process.env.APIFY_API_TOKEN?.trim();if(n&&!ar({pages:t.pages===2?2:1,recency:t.recency==="week"||t.recency==="month"?t.recency:void 0,mode:t.mode,token:a}))throw new Error("Search providers are not configured");let i=await St({op:t.serpOnly?"serp":"paa",userId:Number(e.user_id),headlessSentOut:o,operationRunId:s,operationAccountScope:"production-default"},()=>n?Ge({query:t.query??e.query,pages:t.pages===2?2:1,token:a,mode:t.mode,recency:t.recency==="week"||t.recency==="month"?t.recency:void 0,operationRunId:s,accountScope:"production-default",signal:AbortSignal.timeout(pt(t.maxQuestions??30,!0,t.mode,t.pages,!!t.recency,n).serverMs),onAttemptEvent:je(e.id,e.user_id,s)}).then(l=>(r=l,l.result)):ue({...t,kernelApiKey:mt(),headless:!0,format:"json",outputDir:"/tmp/paa-output-api",onAttemptEvent:je(e.id,e.user_id,s)}));if(n&&!r)throw new Error("Search provider billing receipt is missing");await vt(e.id,i),await Je(s,"succeeded");let u=await ke(e.id,e.user_id);if(typeof t.billingHoldMc=="number"&&t.billingDebitKey){let l=t.serpOnly?n?qe(r.deliveredPages,r.deliveryProvider):De(o.value):ur(lr(i));await Ce(Number(e.user_id),t.billingDebitKey,l,t.serpOnly?"serp_refund":"paa_refund",t.serpOnly?"SERP search settlement":"PAA harvest settlement",t.serpOnly?"serp_search":"paa_harvest")}else if(!t.serpOnly&&typeof t.billingHoldMc=="number"){let l=ur(lr(i)),c=t.billingHoldMc-l;c>0?await le(e.user_id,c,"paa_refund","overestimate refund"):c<0&&await Te(e.user_id,-c,"paa",t.query??e.query)}else if(t.serpOnly&&typeof t.billingHoldMc=="number"){let l=n?qe(r.deliveredPages,r.deliveryProvider):De(o.value),c=t.billingHoldMc-l;c>0?await le(e.user_id,c,"serp_refund","headless-mode pricing settle"):c<0&&await Te(e.user_id,-c,"serp",t.query??e.query)}e.callback_url&&await Le(e.callback_url,{job_id:e.id,status:"done",result:Nt(i),attempts:Me(u)})}catch(t){console.error("[harvest/worker] failed",{jobId:e.id,error:t instanceof Error?t.message:String(t)});let o=Ve(t);await Je(we(e.id),o.error_code==="harvest_timeout"?"timed_out":o.terminalStatus,o.error_code);let r=typeof e.options=="string"?JSON.parse(e.options):e.options,n=typeof r.billingHoldMc=="number"&&r.billingHoldMc>0;await Ie(e.id,$e(o),ze(o,{chargeStatus:n?"refund_pending":"not_charged"}));let s=await ke(e.id,e.user_id);try{n&&(r.billingDebitKey?await Ce(Number(e.user_id),r.billingDebitKey,0,r.serpOnly?"serp_refund":"paa_refund","failed call",r.serpOnly?"serp_search":"paa_harvest"):await le(e.user_id,r.billingHoldMc,"refund","failed call"),await Ie(e.id,$e(o),ze(o,{chargeStatus:"refunded"})))}catch{}e.callback_url&&await Le(e.callback_url,{job_id:e.id,status:"failed",..._e(o),attempts:Me(s)})}finally{Qe--}}async function eo(){let e=await Oe();if(!e)return{claimed:!1};let t=Date.now();return await cr(e),{claimed:!0,jobId:e.id,completed:!0,durationMs:Date.now()-t}}async function sn(e){let t=[];for(let o=0;o<e.maxJobs&&!(Date.now()>=e.deadlineMs);o++){let r=await eo();if(t.push(r),!r.claimed)break}return t}function ln(){setInterval(async()=>{if(Qe>=ir)return;let e=await Oe();e&&cr(e)},2e3),console.log(`[worker] started \u2014 polling every 2s, max ${ir} concurrent`)}export{Z as a,me as b,Ar as c,so as d,ar as e,Ge as f,Ve as g,$e as h,_e as i,ze as j,qo as k,we as l,Lo as m,Je as n,Vo as o,je as p,Le as q,eo as r,sn as s,ln as t};
|
package/dist/chunk-NZSDHDX3.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as S,i as b}from"./chunk-ZPK5LYEN.js";import{createHash as C}from"crypto";var P=["observed_present","observed_absent","incomplete","not_requested","unknown","unsupported"],A=["provider_transport","invalid_payload","serp_readiness","query_integrity","pagination","optional_feature_parsing","unknown"],v=class extends Error{stage;failureCode;constructor(r,n,t){super(t),this.name="SerpExtractionError",this.stage=r,this.failureCode=n}};function K(e){return e instanceof v?e.stage:null}function p(e){return C("sha256").update(e).digest("hex")}function I(e){return e.normalize("NFKC").toLocaleLowerCase("en-US").split(/[^\p{L}\p{N}]+/u).filter(Boolean).slice(0,64)}function W(e){try{let r=new URL(e);return r.hash="",r.pathname.length>1&&(r.pathname=r.pathname.replace(/\/+$/,"")),r.toString()}catch{return e.trim()}}function Z(e,r){let n=e===2?[1,2]:[1],t=r.filter(o=>o.attempted).map(o=>o.page),s=r.filter(o=>o.captured&&o.resultCount>0).map(o=>o.page),a=r.find(o=>o.failureCode);return{status:n.every(o=>s.includes(o))?"complete":"incomplete",requestedPages:n,attemptedPages:t,capturedPages:s,pageResultCounts:n.map(o=>({page:o,resultCount:r.find(g=>g.page===o)?.resultCount??0})),providerRequestCount:t.length,evidence:r,failureCode:a?.failureCode??null}}function $(e){return e.requested?e.moduleObserved?!e.rawShapeValid||e.rawCount>0&&e.mappedCount===0?"incomplete":e.mappedCount>0?"observed_present":"observed_absent":"unknown":"not_requested"}function X(e){let r=p(e.query),n=e.finalQuery==null?null:p(e.finalQuery),t=e.locationResolutionSource==="unresolved";return{status:n!==null&&n!==r?"query_mismatch":t?"unresolved_location":"matched",queryHash:r,normalizedQueryTokens:I(e.query),canonicalLocation:e.canonicalLocation??null,locationResolutionSource:e.locationResolutionSource,locationAmbiguousCandidates:Math.max(0,Math.trunc(e.locationAmbiguousCandidates??0)),uulePresent:!!e.uule,uuleHash:e.uule?p(e.uule):null,outboundProviderMethod:e.outboundProviderMethod,finalQueryHash:n}}function J(e){return p(JSON.stringify(Object.fromEntries(Object.entries(e).filter(([r,n])=>r!=="requestFingerprint"&&n!==void 0).sort(([r],[n])=>r.localeCompare(n)))))}function l(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function m(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?Math.trunc(e):0}function u(e,r){return typeof e=="string"&&e.length<=r?e:null}function ee(e){let r=l(e),n=l(r.pagination),t=l(r.features),s=l(r.queryIntegrity),a=i=>Array.isArray(i)?i.filter(d=>d===1||d===2).slice(0,2):[],o=a(n.requestedPages);if(o.length===0)return null;let g=new Set(P),k=new Set(A);return{pagination:{status:n.status==="complete"?"complete":"incomplete",requestedPages:o,attemptedPages:a(n.attemptedPages),capturedPages:a(n.capturedPages),pageResultCounts:Array.isArray(n.pageResultCounts)?n.pageResultCounts.slice(0,2).map(i=>{let d=l(i);return{page:d.page===2?2:1,resultCount:m(d.resultCount)}}):[],providerRequestCount:m(n.providerRequestCount),failureCode:u(n.failureCode,100)},features:Object.fromEntries(["localPack","forums","videos","aiOverview","whatPeopleSaying","aiMode","paaPreview","entityIds"].map(i=>[i,g.has(String(t[i]))?t[i]:"unknown"])),queryIntegrity:{status:["matched","unresolved_location","query_mismatch"].includes(String(s.status))?s.status:"query_mismatch",queryHash:u(s.queryHash,64)??"",normalizedQueryTokens:Array.isArray(s.normalizedQueryTokens)?s.normalizedQueryTokens.slice(0,64).flatMap(i=>typeof i=="string"?[i.slice(0,100)]:[]):[],canonicalLocation:u(s.canonicalLocation,500),locationResolutionSource:u(s.locationResolutionSource,100)??"unknown",locationAmbiguousCandidates:m(s.locationAmbiguousCandidates),uulePresent:s.uulePresent===!0,uuleHash:u(s.uuleHash,64),outboundProviderMethod:"search",finalQueryHash:u(s.finalQueryHash,64)},failureStage:k.has(String(r.failureStage))?r.failureStage:null}}var T={kernel:"browserRuntime"},f=/error|message/i,O=/(?:spending|billing|organization|account).{0,80}(?:cap|limit|blocked|disabled)|(?:quota|capacity).{0,40}(?:reached|exceeded)|https?:\/\/\S*(?:dashboard|onkernel)/i,x=/\b(?:ENOENT|ENOTDIR|EACCES|EPERM|EISDIR|EMFILE|ENFILE)\b|\b(?:mkdir|open|stat|lstat|readFile|writeFile)\s+['"]?(?:\/|[A-Za-z]:\\)|(?:^|[\s'"])(?:\/Users|\/home|\/tmp|\/var|\/private|\/opt|\/srv|\/root)\//i,q=new Set(["kernel_session_id","browser_session_id","kernelSessionId","browserSessionId","sessionId","kernel_delete_started","session_cleanup_started","kernelDeleteStarted","sessionCleanupStarted","kernel_delete_succeeded","session_cleanup_succeeded","kernelDeleteSucceeded","sessionCleanupSucceeded","kernel_delete_error","session_cleanup_error","kernelDeleteError","sessionCleanupError","kernelProxyId","proxyId","requestedProxyIdSuffix","retrievedProxyIdSuffix","provider","providerName","service","serviceName","vendor","vendorName","organization","organizationId","accountId","browser_provider","provider_session_id","provider_session_observed_at","provider_lookup_status","provider_status","provider_error_code","provider_error_message","provider_reason_source","provider_duration_ms","provider_bandwidth_bytes","provider_captcha","provider_checked_at","provider_detail","provider_detail_json","provider_disconnect_observed","provider_disconnect_message","browserProvider","providerSessionId","providerLookupStatus","providerStatus","providerErrorCode","providerErrorMessage","providerReasonSource","providerDurationMs","providerBandwidthBytes","providerCaptcha","providerCheckedAt","providerDetail","providerDisconnectObserved","providerDisconnectMessage"]),F=new Set(["hosted_url","hostedUrl","live_view_url","liveViewUrl","cdp_ws_url","cdpWsUrl","browser_live_view_url"]),L=/\b(?:wss?|https?):\/\/[^\s"'<>]*\bonkernel\.com[^\s"'<>]*/gi;function R(e){return e.replace(L,"[browser-service]")}var N=new Set(["bright_data_browser_api","kernel","local"]),D=new Set(["pending","complete","not_found","unavailable_credentials","temporary_error","invalid_payload","not_applicable"]),U=new Set(["active","running","complete","completed","failed","closed","stopped","terminated","timed_out"]),M=new Set(["provider_session_api","client_runtime","extractor","unknown"]),z=new Set(["browser_disconnected","worker_disconnect","job_killed","cdp_cmd_timeout","network_inactivity_timeout","session_timeout","client_timeout","navigate_domains_limit","cdp_error","browser_session_interrupted","provider_detail_pending","provider_lookup_unavailable","provider_reported_no_error","provider_session_not_found","provider_invalid_json","provider_invalid_payload","provider_lookup_timeout","provider_lookup_network_error","unknown"]),V=new Set(["browser_provider","provider_session_id","provider_lookup_status","provider_status","provider_error_code","provider_error_message","provider_reason_source","provider_duration_ms","provider_bandwidth_bytes","provider_captcha","provider_checked_at","provider_detail","provider_detail_json","provider_disconnect_observed","provider_disconnect_message"]),H=512,Q=320;function _(e,r){return typeof e=="string"&&r.has(e)?e:null}function j(e){return typeof e!="string"?null:z.has(e)||/^provider_http_(?:429|5\d\d)$/.test(e)?e:null}function B(e){return typeof e!="string"||e.length<1||e.length>H||/^(?:authorization|bearer|password|secret|token|api[_-]?key|account)/i.test(e)?null:/^[A-Za-z0-9._:-]+$/.test(e)&&!e.includes("://")?e:null}function y(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function h(e){if(typeof e!="string"||e.length>40)return null;let r=Date.parse(e);return Number.isFinite(r)&&new Date(r).toISOString()===e?e:null}function w(e){if(typeof e!="string")return null;let r=e.replace(/[\u0000-\u001f\u007f]+/g," ").replace(/\s+/g," ").trim();if(!r||r.startsWith("{")||r.startsWith("["))return null;let n=r.replace(/\b(?:wss?|https?):\/\/\S+/gi,"[redacted endpoint]").replace(/\b(?:authorization|proxy-authorization)\s*:\s*(?:Bearer\s+)?\S+/gi,"[redacted credential]").replace(/\bBearer\s+\S+/gi,"[redacted credential]").replace(/\b(?:api[_-]?key|password|secret|token|account[_-]?id)\s*[=:]\s*[^\s,;]+/gi,"[redacted credential]").replace(/\b(?:account|organization)\s+(?:id\s+)?[A-Za-z0-9_-]{4,}/gi,"[redacted account]");return R(n).slice(0,Q)}function E(e){return typeof e=="boolean"?e:null}function G(e){return{browser_provider:_(e.browser_provider,N),provider_session_id:B(e.provider_session_id),provider_session_observed_at:h(e.provider_session_observed_at),provider_lookup_status:_(e.provider_lookup_status,D),provider_status:_(e.provider_status,U),provider_error_code:j(e.provider_error_code),provider_error_message:w(e.provider_error_message),provider_reason_source:_(e.provider_reason_source,M),provider_duration_ms:y(e.provider_duration_ms),provider_bandwidth_bytes:y(e.provider_bandwidth_bytes),provider_captcha:E(e.provider_captcha),provider_checked_at:h(e.provider_checked_at),provider_disconnect_observed:E(e.provider_disconnect_observed),provider_disconnect_message:w(e.provider_disconnect_message)}}function c(e,r=""){if(typeof e=="string"){let n=R(e);return f.test(r)&&(O.test(e)||x.test(e))?n=S("service_unavailable"):f.test(r)&&(n=b(n)),n}if(Array.isArray(e))return e.map(n=>c(n,r));if(e!==null&&typeof e=="object"){let n={};for(let[t,s]of Object.entries(e)){if(q.has(t))continue;let a=T[t]??t;if(F.has(t)){n[a]=null;continue}n[a]=c(s,t)}return n}return e}function te(e){return e.map(r=>{if(r===null||typeof r!="object"||Array.isArray(r))return c(r);let n=r,t=c(n);return Object.keys(n).some(a=>V.has(a))?{...t,...G(n)}:t})}function oe(e){let r=e?.diagnostics;if(!r)return e;let n=r.serpCompleteness,t=n?.queryIntegrity;return!r.debug&&!t?e:{...e,diagnostics:{...r,...r.debug?{debug:c(r.debug)}:{},...t?{serpCompleteness:{...n,queryIntegrity:{...t,outboundProviderMethod:"search"}}}:{}}}}export{v as a,K as b,W as c,Z as d,$ as e,X as f,J as g,ee as h,c as i,te as j,oe as k};
|
package/dist/chunk-YWUNN24S.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var o="0.95.1";export{o as a};
|
package/dist/worker-XPIO5TAV.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as a,s as b,t as c}from"./chunk-6NE4OIXR.js";import"./chunk-AK6HVF5F.js";import"./chunk-DYDAQQMC.js";import"./chunk-Y6STAKF3.js";import"./chunk-NZSDHDX3.js";import"./chunk-ZUGTYD2I.js";import"./chunk-EDQ57S4P.js";import"./chunk-GPSPSJBJ.js";import"./chunk-NA76FFGD.js";import"./chunk-6DTXIZY2.js";import"./chunk-XPEJB4BZ.js";import"./chunk-ZPK5LYEN.js";export{b as drainQueue,c as startWorker,a as tickOnce};
|