@agentsean/actions 1.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.
Files changed (50) hide show
  1. package/LICENSE +661 -0
  2. package/dist/executor.d.ts +46 -0
  3. package/dist/executor.d.ts.map +1 -0
  4. package/dist/executor.js +150 -0
  5. package/dist/executor.js.map +1 -0
  6. package/dist/hmac.d.ts +4 -0
  7. package/dist/hmac.d.ts.map +1 -0
  8. package/dist/hmac.js +23 -0
  9. package/dist/hmac.js.map +1 -0
  10. package/dist/html.d.ts +15 -0
  11. package/dist/html.d.ts.map +1 -0
  12. package/dist/html.js +52 -0
  13. package/dist/html.js.map +1 -0
  14. package/dist/index.d.ts +12 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +12 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/kinds.d.ts +12 -0
  19. package/dist/kinds.d.ts.map +1 -0
  20. package/dist/kinds.js +135 -0
  21. package/dist/kinds.js.map +1 -0
  22. package/dist/payloads.d.ts +13 -0
  23. package/dist/payloads.d.ts.map +1 -0
  24. package/dist/payloads.js +368 -0
  25. package/dist/payloads.js.map +1 -0
  26. package/dist/persist.d.ts +65 -0
  27. package/dist/persist.d.ts.map +1 -0
  28. package/dist/persist.js +362 -0
  29. package/dist/persist.js.map +1 -0
  30. package/dist/planner.d.ts +20 -0
  31. package/dist/planner.d.ts.map +1 -0
  32. package/dist/planner.js +115 -0
  33. package/dist/planner.js.map +1 -0
  34. package/dist/scan.d.ts +19 -0
  35. package/dist/scan.d.ts.map +1 -0
  36. package/dist/scan.js +210 -0
  37. package/dist/scan.js.map +1 -0
  38. package/dist/types.d.ts +227 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +29 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist/urls.d.ts +6 -0
  43. package/dist/urls.d.ts.map +1 -0
  44. package/dist/urls.js +74 -0
  45. package/dist/urls.js.map +1 -0
  46. package/dist/validator.d.ts +9 -0
  47. package/dist/validator.d.ts.map +1 -0
  48. package/dist/validator.js +398 -0
  49. package/dist/validator.js.map +1 -0
  50. package/package.json +51 -0
package/dist/scan.js ADDED
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Output-side scanners. Applied to Action text, never to crawled input.
3
+ * Classifiers score ~60% on benign SEO trigger words — that is why we scan
4
+ * what we would write, not what we read.
5
+ */
6
+ function inRange(cp, a, b) {
7
+ return cp >= a && cp <= b;
8
+ }
9
+ function classifyInvisible(cp) {
10
+ if (inRange(cp, 0xe0000, 0xe007f))
11
+ return "tag_block";
12
+ if (cp === 0x200e ||
13
+ cp === 0x200f ||
14
+ inRange(cp, 0x202a, 0x202e) ||
15
+ inRange(cp, 0x2066, 0x2069)) {
16
+ return "bidi";
17
+ }
18
+ if (inRange(cp, 0x200b, 0x200d) || cp === 0x2060 || cp === 0xfeff || cp === 0x180e) {
19
+ return "zero_width";
20
+ }
21
+ if (cp === 0x00ad ||
22
+ cp === 0x034f ||
23
+ cp === 0x061c ||
24
+ cp === 0x115f ||
25
+ cp === 0x1160 ||
26
+ cp === 0x17b4 ||
27
+ cp === 0x17b5 ||
28
+ cp === 0x3164 ||
29
+ cp === 0xffa0) {
30
+ return "other_invisible";
31
+ }
32
+ if (inRange(cp, 0x00, 0x08) ||
33
+ cp === 0x0b ||
34
+ cp === 0x0c ||
35
+ inRange(cp, 0x0e, 0x1f) ||
36
+ inRange(cp, 0x7f, 0x9f)) {
37
+ return "ctrl";
38
+ }
39
+ if (inRange(cp, 0xfe00, 0xfe0f) || inRange(cp, 0xe0100, 0xe01ef))
40
+ return "variation";
41
+ return null;
42
+ }
43
+ export const BANNED_PATTERNS = [
44
+ { id: "ignore_previous", re: /ignore\s+(all\s+)?(previous|prior|above)/i },
45
+ { id: "disregard_previous", re: /disregard\s+(the\s+)?(previous|above)/i },
46
+ { id: "system_prompt", re: /system\s+prompt/i },
47
+ { id: "you_are_now", re: /you\s+are\s+(now\s+)?an?\s+/i },
48
+ { id: "system_tag", re: /<\/?system>/i },
49
+ { id: "special_token", re: /<\|.*?\|>/ },
50
+ { id: "inst_tag", re: /\[INST\]/i },
51
+ { id: "instruction_header", re: /###\s*Instruction/i },
52
+ { id: "assistant_colon", re: /\bassistant:/i },
53
+ { id: "developer_mode", re: /developer\s+mode/i },
54
+ { id: "do_anything_now", re: /do\s+anything\s+now/i },
55
+ { id: "jailbreak", re: /\bjailbreak\b/i },
56
+ { id: "prompt_injection", re: /prompt\s+injection/i },
57
+ { id: "ai_agent_colon", re: /AI\s+agent:/i },
58
+ { id: "llm_colon", re: /\bLLM:/ },
59
+ { id: "x_ai_colon", re: /\bX-AI:/i },
60
+ { id: "missing_license", re: /MissingLicenseKeyException/i },
61
+ { id: "eth_address", re: /\b0x[a-fA-F0-9]{40}\b/ },
62
+ { id: "bc1", re: /\bbc1[a-z0-9]{25,}\b/ },
63
+ { id: "rm_rf", re: /\brm\s+-rf\b/ },
64
+ { id: "drop_table", re: /\bDROP\s+TABLE\b/i },
65
+ { id: "script_tag", re: /<script\b/i },
66
+ { id: "javascript_url", re: /javascript:/i },
67
+ { id: "data_html", re: /data:text\/html/i },
68
+ ];
69
+ const CYRILLIC_FOLD = {
70
+ а: "a",
71
+ е: "e",
72
+ о: "o",
73
+ р: "p",
74
+ с: "c",
75
+ у: "y",
76
+ х: "x",
77
+ і: "i",
78
+ ѕ: "s",
79
+ ї: "i",
80
+ };
81
+ export function foldHomoglyphs(text) {
82
+ return [...text]
83
+ .map((ch) => {
84
+ const lower = ch.toLowerCase();
85
+ return CYRILLIC_FOLD[lower] ?? ch;
86
+ })
87
+ .join("");
88
+ }
89
+ export function invisibleHits(text) {
90
+ const kindSet = new Set();
91
+ let count = 0;
92
+ for (const ch of text) {
93
+ const kind = classifyInvisible(ch.codePointAt(0) ?? 0);
94
+ if (kind) {
95
+ count += 1;
96
+ kindSet.add(kind);
97
+ }
98
+ }
99
+ return { count, kinds: [...kindSet] };
100
+ }
101
+ export function stripInvisible(text) {
102
+ let out = "";
103
+ for (const ch of text) {
104
+ if (!classifyInvisible(ch.codePointAt(0) ?? 0))
105
+ out += ch;
106
+ }
107
+ return out;
108
+ }
109
+ export function bannedHits(text) {
110
+ const folded = foldHomoglyphs(text.normalize("NFKC"));
111
+ const hits = [];
112
+ for (const p of BANNED_PATTERNS) {
113
+ p.re.lastIndex = 0;
114
+ if (p.re.test(folded) || p.re.test(text))
115
+ hits.push(p.id);
116
+ }
117
+ return hits;
118
+ }
119
+ function tryDecodeBase64(chunk) {
120
+ if (chunk.length < 40 || chunk.length % 4 === 1)
121
+ return null;
122
+ if (!/^[A-Za-z0-9+/]+=*$/.test(chunk) && !/^[A-Za-z0-9_-]+=*$/.test(chunk))
123
+ return null;
124
+ try {
125
+ const buf = Buffer.from(chunk.replace(/-/g, "+").replace(/_/g, "/"), "base64");
126
+ if (buf.length < 8)
127
+ return null;
128
+ const s = buf.toString("utf8");
129
+ const printable = [...s].filter((c) => (c >= " " && c <= "~") || c === "\n").length;
130
+ if (printable / s.length < 0.6)
131
+ return null;
132
+ return s;
133
+ }
134
+ catch {
135
+ return null;
136
+ }
137
+ }
138
+ const BASE64_CHUNK = /[A-Za-z0-9+/_-]{40,}={0,2}/g;
139
+ const PCT_SEQ = /(?:%[0-9a-fA-F]{2}){8,}/g;
140
+ const ENTITY_SEQ = /(?:&#(?:x[0-9a-fA-F]+|\d+);){10,}/gi;
141
+ const U_ESCAPE = /(?:\\u[0-9a-fA-F]{4}){4,}/g;
142
+ const HEX_BLOB = /(?:[0-9a-fA-F]{2}){20,}/g;
143
+ function decodeEntities(seq) {
144
+ return seq
145
+ .replace(/&#x([0-9a-fA-F]+);/gi, (_, h) => String.fromCodePoint(Number.parseInt(h, 16)))
146
+ .replace(/&#(\d+);/g, (_, d) => String.fromCodePoint(Number.parseInt(d, 10)));
147
+ }
148
+ function rot13(s) {
149
+ return s.replace(/[a-zA-Z]/g, (ch) => {
150
+ const base = ch <= "Z" ? 65 : 97;
151
+ return String.fromCharCode(((ch.charCodeAt(0) - base + 13) % 26) + base);
152
+ });
153
+ }
154
+ export function encodedPayloadHits(text) {
155
+ const hits = [];
156
+ const candidates = [];
157
+ for (const m of text.match(BASE64_CHUNK) ?? []) {
158
+ const dec = tryDecodeBase64(m);
159
+ if (dec)
160
+ candidates.push(dec);
161
+ }
162
+ for (const m of text.match(PCT_SEQ) ?? []) {
163
+ try {
164
+ candidates.push(decodeURIComponent(m));
165
+ }
166
+ catch {
167
+ /* ignore */
168
+ }
169
+ }
170
+ for (const m of text.match(ENTITY_SEQ) ?? []) {
171
+ candidates.push(decodeEntities(m));
172
+ }
173
+ for (const m of text.match(U_ESCAPE) ?? []) {
174
+ candidates.push(m.replace(/\\u([0-9a-fA-F]{4})/g, (_, h) => String.fromCharCode(Number.parseInt(h, 16))));
175
+ }
176
+ for (const m of text.match(HEX_BLOB) ?? []) {
177
+ try {
178
+ const buf = Buffer.from(m, "hex");
179
+ const s = buf.toString("utf8");
180
+ const printable = [...s].filter((c) => c >= " " && c <= "~").length;
181
+ if (s.length && printable / s.length >= 0.6)
182
+ candidates.push(s);
183
+ }
184
+ catch {
185
+ /* ignore */
186
+ }
187
+ }
188
+ candidates.push(rot13(text));
189
+ for (const c of candidates) {
190
+ const banned = bannedHits(c);
191
+ if (banned.length)
192
+ hits.push(...banned.map((id) => `encoded:${id}`));
193
+ }
194
+ return [...new Set(hits)];
195
+ }
196
+ export function collectActionText(value) {
197
+ if (typeof value === "string")
198
+ return value;
199
+ if (typeof value === "number" || typeof value === "boolean")
200
+ return String(value);
201
+ if (Array.isArray(value))
202
+ return value.map(collectActionText).join("\n");
203
+ if (value && typeof value === "object") {
204
+ return Object.values(value)
205
+ .map(collectActionText)
206
+ .join("\n");
207
+ }
208
+ return "";
209
+ }
210
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ import type { ActionKind } from "./kinds.js";
2
+ export type AutonomyTier = 0 | 1 | 2 | 3 | 4;
3
+ export type ActionTarget = {
4
+ pageId: string;
5
+ url: string;
6
+ };
7
+ /** Default metric is clicks — GSC impressions were contaminated 2025-05-13 → 2026-04-27. */
8
+ export type Impact = {
9
+ metric: "clicks";
10
+ estimate: number;
11
+ confidence: number;
12
+ };
13
+ export type TitlePayload = {
14
+ title: string;
15
+ };
16
+ export type MetaPayload = {
17
+ metaDescription: string;
18
+ };
19
+ export type AltPayload = {
20
+ selector: string;
21
+ alt: string;
22
+ };
23
+ export type HeadingPayload = {
24
+ level: 1 | 2 | 3 | 4 | 5 | 6;
25
+ text: string;
26
+ };
27
+ export type InternalLinkPayload = {
28
+ hrefPageId: string;
29
+ hrefUrl: string;
30
+ anchor: string;
31
+ };
32
+ export type JsonLdPayload = {
33
+ type: string;
34
+ json: Record<string, unknown>;
35
+ };
36
+ export type ContentPayload = {
37
+ body: string;
38
+ };
39
+ export type CreatePagePayload = {
40
+ path: string;
41
+ title: string;
42
+ body: string;
43
+ };
44
+ export type RobotsTxtPayload = {
45
+ body: string;
46
+ };
47
+ export type MetaRobotsPayload = {
48
+ content: string;
49
+ };
50
+ export type RedirectPayload = {
51
+ fromPageId: string;
52
+ fromUrl: string;
53
+ toPageId: string;
54
+ toUrl: string;
55
+ status: 301 | 410;
56
+ };
57
+ export type CanonicalPayload = {
58
+ canonicalPageId: string;
59
+ canonicalUrl: string;
60
+ };
61
+ export type HreflangPayload = {
62
+ lang: string;
63
+ hrefPageId: string;
64
+ hrefUrl: string;
65
+ };
66
+ export type SitemapPayload = {
67
+ sitemapUrl: string;
68
+ };
69
+ export type ImageDimPayload = {
70
+ selector: string;
71
+ width: number;
72
+ height: number;
73
+ };
74
+ export type LangPayload = {
75
+ lang: string;
76
+ };
77
+ export type ViewportPayload = {
78
+ content: string;
79
+ };
80
+ export type EmptyPayload = Record<string, never>;
81
+ export type RefusedPayload = {
82
+ reason: string;
83
+ };
84
+ export type ActionPayload = TitlePayload | MetaPayload | AltPayload | HeadingPayload | InternalLinkPayload | JsonLdPayload | ContentPayload | CreatePagePayload | RobotsTxtPayload | MetaRobotsPayload | RedirectPayload | CanonicalPayload | HreflangPayload | SitemapPayload | ImageDimPayload | LangPayload | ViewportPayload | EmptyPayload | RefusedPayload;
85
+ export type Action = {
86
+ id: string;
87
+ siteId: string;
88
+ kind: ActionKind;
89
+ tier: AutonomyTier;
90
+ target: ActionTarget;
91
+ payload: ActionPayload;
92
+ rationale: string[];
93
+ findingIds: string[];
94
+ estimatedImpact: Impact;
95
+ };
96
+ export type Veto = {
97
+ check: number;
98
+ code: string;
99
+ detail: string;
100
+ };
101
+ export type ValidationOk = {
102
+ ok: true;
103
+ };
104
+ export type ValidationReject = {
105
+ ok: false;
106
+ vetoes: Veto[];
107
+ };
108
+ export type ValidationResult = ValidationOk | ValidationReject;
109
+ export type EntitySource = "crawl" | "user" | "third_party";
110
+ export type SitePolicy = {
111
+ id: string;
112
+ origin: string;
113
+ autonomyMode: string;
114
+ observeUntil: string | null;
115
+ ymylCategory: string | null;
116
+ killswitch: number;
117
+ neverTouchGlobs: string[];
118
+ createdAt: string;
119
+ };
120
+ export type PageRow = {
121
+ id: string;
122
+ url: string;
123
+ title: string | null;
124
+ metaDescription: string | null;
125
+ h1: string | null;
126
+ };
127
+ export type EntityRow = {
128
+ entity: string;
129
+ source: EntitySource;
130
+ };
131
+ export type TwoKeyApproval = {
132
+ actor: string;
133
+ hmac: string;
134
+ };
135
+ export type ValidationContext = {
136
+ now: Date;
137
+ site: SitePolicy;
138
+ pages: PageRow[];
139
+ allowlist: string[];
140
+ entities: EntityRow[];
141
+ appliedThisRun: number;
142
+ appliedThisHour: number;
143
+ appliedThisDay: number;
144
+ newPagesToday: number;
145
+ contentRefreshToday: number;
146
+ spentUsdToday: number;
147
+ budgetUsdDaily: number;
148
+ estimatedCostUsd: number;
149
+ twoKeyApprovals: TwoKeyApproval[];
150
+ halted: boolean;
151
+ beforeText: string;
152
+ afterText: string;
153
+ runId: string;
154
+ /** HMAC key used to verify two-key signatures. */
155
+ approvalKey: Buffer;
156
+ };
157
+ export type AdapterCapabilities = {
158
+ kind: string;
159
+ reads: boolean;
160
+ writes: boolean;
161
+ pullRequests: boolean;
162
+ rollback: boolean;
163
+ };
164
+ export type AdapterRead = {
165
+ targetRef: string;
166
+ body: string;
167
+ contentType: string;
168
+ };
169
+ export type AdapterDryRun = {
170
+ targetRef: string;
171
+ before: string;
172
+ after: string;
173
+ summary: string;
174
+ };
175
+ export type AdapterApplyResult = {
176
+ targetRef: string;
177
+ before: string;
178
+ after: string;
179
+ summary: string;
180
+ branch?: string | undefined;
181
+ commitSha?: string | undefined;
182
+ prUrl?: string | undefined;
183
+ diff?: string | undefined;
184
+ };
185
+ export type AppliedChange = {
186
+ id: string;
187
+ actionId: string;
188
+ siteId: string;
189
+ targetRef: string;
190
+ before: string;
191
+ after: string;
192
+ summary: string;
193
+ branch?: string | undefined;
194
+ commitSha?: string | undefined;
195
+ prUrl?: string | undefined;
196
+ };
197
+ export type AdapterVerifyResult = {
198
+ ok: boolean;
199
+ detail: string;
200
+ };
201
+ export type SiteAdapter = {
202
+ kind: string;
203
+ capabilities(): AdapterCapabilities;
204
+ read(target: ActionTarget): Promise<AdapterRead>;
205
+ dryRun(action: Action): Promise<AdapterDryRun>;
206
+ apply(action: Action): Promise<AdapterApplyResult>;
207
+ verify(change: AppliedChange): Promise<AdapterVerifyResult>;
208
+ rollback(change: AppliedChange): Promise<AdapterApplyResult>;
209
+ };
210
+ export declare const DIFF_CAPS: Record<string, {
211
+ maxBytes: number;
212
+ maxPct: number;
213
+ }>;
214
+ export declare const BLAST: {
215
+ readonly maxUrlsPerRun: 25;
216
+ readonly maxPerHour: 40;
217
+ readonly maxPerDay: 80;
218
+ readonly newPagesPerDay: 2;
219
+ readonly contentRefreshPerDay: 2;
220
+ };
221
+ export declare const TITLE_MAX = 70;
222
+ export declare const META_MAX = 320;
223
+ export declare const ALT_MAX = 200;
224
+ export declare const ANCHOR_MAX = 80;
225
+ export declare const OBSERVE_MIN_MS: number;
226
+ export declare const OBSERVE_DEFAULT_MS: number;
227
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,29 @@
1
+ export const DIFF_CAPS = {
2
+ rewrite_title: { maxBytes: 120, maxPct: 100 },
3
+ rewrite_meta_description: { maxBytes: 400, maxPct: 100 },
4
+ rewrite_og_title: { maxBytes: 120, maxPct: 100 },
5
+ rewrite_og_description: { maxBytes: 400, maxPct: 100 },
6
+ rewrite_alt_text: { maxBytes: 250, maxPct: 100 },
7
+ fix_heading: { maxBytes: 200, maxPct: 20 },
8
+ add_h1: { maxBytes: 200, maxPct: 20 },
9
+ insert_internal_link: { maxBytes: 400, maxPct: 5 },
10
+ add_jsonld: { maxBytes: 4000, maxPct: 20 },
11
+ update_jsonld: { maxBytes: 4000, maxPct: 20 },
12
+ refresh_content: { maxBytes: 40_000, maxPct: 400 },
13
+ create_page: { maxBytes: 40_000, maxPct: 100 },
14
+ default: { maxBytes: 2000, maxPct: 15 },
15
+ };
16
+ export const BLAST = {
17
+ maxUrlsPerRun: 25,
18
+ maxPerHour: 40,
19
+ maxPerDay: 80,
20
+ newPagesPerDay: 2,
21
+ contentRefreshPerDay: 2,
22
+ };
23
+ export const TITLE_MAX = 70;
24
+ export const META_MAX = 320;
25
+ export const ALT_MAX = 200;
26
+ export const ANCHOR_MAX = 80;
27
+ export const OBSERVE_MIN_MS = 24 * 60 * 60 * 1000;
28
+ export const OBSERVE_DEFAULT_MS = 7 * 24 * 60 * 60 * 1000;
29
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA+MA,MAAM,CAAC,MAAM,SAAS,GAAyD;IAC7E,aAAa,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC7C,wBAAwB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IACxD,gBAAgB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAChD,sBAAsB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IACtD,gBAAgB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAChD,WAAW,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IAC1C,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IACrC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;IAClD,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;IAC1C,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7C,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE;IAClD,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE;IAC9C,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;CACxC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE;IACd,SAAS,EAAE,EAAE;IACb,cAAc,EAAE,CAAC;IACjB,oBAAoB,EAAE,CAAC;CACf,CAAC;AAEX,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAC5B,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5B,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC;AAC3B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
package/dist/urls.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare function extractUrls(value: unknown): string[];
2
+ export declare function extractDomains(value: unknown): string[];
3
+ export declare function registrableHint(hostname: string): string;
4
+ export declare function sameSite(url: string, origin: string): boolean;
5
+ export declare function matchGlob(url: string, glob: string): boolean;
6
+ //# sourceMappingURL=urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../src/urls.ts"],"names":[],"mappings":"AAiBA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAepD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAevD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAG5D"}
package/dist/urls.js ADDED
@@ -0,0 +1,74 @@
1
+ const URL_RE = /https?:\/\/[^\s"'<>\\]+/gi;
2
+ const DOMAIN_RE = /\b(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}\b/gi;
3
+ function walk(value, into) {
4
+ if (typeof value === "string") {
5
+ into.push(value);
6
+ return;
7
+ }
8
+ if (Array.isArray(value)) {
9
+ for (const v of value)
10
+ walk(v, into);
11
+ return;
12
+ }
13
+ if (value && typeof value === "object") {
14
+ for (const v of Object.values(value))
15
+ walk(v, into);
16
+ }
17
+ }
18
+ export function extractUrls(value) {
19
+ const strings = [];
20
+ walk(value, strings);
21
+ const out = new Set();
22
+ for (const s of strings) {
23
+ for (const m of s.match(URL_RE) ?? []) {
24
+ try {
25
+ const u = new URL(m.replace(/[),.;]+$/, ""));
26
+ if (u.protocol === "http:" || u.protocol === "https:")
27
+ out.add(u.href);
28
+ }
29
+ catch {
30
+ /* ignore */
31
+ }
32
+ }
33
+ }
34
+ return [...out];
35
+ }
36
+ export function extractDomains(value) {
37
+ const strings = [];
38
+ walk(value, strings);
39
+ const out = new Set();
40
+ for (const s of strings) {
41
+ for (const m of s.match(DOMAIN_RE) ?? []) {
42
+ out.add(m.toLowerCase());
43
+ }
44
+ try {
45
+ if (/^https?:\/\//i.test(s))
46
+ out.add(new URL(s).hostname.toLowerCase());
47
+ }
48
+ catch {
49
+ /* ignore */
50
+ }
51
+ }
52
+ return [...out];
53
+ }
54
+ export function registrableHint(hostname) {
55
+ const parts = hostname.toLowerCase().split(".").filter(Boolean);
56
+ if (parts.length <= 2)
57
+ return parts.join(".");
58
+ return parts.slice(-2).join(".");
59
+ }
60
+ export function sameSite(url, origin) {
61
+ try {
62
+ const a = new URL(url);
63
+ const b = new URL(origin);
64
+ return registrableHint(a.hostname) === registrableHint(b.hostname);
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ export function matchGlob(url, glob) {
71
+ const escaped = glob.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
72
+ return new RegExp(`^${escaped}$`, "i").test(url);
73
+ }
74
+ //# sourceMappingURL=urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../src/urls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Action, type ValidationContext, type ValidationResult } from "./types.js";
2
+ /**
3
+ * Deterministic reference monitor. No network, no LLM. Every check can veto.
4
+ * Checks are independent: we collect all vetoes rather than failing closed on the first,
5
+ * so the red-team suite can assert on stable codes.
6
+ */
7
+ export declare function validateAction(raw: unknown, ctx: ValidationContext): ValidationResult;
8
+ export declare function validateParsed(action: Action, ctx: ValidationContext): ValidationResult;
9
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAgBA,OAAO,EAKL,KAAK,MAAM,EACX,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAEtB,MAAM,YAAY,CAAC;AAkbpB;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,GAAG,gBAAgB,CAsBrF;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,iBAAiB,GACrB,gBAAgB,CAElB"}