@actuate-media/cms-core 0.69.0 → 0.71.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 (46) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/__tests__/api/ai-crawlers.test.d.ts +2 -0
  3. package/dist/__tests__/api/ai-crawlers.test.d.ts.map +1 -0
  4. package/dist/__tests__/api/ai-crawlers.test.js +194 -0
  5. package/dist/__tests__/api/ai-crawlers.test.js.map +1 -0
  6. package/dist/__tests__/api/md-route.test.d.ts +2 -0
  7. package/dist/__tests__/api/md-route.test.d.ts.map +1 -0
  8. package/dist/__tests__/api/md-route.test.js +106 -0
  9. package/dist/__tests__/api/md-route.test.js.map +1 -0
  10. package/dist/__tests__/api/route-contracts.test.js +4 -0
  11. package/dist/__tests__/api/route-contracts.test.js.map +1 -1
  12. package/dist/__tests__/seo/ai-bots.test.js +40 -1
  13. package/dist/__tests__/seo/ai-bots.test.js.map +1 -1
  14. package/dist/__tests__/seo/resolve-path.test.d.ts +2 -0
  15. package/dist/__tests__/seo/resolve-path.test.d.ts.map +1 -0
  16. package/dist/__tests__/seo/resolve-path.test.js +46 -0
  17. package/dist/__tests__/seo/resolve-path.test.js.map +1 -0
  18. package/dist/api/routes/seo.d.ts.map +1 -1
  19. package/dist/api/routes/seo.js +147 -1
  20. package/dist/api/routes/seo.js.map +1 -1
  21. package/dist/api/routes/url-resolution.d.ts.map +1 -1
  22. package/dist/api/routes/url-resolution.js +6 -42
  23. package/dist/api/routes/url-resolution.js.map +1 -1
  24. package/dist/config/types.d.ts +8 -0
  25. package/dist/config/types.d.ts.map +1 -1
  26. package/dist/db/model-types.d.ts +10 -0
  27. package/dist/db/model-types.d.ts.map +1 -1
  28. package/dist/seo/ai-bots.d.ts +14 -0
  29. package/dist/seo/ai-bots.d.ts.map +1 -1
  30. package/dist/seo/ai-bots.js +21 -0
  31. package/dist/seo/ai-bots.js.map +1 -1
  32. package/dist/seo/ai-crawler-log.d.ts +14 -0
  33. package/dist/seo/ai-crawler-log.d.ts.map +1 -0
  34. package/dist/seo/ai-crawler-log.js +48 -0
  35. package/dist/seo/ai-crawler-log.js.map +1 -0
  36. package/dist/seo/index.d.ts +6 -2
  37. package/dist/seo/index.d.ts.map +1 -1
  38. package/dist/seo/index.js +3 -1
  39. package/dist/seo/index.js.map +1 -1
  40. package/dist/seo/resolve-path.d.ts +22 -0
  41. package/dist/seo/resolve-path.d.ts.map +1 -0
  42. package/dist/seo/resolve-path.js +53 -0
  43. package/dist/seo/resolve-path.js.map +1 -0
  44. package/package.json +1 -1
  45. package/prisma/migrations/0003_ai_crawler_hits/migration.sql +21 -0
  46. package/prisma/schema.prisma +19 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @actuate-media/cms-core
2
2
 
3
+ ## 0.71.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9f5e5dc: Add the AI crawler activity panel (llms.txt measurement layer):
8
+ - **`cms-core`** — new `AiCrawlerHit` model (`actuate_ai_crawler_hits`) + migration, aggregated per `(bot, surface)` so storage stays bounded. `detectAiBot()` classifies known AI user-agents (training vs retrieval) from the existing taxonomy; `llms.txt`, `llms-full.txt`, and `.md` requests from a known crawler are recorded best-effort. New `GET /ai-crawlers` (admin) returns aggregated activity, and an opt-in honeypot (`seo.llms.honeypot`) appends a trap link to `llms.txt` served by `GET /ai-crawlers/trap`.
9
+ - **`cms-admin`** — new "AI crawler activity" panel under SEO → Technical showing per-bot hits, type, surface, and last-seen, plus totals. Frames the numbers honestly (visibility, not a traffic channel).
10
+ - **`create-actuate-cms`** — scaffolded Prisma assets include the new migration so fresh projects get crawler tracking out of the box.
11
+
12
+ Recording is always best-effort and gracefully no-ops on databases that predate the model.
13
+
14
+ ## 0.70.0
15
+
16
+ ### Minor Changes
17
+
18
+ - 0bcc567: Add per-page Markdown for the AI/agent layer:
19
+ - **`GET /md?path=…`** (`@actuate-media/cms-core`) — returns a clean Markdown rendering of a single published page via `documentToMarkdown()`. Served with `X-Robots-Tag: noindex`; noindexed and `llmsInclude: NEVER` documents return `404` (the selection filter is the privacy boundary).
20
+ - **Clean `/{path}.md` URLs** — `create-actuate-cms` middleware rewrites `/{path}.md` → `/api/cms/md`, so any page is fetchable as Markdown by appending `.md` (e.g. `/about.md`). The HTML page stays canonical and `.md` URLs are never in the sitemap.
21
+ - **Shared path resolver** — extracted `matchPathToCollection()` so `/md` and `/resolve` agree on which document a public URL maps to (no logic drift).
22
+
3
23
  ## 0.69.0
4
24
 
5
25
  ### Minor Changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-crawlers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-crawlers.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/api/ai-crawlers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,194 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { handleActuateAPI } from '../../api/index.js';
3
+ import { createSession } from '../../auth/session.js';
4
+ import { initDB } from '../../db.js';
5
+ import { recordAiCrawlerHit } from '../../seo/ai-crawler-log.js';
6
+ /**
7
+ * AI-crawler activity layer:
8
+ * - GET /ai-crawlers/trap (honeypot) records a hit and serves 200 + noindex
9
+ * - GET /llms.txt records a hit when fetched by a known AI user-agent
10
+ * - GET /llms.txt appends the honeypot link only when opted in
11
+ * - GET /ai-crawlers is admin-only and returns aggregated totals
12
+ * - recordAiCrawlerHit no-ops on databases without the model
13
+ */
14
+ const SECRET = 'ai-crawler-suite-secret-0123456789abcdef';
15
+ const GPTBOT_UA = 'Mozilla/5.0 (compatible; GPTBot/1.1; +https://openai.com/gptbot)';
16
+ function createMockDB(opts = {}) {
17
+ const upserts = [];
18
+ const db = {
19
+ document: {
20
+ findMany: async () => [],
21
+ findFirst: async () => null,
22
+ count: async () => 0,
23
+ },
24
+ user: {},
25
+ session: {},
26
+ media: {},
27
+ auditLog: { create: async () => ({}) },
28
+ };
29
+ if (opts.hasCrawlerModel !== false) {
30
+ db.aiCrawlerHit = {
31
+ upsert: async (args) => {
32
+ upserts.push(args);
33
+ return { id: 'x' };
34
+ },
35
+ findMany: async () => opts.rows ?? [],
36
+ };
37
+ }
38
+ db.__upserts = upserts;
39
+ return db;
40
+ }
41
+ function makeHandler(db, llms = {}) {
42
+ initDB(db);
43
+ return handleActuateAPI({
44
+ prismaClient: db,
45
+ config: {
46
+ seo: { siteName: 'Acme', siteUrl: 'https://example.com', llms },
47
+ collections: {
48
+ pages: {
49
+ slug: 'pages',
50
+ type: 'page',
51
+ labels: { singular: 'Page', plural: 'Pages' },
52
+ fields: {},
53
+ },
54
+ },
55
+ },
56
+ });
57
+ }
58
+ async function adminCookie() {
59
+ const token = await createSession({ userId: 'admin-1', role: 'ADMIN', sessionId: 'sess-1' }, { secret: SECRET });
60
+ return `actuate_session=${token}`;
61
+ }
62
+ describe('GET /ai-crawlers/trap (honeypot)', () => {
63
+ beforeEach(() => {
64
+ delete globalThis.__actuateConfig;
65
+ process.env.CMS_SECRET = SECRET;
66
+ });
67
+ it('records a honeypot hit attributed to the detected bot, served noindex', async () => {
68
+ const db = createMockDB();
69
+ const handler = makeHandler(db);
70
+ const res = await handler(new Request('https://example.com/api/cms/ai-crawlers/trap', {
71
+ headers: { 'user-agent': GPTBOT_UA },
72
+ }));
73
+ expect(res.status).toBe(200);
74
+ expect(res.headers.get('x-robots-tag')).toBe('noindex');
75
+ expect(db.__upserts).toHaveLength(1);
76
+ expect(db.__upserts[0].where).toEqual({ bot_surface: { bot: 'GPTBot', surface: 'honeypot' } });
77
+ expect(db.__upserts[0].create).toMatchObject({
78
+ bot: 'GPTBot',
79
+ surface: 'honeypot',
80
+ category: 'training',
81
+ });
82
+ });
83
+ it('attributes an unknown user-agent to "unknown"', async () => {
84
+ const db = createMockDB();
85
+ const handler = makeHandler(db);
86
+ const res = await handler(new Request('https://example.com/api/cms/ai-crawlers/trap'));
87
+ expect(res.status).toBe(200);
88
+ expect(db.__upserts[0].create).toMatchObject({ bot: 'unknown', surface: 'honeypot' });
89
+ });
90
+ });
91
+ describe('GET /llms.txt crawler recording + honeypot link', () => {
92
+ beforeEach(() => {
93
+ delete globalThis.__actuateConfig;
94
+ process.env.CMS_SECRET = SECRET;
95
+ });
96
+ it('records a hit on the "llms" surface for a known AI user-agent', async () => {
97
+ const db = createMockDB();
98
+ const handler = makeHandler(db);
99
+ const res = await handler(new Request('https://example.com/api/cms/llms.txt', {
100
+ headers: { 'user-agent': GPTBOT_UA },
101
+ }));
102
+ expect(res.status).toBe(200);
103
+ expect(db.__upserts.some((u) => u.where.bot_surface?.surface === 'llms')).toBe(true);
104
+ });
105
+ it('does not record for a human user-agent', async () => {
106
+ const db = createMockDB();
107
+ const handler = makeHandler(db);
108
+ await handler(new Request('https://example.com/api/cms/llms.txt', {
109
+ headers: { 'user-agent': 'Mozilla/5.0 Chrome/120 Safari' },
110
+ }));
111
+ expect(db.__upserts).toHaveLength(0);
112
+ });
113
+ it('appends the honeypot link only when seo.llms.honeypot is enabled', async () => {
114
+ const withTrap = makeHandler(createMockDB(), { honeypot: true });
115
+ const onRes = await withTrap(new Request('https://example.com/api/cms/llms.txt'));
116
+ const onText = await onRes.text();
117
+ expect(onText).toContain('/api/cms/ai-crawlers/trap');
118
+ delete globalThis.__actuateConfig;
119
+ const withoutTrap = makeHandler(createMockDB());
120
+ const offRes = await withoutTrap(new Request('https://example.com/api/cms/llms.txt'));
121
+ const offText = await offRes.text();
122
+ expect(offText).not.toContain('/api/cms/ai-crawlers/trap');
123
+ });
124
+ });
125
+ describe('GET /ai-crawlers (admin panel data)', () => {
126
+ beforeEach(() => {
127
+ delete globalThis.__actuateConfig;
128
+ process.env.CMS_SECRET = SECRET;
129
+ });
130
+ it('401s for an unauthenticated request', async () => {
131
+ const handler = makeHandler(createMockDB());
132
+ const res = await handler(new Request('https://example.com/api/cms/ai-crawlers'));
133
+ expect(res.status).toBe(401);
134
+ });
135
+ it('returns aggregated totals for an authenticated admin', async () => {
136
+ const rows = [
137
+ {
138
+ bot: 'GPTBot',
139
+ surface: 'llms',
140
+ category: 'training',
141
+ hits: 5,
142
+ firstSeenAt: new Date(),
143
+ lastSeenAt: new Date(),
144
+ },
145
+ {
146
+ bot: 'PerplexityBot',
147
+ surface: 'md',
148
+ category: 'retrieval',
149
+ hits: 3,
150
+ firstSeenAt: new Date(),
151
+ lastSeenAt: new Date(),
152
+ },
153
+ {
154
+ bot: 'unknown',
155
+ surface: 'honeypot',
156
+ category: 'other',
157
+ hits: 2,
158
+ firstSeenAt: new Date(),
159
+ lastSeenAt: new Date(),
160
+ },
161
+ ];
162
+ const handler = makeHandler(createMockDB({ rows }));
163
+ const res = await handler(new Request('https://example.com/api/cms/ai-crawlers', {
164
+ headers: { cookie: await adminCookie() },
165
+ }));
166
+ expect(res.status).toBe(200);
167
+ const body = (await res.json());
168
+ expect(body.data.enabled).toBe(true);
169
+ expect(body.data.rows).toHaveLength(3);
170
+ expect(body.data.totals).toEqual({ hits: 10, bots: 3, honeypot: 2 });
171
+ });
172
+ it('reports enabled:false when the database predates the model', async () => {
173
+ const handler = makeHandler(createMockDB({ hasCrawlerModel: false }));
174
+ const res = await handler(new Request('https://example.com/api/cms/ai-crawlers', {
175
+ headers: { cookie: await adminCookie() },
176
+ }));
177
+ expect(res.status).toBe(200);
178
+ const body = (await res.json());
179
+ expect(body.data.enabled).toBe(false);
180
+ });
181
+ });
182
+ describe('recordAiCrawlerHit', () => {
183
+ it('no-ops when the model is absent', async () => {
184
+ const db = createMockDB({ hasCrawlerModel: false });
185
+ await expect(recordAiCrawlerHit(db, { bot: 'GPTBot', surface: 'llms', category: 'training' })).resolves.toBeUndefined();
186
+ });
187
+ it('upserts on the (bot, surface) compound key', async () => {
188
+ const db = createMockDB();
189
+ await recordAiCrawlerHit(db, { bot: 'CCBot', surface: 'md', category: 'training' });
190
+ expect(db.__upserts[0].where).toEqual({ bot_surface: { bot: 'CCBot', surface: 'md' } });
191
+ expect(db.__upserts[0].update.hits).toEqual({ increment: 1 });
192
+ });
193
+ });
194
+ //# sourceMappingURL=ai-crawlers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-crawlers.test.js","sourceRoot":"","sources":["../../../src/__tests__/api/ai-crawlers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=md-route.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-route.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/api/md-route.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { handleActuateAPI } from '../../api/index.js';
3
+ import { initDB } from '../../db.js';
4
+ function createMockDB(docs) {
5
+ const findFirst = async (args) => {
6
+ const w = args?.where ?? {};
7
+ const found = docs.find((d) => {
8
+ if (w.collection && d.collection !== w.collection)
9
+ return false;
10
+ if (w.status && d.status !== w.status)
11
+ return false;
12
+ if (w.deletedAt === null && d.deletedAt !== null)
13
+ return false;
14
+ if (Array.isArray(w.OR)) {
15
+ const ok = w.OR.some((cond) => {
16
+ if (typeof cond.slug === 'string')
17
+ return d.slug === cond.slug;
18
+ if (cond.data && 'equals' in cond.data) {
19
+ return d.data?.slug === cond.data.equals;
20
+ }
21
+ return false;
22
+ });
23
+ if (!ok)
24
+ return false;
25
+ }
26
+ return true;
27
+ });
28
+ return found ?? null;
29
+ };
30
+ return {
31
+ document: { findFirst, findMany: async () => [], count: async () => 0 },
32
+ user: {},
33
+ session: {},
34
+ media: {},
35
+ };
36
+ }
37
+ const PAGE = {
38
+ title: 'About Us',
39
+ slug: 'about',
40
+ collection: 'pages',
41
+ status: 'PUBLISHED',
42
+ deletedAt: null,
43
+ data: { body: '<h2>Who we are</h2><p>We build software.</p>' },
44
+ plainText: 'Who we are We build software.',
45
+ };
46
+ function makeHandler(docs, llms = {}) {
47
+ initDB(createMockDB(docs));
48
+ return handleActuateAPI({
49
+ prismaClient: createMockDB(docs),
50
+ config: {
51
+ seo: { siteUrl: 'https://example.com', llms },
52
+ collections: {
53
+ pages: {
54
+ slug: 'pages',
55
+ type: 'page',
56
+ labels: { singular: 'Page', plural: 'Pages' },
57
+ fields: {},
58
+ },
59
+ },
60
+ },
61
+ });
62
+ }
63
+ describe('GET /md', () => {
64
+ beforeEach(() => {
65
+ delete globalThis.__actuateConfig;
66
+ });
67
+ it('400s without a path', async () => {
68
+ const handler = makeHandler([PAGE]);
69
+ const res = await handler(new Request('https://example.com/api/cms/md'));
70
+ expect(res.status).toBe(400);
71
+ });
72
+ it('renders published page content as Markdown with a noindex header', async () => {
73
+ const handler = makeHandler([PAGE]);
74
+ const res = await handler(new Request('https://example.com/api/cms/md?path=/about'));
75
+ expect(res.status).toBe(200);
76
+ expect(res.headers.get('content-type')).toContain('text/markdown');
77
+ expect(res.headers.get('x-robots-tag')).toBe('noindex');
78
+ const text = await res.text();
79
+ expect(text).toContain('# About Us');
80
+ expect(text).toContain('## Who we are');
81
+ expect(text).toContain('We build software.');
82
+ });
83
+ it('404s for an unknown path', async () => {
84
+ const handler = makeHandler([PAGE]);
85
+ const res = await handler(new Request('https://example.com/api/cms/md?path=/missing'));
86
+ expect(res.status).toBe(404);
87
+ });
88
+ it('404s for a noindexed document', async () => {
89
+ const hidden = { ...PAGE, data: { ...PAGE.data, noindex: true } };
90
+ const handler = makeHandler([hidden]);
91
+ const res = await handler(new Request('https://example.com/api/cms/md?path=/about'));
92
+ expect(res.status).toBe(404);
93
+ });
94
+ it('404s for an llmsInclude NEVER document', async () => {
95
+ const excluded = { ...PAGE, data: { ...PAGE.data, llmsInclude: 'NEVER' } };
96
+ const handler = makeHandler([excluded]);
97
+ const res = await handler(new Request('https://example.com/api/cms/md?path=/about'));
98
+ expect(res.status).toBe(404);
99
+ });
100
+ it('404s when the llms layer is disabled', async () => {
101
+ const handler = makeHandler([PAGE], { disabled: true });
102
+ const res = await handler(new Request('https://example.com/api/cms/md?path=/about'));
103
+ expect(res.status).toBe(404);
104
+ });
105
+ });
106
+ //# sourceMappingURL=md-route.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-route.test.js","sourceRoot":"","sources":["../../../src/__tests__/api/md-route.test.ts"],"names":[],"mappings":"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"}
@@ -260,6 +260,9 @@ const ROUTE_CONTRACT = [
260
260
  ['GET /seo/internal-links/:documentId', 401],
261
261
  ['GET /llms.txt', 200],
262
262
  ['GET /llms-full.txt', 404],
263
+ ['GET /md', 400],
264
+ ['GET /ai-crawlers/trap', 200],
265
+ ['GET /ai-crawlers', 401],
263
266
  ['GET /sitemap.xml', 200],
264
267
  ['GET /sitemaps/:slug', 404],
265
268
  ['GET /feed.xml', 200],
@@ -399,6 +402,7 @@ const ANONYMOUS_SURFACE = [
399
402
  ['POST /redirects/record-hit', 'public-site middleware logs redirect hits'],
400
403
  ['POST /redirects/record-404', 'public-site frontend logs broken links'],
401
404
  ['GET /llms.txt', 'public SEO artifact'],
405
+ ['GET /ai-crawlers/trap', 'honeypot — records AI-crawler hits, served to anyone'],
402
406
  ['GET /sitemap.xml', 'public SEO artifact'],
403
407
  ['GET /feed.xml', 'public content feed'],
404
408
  ['GET /feed.json', 'public content feed'],
@@ -1 +1 @@
1
- {"version":3,"file":"route-contracts.test.js","sourceRoot":"","sources":["../../../src/__tests__/api/route-contracts.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,yEAAyE;AAEzE;;;;GAIG;AACH,SAAS,gBAAgB;IACvB,MAAM,QAAQ,GAAG;QACf,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QAC5B,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QAC3B,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACxB,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACpB,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACvB,MAAM,EAAE,KAAK,EAAE,CAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAI,CAAC,EAAE,IAAe,EAAE,CAAC;QAC9E,MAAM,EAAE,KAAK,EAAE,CAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAI,CAAC,EAAE,IAAe,EAAE,CAAC;QAC9E,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;QACjC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;QACjC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;KACvC,CAAA;IACD,MAAM,IAAI,GAAG;QACX,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAClC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,YAAY,EAAE,KAAK,EAAE,EAAW,EAAE,EAAE,CAClC,OAAO,EAAE,KAAK,UAAU;YACtB,CAAC,CAAE,EAA+B,CAAC,gBAAgB,EAAE,CAAC;YACtD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAwB,CAAC;KAC5C,CAAA;IACD,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE;QACrB,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,IAAI,IAAI,IAAI,MAAM;gBAAE,OAAQ,MAA2C,CAAC,IAAI,CAAC,CAAA;YAC7E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,QAAQ,CAAA;YACzF,OAAO,SAAS,CAAA;QAClB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;AAEhC,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,wCAAwC,CAAA;IACjE,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,gCAAgC,CAAA;IAC1D,gBAAgB,CAAC;QACf,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;gBAC7C,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAC1C;SACF;KACO,CAAC,CAAA;IACX,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAA;IAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,4EAA4E;AAC5E,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAe;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;IACvD,MAAM,IAAI,GACR,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS;QACtC,CAAC,CAAC,EAAE,MAAM,EAAE;QACZ,CAAC,CAAC;YACE,MAAM;YACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACzB,CAAA;IACP,0EAA0E;IAC1E,qEAAqE;IACrE,8DAA8D;IAC9D,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,sBAAsB,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,4BAA4B,CAAC,CAAC,EAAE,IAAI,CAAC,CAC5F;KACF,CAAC,CAAA;AACJ,CAAC;AAED,yEAAyE;AAEzE,MAAM,cAAc,GAAkE;IACpF,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,WAAW,EAAE,GAAG,CAAC;IAClB,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,cAAc,EAAE,GAAG,CAAC;IACrB,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC/B,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,oCAAoC,EAAE,GAAG,CAAC;IAC3C,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC/B,sEAAsE;IACtE,CAAC,qCAAqC,EAAE,GAAG,CAAC;IAC5C,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,+BAA+B,EAAE,GAAG,CAAC;IACtC,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,oCAAoC,EAAE,GAAG,CAAC;IAC3C,CAAC,qCAAqC,EAAE,GAAG,CAAC;IAC5C,CAAC,6CAA6C,EAAE,GAAG,CAAC;IACpD,CAAC,iDAAiD,EAAE,GAAG,CAAC;IACxD,CAAC,kDAAkD,EAAE,GAAG,CAAC;IACzD,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,YAAY,EAAE,GAAG,CAAC;IACnB,CAAC,YAAY,EAAE,GAAG,CAAC;IACnB,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,aAAa,EAAE,GAAG,CAAC;IACpB,CAAC,YAAY,EAAE,GAAG,CAAC;IACnB,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,YAAY,EAAE,GAAG,CAAC;IACnB,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,uCAAuC,EAAE,GAAG,CAAC;IAC9C,CAAC,qCAAqC,EAAE,GAAG,CAAC;IAC5C,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,gCAAgC,EAAE,GAAG,CAAC;IACvC,CAAC,sCAAsC,EAAE,GAAG,CAAC;IAC7C,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC/B,CAAC,kCAAkC,EAAE,GAAG,CAAC;IACzC,CAAC,cAAc,EAAE,GAAG,CAAC;IACrB,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,iCAAiC,EAAE,GAAG,CAAC;IACxC,CAAC,YAAY,EAAE,GAAG,CAAC;IACnB,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,oCAAoC,EAAE,GAAG,CAAC;IAC3C,CAAC,iCAAiC,EAAE,GAAG,CAAC;IACxC,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC/B,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,+BAA+B,EAAE,GAAG,CAAC;IACtC,CAAC,gCAAgC,EAAE,GAAG,CAAC;IACvC,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,aAAa,EAAE,GAAG,CAAC;IACpB,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,sCAAsC,EAAE,GAAG,CAAC;IAC7C,CAAC,uCAAuC,EAAE,GAAG,CAAC;IAC9C,CAAC,0CAA0C,EAAE,GAAG,CAAC;IACjD,CAAC,oCAAoC,EAAE,GAAG,CAAC;IAC3C,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,gCAAgC,EAAE,GAAG,CAAC;IACvC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,4CAA4C,EAAE,GAAG,CAAC;IACnD,CAAC,6CAA6C,EAAE,GAAG,CAAC;IACpD,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC/B,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC/B,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC/B,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,wCAAwC,EAAE,GAAG,CAAC;IAC/C,CAAC,wCAAwC,EAAE,GAAG,CAAC;IAC/C,CAAC,+BAA+B,EAAE,GAAG,CAAC;IACtC,CAAC,kCAAkC,EAAE,GAAG,CAAC;IACzC,CAAC,qCAAqC,EAAE,GAAG,CAAC;IAC5C,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,8EAA8E;IAC9E,uCAAuC;IACvC,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,aAAa,EAAE,GAAG,CAAC;IACpB,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,cAAc,EAAE,GAAG,CAAC;IACrB,CAAC,cAAc,EAAE,GAAG,CAAC;IACrB,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,sCAAsC,EAAE,GAAG,CAAC;IAC7C,CAAC,qCAAqC,EAAE,GAAG,CAAC;IAC5C,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,iCAAiC,EAAE,GAAG,CAAC;IACxC,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,sCAAsC,EAAE,GAAG,CAAC;IAC7C,CAAC,qCAAqC,EAAE,GAAG,CAAC;IAC5C,CAAC,qCAAqC,EAAE,GAAG,CAAC;IAC5C,CAAC,yDAAyD,EAAE,GAAG,CAAC;IAChE,CAAC,sCAAsC,EAAE,GAAG,CAAC;IAC7C,CAAC,wCAAwC,EAAE,GAAG,CAAC;IAC/C,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,+BAA+B,EAAE,GAAG,CAAC;IACtC,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,oCAAoC,EAAE,GAAG,CAAC;IAC3C,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,oCAAoC,EAAE,GAAG,CAAC;IAC3C,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,oBAAoB,EAAE,GAAG,CAAC;IAC3B,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,sCAAsC,EAAE,GAAG,CAAC;IAC7C,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,mCAAmC,EAAE,GAAG,CAAC;IAC1C,CAAC,2BAA2B,EAAE,GAAG,CAAC;IAClC,CAAC,mCAAmC,EAAE,GAAG,CAAC;IAC1C,CAAC,+BAA+B,EAAE,GAAG,CAAC;IACtC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,iCAAiC,EAAE,GAAG,CAAC;IACxC,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAChC,CAAC,6BAA6B,EAAE,GAAG,CAAC;IACpC,CAAC,4BAA4B,EAAE,GAAG,CAAC;IACnC,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,wBAAwB,EAAE,GAAG,CAAC;CAChC,CAAA;AAED;;;;GAIG;AACH,MAAM,iBAAiB,GAAyD;IAC9E,CAAC,gBAAgB,EAAE,yDAAyD,CAAC;IAC7E,CAAC,mBAAmB,EAAE,mDAAmD,CAAC;IAC1E,CAAC,kBAAkB,EAAE,uDAAuD,CAAC;IAC7E,CAAC,WAAW,EAAE,sBAAsB,CAAC;IACrC,CAAC,qBAAqB,EAAE,8CAA8C,CAAC;IACvE,CAAC,mBAAmB,EAAE,oDAAoD,CAAC;IAC3E,CAAC,aAAa,EAAE,kCAAkC,CAAC;IACnD,CAAC,6BAA6B,EAAE,6CAA6C,CAAC;IAC9E,CAAC,oCAAoC,EAAE,6CAA6C,CAAC;IACrF,CAAC,wBAAwB,EAAE,uDAAuD,CAAC;IACnF,CAAC,uBAAuB,EAAE,oDAAoD,CAAC;IAC/E,CAAC,4BAA4B,EAAE,2CAA2C,CAAC;IAC3E,CAAC,4BAA4B,EAAE,wCAAwC,CAAC;IACxE,CAAC,eAAe,EAAE,qBAAqB,CAAC;IACxC,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;IAC3C,CAAC,eAAe,EAAE,qBAAqB,CAAC;IACxC,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;IACzC,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;IAC1C,CAAC,aAAa,EAAE,yBAAyB,CAAC;IAC1C,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;IAClE,CAAC,0BAA0B,EAAE,0CAA0C,CAAC;CACzE,CAAA;AAED,yEAAyE;AAEzE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QACnE,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;aACtF,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;aACvB,IAAI,EAAE,CAAA;QACT,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CACnE,mBAAmB,EACnB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAA;QAC9D,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACnD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE/B,yEAAyE;QACzE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,0BAA0B,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAExE,yEAAyE;QACzE,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;QACzD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAA;YAC1D,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,iCAAiC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrF,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"route-contracts.test.js","sourceRoot":"","sources":["../../../src/__tests__/api/route-contracts.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { buildAiBotRobotsLines, AI_TRAINING_BOTS, AI_RETRIEVAL_BOTS } from '../../seo/ai-bots.js';
2
+ import { buildAiBotRobotsLines, detectAiBot, AI_TRAINING_BOTS, AI_RETRIEVAL_BOTS, } from '../../seo/ai-bots.js';
3
3
  function uaSet(lines) {
4
4
  return new Set(lines.filter((l) => l.startsWith('User-agent: ')).map((l) => l.replace('User-agent: ', '')));
5
5
  }
@@ -50,4 +50,43 @@ describe('buildAiBotRobotsLines', () => {
50
50
  expect(disallowCount).toBe(uaCount);
51
51
  });
52
52
  });
53
+ describe('detectAiBot', () => {
54
+ it('returns null for empty / human user agents', () => {
55
+ expect(detectAiBot(null)).toBeNull();
56
+ expect(detectAiBot(undefined)).toBeNull();
57
+ expect(detectAiBot('')).toBeNull();
58
+ expect(detectAiBot('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120')).toBeNull();
59
+ });
60
+ it('classifies a training crawler', () => {
61
+ expect(detectAiBot('Mozilla/5.0 (compatible; GPTBot/1.1; +https://openai.com/gptbot)')).toEqual({ token: 'GPTBot', category: 'training' });
62
+ expect(detectAiBot('CCBot/2.0 (https://commoncrawl.org/faq/)')).toEqual({
63
+ token: 'CCBot',
64
+ category: 'training',
65
+ });
66
+ });
67
+ it('classifies a retrieval / answer-engine crawler', () => {
68
+ expect(detectAiBot('Mozilla/5.0 (compatible; PerplexityBot/1.0)')).toEqual({
69
+ token: 'PerplexityBot',
70
+ category: 'retrieval',
71
+ });
72
+ expect(detectAiBot('Mozilla/5.0 ... ChatGPT-User/1.0')).toEqual({
73
+ token: 'ChatGPT-User',
74
+ category: 'retrieval',
75
+ });
76
+ });
77
+ it('prefers the more specific *-Extended training token over its search namesake', () => {
78
+ expect(detectAiBot('Mozilla/5.0 (compatible; Applebot-Extended/0.1)')).toEqual({
79
+ token: 'Applebot-Extended',
80
+ category: 'training',
81
+ });
82
+ // Plain Applebot (search/Siri) is retrieval, not training.
83
+ expect(detectAiBot('Mozilla/5.0 (compatible; Applebot/0.1)')).toEqual({
84
+ token: 'Applebot',
85
+ category: 'retrieval',
86
+ });
87
+ });
88
+ it('is case-insensitive', () => {
89
+ expect(detectAiBot('something gptbot something')?.token).toBe('GPTBot');
90
+ });
91
+ });
53
92
  //# sourceMappingURL=ai-bots.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-bots.test.js","sourceRoot":"","sources":["../../../src/__tests__/seo/ai-bots.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-bots.test.js","sourceRoot":"","sources":["../../../src/__tests__/seo/ai-bots.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolve-path.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-path.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/seo/resolve-path.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { matchPathToCollection } from '../../seo/resolve-path.js';
3
+ const config = {
4
+ collections: {
5
+ pages: { slug: 'pages', type: 'page' },
6
+ posts: { slug: 'posts', type: 'post', urlPrefix: '/blog' },
7
+ },
8
+ };
9
+ describe('matchPathToCollection', () => {
10
+ it('resolves the root path to the prefix-less page collection home', () => {
11
+ expect(matchPathToCollection(config, '/')).toEqual({
12
+ collection: 'pages',
13
+ slug: 'home',
14
+ isRoot: true,
15
+ });
16
+ });
17
+ it('resolves a single segment to the page collection', () => {
18
+ expect(matchPathToCollection(config, '/about')).toEqual({
19
+ collection: 'pages',
20
+ slug: 'about',
21
+ isRoot: false,
22
+ });
23
+ });
24
+ it('resolves a prefixed path to the matching collection', () => {
25
+ expect(matchPathToCollection(config, '/blog/my-post')).toEqual({
26
+ collection: 'posts',
27
+ slug: 'my-post',
28
+ isRoot: false,
29
+ });
30
+ });
31
+ it('tolerates leading/trailing slashes', () => {
32
+ expect(matchPathToCollection(config, 'about/')).toEqual({
33
+ collection: 'pages',
34
+ slug: 'about',
35
+ isRoot: false,
36
+ });
37
+ });
38
+ it('falls back to <collection>/<slug> for unknown multi-segment paths', () => {
39
+ expect(matchPathToCollection({ collections: {} }, '/things/x')).toEqual({
40
+ collection: 'things',
41
+ slug: 'x',
42
+ isRoot: false,
43
+ });
44
+ });
45
+ });
46
+ //# sourceMappingURL=resolve-path.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-path.test.js","sourceRoot":"","sources":["../../../src/__tests__/seo/resolve-path.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEjE,MAAM,MAAM,GAAG;IACb,WAAW,EAAE;QACX,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;QACtC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;KAC3D;CACO,CAAA;AAEV,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YACjD,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAI;SACb,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACtD,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7D,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACtD,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,EAAE,EAAW,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/E,UAAU,EAAE,QAAQ;YACpB,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../../src/api/routes/seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAmC7C,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7F,MAAM,EAAE,CAAC,EAAE,GACV,CAAC,EAAE,CAQL;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAw/BzD"}
1
+ {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../../src/api/routes/seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAqC7C,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7F,MAAM,EAAE,CAAC,EAAE,GACV,CAAC,EAAE,CAQL;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAspCzD"}