seo-gravity-mcp 1.0.2 → 1.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.
- package/README.md +118 -105
- package/dist/adapters/adapterRegistry.d.ts +7 -0
- package/dist/adapters/adapterRegistry.js +30 -0
- package/dist/adapters/astroAdapter.d.ts +17 -0
- package/dist/adapters/astroAdapter.js +191 -0
- package/dist/adapters/nextAppAdapter.d.ts +17 -0
- package/dist/adapters/nextAppAdapter.js +265 -0
- package/dist/adapters/nextPagesAdapter.d.ts +17 -0
- package/dist/adapters/nextPagesAdapter.js +209 -0
- package/dist/adapters/remixAdapter.d.ts +16 -0
- package/dist/adapters/remixAdapter.js +118 -0
- package/dist/adapters/staticAdapter.d.ts +16 -0
- package/dist/adapters/staticAdapter.js +117 -0
- package/dist/adapters/svelteKitAdapter.d.ts +16 -0
- package/dist/adapters/svelteKitAdapter.js +122 -0
- package/dist/adapters/types.d.ts +39 -0
- package/dist/adapters/types.js +1 -0
- package/dist/adapters/viteReactAdapter.d.ts +16 -0
- package/dist/adapters/viteReactAdapter.js +189 -0
- package/dist/benchmark/correlationBenchmark.d.ts +1 -0
- package/dist/benchmark/correlationBenchmark.js +96 -0
- package/dist/benchmark/invariantBenchmark.d.ts +1 -0
- package/dist/benchmark/invariantBenchmark.js +47 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +162 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +8 -646
- package/dist/invariants/registry.d.ts +12 -0
- package/dist/invariants/registry.js +178 -0
- package/dist/invariants/types.d.ts +38 -0
- package/dist/invariants/types.js +1 -0
- package/dist/providers/providerRegistry.d.ts +65 -0
- package/dist/providers/providerRegistry.js +64 -0
- package/dist/providers/types.d.ts +22 -0
- package/dist/providers/types.js +1 -0
- package/dist/server/registry.d.ts +3 -0
- package/dist/server/registry.js +559 -0
- package/dist/server/server.d.ts +70 -0
- package/dist/server/server.js +53 -0
- package/dist/server/types.d.ts +7 -0
- package/dist/server/types.js +1 -0
- package/dist/test.js +108 -138
- package/dist/tools/orchestration.js +23 -21
- package/dist/types/canonical.d.ts +64 -0
- package/dist/types/canonical.js +1 -0
- package/dist/types/findings.d.ts +22 -0
- package/dist/types/findings.js +1 -1
- package/dist/types/seo.d.ts +24 -0
- package/dist/utils/astLocator.d.ts +14 -0
- package/dist/utils/astLocator.js +137 -0
- package/dist/utils/cacheManager.d.ts +29 -0
- package/dist/utils/cacheManager.js +60 -0
- package/dist/utils/experimentEngine.d.ts +26 -0
- package/dist/utils/experimentEngine.js +41 -0
- package/dist/utils/findingEngine.d.ts +2 -1
- package/dist/utils/findingEngine.js +1 -0
- package/dist/utils/gitDiffEngine.d.ts +28 -0
- package/dist/utils/gitDiffEngine.js +109 -0
- package/dist/utils/opportunityEngine.d.ts +19 -0
- package/dist/utils/opportunityEngine.js +61 -0
- package/dist/utils/projectScanner.d.ts +4 -2
- package/dist/utils/projectScanner.js +14 -346
- package/dist/utils/sarifExporter.d.ts +64 -0
- package/dist/utils/sarifExporter.js +81 -0
- package/dist/utils/snapshotEngine.d.ts +3 -1
- package/dist/utils/snapshotEngine.js +232 -94
- package/package.json +8 -5
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
export const BUILTIN_INVARIANTS = [
|
|
2
|
+
{
|
|
3
|
+
id: 'INV-HTTP-200',
|
|
4
|
+
name: 'HTTP 200 Success Status',
|
|
5
|
+
description: 'Published routes must return HTTP 200 OK without 4xx client or 5xx server errors.',
|
|
6
|
+
category: 'http',
|
|
7
|
+
severity: 'critical',
|
|
8
|
+
scope: 'page',
|
|
9
|
+
expectedCondition: 'HTTP status code is 200 or intentional 3xx redirect',
|
|
10
|
+
failureEvidence: 'HTTP status returned 4xx or 5xx error.',
|
|
11
|
+
remediationGuide: 'Check route routing logic, fix broken redirect rules, or restore missing page handler.',
|
|
12
|
+
verificationMethod: 'Curl the URL and verify 200 OK header response.',
|
|
13
|
+
evaluate(ctx) {
|
|
14
|
+
const code = ctx.statusCode ?? 200;
|
|
15
|
+
const ok = code >= 200 && code < 400;
|
|
16
|
+
return {
|
|
17
|
+
satisfied: ok,
|
|
18
|
+
observedCondition: `HTTP status code: ${code}`,
|
|
19
|
+
evidence: ok ? 'Page returned healthy status code.' : `Page returned error status code: ${code}`
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: 'INV-CANONICAL-RESOLVES',
|
|
25
|
+
name: 'Canonical URL Declaration',
|
|
26
|
+
description: 'Indexable pages must explicitly declare a canonical master URL to prevent duplicate content indexation.',
|
|
27
|
+
category: 'canonical',
|
|
28
|
+
severity: 'high',
|
|
29
|
+
scope: 'page',
|
|
30
|
+
expectedCondition: 'Canonical tag (alternates.canonical or <link rel="canonical">) is declared',
|
|
31
|
+
failureEvidence: 'Canonical URL declaration is missing from page component/metadata.',
|
|
32
|
+
remediationGuide: 'Add alternates.canonical to export const metadata or insert <link rel="canonical"> in head.',
|
|
33
|
+
verificationMethod: 'Inspect rendered HTML <head> for valid <link rel="canonical">.',
|
|
34
|
+
evaluate(ctx) {
|
|
35
|
+
const has = Boolean(ctx.hasCanonical || ctx.extractedCanonical);
|
|
36
|
+
return {
|
|
37
|
+
satisfied: has,
|
|
38
|
+
observedCondition: has ? `Canonical declared (${ctx.extractedCanonical || 'present'})` : 'Canonical missing',
|
|
39
|
+
evidence: has ? 'Canonical tag present.' : 'No canonical tag found.'
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'INV-TITLE-PRESENT',
|
|
45
|
+
name: 'Search Snippet Title Metadata',
|
|
46
|
+
description: 'Pages must declare a descriptive, unique title for search engine result snippets.',
|
|
47
|
+
category: 'metadata',
|
|
48
|
+
severity: 'high',
|
|
49
|
+
scope: 'page',
|
|
50
|
+
expectedCondition: 'Title is declared in component metadata or <title> tag',
|
|
51
|
+
failureEvidence: 'Title tag or title export is missing.',
|
|
52
|
+
remediationGuide: 'Export title in page metadata or add <title> in component head.',
|
|
53
|
+
verificationMethod: 'Inspect page <title> in rendered DOM.',
|
|
54
|
+
evaluate(ctx) {
|
|
55
|
+
const has = Boolean(ctx.hasMetadata || ctx.extractedTitle);
|
|
56
|
+
return {
|
|
57
|
+
satisfied: has,
|
|
58
|
+
observedCondition: has ? `Title present ("${ctx.extractedTitle || 'Declared'}")` : 'Title missing',
|
|
59
|
+
evidence: has ? 'Title metadata defined.' : 'No title metadata found.'
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 'INV-LINK-ACCESSIBLE',
|
|
65
|
+
name: 'Internal Link Reachability',
|
|
66
|
+
description: 'Published public pages must be accessible via internal links and must not be orphans.',
|
|
67
|
+
category: 'links',
|
|
68
|
+
severity: 'medium',
|
|
69
|
+
scope: 'crawl_graph',
|
|
70
|
+
expectedCondition: 'Incoming internal link count >= 1',
|
|
71
|
+
failureEvidence: 'Page has 0 incoming internal links from other crawlable routes.',
|
|
72
|
+
remediationGuide: 'Add navigation link or contextual internal links pointing to this route.',
|
|
73
|
+
verificationMethod: 'Run crawl graph analysis and verify incomingLinksCount > 0.',
|
|
74
|
+
evaluate(ctx) {
|
|
75
|
+
const count = ctx.incomingLinksCount ?? 1;
|
|
76
|
+
const ok = count > 0;
|
|
77
|
+
return {
|
|
78
|
+
satisfied: ok,
|
|
79
|
+
observedCondition: `Incoming link count: ${count}`,
|
|
80
|
+
evidence: ok ? 'Page is connected to internal crawl graph.' : 'Page is an orphan with 0 incoming links.'
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'INV-ROBOTS-ALLOWED',
|
|
86
|
+
name: 'Robots Configuration Present',
|
|
87
|
+
description: 'Project must provide robots.txt or robots.ts specifying crawl directives for search engines.',
|
|
88
|
+
category: 'robots',
|
|
89
|
+
severity: 'high',
|
|
90
|
+
scope: 'site_wide',
|
|
91
|
+
expectedCondition: 'robots.txt or robots.ts configuration file exists',
|
|
92
|
+
failureEvidence: 'No robots.txt or robots.ts configuration file detected.',
|
|
93
|
+
remediationGuide: 'Create public/robots.txt or app/robots.ts.',
|
|
94
|
+
verificationMethod: 'Check GET /robots.txt response.',
|
|
95
|
+
evaluate(ctx) {
|
|
96
|
+
const ok = Boolean(ctx.hasRobots);
|
|
97
|
+
return {
|
|
98
|
+
satisfied: ok,
|
|
99
|
+
observedCondition: ok ? 'Robots configuration detected' : 'Robots configuration missing',
|
|
100
|
+
evidence: ok ? 'robots.txt configuration present.' : 'No robots.txt found.'
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'INV-SITEMAP-PRESENT',
|
|
106
|
+
name: 'XML Sitemap Configuration Present',
|
|
107
|
+
description: 'Project must generate or publish an XML sitemap to ensure full discovery of published routes.',
|
|
108
|
+
category: 'robots',
|
|
109
|
+
severity: 'high',
|
|
110
|
+
scope: 'site_wide',
|
|
111
|
+
expectedCondition: 'sitemap.xml or sitemap.ts configuration exists',
|
|
112
|
+
failureEvidence: 'No sitemap configuration file detected.',
|
|
113
|
+
remediationGuide: 'Create public/sitemap.xml or app/sitemap.ts.',
|
|
114
|
+
verificationMethod: 'Check GET /sitemap.xml response.',
|
|
115
|
+
evaluate(ctx) {
|
|
116
|
+
const ok = Boolean(ctx.hasSitemap);
|
|
117
|
+
return {
|
|
118
|
+
satisfied: ok,
|
|
119
|
+
observedCondition: ok ? 'Sitemap configuration detected' : 'Sitemap configuration missing',
|
|
120
|
+
evidence: ok ? 'sitemap.xml configuration present.' : 'No sitemap.xml found.'
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: 'INV-LLMS-TXT',
|
|
126
|
+
name: 'AI Agent Context File (/llms.txt)',
|
|
127
|
+
description: 'Site should provide /llms.txt for AI search engine documentation and knowledge synthesis.',
|
|
128
|
+
category: 'ai_readiness',
|
|
129
|
+
severity: 'medium',
|
|
130
|
+
scope: 'site_wide',
|
|
131
|
+
expectedCondition: 'public/llms.txt exists',
|
|
132
|
+
failureEvidence: 'No /llms.txt found.',
|
|
133
|
+
remediationGuide: 'Generate /llms.txt using seo_llms_txt_generate.',
|
|
134
|
+
verificationMethod: 'Check GET /llms.txt response.',
|
|
135
|
+
evaluate(ctx) {
|
|
136
|
+
const ok = Boolean(ctx.hasLlmsTxt);
|
|
137
|
+
return {
|
|
138
|
+
satisfied: ok,
|
|
139
|
+
observedCondition: ok ? '/llms.txt present' : '/llms.txt missing',
|
|
140
|
+
evidence: ok ? '/llms.txt file detected.' : 'No /llms.txt found.'
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
];
|
|
145
|
+
export class InvariantRegistry {
|
|
146
|
+
invariants = new Map();
|
|
147
|
+
constructor(initial = BUILTIN_INVARIANTS) {
|
|
148
|
+
for (const inv of initial) {
|
|
149
|
+
this.invariants.set(inv.id, inv);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
register(invariant) {
|
|
153
|
+
this.invariants.set(invariant.id, invariant);
|
|
154
|
+
}
|
|
155
|
+
get(id) {
|
|
156
|
+
return this.invariants.get(id);
|
|
157
|
+
}
|
|
158
|
+
getAll() {
|
|
159
|
+
return Array.from(this.invariants.values());
|
|
160
|
+
}
|
|
161
|
+
evaluateContext(invariantId, context, provenance) {
|
|
162
|
+
const def = this.invariants.get(invariantId);
|
|
163
|
+
if (!def)
|
|
164
|
+
return null;
|
|
165
|
+
const res = def.evaluate(context);
|
|
166
|
+
return {
|
|
167
|
+
id: def.id,
|
|
168
|
+
logicalPageId: context.logicalPageId,
|
|
169
|
+
url: context.url,
|
|
170
|
+
description: def.description,
|
|
171
|
+
expectedCondition: def.expectedCondition,
|
|
172
|
+
observedCondition: res.observedCondition,
|
|
173
|
+
satisfied: res.satisfied,
|
|
174
|
+
provenance
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export const defaultInvariantRegistry = new InvariantRegistry();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SeverityLevel } from '../types/findings.js';
|
|
2
|
+
export type InvariantScope = 'site_wide' | 'page' | 'route' | 'crawl_graph';
|
|
3
|
+
export type InvariantCategory = 'http' | 'indexability' | 'canonical' | 'metadata' | 'links' | 'schema' | 'robots' | 'ai_readiness';
|
|
4
|
+
export interface InvariantEvaluationContext {
|
|
5
|
+
url: string;
|
|
6
|
+
logicalPageId: string;
|
|
7
|
+
sourceFilePath?: string;
|
|
8
|
+
statusCode?: number;
|
|
9
|
+
hasMetadata?: boolean;
|
|
10
|
+
hasCanonical?: boolean;
|
|
11
|
+
isIndexable?: boolean;
|
|
12
|
+
hasSchema?: boolean;
|
|
13
|
+
hasRobots?: boolean;
|
|
14
|
+
hasSitemap?: boolean;
|
|
15
|
+
hasLlmsTxt?: boolean;
|
|
16
|
+
incomingLinksCount?: number;
|
|
17
|
+
extractedTitle?: string;
|
|
18
|
+
extractedCanonical?: string;
|
|
19
|
+
rawPayload?: any;
|
|
20
|
+
}
|
|
21
|
+
export interface InvariantEvaluationResult {
|
|
22
|
+
satisfied: boolean;
|
|
23
|
+
observedCondition: string;
|
|
24
|
+
evidence: string;
|
|
25
|
+
}
|
|
26
|
+
export interface InvariantDefinition {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
category: InvariantCategory;
|
|
31
|
+
severity: SeverityLevel;
|
|
32
|
+
scope: InvariantScope;
|
|
33
|
+
expectedCondition: string;
|
|
34
|
+
failureEvidence: string;
|
|
35
|
+
remediationGuide: string;
|
|
36
|
+
verificationMethod: string;
|
|
37
|
+
evaluate(context: InvariantEvaluationContext): InvariantEvaluationResult;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SERPProvider, PageSpeedProvider, KnowledgeProvider, IndexingProvider } from './types.js';
|
|
2
|
+
export declare class NativeSerpProvider implements SERPProvider {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
isFree: boolean;
|
|
6
|
+
analyzeSerp(query: string, country?: string, language?: string, numResults?: number): Promise<import("../types/seo.js").SerpAnalysisResponse>;
|
|
7
|
+
}
|
|
8
|
+
export declare class NativePageSpeedProvider implements PageSpeedProvider {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
audit(url: string, strategy?: 'mobile' | 'desktop'): Promise<{
|
|
12
|
+
url: string;
|
|
13
|
+
strategy: string;
|
|
14
|
+
performanceScore: number;
|
|
15
|
+
coreWebVitals: {
|
|
16
|
+
lcp: {
|
|
17
|
+
value: string;
|
|
18
|
+
status: "Good" | "Needs Improvement" | "Poor";
|
|
19
|
+
};
|
|
20
|
+
fcp: {
|
|
21
|
+
value: string;
|
|
22
|
+
status: "Good" | "Needs Improvement" | "Poor";
|
|
23
|
+
};
|
|
24
|
+
cls: {
|
|
25
|
+
value: string;
|
|
26
|
+
status: "Good" | "Needs Improvement" | "Poor";
|
|
27
|
+
};
|
|
28
|
+
ttfb: {
|
|
29
|
+
value: string;
|
|
30
|
+
status: "Good" | "Needs Improvement" | "Poor";
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
topSpeedFixes: string[];
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
export declare class NativeKnowledgeProvider implements KnowledgeProvider {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
extractEntities(text: string): Promise<import("../types/seo.js").EntitySalienceItem[]>;
|
|
40
|
+
}
|
|
41
|
+
export declare class NativeIndexingProvider implements IndexingProvider {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
submitUrls(host: string, key: string, keyLocation: string, urls: string[]): Promise<{
|
|
45
|
+
status: "submitted" | "error";
|
|
46
|
+
statusCode: number;
|
|
47
|
+
message: string;
|
|
48
|
+
submittedUrlsCount: number;
|
|
49
|
+
}>;
|
|
50
|
+
}
|
|
51
|
+
export declare class ProviderRegistry {
|
|
52
|
+
private serpProvider;
|
|
53
|
+
private pageSpeedProvider;
|
|
54
|
+
private knowledgeProvider;
|
|
55
|
+
private indexingProvider;
|
|
56
|
+
getSerpProvider(): SERPProvider;
|
|
57
|
+
setSerpProvider(provider: SERPProvider): void;
|
|
58
|
+
getPageSpeedProvider(): PageSpeedProvider;
|
|
59
|
+
setPageSpeedProvider(provider: PageSpeedProvider): void;
|
|
60
|
+
getKnowledgeProvider(): KnowledgeProvider;
|
|
61
|
+
setKnowledgeProvider(provider: KnowledgeProvider): void;
|
|
62
|
+
getIndexingProvider(): IndexingProvider;
|
|
63
|
+
setIndexingProvider(provider: IndexingProvider): void;
|
|
64
|
+
}
|
|
65
|
+
export declare const defaultProviderRegistry: ProviderRegistry;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { analyzeSerp } from '../tools/serp.js';
|
|
2
|
+
import { auditPageSpeed, submitIndexNow } from '../tools/performance.js';
|
|
3
|
+
import { mapEntitySalience } from '../tools/schema.js';
|
|
4
|
+
export class NativeSerpProvider {
|
|
5
|
+
id = 'native_google_scraper';
|
|
6
|
+
name = 'Native Web SERP Scraper';
|
|
7
|
+
isFree = true;
|
|
8
|
+
async analyzeSerp(query, country = 'us', language = 'en', numResults = 10) {
|
|
9
|
+
return analyzeSerp(query, country, language, numResults);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class NativePageSpeedProvider {
|
|
13
|
+
id = 'native_pagespeed';
|
|
14
|
+
name = 'Native Core Web Vitals Analyzer';
|
|
15
|
+
async audit(url, strategy = 'mobile') {
|
|
16
|
+
return auditPageSpeed(url, strategy);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class NativeKnowledgeProvider {
|
|
20
|
+
id = 'native_nlp';
|
|
21
|
+
name = 'Native Entity Salience NLP Engine';
|
|
22
|
+
async extractEntities(text) {
|
|
23
|
+
const res = await mapEntitySalience(text);
|
|
24
|
+
return res.topEntities;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class NativeIndexingProvider {
|
|
28
|
+
id = 'native_indexnow';
|
|
29
|
+
name = 'IndexNow Protocol Provider';
|
|
30
|
+
async submitUrls(host, key, keyLocation, urls) {
|
|
31
|
+
return submitIndexNow(host, key, keyLocation, urls);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class ProviderRegistry {
|
|
35
|
+
serpProvider = new NativeSerpProvider();
|
|
36
|
+
pageSpeedProvider = new NativePageSpeedProvider();
|
|
37
|
+
knowledgeProvider = new NativeKnowledgeProvider();
|
|
38
|
+
indexingProvider = new NativeIndexingProvider();
|
|
39
|
+
getSerpProvider() {
|
|
40
|
+
return this.serpProvider;
|
|
41
|
+
}
|
|
42
|
+
setSerpProvider(provider) {
|
|
43
|
+
this.serpProvider = provider;
|
|
44
|
+
}
|
|
45
|
+
getPageSpeedProvider() {
|
|
46
|
+
return this.pageSpeedProvider;
|
|
47
|
+
}
|
|
48
|
+
setPageSpeedProvider(provider) {
|
|
49
|
+
this.pageSpeedProvider = provider;
|
|
50
|
+
}
|
|
51
|
+
getKnowledgeProvider() {
|
|
52
|
+
return this.knowledgeProvider;
|
|
53
|
+
}
|
|
54
|
+
setKnowledgeProvider(provider) {
|
|
55
|
+
this.knowledgeProvider = provider;
|
|
56
|
+
}
|
|
57
|
+
getIndexingProvider() {
|
|
58
|
+
return this.indexingProvider;
|
|
59
|
+
}
|
|
60
|
+
setIndexingProvider(provider) {
|
|
61
|
+
this.indexingProvider = provider;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export const defaultProviderRegistry = new ProviderRegistry();
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { SerpAnalysisResponse, PageSpeedAuditReport, EntitySalienceItem } from '../types/seo.js';
|
|
2
|
+
export interface SERPProvider {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
isFree: boolean;
|
|
6
|
+
analyzeSerp(query: string, country?: string, language?: string, numResults?: number): Promise<SerpAnalysisResponse>;
|
|
7
|
+
}
|
|
8
|
+
export interface PageSpeedProvider {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
audit(url: string, strategy?: 'mobile' | 'desktop'): Promise<PageSpeedAuditReport>;
|
|
12
|
+
}
|
|
13
|
+
export interface KnowledgeProvider {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
extractEntities(text: string): Promise<EntitySalienceItem[]>;
|
|
17
|
+
}
|
|
18
|
+
export interface IndexingProvider {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
submitUrls(host: string, key: string, keyLocation: string, urls: string[]): Promise<any>;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|