@pseolint/core 0.2.2 → 0.3.1

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 (77) hide show
  1. package/README.md +10 -9
  2. package/dist/ai/prompt.d.ts +1 -1
  3. package/dist/ai/prompt.d.ts.map +1 -1
  4. package/dist/ai/prompt.js +13 -1
  5. package/dist/ai/prompt.js.map +1 -1
  6. package/dist/ai/triage.d.ts +15 -1
  7. package/dist/ai/triage.d.ts.map +1 -1
  8. package/dist/ai/triage.js +30 -0
  9. package/dist/ai/triage.js.map +1 -1
  10. package/dist/analytics-blocklist.d.ts +28 -0
  11. package/dist/analytics-blocklist.d.ts.map +1 -0
  12. package/dist/analytics-blocklist.js +129 -0
  13. package/dist/analytics-blocklist.js.map +1 -0
  14. package/dist/auditor.d.ts.map +1 -1
  15. package/dist/auditor.js +130 -46
  16. package/dist/auditor.js.map +1 -1
  17. package/dist/formatters/console.d.ts +9 -0
  18. package/dist/formatters/console.d.ts.map +1 -1
  19. package/dist/formatters/console.js +53 -0
  20. package/dist/formatters/console.js.map +1 -1
  21. package/dist/formatters/html.d.ts.map +1 -1
  22. package/dist/formatters/html.js +557 -144
  23. package/dist/formatters/html.js.map +1 -1
  24. package/dist/index.d.ts +14 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +12 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/renderer.d.ts +14 -0
  29. package/dist/renderer.d.ts.map +1 -1
  30. package/dist/renderer.js +130 -4
  31. package/dist/renderer.js.map +1 -1
  32. package/dist/rule-references.d.ts.map +1 -1
  33. package/dist/rule-references.js +9 -0
  34. package/dist/rule-references.js.map +1 -1
  35. package/dist/rules/aeo/answer-first.d.ts +18 -0
  36. package/dist/rules/aeo/answer-first.d.ts.map +1 -0
  37. package/dist/rules/aeo/answer-first.js +191 -0
  38. package/dist/rules/aeo/answer-first.js.map +1 -0
  39. package/dist/rules/aeo/citable-facts.d.ts +9 -0
  40. package/dist/rules/aeo/citable-facts.d.ts.map +1 -0
  41. package/dist/rules/aeo/citable-facts.js +90 -0
  42. package/dist/rules/aeo/citable-facts.js.map +1 -0
  43. package/dist/rules/aeo/content-modularity.d.ts +11 -0
  44. package/dist/rules/aeo/content-modularity.d.ts.map +1 -0
  45. package/dist/rules/aeo/content-modularity.js +107 -0
  46. package/dist/rules/aeo/content-modularity.js.map +1 -0
  47. package/dist/rules/aeo/crawler-access.d.ts +25 -0
  48. package/dist/rules/aeo/crawler-access.d.ts.map +1 -0
  49. package/dist/rules/aeo/crawler-access.js +116 -0
  50. package/dist/rules/aeo/crawler-access.js.map +1 -0
  51. package/dist/rules/aeo/faq-coverage.d.ts +9 -0
  52. package/dist/rules/aeo/faq-coverage.d.ts.map +1 -0
  53. package/dist/rules/aeo/faq-coverage.js +71 -0
  54. package/dist/rules/aeo/faq-coverage.js.map +1 -0
  55. package/dist/rules/aeo/freshness-signals.d.ts +9 -0
  56. package/dist/rules/aeo/freshness-signals.d.ts.map +1 -0
  57. package/dist/rules/aeo/freshness-signals.js +109 -0
  58. package/dist/rules/aeo/freshness-signals.js.map +1 -0
  59. package/dist/rules/aeo/llms-txt.d.ts +24 -0
  60. package/dist/rules/aeo/llms-txt.d.ts.map +1 -0
  61. package/dist/rules/aeo/llms-txt.js +93 -0
  62. package/dist/rules/aeo/llms-txt.js.map +1 -0
  63. package/dist/rules/aeo/non-replicable-value.d.ts +9 -0
  64. package/dist/rules/aeo/non-replicable-value.d.ts.map +1 -0
  65. package/dist/rules/aeo/non-replicable-value.js +95 -0
  66. package/dist/rules/aeo/non-replicable-value.js.map +1 -0
  67. package/dist/rules/aeo/summary-bait.d.ts +20 -0
  68. package/dist/rules/aeo/summary-bait.d.ts.map +1 -0
  69. package/dist/rules/aeo/summary-bait.js +147 -0
  70. package/dist/rules/aeo/summary-bait.js.map +1 -0
  71. package/dist/rules/scope.d.ts +12 -0
  72. package/dist/rules/scope.d.ts.map +1 -0
  73. package/dist/rules/scope.js +67 -0
  74. package/dist/rules/scope.js.map +1 -0
  75. package/dist/types.d.ts +30 -0
  76. package/dist/types.d.ts.map +1 -1
  77. package/package.json +3 -3
package/README.md CHANGED
@@ -24,15 +24,16 @@ console.log(`Findings: ${summary.findings.length}`);
24
24
 
25
25
  ## What It Checks
26
26
 
27
- 37+ rules across 7 categories:
27
+ 43 rules across 8 categories. Seven categories feed the composite score; `data/*` is a separate data-binding family.
28
28
 
29
- - **Spam / SpamBrain risk** — near-duplicate (SimHash), entity-swap doorways, thin content, boilerplate ratio, template diversity, template coverage, publication velocity, doorway pattern
30
- - **Content** — unique value, heading / meta uniqueness, author attribution, E-E-A-T signals
31
- - **Internal linking** — orphan pages, dead ends, cluster connectivity, hub pages, link depth, unreachable-from-root
32
- - **Technical SEO** — canonical consistency, canonical/noindex and robots/noindex conflicts, sitemap completeness, robots compliance, redirect chains, soft 404s, Open Graph, hreflang
33
- - **Structured data** — JSON-LD validity, required fields, cross-page schema consistency
34
- - **Cannibalization** — title overlap, keyword collision, URL pattern conflicts
35
- - **Data binding** — verify rendered pages expose values from a source dataset (catches missing or identical-across-pages bindings)
29
+ - **Spam / SpamBrain risk** (8) — near-duplicate (SimHash), entity-swap doorways, thin content, boilerplate ratio, template diversity, template coverage, publication velocity, doorway pattern
30
+ - **Technical SEO** (8) canonical consistency, canonical/noindex and robots/noindex conflicts, sitemap completeness, robots compliance, redirect chains, soft 404s, Open Graph, hreflang
31
+ - **AEO / AI Overview citability** (9, v0.3.0–v0.3.1) `llms.txt` presence, AI-crawler access in robots.txt, freshness signals, FAQ coverage, answer-first opener, citable-fact density, non-replicable value, content modularity, **summary-bait** (pages optimized for summarization over retention)
32
+ - **Content** (5) unique value, heading / meta uniqueness, author attribution, E-E-A-T signals
33
+ - **Internal linking** (5) orphan pages, dead ends, cluster connectivity, hub pages, link depth
34
+ - **Structured data** (3) JSON-LD validity, required fields, cross-page schema consistency
35
+ - **Cannibalization** (3) title overlap, keyword collision, URL pattern conflicts
36
+ - **Data binding** (2) — verify rendered pages expose values from a source dataset (missing or identical-across-pages bindings)
36
37
 
37
38
  ## API
38
39
 
@@ -118,4 +119,4 @@ All AI providers and `playwright-core` are optional peers — you only install t
118
119
 
119
120
  ## License
120
121
 
121
- MIT
122
+ MIT
@@ -1,5 +1,5 @@
1
1
  import type { RuleResult } from "../types.js";
2
- export declare const PROMPT_VERSION = "1.0.0";
2
+ export declare const PROMPT_VERSION = "1.1.0";
3
3
  export declare const MAX_FINDINGS_IN_PROMPT = 200;
4
4
  export interface PromptRequest {
5
5
  system: string;
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAe1C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAMrD;AAmBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CA8B3F"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAqB1C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAMrD;AAqBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CAqC3F"}
package/dist/ai/prompt.js CHANGED
@@ -1,9 +1,15 @@
1
1
  import { createHash } from "node:crypto";
2
- export const PROMPT_VERSION = "1.0.0";
2
+ export const PROMPT_VERSION = "1.1.0";
3
3
  export const MAX_FINDINGS_IN_PROMPT = 200;
4
4
  const SEVERITY_ORDER = { info: 0, warning: 1, error: 2, critical: 3 };
5
5
  const SYSTEM_PROMPT = `You are an SEO audit triage assistant. Given a list of pSEO linter findings, identify 1-5 underlying ROOT CAUSES driving the findings. Group findings by shared underlying problem, not by rule ID. Rank causes by likely SEO impact (highest first).
6
6
 
7
+ Findings fall into two distinct threat families — treat them as separate root causes, not one combined cause:
8
+ - SpamBrain penalty risk: spam/*, cannibal/*, content/*, data/*, tech/*, schema/*, links/* — these make Google penalize or demote the site.
9
+ - AI Overview invisibility: aeo/* — these make pages uncitable in AI answer engines (ChatGPT, Perplexity, Gemini, AI Overviews). Sites not cited lose ~68% of traffic vs ~12% for cited sites.
10
+
11
+ When both families are present, produce at least one root cause from each. Label AEO root causes clearly (e.g. "AI Overviews: ...") so the user can tell them apart from penalty risks.
12
+
7
13
  Rules:
8
14
  - Emit rootCauses FIRST, then narrative — do not reverse this order.
9
15
  - Keep each rootCause label <= 80 chars and phrase it as a problem statement.
@@ -31,11 +37,17 @@ export function buildPromptRequest(findings, pageCount) {
31
37
  pageUrl: f.pageUrl,
32
38
  group: f.group,
33
39
  }));
40
+ const countByCategory = {};
41
+ for (const f of findings) {
42
+ const cat = f.ruleId.split("/")[0];
43
+ countByCategory[cat] = (countByCategory[cat] ?? 0) + 1;
44
+ }
34
45
  const payload = {
35
46
  totalFindings: total,
36
47
  pageCount,
37
48
  truncated,
38
49
  findings: projected,
50
+ findingCountByCategory: countByCategory,
39
51
  };
40
52
  if (truncated) {
41
53
  const counts = {};
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,MAAM,cAAc,GAA6B,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAEhG,MAAM,aAAa,GAAG;;;;;;;;;sDASgC,CAAC;AAOvD,MAAM,UAAU,eAAe,CAAC,CAAa;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;SAC3C,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACf,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;AAC/B,CAAC;AAmBD,MAAM,UAAU,kBAAkB,CAAC,QAAsB,EAAE,SAAiB;IAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrG,MAAM,SAAS,GAAG,KAAK,GAAG,sBAAsB,CAAC;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC;QACvF,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GAAkB;QAC7B,aAAa,EAAE,KAAK;QACpB,SAAS;QACT,SAAS;QACT,QAAQ,EAAE,SAAS;KACpB,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC;IACtC,CAAC;IAED,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,MAAM,cAAc,GAA6B,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAEhG,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;sDAegC,CAAC;AAOvD,MAAM,UAAU,eAAe,CAAC,CAAa;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;SAC3C,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACf,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;AAC/B,CAAC;AAqBD,MAAM,UAAU,kBAAkB,CAAC,QAAsB,EAAE,SAAiB;IAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrG,MAAM,SAAS,GAAG,KAAK,GAAG,sBAAsB,CAAC;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC;QACvF,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAkB;QAC7B,aAAa,EAAE,KAAK;QACpB,SAAS;QACT,SAAS;QACT,QAAQ,EAAE,SAAS;QACnB,sBAAsB,EAAE,eAAe;KACxC,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC;IACtC,CAAC;IAED,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { type LanguageModel } from "ai";
2
- import type { RuleResult } from "../types.js";
2
+ import type { RuleResult, AuditSummary } from "../types.js";
3
3
  import type { TriageResult } from "./types.js";
4
4
  export interface TriageOptions {
5
5
  enabled: boolean;
@@ -25,4 +25,18 @@ export interface TriageOutcome {
25
25
  skipReason?: string;
26
26
  }
27
27
  export declare function triageFindings(findings: RuleResult[], pageCount: number, options: TriageOptions): Promise<TriageOutcome>;
28
+ /**
29
+ * High-level triage entry point for server-side callers (e.g. the web API).
30
+ *
31
+ * Unlike `triageFindings`, this function:
32
+ * - Accepts an `AuditSummary` directly.
33
+ * - Resolves the language model automatically via `createLanguageModel`.
34
+ * - Returns a `TriageResult` (throws on skip / error).
35
+ *
36
+ * @param summary - The audit summary to triage.
37
+ * @param opts - Optional overrides: `maxCostUsd` (default 0.5).
38
+ */
39
+ export declare function triage(summary: AuditSummary, opts?: {
40
+ maxCostUsd?: number;
41
+ }): Promise<TriageResult>;
28
42
  //# sourceMappingURL=triage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/ai/triage.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA2B/C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gGAAgG;IAChG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;IAC/C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAeD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,UAAU,EAAE,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAuHxB"}
1
+ {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/ai/triage.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4B/C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gGAAgG;IAChG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;IAC/C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAeD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,UAAU,EAAE,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAuHxB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,YAAY,EACrB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,YAAY,CAAC,CAiBvB"}
package/dist/ai/triage.js CHANGED
@@ -4,6 +4,7 @@ import { z } from "zod";
4
4
  import { PROMPT_VERSION, MAX_FINDINGS_IN_PROMPT, assignFindingId, buildPromptRequest, } from "./prompt.js";
5
5
  import { readTriageCache, writeTriageCache, triageCacheKey } from "./cache.js";
6
6
  import { estimateCostUsd } from "./cost.js";
7
+ import { createLanguageModel } from "./adapters/index.js";
7
8
  const SEVERITIES = ["info", "warning", "error", "critical"];
8
9
  const rootCauseSchema = z.object({
9
10
  label: z.string().min(1).max(80).describe("Short problem statement, <= 80 chars."),
@@ -133,4 +134,33 @@ export async function triageFindings(findings, pageCount, options) {
133
134
  }
134
135
  return { result };
135
136
  }
137
+ /**
138
+ * High-level triage entry point for server-side callers (e.g. the web API).
139
+ *
140
+ * Unlike `triageFindings`, this function:
141
+ * - Accepts an `AuditSummary` directly.
142
+ * - Resolves the language model automatically via `createLanguageModel`.
143
+ * - Returns a `TriageResult` (throws on skip / error).
144
+ *
145
+ * @param summary - The audit summary to triage.
146
+ * @param opts - Optional overrides: `maxCostUsd` (default 0.5).
147
+ */
148
+ export async function triage(summary, opts) {
149
+ const resolved = await createLanguageModel({});
150
+ const outcome = await triageFindings(summary.findings, summary.pageCount, {
151
+ enabled: true,
152
+ model: resolved.model,
153
+ providerId: resolved.providerId,
154
+ modelId: resolved.modelId,
155
+ maxCostUsd: opts?.maxCostUsd ?? 0.5,
156
+ cache: {
157
+ dir: ".pseolint/ai-cache",
158
+ ttlMs: 30 * 24 * 60 * 60 * 1000,
159
+ },
160
+ });
161
+ if (!outcome.result) {
162
+ throw new Error(outcome.skipReason ?? "triage produced no result");
163
+ }
164
+ return outcome.result;
165
+ }
136
166
  //# sourceMappingURL=triage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/ai/triage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/ai/triage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Known analytics / product-telemetry / session-replay hostnames.
3
+ *
4
+ * Rendered-mode audits would otherwise fire every client-side beacon on every
5
+ * page they visit, injecting fake sessions into the site owner's dashboards.
6
+ * The renderer intercepts outbound requests and aborts any whose hostname
7
+ * includes one of these tokens (substring match — a single entry covers all
8
+ * regional variants like `www.google-analytics.com`, `www1.google-analytics.com`, …).
9
+ *
10
+ * Conservative on the allow side: we don't block `fonts.googleapis.com`,
11
+ * `gstatic.com`, `cdn.jsdelivr.net`, etc., because they can be legitimate
12
+ * content-rendering dependencies. Errors-in-doubt are logged as warnings at
13
+ * the call site and never throw.
14
+ */
15
+ export declare const DEFAULT_ANALYTICS_HOSTS: readonly ["google-analytics.com", "googletagmanager.com", "doubleclick.net", "googleadservices.com", "googlesyndication.com", "pagead2.googlesyndication.com", "plausible.io", "umami.is", "umami.app", "fathom.io", "fathomdns.com", "simpleanalytics.com", "simpleanalyticscdn.com", "posthog.com", "mixpanel.com", "segment.com", "segment.io", "amplitude.com", "heap.io", "heapanalytics.com", "pendo.io", "mparticle.com", "rudderlabs.com", "hotjar.com", "fullstory.com", "clarity.ms", "mouseflow.com", "luckyorange.com", "smartlook.com", "logrocket.com", "lr-ingest.com", "sentry.io", "bugsnag.com", "hubspot.com", "hs-analytics.net", "hs-scripts.com", "marketo.com", "marketo.net", "intercom.io", "intercomcdn.com", "cloudflareinsights.com", "vercel-insights.com", "vercel-analytics.com", "matomo.cloud", "matomo.org", "datadoghq.com", "datadoghq.eu", "ddog-gov.com", "newrelic.com", "nr-data.net"];
16
+ /**
17
+ * True when the URL's host contains one of the blocked substrings. In
18
+ * `allow-first-party` mode, same-origin requests are allowed even if the host
19
+ * matches the list (callers pass in the page origin).
20
+ */
21
+ export declare function isAnalyticsRequest(url: string, options?: {
22
+ pageOrigin?: string;
23
+ blockedHosts?: readonly string[];
24
+ extraBlockedHosts?: readonly string[];
25
+ mode?: "block" | "allow" | "allow-first-party";
26
+ }): boolean;
27
+ export type AnalyticsMode = "block" | "allow" | "allow-first-party";
28
+ //# sourceMappingURL=analytics-blocklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-blocklist.d.ts","sourceRoot":"","sources":["../src/analytics-blocklist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,uBAAuB,g4BAwE1B,CAAC;AASX;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,mBAAmB,CAAC;CAC3C,GACL,OAAO,CAuCT;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Known analytics / product-telemetry / session-replay hostnames.
3
+ *
4
+ * Rendered-mode audits would otherwise fire every client-side beacon on every
5
+ * page they visit, injecting fake sessions into the site owner's dashboards.
6
+ * The renderer intercepts outbound requests and aborts any whose hostname
7
+ * includes one of these tokens (substring match — a single entry covers all
8
+ * regional variants like `www.google-analytics.com`, `www1.google-analytics.com`, …).
9
+ *
10
+ * Conservative on the allow side: we don't block `fonts.googleapis.com`,
11
+ * `gstatic.com`, `cdn.jsdelivr.net`, etc., because they can be legitimate
12
+ * content-rendering dependencies. Errors-in-doubt are logged as warnings at
13
+ * the call site and never throw.
14
+ */
15
+ export const DEFAULT_ANALYTICS_HOSTS = [
16
+ // Google stack
17
+ "google-analytics.com",
18
+ "googletagmanager.com",
19
+ "doubleclick.net",
20
+ "googleadservices.com",
21
+ "googlesyndication.com",
22
+ "pagead2.googlesyndication.com",
23
+ // Privacy-focused analytics
24
+ "plausible.io",
25
+ "umami.is",
26
+ "umami.app",
27
+ "fathom.io",
28
+ "fathomdns.com",
29
+ "simpleanalytics.com",
30
+ "simpleanalyticscdn.com",
31
+ // Product analytics
32
+ "posthog.com",
33
+ "mixpanel.com",
34
+ "segment.com",
35
+ "segment.io",
36
+ "amplitude.com",
37
+ "heap.io",
38
+ "heapanalytics.com",
39
+ "pendo.io",
40
+ "mparticle.com",
41
+ "rudderlabs.com",
42
+ // Session replay / heatmaps
43
+ "hotjar.com",
44
+ "fullstory.com",
45
+ "clarity.ms",
46
+ "mouseflow.com",
47
+ "luckyorange.com",
48
+ "smartlook.com",
49
+ "logrocket.com",
50
+ "lr-ingest.com",
51
+ // Error tracking (fires on every page load via init)
52
+ "sentry.io",
53
+ "bugsnag.com",
54
+ // Marketing automation / CDPs
55
+ "hubspot.com",
56
+ "hs-analytics.net",
57
+ "hs-scripts.com",
58
+ "marketo.com",
59
+ "marketo.net",
60
+ // Chat widgets that auto-ping on page view
61
+ "intercom.io",
62
+ "intercomcdn.com",
63
+ // Cloudflare / Vercel analytics
64
+ "cloudflareinsights.com",
65
+ "vercel-insights.com",
66
+ "vercel-analytics.com",
67
+ // Matomo SaaS
68
+ "matomo.cloud",
69
+ "matomo.org",
70
+ // Datadog RUM
71
+ "datadoghq.com",
72
+ "datadoghq.eu",
73
+ "ddog-gov.com",
74
+ // New Relic browser agent
75
+ "newrelic.com",
76
+ "nr-data.net",
77
+ ];
78
+ // Pre-lower the default list once at module load — the renderer calls
79
+ // isAnalyticsRequest for every subresource of every rendered page, so avoiding
80
+ // a per-call `.toLowerCase()` of ~40 tokens matters on large audits.
81
+ const DEFAULT_ANALYTICS_HOSTS_LOWER = DEFAULT_ANALYTICS_HOSTS.map((h) => h.toLowerCase());
82
+ /**
83
+ * True when the URL's host contains one of the blocked substrings. In
84
+ * `allow-first-party` mode, same-origin requests are allowed even if the host
85
+ * matches the list (callers pass in the page origin).
86
+ */
87
+ export function isAnalyticsRequest(url, options = {}) {
88
+ const mode = options.mode ?? "block";
89
+ if (mode === "allow")
90
+ return false;
91
+ let parsed;
92
+ try {
93
+ parsed = new URL(url);
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ if (mode === "allow-first-party" && options.pageOrigin) {
99
+ try {
100
+ const origin = new URL(options.pageOrigin).origin;
101
+ // "null" is the string form of opaque origins (`about:blank`, `data:`)
102
+ // and must never be treated as matching any real origin.
103
+ if (origin !== "null" && parsed.origin !== "null" && parsed.origin === origin) {
104
+ return false;
105
+ }
106
+ }
107
+ catch {
108
+ // fall through — treat as cross-origin
109
+ }
110
+ }
111
+ const host = parsed.host.toLowerCase();
112
+ // Use the pre-lowered default unless the caller supplied their own list; the
113
+ // caller list is lowered here on the fly (it's small and caller-controlled).
114
+ const base = options.blockedHosts
115
+ ? options.blockedHosts.map((h) => h.toLowerCase())
116
+ : DEFAULT_ANALYTICS_HOSTS_LOWER;
117
+ for (const token of base) {
118
+ if (host.includes(token))
119
+ return true;
120
+ }
121
+ if (options.extraBlockedHosts) {
122
+ for (const token of options.extraBlockedHosts) {
123
+ if (host.includes(token.toLowerCase()))
124
+ return true;
125
+ }
126
+ }
127
+ return false;
128
+ }
129
+ //# sourceMappingURL=analytics-blocklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-blocklist.js","sourceRoot":"","sources":["../src/analytics-blocklist.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auditor.d.ts","sourceRoot":"","sources":["../src/auditor.ts"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAwG,MAAM,YAAY,CAAC;AA8wBnK,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAod/F"}
1
+ {"version":3,"file":"auditor.d.ts","sourceRoot":"","sources":["../src/auditor.ts"],"names":[],"mappings":"AA8DA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAwG,MAAM,YAAY,CAAC;AA+0BnK,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAgf/F"}