@automatelab/citation-intelligence 0.5.1 → 0.7.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 (93) hide show
  1. package/README.md +74 -8
  2. package/dist/adapters/anthropic.d.ts.map +1 -1
  3. package/dist/adapters/anthropic.js +4 -2
  4. package/dist/adapters/anthropic.js.map +1 -1
  5. package/dist/adapters/bing.js +1 -1
  6. package/dist/adapters/bing.js.map +1 -1
  7. package/dist/adapters/brave.js +1 -1
  8. package/dist/adapters/brave.js.map +1 -1
  9. package/dist/adapters/gemini.d.ts.map +1 -1
  10. package/dist/adapters/gemini.js +5 -1
  11. package/dist/adapters/gemini.js.map +1 -1
  12. package/dist/adapters/google-ai-mode.d.ts +6 -0
  13. package/dist/adapters/google-ai-mode.d.ts.map +1 -0
  14. package/dist/adapters/google-ai-mode.js +48 -0
  15. package/dist/adapters/google-ai-mode.js.map +1 -0
  16. package/dist/adapters/openai.d.ts.map +1 -1
  17. package/dist/adapters/openai.js +3 -1
  18. package/dist/adapters/openai.js.map +1 -1
  19. package/dist/adapters/perplexity.d.ts +2 -1
  20. package/dist/adapters/perplexity.d.ts.map +1 -1
  21. package/dist/adapters/perplexity.js +5 -2
  22. package/dist/adapters/perplexity.js.map +1 -1
  23. package/dist/index.js +50 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/prompts.d.ts +3 -0
  26. package/dist/prompts.d.ts.map +1 -0
  27. package/dist/prompts.js +137 -0
  28. package/dist/prompts.js.map +1 -0
  29. package/dist/resources.d.ts +3 -0
  30. package/dist/resources.d.ts.map +1 -0
  31. package/dist/resources.js +242 -0
  32. package/dist/resources.js.map +1 -0
  33. package/dist/tools/am-i-cited.d.ts +73 -10
  34. package/dist/tools/am-i-cited.d.ts.map +1 -1
  35. package/dist/tools/am-i-cited.js +115 -15
  36. package/dist/tools/am-i-cited.js.map +1 -1
  37. package/dist/tools/answer-box-position.d.ts +4 -4
  38. package/dist/tools/answer-box-position.js +2 -2
  39. package/dist/tools/answer-box-position.js.map +1 -1
  40. package/dist/tools/canonical-competitor-set.d.ts +73 -0
  41. package/dist/tools/canonical-competitor-set.d.ts.map +1 -0
  42. package/dist/tools/canonical-competitor-set.js +208 -0
  43. package/dist/tools/canonical-competitor-set.js.map +1 -0
  44. package/dist/tools/check-citations.d.ts +11 -5
  45. package/dist/tools/check-citations.d.ts.map +1 -1
  46. package/dist/tools/check-citations.js +41 -8
  47. package/dist/tools/check-citations.js.map +1 -1
  48. package/dist/tools/citation-evidence.d.ts +54 -0
  49. package/dist/tools/citation-evidence.d.ts.map +1 -0
  50. package/dist/tools/citation-evidence.js +148 -0
  51. package/dist/tools/citation-evidence.js.map +1 -0
  52. package/dist/tools/citation-freshness-score.d.ts +4 -4
  53. package/dist/tools/citation-freshness-score.js +1 -1
  54. package/dist/tools/citation-freshness-score.js.map +1 -1
  55. package/dist/tools/citation-provenance.d.ts +6 -4
  56. package/dist/tools/citation-provenance.d.ts.map +1 -1
  57. package/dist/tools/citation-provenance.js +17 -8
  58. package/dist/tools/citation-provenance.js.map +1 -1
  59. package/dist/tools/cited-for-diff.d.ts +5 -5
  60. package/dist/tools/cited-for-diff.js +1 -1
  61. package/dist/tools/cited-for-diff.js.map +1 -1
  62. package/dist/tools/cited-for.d.ts +5 -5
  63. package/dist/tools/cited-for.js +1 -1
  64. package/dist/tools/cited-for.js.map +1 -1
  65. package/dist/tools/compete-for-query.d.ts +4 -4
  66. package/dist/tools/compete-for-query.js +1 -1
  67. package/dist/tools/compete-for-query.js.map +1 -1
  68. package/dist/tools/crawler-access-audit.d.ts +49 -0
  69. package/dist/tools/crawler-access-audit.d.ts.map +1 -0
  70. package/dist/tools/crawler-access-audit.js +256 -0
  71. package/dist/tools/crawler-access-audit.js.map +1 -0
  72. package/dist/tools/gsc-citation-gap.d.ts +5 -5
  73. package/dist/tools/gsc-citation-gap.d.ts.map +1 -1
  74. package/dist/tools/gsc-citation-gap.js +7 -2
  75. package/dist/tools/gsc-citation-gap.js.map +1 -1
  76. package/dist/tools/run-panel.d.ts +5 -5
  77. package/dist/tools/run-panel.d.ts.map +1 -1
  78. package/dist/tools/run-panel.js +13 -4
  79. package/dist/tools/run-panel.js.map +1 -1
  80. package/dist/tools/sitemap-citation-map.d.ts +77 -0
  81. package/dist/tools/sitemap-citation-map.d.ts.map +1 -0
  82. package/dist/tools/sitemap-citation-map.js +149 -0
  83. package/dist/tools/sitemap-citation-map.js.map +1 -0
  84. package/dist/tools/structured-data-repair.d.ts +30 -0
  85. package/dist/tools/structured-data-repair.d.ts.map +1 -0
  86. package/dist/tools/structured-data-repair.js +297 -0
  87. package/dist/tools/structured-data-repair.js.map +1 -0
  88. package/dist/types.d.ts +11 -2
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/types.js +24 -1
  91. package/dist/types.js.map +1 -1
  92. package/package.json +59 -57
  93. package/smithery.yaml +50 -0
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+ export declare const sitemapCitationMapInputSchema: {
3
+ sitemap_url: z.ZodString;
4
+ domain: z.ZodOptional<z.ZodString>;
5
+ since: z.ZodOptional<z.ZodString>;
6
+ limit: z.ZodDefault<z.ZodNumber>;
7
+ };
8
+ declare const inputSchema: z.ZodObject<{
9
+ sitemap_url: z.ZodString;
10
+ domain: z.ZodOptional<z.ZodString>;
11
+ since: z.ZodOptional<z.ZodString>;
12
+ limit: z.ZodDefault<z.ZodNumber>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ limit: number;
15
+ sitemap_url: string;
16
+ domain?: string | undefined;
17
+ since?: string | undefined;
18
+ }, {
19
+ sitemap_url: string;
20
+ domain?: string | undefined;
21
+ since?: string | undefined;
22
+ limit?: number | undefined;
23
+ }>;
24
+ export declare function sitemapCitationMap(input: z.infer<typeof inputSchema>): Promise<{
25
+ sitemap_url: string;
26
+ total_urls: number;
27
+ mapped: number;
28
+ unmapped: number;
29
+ message: string;
30
+ domain?: undefined;
31
+ since?: undefined;
32
+ fetched_at?: undefined;
33
+ coverage_pct?: undefined;
34
+ citations_in_cache?: undefined;
35
+ mapped_urls?: undefined;
36
+ unmapped_urls?: undefined;
37
+ note?: undefined;
38
+ } | {
39
+ sitemap_url: string;
40
+ domain: string;
41
+ total_urls: number;
42
+ mapped: number;
43
+ unmapped: number;
44
+ message: string;
45
+ since?: undefined;
46
+ fetched_at?: undefined;
47
+ coverage_pct?: undefined;
48
+ citations_in_cache?: undefined;
49
+ mapped_urls?: undefined;
50
+ unmapped_urls?: undefined;
51
+ note?: undefined;
52
+ } | {
53
+ sitemap_url: string;
54
+ domain: string;
55
+ since: string | undefined;
56
+ fetched_at: string;
57
+ total_urls: number;
58
+ mapped: number;
59
+ unmapped: number;
60
+ coverage_pct: number;
61
+ citations_in_cache: number;
62
+ mapped_urls: {
63
+ url: string;
64
+ citation_count: number;
65
+ unique_queries: number;
66
+ engines: string[];
67
+ last_seen: string;
68
+ sample_queries: string[];
69
+ }[];
70
+ unmapped_urls: {
71
+ url: string;
72
+ }[];
73
+ note: string;
74
+ message?: undefined;
75
+ }>;
76
+ export {};
77
+ //# sourceMappingURL=sitemap-citation-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap-citation-map.d.ts","sourceRoot":"","sources":["../../src/tools/sitemap-citation-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,6BAA6B;;;;;CAuBzC,CAAC;AAEF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAA0C,CAAC;AAgC5D,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAsElE,MAAM;wBACK,MAAM;wBACN,MAAM;iBACb,MAAM,EAAE;mBACN,MAAM;wBACD,MAAM,EAAE;;;aAEA,MAAM;;;;GA4CjC"}
@@ -0,0 +1,149 @@
1
+ import { z } from "zod";
2
+ import * as cheerio from "cheerio";
3
+ import { fetchText } from "../lib/fetch.js";
4
+ import { citedForDomain } from "../lib/cache.js";
5
+ import { log } from "../lib/log.js";
6
+ export const sitemapCitationMapInputSchema = {
7
+ sitemap_url: z
8
+ .string()
9
+ .url()
10
+ .describe("URL of sitemap.xml (or a sitemap index). Nested sitemaps are followed."),
11
+ domain: z
12
+ .string()
13
+ .min(1)
14
+ .optional()
15
+ .describe("Domain to look up citations for. If omitted, inferred from the sitemap host."),
16
+ since: z
17
+ .string()
18
+ .optional()
19
+ .describe("ISO date floor; only count citations recorded on or after this date."),
20
+ limit: z
21
+ .number()
22
+ .int()
23
+ .min(1)
24
+ .max(5000)
25
+ .default(500)
26
+ .describe("Max sitemap URLs to consider."),
27
+ };
28
+ const inputSchema = z.object(sitemapCitationMapInputSchema);
29
+ async function parseSitemap(url, depth = 0) {
30
+ if (depth > 2)
31
+ return [];
32
+ const { text } = await fetchText(url, { timeoutMs: 15_000 });
33
+ const $ = cheerio.load(text, { xmlMode: true });
34
+ const childSitemaps = $("sitemap > loc")
35
+ .toArray()
36
+ .map((el) => $(el).text().trim())
37
+ .filter(Boolean);
38
+ if (childSitemaps.length > 0) {
39
+ const nested = await Promise.all(childSitemaps.map((s) => parseSitemap(s, depth + 1)));
40
+ return nested.flat();
41
+ }
42
+ return $("url > loc")
43
+ .toArray()
44
+ .map((el) => $(el).text().trim())
45
+ .filter(Boolean);
46
+ }
47
+ function normalizeUrl(u) {
48
+ try {
49
+ const parsed = new URL(u);
50
+ parsed.hash = "";
51
+ let p = parsed.pathname.replace(/\/+$/, "") || "/";
52
+ parsed.pathname = p;
53
+ return parsed.toString().toLowerCase();
54
+ }
55
+ catch {
56
+ return u.toLowerCase();
57
+ }
58
+ }
59
+ export async function sitemapCitationMap(input) {
60
+ const parsed = inputSchema.parse(input);
61
+ log.debug("sitemap_citation_map start", { sitemap_url: parsed.sitemap_url });
62
+ const inferredDomain = parsed.domain ?? (() => {
63
+ try {
64
+ return new URL(parsed.sitemap_url).hostname;
65
+ }
66
+ catch {
67
+ return "";
68
+ }
69
+ })();
70
+ if (!inferredDomain) {
71
+ return {
72
+ sitemap_url: parsed.sitemap_url,
73
+ total_urls: 0,
74
+ mapped: 0,
75
+ unmapped: 0,
76
+ message: "could not infer domain from sitemap_url and no domain provided",
77
+ };
78
+ }
79
+ const urls = (await parseSitemap(parsed.sitemap_url)).slice(0, parsed.limit);
80
+ if (urls.length === 0) {
81
+ return {
82
+ sitemap_url: parsed.sitemap_url,
83
+ domain: inferredDomain,
84
+ total_urls: 0,
85
+ mapped: 0,
86
+ unmapped: 0,
87
+ message: "no URLs found in sitemap",
88
+ };
89
+ }
90
+ const citations = await citedForDomain(inferredDomain, parsed.since, undefined, 100_000);
91
+ // Bucket cached citations by normalized URL.
92
+ const byUrl = new Map();
93
+ for (const c of citations) {
94
+ const norm = normalizeUrl(c.url);
95
+ let entry = byUrl.get(norm);
96
+ if (!entry) {
97
+ entry = {
98
+ queries: new Set(),
99
+ engines: new Set(),
100
+ last_seen: c.fetched_at,
101
+ raw_urls: new Set(),
102
+ };
103
+ byUrl.set(norm, entry);
104
+ }
105
+ entry.queries.add(c.query);
106
+ entry.engines.add(c.engine);
107
+ entry.raw_urls.add(c.url);
108
+ if (c.fetched_at > entry.last_seen)
109
+ entry.last_seen = c.fetched_at;
110
+ }
111
+ const mapped = [];
112
+ const unmapped = [];
113
+ for (const u of urls) {
114
+ const norm = normalizeUrl(u);
115
+ const hit = byUrl.get(norm);
116
+ if (!hit) {
117
+ unmapped.push({ url: u });
118
+ continue;
119
+ }
120
+ const sampleQueries = [...hit.queries].slice(0, 5);
121
+ mapped.push({
122
+ url: u,
123
+ citation_count: citations.filter((c) => normalizeUrl(c.url) === norm).length,
124
+ unique_queries: hit.queries.size,
125
+ engines: [...hit.engines].sort(),
126
+ last_seen: hit.last_seen,
127
+ sample_queries: sampleQueries,
128
+ });
129
+ }
130
+ mapped.sort((a, b) => b.citation_count - a.citation_count || b.unique_queries - a.unique_queries);
131
+ // Bucket sitemap URLs that aren't mapped, ranked by traffic potential isn't
132
+ // available here - emit deterministically (alphabetical, top first).
133
+ unmapped.sort((a, b) => a.url.localeCompare(b.url));
134
+ return {
135
+ sitemap_url: parsed.sitemap_url,
136
+ domain: inferredDomain,
137
+ since: parsed.since,
138
+ fetched_at: new Date().toISOString(),
139
+ total_urls: urls.length,
140
+ mapped: mapped.length,
141
+ unmapped: unmapped.length,
142
+ coverage_pct: urls.length === 0 ? 0 : Math.round((mapped.length / urls.length) * 1000) / 10,
143
+ citations_in_cache: citations.length,
144
+ mapped_urls: mapped,
145
+ unmapped_urls: unmapped.slice(0, 200),
146
+ note: "mapped_urls = sitemap URLs that appear in the citation cache. unmapped_urls = sitemap URLs the cache has never seen cited (next-action candidates). Coverage_pct = mapped / total_urls. Cache must be primed first via check_citations or run_panel.",
147
+ };
148
+ }
149
+ //# sourceMappingURL=sitemap-citation-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap-citation-map.js","sourceRoot":"","sources":["../../src/tools/sitemap-citation-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ export declare const structuredDataRepairInputSchema: {
3
+ url: z.ZodString;
4
+ };
5
+ declare const inputSchema: z.ZodObject<{
6
+ url: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ url: string;
9
+ }, {
10
+ url: string;
11
+ }>;
12
+ export declare function structuredDataRepair(input: z.infer<typeof inputSchema>): Promise<{
13
+ url: string;
14
+ fetched_at: string;
15
+ schema_types_present: string[];
16
+ signals_detected: Record<string, string>;
17
+ suggestions: {
18
+ type: string;
19
+ signal: string;
20
+ ready_to_paste: string;
21
+ }[];
22
+ summary: {
23
+ types_present: number;
24
+ signals_detected: number;
25
+ suggestions_count: number;
26
+ };
27
+ note: string;
28
+ }>;
29
+ export {};
30
+ //# sourceMappingURL=structured-data-repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-data-repair.d.ts","sourceRoot":"","sources":["../../src/tools/structured-data-repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,+BAA+B;;CAO3C,CAAC;AAEF,QAAA,MAAM,WAAW;;;;;;EAA4C,CAAC;AA4P9D,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC;;;;;;;;;;;;;;;;GAwF5E"}
@@ -0,0 +1,297 @@
1
+ import { z } from "zod";
2
+ import * as cheerio from "cheerio";
3
+ import { fetchText, ToolFetchError } from "../lib/fetch.js";
4
+ export const structuredDataRepairInputSchema = {
5
+ url: z
6
+ .string()
7
+ .url()
8
+ .describe("URL to inspect for missing JSON-LD. The page is fetched and its content signals are used to suggest schema types."),
9
+ };
10
+ const inputSchema = z.object(structuredDataRepairInputSchema);
11
+ // Detect @types already present in any JSON-LD block on the page.
12
+ function extractPresentTypes(html) {
13
+ const $ = cheerio.load(html);
14
+ const present = new Set();
15
+ $('script[type="application/ld+json"]').each((_, el) => {
16
+ try {
17
+ const json = JSON.parse($(el).text());
18
+ collectTypes(json, present);
19
+ }
20
+ catch {
21
+ // ignore malformed blocks
22
+ }
23
+ });
24
+ return present;
25
+ }
26
+ function collectTypes(node, out) {
27
+ if (!node || typeof node !== "object")
28
+ return;
29
+ if (Array.isArray(node)) {
30
+ node.forEach((n) => collectTypes(n, out));
31
+ return;
32
+ }
33
+ const obj = node;
34
+ const t = obj["@type"];
35
+ const types = Array.isArray(t)
36
+ ? t.filter((x) => typeof x === "string")
37
+ : typeof t === "string"
38
+ ? [t]
39
+ : [];
40
+ for (const type of types)
41
+ out.add(type);
42
+ for (const v of Object.values(obj))
43
+ collectTypes(v, out);
44
+ }
45
+ function buildBlogPostingTemplate($, url) {
46
+ const headline = $('meta[property="og:title"]').attr("content") ||
47
+ $("h1").first().text().trim() ||
48
+ "FILL: Article headline";
49
+ const description = $('meta[property="og:description"]').attr("content") ||
50
+ $('meta[name="description"]').attr("content") ||
51
+ "FILL: Article description";
52
+ const datePublished = $('meta[property="article:published_time"]').attr("content") ||
53
+ $('time[datetime]').first().attr("datetime") ||
54
+ "FILL: 2025-01-01T00:00:00Z";
55
+ const author = $('meta[name="author"]').attr("content") ||
56
+ $('[rel="author"]').first().text().trim() ||
57
+ "FILL: Author Name";
58
+ const image = $('meta[property="og:image"]').attr("content") || "FILL: https://…/image.jpg";
59
+ return {
60
+ "@context": "https://schema.org",
61
+ "@type": "BlogPosting",
62
+ headline,
63
+ description,
64
+ url,
65
+ datePublished,
66
+ author: { "@type": "Person", name: author },
67
+ image,
68
+ };
69
+ }
70
+ function buildFaqTemplate($, pairs) {
71
+ const mainEntity = pairs.slice(0, 5).map(({ q, a }) => ({
72
+ "@type": "Question",
73
+ name: q,
74
+ acceptedAnswer: { "@type": "Answer", text: a },
75
+ }));
76
+ if (mainEntity.length === 0) {
77
+ mainEntity.push({
78
+ "@type": "Question",
79
+ name: "FILL: Question text?",
80
+ acceptedAnswer: { "@type": "Answer", text: "FILL: Answer text." },
81
+ });
82
+ }
83
+ return {
84
+ "@context": "https://schema.org",
85
+ "@type": "FAQPage",
86
+ mainEntity,
87
+ };
88
+ }
89
+ function buildHowToTemplate(steps, $) {
90
+ const name = $('meta[property="og:title"]').attr("content") ||
91
+ $("h1").first().text().trim() ||
92
+ "FILL: How-to title";
93
+ const stepItems = steps.length > 0
94
+ ? steps.slice(0, 10).map((text, i) => ({
95
+ "@type": "HowToStep",
96
+ position: i + 1,
97
+ text: text.trim(),
98
+ }))
99
+ : [
100
+ { "@type": "HowToStep", position: 1, text: "FILL: Step 1 instructions." },
101
+ { "@type": "HowToStep", position: 2, text: "FILL: Step 2 instructions." },
102
+ ];
103
+ return {
104
+ "@context": "https://schema.org",
105
+ "@type": "HowTo",
106
+ name,
107
+ step: stepItems,
108
+ };
109
+ }
110
+ function buildBreadcrumbTemplate(url, $) {
111
+ const parsed = new URL(url);
112
+ const parts = parsed.pathname.replace(/\/$/, "").split("/").filter(Boolean);
113
+ const itemListElement = [
114
+ {
115
+ "@type": "ListItem",
116
+ position: 1,
117
+ name: $('meta[property="og:site_name"]').attr("content") || "Home",
118
+ item: `${parsed.protocol}//${parsed.host}/`,
119
+ },
120
+ ...parts.map((seg, i) => ({
121
+ "@type": "ListItem",
122
+ position: i + 2,
123
+ name: seg
124
+ .replace(/[-_]/g, " ")
125
+ .replace(/\b\w/g, (c) => c.toUpperCase()) || "FILL: Section name",
126
+ item: `${parsed.protocol}//${parsed.host}/${parts.slice(0, i + 1).join("/")}/`,
127
+ })),
128
+ ];
129
+ return {
130
+ "@context": "https://schema.org",
131
+ "@type": "BreadcrumbList",
132
+ itemListElement,
133
+ };
134
+ }
135
+ function buildOrganizationTemplate($, url) {
136
+ const parsed = new URL(url);
137
+ const name = $('meta[property="og:site_name"]').attr("content") ||
138
+ $("title").text().trim() ||
139
+ "FILL: Organization name";
140
+ const logo = $('link[rel="icon"][type="image/png"]').attr("href") ||
141
+ $('link[rel="apple-touch-icon"]').attr("href") ||
142
+ "FILL: https://…/logo.png";
143
+ return {
144
+ "@context": "https://schema.org",
145
+ "@type": "Organization",
146
+ name,
147
+ url: `${parsed.protocol}//${parsed.host}/`,
148
+ logo,
149
+ sameAs: ["FILL: https://twitter.com/…", "FILL: https://linkedin.com/company/…"],
150
+ };
151
+ }
152
+ // Heuristics to detect content signals.
153
+ function detectSignals(html, url) {
154
+ const $ = cheerio.load(html);
155
+ const signals = new Map();
156
+ // BlogPosting signal: og:type=article or a byline element
157
+ const ogType = $('meta[property="og:type"]').attr("content");
158
+ const hasAuthor = $('[rel="author"], .author, .byline, [class*="author"], [class*="byline"]').length > 0;
159
+ if (ogType === "article" || hasAuthor) {
160
+ signals.set("BlogPosting", ogType === "article" ? "og:type=article" : "byline element found");
161
+ }
162
+ // FAQPage signal: heading that looks like a question followed by a paragraph
163
+ const faqPairs = [];
164
+ $("h2, h3, h4, dt").each((_, el) => {
165
+ const text = $(el).text().trim();
166
+ if (text.endsWith("?") || /^(what|how|why|when|where|who|can|does|is|are|do)/i.test(text)) {
167
+ const answer = $(el).next("p, dd").text().trim() ||
168
+ $(el).next("div").find("p").first().text().trim();
169
+ if (answer.length > 20) {
170
+ faqPairs.push({ q: text, a: answer.slice(0, 300) });
171
+ }
172
+ }
173
+ });
174
+ if (faqPairs.length >= 2) {
175
+ signals.set("FAQPage", `${faqPairs.length} question/answer pairs detected`);
176
+ signals.set("_faqPairs", faqPairs);
177
+ }
178
+ // HowTo signal: ordered list or headings with step/numbered prefix
179
+ const olItems = [];
180
+ $("ol > li").each((_, el) => {
181
+ olItems.push($(el).text().trim());
182
+ });
183
+ const stepHeadings = [];
184
+ $("h2, h3").each((_, el) => {
185
+ const t = $(el).text().trim();
186
+ if (/^step\s*\d+/i.test(t) || /^\d+[\.\)]\s/.test(t)) {
187
+ stepHeadings.push(t);
188
+ }
189
+ });
190
+ if (olItems.length >= 3) {
191
+ signals.set("HowTo", `ordered list with ${olItems.length} items`);
192
+ signals.set("_steps", olItems);
193
+ }
194
+ else if (stepHeadings.length >= 2) {
195
+ signals.set("HowTo", `${stepHeadings.length} step headings`);
196
+ signals.set("_steps", stepHeadings);
197
+ }
198
+ // BreadcrumbList signal: pathname has 2+ segments
199
+ try {
200
+ const parts = new URL(url).pathname.replace(/\/$/, "").split("/").filter(Boolean);
201
+ if (parts.length >= 2) {
202
+ signals.set("BreadcrumbList", `URL has ${parts.length + 1} path segments`);
203
+ }
204
+ }
205
+ catch {
206
+ // ignore
207
+ }
208
+ // Organization signal: root URL (homepage)
209
+ try {
210
+ const parsed = new URL(url);
211
+ if (parsed.pathname === "/" || parsed.pathname === "") {
212
+ signals.set("Organization", "homepage URL");
213
+ }
214
+ }
215
+ catch {
216
+ // ignore
217
+ }
218
+ return signals;
219
+ }
220
+ export async function structuredDataRepair(input) {
221
+ const parsed = inputSchema.parse(input);
222
+ const url = parsed.url;
223
+ const { text, status } = await fetchText(url, { timeoutMs: 15_000 });
224
+ if (status >= 400) {
225
+ throw new ToolFetchError({
226
+ type: "fetch_error",
227
+ url,
228
+ status,
229
+ message: `URL returned HTTP ${status} - cannot inspect a non-existent page.`,
230
+ });
231
+ }
232
+ const $ = cheerio.load(text);
233
+ const presentTypes = extractPresentTypes(text);
234
+ const signals = detectSignals(text, url);
235
+ // Build suggestions for signalled types that are not already present.
236
+ const suggestions = [];
237
+ if (signals.has("BlogPosting") && !presentTypes.has("BlogPosting") && !presentTypes.has("Article")) {
238
+ suggestions.push({
239
+ type: "BlogPosting",
240
+ signal: signals.get("BlogPosting"),
241
+ template: buildBlogPostingTemplate($, url),
242
+ });
243
+ }
244
+ if (signals.has("FAQPage") && !presentTypes.has("FAQPage")) {
245
+ const faqPairs = signals.get("_faqPairs");
246
+ suggestions.push({
247
+ type: "FAQPage",
248
+ signal: signals.get("FAQPage"),
249
+ template: buildFaqTemplate($, faqPairs ?? []),
250
+ });
251
+ }
252
+ if (signals.has("HowTo") && !presentTypes.has("HowTo")) {
253
+ const steps = signals.get("_steps");
254
+ suggestions.push({
255
+ type: "HowTo",
256
+ signal: signals.get("HowTo"),
257
+ template: buildHowToTemplate(steps ?? [], $),
258
+ });
259
+ }
260
+ if (signals.has("BreadcrumbList") && !presentTypes.has("BreadcrumbList")) {
261
+ suggestions.push({
262
+ type: "BreadcrumbList",
263
+ signal: signals.get("BreadcrumbList"),
264
+ template: buildBreadcrumbTemplate(url, $),
265
+ });
266
+ }
267
+ if (signals.has("Organization") && !presentTypes.has("Organization")) {
268
+ suggestions.push({
269
+ type: "Organization",
270
+ signal: signals.get("Organization"),
271
+ template: buildOrganizationTemplate($, url),
272
+ });
273
+ }
274
+ const signalEntries = {};
275
+ for (const [k, v] of signals.entries()) {
276
+ if (!k.startsWith("_"))
277
+ signalEntries[k] = v;
278
+ }
279
+ return {
280
+ url,
281
+ fetched_at: new Date().toISOString(),
282
+ schema_types_present: [...presentTypes],
283
+ signals_detected: signalEntries,
284
+ suggestions: suggestions.map((s) => ({
285
+ type: s.type,
286
+ signal: s.signal,
287
+ ready_to_paste: JSON.stringify(s.template, null, 2),
288
+ })),
289
+ summary: {
290
+ types_present: presentTypes.size,
291
+ signals_detected: Object.keys(signalEntries).length,
292
+ suggestions_count: suggestions.length,
293
+ },
294
+ note: "Fields marked 'FILL:' require manual completion. Paste each ready_to_paste block into a <script type=\"application/ld+json\"> tag in <head>.",
295
+ };
296
+ }
297
+ //# sourceMappingURL=structured-data-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-data-repair.js","sourceRoot":"","sources":["../../src/tools/structured-data-repair.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,12 @@
1
- export type Engine = "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "auto";
1
+ export type Engine = "perplexity" | "claude" | "openai" | "gemini" | "bing_serp" | "brave_serp" | "brave" | "google_ai_mode" | "auto";
2
+ /** How the data was collected — lets callers understand what the result actually measures. */
3
+ export type Surface = "consumer_scrape" | "api_proxy" | "web_rank" | "static_signal";
4
+ export declare const ENGINE_SURFACE: Record<Exclude<Engine, "auto">, Surface>;
5
+ /**
6
+ * One-line note explaining what each engine result actually measures vs the
7
+ * consumer product. Included in every tool response as `interpretation_note`.
8
+ */
9
+ export declare const ENGINE_INTERPRETATION_NOTE: Record<Exclude<Engine, "auto">, string>;
2
10
  export type Citation = {
3
11
  url: string;
4
12
  title?: string;
@@ -8,6 +16,7 @@ export type Citation = {
8
16
  export type NormalizedCitationResult = {
9
17
  query: string;
10
18
  engine: Engine;
19
+ surface: Surface;
11
20
  fetched_at: string;
12
21
  citations: Citation[];
13
22
  raw_answer?: string;
@@ -19,7 +28,7 @@ export type AdapterResult = {
19
28
  };
20
29
  export type ToolError = {
21
30
  type: "missing_key";
22
- engine: Engine;
31
+ engine: Engine | "google_ai_mode";
23
32
  env_var: string;
24
33
  message: string;
25
34
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GACd,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GACd,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,OAAO,GACP,gBAAgB,GAChB,MAAM,CAAC;AAEX,8FAA8F;AAC9F,MAAM,MAAM,OAAO,GACf,iBAAiB,GACjB,WAAW,GACX,UAAU,GACV,eAAe,CAAC;AAEpB,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CASnE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAiB9E,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5F;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC"}
package/dist/types.js CHANGED
@@ -1,2 +1,25 @@
1
- export {};
1
+ export const ENGINE_SURFACE = {
2
+ perplexity: "consumer_scrape",
3
+ claude: "api_proxy",
4
+ openai: "api_proxy",
5
+ gemini: "api_proxy",
6
+ google_ai_mode: "consumer_scrape",
7
+ bing_serp: "web_rank",
8
+ brave_serp: "web_rank",
9
+ brave: "web_rank",
10
+ };
11
+ /**
12
+ * One-line note explaining what each engine result actually measures vs the
13
+ * consumer product. Included in every tool response as `interpretation_note`.
14
+ */
15
+ export const ENGINE_INTERPRETATION_NOTE = {
16
+ google_ai_mode: "SerpAPI scrape of the real Google AI Overview — pixel-accurate to what google.com users see.",
17
+ perplexity: "sonar-pro API with a consumer-equivalent system prompt. Real perplexity.ai users may see sonar-reasoning-pro with multi-turn follow-ups.",
18
+ openai: "gpt-4o-search-preview API. Real chatgpt.com users get gpt-4o + SearchGPT with different ranking and UI-level re-scoring.",
19
+ claude: "claude-sonnet-4-7 API with web_search tool (max 5 uses). Real claude.ai users get a different model tier and citation UI.",
20
+ gemini: "gemini-2.5-pro API with google_search grounding. Real gemini.google.com uses the same grounding index but different re-ranking.",
21
+ bing_serp: "Bing Web Search API — traditional SERP rank, NOT LLM citation behavior.",
22
+ brave_serp: "Brave Search API — traditional SERP rank, NOT LLM citation behavior.",
23
+ brave: "Brave Search API — traditional SERP rank, NOT LLM citation behavior.",
24
+ };
2
25
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,cAAc,GAA6C;IACtE,UAAU,EAAE,iBAAiB;IAC7B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,cAAc,EAAE,iBAAiB;IACjC,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,UAAU;IACtB,KAAK,EAAE,UAAU;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAA4C;IACjF,cAAc,EACZ,8FAA8F;IAChG,UAAU,EACR,0IAA0I;IAC5I,MAAM,EACJ,0HAA0H;IAC5H,MAAM,EACJ,2HAA2H;IAC7H,MAAM,EACJ,iIAAiI;IACnI,SAAS,EACP,yEAAyE;IAC3E,UAAU,EACR,sEAAsE;IACxE,KAAK,EACH,sEAAsE;CACzE,CAAC"}