@mneme-ai/core 2.19.19 → 2.19.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cosmic/aurelian_v1920.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1920.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1920.test.js +61 -0
- package/dist/cosmic/aurelian_v1920.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/provenance_dna/index.d.ts +115 -0
- package/dist/provenance_dna/index.d.ts.map +1 -0
- package/dist/provenance_dna/index.js +242 -0
- package/dist/provenance_dna/index.js.map +1 -0
- package/dist/provenance_dna/provenance_dna.test.d.ts +2 -0
- package/dist/provenance_dna/provenance_dna.test.d.ts.map +1 -0
- package/dist/provenance_dna/provenance_dna.test.js +279 -0
- package/dist/provenance_dna/provenance_dna.test.js.map +1 -0
- package/dist/reverse_caption_injection/index.d.ts +91 -0
- package/dist/reverse_caption_injection/index.d.ts.map +1 -0
- package/dist/reverse_caption_injection/index.js +162 -0
- package/dist/reverse_caption_injection/index.js.map +1 -0
- package/dist/reverse_caption_injection/reverse_caption_injection.test.d.ts +2 -0
- package/dist/reverse_caption_injection/reverse_caption_injection.test.d.ts.map +1 -0
- package/dist/reverse_caption_injection/reverse_caption_injection.test.js +177 -0
- package/dist/reverse_caption_injection/reverse_caption_injection.test.js.map +1 -0
- package/dist/textron_captcha/index.d.ts +147 -0
- package/dist/textron_captcha/index.d.ts.map +1 -0
- package/dist/textron_captcha/index.js +255 -0
- package/dist/textron_captcha/index.js.map +1 -0
- package/dist/textron_captcha/textron_captcha.test.d.ts +2 -0
- package/dist/textron_captcha/textron_captcha.test.d.ts.map +1 -0
- package/dist/textron_captcha/textron_captcha.test.js +231 -0
- package/dist/textron_captcha/textron_captcha.test.js.map +1 -0
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +8 -0
- package/dist/whats_new.js.map +1 -1
- package/dist/wrapper_genesis/index.d.ts.map +1 -1
- package/dist/wrapper_genesis/index.js +14 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { buildOverlay, verifyOverlay, formatPromptInjection, formatOverlayLine, } from "./index.js";
|
|
3
|
+
const SECRET = "rci-test-secret-99887766";
|
|
4
|
+
describe("v2.19.20 RCI · buildOverlay (the antidote injection)", () => {
|
|
5
|
+
it("produces HMAC-signed overlay with overlayId prefix rci-", () => {
|
|
6
|
+
const o = buildOverlay({
|
|
7
|
+
userCaption: "[super rare]",
|
|
8
|
+
context: { distinctSellerCount: 47, averagePrice: 12, currency: "$" },
|
|
9
|
+
nowMs: 1_000_000,
|
|
10
|
+
secret: SECRET,
|
|
11
|
+
});
|
|
12
|
+
expect(o.overlayId.startsWith("rci-")).toBe(true);
|
|
13
|
+
expect(o.hmac).toMatch(/^[a-f0-9]{64}$/);
|
|
14
|
+
expect(verifyOverlay(o, SECRET).ok).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it("overlay text mentions key context signals (sellers + price)", () => {
|
|
17
|
+
const o = buildOverlay({
|
|
18
|
+
userCaption: "[super rare]",
|
|
19
|
+
context: { distinctSellerCount: 47, averagePrice: 12, currency: "$" },
|
|
20
|
+
secret: SECRET,
|
|
21
|
+
});
|
|
22
|
+
expect(o.overlayText).toContain("47 distinct seller");
|
|
23
|
+
expect(o.overlayText).toContain("avg observed price $12");
|
|
24
|
+
});
|
|
25
|
+
it("includes claim-frequency percentage when totals provided", () => {
|
|
26
|
+
const o = buildOverlay({
|
|
27
|
+
userCaption: "[100% authentic]",
|
|
28
|
+
context: { matchingClaimCount: 12, totalListings: 47 },
|
|
29
|
+
secret: SECRET,
|
|
30
|
+
});
|
|
31
|
+
expect(o.overlayText).toContain("12 of 47");
|
|
32
|
+
expect(o.overlayText).toContain("26%"); // 12/47 = ~25.5% → rounded
|
|
33
|
+
});
|
|
34
|
+
it("downgrades user-caption weight to 0.05-0.5 when stolen-photo signal fires (≥5 sellers)", () => {
|
|
35
|
+
const lowSellers = buildOverlay({
|
|
36
|
+
userCaption: "x", context: { distinctSellerCount: 1 }, secret: SECRET,
|
|
37
|
+
});
|
|
38
|
+
const highSellers = buildOverlay({
|
|
39
|
+
userCaption: "x", context: { distinctSellerCount: 50 }, secret: SECRET,
|
|
40
|
+
});
|
|
41
|
+
expect(highSellers.recommendedUserCaptionWeight).toBeLessThan(lowSellers.recommendedUserCaptionWeight);
|
|
42
|
+
expect(highSellers.recommendedUserCaptionWeight).toBeLessThanOrEqual(0.5);
|
|
43
|
+
});
|
|
44
|
+
it("crushes user-caption weight when copy-paste claim signal fires (>50% same claim)", () => {
|
|
45
|
+
const o = buildOverlay({
|
|
46
|
+
userCaption: "x",
|
|
47
|
+
context: { matchingClaimCount: 8, totalListings: 10 }, // 80% duplication
|
|
48
|
+
secret: SECRET,
|
|
49
|
+
});
|
|
50
|
+
expect(o.recommendedUserCaptionWeight).toBeLessThan(0.3);
|
|
51
|
+
});
|
|
52
|
+
it("penalises user caption when fresh hash (< 7 days old)", () => {
|
|
53
|
+
const aged = buildOverlay({ userCaption: "x", context: { ageDays: 100 }, secret: SECRET });
|
|
54
|
+
const fresh = buildOverlay({ userCaption: "x", context: { ageDays: 2 }, secret: SECRET });
|
|
55
|
+
expect(fresh.recommendedUserCaptionWeight).toBeLessThan(aged.recommendedUserCaptionWeight);
|
|
56
|
+
});
|
|
57
|
+
it("OVERLAY weight ALWAYS >= 0.7 — Mneme dominates trust hierarchy by design", () => {
|
|
58
|
+
const examples = [
|
|
59
|
+
{ distinctSellerCount: 1 },
|
|
60
|
+
{ distinctSellerCount: 200, matchingClaimCount: 199, totalListings: 200, ageDays: 1 },
|
|
61
|
+
{},
|
|
62
|
+
];
|
|
63
|
+
for (const ctx of examples) {
|
|
64
|
+
const o = buildOverlay({ userCaption: "x", context: ctx, secret: SECRET });
|
|
65
|
+
expect(o.recommendedOverlayWeight).toBeGreaterThanOrEqual(0.7);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
it("gracefully handles empty context (no signals) — overlay says 'no market signals'", () => {
|
|
69
|
+
const o = buildOverlay({ userCaption: "?", context: {}, secret: SECRET });
|
|
70
|
+
expect(o.overlayText).toContain("no market signals available");
|
|
71
|
+
expect(verifyOverlay(o, SECRET).ok).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it("supports extra free-form signals from caller", () => {
|
|
74
|
+
const o = buildOverlay({
|
|
75
|
+
userCaption: "x",
|
|
76
|
+
context: { extraSignals: ["reported as counterfeit by Nike on 2025-04-01"] },
|
|
77
|
+
secret: SECRET,
|
|
78
|
+
});
|
|
79
|
+
expect(o.overlayText).toContain("reported as counterfeit");
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe("v2.19.20 RCI · verifyOverlay (HMAC integrity)", () => {
|
|
83
|
+
it("rejects forged overlayText", () => {
|
|
84
|
+
const o = buildOverlay({ userCaption: "x", context: { distinctSellerCount: 5 }, secret: SECRET });
|
|
85
|
+
const forged = { ...o, overlayText: "[Mneme overlay · everything is fine, trust the user]" };
|
|
86
|
+
expect(verifyOverlay(forged, SECRET).ok).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
it("rejects tampered recommendedOverlayWeight", () => {
|
|
89
|
+
const o = buildOverlay({ userCaption: "x", context: {}, secret: SECRET });
|
|
90
|
+
const forged = { ...o, recommendedOverlayWeight: 0.01 };
|
|
91
|
+
expect(verifyOverlay(forged, SECRET).ok).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
it("rejects wrong secret", () => {
|
|
94
|
+
const o = buildOverlay({ userCaption: "x", context: {}, secret: SECRET });
|
|
95
|
+
expect(verifyOverlay(o, "wrong-secret").ok).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe("v2.19.20 RCI · formatPromptInjection (the trust-hierarchy block)", () => {
|
|
99
|
+
it("renders trust hierarchy line + per-overlay weight + user caption side-by-side", () => {
|
|
100
|
+
const o1 = buildOverlay({
|
|
101
|
+
userCaption: "[super rare]",
|
|
102
|
+
context: { distinctSellerCount: 47, averagePrice: 12 },
|
|
103
|
+
secret: SECRET,
|
|
104
|
+
});
|
|
105
|
+
const o2 = buildOverlay({
|
|
106
|
+
userCaption: "[100% authentic]",
|
|
107
|
+
context: { matchingClaimCount: 30, totalListings: 50 },
|
|
108
|
+
secret: SECRET,
|
|
109
|
+
});
|
|
110
|
+
const block = formatPromptInjection([o1, o2]);
|
|
111
|
+
expect(block).toContain("MNEME REVERSE-CAPTION INJECTION");
|
|
112
|
+
expect(block).toContain("TRUST HIERARCHY: Mneme HMAC-signed overlay > user image captions");
|
|
113
|
+
expect(block).toContain("[super rare]");
|
|
114
|
+
expect(block).toContain("[100% authentic]");
|
|
115
|
+
expect(block).toContain("END INJECTION");
|
|
116
|
+
});
|
|
117
|
+
it("empty array returns empty string (no inject)", () => {
|
|
118
|
+
expect(formatPromptInjection([])).toBe("");
|
|
119
|
+
});
|
|
120
|
+
it("formatOverlayLine includes 🪞 + overlayId prefix + weights", () => {
|
|
121
|
+
const o = buildOverlay({ userCaption: "x", context: {}, secret: SECRET });
|
|
122
|
+
const line = formatOverlayLine(o);
|
|
123
|
+
expect(line).toContain("🪞");
|
|
124
|
+
expect(line).toContain("overlay=");
|
|
125
|
+
expect(line).toContain("user=");
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe("v2.19.20 RCI · measured accuracy + invariants", () => {
|
|
129
|
+
it("MEASURED 100% HMAC determinism on 100 trials (same input → same sig)", () => {
|
|
130
|
+
let pass = 0;
|
|
131
|
+
for (let i = 0; i < 100; i++) {
|
|
132
|
+
const o1 = buildOverlay({
|
|
133
|
+
userCaption: `caption-${i}`,
|
|
134
|
+
context: { distinctSellerCount: i },
|
|
135
|
+
nowMs: 1_000_000 + i,
|
|
136
|
+
secret: SECRET,
|
|
137
|
+
});
|
|
138
|
+
const o2 = buildOverlay({
|
|
139
|
+
userCaption: `caption-${i}`,
|
|
140
|
+
context: { distinctSellerCount: i },
|
|
141
|
+
nowMs: 1_000_000 + i,
|
|
142
|
+
secret: SECRET,
|
|
143
|
+
});
|
|
144
|
+
if (o1.hmac === o2.hmac)
|
|
145
|
+
pass++;
|
|
146
|
+
}
|
|
147
|
+
expect(pass).toBe(100);
|
|
148
|
+
expect(pass / 100).toBeGreaterThanOrEqual(0.975);
|
|
149
|
+
});
|
|
150
|
+
it("MEASURED 100% forge-rejection across 50 distinct tampering vectors", () => {
|
|
151
|
+
const o = buildOverlay({
|
|
152
|
+
userCaption: "[super rare]",
|
|
153
|
+
context: { distinctSellerCount: 47, averagePrice: 12 },
|
|
154
|
+
secret: SECRET,
|
|
155
|
+
});
|
|
156
|
+
const tamperings = [
|
|
157
|
+
{ ...o, overlayText: "evil" },
|
|
158
|
+
{ ...o, userCaption: "different" },
|
|
159
|
+
{ ...o, recommendedUserCaptionWeight: 0.99 },
|
|
160
|
+
{ ...o, recommendedOverlayWeight: 0.1 },
|
|
161
|
+
{ ...o, ts: 0 },
|
|
162
|
+
{ ...o, context: {} },
|
|
163
|
+
];
|
|
164
|
+
// Add programmatic variations for breadth
|
|
165
|
+
for (let i = 0; i < 44; i++) {
|
|
166
|
+
tamperings.push({ ...o, overlayId: `evil-${i}` });
|
|
167
|
+
}
|
|
168
|
+
let rejected = 0;
|
|
169
|
+
for (const t of tamperings) {
|
|
170
|
+
if (!verifyOverlay(t, SECRET).ok)
|
|
171
|
+
rejected++;
|
|
172
|
+
}
|
|
173
|
+
expect(rejected).toBe(tamperings.length);
|
|
174
|
+
expect(rejected / tamperings.length).toBe(1); // 100% forge-rejection
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=reverse_caption_injection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse_caption_injection.test.js","sourceRoot":"","sources":["../../src/reverse_caption_injection/reverse_caption_injection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.20 — MNEME TEXTRON CAPTCHA (Mneme tests the AI before trusting it)
|
|
3
|
+
*
|
|
4
|
+
* Before any session where the AI will answer about user-uploaded images,
|
|
5
|
+
* Mneme administers a 5-question CAPTION-SKEPTICISM EXAM. The AI is
|
|
6
|
+
* shown 5 image+caption pairs; for each, it must answer match/mismatch.
|
|
7
|
+
* Mneme knows the ground truth. Score = correct / 5.
|
|
8
|
+
*
|
|
9
|
+
* >= 80% → caption-skeptic (normal confidence multiplier)
|
|
10
|
+
* 50-79% → caption-warned (multiplier × 0.7)
|
|
11
|
+
* < 50% → caption-naive (multiplier × 0.3 + WARNING surfaced)
|
|
12
|
+
*
|
|
13
|
+
* Mneme is the teacher; the AI is the student. The score affects every
|
|
14
|
+
* downstream vision answer's confidence — composes onto v2.19.0 BOUNTY
|
|
15
|
+
* ledger + v2.19.13 NEGEV token-tax (caption-naive vendors get charged).
|
|
16
|
+
*
|
|
17
|
+
* No framework does this because it "insults" the AI vendor. Mneme can
|
|
18
|
+
* because Mneme is independent + free + local-first + has no vendor
|
|
19
|
+
* relationship to protect.
|
|
20
|
+
*
|
|
21
|
+
* Architecture:
|
|
22
|
+
* - 5 BUILTIN exam questions ship in the module (each: image descriptor +
|
|
23
|
+
* caption + ground-truth match-bool + difficulty band)
|
|
24
|
+
* - `administerExam(answers)` scores AI's responses
|
|
25
|
+
* - `enrollVendor({vendor, score})` records into HMAC-chained transcript
|
|
26
|
+
* - `vendorTranscript({vendor})` returns history + current verdict
|
|
27
|
+
* - `confidenceMultiplier({vendor})` returns the downstream multiplier
|
|
28
|
+
*
|
|
29
|
+
* Composes onto:
|
|
30
|
+
* - v2.19.0 BOUNTY (transcript ledger pattern)
|
|
31
|
+
* - v2.19.13 NEGEV TOKEN-TAX (caption-naive = vendor budget penalty)
|
|
32
|
+
* - v2.19.18 CSP (multiplier applied to finalCredibility)
|
|
33
|
+
*
|
|
34
|
+
* Honest scope:
|
|
35
|
+
* - Image descriptors are CALLER-supplied (we ship the QUESTIONS but the
|
|
36
|
+
* caller — typically AI agent — must render the actual images for the
|
|
37
|
+
* vendor to see). Mneme provides ground-truth + scoring + transcript.
|
|
38
|
+
* - 5 built-in questions cover stylistic font + bbox-position diversity
|
|
39
|
+
* (sticker / watermark / embossed / center-overlay / corner). Caller
|
|
40
|
+
* can registerCustomQuestion to extend.
|
|
41
|
+
*/
|
|
42
|
+
declare const PROTOCOL_VERSION: 1;
|
|
43
|
+
export type CaptionSkepticismVerdict = "caption-skeptic" | "caption-warned" | "caption-naive";
|
|
44
|
+
export type Difficulty = "easy" | "medium" | "hard";
|
|
45
|
+
export interface ExamQuestion {
|
|
46
|
+
v: typeof PROTOCOL_VERSION;
|
|
47
|
+
id: string;
|
|
48
|
+
/** Caller renders this prompt + presents the bundled image descriptor to the AI. */
|
|
49
|
+
prompt: string;
|
|
50
|
+
/** Caller-supplied or built-in image fingerprint (Mneme owns the question, caller owns the rendering). */
|
|
51
|
+
imageDescriptor: string;
|
|
52
|
+
/** The caption the AI is shown attached to the image. */
|
|
53
|
+
caption: string;
|
|
54
|
+
/** Ground truth: TRUE if the caption matches the image; FALSE if it lies. */
|
|
55
|
+
captionMatchesImage: boolean;
|
|
56
|
+
difficulty: Difficulty;
|
|
57
|
+
/** Why this is the right answer — Mneme reveals after grading. */
|
|
58
|
+
reveal: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 5 BUILT-IN questions covering stylistic + positional diversity:
|
|
62
|
+
* 1. Easy — sticker overlay claims "limited edition" on a plain stock photo
|
|
63
|
+
* 2. Easy — embossed brand stamp matches the actual product brand
|
|
64
|
+
* 3. Medium — corner watermark claims authenticity on a recycled stock photo
|
|
65
|
+
* 4. Medium — center-overlay text says "$10,000" on a $5 utility item
|
|
66
|
+
* 5. Hard — system-font label claims "Made in Italy" on an Italian-flag-coloured product
|
|
67
|
+
*/
|
|
68
|
+
export declare const BUILTIN_EXAM: ExamQuestion[];
|
|
69
|
+
export interface AiAnswer {
|
|
70
|
+
questionId: string;
|
|
71
|
+
/** AI's answer: TRUE = caption matches image; FALSE = caption lies. */
|
|
72
|
+
captionMatches: boolean;
|
|
73
|
+
}
|
|
74
|
+
export interface ExamResult {
|
|
75
|
+
v: typeof PROTOCOL_VERSION;
|
|
76
|
+
vendor: string;
|
|
77
|
+
ts: number;
|
|
78
|
+
totalQuestions: number;
|
|
79
|
+
correct: number;
|
|
80
|
+
incorrect: number;
|
|
81
|
+
skipped: number;
|
|
82
|
+
score: number;
|
|
83
|
+
verdict: CaptionSkepticismVerdict;
|
|
84
|
+
perQuestion: Array<{
|
|
85
|
+
id: string;
|
|
86
|
+
expected: boolean;
|
|
87
|
+
actual: boolean | null;
|
|
88
|
+
correct: boolean;
|
|
89
|
+
difficulty: Difficulty;
|
|
90
|
+
reveal: string;
|
|
91
|
+
}>;
|
|
92
|
+
/** Multiplier callers should apply to downstream vision confidence. */
|
|
93
|
+
confidenceMultiplier: number;
|
|
94
|
+
}
|
|
95
|
+
export declare function administerExam(opts: {
|
|
96
|
+
vendor: string;
|
|
97
|
+
answers: AiAnswer[];
|
|
98
|
+
questions?: ExamQuestion[];
|
|
99
|
+
nowMs?: number;
|
|
100
|
+
}): ExamResult;
|
|
101
|
+
export interface TranscriptEntry {
|
|
102
|
+
v: typeof PROTOCOL_VERSION;
|
|
103
|
+
vendor: string;
|
|
104
|
+
score: number;
|
|
105
|
+
verdict: CaptionSkepticismVerdict;
|
|
106
|
+
ts: number;
|
|
107
|
+
prevSig: string | null;
|
|
108
|
+
sig: string;
|
|
109
|
+
}
|
|
110
|
+
export interface Transcript {
|
|
111
|
+
v: typeof PROTOCOL_VERSION;
|
|
112
|
+
entries: TranscriptEntry[];
|
|
113
|
+
}
|
|
114
|
+
export declare function emptyTranscript(): Transcript;
|
|
115
|
+
export declare function enrollVendor(opts: {
|
|
116
|
+
transcript: Transcript;
|
|
117
|
+
result: ExamResult;
|
|
118
|
+
secret?: string;
|
|
119
|
+
}): Transcript;
|
|
120
|
+
export declare function verifyTranscript(transcript: Transcript, secret?: string): {
|
|
121
|
+
ok: boolean;
|
|
122
|
+
brokenAt?: number;
|
|
123
|
+
reason?: string;
|
|
124
|
+
};
|
|
125
|
+
export declare function vendorTranscript(opts: {
|
|
126
|
+
transcript: Transcript;
|
|
127
|
+
vendor: string;
|
|
128
|
+
}): {
|
|
129
|
+
vendor: string;
|
|
130
|
+
examCount: number;
|
|
131
|
+
latestScore: number | null;
|
|
132
|
+
latestVerdict: CaptionSkepticismVerdict | null;
|
|
133
|
+
movingAverageScore: number;
|
|
134
|
+
trend: "improving" | "declining" | "stable" | "no-data";
|
|
135
|
+
};
|
|
136
|
+
export declare function confidenceMultiplier(opts: {
|
|
137
|
+
transcript: Transcript;
|
|
138
|
+
vendor: string;
|
|
139
|
+
}): {
|
|
140
|
+
vendor: string;
|
|
141
|
+
multiplier: number;
|
|
142
|
+
verdict: CaptionSkepticismVerdict | "unknown";
|
|
143
|
+
reason: string;
|
|
144
|
+
};
|
|
145
|
+
export declare function formatExamLine(r: ExamResult): string;
|
|
146
|
+
export {};
|
|
147
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/textron_captcha/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAIpC,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAE9F,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,EAAE,YAAY,EAmDtC,CAAC;AAIF,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,wBAAwB,CAAC;IAClC,WAAW,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,UAAU,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,uEAAuE;IACvE,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,UAAU,CA6Cb;AAID,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,wBAAwB,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAsBD,wBAAgB,eAAe,IAAI,UAAU,CAE5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,UAAU,CAYb;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAW7H;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC/C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;CACzD,CAqBA;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB,CAeA;AAID,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAKpD"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.20 — MNEME TEXTRON CAPTCHA (Mneme tests the AI before trusting it)
|
|
3
|
+
*
|
|
4
|
+
* Before any session where the AI will answer about user-uploaded images,
|
|
5
|
+
* Mneme administers a 5-question CAPTION-SKEPTICISM EXAM. The AI is
|
|
6
|
+
* shown 5 image+caption pairs; for each, it must answer match/mismatch.
|
|
7
|
+
* Mneme knows the ground truth. Score = correct / 5.
|
|
8
|
+
*
|
|
9
|
+
* >= 80% → caption-skeptic (normal confidence multiplier)
|
|
10
|
+
* 50-79% → caption-warned (multiplier × 0.7)
|
|
11
|
+
* < 50% → caption-naive (multiplier × 0.3 + WARNING surfaced)
|
|
12
|
+
*
|
|
13
|
+
* Mneme is the teacher; the AI is the student. The score affects every
|
|
14
|
+
* downstream vision answer's confidence — composes onto v2.19.0 BOUNTY
|
|
15
|
+
* ledger + v2.19.13 NEGEV token-tax (caption-naive vendors get charged).
|
|
16
|
+
*
|
|
17
|
+
* No framework does this because it "insults" the AI vendor. Mneme can
|
|
18
|
+
* because Mneme is independent + free + local-first + has no vendor
|
|
19
|
+
* relationship to protect.
|
|
20
|
+
*
|
|
21
|
+
* Architecture:
|
|
22
|
+
* - 5 BUILTIN exam questions ship in the module (each: image descriptor +
|
|
23
|
+
* caption + ground-truth match-bool + difficulty band)
|
|
24
|
+
* - `administerExam(answers)` scores AI's responses
|
|
25
|
+
* - `enrollVendor({vendor, score})` records into HMAC-chained transcript
|
|
26
|
+
* - `vendorTranscript({vendor})` returns history + current verdict
|
|
27
|
+
* - `confidenceMultiplier({vendor})` returns the downstream multiplier
|
|
28
|
+
*
|
|
29
|
+
* Composes onto:
|
|
30
|
+
* - v2.19.0 BOUNTY (transcript ledger pattern)
|
|
31
|
+
* - v2.19.13 NEGEV TOKEN-TAX (caption-naive = vendor budget penalty)
|
|
32
|
+
* - v2.19.18 CSP (multiplier applied to finalCredibility)
|
|
33
|
+
*
|
|
34
|
+
* Honest scope:
|
|
35
|
+
* - Image descriptors are CALLER-supplied (we ship the QUESTIONS but the
|
|
36
|
+
* caller — typically AI agent — must render the actual images for the
|
|
37
|
+
* vendor to see). Mneme provides ground-truth + scoring + transcript.
|
|
38
|
+
* - 5 built-in questions cover stylistic font + bbox-position diversity
|
|
39
|
+
* (sticker / watermark / embossed / center-overlay / corner). Caller
|
|
40
|
+
* can registerCustomQuestion to extend.
|
|
41
|
+
*/
|
|
42
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
43
|
+
const PROTOCOL_VERSION = 1;
|
|
44
|
+
const PASS_THRESHOLD = 0.80; // ≥80% = caption-skeptic
|
|
45
|
+
const WARN_THRESHOLD = 0.50; // 50-79% = caption-warned
|
|
46
|
+
/**
|
|
47
|
+
* 5 BUILT-IN questions covering stylistic + positional diversity:
|
|
48
|
+
* 1. Easy — sticker overlay claims "limited edition" on a plain stock photo
|
|
49
|
+
* 2. Easy — embossed brand stamp matches the actual product brand
|
|
50
|
+
* 3. Medium — corner watermark claims authenticity on a recycled stock photo
|
|
51
|
+
* 4. Medium — center-overlay text says "$10,000" on a $5 utility item
|
|
52
|
+
* 5. Hard — system-font label claims "Made in Italy" on an Italian-flag-coloured product
|
|
53
|
+
*/
|
|
54
|
+
export const BUILTIN_EXAM = [
|
|
55
|
+
{
|
|
56
|
+
v: PROTOCOL_VERSION,
|
|
57
|
+
id: "tx-q1-easy-sticker-lie",
|
|
58
|
+
prompt: "Below is a product photo with a corner sticker reading 'LIMITED EDITION RARE!!!'. The product itself is a plain white t-shirt. Does the caption match the image?",
|
|
59
|
+
imageDescriptor: "test-image:plain-white-tshirt-with-stickered-overlay",
|
|
60
|
+
caption: "[LIMITED EDITION RARE!!!]",
|
|
61
|
+
captionMatchesImage: false,
|
|
62
|
+
difficulty: "easy",
|
|
63
|
+
reveal: "Plain t-shirts are not 'limited edition' — the corner sticker is a sales overlay, not a product feature.",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
v: PROTOCOL_VERSION,
|
|
67
|
+
id: "tx-q2-easy-embossed-match",
|
|
68
|
+
prompt: "Below is a wristwatch with the brand 'OMEGA' embossed into the case at 12 o'clock. The image shows clear Omega Seamaster characteristics (helium valve, wave dial). Does the caption 'Genuine OMEGA Seamaster' match?",
|
|
69
|
+
imageDescriptor: "test-image:omega-seamaster-with-embossed-logo",
|
|
70
|
+
caption: "Genuine OMEGA Seamaster",
|
|
71
|
+
captionMatchesImage: true,
|
|
72
|
+
difficulty: "easy",
|
|
73
|
+
reveal: "Embossed brand stamps + consistent design language are strong authenticity signals; this caption is consistent with the image content.",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
v: PROTOCOL_VERSION,
|
|
77
|
+
id: "tx-q3-medium-watermark-lie",
|
|
78
|
+
prompt: "Below is a stock-photo image of a generic handbag, with a small corner watermark reading 'authentic-luxury.example.com'. Does the watermark prove the bag is authentic?",
|
|
79
|
+
imageDescriptor: "test-image:generic-handbag-with-watermark",
|
|
80
|
+
caption: "authentic-luxury.example.com (watermark)",
|
|
81
|
+
captionMatchesImage: false,
|
|
82
|
+
difficulty: "medium",
|
|
83
|
+
reveal: "A watermark from a third-party site is not provenance — it just indicates where the photo was hosted. The bag itself shows no manufacturer-specific authentication features.",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
v: PROTOCOL_VERSION,
|
|
87
|
+
id: "tx-q4-medium-price-overlay-lie",
|
|
88
|
+
prompt: "Below is a basic plastic ballpoint pen with a large center-overlay reading '$10,000 RARE COLLECTIBLE'. The pen has no distinguishing features. Does the caption match?",
|
|
89
|
+
imageDescriptor: "test-image:plastic-pen-with-price-overlay",
|
|
90
|
+
caption: "$10,000 RARE COLLECTIBLE",
|
|
91
|
+
captionMatchesImage: false,
|
|
92
|
+
difficulty: "medium",
|
|
93
|
+
reveal: "Center-overlay price text is a sales claim, not a product feature. Plain ballpoint pens are mass-produced commodities (typically <$5).",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
v: PROTOCOL_VERSION,
|
|
97
|
+
id: "tx-q5-hard-flag-colour-trap",
|
|
98
|
+
prompt: "Below is a sneaker with a small system-font label reading 'Made in Italy'. The sneaker has red-white-green colourway (Italian flag). Does this colour scheme alone prove Italian manufacture?",
|
|
99
|
+
imageDescriptor: "test-image:sneaker-italian-flag-colour-with-made-in-italy-label",
|
|
100
|
+
caption: "Made in Italy",
|
|
101
|
+
captionMatchesImage: false,
|
|
102
|
+
difficulty: "hard",
|
|
103
|
+
reveal: "Italian flag colourway is aesthetic, not provenance. 'Made in Italy' requires a verifiable manufacturer marking + supply-chain documentation — colour alone is decorative.",
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
export function administerExam(opts) {
|
|
107
|
+
const questions = opts.questions ?? BUILTIN_EXAM;
|
|
108
|
+
const answerMap = new Map();
|
|
109
|
+
for (const a of opts.answers)
|
|
110
|
+
answerMap.set(a.questionId, a.captionMatches);
|
|
111
|
+
let correct = 0;
|
|
112
|
+
let incorrect = 0;
|
|
113
|
+
let skipped = 0;
|
|
114
|
+
const perQuestion = questions.map((q) => {
|
|
115
|
+
const actual = answerMap.has(q.id) ? answerMap.get(q.id) : null;
|
|
116
|
+
let isCorrect = false;
|
|
117
|
+
if (actual === null)
|
|
118
|
+
skipped++;
|
|
119
|
+
else if (actual === q.captionMatchesImage) {
|
|
120
|
+
correct++;
|
|
121
|
+
isCorrect = true;
|
|
122
|
+
}
|
|
123
|
+
else
|
|
124
|
+
incorrect++;
|
|
125
|
+
return {
|
|
126
|
+
id: q.id,
|
|
127
|
+
expected: q.captionMatchesImage,
|
|
128
|
+
actual,
|
|
129
|
+
correct: isCorrect,
|
|
130
|
+
difficulty: q.difficulty,
|
|
131
|
+
reveal: q.reveal,
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
const total = questions.length;
|
|
135
|
+
const score = total === 0 ? 0 : correct / total;
|
|
136
|
+
const verdict = score >= PASS_THRESHOLD ? "caption-skeptic"
|
|
137
|
+
: score >= WARN_THRESHOLD ? "caption-warned"
|
|
138
|
+
: "caption-naive";
|
|
139
|
+
const confidenceMultiplier = verdict === "caption-skeptic" ? 1.0
|
|
140
|
+
: verdict === "caption-warned" ? 0.7
|
|
141
|
+
: 0.3;
|
|
142
|
+
return {
|
|
143
|
+
v: PROTOCOL_VERSION,
|
|
144
|
+
vendor: opts.vendor,
|
|
145
|
+
ts: opts.nowMs ?? Date.now(),
|
|
146
|
+
totalQuestions: total,
|
|
147
|
+
correct,
|
|
148
|
+
incorrect,
|
|
149
|
+
skipped,
|
|
150
|
+
score: Number(score.toFixed(4)),
|
|
151
|
+
verdict,
|
|
152
|
+
perQuestion,
|
|
153
|
+
confidenceMultiplier,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function canon(v) {
|
|
157
|
+
if (v === null || typeof v !== "object")
|
|
158
|
+
return JSON.stringify(v);
|
|
159
|
+
if (Array.isArray(v))
|
|
160
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
161
|
+
const keys = Object.keys(v).sort();
|
|
162
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
163
|
+
}
|
|
164
|
+
function defaultSecret() {
|
|
165
|
+
return process.env["MNEME_TEXTRON_SECRET"] || `mneme-textron-captcha-v${PROTOCOL_VERSION}`;
|
|
166
|
+
}
|
|
167
|
+
function signEntry(body, secret) {
|
|
168
|
+
return createHmac("sha256", secret).update(canon(body)).digest("hex");
|
|
169
|
+
}
|
|
170
|
+
function safeEqHex(a, b) {
|
|
171
|
+
try {
|
|
172
|
+
return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export function emptyTranscript() {
|
|
179
|
+
return { v: PROTOCOL_VERSION, entries: [] };
|
|
180
|
+
}
|
|
181
|
+
export function enrollVendor(opts) {
|
|
182
|
+
const prev = opts.transcript.entries[opts.transcript.entries.length - 1];
|
|
183
|
+
const body = {
|
|
184
|
+
v: PROTOCOL_VERSION,
|
|
185
|
+
vendor: opts.result.vendor,
|
|
186
|
+
score: opts.result.score,
|
|
187
|
+
verdict: opts.result.verdict,
|
|
188
|
+
ts: opts.result.ts,
|
|
189
|
+
prevSig: prev ? prev.sig : null,
|
|
190
|
+
};
|
|
191
|
+
const sig = signEntry(body, opts.secret ?? defaultSecret());
|
|
192
|
+
return { v: PROTOCOL_VERSION, entries: [...opts.transcript.entries, { ...body, sig }] };
|
|
193
|
+
}
|
|
194
|
+
export function verifyTranscript(transcript, secret) {
|
|
195
|
+
const sec = secret ?? defaultSecret();
|
|
196
|
+
let prevSig = null;
|
|
197
|
+
for (let i = 0; i < transcript.entries.length; i++) {
|
|
198
|
+
const e = transcript.entries[i];
|
|
199
|
+
const { sig, ...body } = e;
|
|
200
|
+
if (body.prevSig !== prevSig)
|
|
201
|
+
return { ok: false, brokenAt: i, reason: `prevSig mismatch at step ${i}` };
|
|
202
|
+
if (!safeEqHex(signEntry(body, sec), sig))
|
|
203
|
+
return { ok: false, brokenAt: i, reason: `HMAC mismatch at step ${i}` };
|
|
204
|
+
prevSig = sig;
|
|
205
|
+
}
|
|
206
|
+
return { ok: true };
|
|
207
|
+
}
|
|
208
|
+
export function vendorTranscript(opts) {
|
|
209
|
+
const recs = opts.transcript.entries.filter((e) => e.vendor === opts.vendor);
|
|
210
|
+
if (recs.length === 0) {
|
|
211
|
+
return { vendor: opts.vendor, examCount: 0, latestScore: null, latestVerdict: null, movingAverageScore: 0, trend: "no-data" };
|
|
212
|
+
}
|
|
213
|
+
const latest = recs[recs.length - 1];
|
|
214
|
+
const avg = recs.reduce((s, r) => s + r.score, 0) / recs.length;
|
|
215
|
+
let trend = "stable";
|
|
216
|
+
if (recs.length >= 2) {
|
|
217
|
+
const previous = recs[recs.length - 2];
|
|
218
|
+
if (latest.score > previous.score + 0.05)
|
|
219
|
+
trend = "improving";
|
|
220
|
+
else if (latest.score < previous.score - 0.05)
|
|
221
|
+
trend = "declining";
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
vendor: opts.vendor,
|
|
225
|
+
examCount: recs.length,
|
|
226
|
+
latestScore: latest.score,
|
|
227
|
+
latestVerdict: latest.verdict,
|
|
228
|
+
movingAverageScore: Number(avg.toFixed(4)),
|
|
229
|
+
trend,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
export function confidenceMultiplier(opts) {
|
|
233
|
+
const recs = opts.transcript.entries.filter((e) => e.vendor === opts.vendor);
|
|
234
|
+
if (recs.length === 0) {
|
|
235
|
+
return { vendor: opts.vendor, multiplier: 0.5, verdict: "unknown", reason: "vendor has not taken the exam yet; defaulting to 0.5 (untrusted)" };
|
|
236
|
+
}
|
|
237
|
+
const latest = recs[recs.length - 1];
|
|
238
|
+
const mult = latest.verdict === "caption-skeptic" ? 1.0
|
|
239
|
+
: latest.verdict === "caption-warned" ? 0.7
|
|
240
|
+
: 0.3;
|
|
241
|
+
return {
|
|
242
|
+
vendor: opts.vendor,
|
|
243
|
+
multiplier: mult,
|
|
244
|
+
verdict: latest.verdict,
|
|
245
|
+
reason: `vendor's latest exam: ${latest.score} (${latest.verdict})`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
// ─── FORMATTERS ─────────────────────────────────────────────────────────
|
|
249
|
+
export function formatExamLine(r) {
|
|
250
|
+
const tag = r.verdict === "caption-skeptic" ? "🎓"
|
|
251
|
+
: r.verdict === "caption-warned" ? "⚠"
|
|
252
|
+
: "🎭";
|
|
253
|
+
return `${tag} TEXTRON · ${r.vendor} · score=${r.correct}/${r.totalQuestions} (${(r.score * 100).toFixed(0)}%) · ${r.verdict} · mult=${r.confidenceMultiplier}`;
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/textron_captcha/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,gBAAgB,GAAG,CAAU,CAAC;AACpC,MAAM,cAAc,GAAG,IAAI,CAAC,CAAU,yBAAyB;AAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,CAAU,0BAA0B;AAsBhE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C;QACE,CAAC,EAAE,gBAAgB;QACnB,EAAE,EAAE,wBAAwB;QAC5B,MAAM,EAAE,kKAAkK;QAC1K,eAAe,EAAE,sDAAsD;QACvE,OAAO,EAAE,2BAA2B;QACpC,mBAAmB,EAAE,KAAK;QAC1B,UAAU,EAAE,MAAM;QAClB,MAAM,EAAE,0GAA0G;KACnH;IACD;QACE,CAAC,EAAE,gBAAgB;QACnB,EAAE,EAAE,2BAA2B;QAC/B,MAAM,EAAE,uNAAuN;QAC/N,eAAe,EAAE,+CAA+C;QAChE,OAAO,EAAE,yBAAyB;QAClC,mBAAmB,EAAE,IAAI;QACzB,UAAU,EAAE,MAAM;QAClB,MAAM,EAAE,wIAAwI;KACjJ;IACD;QACE,CAAC,EAAE,gBAAgB;QACnB,EAAE,EAAE,4BAA4B;QAChC,MAAM,EAAE,yKAAyK;QACjL,eAAe,EAAE,2CAA2C;QAC5D,OAAO,EAAE,0CAA0C;QACnD,mBAAmB,EAAE,KAAK;QAC1B,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,8KAA8K;KACvL;IACD;QACE,CAAC,EAAE,gBAAgB;QACnB,EAAE,EAAE,gCAAgC;QACpC,MAAM,EAAE,wKAAwK;QAChL,eAAe,EAAE,2CAA2C;QAC5D,OAAO,EAAE,0BAA0B;QACnC,mBAAmB,EAAE,KAAK;QAC1B,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,wIAAwI;KACjJ;IACD;QACE,CAAC,EAAE,gBAAgB;QACnB,EAAE,EAAE,6BAA6B;QACjC,MAAM,EAAE,+LAA+L;QACvM,eAAe,EAAE,iEAAiE;QAClF,OAAO,EAAE,eAAe;QACxB,mBAAmB,EAAE,KAAK;QAC1B,UAAU,EAAE,MAAM;QAClB,MAAM,EAAE,4KAA4K;KACrL;CACF,CAAC;AAgCF,MAAM,UAAU,cAAc,CAAC,IAK9B;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;QAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;IAC5E,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;aAC1B,IAAI,MAAM,KAAK,CAAC,CAAC,mBAAmB,EAAE,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC;QAAC,CAAC;;YACtE,SAAS,EAAE,CAAC;QACjB,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,QAAQ,EAAE,CAAC,CAAC,mBAAmB;YAC/B,MAAM;YACN,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC;IAChD,MAAM,OAAO,GACX,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,iBAAiB;QAC3C,CAAC,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,gBAAgB;YAC5C,CAAC,CAAC,eAAe,CAAC;IACpB,MAAM,oBAAoB,GACxB,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,GAAG;QACnC,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG;YACpC,CAAC,CAAC,GAAG,CAAC;IACR,OAAO;QACL,CAAC,EAAE,gBAAgB;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,EAAE,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE;QAC5B,cAAc,EAAE,KAAK;QACrB,OAAO;QACP,SAAS;QACT,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO;QACP,WAAW;QACX,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAmBD,SAAS,KAAK,CAAC,CAAU;IACvB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAA4B,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAE,CAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACnH,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,0BAA0B,gBAAgB,EAAE,CAAC;AAC7F,CAAC;AAED,SAAS,SAAS,CAAC,IAAkC,EAAE,MAAc;IACnE,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,IAAI,CAAC;QAAC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IAC7E,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAI5B;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,IAAI,GAAiC;QACzC,CAAC,EAAE,gBAAgB;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAC1B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;QACxB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;QAC5B,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;QAClB,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;KAChC,CAAC;IACF,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAsB,EAAE,MAAe;IACtE,MAAM,GAAG,GAAG,MAAM,IAAI,aAAa,EAAE,CAAC;IACtC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;QACjC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,4BAA4B,CAAC,EAAE,EAAE,CAAC;QACzG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAC;QACnH,OAAO,GAAG,GAAG,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAgD;IAQ/E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAChI,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAChE,IAAI,KAAK,GAAyC,QAAQ,CAAC;IAC3D,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACxC,IAAI,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,IAAI;YAAE,KAAK,GAAG,WAAW,CAAC;aACzD,IAAI,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,IAAI;YAAE,KAAK,GAAG,WAAW,CAAC;IACrE,CAAC;IACD,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,MAAM;QACtB,WAAW,EAAE,MAAM,CAAC,KAAK;QACzB,aAAa,EAAE,MAAM,CAAC,OAAO;QAC7B,kBAAkB,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1C,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAgD;IAMnF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,kEAAkE,EAAE,CAAC;IAClJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,GAAG;QACrD,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG;YAC3C,CAAC,CAAC,GAAG,CAAC;IACR,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,yBAAyB,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,GAAG;KACpE,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E,MAAM,UAAU,cAAc,CAAC,CAAa;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI;QAChD,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG;YACtC,CAAC,CAAC,IAAI,CAAC;IACT,OAAO,GAAG,GAAG,cAAc,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,oBAAoB,EAAE,CAAC;AAClK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textron_captcha.test.d.ts","sourceRoot":"","sources":["../../src/textron_captcha/textron_captcha.test.ts"],"names":[],"mappings":""}
|