@cogenta/agents-builtin 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/accessibility/agent.d.ts +10 -0
  2. package/dist/accessibility/agent.d.ts.map +1 -0
  3. package/dist/accessibility/agent.js +19 -0
  4. package/dist/accessibility/agent.js.map +1 -0
  5. package/dist/accessibility/audit.d.ts +36 -0
  6. package/dist/accessibility/audit.d.ts.map +1 -0
  7. package/dist/accessibility/audit.js +142 -0
  8. package/dist/accessibility/audit.js.map +1 -0
  9. package/dist/analytics/agent.d.ts +9 -0
  10. package/dist/analytics/agent.d.ts.map +1 -0
  11. package/dist/analytics/agent.js +18 -0
  12. package/dist/analytics/agent.js.map +1 -0
  13. package/dist/analytics/signals.d.ts +35 -0
  14. package/dist/analytics/signals.d.ts.map +1 -0
  15. package/dist/analytics/signals.js +70 -0
  16. package/dist/analytics/signals.js.map +1 -0
  17. package/dist/compliance/agent.d.ts +9 -0
  18. package/dist/compliance/agent.d.ts.map +1 -0
  19. package/dist/compliance/agent.js +18 -0
  20. package/dist/compliance/agent.js.map +1 -0
  21. package/dist/compliance/audit.d.ts +44 -0
  22. package/dist/compliance/audit.d.ts.map +1 -0
  23. package/dist/compliance/audit.js +64 -0
  24. package/dist/compliance/audit.js.map +1 -0
  25. package/dist/index.d.ts +21 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +14 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/media/agent.d.ts +10 -0
  30. package/dist/media/agent.d.ts.map +1 -0
  31. package/dist/media/agent.js +26 -0
  32. package/dist/media/agent.js.map +1 -0
  33. package/dist/media/audit.d.ts +38 -0
  34. package/dist/media/audit.d.ts.map +1 -0
  35. package/dist/media/audit.js +56 -0
  36. package/dist/media/audit.js.map +1 -0
  37. package/dist/migration/agent.d.ts +10 -0
  38. package/dist/migration/agent.d.ts.map +1 -0
  39. package/dist/migration/agent.js +26 -0
  40. package/dist/migration/agent.js.map +1 -0
  41. package/dist/migration/residue.d.ts +48 -0
  42. package/dist/migration/residue.d.ts.map +1 -0
  43. package/dist/migration/residue.js +92 -0
  44. package/dist/migration/residue.js.map +1 -0
  45. package/dist/moderation/agent.d.ts +9 -0
  46. package/dist/moderation/agent.d.ts.map +1 -0
  47. package/dist/moderation/agent.js +18 -0
  48. package/dist/moderation/agent.js.map +1 -0
  49. package/dist/moderation/triage.d.ts +24 -0
  50. package/dist/moderation/triage.d.ts.map +1 -0
  51. package/dist/moderation/triage.js +26 -0
  52. package/dist/moderation/triage.js.map +1 -0
  53. package/dist/translation/agent.d.ts +9 -0
  54. package/dist/translation/agent.d.ts.map +1 -0
  55. package/dist/translation/agent.js +24 -0
  56. package/dist/translation/agent.js.map +1 -0
  57. package/dist/translation/gaps.d.ts +31 -0
  58. package/dist/translation/gaps.d.ts.map +1 -0
  59. package/dist/translation/gaps.js +44 -0
  60. package/dist/translation/gaps.js.map +1 -0
  61. package/package.json +3 -3
@@ -0,0 +1,10 @@
1
+ import { type AgentDeclaration } from '@cogenta/agents';
2
+ /**
3
+ * L5 task 10, priority 3. Audits the HTML a visitor really receives, through
4
+ * `auditAccessibility`, plus the theme's colour pairs through
5
+ * `auditContrast` — the WCAG formula, not an impression. It checks the
6
+ * subset a machine can decide alone, and its identity says so plainly rather
7
+ * than letting a green report read as "this site is accessible".
8
+ */
9
+ export declare const accessibilityAgent: AgentDeclaration;
10
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/accessibility/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,iBAAiB,CAAA;AAEpE;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,gBAS/B,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { defineAgent } from '@cogenta/agents';
2
+ /**
3
+ * L5 task 10, priority 3. Audits the HTML a visitor really receives, through
4
+ * `auditAccessibility`, plus the theme's colour pairs through
5
+ * `auditContrast` — the WCAG formula, not an impression. It checks the
6
+ * subset a machine can decide alone, and its identity says so plainly rather
7
+ * than letting a green report read as "this site is accessible".
8
+ */
9
+ export const accessibilityAgent = defineAgent({
10
+ name: 'accessibility',
11
+ identity: './identity.md',
12
+ model: { preferred: 'claude-sonnet', fallback: 'local' },
13
+ tools: ['http.fetch', 'content.list', 'content.read', 'media.list'],
14
+ autonomy: { default: 'propose' },
15
+ budget: { tokensPerDay: 60_000, eurPerMonth: 4, callsPerHour: 15 },
16
+ memory: { episodic: true, scope: 'site' },
17
+ triggers: [{ on: 'schedule', cron: '0 4 1 * *' }],
18
+ });
19
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/accessibility/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAEpE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAqB,WAAW,CAAC;IAC9D,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;IACxD,KAAK,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,CAAC;IACnE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;IAChC,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;IAClE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IACzC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;CAClD,CAAC,CAAA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * What is wrong with a page a visitor really receives (L5 task 10).
3
+ *
4
+ * It reads the served HTML, not the CMS's idea of it: a theme is correct
5
+ * until an editor puts an image with no alt in it, and only the output shows
6
+ * that. Zero new dependency (R9) — the checks below are string work on markup
7
+ * the host already fetched, and the contrast one is the WCAG formula, which
8
+ * is twenty lines of arithmetic.
9
+ *
10
+ * It is deliberately a *subset* of WCAG: what a machine can decide alone.
11
+ * The agent's identity says so, and the report repeats it.
12
+ */
13
+ export type AccessibilityIssue = 'missing-lang' | 'image-without-alt' | 'heading-skip' | 'generic-link-text' | 'input-without-label' | 'low-contrast';
14
+ export interface AccessibilityFinding {
15
+ readonly issue: AccessibilityIssue;
16
+ readonly detail: string;
17
+ /** The offending markup, trimmed — so a human can find it without guessing. */
18
+ readonly excerpt?: string;
19
+ }
20
+ export declare function auditAccessibility(html: string): readonly AccessibilityFinding[];
21
+ /** Relative luminance of an `#rrggbb` colour, WCAG 2.1 §1.4.3. */
22
+ export declare function relativeLuminance(hex: string): number | null;
23
+ /** The contrast ratio between two colours, or `null` when either is not a plain hex colour. */
24
+ export declare function contrastRatio(foreground: string, background: string): number | null;
25
+ /**
26
+ * The theme's own colour pairs, checked against WCAG AA (4.5:1 for body text,
27
+ * 3:1 for large text). A pair this cannot parse — a gradient, a colour
28
+ * function, a variable — is skipped rather than guessed at.
29
+ */
30
+ export declare function auditContrast(pairs: readonly {
31
+ readonly name: string;
32
+ readonly foreground: string;
33
+ readonly background: string;
34
+ readonly large?: boolean;
35
+ }[]): readonly AccessibilityFinding[];
36
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/accessibility/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,mBAAmB,GACnB,cAAc,GACd,mBAAmB,GACnB,qBAAqB,GACrB,cAAc,CAAA;AAElB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AA4BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAqEhF;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS5D;AAED,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOnF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,EAAE,GACF,SAAS,oBAAoB,EAAE,CAcjC"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * What is wrong with a page a visitor really receives (L5 task 10).
3
+ *
4
+ * It reads the served HTML, not the CMS's idea of it: a theme is correct
5
+ * until an editor puts an image with no alt in it, and only the output shows
6
+ * that. Zero new dependency (R9) — the checks below are string work on markup
7
+ * the host already fetched, and the contrast one is the WCAG formula, which
8
+ * is twenty lines of arithmetic.
9
+ *
10
+ * It is deliberately a *subset* of WCAG: what a machine can decide alone.
11
+ * The agent's identity says so, and the report repeats it.
12
+ */
13
+ const GENERIC_LINK_TEXTS = new Set([
14
+ 'click here',
15
+ 'cliquez ici',
16
+ 'here',
17
+ 'ici',
18
+ 'read more',
19
+ 'lire la suite',
20
+ 'en savoir plus',
21
+ 'learn more',
22
+ 'link',
23
+ 'lien',
24
+ ]);
25
+ function attribute(tag, name) {
26
+ const match = new RegExp(`\\b${name}\\s*=\\s*("([^"]*)"|'([^']*)')`, 'iu').exec(tag);
27
+ return match?.[2] ?? match?.[3];
28
+ }
29
+ function textOf(html) {
30
+ return html
31
+ .replace(/<[^>]*>/gu, ' ')
32
+ .replace(/&nbsp;/gu, ' ')
33
+ .replace(/\s+/gu, ' ')
34
+ .trim();
35
+ }
36
+ export function auditAccessibility(html) {
37
+ const findings = [];
38
+ const htmlTag = /<html\b[^>]*>/iu.exec(html)?.[0];
39
+ if (htmlTag === undefined || (attribute(htmlTag, 'lang') ?? '').trim() === '') {
40
+ findings.push({
41
+ issue: 'missing-lang',
42
+ detail: 'The page does not say what language it is in, so a screen reader guesses its pronunciation.',
43
+ });
44
+ }
45
+ for (const tag of html.match(/<img\b[^>]*>/giu) ?? []) {
46
+ const alt = attribute(tag, 'alt');
47
+ const role = attribute(tag, 'role');
48
+ // `alt=""` with `role="presentation"` (or on its own) is the correct way
49
+ // to mark a decorative image: flagging it would be the false positive.
50
+ if (alt === undefined && role !== 'presentation') {
51
+ findings.push({
52
+ issue: 'image-without-alt',
53
+ detail: 'An image carries no alt attribute at all: a screen reader reads its file name.',
54
+ excerpt: tag.slice(0, 120),
55
+ });
56
+ }
57
+ }
58
+ let previous = 0;
59
+ for (const tag of html.match(/<h[1-6]\b[^>]*>/giu) ?? []) {
60
+ const level = Number(tag[2]);
61
+ if (previous !== 0 && level > previous + 1) {
62
+ findings.push({
63
+ issue: 'heading-skip',
64
+ detail: `A level ${level} heading follows a level ${previous} one: the outline skips a level.`,
65
+ excerpt: tag,
66
+ });
67
+ }
68
+ previous = level;
69
+ }
70
+ for (const anchor of html.match(/<a\b[^>]*>[\s\S]*?<\/a>/giu) ?? []) {
71
+ const label = textOf(anchor).toLowerCase();
72
+ if (label !== '' && GENERIC_LINK_TEXTS.has(label)) {
73
+ findings.push({
74
+ issue: 'generic-link-text',
75
+ detail: `A link reads "${label}": out of context, it says nothing about where it goes.`,
76
+ excerpt: anchor.slice(0, 120),
77
+ });
78
+ }
79
+ }
80
+ for (const input of html.match(/<input\b[^>]*>/giu) ?? []) {
81
+ const type = (attribute(input, 'type') ?? 'text').toLowerCase();
82
+ if (type === 'hidden' || type === 'submit' || type === 'button')
83
+ continue;
84
+ const id = attribute(input, 'id');
85
+ const labelled = (attribute(input, 'aria-label') ?? '').trim() !== '' ||
86
+ (attribute(input, 'aria-labelledby') ?? '').trim() !== '' ||
87
+ (id !== undefined &&
88
+ new RegExp(`<label\\b[^>]*\\bfor\\s*=\\s*["']${id}["']`, 'iu').test(html));
89
+ if (!labelled) {
90
+ findings.push({
91
+ issue: 'input-without-label',
92
+ detail: 'A form field has no label a screen reader can announce.',
93
+ excerpt: input.slice(0, 120),
94
+ });
95
+ }
96
+ }
97
+ return findings;
98
+ }
99
+ /** Relative luminance of an `#rrggbb` colour, WCAG 2.1 §1.4.3. */
100
+ export function relativeLuminance(hex) {
101
+ const match = /^#?([0-9a-f]{6})$/iu.exec(hex.trim());
102
+ if (match === null)
103
+ return null;
104
+ const value = match[1];
105
+ const channel = (offset) => {
106
+ const raw = Number.parseInt(value.slice(offset, offset + 2), 16) / 255;
107
+ return raw <= 0.03928 ? raw / 12.92 : ((raw + 0.055) / 1.055) ** 2.4;
108
+ };
109
+ return 0.2126 * channel(0) + 0.7152 * channel(2) + 0.0722 * channel(4);
110
+ }
111
+ /** The contrast ratio between two colours, or `null` when either is not a plain hex colour. */
112
+ export function contrastRatio(foreground, background) {
113
+ const first = relativeLuminance(foreground);
114
+ const second = relativeLuminance(background);
115
+ if (first === null || second === null)
116
+ return null;
117
+ const lighter = Math.max(first, second);
118
+ const darker = Math.min(first, second);
119
+ return (lighter + 0.05) / (darker + 0.05);
120
+ }
121
+ /**
122
+ * The theme's own colour pairs, checked against WCAG AA (4.5:1 for body text,
123
+ * 3:1 for large text). A pair this cannot parse — a gradient, a colour
124
+ * function, a variable — is skipped rather than guessed at.
125
+ */
126
+ export function auditContrast(pairs) {
127
+ const findings = [];
128
+ for (const pair of pairs) {
129
+ const ratio = contrastRatio(pair.foreground, pair.background);
130
+ if (ratio === null)
131
+ continue;
132
+ const required = pair.large === true ? 3 : 4.5;
133
+ if (ratio < required) {
134
+ findings.push({
135
+ issue: 'low-contrast',
136
+ detail: `${pair.name}: ${ratio.toFixed(2)}:1, below the ${required}:1 WCAG AA asks for.`,
137
+ });
138
+ }
139
+ }
140
+ return findings;
141
+ }
142
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/accessibility/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type AgentDeclaration } from '@cogenta/agents';
2
+ /**
3
+ * L5 task 10, priority 3. Reads figures and writes nothing at all — there is
4
+ * no write tool in this list. Every number in its report comes from
5
+ * `readAudienceSignals`, which applies both a relative threshold and an
6
+ * absolute floor so a page going from two views to five is never a story.
7
+ */
8
+ export declare const analyticsAgent: AgentDeclaration;
9
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/analytics/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,iBAAiB,CAAA;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,gBAS3B,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { defineAgent } from '@cogenta/agents';
2
+ /**
3
+ * L5 task 10, priority 3. Reads figures and writes nothing at all — there is
4
+ * no write tool in this list. Every number in its report comes from
5
+ * `readAudienceSignals`, which applies both a relative threshold and an
6
+ * absolute floor so a page going from two views to five is never a story.
7
+ */
8
+ export const analyticsAgent = defineAgent({
9
+ name: 'analytics',
10
+ identity: './identity.md',
11
+ model: { preferred: 'claude-sonnet', fallback: 'local' },
12
+ tools: ['analytics.summary', 'content.list', 'content.read', 'logs.read_not_found'],
13
+ autonomy: { default: 'observe' },
14
+ budget: { tokensPerDay: 60_000, eurPerMonth: 4, callsPerHour: 15 },
15
+ memory: { episodic: true, scope: 'site' },
16
+ triggers: [{ on: 'schedule', cron: '0 6 * * 1' }],
17
+ });
18
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/analytics/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAEpE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAqB,WAAW,CAAC;IAC1D,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;IACxD,KAAK,EAAE,CAAC,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,CAAC;IACnF,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;IAChC,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;IAClE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IACzC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;CAClD,CAAC,CAAA"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * What actually changed in a site's audience (L5 task 10, Analytics).
3
+ *
4
+ * Two thresholds, and both matter: a relative one, so a change has to be
5
+ * large, and an absolute floor, so a page that went from two views to five is
6
+ * never reported as "+150 %". Without the floor, a low-traffic site produces
7
+ * nothing but noise — the exact failure mode L5 names as fatal for an agent.
8
+ */
9
+ export type AudienceIssue = 'rise' | 'fall' | 'unvisited' | 'missing-page';
10
+ export interface AudiencePage {
11
+ readonly path: string;
12
+ readonly views: number;
13
+ }
14
+ export interface AudienceWindow {
15
+ readonly totalViews: number;
16
+ readonly pages: readonly AudiencePage[];
17
+ }
18
+ export interface AudienceFinding {
19
+ readonly issue: AudienceIssue;
20
+ readonly path: string;
21
+ readonly detail: string;
22
+ readonly views: number;
23
+ }
24
+ export interface AudienceOptions {
25
+ /** How much a page must move, as a ratio, to be worth a sentence. 0.5 = half again as much (or half as little). */
26
+ readonly minimumChange?: number;
27
+ /** Views a page must reach in the better of the two windows before any change counts at all. */
28
+ readonly minimumViews?: number;
29
+ /** Paths of published pages, so one with no views at all can be named. */
30
+ readonly publishedPaths?: readonly string[];
31
+ /** Paths the 404 log recorded, with their hit counts — a page people look for and do not find. */
32
+ readonly notFound?: readonly AudiencePage[];
33
+ }
34
+ export declare function readAudienceSignals(current: AudienceWindow, previous: AudienceWindow, options?: AudienceOptions): readonly AudienceFinding[];
35
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/analytics/signals.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,cAAc,CAAA;AAE1E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,mHAAmH;IACnH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,gGAAgG;IAChG,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3C,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;CAC5C;AAKD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,eAAoB,GAC5B,SAAS,eAAe,EAAE,CA0D5B"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * What actually changed in a site's audience (L5 task 10, Analytics).
3
+ *
4
+ * Two thresholds, and both matter: a relative one, so a change has to be
5
+ * large, and an absolute floor, so a page that went from two views to five is
6
+ * never reported as "+150 %". Without the floor, a low-traffic site produces
7
+ * nothing but noise — the exact failure mode L5 names as fatal for an agent.
8
+ */
9
+ const DEFAULT_MINIMUM_CHANGE = 0.5;
10
+ const DEFAULT_MINIMUM_VIEWS = 20;
11
+ export function readAudienceSignals(current, previous, options = {}) {
12
+ const minimumChange = options.minimumChange ?? DEFAULT_MINIMUM_CHANGE;
13
+ const minimumViews = options.minimumViews ?? DEFAULT_MINIMUM_VIEWS;
14
+ const before = new Map(previous.pages.map((page) => [page.path, page.views]));
15
+ const findings = [];
16
+ for (const page of current.pages) {
17
+ const was = before.get(page.path) ?? 0;
18
+ if (Math.max(page.views, was) < minimumViews)
19
+ continue;
20
+ if (was === 0) {
21
+ findings.push({
22
+ issue: 'rise',
23
+ path: page.path,
24
+ views: page.views,
25
+ detail: `${page.views} views, against none in the window before.`,
26
+ });
27
+ continue;
28
+ }
29
+ const change = (page.views - was) / was;
30
+ if (change >= minimumChange) {
31
+ findings.push({
32
+ issue: 'rise',
33
+ path: page.path,
34
+ views: page.views,
35
+ detail: `${page.views} views against ${was}, a rise of ${Math.round(change * 100)} %.`,
36
+ });
37
+ }
38
+ else if (change <= -minimumChange) {
39
+ findings.push({
40
+ issue: 'fall',
41
+ path: page.path,
42
+ views: page.views,
43
+ detail: `${page.views} views against ${was}, a fall of ${Math.round(-change * 100)} %.`,
44
+ });
45
+ }
46
+ }
47
+ const visited = new Set(current.pages.map((page) => page.path));
48
+ for (const path of options.publishedPaths ?? []) {
49
+ if (visited.has(path))
50
+ continue;
51
+ findings.push({
52
+ issue: 'unvisited',
53
+ path,
54
+ views: 0,
55
+ detail: 'Published, and not visited once in this window.',
56
+ });
57
+ }
58
+ for (const page of options.notFound ?? []) {
59
+ if (page.views < minimumViews)
60
+ continue;
61
+ findings.push({
62
+ issue: 'missing-page',
63
+ path: page.path,
64
+ views: page.views,
65
+ detail: `${page.views} visitors asked for this address and got nothing.`,
66
+ });
67
+ }
68
+ return findings;
69
+ }
70
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/analytics/signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type AgentDeclaration } from '@cogenta/agents';
2
+ /**
3
+ * L5 task 10, priority 3. Read-only by construction: no write tool is
4
+ * declared, so nothing it finds can be "fixed" behind a human's back. Every
5
+ * finding of `auditCompliance` is a fact about configuration or content, and
6
+ * the report says in its own words that a checklist is not legal advice.
7
+ */
8
+ export declare const complianceAgent: AgentDeclaration;
9
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/compliance/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,iBAAiB,CAAA;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,gBAS5B,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { defineAgent } from '@cogenta/agents';
2
+ /**
3
+ * L5 task 10, priority 3. Read-only by construction: no write tool is
4
+ * declared, so nothing it finds can be "fixed" behind a human's back. Every
5
+ * finding of `auditCompliance` is a fact about configuration or content, and
6
+ * the report says in its own words that a checklist is not legal advice.
7
+ */
8
+ export const complianceAgent = defineAgent({
9
+ name: 'compliance',
10
+ identity: './identity.md',
11
+ model: { preferred: 'claude-sonnet', fallback: 'local' },
12
+ tools: ['site.config_read', 'content.collections', 'content.list', 'content.read'],
13
+ autonomy: { default: 'observe' },
14
+ budget: { tokensPerDay: 60_000, eurPerMonth: 4, callsPerHour: 15 },
15
+ memory: { episodic: true, scope: 'site' },
16
+ triggers: [{ on: 'schedule', cron: '0 4 1 * *' }],
17
+ });
18
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/compliance/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAEpE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqB,WAAW,CAAC;IAC3D,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;IACxD,KAAK,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,CAAC;IAClF,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;IAChC,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;IAClE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IACzC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;CAClD,CAAC,CAAA"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The obligations a European site carries, checked against what the site
3
+ * really holds (L5 task 10, Conformité).
4
+ *
5
+ * Every finding is a fact about configuration or content, never an opinion:
6
+ * a page exists or it does not, a retention is set or it is not, an entry
7
+ * written by a model names that model or it does not. The agent's own
8
+ * identity is explicit that none of this is legal advice — a checklist is not
9
+ * a lawyer, and saying otherwise would be the worst kind of false confidence.
10
+ */
11
+ export type ComplianceIssue = 'missing-legal-page' | 'retention-unset' | 'provenance-undeclared' | 'consent-mismatch';
12
+ export interface ComplianceFinding {
13
+ readonly issue: ComplianceIssue;
14
+ readonly subject: string;
15
+ readonly detail: string;
16
+ }
17
+ export interface ComplianceEntry {
18
+ readonly id: string;
19
+ readonly title: string;
20
+ readonly provenance: string;
21
+ readonly provenanceDetail: Readonly<Record<string, unknown>> | null;
22
+ }
23
+ export interface ComplianceEmbed {
24
+ readonly entryId: string;
25
+ readonly provider: string;
26
+ readonly consentRequired: boolean;
27
+ }
28
+ export interface ComplianceInput {
29
+ /** Slugs (or paths) of the pages the site publishes right now. */
30
+ readonly publishedPaths: readonly string[];
31
+ /** What a site of this jurisdiction is expected to publish. Passed in, never hardcoded to one country. */
32
+ readonly requiredPages: readonly {
33
+ readonly label: string;
34
+ readonly candidates: readonly string[];
35
+ }[];
36
+ readonly auditRetentionDays: number | undefined;
37
+ readonly formSubmissionRetentionDays: number | undefined;
38
+ readonly entries: readonly ComplianceEntry[];
39
+ readonly embeds: readonly ComplianceEmbed[];
40
+ /** The site setting that says a third-party embed must ask before loading. */
41
+ readonly consentRequiredBySetting: boolean;
42
+ }
43
+ export declare function auditCompliance(input: ComplianceInput): readonly ComplianceFinding[];
44
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/compliance/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,iBAAiB,GACjB,uBAAuB,GACvB,kBAAkB,CAAA;AAEtB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAA;CACpE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,0GAA0G;IAC1G,QAAQ,CAAC,aAAa,EAAE,SAAS;QAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;KACvC,EAAE,CAAA;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/C,QAAQ,CAAC,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAA;IACxD,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAA;IAC5C,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;IAC3C,8EAA8E;IAC9E,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAA;CAC3C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,iBAAiB,EAAE,CAuDpF"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * The obligations a European site carries, checked against what the site
3
+ * really holds (L5 task 10, Conformité).
4
+ *
5
+ * Every finding is a fact about configuration or content, never an opinion:
6
+ * a page exists or it does not, a retention is set or it is not, an entry
7
+ * written by a model names that model or it does not. The agent's own
8
+ * identity is explicit that none of this is legal advice — a checklist is not
9
+ * a lawyer, and saying otherwise would be the worst kind of false confidence.
10
+ */
11
+ export function auditCompliance(input) {
12
+ const findings = [];
13
+ const published = new Set(input.publishedPaths.map((path) => path.toLowerCase()));
14
+ for (const page of input.requiredPages) {
15
+ if (page.candidates.some((candidate) => published.has(candidate.toLowerCase())))
16
+ continue;
17
+ findings.push({
18
+ issue: 'missing-legal-page',
19
+ subject: page.label,
20
+ detail: `No published page answers "${page.label}".`,
21
+ });
22
+ }
23
+ if (input.auditRetentionDays === undefined || input.auditRetentionDays === 0) {
24
+ findings.push({
25
+ issue: 'retention-unset',
26
+ subject: 'audit log',
27
+ detail: 'No retention is configured, so the audit log grows for ever — including the personal data in it.',
28
+ });
29
+ }
30
+ if (input.formSubmissionRetentionDays === undefined || input.formSubmissionRetentionDays === 0) {
31
+ findings.push({
32
+ issue: 'retention-unset',
33
+ subject: 'form submissions',
34
+ detail: 'No retention is configured: what visitors typed into a form is kept indefinitely.',
35
+ });
36
+ }
37
+ for (const entry of input.entries) {
38
+ if (entry.provenance === 'human')
39
+ continue;
40
+ const detail = entry.provenanceDetail ?? {};
41
+ const names = typeof detail['agent'] === 'string' && detail['agent'] !== '';
42
+ const model = typeof detail['model'] === 'string' && detail['model'] !== '';
43
+ if (names && model)
44
+ continue;
45
+ findings.push({
46
+ issue: 'provenance-undeclared',
47
+ subject: entry.title,
48
+ detail: `Recorded as "${entry.provenance}" without naming ${names ? 'the model' : 'the agent'} that wrote it.`,
49
+ });
50
+ }
51
+ if (input.consentRequiredBySetting) {
52
+ for (const embed of input.embeds) {
53
+ if (embed.consentRequired)
54
+ continue;
55
+ findings.push({
56
+ issue: 'consent-mismatch',
57
+ subject: `${embed.provider} embed`,
58
+ detail: 'This site asks for consent before third-party content loads, but this block does not.',
59
+ });
60
+ }
61
+ }
62
+ return findings;
63
+ }
64
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/compliance/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2CH,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,MAAM,QAAQ,GAAwB,EAAE,CAAA;IACxC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAEjF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAAE,SAAQ;QACzF,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,oBAAoB;YAC3B,OAAO,EAAE,IAAI,CAAC,KAAK;YACnB,MAAM,EAAE,8BAA8B,IAAI,CAAC,KAAK,IAAI;SACrD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,kBAAkB,KAAK,SAAS,IAAI,KAAK,CAAC,kBAAkB,KAAK,CAAC,EAAE,CAAC;QAC7E,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,WAAW;YACpB,MAAM,EACJ,kGAAkG;SACrG,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,2BAA2B,KAAK,SAAS,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,EAAE,CAAC;QAC/F,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,mFAAmF;SAC5F,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO;YAAE,SAAQ;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAA;QAC3C,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAC3E,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAC3E,IAAI,KAAK,IAAI,KAAK;YAAE,SAAQ;QAC5B,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,KAAK,CAAC,KAAK;YACpB,MAAM,EAAE,gBAAgB,KAAK,CAAC,UAAU,oBAAoB,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,iBAAiB;SAC/G,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,wBAAwB,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,eAAe;gBAAE,SAAQ;YACnC,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,QAAQ;gBAClC,MAAM,EACJ,uFAAuF;aAC1F,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,12 @@
1
+ export { accessibilityAgent } from './accessibility/agent.js';
2
+ export type { AccessibilityFinding, AccessibilityIssue } from './accessibility/audit.js';
3
+ export { auditAccessibility, auditContrast, contrastRatio, relativeLuminance, } from './accessibility/audit.js';
4
+ export { analyticsAgent } from './analytics/agent.js';
5
+ export type { AudienceFinding, AudienceIssue, AudienceOptions, AudiencePage, AudienceWindow, } from './analytics/signals.js';
6
+ export { readAudienceSignals } from './analytics/signals.js';
7
+ export { complianceAgent } from './compliance/agent.js';
8
+ export type { ComplianceEmbed, ComplianceEntry, ComplianceFinding, ComplianceInput, ComplianceIssue, } from './compliance/audit.js';
9
+ export { auditCompliance } from './compliance/audit.js';
1
10
  export { contentAgent } from './content/agent.js';
2
11
  export type { ContentDraftToolOptions } from './content/provenance.js';
3
12
  export { createContentDraftTool } from './content/provenance.js';
@@ -11,6 +20,15 @@ export { developerAgent } from './developer/agent.js';
11
20
  export type { CodePatchInput, CodePatchOutput, CodePatchToolOptions, } from './developer/patch-tool.js';
12
21
  export { createCodePatchTool } from './developer/patch-tool.js';
13
22
  export { imageCreatorAgent } from './image-creator/agent.js';
23
+ export { mediaAgent } from './media/agent.js';
24
+ export type { MediaAuditAsset, MediaAuditOptions, MediaFinding, MediaIssue, } from './media/audit.js';
25
+ export { auditMediaLibrary } from './media/audit.js';
26
+ export { migrationAgent } from './migration/agent.js';
27
+ export type { MigrationEntry, MigrationFinding, MigrationIssue, MigrationOptions, } from './migration/residue.js';
28
+ export { findMigrationResidue, redirectsFor } from './migration/residue.js';
29
+ export { moderationAgent } from './moderation/agent.js';
30
+ export type { ModerationDecision, ModerationTriage } from './moderation/triage.js';
31
+ export { triageComments } from './moderation/triage.js';
14
32
  export { performanceAgent } from './performance/agent.js';
15
33
  export { compareToBudget } from './performance/budget.js';
16
34
  export type { CruxFormFactor, QueryCruxOptions } from './performance/crux-client.js';
@@ -68,4 +86,7 @@ export { createListSandboxFilesTool, createReadSandboxFileTool, } from './theme-
68
86
  export { COGENTA_THEME_SPECIFICATION } from './theme-creator/theme-spec.js';
69
87
  export type { WriteSandboxFileInput, WriteSandboxFileOutput, WriteSandboxFileToolOptions, } from './theme-creator/write-sandbox-file-tool.js';
70
88
  export { createWriteSandboxFileTool } from './theme-creator/write-sandbox-file-tool.js';
89
+ export { translationAgent } from './translation/agent.js';
90
+ export type { TranslationFamily, TranslationGap, TranslationIssue, TranslationMember, } from './translation/gaps.js';
91
+ export { findTranslationGaps } from './translation/gaps.js';
71
92
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}