seo 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import { createRequire as __seoCreateRequire } from 'node:module'; const require = __seoCreateRequire(import.meta.url);
2
- import { n as load, t as version } from "./package-BF_XgK7-.js";
2
+ import { n as load, t as version } from "./package-BI-bLeV4.js";
3
3
  import { Headers, fetch as fetch$1 } from "undici";
4
4
  import { chmodSync, createWriteStream, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
5
- import { homedir } from "node:os";
5
+ import { arch, homedir, platform } from "node:os";
6
6
  import { dirname, join } from "node:path";
7
7
  import { z } from "zod";
8
8
  import lockfile from "proper-lockfile";
9
9
  import crypto, { createHash, randomUUID, sign } from "node:crypto";
10
10
  import http from "node:http";
11
11
  import open from "open";
12
- import Database from "better-sqlite3";
12
+ import Libsql from "libsql";
13
13
  import { Readability } from "@mozilla/readability";
14
14
  import Defuddle from "defuddle";
15
15
  import { parseHTML } from "linkedom";
@@ -146,6 +146,7 @@ function resolveSeoCliPaths(input = {}) {
146
146
  configFile: join(configDir, "config.json"),
147
147
  tokensFile: join(configDir, "tokens.json"),
148
148
  oauthClientFile: join(configDir, "oauth-client.json"),
149
+ telemetryStateFile: join(configDir, "telemetry.json"),
149
150
  cacheDbFile: join(cacheDir, "cache.db")
150
151
  };
151
152
  }
@@ -493,6 +494,12 @@ function getPrivacySnapshot() {
493
494
  mode: fileMode(paths.oauthClientFile),
494
495
  sizeBytes: sizeOf(paths.oauthClientFile)
495
496
  },
497
+ {
498
+ label: "Telemetry state",
499
+ path: paths.telemetryStateFile,
500
+ mode: fileMode(paths.telemetryStateFile),
501
+ sizeBytes: sizeOf(paths.telemetryStateFile)
502
+ },
496
503
  {
497
504
  label: "Cache DB",
498
505
  path: paths.cacheDbFile,
@@ -1069,6 +1076,52 @@ async function exchangeCode(input) {
1069
1076
  return tokenResponse.json();
1070
1077
  }
1071
1078
  //#endregion
1079
+ //#region packages/core/src/storage/sqlite.ts
1080
+ function withoutDriverMetadata(row) {
1081
+ if (!row || typeof row !== "object" || Array.isArray(row)) return row;
1082
+ const { _metadata: _driverMetadata, ...data } = row;
1083
+ return data;
1084
+ }
1085
+ var Statement = class {
1086
+ statement;
1087
+ constructor(statement) {
1088
+ this.statement = statement;
1089
+ }
1090
+ run(...params) {
1091
+ return this.statement.run(...params);
1092
+ }
1093
+ get(...params) {
1094
+ return withoutDriverMetadata(this.statement.get(...params));
1095
+ }
1096
+ all(...params) {
1097
+ return this.statement.all(...params).map(withoutDriverMetadata);
1098
+ }
1099
+ };
1100
+ var SqliteDatabase = class {
1101
+ database;
1102
+ constructor(filename) {
1103
+ this.database = new Libsql(filename);
1104
+ }
1105
+ prepare(source) {
1106
+ return new Statement(this.database.prepare(source));
1107
+ }
1108
+ transaction(fn) {
1109
+ return this.database.transaction(fn);
1110
+ }
1111
+ exec(source) {
1112
+ this.database.exec(source);
1113
+ return this;
1114
+ }
1115
+ pragma(source) {
1116
+ const result = this.database.pragma(source);
1117
+ return Array.isArray(result) ? result.map(withoutDriverMetadata) : withoutDriverMetadata(result);
1118
+ }
1119
+ close() {
1120
+ this.database.close();
1121
+ return this;
1122
+ }
1123
+ };
1124
+ //#endregion
1072
1125
  //#region packages/core/src/storage/database.ts
1073
1126
  const CREATE_SQL = `
1074
1127
  CREATE TABLE IF NOT EXISTS sites (
@@ -1352,10 +1405,14 @@ function getDb() {
1352
1405
  recursive: true,
1353
1406
  mode: 448
1354
1407
  });
1355
- db = new Database(path);
1408
+ db = new SqliteDatabase(path);
1356
1409
  initDb(db);
1357
1410
  return db;
1358
1411
  }
1412
+ function checkDatabaseReadiness() {
1413
+ if (getDb().prepare("SELECT 1 AS ready").get()?.ready !== 1) throw new Error("The local SQLite database did not return a readiness row.");
1414
+ return { dbPath: getSeoCliPaths().cacheDbFile };
1415
+ }
1359
1416
  function hashKey(parts) {
1360
1417
  const json = JSON.stringify(parts);
1361
1418
  return Buffer.from(json).toString("base64url");
@@ -27746,7 +27803,7 @@ function setDefaultClient(idOrName) {
27746
27803
  //#endregion
27747
27804
  //#region packages/core/src/doctor.ts
27748
27805
  const REQUIRED_SCOPES = ["https://www.googleapis.com/auth/webmasters.readonly", "https://www.googleapis.com/auth/analytics.readonly"];
27749
- async function runDoctor() {
27806
+ async function runDoctor(dependencies = {}) {
27750
27807
  const paths = getSeoCliPaths();
27751
27808
  const config = readConfig();
27752
27809
  const authMode = getAuthModeStatus();
@@ -27755,6 +27812,23 @@ async function runDoctor() {
27755
27812
  const oauthClient = readOauthClient();
27756
27813
  const tokenClientConfigured = tokens ? Boolean(getClientConfig(tokens.client_source)) : void 0;
27757
27814
  const checks = [];
27815
+ try {
27816
+ const database = (dependencies.checkDatabase ?? checkDatabaseReadiness)();
27817
+ checks.push({
27818
+ id: "local-database",
27819
+ label: "Local database",
27820
+ status: "pass",
27821
+ detail: database.dbPath
27822
+ });
27823
+ } catch (error) {
27824
+ checks.push({
27825
+ id: "local-database",
27826
+ label: "Local database",
27827
+ status: "fail",
27828
+ detail: error instanceof Error ? error.message : "The local database could not be opened.",
27829
+ fix: "Upgrade or reinstall `seo`. If this still fails, report it at https://github.com/iannuttall/seo/issues."
27830
+ });
27831
+ }
27758
27832
  checks.push({
27759
27833
  id: "config-dir",
27760
27834
  label: "Config directory",
@@ -28480,6 +28554,371 @@ var JsonFileStorageAdapter = class {
28480
28554
  };
28481
28555
  const localCredentialsProvider = new LocalCredentialsProvider();
28482
28556
  //#endregion
28557
+ //#region packages/core/src/version.ts
28558
+ const SEO_VERSION = version;
28559
+ //#endregion
28560
+ //#region packages/core/src/telemetry.ts
28561
+ const TELEMETRY_ENDPOINT = "https://seoskill.dev/api/t";
28562
+ const TELEMETRY_SCHEMA_VERSION = 1;
28563
+ const TELEMETRY_TIMEOUT_MS = 2e3;
28564
+ const TELEMETRY_EVENTS = [
28565
+ "first_run",
28566
+ "setup_complete",
28567
+ "audit_start",
28568
+ "audit_complete",
28569
+ "audit_failed",
28570
+ "first_audit_complete",
28571
+ "active_d1",
28572
+ "active_d7",
28573
+ "active_d30"
28574
+ ];
28575
+ const TELEMETRY_AGENTS = [
28576
+ "claude-code",
28577
+ "cursor",
28578
+ "codex",
28579
+ "cli",
28580
+ "unknown"
28581
+ ];
28582
+ const TELEMETRY_ERROR_CATEGORIES = [
28583
+ "auth",
28584
+ "crawl_timeout",
28585
+ "network",
28586
+ "config",
28587
+ "unknown"
28588
+ ];
28589
+ const TELEMETRY_REPORTS = [
28590
+ "affected-urls",
28591
+ "agent-readiness",
28592
+ "ai-readiness",
28593
+ "ai-referrals",
28594
+ "ai-search-scorecard",
28595
+ "audit-page",
28596
+ "audit-urls",
28597
+ "cannibalisation",
28598
+ "community-intent",
28599
+ "compare-crawls",
28600
+ "content-optimization",
28601
+ "crawl-diff",
28602
+ "site-crawl",
28603
+ "ctr-underperformers",
28604
+ "decaying-pages",
28605
+ "setup-check",
28606
+ "entity-readiness",
28607
+ "explain-crawl-issue",
28608
+ "geo-gaps",
28609
+ "crawl-report",
28610
+ "index-coverage",
28611
+ "index-coverage-plan",
28612
+ "index-monitor",
28613
+ "index-watch",
28614
+ "internal-links",
28615
+ "link-recovery",
28616
+ "crawl-history",
28617
+ "crawler-rules",
28618
+ "llms-txt-audit",
28619
+ "generate-llms-txt",
28620
+ "measure-change",
28621
+ "monthly-report",
28622
+ "okf-build",
28623
+ "okf-validate",
28624
+ "page-opportunities",
28625
+ "performance-audit",
28626
+ "pseo-audit",
28627
+ "query-clusters",
28628
+ "quick-wins",
28629
+ "redirect-trace",
28630
+ "narrative-report",
28631
+ "second-page",
28632
+ "segment-impact",
28633
+ "striking-distance",
28634
+ "seo-to-ai-query",
28635
+ "top-fixes",
28636
+ "traffic-anomaly",
28637
+ "update-correlation",
28638
+ "search-performance-overview",
28639
+ "monthly-action-plan",
28640
+ "refresh-priorities",
28641
+ "technical-watch",
28642
+ "update-postmortem"
28643
+ ];
28644
+ const RETENTION_MILESTONES = [
28645
+ {
28646
+ days: 1,
28647
+ event: "active_d1"
28648
+ },
28649
+ {
28650
+ days: 7,
28651
+ event: "active_d7"
28652
+ },
28653
+ {
28654
+ days: 30,
28655
+ event: "active_d30"
28656
+ }
28657
+ ];
28658
+ const CI_ENVIRONMENT_KEYS = [
28659
+ "GITHUB_ACTIONS",
28660
+ "GITLAB_CI",
28661
+ "CIRCLECI",
28662
+ "TRAVIS",
28663
+ "BUILDKITE",
28664
+ "JENKINS_URL",
28665
+ "TEAMCITY_VERSION",
28666
+ "TF_BUILD",
28667
+ "BITBUCKET_BUILD_NUMBER",
28668
+ "CODEBUILD_BUILD_ID"
28669
+ ];
28670
+ const TELEMETRY_NOTICE = `SEO Skill collects anonymous usage data to improve the tool (event name,
28671
+ report id, version, agent, OS, architecture, Node major, and install week;
28672
+ never URLs, report data, or identifiers of any kind).
28673
+ Docs: https://seoskill.dev/telemetry
28674
+ Disable: seo telemetry disable (or set DO_NOT_TRACK=1)\n`;
28675
+ function optionEnv(options) {
28676
+ return options.env ?? process.env;
28677
+ }
28678
+ function optionNow(options) {
28679
+ return options.now ?? /* @__PURE__ */ new Date();
28680
+ }
28681
+ function optionStateFile(options) {
28682
+ return options.stateFile ?? getSeoCliPaths().telemetryStateFile;
28683
+ }
28684
+ function isEnvEnabled(value) {
28685
+ return value === "1" || value?.toLowerCase() === "true";
28686
+ }
28687
+ function isTelemetryCi(env = process.env) {
28688
+ return env.NODE_ENV === "test" || Boolean(env.NODE_TEST_CONTEXT) || isEnvEnabled(env.CI) || CI_ENVIRONMENT_KEYS.some((key) => Boolean(env[key]));
28689
+ }
28690
+ function environmentDisableReason(env) {
28691
+ if (isTelemetryCi(env)) return "ci";
28692
+ if (isEnvEnabled(env.DO_NOT_TRACK)) return "do_not_track";
28693
+ if (isEnvEnabled(env.SEOSKILL_TELEMETRY_DISABLED) || isEnvEnabled(env.SEO_TELEMETRY_DISABLED)) return "environment";
28694
+ }
28695
+ function isTelemetryMilestone(value) {
28696
+ return typeof value === "string" && [
28697
+ "first_run",
28698
+ "setup_complete",
28699
+ "first_audit_complete",
28700
+ "active_d1",
28701
+ "active_d7",
28702
+ "active_d30"
28703
+ ].includes(value);
28704
+ }
28705
+ function isTelemetryReport(value) {
28706
+ return typeof value === "string" && TELEMETRY_REPORTS.includes(value);
28707
+ }
28708
+ function isValidCohort(value) {
28709
+ return typeof value === "string" && /^\d{4}-W(?:0[1-9]|[1-4]\d|5[0-3])$/.test(value);
28710
+ }
28711
+ function isTelemetryState(value) {
28712
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
28713
+ const state = value;
28714
+ return typeof state.telemetryEnabled === "boolean" && typeof state.firstRunAt === "string" && Number.isFinite(Date.parse(state.firstRunAt)) && isValidCohort(state.cohort) && Array.isArray(state.sentMilestones) && state.sentMilestones.every(isTelemetryMilestone);
28715
+ }
28716
+ function readState(path) {
28717
+ if (!existsSync(path)) return { kind: "missing" };
28718
+ const value = readJsonFile(path);
28719
+ return isTelemetryState(value) ? {
28720
+ kind: "valid",
28721
+ state: value
28722
+ } : { kind: "invalid" };
28723
+ }
28724
+ function writeState(path, state) {
28725
+ writeJsonAtomic(path, state, 384);
28726
+ }
28727
+ function isoWeek(date) {
28728
+ const utc = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
28729
+ const day = utc.getUTCDay() || 7;
28730
+ utc.setUTCDate(utc.getUTCDate() + 4 - day);
28731
+ const yearStart = new Date(Date.UTC(utc.getUTCFullYear(), 0, 1));
28732
+ const week = Math.ceil(((utc.getTime() - yearStart.getTime()) / 864e5 + 1) / 7);
28733
+ return `${utc.getUTCFullYear()}-W${String(week).padStart(2, "0")}`;
28734
+ }
28735
+ function newState(options, enabled = true) {
28736
+ const now = optionNow(options);
28737
+ return {
28738
+ telemetryEnabled: enabled,
28739
+ firstRunAt: now.toISOString(),
28740
+ cohort: isoWeek(now),
28741
+ sentMilestones: []
28742
+ };
28743
+ }
28744
+ function detectTelemetryAgent(input = {}) {
28745
+ const env = input.env ?? process.env;
28746
+ const clientName = input.clientName?.toLowerCase() ?? "";
28747
+ if (clientName.includes("claude")) return "claude-code";
28748
+ if (clientName.includes("cursor")) return "cursor";
28749
+ if (clientName.includes("codex")) return "codex";
28750
+ if (input.clientName) return "unknown";
28751
+ if (env.CLAUDECODE || env.CLAUDE_CODE) return "claude-code";
28752
+ if (env.CURSOR_AGENT || env.CURSOR_TRACE_ID || env.CURSOR_SESSION_ID) return "cursor";
28753
+ if (env.CODEX_HOME || env.CODEX_THREAD_ID || env.CODEX_SANDBOX) return "codex";
28754
+ return "cli";
28755
+ }
28756
+ function telemetryAgent(options) {
28757
+ return options.agent ?? detectTelemetryAgent({
28758
+ clientName: options.clientName,
28759
+ env: optionEnv(options)
28760
+ });
28761
+ }
28762
+ function nodeMajor(version) {
28763
+ return version.replace(/^v/, "").split(".")[0] || "unknown";
28764
+ }
28765
+ function buildTelemetryPayload(event, state, fields = {}, options = {}) {
28766
+ return {
28767
+ event,
28768
+ version: options.version ?? SEO_VERSION,
28769
+ agent: telemetryAgent(options),
28770
+ os: options.processPlatform ?? platform(),
28771
+ arch: options.processArch ?? arch(),
28772
+ node: nodeMajor(options.nodeVersion ?? process.version),
28773
+ cohort: state.cohort,
28774
+ schema: 1,
28775
+ ...fields.errorCategory ? { errorCategory: fields.errorCategory } : {},
28776
+ ...fields.report ? { report: fields.report } : {}
28777
+ };
28778
+ }
28779
+ function dispatchTelemetry(payload, options) {
28780
+ const fetchTelemetry = options.fetch ?? globalThis.fetch;
28781
+ try {
28782
+ fetchTelemetry(options.endpoint ?? "https://seoskill.dev/api/t", {
28783
+ method: "POST",
28784
+ headers: { "content-type": "application/json" },
28785
+ body: JSON.stringify(payload),
28786
+ signal: AbortSignal.timeout(TELEMETRY_TIMEOUT_MS)
28787
+ }).catch(() => void 0);
28788
+ } catch {}
28789
+ }
28790
+ function statusFromState(options) {
28791
+ const stateFile = optionStateFile(options);
28792
+ const envReason = environmentDisableReason(optionEnv(options));
28793
+ const stored = readState(stateFile);
28794
+ if (envReason) return {
28795
+ enabled: false,
28796
+ reason: envReason,
28797
+ stateFile,
28798
+ ...stored.kind === "valid" ? { state: stored.state } : {}
28799
+ };
28800
+ if (stored.kind === "invalid") return {
28801
+ enabled: false,
28802
+ reason: "invalid_state",
28803
+ stateFile
28804
+ };
28805
+ if (stored.kind === "valid" && !stored.state.telemetryEnabled) return {
28806
+ enabled: false,
28807
+ reason: "local_setting",
28808
+ stateFile,
28809
+ state: stored.state
28810
+ };
28811
+ return {
28812
+ enabled: true,
28813
+ stateFile,
28814
+ ...stored.kind === "valid" ? { state: stored.state } : {}
28815
+ };
28816
+ }
28817
+ function getTelemetryStatus(options = {}) {
28818
+ return statusFromState(options);
28819
+ }
28820
+ function setTelemetryEnabled(enabled, options = {}) {
28821
+ const stateFile = optionStateFile(options);
28822
+ const stored = readState(stateFile);
28823
+ const state = stored.kind === "valid" ? stored.state : newState(options, enabled);
28824
+ state.telemetryEnabled = enabled;
28825
+ writeState(stateFile, state);
28826
+ return statusFromState(options);
28827
+ }
28828
+ function enabledState(options) {
28829
+ const status = statusFromState(options);
28830
+ return status.enabled ? status.state : void 0;
28831
+ }
28832
+ function initializeTelemetry(options = {}) {
28833
+ const initialStatus = statusFromState(options);
28834
+ if (!initialStatus.enabled) return initialStatus;
28835
+ const stateFile = initialStatus.stateFile;
28836
+ const state = initialStatus.state ?? newState(options);
28837
+ const events = [];
28838
+ if (!state.sentMilestones.includes("first_run")) {
28839
+ try {
28840
+ (options.notice ?? ((message) => process.stderr.write(message)))(TELEMETRY_NOTICE);
28841
+ } catch {
28842
+ return {
28843
+ enabled: false,
28844
+ reason: "invalid_state",
28845
+ stateFile
28846
+ };
28847
+ }
28848
+ state.sentMilestones.push("first_run");
28849
+ events.push("first_run");
28850
+ }
28851
+ const daysSinceFirstRun = (optionNow(options).getTime() - Date.parse(state.firstRunAt)) / 864e5;
28852
+ for (const milestone of RETENTION_MILESTONES) if (daysSinceFirstRun >= milestone.days && !state.sentMilestones.includes(milestone.event)) {
28853
+ state.sentMilestones.push(milestone.event);
28854
+ events.push(milestone.event);
28855
+ }
28856
+ try {
28857
+ writeState(stateFile, state);
28858
+ } catch {
28859
+ return {
28860
+ enabled: false,
28861
+ reason: "invalid_state",
28862
+ stateFile
28863
+ };
28864
+ }
28865
+ for (const event of events) dispatchTelemetry(buildTelemetryPayload(event, state, {}, options), options);
28866
+ return {
28867
+ enabled: true,
28868
+ stateFile,
28869
+ state
28870
+ };
28871
+ }
28872
+ function sendEvent(event, fields, options) {
28873
+ const state = enabledState(options);
28874
+ if (!state) return;
28875
+ dispatchTelemetry(buildTelemetryPayload(event, state, fields, options), options);
28876
+ }
28877
+ function trackTelemetryReportStart(report, options = {}) {
28878
+ if (!isTelemetryReport(report)) return;
28879
+ sendEvent("audit_start", { report }, options);
28880
+ }
28881
+ function trackTelemetryReportComplete(report, options = {}) {
28882
+ if (!isTelemetryReport(report)) return;
28883
+ const state = enabledState(options);
28884
+ if (!state) return;
28885
+ dispatchTelemetry(buildTelemetryPayload("audit_complete", state, { report }, options), options);
28886
+ if (state.sentMilestones.includes("first_audit_complete")) return;
28887
+ state.sentMilestones.push("first_audit_complete");
28888
+ try {
28889
+ writeState(optionStateFile(options), state);
28890
+ } catch {
28891
+ return;
28892
+ }
28893
+ dispatchTelemetry(buildTelemetryPayload("first_audit_complete", state, { report }, options), options);
28894
+ }
28895
+ function trackTelemetryReportFailed(report, errorCategory, options = {}) {
28896
+ if (!isTelemetryReport(report)) return;
28897
+ sendEvent("audit_failed", {
28898
+ errorCategory,
28899
+ report
28900
+ }, options);
28901
+ }
28902
+ function trackTelemetrySetupComplete(options = {}) {
28903
+ const state = enabledState(options);
28904
+ if (!state || state.sentMilestones.includes("setup_complete")) return;
28905
+ state.sentMilestones.push("setup_complete");
28906
+ try {
28907
+ writeState(optionStateFile(options), state);
28908
+ } catch {
28909
+ return;
28910
+ }
28911
+ dispatchTelemetry(buildTelemetryPayload("setup_complete", state, {}, options), options);
28912
+ }
28913
+ function telemetryErrorCategory(error) {
28914
+ if (error instanceof Error && error.name === "AbortError") return "crawl_timeout";
28915
+ const code = error && typeof error === "object" && "code" in error ? String(error.code) : void 0;
28916
+ if (code === "ACCESS_DENIED" || code === "AUTH_CONFIG_REQUIRED" || code === "AUTH_EXPIRED" || code === "AUTH_REQUIRED") return "auth";
28917
+ if (code === "INVALID_INPUT" || code === "PROPERTY_NOT_FOUND") return "config";
28918
+ if (code === "OPTIONAL_PROVIDER_UNAVAILABLE" || code === "PROVIDER_UNAVAILABLE" || code === "RATE_LIMITED") return "network";
28919
+ return "unknown";
28920
+ }
28921
+ //#endregion
28483
28922
  //#region packages/core/src/utils/time.ts
28484
28923
  function parseOlderThan(input) {
28485
28924
  if (!input) return;
@@ -28514,9 +28953,6 @@ function isoDate(daysAgo = 0) {
28514
28953
  return date.toISOString().slice(0, 10);
28515
28954
  }
28516
28955
  //#endregion
28517
- //#region packages/core/src/version.ts
28518
- const SEO_VERSION = version;
28519
- //#endregion
28520
- export { AI_REFERRAL_SOURCES, AI_REFERRAL_SOURCES_VERSION, AI_SEARCH_SCORECARD_METHODOLOGY_ID, AI_SEARCH_SCORECARD_METHODOLOGY_VERSION, AUDIT_PAGE_RULE_IDS, BROWSER_USER_AGENT, CANNIBAL_MAXIMUM_DOMINANT_SHARE, CANNIBAL_MINIMUM_PAGE_SHARE, CRAWL_REPORT_STORAGE_VERSION, CRAWL_SKIP_REASONS, CTR_DEFAULT_LIMIT, CTR_DEFAULT_MIN_IMPRESSIONS, CTR_MAX_LIMIT, CTR_MAX_MIN_IMPRESSIONS, DataForSeoProvider, GSC_FINAL_DATA_LAG_DAYS, GSC_TIME_ZONE, INTERNAL_LINK_LEXICAL_TARGET_LIMIT, INTERNAL_LINK_MATCH_EVIDENCE_LIMIT, JsonFileStorageAdapter, LocalCredentialsProvider, OKF_DEFAULT_CONCEPTS, OKF_MAX_CONCEPTS, REPORT_BASELINE_MAX_AGE_MS, REPORT_BASELINE_MAX_DEPTH, REPORT_BASELINE_MAX_PAGES, SCORECARD_CHECK_WEIGHTS, SCORECARD_STATUS_CREDIT, SEO_VERSION, SERP_TITLE_REFERENCE_WIDTH_PX, SERP_TITLE_WIDTH_PROFILE, SemrushProvider, SeoError, ServiceAccountAccessTokenClient, SessionLedger, affectedUrls, agentReadiness, aiPromptsForQuery, aiReadiness, aiReferralSourceForValue, aiReferralsReport, aiSearchScorecard, allocateIndexUrlsToProperties, analyticsConnectionsSchema, analyzeAiReferralRows, analyzeCannibalRows, analyzeCtrUnderperformersFromRows, analyzeDecay, analyzeIndexCoverageSignals, analyzeInternalLinksFromRows, analyzePageOpportunitiesFromRows, analyzeQueryClustersFromRows, analyzeQuickWinsFromRows, analyzeSecondPageRows, analyzeSegmentRows, analyzeStrikingDistanceRows, analyzeTrafficAnomalyRows, assertUrlMatchesGscProperty, attachCrawlRecommendations, auditCrawlPages, auditCrawlRequests, auditLlmsTxt, auditPage, authStatus, boundedSitemapInventory, buildOkfBundle, buildPseoAuditReportFromRows, cannibalReport, changeMeasurementCsvRows, classifyCommunityIntent, clearCache, clientProfileSchema, clusterPseoTemplates, clusterQueryRows, collectAgentDiscovery, combineRobotsValues, communityIntentReport, compareCrawlPages, compareCrawlReports, compareSegmentRows, configSchema, contentCoverageRecommendation, contentCoverageType, contentOptimizationFromPageOpportunities, contentOptimizationReport, countLabel, crawlConfigHash, crawlConfigSchema, crawlDefinitionId, crawlDiff, crawlFixToQueueItem, crawlImplementationQueueWorkflow, crawlIssueGroupSchema, crawlIssueSchema, crawlOne, crawlPageSnapshotSchema, crawlReportSchema, crawlReportStore, crawlReportSummarySchema, crawlRequestObservationSchema, crawlRunId, crawlSite, crawlSkipImpact, crawlSkipReasonCountsFromRecord, crawlTopFixSchema, crawlerJsonSchemas, crawlerRuleCategorySchema, crawlerRuleIdSchema, crawlerRuleInfoSchema, crawlerRuleRecommendationSchema, crawlerRuleSeveritySchema, crawlerSchemas, createAuthorizedClient, createContentGroup, createCrawlReport, createCtrBenchmarkContext, createGoogleAccessTokenClient, createLogger, createPageRenderer, ctrUnderperformersReport, decayClusterDrafts, decayComparisonRange, decayingReport, deleteChange, deleteClient, deleteContentGroup, deleteCrawlReport, deleteTokens, deriveBrandTerms, detectBrandTerms, diagnoseCsvFiles, diagnoseProperty, diagnosePropertyWorkflow, effectiveRobotsDirectives, effectiveSnippetControl, ensureSeoCliDirs, entityReadiness, estimateSerpTitleWidth, expectedCtrForPosition, explainOkfValidation, explainRule, fetchCruxFieldData, fetchPage, fetchSearchStatusIncidents, fetchSitemapUrls, fileSize, finalGscDateRange, findOverlappingSearchUpdates, formatRelativeExpiry, ga4MatchReason, ga4PropertyIdFromName, ga4ReportQualityWarnings, ga4RequestCanUseCache, ga4RowsToObjects, generateLlmsTxt, geoGaps, geoGapsReport, getAuthModeStatus, getCacheStats, getChange, getClient, getClientConfig, getContentGroup, getDb, getKeywordProvider, getPreviousRun, getPrivacySnapshot, getRepeatedLinkRecoverUrls, getRunPages, getSeoCliPaths, getServiceAccountConfig, getServiceAccountStatus, getTokenStorageStatus, googleAnalyticsPropertyId, groupCrawlIssues, hasMetaRobotsDirective, hasRule, hasXRobotsDirective, hashKey, indexCoveragePlan, indexCoverageSignals, indexMonitor, indexWatch, inferPseoTemplate, inferTemplateMovement, insertCrawlRun, insertLinkRecoverRun, inspectUrl, internalLinksReport, interpretUpdateCorrelation, isBrandQuery, isCompatibleTechnicalBaseline, isCurrentTechnicalBaseline, isEntityEvidenceSchemaType, isSiteIdentitySchemaType, isSkippableReportError, isoDate, latestCrawlReport, latestCrawlSummaries, latestFinalGscDate, latestIndexWatchSummary, latestLinkRecoverSummary, linkRecover, linkRecoverRecommendation, listChanges, listClients, listContentGroups, listCrawlReports, listGa4AccountSummaries, listGa4DataStreams, listRules, listSearchUpdates, listSites, loadCrawlReport, localCredentialsProvider, loginWithLoopback, makeRunId, matchGa4WebStreams, measureChange, measureCoverage, metaRobotsDirectives, migrateLegacyMacConfig, missingOAuthClientMessage, missingSharedClientLoginMessage, monitoringStatus, monthlyReport, monthlyReportWorkflow, narrativeCsvFiles, normalizeCrawlConfig, normalizeCrawlSkipReasonCounts, normalizeForCoverage, normalizeHttpUrl, normalizeJavaScriptRenderingMode, normalizeLoadedCrawlReport, okfConceptLimit, pageEvidenceRecommendation, pageOpportunitiesReport, parseOlderThan, parsePseoPath, performanceAudit, performanceReportIsCacheable, planDueIndexUrls, planIndexCoverageFromUrls, plural, propertyMatchesUrl, providerPreferenceSchema, pseoAuditOptions, pseoAuditReport, pseoCsvFiles, pseoIndexStatus, pseoPresentation, publicHttpFetch, queryClusterReport, queryClusterTokens, queryContentCoverageFromPage, queryContentFieldsFromPage, queryFieldCoverage, queryOpportunityRecommendation, queryPageMetrics, queryPageTopQuery, queryPagesMetrics, queryPagesMetricsBatch, queryPagesTopQueries, queryPagesTopQueriesBatch, querySearchAnalytics, quickWinsCsvRows, quickWinsReport, readConfig, readOauthClient, readTokens, recommendCrawlDiffItem, recommendationForRule, recordChange, redirectTrace, refreshAuthToken, refreshPrioritiesCsvFiles, refreshPrioritiesWorkflow, renderCrawlCsv, renderCrawlHtml, renderCrawlMarkdownTickets, renderCrawlPagesCsv, renderCrawlPretty, renderCsv, renderPresentationTablesMarkdown, renderPseoMarkdown, renderWorkflowMarkdown, reportNarrative, reportPresentation, requestHeaders, resolveSegmentRanges, resolveSeoCliPaths, resolveTechnicalBaseline, reviewObservations, roundedPosition, runDoctor, runGa4Report, saveClient, saveCrawlReport, secondPage, segmentComparisonRange, segmentImpact, segmentRangeDays, selectAffectedUrls, selectDueIndexUrls, seoErrorEnvelope, seoToAiQueryReport, sessionSourceInListFilter, setDefaultClient, setTokenStorageMode, shiftIsoDate, shouldExcludeBrandQuery, siteSchema, sqliteCrawlReportStore, strikingDistance, summarizeCrawlReport, pageTechnicalSignals as technicalPageSignals, technicalWatchWorkflow, templateForUrl, toSeoError, tokenSchema, topCrawlRecommendations, topFixes, trafficAnomaly, unavailableSegmentImpactReport, unicodeTokens, updateCorrelation, updatePostmortemCsvFiles, updatePostmortemWorkflow, validateOkfFiles, verifyQueryContent, workflowPresentation, writeConfig, writeOauthClient, writeTokens, xRobotsDirectives };
28956
+ export { AI_REFERRAL_SOURCES, AI_REFERRAL_SOURCES_VERSION, AI_SEARCH_SCORECARD_METHODOLOGY_ID, AI_SEARCH_SCORECARD_METHODOLOGY_VERSION, AUDIT_PAGE_RULE_IDS, BROWSER_USER_AGENT, CANNIBAL_MAXIMUM_DOMINANT_SHARE, CANNIBAL_MINIMUM_PAGE_SHARE, CRAWL_REPORT_STORAGE_VERSION, CRAWL_SKIP_REASONS, CTR_DEFAULT_LIMIT, CTR_DEFAULT_MIN_IMPRESSIONS, CTR_MAX_LIMIT, CTR_MAX_MIN_IMPRESSIONS, DataForSeoProvider, GSC_FINAL_DATA_LAG_DAYS, GSC_TIME_ZONE, INTERNAL_LINK_LEXICAL_TARGET_LIMIT, INTERNAL_LINK_MATCH_EVIDENCE_LIMIT, JsonFileStorageAdapter, LocalCredentialsProvider, OKF_DEFAULT_CONCEPTS, OKF_MAX_CONCEPTS, REPORT_BASELINE_MAX_AGE_MS, REPORT_BASELINE_MAX_DEPTH, REPORT_BASELINE_MAX_PAGES, SCORECARD_CHECK_WEIGHTS, SCORECARD_STATUS_CREDIT, SEO_VERSION, SERP_TITLE_REFERENCE_WIDTH_PX, SERP_TITLE_WIDTH_PROFILE, SemrushProvider, SeoError, ServiceAccountAccessTokenClient, SessionLedger, TELEMETRY_AGENTS, TELEMETRY_ENDPOINT, TELEMETRY_ERROR_CATEGORIES, TELEMETRY_EVENTS, TELEMETRY_NOTICE, TELEMETRY_REPORTS, TELEMETRY_SCHEMA_VERSION, TELEMETRY_TIMEOUT_MS, affectedUrls, agentReadiness, aiPromptsForQuery, aiReadiness, aiReferralSourceForValue, aiReferralsReport, aiSearchScorecard, allocateIndexUrlsToProperties, analyticsConnectionsSchema, analyzeAiReferralRows, analyzeCannibalRows, analyzeCtrUnderperformersFromRows, analyzeDecay, analyzeIndexCoverageSignals, analyzeInternalLinksFromRows, analyzePageOpportunitiesFromRows, analyzeQueryClustersFromRows, analyzeQuickWinsFromRows, analyzeSecondPageRows, analyzeSegmentRows, analyzeStrikingDistanceRows, analyzeTrafficAnomalyRows, assertUrlMatchesGscProperty, attachCrawlRecommendations, auditCrawlPages, auditCrawlRequests, auditLlmsTxt, auditPage, authStatus, boundedSitemapInventory, buildOkfBundle, buildPseoAuditReportFromRows, buildTelemetryPayload, cannibalReport, changeMeasurementCsvRows, checkDatabaseReadiness, classifyCommunityIntent, clearCache, clientProfileSchema, clusterPseoTemplates, clusterQueryRows, collectAgentDiscovery, combineRobotsValues, communityIntentReport, compareCrawlPages, compareCrawlReports, compareSegmentRows, configSchema, contentCoverageRecommendation, contentCoverageType, contentOptimizationFromPageOpportunities, contentOptimizationReport, countLabel, crawlConfigHash, crawlConfigSchema, crawlDefinitionId, crawlDiff, crawlFixToQueueItem, crawlImplementationQueueWorkflow, crawlIssueGroupSchema, crawlIssueSchema, crawlOne, crawlPageSnapshotSchema, crawlReportSchema, crawlReportStore, crawlReportSummarySchema, crawlRequestObservationSchema, crawlRunId, crawlSite, crawlSkipImpact, crawlSkipReasonCountsFromRecord, crawlTopFixSchema, crawlerJsonSchemas, crawlerRuleCategorySchema, crawlerRuleIdSchema, crawlerRuleInfoSchema, crawlerRuleRecommendationSchema, crawlerRuleSeveritySchema, crawlerSchemas, createAuthorizedClient, createContentGroup, createCrawlReport, createCtrBenchmarkContext, createGoogleAccessTokenClient, createLogger, createPageRenderer, ctrUnderperformersReport, decayClusterDrafts, decayComparisonRange, decayingReport, deleteChange, deleteClient, deleteContentGroup, deleteCrawlReport, deleteTokens, deriveBrandTerms, detectBrandTerms, detectTelemetryAgent, diagnoseCsvFiles, diagnoseProperty, diagnosePropertyWorkflow, effectiveRobotsDirectives, effectiveSnippetControl, ensureSeoCliDirs, entityReadiness, estimateSerpTitleWidth, expectedCtrForPosition, explainOkfValidation, explainRule, fetchCruxFieldData, fetchPage, fetchSearchStatusIncidents, fetchSitemapUrls, fileSize, finalGscDateRange, findOverlappingSearchUpdates, formatRelativeExpiry, ga4MatchReason, ga4PropertyIdFromName, ga4ReportQualityWarnings, ga4RequestCanUseCache, ga4RowsToObjects, generateLlmsTxt, geoGaps, geoGapsReport, getAuthModeStatus, getCacheStats, getChange, getClient, getClientConfig, getContentGroup, getDb, getKeywordProvider, getPreviousRun, getPrivacySnapshot, getRepeatedLinkRecoverUrls, getRunPages, getSeoCliPaths, getServiceAccountConfig, getServiceAccountStatus, getTelemetryStatus, getTokenStorageStatus, googleAnalyticsPropertyId, groupCrawlIssues, hasMetaRobotsDirective, hasRule, hasXRobotsDirective, hashKey, indexCoveragePlan, indexCoverageSignals, indexMonitor, indexWatch, inferPseoTemplate, inferTemplateMovement, initializeTelemetry, insertCrawlRun, insertLinkRecoverRun, inspectUrl, internalLinksReport, interpretUpdateCorrelation, isBrandQuery, isCompatibleTechnicalBaseline, isCurrentTechnicalBaseline, isEntityEvidenceSchemaType, isSiteIdentitySchemaType, isSkippableReportError, isTelemetryCi, isTelemetryReport, isoDate, isoWeek, latestCrawlReport, latestCrawlSummaries, latestFinalGscDate, latestIndexWatchSummary, latestLinkRecoverSummary, linkRecover, linkRecoverRecommendation, listChanges, listClients, listContentGroups, listCrawlReports, listGa4AccountSummaries, listGa4DataStreams, listRules, listSearchUpdates, listSites, loadCrawlReport, localCredentialsProvider, loginWithLoopback, makeRunId, matchGa4WebStreams, measureChange, measureCoverage, metaRobotsDirectives, migrateLegacyMacConfig, missingOAuthClientMessage, missingSharedClientLoginMessage, monitoringStatus, monthlyReport, monthlyReportWorkflow, narrativeCsvFiles, normalizeCrawlConfig, normalizeCrawlSkipReasonCounts, normalizeForCoverage, normalizeHttpUrl, normalizeJavaScriptRenderingMode, normalizeLoadedCrawlReport, okfConceptLimit, pageEvidenceRecommendation, pageOpportunitiesReport, parseOlderThan, parsePseoPath, performanceAudit, performanceReportIsCacheable, planDueIndexUrls, planIndexCoverageFromUrls, plural, propertyMatchesUrl, providerPreferenceSchema, pseoAuditOptions, pseoAuditReport, pseoCsvFiles, pseoIndexStatus, pseoPresentation, publicHttpFetch, queryClusterReport, queryClusterTokens, queryContentCoverageFromPage, queryContentFieldsFromPage, queryFieldCoverage, queryOpportunityRecommendation, queryPageMetrics, queryPageTopQuery, queryPagesMetrics, queryPagesMetricsBatch, queryPagesTopQueries, queryPagesTopQueriesBatch, querySearchAnalytics, quickWinsCsvRows, quickWinsReport, readConfig, readOauthClient, readTokens, recommendCrawlDiffItem, recommendationForRule, recordChange, redirectTrace, refreshAuthToken, refreshPrioritiesCsvFiles, refreshPrioritiesWorkflow, renderCrawlCsv, renderCrawlHtml, renderCrawlMarkdownTickets, renderCrawlPagesCsv, renderCrawlPretty, renderCsv, renderPresentationTablesMarkdown, renderPseoMarkdown, renderWorkflowMarkdown, reportNarrative, reportPresentation, requestHeaders, resolveSegmentRanges, resolveSeoCliPaths, resolveTechnicalBaseline, reviewObservations, roundedPosition, runDoctor, runGa4Report, saveClient, saveCrawlReport, secondPage, segmentComparisonRange, segmentImpact, segmentRangeDays, selectAffectedUrls, selectDueIndexUrls, seoErrorEnvelope, seoToAiQueryReport, sessionSourceInListFilter, setDefaultClient, setTelemetryEnabled, setTokenStorageMode, shiftIsoDate, shouldExcludeBrandQuery, siteSchema, sqliteCrawlReportStore, strikingDistance, summarizeCrawlReport, pageTechnicalSignals as technicalPageSignals, technicalWatchWorkflow, telemetryErrorCategory, templateForUrl, toSeoError, tokenSchema, topCrawlRecommendations, topFixes, trackTelemetryReportComplete, trackTelemetryReportFailed, trackTelemetryReportStart, trackTelemetrySetupComplete, trafficAnomaly, unavailableSegmentImpactReport, unicodeTokens, updateCorrelation, updatePostmortemCsvFiles, updatePostmortemWorkflow, validateOkfFiles, verifyQueryContent, workflowPresentation, writeConfig, writeOauthClient, writeTokens, xRobotsDirectives };
28521
28957
 
28522
28958
  //# sourceMappingURL=index.js.map