@automatelab/citation-intelligence 0.5.0 → 0.6.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 (47) hide show
  1. package/README.md +32 -1
  2. package/dist/adapters/google-ai-mode.d.ts +6 -0
  3. package/dist/adapters/google-ai-mode.d.ts.map +1 -0
  4. package/dist/adapters/google-ai-mode.js +48 -0
  5. package/dist/adapters/google-ai-mode.js.map +1 -0
  6. package/dist/adapters/openai.d.ts.map +1 -1
  7. package/dist/adapters/openai.js +3 -4
  8. package/dist/adapters/openai.js.map +1 -1
  9. package/dist/index.js +44 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/prompts.d.ts +3 -0
  12. package/dist/prompts.d.ts.map +1 -0
  13. package/dist/prompts.js +137 -0
  14. package/dist/prompts.js.map +1 -0
  15. package/dist/resources.d.ts +3 -0
  16. package/dist/resources.d.ts.map +1 -0
  17. package/dist/resources.js +242 -0
  18. package/dist/resources.js.map +1 -0
  19. package/dist/tools/am-i-cited.d.ts +4 -4
  20. package/dist/tools/am-i-cited.js +1 -1
  21. package/dist/tools/am-i-cited.js.map +1 -1
  22. package/dist/tools/canonical-competitor-set.d.ts +73 -0
  23. package/dist/tools/canonical-competitor-set.d.ts.map +1 -0
  24. package/dist/tools/canonical-competitor-set.js +209 -0
  25. package/dist/tools/canonical-competitor-set.js.map +1 -0
  26. package/dist/tools/check-citations.d.ts +4 -4
  27. package/dist/tools/check-citations.d.ts.map +1 -1
  28. package/dist/tools/check-citations.js +15 -1
  29. package/dist/tools/check-citations.js.map +1 -1
  30. package/dist/tools/citation-evidence.d.ts +54 -0
  31. package/dist/tools/citation-evidence.d.ts.map +1 -0
  32. package/dist/tools/citation-evidence.js +148 -0
  33. package/dist/tools/citation-evidence.js.map +1 -0
  34. package/dist/tools/crawler-access-audit.d.ts +49 -0
  35. package/dist/tools/crawler-access-audit.d.ts.map +1 -0
  36. package/dist/tools/crawler-access-audit.js +256 -0
  37. package/dist/tools/crawler-access-audit.js.map +1 -0
  38. package/dist/tools/run-panel.d.ts +5 -5
  39. package/dist/tools/run-panel.js +1 -1
  40. package/dist/tools/run-panel.js.map +1 -1
  41. package/dist/tools/sitemap-citation-map.d.ts +77 -0
  42. package/dist/tools/sitemap-citation-map.d.ts.map +1 -0
  43. package/dist/tools/sitemap-citation-map.js +149 -0
  44. package/dist/tools/sitemap-citation-map.js.map +1 -0
  45. package/dist/types.d.ts +2 -2
  46. package/dist/types.d.ts.map +1 -1
  47. package/package.json +2 -1
@@ -5,13 +5,23 @@ import { claudeSearch } from "../adapters/anthropic.js";
5
5
  import { openaiSearch } from "../adapters/openai.js";
6
6
  import { geminiSearch } from "../adapters/gemini.js";
7
7
  import { braveSearch } from "../adapters/brave.js";
8
+ import { googleAiModeSearch } from "../adapters/google-ai-mode.js";
8
9
  import { envKey } from "../lib/config.js";
9
10
  import { getCitations, putCitations } from "../lib/cache.js";
10
11
  import { ToolFetchError } from "../lib/fetch.js";
11
12
  export const checkCitationsInputSchema = {
12
13
  query: z.string().min(1).describe("The search query to test (what would a user ask an AI?)"),
13
14
  engine: z
14
- .enum(["perplexity", "claude", "openai", "gemini", "bing", "brave", "auto"])
15
+ .enum([
16
+ "perplexity",
17
+ "claude",
18
+ "openai",
19
+ "gemini",
20
+ "bing",
21
+ "brave",
22
+ "google_ai_mode",
23
+ "auto",
24
+ ])
15
25
  .default("auto")
16
26
  .describe("AI engine to query. 'auto' picks the first available based on configured API keys."),
17
27
  max_results: z
@@ -36,6 +46,8 @@ function pickAutoEngine() {
36
46
  return "brave";
37
47
  if (envKey("BING_API_KEY"))
38
48
  return "bing";
49
+ if (envKey("SERPAPI_KEY"))
50
+ return "google_ai_mode";
39
51
  return null;
40
52
  }
41
53
  async function runEngine(engine, query, maxResults) {
@@ -52,6 +64,8 @@ async function runEngine(engine, query, maxResults) {
52
64
  return bingSearch(query, maxResults);
53
65
  case "brave":
54
66
  return braveSearch(query, maxResults);
67
+ case "google_ai_mode":
68
+ return googleAiModeSearch(query, maxResults);
55
69
  case "auto":
56
70
  throw new Error("auto engine should be resolved before runEngine");
57
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"check-citations.js","sourceRoot":"","sources":["../../src/tools/check-citations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IAC5F,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;SAC3E,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,oFAAoF,CAAC;IACjG,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,8BAA8B,CAAC;CAC5C,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAExD,SAAS,cAAc;IACrB,IAAI,MAAM,CAAC,oBAAoB,CAAC;QAAE,OAAO,YAAY,CAAC;IACtD,IAAI,MAAM,CAAC,mBAAmB,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,MAAM,CAAC,gBAAgB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,IAAI,MAAM,CAAC,gBAAgB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,IAAI,MAAM,CAAC,eAAe,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5C,IAAI,MAAM,CAAC,cAAc,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,MAAc,EACd,KAAa,EACb,UAAkB;IAElB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,YAAY;YACf,OAAO,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC7C,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACzC,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACzC,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACzC,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACvC,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACxC,KAAK,MAAM;YACT,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAkC;IACrE,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,SAAS,GAAW,MAAM,CAAC,MAAM,CAAC;IAExC,IAAI,MAAc,CAAC;IACnB,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,cAAc,CAAC;gBACvB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EACL,gIAAgI;aACnI,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,MAAM,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM;YACN,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;YACxD,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE5C,MAAM,YAAY,CAAC;QACjB,IAAI,EAAE,gBAAgB;QACtB,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU;QACV,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM;QACN,UAAU;QACV,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"check-citations.js","sourceRoot":"","sources":["../../src/tools/check-citations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { z } from "zod";
2
+ export declare const citationEvidenceInputSchema: {
3
+ query: z.ZodString;
4
+ engine: z.ZodDefault<z.ZodEnum<["perplexity", "claude", "openai", "gemini", "bing", "brave", "auto"]>>;
5
+ max_results: z.ZodDefault<z.ZodNumber>;
6
+ context_chars: z.ZodDefault<z.ZodNumber>;
7
+ };
8
+ declare const inputSchema: z.ZodObject<{
9
+ query: z.ZodString;
10
+ engine: z.ZodDefault<z.ZodEnum<["perplexity", "claude", "openai", "gemini", "bing", "brave", "auto"]>>;
11
+ max_results: z.ZodDefault<z.ZodNumber>;
12
+ context_chars: z.ZodDefault<z.ZodNumber>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ query: string;
15
+ engine: "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "auto";
16
+ max_results: number;
17
+ context_chars: number;
18
+ }, {
19
+ query: string;
20
+ engine?: "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "auto" | undefined;
21
+ max_results?: number | undefined;
22
+ context_chars?: number | undefined;
23
+ }>;
24
+ export declare function citationEvidence(input: z.infer<typeof inputSchema>): Promise<{
25
+ query: string;
26
+ engine: import("../types.js").Engine;
27
+ fetched_at: string;
28
+ raw_answer_chars: number;
29
+ has_raw_answer: boolean;
30
+ citations_total: number;
31
+ evidence_found: number;
32
+ evidence: ({
33
+ url: string;
34
+ rank: number;
35
+ title: string | undefined;
36
+ found: boolean;
37
+ snippet: string | null;
38
+ nearby_quote: null;
39
+ mention_char: null;
40
+ matched?: undefined;
41
+ } | {
42
+ url: string;
43
+ rank: number;
44
+ title: string | undefined;
45
+ found: boolean;
46
+ snippet: string;
47
+ nearby_quote: string | null;
48
+ mention_char: number;
49
+ matched: string;
50
+ })[];
51
+ note: string;
52
+ }>;
53
+ export {};
54
+ //# sourceMappingURL=citation-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citation-evidence.d.ts","sourceRoot":"","sources":["../../src/tools/citation-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,2BAA2B;;;;;CA2BvC,CAAC;AAEF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAAwC,CAAC;AAkF1D,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDxE"}
@@ -0,0 +1,148 @@
1
+ import { z } from "zod";
2
+ import { checkCitations } from "./check-citations.js";
3
+ import { log } from "../lib/log.js";
4
+ export const citationEvidenceInputSchema = {
5
+ query: z
6
+ .string()
7
+ .min(1)
8
+ .describe("Search query whose AI answer to extract citation evidence from."),
9
+ engine: z
10
+ .enum(["perplexity", "claude", "openai", "gemini", "bing", "brave", "auto"])
11
+ .default("auto")
12
+ .describe("AI engine to query. Engines without raw_answer (Bing, Brave) return no evidence."),
13
+ max_results: z
14
+ .number()
15
+ .int()
16
+ .min(1)
17
+ .max(20)
18
+ .default(10)
19
+ .describe("Max citations to extract evidence for."),
20
+ context_chars: z
21
+ .number()
22
+ .int()
23
+ .min(40)
24
+ .max(800)
25
+ .default(240)
26
+ .describe("Half-width of the snippet window around each citation mention (chars). Total snippet is up to 2x this."),
27
+ };
28
+ const inputSchema = z.object(citationEvidenceInputSchema);
29
+ function candidateMentions(url) {
30
+ const set = new Set();
31
+ set.add(url);
32
+ set.add(url.replace(/^https?:\/\//, ""));
33
+ set.add(url.replace(/^https?:\/\/(www\.)?/, ""));
34
+ try {
35
+ const u = new URL(url);
36
+ set.add(u.hostname);
37
+ set.add(u.hostname.replace(/^www\./, ""));
38
+ }
39
+ catch {
40
+ // ignore
41
+ }
42
+ return [...set].filter(Boolean);
43
+ }
44
+ function findFirstMention(url, text) {
45
+ if (!text)
46
+ return null;
47
+ let best = null;
48
+ for (const c of candidateMentions(url)) {
49
+ const idx = text.indexOf(c);
50
+ if (idx !== -1 && (!best || idx < best.index))
51
+ best = { index: idx, matched: c };
52
+ }
53
+ return best;
54
+ }
55
+ function extractWindow(text, centerStart, centerLen, halfWidth) {
56
+ const start = Math.max(0, centerStart - halfWidth);
57
+ const end = Math.min(text.length, centerStart + centerLen + halfWidth);
58
+ let snippet = text.slice(start, end);
59
+ if (start > 0)
60
+ snippet = `…${snippet}`;
61
+ if (end < text.length)
62
+ snippet = `${snippet}…`;
63
+ return { snippet, window_start: start, window_end: end };
64
+ }
65
+ // Try to extract a quoted span if one wraps the URL mention. Falls back to
66
+ // sentence containing the mention. Otherwise empty.
67
+ function nearestQuotedOrSentence(text, mentionIdx) {
68
+ if (!text || mentionIdx < 0)
69
+ return undefined;
70
+ const QUOTE_CHARS = ['"', "“", "”", "「", "」"];
71
+ // search backward and forward for nearest matching quote pair
72
+ for (const q of QUOTE_CHARS) {
73
+ const left = text.lastIndexOf(q, mentionIdx);
74
+ if (left === -1)
75
+ continue;
76
+ const right = text.indexOf(q, mentionIdx);
77
+ if (right === -1 || right - left > 800)
78
+ continue;
79
+ const inner = text.slice(left + 1, right).trim();
80
+ if (inner.length >= 8)
81
+ return inner;
82
+ }
83
+ // fallback: containing sentence
84
+ const sentStart = Math.max(text.lastIndexOf(".", mentionIdx), text.lastIndexOf("!", mentionIdx), text.lastIndexOf("?", mentionIdx), text.lastIndexOf("\n", mentionIdx));
85
+ const sentEnd = (() => {
86
+ const candidates = [
87
+ text.indexOf(".", mentionIdx),
88
+ text.indexOf("!", mentionIdx),
89
+ text.indexOf("?", mentionIdx),
90
+ text.indexOf("\n", mentionIdx),
91
+ ].filter((i) => i !== -1);
92
+ return candidates.length > 0 ? Math.min(...candidates) : text.length;
93
+ })();
94
+ const sent = text.slice(sentStart + 1, sentEnd + 1).trim();
95
+ if (sent.length >= 12 && sent.length <= 600)
96
+ return sent;
97
+ return undefined;
98
+ }
99
+ export async function citationEvidence(input) {
100
+ const parsed = inputSchema.parse(input);
101
+ log.debug("citation_evidence start", { query: parsed.query });
102
+ const res = await checkCitations({
103
+ query: parsed.query,
104
+ engine: parsed.engine,
105
+ max_results: parsed.max_results,
106
+ });
107
+ const raw = res.raw_answer ?? "";
108
+ const has_raw = raw.length > 0;
109
+ const evidence = res.citations.map((c) => {
110
+ const mention = has_raw ? findFirstMention(c.url, raw) : null;
111
+ if (!mention) {
112
+ return {
113
+ url: c.url,
114
+ rank: c.rank,
115
+ title: c.title,
116
+ found: false,
117
+ snippet: c.snippet ?? null,
118
+ nearby_quote: null,
119
+ mention_char: null,
120
+ };
121
+ }
122
+ const { snippet } = extractWindow(raw, mention.index, mention.matched.length, parsed.context_chars);
123
+ return {
124
+ url: c.url,
125
+ rank: c.rank,
126
+ title: c.title,
127
+ found: true,
128
+ snippet,
129
+ nearby_quote: nearestQuotedOrSentence(raw, mention.index) ?? null,
130
+ mention_char: mention.index,
131
+ matched: mention.matched,
132
+ };
133
+ });
134
+ return {
135
+ query: parsed.query,
136
+ engine: res.engine,
137
+ fetched_at: new Date().toISOString(),
138
+ raw_answer_chars: raw.length,
139
+ has_raw_answer: has_raw,
140
+ citations_total: res.citations.length,
141
+ evidence_found: evidence.filter((e) => e.found).length,
142
+ evidence,
143
+ note: has_raw
144
+ ? "snippet is a window around the first mention of the URL/hostname in the engine's raw_answer. nearby_quote tries to extract a quoted span or containing sentence."
145
+ : "engine returned no raw_answer (Bing/Brave style listings, or empty answer). evidence is limited to whatever per-citation snippet the adapter parsed.",
146
+ };
147
+ }
148
+ //# sourceMappingURL=citation-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citation-evidence.js","sourceRoot":"","sources":["../../src/tools/citation-evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ export declare const crawlerAccessAuditInputSchema: {
3
+ url: z.ZodString;
4
+ bots: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
5
+ fetch_with_ua: z.ZodDefault<z.ZodBoolean>;
6
+ };
7
+ declare const inputSchema: z.ZodObject<{
8
+ url: z.ZodString;
9
+ bots: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
10
+ fetch_with_ua: z.ZodDefault<z.ZodBoolean>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ url: string;
13
+ fetch_with_ua: boolean;
14
+ bots?: string[] | undefined;
15
+ }, {
16
+ url: string;
17
+ bots?: string[] | undefined;
18
+ fetch_with_ua?: boolean | undefined;
19
+ }>;
20
+ type BotResult = {
21
+ name: string;
22
+ ua_token: string;
23
+ operator: string;
24
+ purpose: string;
25
+ robots_allowed: boolean | "unknown";
26
+ robots_rule: string | null;
27
+ fetch_status: number | null;
28
+ fetch_ok: boolean | null;
29
+ fetch_error: string | null;
30
+ verdict: "allowed" | "blocked" | "robots_only_allowed" | "robots_only_blocked" | "unknown";
31
+ };
32
+ export declare function crawlerAccessAudit(input: z.infer<typeof inputSchema>): Promise<{
33
+ url: string;
34
+ robots_url: string;
35
+ robots_status: number | null;
36
+ robots_present: boolean;
37
+ robots_error: string | null;
38
+ fetched_at: string;
39
+ bots: BotResult[];
40
+ summary: {
41
+ total: number;
42
+ allowed: number;
43
+ blocked: number;
44
+ unknown: number;
45
+ };
46
+ note: string;
47
+ }>;
48
+ export {};
49
+ //# sourceMappingURL=crawler-access-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawler-access-audit.d.ts","sourceRoot":"","sources":["../../src/tools/crawler-access-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,eAAO,MAAM,6BAA6B;;;;CAmBzC,CAAC;AAEF,QAAA,MAAM,WAAW;;;;;;;;;;;;EAA0C,CAAC;AA8G5D,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,qBAAqB,GAAG,qBAAqB,GAAG,SAAS,CAAC;CAC5F,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC;;;;;;;;;;;;;;;GAsJ1E"}
@@ -0,0 +1,256 @@
1
+ import { z } from "zod";
2
+ import robotsParserDefault from "robots-parser";
3
+ import { fetchText } from "../lib/fetch.js";
4
+ import { log } from "../lib/log.js";
5
+ const robotsParser = robotsParserDefault;
6
+ export const crawlerAccessAuditInputSchema = {
7
+ url: z
8
+ .string()
9
+ .url()
10
+ .describe("Page URL to test for AI crawler access."),
11
+ bots: z
12
+ .array(z.string())
13
+ .min(1)
14
+ .max(20)
15
+ .optional()
16
+ .describe("Override the default bot list. Each entry is a User-Agent token (e.g. 'GPTBot', 'ClaudeBot')."),
17
+ fetch_with_ua: z
18
+ .boolean()
19
+ .default(true)
20
+ .describe("If true, do a live GET as each bot's User-Agent and report status. Disable to only parse robots.txt (no extra requests)."),
21
+ };
22
+ const inputSchema = z.object(crawlerAccessAuditInputSchema);
23
+ // Curated list of the AI crawlers that matter for LLM citation visibility.
24
+ // User-agent tokens are the canonical strings each operator documents.
25
+ const DEFAULT_BOTS = [
26
+ {
27
+ name: "GPTBot",
28
+ ua_token: "GPTBot",
29
+ ua_full: "Mozilla/5.0 (compatible; GPTBot/1.0; +https://openai.com/gptbot)",
30
+ operator: "OpenAI",
31
+ purpose: "ChatGPT training data",
32
+ },
33
+ {
34
+ name: "OAI-SearchBot",
35
+ ua_token: "OAI-SearchBot",
36
+ ua_full: "Mozilla/5.0 (compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)",
37
+ operator: "OpenAI",
38
+ purpose: "ChatGPT Search index",
39
+ },
40
+ {
41
+ name: "ChatGPT-User",
42
+ ua_token: "ChatGPT-User",
43
+ ua_full: "Mozilla/5.0 (compatible; ChatGPT-User/1.0; +https://openai.com/bot)",
44
+ operator: "OpenAI",
45
+ purpose: "Real-time fetch on user prompt",
46
+ },
47
+ {
48
+ name: "ClaudeBot",
49
+ ua_token: "ClaudeBot",
50
+ ua_full: "Mozilla/5.0 (compatible; ClaudeBot/1.0; +claudebot@anthropic.com)",
51
+ operator: "Anthropic",
52
+ purpose: "Claude training data",
53
+ },
54
+ {
55
+ name: "Claude-Web",
56
+ ua_token: "Claude-Web",
57
+ ua_full: "Mozilla/5.0 (compatible; Claude-Web/1.0; +https://www.anthropic.com)",
58
+ operator: "Anthropic",
59
+ purpose: "Real-time fetch when Claude browses",
60
+ },
61
+ {
62
+ name: "PerplexityBot",
63
+ ua_token: "PerplexityBot",
64
+ ua_full: "Mozilla/5.0 (compatible; PerplexityBot/1.0; +https://docs.perplexity.ai/guides/bots)",
65
+ operator: "Perplexity",
66
+ purpose: "Perplexity index",
67
+ },
68
+ {
69
+ name: "Perplexity-User",
70
+ ua_token: "Perplexity-User",
71
+ ua_full: "Mozilla/5.0 (compatible; Perplexity-User/1.0; +https://docs.perplexity.ai/guides/bots)",
72
+ operator: "Perplexity",
73
+ purpose: "Real-time fetch on user query",
74
+ },
75
+ {
76
+ name: "CCBot",
77
+ ua_token: "CCBot",
78
+ ua_full: "CCBot/2.0 (https://commoncrawl.org/faq/)",
79
+ operator: "Common Crawl",
80
+ purpose: "Used by many LLM training corpora",
81
+ },
82
+ {
83
+ name: "Google-Extended",
84
+ ua_token: "Google-Extended",
85
+ ua_full: "Google-Extended",
86
+ operator: "Google",
87
+ purpose: "Gemini training opt-out token (robots-only, no live fetch)",
88
+ },
89
+ {
90
+ name: "Applebot-Extended",
91
+ ua_token: "Applebot-Extended",
92
+ ua_full: "Applebot-Extended",
93
+ operator: "Apple",
94
+ purpose: "Apple Intelligence training opt-out (robots-only)",
95
+ },
96
+ {
97
+ name: "Bytespider",
98
+ ua_token: "Bytespider",
99
+ ua_full: "Mozilla/5.0 (compatible; Bytespider; spider-feedback@bytedance.com)",
100
+ operator: "ByteDance",
101
+ purpose: "Doubao/Volcengine LLM training",
102
+ },
103
+ {
104
+ name: "Meta-ExternalAgent",
105
+ ua_token: "Meta-ExternalAgent",
106
+ ua_full: "meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)",
107
+ operator: "Meta",
108
+ purpose: "Llama training data fetch",
109
+ },
110
+ ];
111
+ // robots-only (cannot be live-tested because the operator does not actually
112
+ // fetch the URL - it's an opt-out token consumed by their pipeline).
113
+ const ROBOTS_ONLY = new Set(["Google-Extended", "Applebot-Extended"]);
114
+ function robotsUrlFor(target) {
115
+ const u = new URL(target);
116
+ return `${u.protocol}//${u.host}/robots.txt`;
117
+ }
118
+ export async function crawlerAccessAudit(input) {
119
+ const parsed = inputSchema.parse(input);
120
+ log.debug("crawler_access_audit start", { url: parsed.url });
121
+ const robotsUrl = robotsUrlFor(parsed.url);
122
+ let robotsBody = null;
123
+ let robotsStatus = null;
124
+ let robotsError = null;
125
+ try {
126
+ const r = await fetchText(robotsUrl, { timeoutMs: 15_000 });
127
+ robotsStatus = r.status;
128
+ robotsBody = r.status < 400 ? r.text : "";
129
+ }
130
+ catch (err) {
131
+ robotsError = err instanceof Error ? err.message : String(err);
132
+ robotsBody = "";
133
+ }
134
+ const robots = robotsParser(robotsUrl, robotsBody ?? "");
135
+ const botList = parsed.bots
136
+ ? parsed.bots.map((token) => {
137
+ const known = DEFAULT_BOTS.find((b) => b.name.toLowerCase() === token.toLowerCase() || b.ua_token === token);
138
+ return (known ?? {
139
+ name: token,
140
+ ua_token: token,
141
+ ua_full: token,
142
+ operator: "unknown",
143
+ purpose: "user-supplied bot",
144
+ });
145
+ })
146
+ : DEFAULT_BOTS;
147
+ const results = await Promise.all(botList.map(async (bot) => {
148
+ let allowed = "unknown";
149
+ try {
150
+ const a = robots.isAllowed(parsed.url, bot.ua_token);
151
+ if (typeof a === "boolean")
152
+ allowed = a;
153
+ }
154
+ catch {
155
+ allowed = "unknown";
156
+ }
157
+ const rule = (() => {
158
+ try {
159
+ // robots-parser exposes the matched rule via getMatchingLineNumber, but
160
+ // not all versions expose it. Keep it simple: report the User-Agent
161
+ // group we matched if any disallow line exists for this bot.
162
+ if (!robotsBody)
163
+ return null;
164
+ const re = new RegExp(`(^|\\n)User-agent:\\s*${bot.ua_token}([\\s\\S]*?)(?=\\n\\s*User-agent:|$)`, "i");
165
+ const m = robotsBody.match(re);
166
+ if (!m)
167
+ return null;
168
+ const block = m[2]
169
+ .split("\n")
170
+ .map((line) => line.trim())
171
+ .filter((line) => /^(allow|disallow|crawl-delay):/i.test(line))
172
+ .join(" | ");
173
+ return block || null;
174
+ }
175
+ catch {
176
+ return null;
177
+ }
178
+ })();
179
+ const isRobotsOnly = ROBOTS_ONLY.has(bot.name);
180
+ if (isRobotsOnly || !parsed.fetch_with_ua) {
181
+ const verdict = allowed === true
182
+ ? isRobotsOnly
183
+ ? "robots_only_allowed"
184
+ : "allowed"
185
+ : allowed === false
186
+ ? isRobotsOnly
187
+ ? "robots_only_blocked"
188
+ : "blocked"
189
+ : "unknown";
190
+ return {
191
+ name: bot.name,
192
+ ua_token: bot.ua_token,
193
+ operator: bot.operator,
194
+ purpose: bot.purpose,
195
+ robots_allowed: allowed,
196
+ robots_rule: rule,
197
+ fetch_status: null,
198
+ fetch_ok: null,
199
+ fetch_error: null,
200
+ verdict,
201
+ };
202
+ }
203
+ // live UA test
204
+ let status = null;
205
+ let err = null;
206
+ try {
207
+ const r = await fetchText(parsed.url, {
208
+ method: "GET",
209
+ headers: { "user-agent": bot.ua_full },
210
+ timeoutMs: 15_000,
211
+ });
212
+ status = r.status;
213
+ }
214
+ catch (e) {
215
+ err = e instanceof Error ? e.message : String(e);
216
+ }
217
+ const fetchOk = status !== null && status < 400;
218
+ const verdict = allowed === false
219
+ ? "blocked"
220
+ : fetchOk
221
+ ? "allowed"
222
+ : allowed === true
223
+ ? "blocked"
224
+ : "unknown";
225
+ return {
226
+ name: bot.name,
227
+ ua_token: bot.ua_token,
228
+ operator: bot.operator,
229
+ purpose: bot.purpose,
230
+ robots_allowed: allowed,
231
+ robots_rule: rule,
232
+ fetch_status: status,
233
+ fetch_ok: fetchOk,
234
+ fetch_error: err,
235
+ verdict,
236
+ };
237
+ }));
238
+ const summary = {
239
+ total: results.length,
240
+ allowed: results.filter((r) => r.verdict === "allowed" || r.verdict === "robots_only_allowed").length,
241
+ blocked: results.filter((r) => r.verdict === "blocked" || r.verdict === "robots_only_blocked").length,
242
+ unknown: results.filter((r) => r.verdict === "unknown").length,
243
+ };
244
+ return {
245
+ url: parsed.url,
246
+ robots_url: robotsUrl,
247
+ robots_status: robotsStatus,
248
+ robots_present: !!(robotsBody && robotsBody.length > 0),
249
+ robots_error: robotsError,
250
+ fetched_at: new Date().toISOString(),
251
+ bots: results,
252
+ summary,
253
+ note: "verdict combines robots.txt parsing with a live GET using each bot's User-Agent (unless fetch_with_ua=false or the bot is opt-out-token only, like Google-Extended). 'blocked' = robots.txt forbids OR the page 4xx/5xx'd under that UA.",
254
+ };
255
+ }
256
+ //# sourceMappingURL=crawler-access-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawler-access-audit.js","sourceRoot":"","sources":["../../src/tools/crawler-access-audit.ts"],"names":[],"mappings":"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"}
@@ -2,19 +2,19 @@ import { z } from "zod";
2
2
  export declare const runPanelInputSchema: {
3
3
  name: z.ZodString;
4
4
  domain: z.ZodOptional<z.ZodString>;
5
- engine: z.ZodDefault<z.ZodEnum<["perplexity", "claude", "openai", "gemini", "bing", "brave", "auto"]>>;
5
+ engine: z.ZodDefault<z.ZodEnum<["perplexity", "claude", "openai", "gemini", "bing", "brave", "google_ai_mode", "auto"]>>;
6
6
  };
7
7
  declare const inputSchema: z.ZodObject<{
8
8
  name: z.ZodString;
9
9
  domain: z.ZodOptional<z.ZodString>;
10
- engine: z.ZodDefault<z.ZodEnum<["perplexity", "claude", "openai", "gemini", "bing", "brave", "auto"]>>;
10
+ engine: z.ZodDefault<z.ZodEnum<["perplexity", "claude", "openai", "gemini", "bing", "brave", "google_ai_mode", "auto"]>>;
11
11
  }, "strip", z.ZodTypeAny, {
12
- engine: "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "auto";
12
+ engine: "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "google_ai_mode" | "auto";
13
13
  name: string;
14
14
  domain?: string | undefined;
15
15
  }, {
16
16
  name: string;
17
- engine?: "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "auto" | undefined;
17
+ engine?: "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "google_ai_mode" | "auto" | undefined;
18
18
  domain?: string | undefined;
19
19
  }>;
20
20
  export declare function runPanel(input: z.infer<typeof inputSchema>): Promise<{
@@ -26,7 +26,7 @@ export declare function runPanel(input: z.infer<typeof inputSchema>): Promise<{
26
26
  snapshot: {
27
27
  panel: string;
28
28
  domain: string;
29
- engine: "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "auto";
29
+ engine: "perplexity" | "claude" | "openai" | "gemini" | "bing" | "brave" | "google_ai_mode" | "auto";
30
30
  taken_at: string;
31
31
  per_query: {
32
32
  query: string;
@@ -11,7 +11,7 @@ export const runPanelInputSchema = {
11
11
  .optional()
12
12
  .describe("Override the panel's default domain for this run."),
13
13
  engine: z
14
- .enum(["perplexity", "claude", "openai", "gemini", "bing", "brave", "auto"])
14
+ .enum(["perplexity", "claude", "openai", "gemini", "bing", "brave", "google_ai_mode", "auto"])
15
15
  .default("auto")
16
16
  .describe("AI engine to query."),
17
17
  };