ax-audit 3.6.0 → 4.0.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/CHANGELOG.md +138 -0
- package/LICENSE +1 -1
- package/README.md +58 -36
- package/dist/baseline.d.ts +2 -0
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +42 -4
- package/dist/baseline.js.map +1 -1
- package/dist/check-ids.d.ts +19 -0
- package/dist/check-ids.d.ts.map +1 -0
- package/dist/check-ids.js +53 -0
- package/dist/check-ids.js.map +1 -0
- package/dist/checks/agent-access.d.ts +23 -6
- package/dist/checks/agent-access.d.ts.map +1 -1
- package/dist/checks/agent-access.js +200 -54
- package/dist/checks/agent-access.js.map +1 -1
- package/dist/checks/agent-card.d.ts +37 -0
- package/dist/checks/agent-card.d.ts.map +1 -0
- package/dist/checks/agent-card.js +352 -0
- package/dist/checks/agent-card.js.map +1 -0
- package/dist/checks/agent-operability.d.ts +66 -0
- package/dist/checks/agent-operability.d.ts.map +1 -0
- package/dist/checks/agent-operability.js +383 -0
- package/dist/checks/agent-operability.js.map +1 -0
- package/dist/checks/agent-skills.d.ts +24 -0
- package/dist/checks/agent-skills.d.ts.map +1 -0
- package/dist/checks/agent-skills.js +316 -0
- package/dist/checks/agent-skills.js.map +1 -0
- package/dist/checks/ai-catalog.d.ts +28 -0
- package/dist/checks/ai-catalog.d.ts.map +1 -0
- package/dist/checks/ai-catalog.js +254 -0
- package/dist/checks/ai-catalog.js.map +1 -0
- package/dist/checks/ai-directives.d.ts +57 -0
- package/dist/checks/ai-directives.d.ts.map +1 -0
- package/dist/checks/ai-directives.js +263 -0
- package/dist/checks/ai-directives.js.map +1 -0
- package/dist/checks/api-discovery.d.ts +26 -0
- package/dist/checks/api-discovery.d.ts.map +1 -0
- package/dist/checks/api-discovery.js +432 -0
- package/dist/checks/api-discovery.js.map +1 -0
- package/dist/checks/auth-discovery.d.ts +28 -0
- package/dist/checks/auth-discovery.d.ts.map +1 -0
- package/dist/checks/auth-discovery.js +213 -0
- package/dist/checks/auth-discovery.js.map +1 -0
- package/dist/checks/commerce-discovery.d.ts +40 -0
- package/dist/checks/commerce-discovery.d.ts.map +1 -0
- package/dist/checks/commerce-discovery.js +295 -0
- package/dist/checks/commerce-discovery.js.map +1 -0
- package/dist/checks/content-negotiation.d.ts.map +1 -1
- package/dist/checks/content-negotiation.js +135 -20
- package/dist/checks/content-negotiation.js.map +1 -1
- package/dist/checks/crawl-efficiency.d.ts +13 -1
- package/dist/checks/crawl-efficiency.d.ts.map +1 -1
- package/dist/checks/crawl-efficiency.js +65 -1
- package/dist/checks/crawl-efficiency.js.map +1 -1
- package/dist/checks/frontmatter.d.ts +34 -0
- package/dist/checks/frontmatter.d.ts.map +1 -0
- package/dist/checks/frontmatter.js +100 -0
- package/dist/checks/frontmatter.js.map +1 -0
- package/dist/checks/html-rendering.d.ts.map +1 -1
- package/dist/checks/html-rendering.js +0 -1
- package/dist/checks/html-rendering.js.map +1 -1
- package/dist/checks/html-utils.d.ts +10 -0
- package/dist/checks/html-utils.d.ts.map +1 -1
- package/dist/checks/html-utils.js +19 -0
- package/dist/checks/html-utils.js.map +1 -1
- package/dist/checks/http-headers.d.ts.map +1 -1
- package/dist/checks/http-headers.js +82 -10
- package/dist/checks/http-headers.js.map +1 -1
- package/dist/checks/http-hygiene.d.ts +26 -0
- package/dist/checks/http-hygiene.d.ts.map +1 -0
- package/dist/checks/http-hygiene.js +257 -0
- package/dist/checks/http-hygiene.js.map +1 -0
- package/dist/checks/index.d.ts.map +1 -1
- package/dist/checks/index.js +24 -8
- package/dist/checks/index.js.map +1 -1
- package/dist/checks/llms-txt.d.ts +15 -0
- package/dist/checks/llms-txt.d.ts.map +1 -1
- package/dist/checks/llms-txt.js +162 -2
- package/dist/checks/llms-txt.js.map +1 -1
- package/dist/checks/mcp-discovery.d.ts +30 -0
- package/dist/checks/mcp-discovery.d.ts.map +1 -0
- package/dist/checks/mcp-discovery.js +523 -0
- package/dist/checks/mcp-discovery.js.map +1 -0
- package/dist/checks/meta-tags.d.ts.map +1 -1
- package/dist/checks/meta-tags.js +6 -5
- package/dist/checks/meta-tags.js.map +1 -1
- package/dist/checks/robots-parser.d.ts +110 -0
- package/dist/checks/robots-parser.d.ts.map +1 -0
- package/dist/checks/robots-parser.js +277 -0
- package/dist/checks/robots-parser.js.map +1 -0
- package/dist/checks/robots-txt.d.ts +2 -20
- package/dist/checks/robots-txt.d.ts.map +1 -1
- package/dist/checks/robots-txt.js +219 -120
- package/dist/checks/robots-txt.js.map +1 -1
- package/dist/checks/rsl.d.ts +0 -2
- package/dist/checks/rsl.d.ts.map +1 -1
- package/dist/checks/rsl.js +1 -11
- package/dist/checks/rsl.js.map +1 -1
- package/dist/checks/security-txt.d.ts.map +1 -1
- package/dist/checks/security-txt.js +0 -1
- package/dist/checks/security-txt.js.map +1 -1
- package/dist/checks/seo-basics.d.ts.map +1 -1
- package/dist/checks/seo-basics.js +0 -1
- package/dist/checks/seo-basics.js.map +1 -1
- package/dist/checks/sitemap.d.ts.map +1 -1
- package/dist/checks/sitemap.js +0 -1
- package/dist/checks/sitemap.js.map +1 -1
- package/dist/checks/structured-data.d.ts.map +1 -1
- package/dist/checks/structured-data.js +215 -4
- package/dist/checks/structured-data.js.map +1 -1
- package/dist/checks/structured-fields.d.ts +46 -0
- package/dist/checks/structured-fields.d.ts.map +1 -0
- package/dist/checks/structured-fields.js +112 -0
- package/dist/checks/structured-fields.js.map +1 -0
- package/dist/checks/surface.d.ts +59 -0
- package/dist/checks/surface.d.ts.map +1 -0
- package/dist/checks/surface.js +106 -0
- package/dist/checks/surface.js.map +1 -0
- package/dist/checks/tls-https.d.ts.map +1 -1
- package/dist/checks/tls-https.js +0 -1
- package/dist/checks/tls-https.js.map +1 -1
- package/dist/checks/usage-policy.d.ts +53 -0
- package/dist/checks/usage-policy.d.ts.map +1 -0
- package/dist/checks/usage-policy.js +339 -0
- package/dist/checks/usage-policy.js.map +1 -0
- package/dist/checks/utils.d.ts +25 -1
- package/dist/checks/utils.d.ts.map +1 -1
- package/dist/checks/utils.js +33 -1
- package/dist/checks/utils.js.map +1 -1
- package/dist/checks/waf.d.ts +75 -0
- package/dist/checks/waf.d.ts.map +1 -0
- package/dist/checks/waf.js +203 -0
- package/dist/checks/waf.js.map +1 -0
- package/dist/checks/webmcp.d.ts +55 -0
- package/dist/checks/webmcp.d.ts.map +1 -0
- package/dist/checks/webmcp.js +209 -0
- package/dist/checks/webmcp.js.map +1 -0
- package/dist/checks/well-known.d.ts +38 -0
- package/dist/checks/well-known.d.ts.map +1 -0
- package/dist/checks/well-known.js +202 -0
- package/dist/checks/well-known.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +124 -4
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +195 -14
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +598 -70
- package/dist/constants.js.map +1 -1
- package/dist/fetcher.d.ts.map +1 -1
- package/dist/fetcher.js +44 -14
- package/dist/fetcher.js.map +1 -1
- package/dist/guide-urls.js +1 -1
- package/dist/guide-urls.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +5 -1
- package/dist/orchestrator.js.map +1 -1
- package/dist/reporter/html.d.ts +9 -0
- package/dist/reporter/html.d.ts.map +1 -1
- package/dist/reporter/html.js +49 -11
- package/dist/reporter/html.js.map +1 -1
- package/dist/reporter/markdown.d.ts.map +1 -1
- package/dist/reporter/markdown.js +36 -6
- package/dist/reporter/markdown.js.map +1 -1
- package/dist/reporter/terminal.d.ts.map +1 -1
- package/dist/reporter/terminal.js +36 -1
- package/dist/reporter/terminal.js.map +1 -1
- package/dist/scorer.d.ts +10 -0
- package/dist/scorer.d.ts.map +1 -1
- package/dist/scorer.js +22 -5
- package/dist/scorer.js.map +1 -1
- package/dist/types.d.ts +90 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/architecture.md +27 -11
- package/docs/checks.md +285 -52
- package/docs/cli.md +36 -0
- package/docs/concepts.md +27 -13
- package/docs/faq.md +18 -6
- package/docs/getting-started.md +20 -13
- package/docs/roadmap.md +367 -0
- package/package.json +13 -5
- package/dist/checks/agent-json.d.ts +0 -14
- package/dist/checks/agent-json.d.ts.map +0 -1
- package/dist/checks/agent-json.js +0 -167
- package/dist/checks/agent-json.js.map +0 -1
- package/dist/checks/mcp.d.ts +0 -4
- package/dist/checks/mcp.d.ts.map +0 -1
- package/dist/checks/mcp.js +0 -162
- package/dist/checks/mcp.js.map +0 -1
- package/dist/checks/openapi.d.ts +0 -4
- package/dist/checks/openapi.d.ts.map +0 -1
- package/dist/checks/openapi.js +0 -121
- package/dist/checks/openapi.js.map +0 -1
- package/dist/checks/well-known-ai.d.ts +0 -17
- package/dist/checks/well-known-ai.d.ts.map +0 -1
- package/dist/checks/well-known-ai.js +0 -123
- package/dist/checks/well-known-ai.js.map +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { isHtmlDocument } from './utils.js';
|
|
2
|
+
import { parseLinkHeader } from './http-headers.js';
|
|
3
|
+
const NOT_FOUND = { found: false, reason: '' };
|
|
4
|
+
/** Read the profile a run was invoked with, defaulting to automatic detection. */
|
|
5
|
+
export function profileFrom(ctx) {
|
|
6
|
+
return ctx.profile ?? 'auto';
|
|
7
|
+
}
|
|
8
|
+
/** Whether the active profile forces this surface applicable. */
|
|
9
|
+
export function forcedBy(profile, surface) {
|
|
10
|
+
return profile === 'all' || profile === surface;
|
|
11
|
+
}
|
|
12
|
+
async function exists(ctx, path) {
|
|
13
|
+
const res = await ctx.fetch(`${ctx.url}${path}`);
|
|
14
|
+
return res.ok && res.body.trim().length > 0 && !isHtmlDocument(res.body);
|
|
15
|
+
}
|
|
16
|
+
/** Links and headers pointing at a named area of the site. */
|
|
17
|
+
function linksTo(ctx, pattern) {
|
|
18
|
+
if (pattern.test(ctx.html ?? ''))
|
|
19
|
+
return true;
|
|
20
|
+
return parseLinkHeader(ctx.headers?.['link'] ?? '').some((entry) => pattern.test(entry.url));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Does this site offer an HTTP API?
|
|
24
|
+
*
|
|
25
|
+
* Evidence: a description at a conventional location, an RFC 9727 catalog, a
|
|
26
|
+
* `service-desc` relation, or navigation into an API or developer area. The
|
|
27
|
+
* last is the loosest and the most common: a site with a "Developers" link
|
|
28
|
+
* almost certainly has an API worth describing.
|
|
29
|
+
*/
|
|
30
|
+
export async function hasApiSurface(ctx) {
|
|
31
|
+
if (forcedBy(profileFrom(ctx), 'api'))
|
|
32
|
+
return { found: true, reason: '--profile api' };
|
|
33
|
+
for (const path of ['/openapi.json', '/.well-known/openapi.json', '/.well-known/api-catalog', '/swagger.json']) {
|
|
34
|
+
if (await exists(ctx, path))
|
|
35
|
+
return { found: true, reason: `a document at ${path}` };
|
|
36
|
+
}
|
|
37
|
+
if (linksTo(ctx, /rel\s*=\s*["'][^"']*service-desc/i)) {
|
|
38
|
+
return { found: true, reason: 'a service-desc link relation' };
|
|
39
|
+
}
|
|
40
|
+
if (linksTo(ctx, /href\s*=\s*["'][^"']*\/(api|developers?|api-docs|reference)\b/i)) {
|
|
41
|
+
return { found: true, reason: 'navigation into an API or developer area' };
|
|
42
|
+
}
|
|
43
|
+
if (/\bapi\.[a-z0-9-]+\.[a-z]{2,}/i.test(ctx.html ?? '')) {
|
|
44
|
+
return { found: true, reason: 'references to an API subdomain' };
|
|
45
|
+
}
|
|
46
|
+
return NOT_FOUND;
|
|
47
|
+
}
|
|
48
|
+
/** Does this site run an MCP server? */
|
|
49
|
+
export async function hasMcpSurface(ctx) {
|
|
50
|
+
if (forcedBy(profileFrom(ctx), 'mcp'))
|
|
51
|
+
return { found: true, reason: '--profile mcp' };
|
|
52
|
+
for (const path of ['/.well-known/mcp/server-card.json', '/mcp/server-card', '/.well-known/mcp.json']) {
|
|
53
|
+
if (await exists(ctx, path))
|
|
54
|
+
return { found: true, reason: `a document at ${path}` };
|
|
55
|
+
}
|
|
56
|
+
const catalog = await ctx.fetch(`${ctx.url}/.well-known/ai-catalog.json`);
|
|
57
|
+
if (catalog.ok && /application\/mcp-server-card\+json/.test(catalog.body)) {
|
|
58
|
+
return { found: true, reason: 'an MCP entry in the AI catalog' };
|
|
59
|
+
}
|
|
60
|
+
if (linksTo(ctx, /href\s*=\s*["'][^"']*\/mcp\b/i)) {
|
|
61
|
+
return { found: true, reason: 'navigation referencing an MCP endpoint' };
|
|
62
|
+
}
|
|
63
|
+
return NOT_FOUND;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Is this site agent-facing — something an agent would call rather than only
|
|
67
|
+
* read?
|
|
68
|
+
*
|
|
69
|
+
* An Agent Card describes capabilities another agent can invoke. Most sites do
|
|
70
|
+
* not have any, and asking a restaurant to publish one is noise. A site that
|
|
71
|
+
* runs an MCP server, offers an API, or already publishes a card is a different
|
|
72
|
+
* matter.
|
|
73
|
+
*/
|
|
74
|
+
export async function hasAgentSurface(ctx) {
|
|
75
|
+
if (forcedBy(profileFrom(ctx), 'agent'))
|
|
76
|
+
return { found: true, reason: '--profile agent' };
|
|
77
|
+
for (const path of ['/.well-known/agent-card.json', '/.well-known/agent.json']) {
|
|
78
|
+
if (await exists(ctx, path))
|
|
79
|
+
return { found: true, reason: `a document at ${path}` };
|
|
80
|
+
}
|
|
81
|
+
const catalog = await ctx.fetch(`${ctx.url}/.well-known/ai-catalog.json`);
|
|
82
|
+
if (catalog.ok && /application\/a2a-agent-card\+json/.test(catalog.body)) {
|
|
83
|
+
return { found: true, reason: 'an A2A entry in the AI catalog' };
|
|
84
|
+
}
|
|
85
|
+
const mcp = await hasMcpSurface(ctx);
|
|
86
|
+
if (mcp.found)
|
|
87
|
+
return { found: true, reason: `an MCP surface (${mcp.reason})` };
|
|
88
|
+
const api = await hasApiSurface(ctx);
|
|
89
|
+
if (api.found)
|
|
90
|
+
return { found: true, reason: `an API surface (${api.reason})` };
|
|
91
|
+
return NOT_FOUND;
|
|
92
|
+
}
|
|
93
|
+
/** Does this site have documentation an agent could be taught to follow? */
|
|
94
|
+
export async function hasDocsSurface(ctx) {
|
|
95
|
+
if (forcedBy(profileFrom(ctx), 'docs'))
|
|
96
|
+
return { found: true, reason: '--profile docs' };
|
|
97
|
+
if (linksTo(ctx, /href\s*=\s*["'][^"']*\/(docs|documentation|guides?|reference|developers?)\b/i)) {
|
|
98
|
+
return { found: true, reason: 'navigation into a documentation area' };
|
|
99
|
+
}
|
|
100
|
+
for (const path of ['/llms.txt', '/openapi.json']) {
|
|
101
|
+
if (await exists(ctx, path))
|
|
102
|
+
return { found: true, reason: `a document at ${path}` };
|
|
103
|
+
}
|
|
104
|
+
return NOT_FOUND;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface.js","sourceRoot":"","sources":["../../src/checks/surface.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAiBpD,MAAM,SAAS,GAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAEhE,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,GAAiB;IAC3C,OAAO,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;AAC/B,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,OAAgB,EAAE,OAAgB;IACzD,OAAO,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,OAAO,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,GAAiB,EAAE,IAAY;IACnD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,8DAA8D;AAC9D,SAAS,OAAO,CAAC,GAAiB,EAAE,OAAe;IACjD,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAiB;IACnD,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAEvF,KAAK,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,eAAe,CAAC,EAAE,CAAC;QAC/G,IAAI,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,mCAAmC,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,EAAE,gEAAgE,CAAC,EAAE,CAAC;QACnF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC;IAC7E,CAAC;IACD,IAAI,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACnE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAiB;IACnD,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAEvF,KAAK,MAAM,IAAI,IAAI,CAAC,mCAAmC,EAAE,kBAAkB,EAAE,uBAAuB,CAAC,EAAE,CAAC;QACtG,IAAI,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,8BAA8B,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,EAAE,IAAI,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACnE,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,+BAA+B,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,wCAAwC,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAiB;IACrD,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAE3F,KAAK,MAAM,IAAI,IAAI,CAAC,8BAA8B,EAAE,yBAAyB,CAAC,EAAE,CAAC;QAC/E,IAAI,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,8BAA8B,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,EAAE,IAAI,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAEhF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAEhF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAiB;IACpD,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAEzF,IAAI,OAAO,CAAC,GAAG,EAAE,8EAA8E,CAAC,EAAE,CAAC;QACjG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,sCAAsC,EAAE,CAAC;IACzE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC;QAClD,IAAI,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tls-https.d.ts","sourceRoot":"","sources":["../../src/checks/tls-https.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAGjF;;;;;;;;GAQG;AACH,eAAO,MAAM,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"tls-https.d.ts","sourceRoot":"","sources":["../../src/checks/tls-https.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAGjF;;;;;;;;GAQG;AACH,eAAO,MAAM,IAAI,EAAE,SAIlB,CAAC;AAKF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAqI3E"}
|
package/dist/checks/tls-https.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tls-https.js","sourceRoot":"","sources":["../../src/checks/tls-https.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,IAAI,GAAc;IAC7B,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,2DAA2D;
|
|
1
|
+
{"version":3,"file":"tls-https.js","sourceRoot":"","sources":["../../src/checks/tls-https.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { CheckContext, CheckResult, CheckMeta } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* "usage-policy" — do your machine-readable usage signals agree with each other?
|
|
4
|
+
*
|
|
5
|
+
* A site can now state its AI usage terms in at least five places, written in
|
|
6
|
+
* vocabularies that mirror each other without matching:
|
|
7
|
+
*
|
|
8
|
+
* | Mechanism | Training | Grounding / RAG | Search |
|
|
9
|
+
* | --- | --- | --- | --- |
|
|
10
|
+
* | Content Signals (robots.txt) | `ai-train=yes\|no` | `ai-input=yes\|no` | `search=yes\|no` |
|
|
11
|
+
* | IETF AIPREF (robots.txt or header) | `train-ai=y\|n` | *(no category yet)* | `search=y\|n` |
|
|
12
|
+
* | RSL licence | `ai-train` | `ai-input` | `ai-index`, `search` |
|
|
13
|
+
* | TDMRep | `tdm-reservation: 0\|1` | — | — |
|
|
14
|
+
* | robots meta | `noai` | — | — |
|
|
15
|
+
*
|
|
16
|
+
* Nobody maintains five documents by hand without them drifting. This check
|
|
17
|
+
* normalises every signal onto three questions — may you train on it, may you
|
|
18
|
+
* ground an answer in it, may you index it — and reports where the answers
|
|
19
|
+
* disagree. A site whose robots.txt says `ai-train=no` while its RSL licence
|
|
20
|
+
* permits `ai-train` has published two contradictory legal positions, and which
|
|
21
|
+
* one a crawler honors is then a matter of which file it happened to read.
|
|
22
|
+
*
|
|
23
|
+
* On enforcement, the check is blunt: only robots.txt access rules are
|
|
24
|
+
* documented as honored by Google, OpenAI, Anthropic and Microsoft. Content
|
|
25
|
+
* Signals, AIPREF, RSL and TDMRep are declarations. Their weight is legal — the
|
|
26
|
+
* EU AI Act's opt-out provisions and the GPAI Code of Practice reference several
|
|
27
|
+
* of them — rather than technical, and reports say so rather than implying a
|
|
28
|
+
* crawler will obey.
|
|
29
|
+
*/
|
|
30
|
+
export declare const meta: CheckMeta;
|
|
31
|
+
/** The three questions every usage vocabulary answers, or declines to answer. */
|
|
32
|
+
export type Dimension = 'train' | 'ground' | 'index';
|
|
33
|
+
export type Stance = 'allow' | 'deny' | 'unstated';
|
|
34
|
+
export interface Declaration {
|
|
35
|
+
/** Human name of the mechanism and where it was found. */
|
|
36
|
+
source: string;
|
|
37
|
+
/** Whether the mechanism has any documented honorer among major AI operators. */
|
|
38
|
+
enforceable: boolean;
|
|
39
|
+
train: Stance;
|
|
40
|
+
ground: Stance;
|
|
41
|
+
index: Stance;
|
|
42
|
+
}
|
|
43
|
+
/** Read a Content-Signal value into a declaration. */
|
|
44
|
+
export declare function fromContentSignal(raw: string, source: string): Declaration;
|
|
45
|
+
/** Read an AIPREF Content-Usage value into a declaration. AIPREF has no grounding category yet. */
|
|
46
|
+
export declare function fromContentUsage(raw: string, source: string): Declaration;
|
|
47
|
+
/**
|
|
48
|
+
* Read RSL `permits` / `prohibits` usage tokens into a declaration.
|
|
49
|
+
* `all` and `ai-all` set several dimensions at once.
|
|
50
|
+
*/
|
|
51
|
+
export declare function fromRsl(document: string, source: string): Declaration;
|
|
52
|
+
export default function check(ctx: CheckContext): Promise<CheckResult>;
|
|
53
|
+
//# sourceMappingURL=usage-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-policy.d.ts","sourceRoot":"","sources":["../../src/checks/usage-policy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAQjF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,IAAI,EAAE,SAKlB,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAcD,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAc1E;AAED,mGAAmG;AACnG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAczE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAqCrE;AA6ID,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2C3E"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { RSL_MIME } from '../constants.js';
|
|
2
|
+
import { guideUrl } from '../guide-urls.js';
|
|
3
|
+
import { buildResult } from './utils.js';
|
|
4
|
+
import { findLinkTags, getAttribute, getMetaContent } from './html-utils.js';
|
|
5
|
+
import { parseLinkHeader } from './http-headers.js';
|
|
6
|
+
import { parseDictionary } from './structured-fields.js';
|
|
7
|
+
import { AIPREF_TOKENS, AIPREF_VALUES } from '../constants.js';
|
|
8
|
+
import { collectLicenses, parseContentSignalValue, parseContentUsageValue, parseRobotsTxt } from './robots-parser.js';
|
|
9
|
+
/**
|
|
10
|
+
* "usage-policy" — do your machine-readable usage signals agree with each other?
|
|
11
|
+
*
|
|
12
|
+
* A site can now state its AI usage terms in at least five places, written in
|
|
13
|
+
* vocabularies that mirror each other without matching:
|
|
14
|
+
*
|
|
15
|
+
* | Mechanism | Training | Grounding / RAG | Search |
|
|
16
|
+
* | --- | --- | --- | --- |
|
|
17
|
+
* | Content Signals (robots.txt) | `ai-train=yes\|no` | `ai-input=yes\|no` | `search=yes\|no` |
|
|
18
|
+
* | IETF AIPREF (robots.txt or header) | `train-ai=y\|n` | *(no category yet)* | `search=y\|n` |
|
|
19
|
+
* | RSL licence | `ai-train` | `ai-input` | `ai-index`, `search` |
|
|
20
|
+
* | TDMRep | `tdm-reservation: 0\|1` | — | — |
|
|
21
|
+
* | robots meta | `noai` | — | — |
|
|
22
|
+
*
|
|
23
|
+
* Nobody maintains five documents by hand without them drifting. This check
|
|
24
|
+
* normalises every signal onto three questions — may you train on it, may you
|
|
25
|
+
* ground an answer in it, may you index it — and reports where the answers
|
|
26
|
+
* disagree. A site whose robots.txt says `ai-train=no` while its RSL licence
|
|
27
|
+
* permits `ai-train` has published two contradictory legal positions, and which
|
|
28
|
+
* one a crawler honors is then a matter of which file it happened to read.
|
|
29
|
+
*
|
|
30
|
+
* On enforcement, the check is blunt: only robots.txt access rules are
|
|
31
|
+
* documented as honored by Google, OpenAI, Anthropic and Microsoft. Content
|
|
32
|
+
* Signals, AIPREF, RSL and TDMRep are declarations. Their weight is legal — the
|
|
33
|
+
* EU AI Act's opt-out provisions and the GPAI Code of Practice reference several
|
|
34
|
+
* of them — rather than technical, and reports say so rather than implying a
|
|
35
|
+
* crawler will obey.
|
|
36
|
+
*/
|
|
37
|
+
export const meta = {
|
|
38
|
+
id: 'usage-policy',
|
|
39
|
+
name: 'Usage Policy',
|
|
40
|
+
description: 'Checks machine-readable AI usage signals for coverage and internal consistency',
|
|
41
|
+
category: 'policy',
|
|
42
|
+
};
|
|
43
|
+
const DIMENSION_LABEL = {
|
|
44
|
+
train: 'training on your content',
|
|
45
|
+
ground: 'grounding an answer in your content',
|
|
46
|
+
index: 'indexing your content for search',
|
|
47
|
+
};
|
|
48
|
+
function yesNo(value) {
|
|
49
|
+
if (value === 'yes' || value === 'y')
|
|
50
|
+
return 'allow';
|
|
51
|
+
if (value === 'no' || value === 'n')
|
|
52
|
+
return 'deny';
|
|
53
|
+
return 'unstated';
|
|
54
|
+
}
|
|
55
|
+
/** Read a Content-Signal value into a declaration. */
|
|
56
|
+
export function fromContentSignal(raw, source) {
|
|
57
|
+
const pairs = new Map(parseContentSignalValue(raw).valid.map((p) => {
|
|
58
|
+
const [k, v] = p.split('=');
|
|
59
|
+
return [k, v];
|
|
60
|
+
}));
|
|
61
|
+
return {
|
|
62
|
+
source,
|
|
63
|
+
enforceable: false,
|
|
64
|
+
train: yesNo(pairs.get('ai-train')),
|
|
65
|
+
ground: yesNo(pairs.get('ai-input')),
|
|
66
|
+
index: yesNo(pairs.get('search')),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Read an AIPREF Content-Usage value into a declaration. AIPREF has no grounding category yet. */
|
|
70
|
+
export function fromContentUsage(raw, source) {
|
|
71
|
+
const pairs = new Map(parseContentUsageValue(raw).valid.map((p) => {
|
|
72
|
+
const [k, v] = p.split('=');
|
|
73
|
+
return [k, v];
|
|
74
|
+
}));
|
|
75
|
+
return {
|
|
76
|
+
source,
|
|
77
|
+
enforceable: false,
|
|
78
|
+
train: yesNo(pairs.get('train-ai')),
|
|
79
|
+
ground: 'unstated',
|
|
80
|
+
index: yesNo(pairs.get('search')),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read RSL `permits` / `prohibits` usage tokens into a declaration.
|
|
85
|
+
* `all` and `ai-all` set several dimensions at once.
|
|
86
|
+
*/
|
|
87
|
+
export function fromRsl(document, source) {
|
|
88
|
+
const decl = { source, enforceable: false, train: 'unstated', ground: 'unstated', index: 'unstated' };
|
|
89
|
+
const body = document.replace(/<!--[\s\S]*?-->/g, '');
|
|
90
|
+
for (const m of body.matchAll(/<(permits|prohibits)\b([^>]*)>([^<]*)</gi)) {
|
|
91
|
+
const stance = m[1].toLowerCase() === 'permits' ? 'allow' : 'deny';
|
|
92
|
+
const type = (getAttribute(m[2], 'type') ?? '').toLowerCase();
|
|
93
|
+
if (type !== 'usage')
|
|
94
|
+
continue;
|
|
95
|
+
for (const token of m[3].trim().toLowerCase().split(/\s+/).filter(Boolean)) {
|
|
96
|
+
switch (token) {
|
|
97
|
+
case 'ai-train':
|
|
98
|
+
decl.train = stance;
|
|
99
|
+
break;
|
|
100
|
+
case 'ai-input':
|
|
101
|
+
decl.ground = stance;
|
|
102
|
+
break;
|
|
103
|
+
case 'ai-index':
|
|
104
|
+
case 'search':
|
|
105
|
+
decl.index = stance;
|
|
106
|
+
break;
|
|
107
|
+
case 'ai-all':
|
|
108
|
+
decl.train = stance;
|
|
109
|
+
decl.ground = stance;
|
|
110
|
+
break;
|
|
111
|
+
case 'all':
|
|
112
|
+
decl.train = stance;
|
|
113
|
+
decl.ground = stance;
|
|
114
|
+
decl.index = stance;
|
|
115
|
+
break;
|
|
116
|
+
default:
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return decl;
|
|
122
|
+
}
|
|
123
|
+
/** Collect every usage declaration a site publishes. */
|
|
124
|
+
async function collect(ctx) {
|
|
125
|
+
const declarations = [];
|
|
126
|
+
const notes = [];
|
|
127
|
+
/* robots.txt: Content-Signal and Content-Usage, per group. */
|
|
128
|
+
const robotsRes = await ctx.fetch(`${ctx.url}/robots.txt`);
|
|
129
|
+
const robots = robotsRes.ok ? parseRobotsTxt(robotsRes.body) : null;
|
|
130
|
+
if (robots !== null) {
|
|
131
|
+
for (const group of robots.groups) {
|
|
132
|
+
const scope = group.userAgents.join(', ');
|
|
133
|
+
for (const raw of group.contentSignals) {
|
|
134
|
+
declarations.push(fromContentSignal(raw, `robots.txt Content-Signal (User-agent: ${scope})`));
|
|
135
|
+
}
|
|
136
|
+
for (const raw of group.contentUsage) {
|
|
137
|
+
declarations.push(fromContentUsage(raw, `robots.txt Content-Usage (User-agent: ${scope})`));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/* HTTP headers: the Content-Usage response header, and Cloudflare's content-signal. */
|
|
142
|
+
const headers = ctx.headers ?? {};
|
|
143
|
+
if (headers['content-usage'] !== undefined) {
|
|
144
|
+
declarations.push(fromContentUsage(headers['content-usage'], 'Content-Usage response header'));
|
|
145
|
+
const dict = parseDictionary(headers['content-usage']);
|
|
146
|
+
const bad = dict.members.filter((m) => !AIPREF_TOKENS.includes(m.key) || !AIPREF_VALUES.includes(m.value.toLowerCase()));
|
|
147
|
+
if (bad.length > 0) {
|
|
148
|
+
notes.push({
|
|
149
|
+
status: 'warn',
|
|
150
|
+
message: 'Content-Usage response header uses tokens outside the AIPREF vocabulary',
|
|
151
|
+
detail: bad.map((m) => m.raw).join(', '),
|
|
152
|
+
hint: 'The header takes a Structured Fields dictionary over train-ai and search with y/n values.',
|
|
153
|
+
learnMoreUrl: guideUrl(meta.id, 'header-vocabulary'),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (headers['content-signal'] !== undefined) {
|
|
158
|
+
declarations.push(fromContentSignal(headers['content-signal'], 'content-signal response header'));
|
|
159
|
+
}
|
|
160
|
+
/* RSL licence, discovered the same three ways the rsl check uses. */
|
|
161
|
+
const licenceUrl = findLicenceUrl(ctx, robots === null ? [] : collectLicenses(robots));
|
|
162
|
+
if (licenceUrl !== null) {
|
|
163
|
+
const doc = await ctx.fetch(licenceUrl);
|
|
164
|
+
if (doc.ok && /<rsl[\s>]/i.test(doc.body)) {
|
|
165
|
+
declarations.push(fromRsl(doc.body, `RSL licence (${licenceUrl})`));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/* TDMRep: reservation is specifically about text-and-data-mining, i.e. training. */
|
|
169
|
+
const tdm = await readTdmRep(ctx);
|
|
170
|
+
if (tdm !== null)
|
|
171
|
+
declarations.push(tdm);
|
|
172
|
+
/* robots meta noai: a declared preference with no committed honorer. */
|
|
173
|
+
const robotsMeta = (getMetaContent(ctx.html ?? '', 'robots') ?? '').toLowerCase();
|
|
174
|
+
if (/\bnoai\b/.test(robotsMeta)) {
|
|
175
|
+
declarations.push({
|
|
176
|
+
source: '<meta name="robots" content="noai">',
|
|
177
|
+
enforceable: false,
|
|
178
|
+
train: 'deny',
|
|
179
|
+
ground: 'unstated',
|
|
180
|
+
index: 'unstated',
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return { declarations, notes };
|
|
184
|
+
}
|
|
185
|
+
/** Resolve the first RSL licence URL from robots.txt, the Link header, or an HTML link. */
|
|
186
|
+
function findLicenceUrl(ctx, robotsLicences) {
|
|
187
|
+
const candidates = [...robotsLicences];
|
|
188
|
+
for (const entry of parseLinkHeader(ctx.headers?.['link'] ?? '')) {
|
|
189
|
+
if (entry.params['rel'] === 'license' && (entry.params['type'] ?? '').includes(RSL_MIME)) {
|
|
190
|
+
candidates.push(entry.url);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
for (const tag of findLinkTags(ctx.html ?? '', 'license')) {
|
|
194
|
+
const type = (getAttribute(tag, 'type') ?? '').toLowerCase();
|
|
195
|
+
const href = getAttribute(tag, 'href');
|
|
196
|
+
if (type.includes(RSL_MIME) && href !== null)
|
|
197
|
+
candidates.push(href);
|
|
198
|
+
}
|
|
199
|
+
if (candidates.length === 0)
|
|
200
|
+
return null;
|
|
201
|
+
try {
|
|
202
|
+
return new URL(candidates[0], `${ctx.url}/`).toString();
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** Read a TDM reservation from headers, meta tags, or the well-known file (precedence: meta > header > file). */
|
|
209
|
+
async function readTdmRep(ctx) {
|
|
210
|
+
const metaValue = getMetaContent(ctx.html ?? '', 'tdm-reservation');
|
|
211
|
+
if (metaValue !== null) {
|
|
212
|
+
return {
|
|
213
|
+
source: '<meta name="tdm-reservation">',
|
|
214
|
+
enforceable: false,
|
|
215
|
+
train: metaValue.trim() === '1' ? 'deny' : 'allow',
|
|
216
|
+
ground: 'unstated',
|
|
217
|
+
index: 'unstated',
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const header = ctx.headers?.['tdm-reservation'];
|
|
221
|
+
if (header !== undefined) {
|
|
222
|
+
return {
|
|
223
|
+
source: 'tdm-reservation response header',
|
|
224
|
+
enforceable: false,
|
|
225
|
+
train: header.trim() === '1' ? 'deny' : 'allow',
|
|
226
|
+
ground: 'unstated',
|
|
227
|
+
index: 'unstated',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const res = await ctx.fetch(`${ctx.url}/.well-known/tdmrep.json`);
|
|
231
|
+
if (!res.ok)
|
|
232
|
+
return null;
|
|
233
|
+
try {
|
|
234
|
+
const data = JSON.parse(res.body);
|
|
235
|
+
if (!Array.isArray(data) || data.length === 0)
|
|
236
|
+
return null;
|
|
237
|
+
// The entry covering the site root governs the audited page.
|
|
238
|
+
const root = data.find((e) => e?.location === '/' || e?.location === '') ?? data[0];
|
|
239
|
+
const reserved = Number(root?.['tdm-reservation']);
|
|
240
|
+
if (reserved !== 0 && reserved !== 1)
|
|
241
|
+
return null;
|
|
242
|
+
return {
|
|
243
|
+
source: '/.well-known/tdmrep.json',
|
|
244
|
+
enforceable: false,
|
|
245
|
+
train: reserved === 1 ? 'deny' : 'allow',
|
|
246
|
+
ground: 'unstated',
|
|
247
|
+
index: 'unstated',
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export default async function check(ctx) {
|
|
255
|
+
const start = performance.now();
|
|
256
|
+
const findings = [];
|
|
257
|
+
let score = 100;
|
|
258
|
+
const { declarations, notes } = await collect(ctx);
|
|
259
|
+
findings.push(...notes);
|
|
260
|
+
if (declarations.length === 0) {
|
|
261
|
+
findings.push({
|
|
262
|
+
status: 'warn',
|
|
263
|
+
message: 'No machine-readable usage policy declared',
|
|
264
|
+
detail: 'Checked robots.txt Content-Signal and Content-Usage, the Content-Usage and content-signal response headers, ' +
|
|
265
|
+
'an RSL licence, TDMRep, and the noai meta directive.',
|
|
266
|
+
hint: 'State your terms where they can be read without a lawyer. The lowest-effort option is a Content-Signal line ' +
|
|
267
|
+
'in robots.txt: Content-Signal: search=yes, ai-input=yes, ai-train=no. Absence is neutral, not permission — ' +
|
|
268
|
+
'but it also gives you nothing to point at.',
|
|
269
|
+
learnMoreUrl: guideUrl(meta.id, 'no-policy'),
|
|
270
|
+
});
|
|
271
|
+
return buildResult(meta, 40, findings, start);
|
|
272
|
+
}
|
|
273
|
+
findings.push({
|
|
274
|
+
status: 'pass',
|
|
275
|
+
message: `${declarations.length} usage declaration(s) found`,
|
|
276
|
+
detail: declarations.map((d) => d.source).join('\n'),
|
|
277
|
+
});
|
|
278
|
+
score = reportConsistency(declarations, findings, score);
|
|
279
|
+
reportCoverage(declarations, findings);
|
|
280
|
+
findings.push({
|
|
281
|
+
status: 'pass',
|
|
282
|
+
message: 'Enforcement note: only robots.txt access rules are documented as honored by major AI operators',
|
|
283
|
+
detail: 'Content Signals, AIPREF, RSL and TDMRep are declarations. Their weight is legal — the EU AI Act opt-out ' +
|
|
284
|
+
'provisions and the GPAI Code of Practice reference several of them — rather than technical. Pair any of them ' +
|
|
285
|
+
'with robots.txt rules if the intent is to be enforced.',
|
|
286
|
+
});
|
|
287
|
+
return buildResult(meta, score, findings, start);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Report where two declarations answer the same question differently. This is
|
|
291
|
+
* the finding this check exists for: contradictory published positions mean the
|
|
292
|
+
* terms a crawler honors depend on which file it happened to read.
|
|
293
|
+
*/
|
|
294
|
+
function reportConsistency(declarations, findings, score) {
|
|
295
|
+
let conflicts = 0;
|
|
296
|
+
for (const dimension of ['train', 'ground', 'index']) {
|
|
297
|
+
const allow = declarations.filter((d) => d[dimension] === 'allow');
|
|
298
|
+
const deny = declarations.filter((d) => d[dimension] === 'deny');
|
|
299
|
+
if (allow.length > 0 && deny.length > 0) {
|
|
300
|
+
conflicts++;
|
|
301
|
+
findings.push({
|
|
302
|
+
status: 'fail',
|
|
303
|
+
message: `Your signals disagree about ${DIMENSION_LABEL[dimension]}`,
|
|
304
|
+
detail: [
|
|
305
|
+
`Permitted by: ${allow.map((d) => d.source).join('; ')}`,
|
|
306
|
+
`Denied by: ${deny.map((d) => d.source).join('; ')}`,
|
|
307
|
+
].join('\n'),
|
|
308
|
+
hint: 'Two of your published documents state opposite terms, so which one applies depends on which file a crawler ' +
|
|
309
|
+
'reads. Pick the position you mean and make every mechanism say it.',
|
|
310
|
+
learnMoreUrl: guideUrl(meta.id, 'contradiction'),
|
|
311
|
+
});
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (allow.length + deny.length > 0) {
|
|
315
|
+
const stance = allow.length > 0 ? 'permitted' : 'denied';
|
|
316
|
+
findings.push({
|
|
317
|
+
status: 'pass',
|
|
318
|
+
message: `Consistent across ${allow.length + deny.length} declaration(s): ${DIMENSION_LABEL[dimension]} is ${stance}`,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return score - conflicts * 25;
|
|
323
|
+
}
|
|
324
|
+
/** Note the dimensions no declaration answers, and the vocabularies that cannot answer them. */
|
|
325
|
+
function reportCoverage(declarations, findings) {
|
|
326
|
+
const unstated = ['train', 'ground', 'index'].filter((d) => declarations.every((decl) => decl[d] === 'unstated'));
|
|
327
|
+
if (unstated.length === 0)
|
|
328
|
+
return;
|
|
329
|
+
findings.push({
|
|
330
|
+
status: 'warn',
|
|
331
|
+
message: `No declaration covers ${unstated.map((d) => DIMENSION_LABEL[d]).join(' or ')}`,
|
|
332
|
+
detail: unstated.includes('ground') && declarations.every((d) => !d.source.includes('Content-Signal'))
|
|
333
|
+
? 'Grounding is the dimension that decides whether an assistant may quote you in an answer. AIPREF has no category for it yet; Content Signals ai-input and RSL ai-input do.'
|
|
334
|
+
: undefined,
|
|
335
|
+
hint: 'An unstated dimension is "unknown", never "allowed". State it explicitly if you have a position on it.',
|
|
336
|
+
learnMoreUrl: guideUrl(meta.id, 'coverage'),
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=usage-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-policy.js","sourceRoot":"","sources":["../../src/checks/usage-policy.ts"],"names":[],"mappings":"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"}
|
package/dist/checks/utils.d.ts
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import type { CheckMeta, CheckResult, FetchResponse, Finding } from '../types.js';
|
|
2
2
|
export declare function clampScore(score: number): number;
|
|
3
|
-
export declare function buildResult(meta: CheckMeta, score: number, findings: Finding[], start: number
|
|
3
|
+
export declare function buildResult(meta: CheckMeta, score: number, findings: Finding[], start: number, options?: {
|
|
4
|
+
applicable?: boolean;
|
|
5
|
+
}): CheckResult;
|
|
6
|
+
/**
|
|
7
|
+
* Result for a check whose subject the site does not have: no API to describe,
|
|
8
|
+
* no commerce surface, no MCP server. Reported as N/A and excluded from the
|
|
9
|
+
* score rather than counted as a failure.
|
|
10
|
+
*/
|
|
11
|
+
export declare function notApplicable(meta: CheckMeta, findings: Finding[], start: number): CheckResult;
|
|
12
|
+
/**
|
|
13
|
+
* Whether a response body is a web page rather than the machine-readable
|
|
14
|
+
* document that was asked for.
|
|
15
|
+
*
|
|
16
|
+
* Single-page applications answer every unmatched path with their index shell,
|
|
17
|
+
* status 200. Probing `/.well-known/agent-card.json` or `/mcp/server-card` on
|
|
18
|
+
* such a site returns HTML, and a check that trusts the status code reports a
|
|
19
|
+
* *malformed* document where the honest answer is that the document is absent.
|
|
20
|
+
* That mistake is worse than a miss: it sends an operator hunting for a bug in
|
|
21
|
+
* a file they never wrote.
|
|
22
|
+
*
|
|
23
|
+
* Detection is deliberately narrow — a doctype or an `<html>` tag near the top
|
|
24
|
+
* of the body. Anything else is handed to the real parser, which reports its own
|
|
25
|
+
* problems precisely.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isHtmlDocument(body: string): boolean;
|
|
4
28
|
/**
|
|
5
29
|
* Validate the `Content-Type` of a fetched resource against a list of acceptable MIME types.
|
|
6
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/checks/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/checks/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAElF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,WAAW,CAab;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAE9F;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClE,OAAO,GAAG,IAAI,CAkBhB"}
|