@houtini/seo-audit-console 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +92 -0
  2. package/README.md +211 -0
  3. package/dist/audit/checks.d.ts +35 -0
  4. package/dist/audit/checks.d.ts.map +1 -0
  5. package/dist/audit/checks.js +1475 -0
  6. package/dist/audit/checks.js.map +1 -0
  7. package/dist/audit/drift.d.ts +40 -0
  8. package/dist/audit/drift.d.ts.map +1 -0
  9. package/dist/audit/drift.js +148 -0
  10. package/dist/audit/drift.js.map +1 -0
  11. package/dist/audit/engine.d.ts +33 -0
  12. package/dist/audit/engine.d.ts.map +1 -0
  13. package/dist/audit/engine.js +186 -0
  14. package/dist/audit/engine.js.map +1 -0
  15. package/dist/audit/opportunities.d.ts +23 -0
  16. package/dist/audit/opportunities.d.ts.map +1 -0
  17. package/dist/audit/opportunities.js +149 -0
  18. package/dist/audit/opportunities.js.map +1 -0
  19. package/dist/audit/report.d.ts +11 -0
  20. package/dist/audit/report.d.ts.map +1 -0
  21. package/dist/audit/report.js +59 -0
  22. package/dist/audit/report.js.map +1 -0
  23. package/dist/audit/schema-validate.d.ts +35 -0
  24. package/dist/audit/schema-validate.d.ts.map +1 -0
  25. package/dist/audit/schema-validate.js +293 -0
  26. package/dist/audit/schema-validate.js.map +1 -0
  27. package/dist/audit/templates.d.ts +43 -0
  28. package/dist/audit/templates.d.ts.map +1 -0
  29. package/dist/audit/templates.js +129 -0
  30. package/dist/audit/templates.js.map +1 -0
  31. package/dist/audit/topicGaps.d.ts +42 -0
  32. package/dist/audit/topicGaps.d.ts.map +1 -0
  33. package/dist/audit/topicGaps.js +181 -0
  34. package/dist/audit/topicGaps.js.map +1 -0
  35. package/dist/core/AuditDatabase.d.ts +33 -0
  36. package/dist/core/AuditDatabase.d.ts.map +1 -0
  37. package/dist/core/AuditDatabase.js +481 -0
  38. package/dist/core/AuditDatabase.js.map +1 -0
  39. package/dist/core/Backlinks.d.ts +33 -0
  40. package/dist/core/Backlinks.d.ts.map +1 -0
  41. package/dist/core/Backlinks.js +110 -0
  42. package/dist/core/Backlinks.js.map +1 -0
  43. package/dist/core/Crawler.d.ts +23 -0
  44. package/dist/core/Crawler.d.ts.map +1 -0
  45. package/dist/core/Crawler.js +588 -0
  46. package/dist/core/Crawler.js.map +1 -0
  47. package/dist/core/DataForSeoClient.d.ts +86 -0
  48. package/dist/core/DataForSeoClient.d.ts.map +1 -0
  49. package/dist/core/DataForSeoClient.js +232 -0
  50. package/dist/core/DataForSeoClient.js.map +1 -0
  51. package/dist/core/Entities.d.ts +23 -0
  52. package/dist/core/Entities.d.ts.map +1 -0
  53. package/dist/core/Entities.js +62 -0
  54. package/dist/core/Entities.js.map +1 -0
  55. package/dist/core/GscClient.d.ts +22 -0
  56. package/dist/core/GscClient.d.ts.map +1 -0
  57. package/dist/core/GscClient.js +93 -0
  58. package/dist/core/GscClient.js.map +1 -0
  59. package/dist/core/GscSync.d.ts +20 -0
  60. package/dist/core/GscSync.d.ts.map +1 -0
  61. package/dist/core/GscSync.js +133 -0
  62. package/dist/core/GscSync.js.map +1 -0
  63. package/dist/core/JobManager.d.ts +30 -0
  64. package/dist/core/JobManager.d.ts.map +1 -0
  65. package/dist/core/JobManager.js +68 -0
  66. package/dist/core/JobManager.js.map +1 -0
  67. package/dist/core/RankTracker.d.ts +25 -0
  68. package/dist/core/RankTracker.d.ts.map +1 -0
  69. package/dist/core/RankTracker.js +78 -0
  70. package/dist/core/RankTracker.js.map +1 -0
  71. package/dist/core/Refresh.d.ts +32 -0
  72. package/dist/core/Refresh.d.ts.map +1 -0
  73. package/dist/core/Refresh.js +73 -0
  74. package/dist/core/Refresh.js.map +1 -0
  75. package/dist/core/UrlInspector.d.ts +22 -0
  76. package/dist/core/UrlInspector.d.ts.map +1 -0
  77. package/dist/core/UrlInspector.js +92 -0
  78. package/dist/core/UrlInspector.js.map +1 -0
  79. package/dist/core/WikidataClient.d.ts +19 -0
  80. package/dist/core/WikidataClient.d.ts.map +1 -0
  81. package/dist/core/WikidataClient.js +59 -0
  82. package/dist/core/WikidataClient.js.map +1 -0
  83. package/dist/core/agentReadiness.d.ts +34 -0
  84. package/dist/core/agentReadiness.d.ts.map +1 -0
  85. package/dist/core/agentReadiness.js +119 -0
  86. package/dist/core/agentReadiness.js.map +1 -0
  87. package/dist/core/ctrModel.d.ts +2 -0
  88. package/dist/core/ctrModel.d.ts.map +1 -0
  89. package/dist/core/ctrModel.js +6 -0
  90. package/dist/core/ctrModel.js.map +1 -0
  91. package/dist/core/dashboardData.d.ts +312 -0
  92. package/dist/core/dashboardData.d.ts.map +1 -0
  93. package/dist/core/dashboardData.js +550 -0
  94. package/dist/core/dashboardData.js.map +1 -0
  95. package/dist/core/dataStorage.d.ts +42 -0
  96. package/dist/core/dataStorage.d.ts.map +1 -0
  97. package/dist/core/dataStorage.js +193 -0
  98. package/dist/core/dataStorage.js.map +1 -0
  99. package/dist/core/draftBrief.d.ts +27 -0
  100. package/dist/core/draftBrief.d.ts.map +1 -0
  101. package/dist/core/draftBrief.js +69 -0
  102. package/dist/core/draftBrief.js.map +1 -0
  103. package/dist/core/extract.d.ts +67 -0
  104. package/dist/core/extract.d.ts.map +1 -0
  105. package/dist/core/extract.js +262 -0
  106. package/dist/core/extract.js.map +1 -0
  107. package/dist/core/gscFreshness.d.ts +18 -0
  108. package/dist/core/gscFreshness.d.ts.map +1 -0
  109. package/dist/core/gscFreshness.js +32 -0
  110. package/dist/core/gscFreshness.js.map +1 -0
  111. package/dist/core/linkGraph.d.ts +19 -0
  112. package/dist/core/linkGraph.d.ts.map +1 -0
  113. package/dist/core/linkGraph.js +125 -0
  114. package/dist/core/linkGraph.js.map +1 -0
  115. package/dist/core/passageScore.d.ts +19 -0
  116. package/dist/core/passageScore.d.ts.map +1 -0
  117. package/dist/core/passageScore.js +59 -0
  118. package/dist/core/passageScore.js.map +1 -0
  119. package/dist/core/paths.d.ts +5 -0
  120. package/dist/core/paths.d.ts.map +1 -0
  121. package/dist/core/paths.js +15 -0
  122. package/dist/core/paths.js.map +1 -0
  123. package/dist/core/queryData.d.ts +35 -0
  124. package/dist/core/queryData.d.ts.map +1 -0
  125. package/dist/core/queryData.js +200 -0
  126. package/dist/core/queryData.js.map +1 -0
  127. package/dist/core/reranker.d.ts +8 -0
  128. package/dist/core/reranker.d.ts.map +1 -0
  129. package/dist/core/reranker.js +68 -0
  130. package/dist/core/reranker.js.map +1 -0
  131. package/dist/core/robots.d.ts +11 -0
  132. package/dist/core/robots.d.ts.map +1 -0
  133. package/dist/core/robots.js +76 -0
  134. package/dist/core/robots.js.map +1 -0
  135. package/dist/core/sitemap.d.ts +15 -0
  136. package/dist/core/sitemap.d.ts.map +1 -0
  137. package/dist/core/sitemap.js +100 -0
  138. package/dist/core/sitemap.js.map +1 -0
  139. package/dist/core/sql.d.ts +6 -0
  140. package/dist/core/sql.d.ts.map +1 -0
  141. package/dist/core/sql.js +6 -0
  142. package/dist/core/sql.js.map +1 -0
  143. package/dist/core/types.d.ts +22 -0
  144. package/dist/core/types.d.ts.map +1 -0
  145. package/dist/core/types.js +2 -0
  146. package/dist/core/types.js.map +1 -0
  147. package/dist/core/url-key.d.ts +39 -0
  148. package/dist/core/url-key.d.ts.map +1 -0
  149. package/dist/core/url-key.js +106 -0
  150. package/dist/core/url-key.js.map +1 -0
  151. package/dist/generators/index.d.ts +45 -0
  152. package/dist/generators/index.d.ts.map +1 -0
  153. package/dist/generators/index.js +184 -0
  154. package/dist/generators/index.js.map +1 -0
  155. package/dist/index.d.ts +3 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +10 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/server.d.ts +7 -0
  160. package/dist/server.d.ts.map +1 -0
  161. package/dist/server.js +1387 -0
  162. package/dist/server.js.map +1 -0
  163. package/dist/src/ui/dashboard.html +347 -0
  164. package/dist/src/ui/sync-progress.html +104 -0
  165. package/package.json +101 -0
  166. package/server.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Crawler.js","sourceRoot":"","sources":["../../src/core/Crawler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * DataForSEO client modelled on the official connection (api.dataforseo.com, Basic
3
+ * Auth, array-body POST, response under tasks[].result — per dataforseo/typescriptclient
4
+ * and dataforseo/mcp-server-typescript).
5
+ *
6
+ * Two cost-control layers the user asked for:
7
+ * - SINGULAR WORKER: live requests are serialised (one at a time) via a promise
8
+ * chain, so we never fan out paid calls concurrently.
9
+ * - 20-DAY CACHE: every response is written to a shared SQLite cache keyed on
10
+ * (endpoint + body); a cache hit costs nothing and skips the worker entirely.
11
+ * SERP/keyword/domain data is stable enough that a ~20-day TTL is safe.
12
+ */
13
+ export interface DfsResponse {
14
+ tasks: any[];
15
+ cached: boolean;
16
+ cost: number;
17
+ }
18
+ export declare class DataForSeoClient {
19
+ private readonly auth;
20
+ private readonly ttlMs;
21
+ private readonly cache;
22
+ private chain;
23
+ constructor(login: string, password: string, cacheDbPath: string, ttlDays?: number);
24
+ /** Serialise live work — only one request in flight at any time (singular worker). */
25
+ private serialize;
26
+ private keyFor;
27
+ /** POST to a DataForSEO endpoint, served from the 20-day cache when fresh. */
28
+ call(endpoint: string, body: unknown[], timeoutMs?: number): Promise<DfsResponse>;
29
+ /** Build the location field — numeric → location_code, string → location_name, else US default. */
30
+ private loc;
31
+ /** KEYWORDS_DATA — true monthly search volume + CPC + competition (cheap). */
32
+ searchVolume(keywords: string[], location?: string | number, languageCode?: string): Promise<DfsResponse>;
33
+ /** SERP — live Google organic results (per-request cost; use sparingly). */
34
+ serpOrganic(keyword: string, location?: string | number, languageCode?: string, depth?: number): Promise<DfsResponse>;
35
+ /**
36
+ * Related terms for a keyword — People Also Ask questions + related searches,
37
+ * parsed from the SERP advanced response. Powers the click-through "related
38
+ * terms" on the keyword charts. Cached 20 days via the underlying SERP call.
39
+ */
40
+ relatedTerms(keyword: string, location?: string | number, languageCode?: string): Promise<{
41
+ peopleAlsoAsk: string[];
42
+ relatedSearches: string[];
43
+ cached: boolean;
44
+ cost: number;
45
+ }>;
46
+ /** Labs — domain ranking distribution over time (monthly). The over-time sequence. */
47
+ historicalRankOverview(target: string, location?: string | number, languageCode?: string, languageName?: string): Promise<DfsResponse>;
48
+ /** Labs — a domain's top ranking pages by estimated organic traffic (relevant_pages). */
49
+ relevantPages(target: string, location?: string | number, languageCode?: string, limit?: number): Promise<DfsResponse>;
50
+ /**
51
+ * Labs — every keyword a target ranks for. `target` may be a domain, a subdomain,
52
+ * or a full URL (DataForSEO switches mode on the shape). Optional `filters` narrows
53
+ * to e.g. a subfolder via ranked_serp_element.serp_item.relative_url LIKE.
54
+ */
55
+ rankedKeywords(target: string, location?: string | number, languageCode?: string, limit?: number, orderBy?: string, filters?: unknown[], itemTypes?: string[]): Promise<DfsResponse>;
56
+ /** Backlinks — overall profile for a domain (total backlinks, referring domains, spam). Cheap. */
57
+ backlinksSummary(target: string): Promise<DfsResponse>;
58
+ /** Backlinks — per-page backlink/referring-domain counts for a domain (top pages by backlinks). */
59
+ domainPagesSummary(target: string, limit?: number): Promise<DfsResponse>;
60
+ /**
61
+ * Labs — classify the search intent of keywords (informational / navigational /
62
+ * commercial / transactional) with a probability + secondary intents. Language-only
63
+ * (no location), up to 1000 keywords per call. Cheap (~50 credits).
64
+ */
65
+ searchIntent(keywords: string[], languageCode?: string): Promise<DfsResponse>;
66
+ /**
67
+ * On-Page — live Lighthouse audit for ONE url (lab Core Web Vitals + opportunities).
68
+ * Pricier (~2000 credits) and slow: Lighthouse renders the page, so allow up to 120s
69
+ * (DataForSEO aborts at 120s). `for_mobile` defaults true (mobile-first).
70
+ */
71
+ lighthouse(url: string, forMobile?: boolean, languageCode?: string): Promise<DfsResponse>;
72
+ /** Labs — competitor domains by organic keyword overlap (discovery seed for gap analysis). */
73
+ competitorsDomain(target: string, location?: string | number, languageCode?: string, limit?: number): Promise<DfsResponse>;
74
+ /**
75
+ * Labs — keywords that a set of competitor pages rank for but our page(s) do NOT
76
+ * (content gap). `competitorUrls` → the `pages` map (max 20); `excludeUrls` → our own
77
+ * page(s) to subtract (max 10). Sorted by search volume. Wildcards like `…/*` allowed.
78
+ */
79
+ pageIntersection(competitorUrls: string[], excludeUrls: string[], location?: string | number, languageCode?: string, limit?: number): Promise<DfsResponse>;
80
+ cacheStats(): {
81
+ rows: number;
82
+ totalCost: number;
83
+ };
84
+ close(): void;
85
+ }
86
+ //# sourceMappingURL=DataForSeoClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataForSeoClient.d.ts","sourceRoot":"","sources":["../../src/core/DataForSeoClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,232 @@
1
+ import Database from 'better-sqlite3';
2
+ import { createHash } from 'node:crypto';
3
+ import { mkdirSync } from 'node:fs';
4
+ import { dirname } from 'node:path';
5
+ const BASE_URL = 'https://api.dataforseo.com';
6
+ export class DataForSeoClient {
7
+ auth;
8
+ ttlMs;
9
+ cache;
10
+ chain = Promise.resolve();
11
+ constructor(login, password, cacheDbPath, ttlDays = 20) {
12
+ this.auth = 'Basic ' + Buffer.from(`${login}:${password}`).toString('base64');
13
+ this.ttlMs = ttlDays * 86400000;
14
+ mkdirSync(dirname(cacheDbPath), { recursive: true });
15
+ this.cache = new Database(cacheDbPath);
16
+ this.cache.pragma('journal_mode = WAL');
17
+ this.cache.exec(`
18
+ CREATE TABLE IF NOT EXISTS dataforseo_cache (
19
+ cache_key TEXT PRIMARY KEY,
20
+ endpoint TEXT NOT NULL,
21
+ request_json TEXT,
22
+ response_json TEXT NOT NULL,
23
+ cost REAL DEFAULT 0,
24
+ fetched_at TEXT NOT NULL
25
+ );
26
+ CREATE INDEX IF NOT EXISTS idx_dfs_endpoint ON dataforseo_cache(endpoint);
27
+ `);
28
+ }
29
+ /** Serialise live work — only one request in flight at any time (singular worker). */
30
+ serialize(fn) {
31
+ const result = this.chain.then(fn, fn);
32
+ this.chain = result.then(() => undefined, () => undefined);
33
+ return result;
34
+ }
35
+ keyFor(endpoint, body) {
36
+ // Canonical (key-sorted) serialisation so equivalent bodies hash identically.
37
+ const canonical = JSON.stringify(body, (_k, v) => v && typeof v === 'object' && !Array.isArray(v)
38
+ ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : 1)))
39
+ : v);
40
+ return createHash('sha256').update(endpoint + '\n' + canonical).digest('hex');
41
+ }
42
+ /** POST to a DataForSEO endpoint, served from the 20-day cache when fresh. */
43
+ async call(endpoint, body, timeoutMs = 60000) {
44
+ const key = this.keyFor(endpoint, body);
45
+ const row = this.cache
46
+ .prepare('SELECT response_json, cost, fetched_at FROM dataforseo_cache WHERE cache_key = ?')
47
+ .get(key);
48
+ if (row && Date.now() - Date.parse(row.fetched_at) < this.ttlMs) {
49
+ return { tasks: JSON.parse(row.response_json), cached: true, cost: 0 };
50
+ }
51
+ return this.serialize(async () => {
52
+ // Re-check the cache now that we hold the single-worker slot: a concurrent identical
53
+ // call may have just paid for and cached this exact request — don't double-spend.
54
+ const again = this.cache
55
+ .prepare('SELECT response_json, fetched_at FROM dataforseo_cache WHERE cache_key = ?')
56
+ .get(key);
57
+ if (again && Date.now() - Date.parse(again.fetched_at) < this.ttlMs) {
58
+ return { tasks: JSON.parse(again.response_json), cached: true, cost: 0 };
59
+ }
60
+ const res = await fetch(`${BASE_URL}${endpoint}`, {
61
+ method: 'POST',
62
+ headers: { Authorization: this.auth, 'content-type': 'application/json' },
63
+ body: JSON.stringify(body),
64
+ signal: AbortSignal.timeout(timeoutMs),
65
+ });
66
+ const json = await res.json();
67
+ if (!res.ok || json?.status_code >= 40000) {
68
+ throw new Error(`DataForSEO ${endpoint} failed: ${res.status} ${json?.status_message ?? ''}`.trim());
69
+ }
70
+ const tasks = json.tasks ?? [];
71
+ const cost = Number(json.cost) || 0;
72
+ // Only cache genuinely successful responses — a task-level failure (40xxx) or
73
+ // all-null results must not be cached for 20 days; let a later call retry.
74
+ const taskOk = tasks.length > 0 && (tasks[0]?.status_code ?? 20000) < 40000 && tasks.some((t) => t?.result != null);
75
+ if (taskOk) {
76
+ this.cache
77
+ .prepare(`INSERT INTO dataforseo_cache (cache_key, endpoint, request_json, response_json, cost, fetched_at)
78
+ VALUES (?, ?, ?, ?, ?, datetime('now'))
79
+ ON CONFLICT(cache_key) DO UPDATE SET response_json=excluded.response_json,
80
+ cost=excluded.cost, fetched_at=datetime('now')`)
81
+ .run(key, endpoint, JSON.stringify(body), JSON.stringify(tasks), cost);
82
+ }
83
+ return { tasks, cached: false, cost };
84
+ });
85
+ }
86
+ // ── Typed helpers (within our enabled scopes) ─────────────────────────────
87
+ /** Build the location field — numeric → location_code, string → location_name, else US default. */
88
+ loc(location) {
89
+ if (typeof location === 'number')
90
+ return { location_code: location };
91
+ if (typeof location === 'string' && location.trim())
92
+ return { location_name: location.trim() };
93
+ return { location_code: 2840 }; // default United States
94
+ }
95
+ /** KEYWORDS_DATA — true monthly search volume + CPC + competition (cheap). */
96
+ async searchVolume(keywords, location, languageCode = 'en') {
97
+ return this.call('/v3/keywords_data/google_ads/search_volume/live', [
98
+ { keywords, ...this.loc(location), language_code: languageCode },
99
+ ]);
100
+ }
101
+ /** SERP — live Google organic results (per-request cost; use sparingly). */
102
+ async serpOrganic(keyword, location, languageCode = 'en', depth = 20) {
103
+ return this.call('/v3/serp/google/organic/live/advanced', [
104
+ { keyword, ...this.loc(location), language_code: languageCode, depth },
105
+ ]);
106
+ }
107
+ /**
108
+ * Related terms for a keyword — People Also Ask questions + related searches,
109
+ * parsed from the SERP advanced response. Powers the click-through "related
110
+ * terms" on the keyword charts. Cached 20 days via the underlying SERP call.
111
+ */
112
+ async relatedTerms(keyword, location, languageCode = 'en') {
113
+ const r = await this.serpOrganic(keyword, location, languageCode, 30);
114
+ const items = r.tasks[0]?.result?.[0]?.items ?? [];
115
+ const peopleAlsoAsk = [];
116
+ const relatedSearches = [];
117
+ for (const it of items) {
118
+ if (it.type === 'people_also_ask') {
119
+ for (const q of it.items ?? [])
120
+ if (q?.title)
121
+ peopleAlsoAsk.push(q.title);
122
+ }
123
+ else if (it.type === 'related_searches') {
124
+ for (const t of it.items ?? []) {
125
+ if (typeof t === 'string')
126
+ relatedSearches.push(t);
127
+ else if (t?.title)
128
+ relatedSearches.push(t.title);
129
+ }
130
+ }
131
+ }
132
+ return { peopleAlsoAsk, relatedSearches, cached: r.cached, cost: r.cost };
133
+ }
134
+ /** Labs — domain ranking distribution over time (monthly). The over-time sequence. */
135
+ async historicalRankOverview(target, location, languageCode = 'en', languageName) {
136
+ return this.call('/v3/dataforseo_labs/google/historical_rank_overview/live', [
137
+ { target, ...this.loc(location), ...(languageName ? { language_name: languageName } : { language_code: languageCode }) },
138
+ ]);
139
+ }
140
+ /** Labs — a domain's top ranking pages by estimated organic traffic (relevant_pages). */
141
+ async relevantPages(target, location, languageCode = 'en', limit = 25) {
142
+ return this.call('/v3/dataforseo_labs/google/relevant_pages/live', [
143
+ {
144
+ target,
145
+ ...this.loc(location),
146
+ language_code: languageCode,
147
+ limit: Math.min(limit, 1000),
148
+ order_by: ['metrics.organic.etv,desc'],
149
+ item_types: ['organic'],
150
+ },
151
+ ]);
152
+ }
153
+ /**
154
+ * Labs — every keyword a target ranks for. `target` may be a domain, a subdomain,
155
+ * or a full URL (DataForSEO switches mode on the shape). Optional `filters` narrows
156
+ * to e.g. a subfolder via ranked_serp_element.serp_item.relative_url LIKE.
157
+ */
158
+ async rankedKeywords(target, location, languageCode = 'en', limit = 50, orderBy = 'ranked_serp_element.serp_item.etv,desc', filters, itemTypes = ['organic']) {
159
+ const body = {
160
+ target,
161
+ ...this.loc(location),
162
+ language_code: languageCode,
163
+ limit: Math.min(limit, 1000),
164
+ order_by: [orderBy],
165
+ item_types: itemTypes,
166
+ };
167
+ if (filters && filters.length)
168
+ body.filters = filters;
169
+ return this.call('/v3/dataforseo_labs/google/ranked_keywords/live', [body]);
170
+ }
171
+ /** Backlinks — overall profile for a domain (total backlinks, referring domains, spam). Cheap. */
172
+ async backlinksSummary(target) {
173
+ return this.call('/v3/backlinks/summary/live', [{ target, internal_list_limit: 1, backlinks_status_type: 'live' }]);
174
+ }
175
+ /** Backlinks — per-page backlink/referring-domain counts for a domain (top pages by backlinks). */
176
+ async domainPagesSummary(target, limit = 1000) {
177
+ return this.call('/v3/backlinks/domain_pages_summary/live', [
178
+ { target, limit: Math.min(limit, 1000), order_by: ['backlinks,desc'], backlinks_status_type: 'live' },
179
+ ]);
180
+ }
181
+ /**
182
+ * Labs — classify the search intent of keywords (informational / navigational /
183
+ * commercial / transactional) with a probability + secondary intents. Language-only
184
+ * (no location), up to 1000 keywords per call. Cheap (~50 credits).
185
+ */
186
+ async searchIntent(keywords, languageCode = 'en') {
187
+ return this.call('/v3/dataforseo_labs/google/search_intent/live', [
188
+ { keywords: keywords.slice(0, 1000), language_code: languageCode },
189
+ ]);
190
+ }
191
+ /**
192
+ * On-Page — live Lighthouse audit for ONE url (lab Core Web Vitals + opportunities).
193
+ * Pricier (~2000 credits) and slow: Lighthouse renders the page, so allow up to 120s
194
+ * (DataForSEO aborts at 120s). `for_mobile` defaults true (mobile-first).
195
+ */
196
+ async lighthouse(url, forMobile = true, languageCode = 'en') {
197
+ return this.call('/v3/on_page/lighthouse/live/json', [{ url, for_mobile: forMobile, language_code: languageCode, categories: ['performance', 'seo', 'best_practices', 'accessibility'] }], 120000);
198
+ }
199
+ /** Labs — competitor domains by organic keyword overlap (discovery seed for gap analysis). */
200
+ async competitorsDomain(target, location, languageCode = 'en', limit = 20) {
201
+ return this.call('/v3/dataforseo_labs/google/competitors_domain/live', [
202
+ { target, ...this.loc(location), language_code: languageCode, limit: Math.min(limit, 1000), exclude_top_domains: true },
203
+ ]);
204
+ }
205
+ /**
206
+ * Labs — keywords that a set of competitor pages rank for but our page(s) do NOT
207
+ * (content gap). `competitorUrls` → the `pages` map (max 20); `excludeUrls` → our own
208
+ * page(s) to subtract (max 10). Sorted by search volume. Wildcards like `…/*` allowed.
209
+ */
210
+ async pageIntersection(competitorUrls, excludeUrls, location, languageCode = 'en', limit = 100) {
211
+ const pages = {};
212
+ competitorUrls.slice(0, 20).forEach((u, i) => { pages[String(i + 1)] = u; });
213
+ return this.call('/v3/dataforseo_labs/google/page_intersection/live', [
214
+ {
215
+ pages,
216
+ exclude_pages: excludeUrls.slice(0, 10),
217
+ intersection_mode: 'union',
218
+ ...this.loc(location),
219
+ language_code: languageCode,
220
+ limit: Math.min(limit, 1000),
221
+ },
222
+ ]);
223
+ }
224
+ cacheStats() {
225
+ const r = this.cache.prepare('SELECT COUNT(*) rows, COALESCE(SUM(cost),0) totalCost FROM dataforseo_cache').get();
226
+ return r;
227
+ }
228
+ close() {
229
+ this.cache.close();
230
+ }
231
+ }
232
+ //# sourceMappingURL=DataForSeoClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataForSeoClient.js","sourceRoot":"","sources":["../../src/core/DataForSeoClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { WikidataClient } from './WikidataClient.js';
2
+ export interface EntitiesResult {
3
+ siteUrl: string;
4
+ resolved: number;
5
+ attempted: number;
6
+ edges: number;
7
+ }
8
+ /**
9
+ * Heuristic entity resolution (6d): resolve the primary entity of the top-N indexable pages
10
+ * by H1 (fallback title) via Wikidata search, persist to page_entity, and store each entity's
11
+ * subclass-of / part-of edges to page_entity peers. Heuristic (H1→QID can mis-resolve), so the
12
+ * findings it powers are labelled N and gated behind includeJudgement. On-demand only.
13
+ */
14
+ export declare class Entities {
15
+ private readonly wd;
16
+ private readonly dataDir;
17
+ constructor(wd: WikidataClient, dataDir: string);
18
+ run(siteUrl: string, opts: {
19
+ limit?: number;
20
+ language?: string;
21
+ }, update: (p: Record<string, unknown>) => void, signal: AbortSignal): Promise<EntitiesResult>;
22
+ }
23
+ //# sourceMappingURL=Entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Entities.d.ts","sourceRoot":"","sources":["../../src/core/Entities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,MAAM,WAAW,cAAc;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAEvG;;;;;GAKG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAkB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAA5C,EAAE,EAAE,cAAc,EAAmB,OAAO,EAAE,MAAM;IAE3E,GAAG,CACP,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAC3C,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,EAC5C,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,CAAC;CA6C3B"}
@@ -0,0 +1,62 @@
1
+ import { AuditDatabase } from './AuditDatabase.js';
2
+ import { dbPathFor } from './paths.js';
3
+ /**
4
+ * Heuristic entity resolution (6d): resolve the primary entity of the top-N indexable pages
5
+ * by H1 (fallback title) via Wikidata search, persist to page_entity, and store each entity's
6
+ * subclass-of / part-of edges to page_entity peers. Heuristic (H1→QID can mis-resolve), so the
7
+ * findings it powers are labelled N and gated behind includeJudgement. On-demand only.
8
+ */
9
+ export class Entities {
10
+ wd;
11
+ dataDir;
12
+ constructor(wd, dataDir) {
13
+ this.wd = wd;
14
+ this.dataDir = dataDir;
15
+ }
16
+ async run(siteUrl, opts, update, signal) {
17
+ const limit = opts.limit ?? 100;
18
+ const language = opts.language ?? 'en';
19
+ const db = new AuditDatabase(dbPathFor(this.dataDir, siteUrl));
20
+ try {
21
+ // Top indexable pages by internal authority (most worth resolving).
22
+ const pages = db.db.prepare(`SELECT url_key, h1, title FROM pages WHERE status_code=200 AND indexable=1 AND (h1 IS NOT NULL OR title IS NOT NULL)
23
+ ORDER BY ipr DESC, inlink_count DESC LIMIT ?`).all(limit);
24
+ const upEntity = db.db.prepare(`INSERT INTO page_entity (url_key, qid, label, description, source, fetched_at) VALUES (?,?,?,?,?,datetime('now'))
25
+ ON CONFLICT(url_key) DO UPDATE SET qid=excluded.qid, label=excluded.label, description=excluded.description, source=excluded.source, fetched_at=datetime('now')`);
26
+ let resolved = 0, attempted = 0;
27
+ const qids = new Set();
28
+ for (const p of pages) {
29
+ if (signal.aborted)
30
+ break;
31
+ attempted++;
32
+ const text = (p.h1 && p.h1.trim()) ? p.h1 : (p.title ?? '');
33
+ const source = (p.h1 && p.h1.trim()) ? 'h1' : 'title';
34
+ const hit = await this.wd.searchEntity(text, language);
35
+ if (hit) {
36
+ upEntity.run(p.url_key, hit.id, hit.label, hit.description ?? null, source);
37
+ qids.add(hit.id);
38
+ resolved++;
39
+ }
40
+ update({ phase: 'resolve', attempted, resolved });
41
+ }
42
+ // Relationship edges among the resolved entity set.
43
+ const upEdge = db.db.prepare(`INSERT OR IGNORE INTO entity_edge (qid, related_qid, relation) VALUES (?,?,?)`);
44
+ let edges = 0;
45
+ for (const qid of qids) {
46
+ if (signal.aborted)
47
+ break;
48
+ for (const e of await this.wd.relatedEntities(qid)) {
49
+ const tx = upEdge.run(qid, e.related, e.relation);
50
+ if (tx.changes)
51
+ edges++;
52
+ }
53
+ update({ phase: 'edges', edges });
54
+ }
55
+ return { siteUrl, resolved, attempted, edges };
56
+ }
57
+ finally {
58
+ db.close();
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=Entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Entities.js","sourceRoot":"","sources":["../../src/core/Entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { GscProperty, GscApiRow, FetchOptions } from './types.js';
2
+ export interface PageResult {
3
+ rows: GscApiRow[];
4
+ totalSoFar: number;
5
+ startRow: number;
6
+ }
7
+ /** Thin googleapis wrapper for Search Console (ported from better-search-console). */
8
+ export declare class GscClient {
9
+ private auth;
10
+ private searchconsole;
11
+ constructor(credentialsPath: string);
12
+ listProperties(): Promise<GscProperty[]>;
13
+ /** URL Inspection API — authoritative per-URL index status. Quota-limited (~2k/day). */
14
+ inspectUrl(siteUrl: string, inspectionUrl: string): Promise<any>;
15
+ /**
16
+ * Fetch search analytics, streaming each 25k-row page to `onPage` so callers
17
+ * commit to the DB immediately instead of buffering everything in memory.
18
+ * Returns the total row count.
19
+ */
20
+ fetchSearchAnalytics(siteUrl: string, options: FetchOptions, signal?: AbortSignal, onPage?: (page: PageResult) => void): Promise<number>;
21
+ }
22
+ //# sourceMappingURL=GscClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GscClient.d.ts","sourceRoot":"","sources":["../../src/core/GscClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4BvE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sFAAsF;AACtF,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,aAAa,CAAM;gBAEf,eAAe,EAAE,MAAM;IAQ7B,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAM9C,wFAAwF;IAClF,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAOtE;;;;OAIG;IACG,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EACrB,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAClC,OAAO,CAAC,MAAM,CAAC;CA4CnB"}
@@ -0,0 +1,93 @@
1
+ import { google } from 'googleapis';
2
+ const ROW_LIMIT = 25000; // GSC API max per request
3
+ const DEFAULT_DIMENSIONS = ['query', 'page', 'date', 'device', 'country'];
4
+ const MAX_RETRIES = 3;
5
+ const RETRYABLE_STATUS_CODES = [429, 500, 502, 503];
6
+ // Node network errors carry a string code, not an HTTP status — a mid-sync connection
7
+ // blip should be retried, not fail the whole multi-page sync job.
8
+ const RETRYABLE_NET_CODES = new Set(['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED', 'EAI_AGAIN', 'EPIPE', 'ENOTFOUND', 'UND_ERR_SOCKET']);
9
+ async function withRetry(fn, retries = MAX_RETRIES) {
10
+ for (let attempt = 0; attempt <= retries; attempt++) {
11
+ try {
12
+ return await fn();
13
+ }
14
+ catch (err) {
15
+ const status = err?.code || err?.response?.status || err?.status;
16
+ const isRetryable = RETRYABLE_STATUS_CODES.includes(Number(status))
17
+ || RETRYABLE_NET_CODES.has(String(status))
18
+ || RETRYABLE_NET_CODES.has(String(err?.cause?.code));
19
+ if (!isRetryable || attempt === retries)
20
+ throw err;
21
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
22
+ console.error(`[GSC] Retryable error (${status}), attempt ${attempt + 1}/${retries}, waiting ${delay}ms...`);
23
+ await new Promise(resolve => setTimeout(resolve, delay));
24
+ }
25
+ }
26
+ throw new Error('Unreachable');
27
+ }
28
+ /** Thin googleapis wrapper for Search Console (ported from better-search-console). */
29
+ export class GscClient {
30
+ auth;
31
+ searchconsole;
32
+ constructor(credentialsPath) {
33
+ this.auth = new google.auth.GoogleAuth({
34
+ keyFile: credentialsPath,
35
+ scopes: ['https://www.googleapis.com/auth/webmasters.readonly'],
36
+ });
37
+ this.searchconsole = google.searchconsole({ version: 'v1', auth: this.auth });
38
+ }
39
+ async listProperties() {
40
+ const response = await withRetry(() => this.searchconsole.sites.list());
41
+ const sites = response.data.siteEntry || [];
42
+ return sites.map((site) => ({ siteUrl: site.siteUrl, permissionLevel: site.permissionLevel }));
43
+ }
44
+ /** URL Inspection API — authoritative per-URL index status. Quota-limited (~2k/day). */
45
+ async inspectUrl(siteUrl, inspectionUrl) {
46
+ const res = await withRetry(() => this.searchconsole.urlInspection.index.inspect({ requestBody: { inspectionUrl, siteUrl } }));
47
+ return res.data.inspectionResult ?? {};
48
+ }
49
+ /**
50
+ * Fetch search analytics, streaming each 25k-row page to `onPage` so callers
51
+ * commit to the DB immediately instead of buffering everything in memory.
52
+ * Returns the total row count.
53
+ */
54
+ async fetchSearchAnalytics(siteUrl, options, signal, onPage) {
55
+ const dimensions = options.dimensions || DEFAULT_DIMENSIONS;
56
+ let totalRows = 0;
57
+ let startRow = 0;
58
+ while (true) {
59
+ if (signal?.aborted) {
60
+ console.error(`[GSC] Sync aborted after ${totalRows} rows`);
61
+ break;
62
+ }
63
+ const response = await withRetry(() => this.searchconsole.searchanalytics.query({
64
+ siteUrl,
65
+ requestBody: {
66
+ startDate: options.startDate,
67
+ endDate: options.endDate,
68
+ dimensions,
69
+ rowLimit: options.rowLimit || ROW_LIMIT,
70
+ startRow,
71
+ dataState: options.dataState || 'all',
72
+ ...(options.searchType ? { type: options.searchType } : {}),
73
+ },
74
+ }));
75
+ const rows = (response.data.rows || []).map((row) => ({
76
+ keys: row.keys,
77
+ clicks: row.clicks,
78
+ impressions: row.impressions,
79
+ ctr: row.ctr,
80
+ position: row.position,
81
+ }));
82
+ totalRows += rows.length;
83
+ if (onPage && rows.length > 0)
84
+ onPage({ rows, totalSoFar: totalRows, startRow });
85
+ if (rows.length < (options.rowLimit || ROW_LIMIT))
86
+ break;
87
+ startRow += rows.length;
88
+ console.error(`[GSC] Fetched ${totalRows} rows so far (startRow=${startRow})...`);
89
+ }
90
+ return totalRows;
91
+ }
92
+ }
93
+ //# sourceMappingURL=GscClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GscClient.js","sourceRoot":"","sources":["../../src/core/GscClient.ts"],"names":[],"mappings":"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"}