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/PRIVACY.md +41 -4
- package/README.md +11 -3
- package/dist/cli.js +91 -88
- package/dist/cli.js.map +1 -1
- package/dist/{dist-oHPXlHac.js → dist-B6UxI6sc.js} +1 -1
- package/dist/{dist-oOrG0Vub.js → dist-C0LWlNAw.js} +70 -65
- package/dist/dist-C0LWlNAw.js.map +1 -0
- package/dist/index.d.ts +118 -11
- package/dist/index.js +445 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +3 -1
- package/dist/mcp.js +404 -10
- package/dist/mcp.js.map +1 -1
- package/dist/{package-BF_XgK7-.js → package-BI-bLeV4.js} +2 -2
- package/dist/{package-BF_XgK7-.js.map → package-BI-bLeV4.js.map} +1 -1
- package/package.json +3 -4
- package/dist/dist-oOrG0Vub.js.map +0 -1
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-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|