{"id":"3d56ab48-0303-4cdb-82d8-0ef6d49cfe62","entityType":"agent","slug":"clawhub-samiralibabic-ga4-analytics-search-indexing-skill","name":"Google Analytics & Google Search & Google Indexing Skill with Multi-Property Support","canonicalUrl":"https://www.xpersona.co/agent/clawhub-samiralibabic-ga4-analytics-search-indexing-skill","canonicalPath":"/agent/clawhub-samiralibabic-ga4-analytics-search-indexing-skill","generatedAt":"2026-10-09T21:57:18.808Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Google Analytics 4, Search Console, and Indexing API toolkit. Analyze website traffic, page performance, user demographics, real-time visitors, search queries, and SEO metrics. Use when the user asks to: check site traffic, analyze page views, see traffic sources, view user demographics, get real-time visitor data, check search console queries, analyze SEO performance, request URL re-indexing, inspect index status, compare date ranges, check bounce rates, view conversion data, or get e-commerce revenue. Requires a Google Cloud service account with GA4 and Search Console access.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 4/15/2026.","installCommand":"clawhub skill install kn782we8b9r5czpdrv6dqnqh3580kdj8:ga4-analytics-search-indexing-skill","sourceUrl":"https://clawhub.ai/samiralibabic/ga4-analytics-search-indexing-skill","homepage":"https://clawhub.ai/samiralibabic/ga4-analytics-search-indexing-skill","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/samiralibabic/ga4-analytics-search-indexing-skill","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Google Analytics & Google Search & Google Indexing Skill with Multi-Property Support technical dossier on Xpersona with agent coverage, OPENCLEW support, and li"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"stars":null,"forks":null,"downloads":1167,"packageName":null,"latestVersion":"1.0.0","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-02-28T23:59:01.297Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-02-28T23:59:01.297Z","lastIndexedAt":null,"nextCrawlAt":"2026-03-01T23:59:01.297Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.0","createdAt":"2026-02-05T16:00:28.575Z","changelog":"Complete Google Analytics Toolkit Supports: - Google Analytics - Google Search - Google Indexing - Multiple-properties/websites <- NEW! forked from https://clawhub.ai/adamkristopher/ga4-analytics","fileCount":17,"zipByteSize":42524}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install kn782we8b9r5czpdrv6dqnqh3580kdj8:ga4-analytics-search-indexing-skill","setupComplexity":"low","setupSteps":["Install using `clawhub skill install kn782we8b9r5czpdrv6dqnqh3580kdj8:ga4-analytics-search-indexing-skill` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/samiralibabic/ga4-analytics-search-indexing-skill before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T21:57:18.806Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-samiralibabic-ga4-analytics-search-indexing-skill/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"Skill: Google Analytics & Google Search & Google Indexing Skill with Multi-Property Support\n\nOwner: samiralibabic\n\nSummary: Google Analytics 4, Search Console, and Indexing API toolkit. Analyze website traffic, page performance, user demographics, real-time visitors, search queries, and SEO metrics. Use when the user asks to: check site traffic, analyze page views, see traffic sources, view user demographics, get real-time visitor data, check search console queries, analyze SEO performance, request URL re-indexing, inspect index status, compare date ranges, check bounce rates, view conversion data, or get e-commerce revenue. Requires a Google Cloud service account with GA4 and Search Console access.\n\nTags: latest:1.0.0\n\nVersion history:\n\nv1.0.0 | 2026-02-05T16:00:28.575Z | user\n\nComplete Google Analytics Toolkit\n\nSupports:\n- Google Analytics\n- Google Search\n- Google Indexing\n- Multiple-properties/websites <- NEW!\n\nforked from https://clawhub.ai/adamkristopher/ga4-analytics\n\nArchive index:\n\nArchive v1.0.0: 17 files, 42524 bytes\n\nFiles: _meta.json (154b), references/api-reference.md (12792b), scripts/package-lock.json (89291b), scripts/package.json (363b), scripts/setup.sh (48b), scripts/src/api/bulk-lookup.ts (4610b), scripts/src/api/indexing.ts (5505b), scripts/src/api/metadata.ts (1939b), scripts/src/api/realtime.ts (2322b), scripts/src/api/reports.ts (4174b), scripts/src/api/searchConsole.ts (4301b), scripts/src/config/settings.ts (1767b), scripts/src/core/client.ts (3506b), scripts/src/core/storage.ts (4506b), scripts/src/index.ts (13266b), scripts/tsconfig.json (490b), SKILL.md (6290b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: ga4-analytics\ndescription: \"Google Analytics 4, Search Console, and Indexing API toolkit. Analyze website traffic, page performance, user demographics, real-time visitors, search queries, and SEO metrics. Use when the user asks to: check site traffic, analyze page views, see traffic sources, view user demographics, get real-time visitor data, check search console queries, analyze SEO performance, request URL re-indexing, inspect index status, compare date ranges, check bounce rates, view conversion data, or get e-commerce revenue. Requires a Google Cloud service account with GA4 and Search Console access.\"\n---\n\n# GA4 Analytics Toolkit\n\n## Setup\n\nInstall dependencies:\n\n```bash\ncd scripts && npm install\n```\n\nConfigure credentials by creating a `.env` file in the project root:\n\n```\nGA4_PROPERTY_ID=123456789\nGA4_CLIENT_EMAIL=service-account@project.iam.gserviceaccount.com\nGA4_PRIVATE_KEY=\"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n\"\nSEARCH_CONSOLE_SITE_URL=https://your-domain.com\nGA4_DEFAULT_DATE_RANGE=30d\n```\n\n**Prerequisites**: A Google Cloud project with the Analytics Data API, Search Console API, and Indexing API enabled. A service account with access to your GA4 property and Search Console.\n\n## Quick Start\n\n| User says | Function to call |\n|-----------|-----------------|\n| \"Show me site traffic for the last 30 days\" | `siteOverview(\"30d\")` |\n| \"What are my top search queries?\" | `searchConsoleOverview(\"30d\")` |\n| \"Who's on the site right now?\" | `liveSnapshot()` |\n| \"Reindex these URLs\" | `reindexUrls([\"https://example.com/page1\", ...])` |\n| \"Compare this month vs last month\" | `compareDateRanges({startDate: \"30daysAgo\", endDate: \"today\"}, {startDate: \"60daysAgo\", endDate: \"31daysAgo\"})` |\n| \"What pages get the most traffic?\" | `contentPerformance(\"30d\")` |\n\nExecute functions by importing from `scripts/src/index.ts`:\n\n```typescript\nimport { siteOverview, searchConsoleOverview } from './scripts/src/index.js';\n\nconst overview = await siteOverview('30d');\n```\n\nOr run directly with tsx:\n\n```bash\nnpx tsx scripts/src/index.ts\n```\n\n## Workflow Pattern\n\nEvery analysis follows three phases:\n\n### 1. Analyze\nRun API functions. Each call hits the Google APIs and returns structured data.\n\n### 2. Auto-Save\nAll results automatically save as timestamped JSON files to `results/{category}/`. File naming pattern: `YYYYMMDD_HHMMSS__operation__extra_info.json`\n\n### 3. Summarize\nAfter analysis, read the saved JSON files and create a markdown summary in `results/summaries/` with data tables, trends, and recommendations.\n\n## High-Level Functions\n\n### GA4 Analytics\n\n| Function | Purpose | What it gathers |\n|----------|---------|----------------|\n| `siteOverview(dateRange?)` | Comprehensive site snapshot | Page views, traffic sources, demographics, events |\n| `trafficAnalysis(dateRange?)` | Traffic deep-dive | Sources, sessions by source/medium, new vs returning |\n| `contentPerformance(dateRange?)` | Top pages analysis | Page views, landing pages, exit pages |\n| `userBehavior(dateRange?)` | Engagement patterns | Demographics, events, daily engagement metrics |\n| `compareDateRanges(range1, range2)` | Period comparison | Side-by-side metrics for two date ranges |\n| `liveSnapshot()` | Real-time data | Active users, current pages, current events |\n\n### Search Console\n\n| Function | Purpose | What it gathers |\n|----------|---------|----------------|\n| `searchConsoleOverview(dateRange?)` | SEO snapshot | Top queries, pages, device, country breakdown |\n| `keywordAnalysis(dateRange?)` | Keyword deep-dive | Queries with device breakdown |\n| `seoPagePerformance(dateRange?)` | Page SEO metrics | Top pages by clicks, country breakdown |\n\n### Indexing\n\n| Function | Purpose |\n|----------|---------|\n| `reindexUrls(urls)` | Request re-indexing for multiple URLs |\n| `checkIndexStatus(urls)` | Check if URLs are indexed |\n\n### Utility\n\n| Function | Purpose |\n|----------|---------|\n| `getAvailableFields()` | List all available GA4 dimensions and metrics |\n\n### Individual API Functions\n\nFor granular control, import specific functions from the API modules. See [references/api-reference.md](references/api-reference.md) for the complete list of 30+ API functions with parameters, types, and examples.\n\n## Date Ranges\n\nAll functions accept flexible date range formats:\n\n| Format | Example | Description |\n|--------|---------|-------------|\n| Shorthand | `\"7d\"`, `\"30d\"`, `\"90d\"` | Days ago to today |\n| Explicit | `{startDate: \"2024-01-01\", endDate: \"2024-01-31\"}` | Specific dates |\n| GA4 relative | `{startDate: \"30daysAgo\", endDate: \"today\"}` | GA4 relative format |\n\nDefault is `\"30d\"` (configurable via `GA4_DEFAULT_DATE_RANGE` in `.env`).\n\n## Results Storage\n\nResults auto-save to `results/` with this structure:\n\n```\nresults/\n├── reports/          # GA4 standard reports\n├── realtime/         # Real-time snapshots\n├── searchconsole/    # Search Console data\n├── indexing/         # Indexing API results\n└── summaries/        # Human-readable markdown summaries\n```\n\n### Managing Results\n\n```typescript\nimport { listResults, loadResult, getLatestResult } from './scripts/src/index.js';\n\n// List recent results\nconst files = listResults('reports', 10);\n\n// Load a specific result\nconst data = loadResult(files[0]);\n\n// Get most recent result for an operation\nconst latest = getLatestResult('reports', 'site_overview');\n```\n\n## Common Dimensions and Metrics\n\n### Dimensions\n`pagePath`, `pageTitle`, `sessionSource`, `sessionMedium`, `country`, `deviceCategory`, `browser`, `date`, `eventName`, `landingPage`, `newVsReturning`\n\n### Metrics\n`screenPageViews`, `activeUsers`, `sessions`, `newUsers`, `bounceRate`, `averageSessionDuration`, `engagementRate`, `conversions`, `totalRevenue`, `eventCount`\n\n## Tips\n\n1. **Specify date ranges** — \"last 7 days\" or \"last 90 days\" gives different insights than the default 30 days\n2. **Request summaries** — After pulling data, ask for a markdown summary with tables and insights\n3. **Compare periods** — Use `compareDateRanges()` to spot trends (this month vs last month)\n4. **Check real-time data** — `liveSnapshot()` shows who's on the site right now\n5. **Combine GA4 + Search Console** — Traffic data plus search query data gives the full picture\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn782we8b9r5czpdrv6dqnqh3580kdj8\",\n  \"slug\": \"ga4-analytics-search-indexing-skill\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1770307228575\n}\n\nFile v1.0.0:references/api-reference.md\n\n# API Reference\n\nComplete function reference for all GA4 Analytics Toolkit modules.\n\n## Table of Contents\n\n- [Reports API](#reports-api) (7 functions)\n- [Realtime API](#realtime-api) (4 functions)\n- [Metadata API](#metadata-api) (3 functions)\n- [Search Console API](#search-console-api) (6 functions)\n- [Indexing API](#indexing-api) (4 functions)\n- [Bulk Lookup API](#bulk-lookup-api) (3 functions)\n- [Storage](#storage) (4 functions)\n\n---\n\n## Reports API\n\nImport: `from './api/reports.js'`\n\n### `parseDateRange(range?)`\n\nParse shorthand date range (e.g., \"7d\", \"30d\") to GA4 date range format.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `range` | `string \\| DateRange \\| undefined` | Settings default | Date range to parse |\n\n**Returns:** `DateRange` — `{startDate: string, endDate: string}`\n\n### `runReport(options)`\n\nRun a custom GA4 report with arbitrary dimensions and metrics.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `options.dimensions` | `string[]` | required | GA4 dimension names |\n| `options.metrics` | `string[]` | required | GA4 metric names |\n| `options.dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n| `options.filters` | `Record<string, string>` | `undefined` | Dimension filters |\n| `options.orderBy` | `string[]` | `undefined` | Sort order |\n| `options.limit` | `number` | `undefined` | Row limit |\n| `options.save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<ReportResponse>` — Rows with dimension and metric values.\n\n### `getPageViews(dateRange?)`\n\nGet page view data with paths, titles, users, and session duration.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `pagePath`, `pageTitle`\n**Metrics:** `screenPageViews`, `activeUsers`, `averageSessionDuration`\n\n### `getTrafficSources(dateRange?)`\n\nGet traffic source data by source, medium, and campaign.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `sessionSource`, `sessionMedium`, `sessionCampaignName`\n**Metrics:** `sessions`, `activeUsers`, `newUsers`, `bounceRate`\n\n### `getUserDemographics(dateRange?)`\n\nGet user demographic data by country, device, and browser.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `country`, `deviceCategory`, `browser`\n**Metrics:** `activeUsers`, `sessions`, `newUsers`\n\n### `getEventCounts(dateRange?)`\n\nGet event count data by event name.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `eventName`\n**Metrics:** `eventCount`, `eventCountPerUser`, `activeUsers`\n\n### `getConversions(dateRange?)`\n\nGet conversion data by event name and source.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `eventName`, `sessionSource`\n**Metrics:** `conversions`, `totalRevenue`\n\n### `getEcommerceRevenue(dateRange?)`\n\nGet e-commerce revenue data by date and transaction.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `date`, `transactionId`\n**Metrics:** `totalRevenue`, `ecommercePurchases`, `averagePurchaseRevenue`\n\n---\n\n## Realtime API\n\nImport: `from './api/realtime.js'`\n\n### `getActiveUsers(save?)`\n\nGet current active users by screen/page name.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<RealtimeResponse>` — Active users by `unifiedScreenName`.\n\n### `getRealtimeEvents(save?)`\n\nGet currently firing events.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<RealtimeResponse>` — Event counts by `eventName`.\n\n### `getRealtimePages(save?)`\n\nGet currently viewed pages.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<RealtimeResponse>` — Page views by `unifiedScreenName`.\n\n### `getRealtimeSources(save?)`\n\nGet current traffic sources.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<RealtimeResponse>` — Active users by `firstUserSource` and `firstUserMedium`.\n\n---\n\n## Metadata API\n\nImport: `from './api/metadata.js'`\n\n### `getAvailableDimensions(save?)`\n\nGet all available dimensions for the GA4 property.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<MetadataResponse>` — Array of `{apiName, uiName, description}`.\n\n### `getAvailableMetrics(save?)`\n\nGet all available metrics for the GA4 property.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<MetadataResponse>` — Array of `{apiName, uiName, description}`.\n\n### `getPropertyMetadata(save?)`\n\nGet full property metadata (dimensions + metrics combined).\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<MetadataResponse>` — Full metadata response.\n\n---\n\n## Search Console API\n\nImport: `from './api/searchConsole.js'`\n\n### `querySearchAnalytics(options)`\n\nRun a custom Search Console analytics query.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `options.dimensions` | `string[]` | `[\"query\"]` | Dimensions: `query`, `page`, `device`, `country`, `searchAppearance` |\n| `options.dateRange` | `string \\| SearchConsoleDateRange` | `\"30d\"` | Date range |\n| `options.rowLimit` | `number` | `1000` | Max rows |\n| `options.startRow` | `number` | `0` | Pagination offset |\n| `options.save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<SearchAnalyticsResponse>` — Rows with `{keys, clicks, impressions, ctr, position}`.\n\n### `getTopQueries(dateRange?)`\n\nGet top 100 search queries by clicks.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| SearchConsoleDateRange` | `\"30d\"` | Date range |\n\n**Returns:** `Promise<SearchAnalyticsResponse>`\n\n### `getTopPages(dateRange?)`\n\nGet top 100 pages by search impressions.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| SearchConsoleDateRange` | `\"30d\"` | Date range |\n\n**Returns:** `Promise<SearchAnalyticsResponse>`\n\n### `getDevicePerformance(dateRange?)`\n\nGet search performance breakdown by device type (desktop, mobile, tablet).\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| SearchConsoleDateRange` | `\"30d\"` | Date range |\n\n**Returns:** `Promise<SearchAnalyticsResponse>`\n\n### `getCountryPerformance(dateRange?)`\n\nGet search performance by country (top 50).\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| SearchConsoleDateRange` | `\"30d\"` | Date range |\n\n**Returns:** `Promise<SearchAnalyticsResponse>`\n\n### `getSearchAppearance(dateRange?)`\n\nGet search appearance data (rich results, AMP, etc.).\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| SearchConsoleDateRange` | `\"30d\"` | Date range |\n\n**Returns:** `Promise<SearchAnalyticsResponse>`\n\n---\n\n## Indexing API\n\nImport: `from './api/indexing.js'`\n\n### `requestIndexing(url, options?)`\n\nRequest Google to re-crawl a single URL.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `url` | `string` | required | Full URL to request indexing for |\n| `options.save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<UrlNotificationResult>` — `{url, type: 'URL_UPDATED', notifyTime}`.\n\n### `requestIndexingBatch(urls, options?)`\n\nRequest re-crawling for multiple URLs (processed sequentially to avoid rate limits).\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `urls` | `string[]` | required | Array of URLs |\n| `options.save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<UrlNotificationResult[]>`\n\n### `removeFromIndex(url, options?)`\n\nRequest URL removal from Google's index.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `url` | `string` | required | URL to remove |\n| `options.save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<UrlNotificationResult>` — `{url, type: 'URL_DELETED', notifyTime}`.\n\n### `inspectUrl(url, options?)`\n\nCheck a URL's index status, mobile usability, and rich results.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `url` | `string` | required | URL to inspect |\n| `options.save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<UrlInspectionResult>` — Contains `indexStatus.verdict` ('PASS' | 'FAIL' | 'NEUTRAL'), `coverageState`, `lastCrawlTime`, `mobileUsability`, `richResults`.\n\n---\n\n## Bulk Lookup API\n\nImport: `from './api/bulk-lookup.js'`\n\n### `normalizeUrls(urls)`\n\nNormalize page paths: trim whitespace, add leading slash.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `urls` | `string[]` | required | Array of page paths |\n\n**Returns:** `string[]` — Normalized paths.\n\n### `buildUrlFilter(urls)`\n\nBuild a GA4 dimension filter expression for a list of page paths.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `urls` | `string[]` | required | Normalized page paths |\n\n**Returns:** `DimensionFilterExpression | null`\n\n### `getMetricsForUrls(urls, options?)`\n\nGet GA4 metrics for specific page paths (bulk lookup).\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `urls` | `string[]` | required | Page paths (e.g., `[\"/pricing\", \"/about\"]`) |\n| `options.dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n| `options.metrics` | `string[]` | `[\"screenPageViews\", \"activeUsers\", \"averageSessionDuration\", \"bounceRate\", \"engagementRate\"]` | Metrics to retrieve |\n| `options.save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<ReportResponse>` — Metrics for each URL.\n\n---\n\n## Storage\n\nImport: `from './core/storage.js'`\n\n### `saveResult<T>(data, category, operation, extraInfo?)`\n\nSave result data to a timestamped JSON file with metadata wrapper.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `data` | `T` | required | Data to save |\n| `category` | `string` | required | Category directory (e.g., `\"reports\"`, `\"realtime\"`) |\n| `operation` | `string` | required | Operation name (e.g., `\"page_views\"`) |\n| `extraInfo` | `string` | `undefined` | Optional extra info for filename |\n\n**Returns:** `string` — Full path to the saved file.\n\n### `loadResult<T>(filepath)`\n\nLoad a previously saved result from a JSON file.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `filepath` | `string` | required | Path to the JSON file |\n\n**Returns:** `SavedResult<T> | null`\n\n### `listResults(category, limit?)`\n\nList saved result files for a category, sorted newest first.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `category` | `string` | required | Category to list |\n| `limit` | `number` | `undefined` | Max results to return |\n\n**Returns:** `string[]` — Array of file paths.\n\n### `getLatestResult<T>(category, operation?)`\n\nGet the most recent result for a category, optionally filtered by operation.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `category` | `string` | required | Category to search |\n| `operation` | `string` | `undefined` | Filter by operation name |\n\n**Returns:** `SavedResult<T> | null`\n\nFile v1.0.0:scripts/package-lock.json\n\n{\n  \"name\": \"ga4-toolkit\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"ga4-toolkit\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"@google-analytics/data\": \"^4.9.0\",\n        \"@googleapis/indexing\": \"^6.0.1\",\n        \"@googleapis/searchconsole\": \"^6.0.1\",\n        \"dotenv\": \"^16.4.7\",\n        \"googleapis\": \"^170.0.0\",\n        \"tsx\": \"^4.19.2\",\n        \"typescript\": \"^5.7.2\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz\",\n      \"integrity\": \"sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz\",\n      \"integrity\": \"sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz\",\n      \"integrity\": \"sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz\",\n      \"integrity\": \"sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz\",\n      \"integrity\": \"sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz\",\n      \"integrity\": \"sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz\",\n      \"integrity\": \"sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz\",\n      \"integrity\": \"sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz\",\n      \"integrity\": \"sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz\",\n      \"integrity\": \"sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@google-analytics/data\": {\n      \"version\": \"4.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@google-analytics/data/-/data-4.12.1.tgz\",\n      \"integrity\": \"sha512-LzyrkVrnVUTYTmdmHayOZoroc+YA9GHEUrkSSuiXSmMSNbesuWy/MoTXugC1V7+8PCGqb2eQ1UtVVv/2BCAQYA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"google-gax\": \"^4.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@googleapis/indexing\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@googleapis/indexing/-/indexing-6.0.1.tgz\",\n      \"integrity\": \"sha512-JQuHax6UaTv9Y/sYsmlyRe5nZvPKPjHfe6AhM2wnl3xg2iuD6MGAU3wX3SdjOiM6r6iEggGNTfMdrtsZhuR5AA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"googleapis-common\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      }\n    },\n    \"node_modules/@googleapis/searchconsole\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@googleapis/searchconsole/-/searchconsole-6.0.1.tgz\",\n      \"integrity\": \"sha512-aSBv0yp9HV9BgqX3bUj2DRY2kaIwcoN6ift+fKwPXj8eMoccJZzceQNshxt44V2ECkqwn7gvVEXVYTkw6zaTeQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"googleapis-common\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      }\n    },\n    \"node_modules/@grpc/grpc-js\": {\n      \"version\": \"1.14.3\",\n      \"resolved\": \"https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz\",\n      \"integrity\": \"sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@grpc/proto-loader\": \"^0.8.0\",\n        \"@js-sdsl/ordered-map\": \"^4.4.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12.10.0\"\n      }\n    },\n    \"node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader\": {\n      \"version\": \"0.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz\",\n      \"integrity\": \"sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"lodash.camelcase\": \"^4.3.0\",\n        \"long\": \"^5.0.0\",\n        \"protobufjs\": \"^7.5.3\",\n        \"yargs\": \"^17.7.2\"\n      },\n      \"bin\": {\n        \"proto-loader-gen-types\": \"build/bin/proto-loader-gen-types.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/@grpc/proto-loader\": {\n      \"version\": \"0.7.15\",\n      \"resolved\": \"https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz\",\n      \"integrity\": \"sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"lodash.camelcase\": \"^4.3.0\",\n        \"long\": \"^5.0.0\",\n        \"protobufjs\": \"^7.2.5\",\n        \"yargs\": \"^17.7.2\"\n      },\n      \"bin\": {\n        \"proto-loader-gen-types\": \"build/bin/proto-loader-gen-types.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/ansi-regex\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz\",\n      \"integrity\": \"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/ansi-styles\": {\n      \"version\": \"6.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz\",\n      \"integrity\": \"sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@isaacs/cliui/node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/strip-ansi\": {\n      \"version\": \"7.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz\",\n      \"integrity\": \"sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/@js-sdsl/ordered-map\": {\n      \"version\": \"4.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz\",\n      \"integrity\": \"sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/js-sdsl\"\n      }\n    },\n    \"node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/@protobufjs/aspromise\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz\",\n      \"integrity\": \"sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/base64\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz\",\n      \"integrity\": \"sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/codegen\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz\",\n      \"integrity\": \"sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/eventemitter\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz\",\n      \"integrity\": \"sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/fetch\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz\",\n      \"integrity\": \"sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"@protobufjs/aspromise\": \"^1.1.1\",\n        \"@protobufjs/inquire\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/@protobufjs/float\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz\",\n      \"integrity\": \"sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/inquire\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz\",\n      \"integrity\": \"sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/path\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz\",\n      \"integrity\": \"sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/pool\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz\",\n      \"integrity\": \"sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@protobufjs/utf8\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz\",\n      \"integrity\": \"sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/@tootallnate/once\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz\",\n      \"integrity\": \"sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@types/caseless\": {\n      \"version\": \"0.12.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz\",\n      \"integrity\": \"sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/long\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n      \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"25.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz\",\n      \"integrity\": \"sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~7.16.0\"\n      }\n    },\n    \"node_modules/@types/request\": {\n      \"version\": \"2.48.13\",\n      \"resolved\": \"https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz\",\n      \"integrity\": \"sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/caseless\": \"*\",\n        \"@types/node\": \"*\",\n        \"@types/tough-cookie\": \"*\",\n        \"form-data\": \"^2.5.5\"\n      }\n    },\n    \"node_modules/@types/tough-cookie\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz\",\n      \"integrity\": \"sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/abort-controller\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz\",\n      \"integrity\": \"sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"event-target-shim\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.5\"\n      }\n    },\n    \"node_modules/agent-base\": {\n      \"version\": \"7.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz\",\n      \"integrity\": \"sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/asynckit\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/base64-js\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz\",\n      \"integrity\": \"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/bignumber.js\": {\n      \"version\": \"9.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz\",\n      \"integrity\": \"sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/brace-expansion\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz\",\n      \"integrity\": \"sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/buffer-equal-constant-time\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz\",\n      \"integrity\": \"sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/cliui\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n      \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"wrap-ansi\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/combined-stream\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"delayed-stream\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/cross-spawn\": {\n      \"version\": \"7.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n      \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/data-uri-to-buffer\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz\",\n      \"integrity\": \"sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/delayed-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/dotenv\": {\n      \"version\": \"16.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz\",\n      \"integrity\": \"sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://dotenvx.com\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/duplexify\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz\",\n      \"integrity\": \"sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"end-of-stream\": \"^1.4.1\",\n        \"inherits\": \"^2.0.3\",\n        \"readable-stream\": \"^3.1.1\",\n        \"stream-shift\": \"^1.0.2\"\n      }\n    },\n    \"node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/ecdsa-sig-formatter\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz\",\n      \"integrity\": \"sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"safe-buffer\": \"^5.0.1\"\n      }\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/end-of-stream\": {\n      \"version\": \"1.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz\",\n      \"integrity\": \"sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"once\": \"^1.4.0\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-set-tostringtag\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\n      \"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.6\",\n        \"has-tostringtag\": \"^1.0.2\",\n        \"hasown\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/esbuild\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz\",\n      \"integrity\": \"sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"esbuild\": \"bin/esbuild\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"@esbuild/aix-ppc64\": \"0.27.2\",\n        \"@esbuild/android-arm\": \"0.27.2\",\n        \"@esbuild/android-arm64\": \"0.27.2\",\n        \"@esbuild/android-x64\": \"0.27.2\",\n        \"@esbuild/darwin-arm64\": \"0.27.2\",\n        \"@esbuild/darwin-x64\": \"0.27.2\",\n        \"@esbuild/freebsd-arm64\": \"0.27.2\",\n        \"@esbuild/freebsd-x64\": \"0.27.2\",\n        \"@esbuild/linux-arm\": \"0.27.2\",\n        \"@esbuild/linux-arm64\": \"0.27.2\",\n        \"@esbuild/linux-ia32\": \"0.27.2\",\n        \"@esbuild/linux-loong64\": \"0.27.2\",\n        \"@esbuild/linux-mips64el\": \"0.27.2\",\n        \"@esbuild/linux-ppc64\": \"0.27.2\",\n        \"@esbuild/linux-riscv64\": \"0.27.2\",\n        \"@esbuild/linux-s390x\": \"0.27.2\",\n        \"@esbuild/linux-x64\": \"0.27.2\",\n        \"@esbuild/netbsd-arm64\": \"0.27.2\",\n        \"@esbuild/netbsd-x64\": \"0.27.2\",\n        \"@esbuild/openbsd-arm64\": \"0.27.2\",\n        \"@esbuild/openbsd-x64\": \"0.27.2\",\n        \"@esbuild/openharmony-arm64\": \"0.27.2\",\n        \"@esbuild/sunos-x64\": \"0.27.2\",\n        \"@esbuild/win32-arm64\": \"0.27.2\",\n        \"@esbuild/win32-ia32\": \"0.27.2\",\n        \"@esbuild/win32-x64\": \"0.27.2\"\n      }\n    },\n    \"node_modules/escalade\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n      \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/event-target-shim\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz\",\n      \"integrity\": \"sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/extend\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/extend/-/extend-3.0.2.tgz\",\n      \"integrity\": \"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fetch-blob\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz\",\n      \"integrity\": \"sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/jimmywarting\"\n        },\n        {\n          \"type\": \"paypal\",\n          \"url\": \"https://paypal.me/jimmywarting\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"node-domexception\": \"^1.0.0\",\n        \"web-streams-polyfill\": \"^3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20 || >= 14.13\"\n      }\n    },\n    \"node_modules/foreground-child\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz\",\n      \"integrity\": \"sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.6\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/form-data\": {\n      \"version\": \"2.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz\",\n      \"integrity\": \"sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"asynckit\": \"^0.4.0\",\n        \"combined-stream\": \"^1.0.8\",\n        \"es-set-tostringtag\": \"^2.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"mime-types\": \"^2.1.35\",\n        \"safe-buffer\": \"^5.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.12\"\n      }\n    },\n    \"node_modules/formdata-polyfill\": {\n      \"version\": \"4.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz\",\n      \"integrity\": \"sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"fetch-blob\": \"^3.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12.20.0\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n      \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/gaxios\": {\n      \"version\": \"6.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz\",\n      \"integrity\": \"sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"extend\": \"^3.0.2\",\n        \"https-proxy-agent\": \"^7.0.1\",\n        \"is-stream\": \"^2.0.0\",\n        \"node-fetch\": \"^2.6.9\",\n        \"uuid\": \"^9.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/gcp-metadata\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz\",\n      \"integrity\": \"sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"gaxios\": \"^6.1.1\",\n        \"google-logging-utils\": \"^0.0.2\",\n        \"json-bigint\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/get-caller-file\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"6.* || 8.* || >= 10.*\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/get-tsconfig\": {\n      \"version\": \"4.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz\",\n      \"integrity\": \"sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"resolve-pkg-maps\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n      }\n    },\n    \"node_modules/glob\": {\n      \"version\": \"10.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.5.0.tgz\",\n      \"integrity\": \"sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^3.1.2\",\n        \"minimatch\": \"^9.0.4\",\n        \"minipass\": \"^7.1.2\",\n        \"package-json-from-dist\": \"^1.0.0\",\n        \"path-scurry\": \"^1.11.1\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/esm/bin.mjs\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/google-auth-library\": {\n      \"version\": \"9.15.1\",\n      \"resolved\": \"https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz\",\n      \"integrity\": \"sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.0\",\n        \"ecdsa-sig-formatter\": \"^1.0.11\",\n        \"gaxios\": \"^6.1.1\",\n        \"gcp-metadata\": \"^6.1.0\",\n        \"gtoken\": \"^7.0.0\",\n        \"jws\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/google-gax\": {\n      \"version\": \"4.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz\",\n      \"integrity\": \"sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@grpc/grpc-js\": \"^1.10.9\",\n        \"@grpc/proto-loader\": \"^0.7.13\",\n        \"@types/long\": \"^4.0.0\",\n        \"abort-controller\": \"^3.0.0\",\n        \"duplexify\": \"^4.0.0\",\n        \"google-auth-library\": \"^9.3.0\",\n        \"node-fetch\": \"^2.7.0\",\n        \"object-hash\": \"^3.0.0\",\n        \"proto3-json-serializer\": \"^2.0.2\",\n        \"protobufjs\": \"^7.3.2\",\n        \"retry-request\": \"^7.0.0\",\n        \"uuid\": \"^9.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/google-logging-utils\": {\n      \"version\": \"0.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz\",\n      \"integrity\": \"sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/googleapis\": {\n      \"version\": \"170.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/googleapis/-/googleapis-170.1.0.tgz\",\n      \"integrity\": \"sha512-RLbc7yG6qzZqvAmGcgjvNIoZ7wpcCFxtc+HN+46etxDrlO4a8l5Cb7NxNQGhV91oRmL7mt56VoRoypAtEQEIKg==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"google-auth-library\": \"^10.2.0\",\n        \"googleapis-common\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/googleapis-common\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.1.tgz\",\n      \"integrity\": \"sha512-eCzNACUXPb1PW5l0ULTzMHaL/ltPRADoPgjBlT8jWsTbxkCp6siv+qKJ/1ldaybCthGwsYFYallF7u9AkU4L+A==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"extend\": \"^3.0.2\",\n        \"gaxios\": \"^7.0.0-rc.4\",\n        \"google-auth-library\": \"^10.1.0\",\n        \"qs\": \"^6.7.0\",\n        \"url-template\": \"^2.0.8\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\"\n    \n\nFile v1.0.0:scripts/package.json\n\n{\n  \"name\": \"ga4-toolkit\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"dependencies\": {\n    \"@google-analytics/data\": \"^4.9.0\",\n    \"@googleapis/indexing\": \"^6.0.1\",\n    \"@googleapis/searchconsole\": \"^6.0.1\",\n    \"dotenv\": \"^16.4.7\",\n    \"googleapis\": \"^170.0.0\",\n    \"tsx\": \"^4.19.2\",\n    \"typescript\": \"^5.7.2\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n\nFile v1.0.0:scripts/tsconfig.json\n\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"lib\": [\"ES2022\"],\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\", \"tests\"]\n}","readmeExcerpt":"Skill: Google Analytics & Google Search & Google Indexing Skill with Multi-Property Support Owner: samiralibabic Summary: Google Analytics 4, Search Console, and Indexing API toolkit. Analyze website traffic, page performance, user demographics, real-time visitors, search queries, and SEO metrics. Use when the user asks to: check site traffic, analyze page views, see traffic sources, view user demographics, get real-","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"cd scripts && npm install"},{"language":"text","snippet":"GA4_PROPERTY_ID=123456789\nGA4_CLIENT_EMAIL=service-account@project.iam.gserviceaccount.com\nGA4_PRIVATE_KEY=\"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n\"\nSEARCH_CONSOLE_SITE_URL=https://your-domain.com\nGA4_DEFAULT_DATE_RANGE=30d"},{"language":"typescript","snippet":"import { siteOverview, searchConsoleOverview } from './scripts/src/index.js';\n\nconst overview = await siteOverview('30d');"},{"language":"bash","snippet":"npx tsx scripts/src/index.ts"},{"language":"text","snippet":"results/\n├── reports/          # GA4 standard reports\n├── realtime/         # Real-time snapshots\n├── searchconsole/    # Search Console data\n├── indexing/         # Indexing API results\n└── summaries/        # Human-readable markdown summaries"},{"language":"typescript","snippet":"import { listResults, loadResult, getLatestResult } from './scripts/src/index.js';\n\n// List recent results\nconst files = listResults('reports', 10);\n\n// Load a specific result\nconst data = loadResult(files[0]);\n\n// Get most recent result for an operation\nconst latest = getLatestResult('reports', 'site_overview');"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: ga4-analytics\ndescription: \"Google Analytics 4, Search Console, and Indexing API toolkit. Analyze website traffic, page performance, user demographics, real-time visitors, search queries, and SEO metrics. Use when the user asks to: check site traffic, analyze page views, see traffic sources, view user demographics, get real-time visitor data, check search console queries, analyze SEO performance, request URL re-indexing, inspect index status, compare date ranges, check bounce rates, view conversion data, or get e-commerce revenue. Requires a Google Cloud service account with GA4 and Search Console access.\"\n---\n\n# GA4 Analytics Toolkit\n\n## Setup\n\nInstall dependencies:\n\n```bash\ncd scripts && npm install\n```\n\nConfigure credentials by creating a `.env` file in the project root:\n\n```\nGA4_PROPERTY_ID=123456789\nGA4_CLIENT_EMAIL=service-account@project.iam.gserviceaccount.com\nGA4_PRIVATE_KEY=\"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n\"\nSEARCH_CONSOLE_SITE_URL=https://your-domain.com\nGA4_DEFAULT_DATE_RANGE=30d\n```\n\n**Prerequisites**: A Google Cloud project with the Analytics Data API, Search Console API, and Indexing API enabled. A service account with access to your GA4 property and Search Console.\n\n## Quick Start\n\n| User says | Function to call |\n|-----------|-----------------|\n| \"Show me site traffic for the last 30 days\" | `siteOverview(\"30d\")` |\n| \"What are my top search queries?\" | `searchConsoleOverview(\"30d\")` |\n| \"Who's on the site right now?\" | `liveSnapshot()` |\n| \"Reindex these URLs\" | `reindexUrls([\"https://example.com/page1\", ...])` |\n| \"Compare this month vs last month\" | `compareDateRanges({startDate: \"30daysAgo\", endDate: \"today\"}, {startDate: \"60daysAgo\", endDate: \"31daysAgo\"})` |\n| \"What pages get the most traffic?\" | `contentPerformance(\"30d\")` |\n\nExecute functions by importing from `scripts/src/index.ts`:\n\n```typescript\nimport { siteOverview, searchConsoleOverview } from './scripts/src/index.js';\n\nconst overview = await siteOverview('30d');\n```\n\nOr run directly with tsx:\n\n```bash\nnpx tsx scripts/src/index.ts\n```\n\n## Workflow Pattern\n\nEvery analysis follows three phases:\n\n### 1. Analyze\nRun API functions. Each call hits the Google APIs and returns structured data.\n\n### 2. Auto-Save\nAll results automatically save as timestamped JSON files to `results/{category}/`. File naming pattern: `YYYYMMDD_HHMMSS__operation__extra_info.json`\n\n### 3. Summarize\nAfter analysis, read the saved JSON files and create a markdown summary in `results/summaries/` with data tables, trends, and recommendations.\n\n## High-Level Functions\n\n### GA4 Analytics\n\n| Function | Purpose | What it gathers |\n|----------|---------|----------------|\n| `siteOverview(dateRange?)` | Comprehensive site snapshot | Page views, traffic sources, demographics, events |\n| `trafficAnalysis(dateRange?)` | Traffic deep-dive | Sources, sessions by source/medium, new vs returning |\n| `contentPerformance(dateRange?)` | Top pages analysis | Page views, landing pa"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn782we8b9r5czpdrv6dqnqh3580kdj8\",\n  \"slug\": \"ga4-analytics-search-indexing-skill\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1770307228575\n}"},{"path":"references/api-reference.md","content":"# API Reference\n\nComplete function reference for all GA4 Analytics Toolkit modules.\n\n## Table of Contents\n\n- [Reports API](#reports-api) (7 functions)\n- [Realtime API](#realtime-api) (4 functions)\n- [Metadata API](#metadata-api) (3 functions)\n- [Search Console API](#search-console-api) (6 functions)\n- [Indexing API](#indexing-api) (4 functions)\n- [Bulk Lookup API](#bulk-lookup-api) (3 functions)\n- [Storage](#storage) (4 functions)\n\n---\n\n## Reports API\n\nImport: `from './api/reports.js'`\n\n### `parseDateRange(range?)`\n\nParse shorthand date range (e.g., \"7d\", \"30d\") to GA4 date range format.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `range` | `string \\| DateRange \\| undefined` | Settings default | Date range to parse |\n\n**Returns:** `DateRange` — `{startDate: string, endDate: string}`\n\n### `runReport(options)`\n\nRun a custom GA4 report with arbitrary dimensions and metrics.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `options.dimensions` | `string[]` | required | GA4 dimension names |\n| `options.metrics` | `string[]` | required | GA4 metric names |\n| `options.dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n| `options.filters` | `Record<string, string>` | `undefined` | Dimension filters |\n| `options.orderBy` | `string[]` | `undefined` | Sort order |\n| `options.limit` | `number` | `undefined` | Row limit |\n| `options.save` | `boolean` | `true` | Save results to JSON |\n\n**Returns:** `Promise<ReportResponse>` — Rows with dimension and metric values.\n\n### `getPageViews(dateRange?)`\n\nGet page view data with paths, titles, users, and session duration.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `pagePath`, `pageTitle`\n**Metrics:** `screenPageViews`, `activeUsers`, `averageSessionDuration`\n\n### `getTrafficSources(dateRange?)`\n\nGet traffic source data by source, medium, and campaign.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `sessionSource`, `sessionMedium`, `sessionCampaignName`\n**Metrics:** `sessions`, `activeUsers`, `newUsers`, `bounceRate`\n\n### `getUserDemographics(dateRange?)`\n\nGet user demographic data by country, device, and browser.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `country`, `deviceCategory`, `browser`\n**Metrics:** `activeUsers`, `sessions`, `newUsers`\n\n### `getEventCounts(dateRange?)`\n\nGet event count data by event name.\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dateRange` | `string \\| DateRange` | `\"30d\"` | Date range |\n\n**Dimensions:** `eventName`\n**Metrics:** `eventCount`, `eventCountPerUser`, `activ"},{"path":"scripts/package-lock.json","content":"{\n  \"name\": \"ga4-toolkit\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"ga4-toolkit\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"@google-analytics/data\": \"^4.9.0\",\n        \"@googleapis/indexing\": \"^6.0.1\",\n        \"@googleapis/searchconsole\": \"^6.0.1\",\n        \"dotenv\": \"^16.4.7\",\n        \"googleapis\": \"^170.0.0\",\n        \"tsx\": \"^4.19.2\",\n        \"typescript\": \"^5.7.2\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz\",\n      \"integrity\": \"sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz\",\n      \"integrity\": \"sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz\",\n      \"integrity\": \"sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz\",\n      \"integrity\": \"sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.27.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x"},{"path":"scripts/package.json","content":"{\n  \"name\": \"ga4-toolkit\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"dependencies\": {\n    \"@google-analytics/data\": \"^4.9.0\",\n    \"@googleapis/indexing\": \"^6.0.1\",\n    \"@googleapis/searchconsole\": \"^6.0.1\",\n    \"dotenv\": \"^16.4.7\",\n    \"googleapis\": \"^170.0.0\",\n    \"tsx\": \"^4.19.2\",\n    \"typescript\": \"^5.7.2\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1432,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T21:57:18.808Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}