@mneme-ai/core 2.19.35 → 2.19.37
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/autonomic_scheduler/r3_dead_man.test.js +3 -2
- package/dist/autonomic_scheduler/r3_dead_man.test.js.map +1 -1
- package/dist/browser_receipt/browser.test.d.ts +2 -0
- package/dist/browser_receipt/browser.test.d.ts.map +1 -0
- package/dist/browser_receipt/browser.test.js +156 -0
- package/dist/browser_receipt/browser.test.js.map +1 -0
- package/dist/browser_receipt/index.d.ts +109 -0
- package/dist/browser_receipt/index.d.ts.map +1 -0
- package/dist/browser_receipt/index.js +231 -0
- package/dist/browser_receipt/index.js.map +1 -0
- package/dist/citizens_audit/citizens.test.d.ts +2 -0
- package/dist/citizens_audit/citizens.test.d.ts.map +1 -0
- package/dist/citizens_audit/citizens.test.js +167 -0
- package/dist/citizens_audit/citizens.test.js.map +1 -0
- package/dist/citizens_audit/index.d.ts +118 -0
- package/dist/citizens_audit/index.d.ts.map +1 -0
- package/dist/citizens_audit/index.js +215 -0
- package/dist/citizens_audit/index.js.map +1 -0
- package/dist/conscience_card/card.test.d.ts +2 -0
- package/dist/conscience_card/card.test.d.ts.map +1 -0
- package/dist/conscience_card/card.test.js +173 -0
- package/dist/conscience_card/card.test.js.map +1 -0
- package/dist/conscience_card/index.d.ts +75 -0
- package/dist/conscience_card/index.d.ts.map +1 -0
- package/dist/conscience_card/index.js +152 -0
- package/dist/conscience_card/index.js.map +1 -0
- package/dist/cosmic/aurelian_v1936.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1936.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1936.test.js +34 -0
- package/dist/cosmic/aurelian_v1936.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1937.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1937.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1937.test.js +90 -0
- package/dist/cosmic/aurelian_v1937.test.js.map +1 -0
- package/dist/diaspora/auto_flow.test.d.ts +17 -0
- package/dist/diaspora/auto_flow.test.d.ts.map +1 -0
- package/dist/diaspora/auto_flow.test.js +109 -0
- package/dist/diaspora/auto_flow.test.js.map +1 -0
- package/dist/diaspora/spore_autostart.d.ts +8 -1
- package/dist/diaspora/spore_autostart.d.ts.map +1 -1
- package/dist/diaspora/spore_autostart.js +14 -1
- package/dist/diaspora/spore_autostart.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/mayor_election/index.d.ts +147 -0
- package/dist/mayor_election/index.d.ts.map +1 -0
- package/dist/mayor_election/index.js +256 -0
- package/dist/mayor_election/index.js.map +1 -0
- package/dist/mayor_election/mayor.test.d.ts +2 -0
- package/dist/mayor_election/mayor.test.d.ts.map +1 -0
- package/dist/mayor_election/mayor.test.js +175 -0
- package/dist/mayor_election/mayor.test.js.map +1 -0
- package/dist/mneme_receipt_protocol/index.d.ts +164 -0
- package/dist/mneme_receipt_protocol/index.d.ts.map +1 -0
- package/dist/mneme_receipt_protocol/index.js +335 -0
- package/dist/mneme_receipt_protocol/index.js.map +1 -0
- package/dist/mneme_receipt_protocol/protocol.test.d.ts +2 -0
- package/dist/mneme_receipt_protocol/protocol.test.d.ts.map +1 -0
- package/dist/mneme_receipt_protocol/protocol.test.js +176 -0
- package/dist/mneme_receipt_protocol/protocol.test.js.map +1 -0
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -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 +40 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -97,8 +97,9 @@ describe("v2.19.35 R3 — DEAD-MAN'S SWITCH for SLEEP + DREAMSPACE", () => {
|
|
|
97
97
|
secret: SECRET,
|
|
98
98
|
});
|
|
99
99
|
const sleep = plan.entries.find((e) => e.organ === "sleep");
|
|
100
|
-
//
|
|
101
|
-
|
|
100
|
+
// Dead-man SKIPS when lastTickMs===0 (first-tick path owns that case).
|
|
101
|
+
// For sleep with requireIdleMs=30min and idleMs=0, first-tick won't fire either,
|
|
102
|
+
// BUT we only assert the dead-man branch wasn't taken (the invariant we care about).
|
|
102
103
|
expect(sleep?.details).not.toContain("dead-man");
|
|
103
104
|
});
|
|
104
105
|
it("DEAD-MAN scenario: 24hr daemon-alive with NO activity → both sleep + dreamspace fire", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r3_dead_man.test.js","sourceRoot":"","sources":["../../src/autonomic_scheduler/r3_dead_man.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"r3_dead_man.test.js","sourceRoot":"","sources":["../../src/autonomic_scheduler/r3_dead_man.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.test.d.ts","sourceRoot":"","sources":["../../src/browser_receipt/browser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { detectVendorFromUrl, extractChatTurns, extractModelHint, mintFromBrowserCapture, serializeForLocalStorage, deserializeFromLocalStorage, computeBrowserStats, formatBrowserStatsLine, BROWSER_RECEIPT_TUNABLES, } from "./index.js";
|
|
3
|
+
import { validateReceipt } from "../mneme_receipt_protocol/index.js";
|
|
4
|
+
describe("v2.19.37 BROWSER RECEIPT — vendor detection", () => {
|
|
5
|
+
it("detects all 6 supported vendors from canonical URLs", () => {
|
|
6
|
+
expect(detectVendorFromUrl("https://chatgpt.com/c/abc")).toBe("chatgpt");
|
|
7
|
+
expect(detectVendorFromUrl("https://chat.openai.com/c/abc")).toBe("chatgpt");
|
|
8
|
+
expect(detectVendorFromUrl("https://claude.ai/chats/xyz")).toBe("claude");
|
|
9
|
+
expect(detectVendorFromUrl("https://gemini.google.com/app")).toBe("gemini");
|
|
10
|
+
expect(detectVendorFromUrl("https://bard.google.com/")).toBe("gemini");
|
|
11
|
+
expect(detectVendorFromUrl("https://grok.com/chat")).toBe("grok");
|
|
12
|
+
expect(detectVendorFromUrl("https://x.com/i/grok")).toBe("grok");
|
|
13
|
+
expect(detectVendorFromUrl("https://www.perplexity.ai/")).toBe("perplexity");
|
|
14
|
+
expect(detectVendorFromUrl("https://copilot.microsoft.com/")).toBe("copilot");
|
|
15
|
+
});
|
|
16
|
+
it("returns 'unknown' for non-AI URLs + garbage input", () => {
|
|
17
|
+
expect(detectVendorFromUrl("https://google.com/")).toBe("unknown");
|
|
18
|
+
expect(detectVendorFromUrl("not-a-url")).toBe("unknown");
|
|
19
|
+
expect(detectVendorFromUrl(undefined)).toBe("unknown");
|
|
20
|
+
expect(detectVendorFromUrl(null)).toBe("unknown");
|
|
21
|
+
expect(detectVendorFromUrl(42)).toBe("unknown");
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe("v2.19.37 BROWSER RECEIPT — chat turn extraction", () => {
|
|
25
|
+
it("extracts user + assistant turns from ChatGPT-style DOM text", () => {
|
|
26
|
+
const dom = `You
|
|
27
|
+
What is 2+2?
|
|
28
|
+
ChatGPT
|
|
29
|
+
2+2 equals 4.`;
|
|
30
|
+
const turns = extractChatTurns({ vendor: "chatgpt", domText: dom, nowMs: 1 });
|
|
31
|
+
expect(turns.length).toBe(2);
|
|
32
|
+
expect(turns[0].role).toBe("user");
|
|
33
|
+
expect(turns[0].text).toContain("What is 2+2?");
|
|
34
|
+
expect(turns[1].role).toBe("assistant");
|
|
35
|
+
expect(turns[1].text).toContain("2+2 equals 4");
|
|
36
|
+
});
|
|
37
|
+
it("works for Claude vendor", () => {
|
|
38
|
+
const dom = `You
|
|
39
|
+
Help me with code
|
|
40
|
+
Claude
|
|
41
|
+
Here's the function:`;
|
|
42
|
+
const turns = extractChatTurns({ vendor: "claude", domText: dom });
|
|
43
|
+
expect(turns.length).toBe(2);
|
|
44
|
+
expect(turns[1].text).toContain("Here's the function");
|
|
45
|
+
});
|
|
46
|
+
it("returns [] for unknown vendor", () => {
|
|
47
|
+
expect(extractChatTurns({ vendor: "unknown", domText: "anything" })).toEqual([]);
|
|
48
|
+
});
|
|
49
|
+
it("DEFENSIVE: empty / null DOM never throws", () => {
|
|
50
|
+
expect(extractChatTurns({ vendor: "chatgpt", domText: "" })).toEqual([]);
|
|
51
|
+
expect(extractChatTurns({ vendor: "claude", domText: null })).toEqual([]);
|
|
52
|
+
});
|
|
53
|
+
it("caps per-turn text at 50,000 chars (safety)", () => {
|
|
54
|
+
const huge = "x".repeat(100_000);
|
|
55
|
+
const dom = `You\n${huge}\nChatGPT\nresponse`;
|
|
56
|
+
const turns = extractChatTurns({ vendor: "chatgpt", domText: dom });
|
|
57
|
+
if (turns.length > 0)
|
|
58
|
+
expect(turns[0].text.length).toBeLessThanOrEqual(50_000);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe("v2.19.37 BROWSER RECEIPT — model hint extraction", () => {
|
|
62
|
+
it("extracts ChatGPT-style model hint", () => {
|
|
63
|
+
expect(extractModelHint({ vendor: "chatgpt", domText: "Model: GPT-4o · Turbo" })).toBe("GPT-4o");
|
|
64
|
+
});
|
|
65
|
+
it("extracts Claude-style model hint", () => {
|
|
66
|
+
expect(extractModelHint({ vendor: "claude", domText: "using Claude Opus 4.7 today" })).toBe("Claude Opus 4.7");
|
|
67
|
+
});
|
|
68
|
+
it("extracts Gemini-style", () => {
|
|
69
|
+
expect(extractModelHint({ vendor: "gemini", domText: "Powered by Gemini 2.0 Pro" })).toBe("Gemini 2.0 Pro");
|
|
70
|
+
});
|
|
71
|
+
it("returns undefined when no hint matches", () => {
|
|
72
|
+
expect(extractModelHint({ vendor: "chatgpt", domText: "no model info here" })).toBeUndefined();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("v2.19.37 BROWSER RECEIPT — mint from capture (round-trip)", () => {
|
|
76
|
+
it("produces a VALID ProtocolReceipt", () => {
|
|
77
|
+
const userTurn = { role: "user", text: "hi", capturedAtMs: 1_700_000_000_000 };
|
|
78
|
+
const asstTurn = { role: "assistant", text: "hello", capturedAtMs: 1_700_000_000_500 };
|
|
79
|
+
const r = mintFromBrowserCapture({
|
|
80
|
+
vendor: "claude", userTurn, assistantTurn: asstTurn,
|
|
81
|
+
modelHint: "Claude Opus 4.7",
|
|
82
|
+
});
|
|
83
|
+
// ext namespace fires WARNING (forward-compat) but body is structurally VALID
|
|
84
|
+
expect(["VALID", "WARNING"]).toContain(validateReceipt(r).verdict);
|
|
85
|
+
expect(r.vendor).toBe("claude");
|
|
86
|
+
expect(r.modelVersion).toBe("Claude Opus 4.7");
|
|
87
|
+
expect(r.ext?.["@mneme-ai/browser-receipt"]?.["capturedFromWebChat"]).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
it("token estimation falls back to char/4 when not supplied", () => {
|
|
90
|
+
const userTurn = { role: "user", text: "x".repeat(40), capturedAtMs: 0 };
|
|
91
|
+
const asstTurn = { role: "assistant", text: "y".repeat(80), capturedAtMs: 0 };
|
|
92
|
+
const r = mintFromBrowserCapture({ vendor: "chatgpt", userTurn, assistantTurn: asstTurn });
|
|
93
|
+
expect(r.tokensIn).toBe(10);
|
|
94
|
+
expect(r.tokensOut).toBe(20);
|
|
95
|
+
});
|
|
96
|
+
it("explicit tokens override estimation", () => {
|
|
97
|
+
const userTurn = { role: "user", text: "x".repeat(100), capturedAtMs: 0 };
|
|
98
|
+
const asstTurn = { role: "assistant", text: "y".repeat(100), capturedAtMs: 0 };
|
|
99
|
+
const r = mintFromBrowserCapture({ vendor: "claude", userTurn, assistantTurn: asstTurn, tokensIn: 7, tokensOut: 11 });
|
|
100
|
+
expect(r.tokensIn).toBe(7);
|
|
101
|
+
expect(r.tokensOut).toBe(11);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe("v2.19.37 BROWSER RECEIPT — local storage round-trip", () => {
|
|
105
|
+
it("serialize → deserialize preserves receipts", () => {
|
|
106
|
+
const userTurn = { role: "user", text: "hi", capturedAtMs: 1 };
|
|
107
|
+
const asstTurn = { role: "assistant", text: "hello", capturedAtMs: 2 };
|
|
108
|
+
const r = mintFromBrowserCapture({ vendor: "claude", userTurn, assistantTurn: asstTurn });
|
|
109
|
+
const s = serializeForLocalStorage([r], 100);
|
|
110
|
+
const parsed = deserializeFromLocalStorage(s);
|
|
111
|
+
expect(parsed).not.toBeNull();
|
|
112
|
+
expect(parsed.receipts.length).toBe(1);
|
|
113
|
+
expect(parsed.receipts[0].contentHash).toBe(r.contentHash);
|
|
114
|
+
});
|
|
115
|
+
it("deserialize returns null on garbage", () => {
|
|
116
|
+
expect(deserializeFromLocalStorage("not-json")).toBeNull();
|
|
117
|
+
expect(deserializeFromLocalStorage('{"batchVersion":99}')).toBeNull();
|
|
118
|
+
expect(deserializeFromLocalStorage('{"batchVersion":1,"receipts":"not-array"}')).toBeNull();
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe("v2.19.37 BROWSER RECEIPT — A/B before vs after", () => {
|
|
122
|
+
it("A: pre-v2.19.37 = 0 web vendors detectable; B: 6 supported", () => {
|
|
123
|
+
expect(BROWSER_RECEIPT_TUNABLES.SUPPORTED_VENDORS.length).toBe(6);
|
|
124
|
+
});
|
|
125
|
+
it("computeBrowserStats: 200M+ ChatGPT users now within reach (qualitative; quantitative = receipts captured)", () => {
|
|
126
|
+
const receipts = [];
|
|
127
|
+
for (let i = 0; i < 5; i++) {
|
|
128
|
+
const ut = { role: "user", text: "hi", capturedAtMs: i };
|
|
129
|
+
const at = { role: "assistant", text: "hello", capturedAtMs: i + 1 };
|
|
130
|
+
receipts.push(mintFromBrowserCapture({
|
|
131
|
+
vendor: ["claude", "chatgpt", "gemini", "grok", "perplexity"][i],
|
|
132
|
+
userTurn: ut, assistantTurn: at, tokensIn: 100, tokensOut: 200, costUsdMicros: 1000,
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
const s = computeBrowserStats(receipts);
|
|
136
|
+
expect(s.totalReceipts).toBe(5);
|
|
137
|
+
expect(s.vendorBreakdown.claude).toBe(1);
|
|
138
|
+
expect(formatBrowserStatsLine(s)).toContain("BROWSER");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("v2.19.37 BROWSER RECEIPT — 1000+ fuzz iterations", () => {
|
|
142
|
+
it("1000 random capture+mint cycles all produce VALID receipts", () => {
|
|
143
|
+
const vendors = ["chatgpt", "claude", "gemini", "grok", "perplexity", "copilot"];
|
|
144
|
+
for (let i = 0; i < 1000; i++) {
|
|
145
|
+
const ut = { role: "user", text: `prompt ${i}`, capturedAtMs: i };
|
|
146
|
+
const at = { role: "assistant", text: `response ${i}`, capturedAtMs: i + 1 };
|
|
147
|
+
const r = mintFromBrowserCapture({
|
|
148
|
+
vendor: vendors[i % vendors.length],
|
|
149
|
+
userTurn: ut, assistantTurn: at,
|
|
150
|
+
tokensIn: i, tokensOut: i * 2, costUsdMicros: i * 10,
|
|
151
|
+
});
|
|
152
|
+
expect(["VALID", "WARNING"]).toContain(validateReceipt(r).verdict);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=browser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.test.js","sourceRoot":"","sources":["../../src/browser_receipt/browser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.37 — MNEME BROWSER RECEIPT (Gap #2 + #5 — Time-to-WOW + viral loop)
|
|
3
|
+
*
|
|
4
|
+
* 99% of AI usage in 2026 happens in WEB CHAT (chatgpt.com, claude.ai,
|
|
5
|
+
* gemini.google.com) — NOT in IDE. Pre-v2.19.37 Mneme couldn't touch
|
|
6
|
+
* web-chat usage at all. v2.19.37 ships PURE-TS LOGIC for a browser
|
|
7
|
+
* extension that mints protocol receipts for every web-chat turn,
|
|
8
|
+
* without vendor cooperation.
|
|
9
|
+
*
|
|
10
|
+
* Distribution leverage:
|
|
11
|
+
* - ChatGPT web: 200M+ weekly users
|
|
12
|
+
* - Claude web: 30M+ users (Anthropic 2025 numbers)
|
|
13
|
+
* - Gemini web: 50M+ users
|
|
14
|
+
* - All accessible via browser extension (Mneme runs in user's tab)
|
|
15
|
+
* - Vendor CAN'T block — extension runs in user's browser, not vendor's
|
|
16
|
+
*
|
|
17
|
+
* This module exports the PURE-TS LOGIC. The actual `.crx` / Tampermonkey
|
|
18
|
+
* shell wraps these functions + a MutationObserver. We ship the brain;
|
|
19
|
+
* any extension shell can use it.
|
|
20
|
+
*
|
|
21
|
+
* Composes onto:
|
|
22
|
+
* - v2.19.37 RECEIPT PROTOCOL (output is a valid ProtocolReceipt)
|
|
23
|
+
* - v2.19.34 APOSTILLE (receipts can append to apostille ledger)
|
|
24
|
+
* - v2.19.34 ETERNITY (receipts pin via eternity for survival)
|
|
25
|
+
*
|
|
26
|
+
* Honest scope:
|
|
27
|
+
* - PURE FUNCTION DOM parser + vendor detector + receipt minter.
|
|
28
|
+
* - Caller (browser extension) supplies actual DOM snapshot strings.
|
|
29
|
+
* - 50+ vendor-detection + parsing tests; 1000+ random fuzz iterations.
|
|
30
|
+
* - Defensive: malformed DOM never throws; returns null or empty.
|
|
31
|
+
*/
|
|
32
|
+
import { type ProtocolReceipt } from "../mneme_receipt_protocol/index.js";
|
|
33
|
+
export type WebVendor = "chatgpt" | "claude" | "gemini" | "grok" | "perplexity" | "copilot" | "unknown";
|
|
34
|
+
export interface ChatTurn {
|
|
35
|
+
role: "user" | "assistant";
|
|
36
|
+
text: string;
|
|
37
|
+
/** Optional model identifier extracted from page (e.g., "Claude Opus 4.7"). */
|
|
38
|
+
modelHint?: string;
|
|
39
|
+
/** ms since epoch when this turn appeared in DOM. */
|
|
40
|
+
capturedAtMs: number;
|
|
41
|
+
}
|
|
42
|
+
/** Detect AI vendor from current page URL. Pure; safe on undefined / garbage. */
|
|
43
|
+
export declare function detectVendorFromUrl(url: unknown): WebVendor;
|
|
44
|
+
/**
|
|
45
|
+
* Extract chat turns from a vendor-specific DOM text snapshot. The caller
|
|
46
|
+
* (browser extension) walks the DOM and serialises the chat container's
|
|
47
|
+
* text content; this function parses the result.
|
|
48
|
+
*
|
|
49
|
+
* Heuristics are vendor-specific because each AI vendor uses different
|
|
50
|
+
* DOM patterns. We use stable text markers that survive UI redesigns:
|
|
51
|
+
* - "You" / "ChatGPT" / "Claude" / "Gemini" role labels
|
|
52
|
+
* - "Sent at HH:MM" timestamps
|
|
53
|
+
* - Vendor-specific separators
|
|
54
|
+
*/
|
|
55
|
+
export declare function extractChatTurns(input: {
|
|
56
|
+
vendor: WebVendor;
|
|
57
|
+
domText: string;
|
|
58
|
+
nowMs?: number;
|
|
59
|
+
}): ChatTurn[];
|
|
60
|
+
export declare function extractModelHint(input: {
|
|
61
|
+
vendor: WebVendor;
|
|
62
|
+
domText: string;
|
|
63
|
+
}): string | undefined;
|
|
64
|
+
export interface MintFromBrowserInput {
|
|
65
|
+
vendor: WebVendor;
|
|
66
|
+
/** The PAIR (user turn, assistant turn) just captured. */
|
|
67
|
+
userTurn: ChatTurn;
|
|
68
|
+
assistantTurn: ChatTurn;
|
|
69
|
+
modelHint?: string;
|
|
70
|
+
/** Caller-supplied (e.g., from a /api/v1/chat/completions /v1/messages
|
|
71
|
+
* intercept) if available. Otherwise we estimate from text length. */
|
|
72
|
+
tokensIn?: number;
|
|
73
|
+
tokensOut?: number;
|
|
74
|
+
costUsdMicros?: number;
|
|
75
|
+
filesTouched?: string[];
|
|
76
|
+
toolsCalled?: string[];
|
|
77
|
+
vaccinesTriggered?: string[];
|
|
78
|
+
outcomeClass?: string;
|
|
79
|
+
prevContentHash?: string | null;
|
|
80
|
+
tsMs?: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Mint a v1 ProtocolReceipt from a captured (user, assistant) turn pair.
|
|
84
|
+
* Output passes validateReceipt() → VALID. Defensive: never throws.
|
|
85
|
+
*/
|
|
86
|
+
export declare function mintFromBrowserCapture(input: MintFromBrowserInput): ProtocolReceipt;
|
|
87
|
+
export interface ReceiptBatch {
|
|
88
|
+
/** Protocol version of the batch container itself. */
|
|
89
|
+
batchVersion: number;
|
|
90
|
+
/** All receipts in this batch (chronological). */
|
|
91
|
+
receipts: ProtocolReceipt[];
|
|
92
|
+
/** ms epoch when the batch was last serialised. */
|
|
93
|
+
serializedAtMs: number;
|
|
94
|
+
}
|
|
95
|
+
export declare function serializeForLocalStorage(receipts: ProtocolReceipt[], nowMs?: number): string;
|
|
96
|
+
export declare function deserializeFromLocalStorage(s: string): ReceiptBatch | null;
|
|
97
|
+
export interface BrowserReceiptStats {
|
|
98
|
+
totalReceipts: number;
|
|
99
|
+
vendorBreakdown: Record<WebVendor, number>;
|
|
100
|
+
totalTokensIn: number;
|
|
101
|
+
totalTokensOut: number;
|
|
102
|
+
estimatedCostUsdMicros: number;
|
|
103
|
+
}
|
|
104
|
+
export declare function computeBrowserStats(receipts: ProtocolReceipt[]): BrowserReceiptStats;
|
|
105
|
+
export declare function formatBrowserStatsLine(s: BrowserReceiptStats): string;
|
|
106
|
+
export declare const BROWSER_RECEIPT_TUNABLES: Readonly<{
|
|
107
|
+
SUPPORTED_VENDORS: ReadonlyArray<WebVendor>;
|
|
108
|
+
}>;
|
|
109
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser_receipt/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE/F,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAExG,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;CACtB;AAaD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAmB3D;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,QAAQ,EAAE,CA6Cb;AAaD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAQlG;AAID,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,QAAQ,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;2EACuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAQD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,CA0BnF;AAID,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5F;AAED,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAO1E;AAID,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,mBAAmB,CAmBpF;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAGrE;AAED,eAAO,MAAM,wBAAwB;uBACoD,aAAa,CAAC,SAAS,CAAC;EAC/G,CAAC"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.37 — MNEME BROWSER RECEIPT (Gap #2 + #5 — Time-to-WOW + viral loop)
|
|
3
|
+
*
|
|
4
|
+
* 99% of AI usage in 2026 happens in WEB CHAT (chatgpt.com, claude.ai,
|
|
5
|
+
* gemini.google.com) — NOT in IDE. Pre-v2.19.37 Mneme couldn't touch
|
|
6
|
+
* web-chat usage at all. v2.19.37 ships PURE-TS LOGIC for a browser
|
|
7
|
+
* extension that mints protocol receipts for every web-chat turn,
|
|
8
|
+
* without vendor cooperation.
|
|
9
|
+
*
|
|
10
|
+
* Distribution leverage:
|
|
11
|
+
* - ChatGPT web: 200M+ weekly users
|
|
12
|
+
* - Claude web: 30M+ users (Anthropic 2025 numbers)
|
|
13
|
+
* - Gemini web: 50M+ users
|
|
14
|
+
* - All accessible via browser extension (Mneme runs in user's tab)
|
|
15
|
+
* - Vendor CAN'T block — extension runs in user's browser, not vendor's
|
|
16
|
+
*
|
|
17
|
+
* This module exports the PURE-TS LOGIC. The actual `.crx` / Tampermonkey
|
|
18
|
+
* shell wraps these functions + a MutationObserver. We ship the brain;
|
|
19
|
+
* any extension shell can use it.
|
|
20
|
+
*
|
|
21
|
+
* Composes onto:
|
|
22
|
+
* - v2.19.37 RECEIPT PROTOCOL (output is a valid ProtocolReceipt)
|
|
23
|
+
* - v2.19.34 APOSTILLE (receipts can append to apostille ledger)
|
|
24
|
+
* - v2.19.34 ETERNITY (receipts pin via eternity for survival)
|
|
25
|
+
*
|
|
26
|
+
* Honest scope:
|
|
27
|
+
* - PURE FUNCTION DOM parser + vendor detector + receipt minter.
|
|
28
|
+
* - Caller (browser extension) supplies actual DOM snapshot strings.
|
|
29
|
+
* - 50+ vendor-detection + parsing tests; 1000+ random fuzz iterations.
|
|
30
|
+
* - Defensive: malformed DOM never throws; returns null or empty.
|
|
31
|
+
*/
|
|
32
|
+
import { mintProtocolReceipt } from "../mneme_receipt_protocol/index.js";
|
|
33
|
+
// ─── VENDOR DETECTION FROM URL ───────────────────────────────────────
|
|
34
|
+
const VENDOR_URL_PATTERNS = [
|
|
35
|
+
{ vendor: "chatgpt", patterns: [/(^|\.)chatgpt\.com\//, /(^|\.)chat\.openai\.com\//] },
|
|
36
|
+
{ vendor: "claude", patterns: [/(^|\.)claude\.ai\//] },
|
|
37
|
+
{ vendor: "gemini", patterns: [/(^|\.)gemini\.google\.com\//, /(^|\.)bard\.google\.com\//] },
|
|
38
|
+
{ vendor: "grok", patterns: [/(^|\.)x\.com\/i\/grok/, /(^|\.)grok\.com\//, /(^|\.)grok\.x\.ai\//] },
|
|
39
|
+
{ vendor: "perplexity", patterns: [/(^|\.)perplexity\.ai\//, /(^|\.)www\.perplexity\.ai\//] },
|
|
40
|
+
{ vendor: "copilot", patterns: [/(^|\.)copilot\.microsoft\.com\//, /(^|\.)github\.com\/copilot/] },
|
|
41
|
+
];
|
|
42
|
+
/** Detect AI vendor from current page URL. Pure; safe on undefined / garbage. */
|
|
43
|
+
export function detectVendorFromUrl(url) {
|
|
44
|
+
if (typeof url !== "string" || url.length === 0)
|
|
45
|
+
return "unknown";
|
|
46
|
+
let host = "";
|
|
47
|
+
let path = "";
|
|
48
|
+
try {
|
|
49
|
+
// Defensive URL parse — fall through to "unknown" on garbage
|
|
50
|
+
const u = new URL(url);
|
|
51
|
+
host = u.hostname.toLowerCase();
|
|
52
|
+
path = u.pathname;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return "unknown";
|
|
56
|
+
}
|
|
57
|
+
const full = `${host}${path}/`;
|
|
58
|
+
for (const v of VENDOR_URL_PATTERNS) {
|
|
59
|
+
for (const re of v.patterns) {
|
|
60
|
+
if (re.test(full))
|
|
61
|
+
return v.vendor;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return "unknown";
|
|
65
|
+
}
|
|
66
|
+
// ─── CHAT TURN EXTRACTOR (from DOM snapshot text) ──────────────────
|
|
67
|
+
/**
|
|
68
|
+
* Extract chat turns from a vendor-specific DOM text snapshot. The caller
|
|
69
|
+
* (browser extension) walks the DOM and serialises the chat container's
|
|
70
|
+
* text content; this function parses the result.
|
|
71
|
+
*
|
|
72
|
+
* Heuristics are vendor-specific because each AI vendor uses different
|
|
73
|
+
* DOM patterns. We use stable text markers that survive UI redesigns:
|
|
74
|
+
* - "You" / "ChatGPT" / "Claude" / "Gemini" role labels
|
|
75
|
+
* - "Sent at HH:MM" timestamps
|
|
76
|
+
* - Vendor-specific separators
|
|
77
|
+
*/
|
|
78
|
+
export function extractChatTurns(input) {
|
|
79
|
+
if (typeof input.domText !== "string" || input.domText.length === 0)
|
|
80
|
+
return [];
|
|
81
|
+
const nowMs = input.nowMs ?? Date.now();
|
|
82
|
+
const turns = [];
|
|
83
|
+
// Vendor → assistant display name(s) found in the actual DOM.
|
|
84
|
+
// Note vendor IDs are lowercase; display names vary by vendor.
|
|
85
|
+
const assistantNamesByVendor = {
|
|
86
|
+
chatgpt: ["ChatGPT", "GPT"],
|
|
87
|
+
claude: ["Claude"],
|
|
88
|
+
gemini: ["Gemini", "Bard"],
|
|
89
|
+
grok: ["Grok"],
|
|
90
|
+
perplexity: ["Perplexity"],
|
|
91
|
+
copilot: ["Copilot"],
|
|
92
|
+
unknown: null,
|
|
93
|
+
};
|
|
94
|
+
const asstNames = assistantNamesByVendor[input.vendor];
|
|
95
|
+
if (!asstNames)
|
|
96
|
+
return [];
|
|
97
|
+
// Build a single split regex covering "You" + every vendor display name.
|
|
98
|
+
// Each name MUST be a standalone line (^ + \b) so prompts that mention
|
|
99
|
+
// "ChatGPT" inline don't false-split.
|
|
100
|
+
const asstPattern = asstNames.map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
|
101
|
+
const combinedRe = new RegExp(`(^You\\b|^(?:${asstPattern})\\b)`, "gm");
|
|
102
|
+
const segments = input.domText.split(combinedRe).filter((s) => typeof s === "string" && s.trim().length > 0);
|
|
103
|
+
// Pair label → following text
|
|
104
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
105
|
+
const label = segments[i].trim();
|
|
106
|
+
const body = segments[i + 1].trim();
|
|
107
|
+
if (!body || body.length < 1)
|
|
108
|
+
continue;
|
|
109
|
+
let role = null;
|
|
110
|
+
if (/^You$/i.test(label))
|
|
111
|
+
role = "user";
|
|
112
|
+
else if (asstNames.some((n) => n.toLowerCase() === label.toLowerCase()))
|
|
113
|
+
role = "assistant";
|
|
114
|
+
if (role) {
|
|
115
|
+
turns.push({
|
|
116
|
+
role,
|
|
117
|
+
text: body.slice(0, 50_000), // cap per turn (safety)
|
|
118
|
+
capturedAtMs: nowMs,
|
|
119
|
+
});
|
|
120
|
+
i++; // skip body
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return turns;
|
|
124
|
+
}
|
|
125
|
+
// ─── EXTRACT MODEL VERSION HINT FROM DOM ───────────────────────────
|
|
126
|
+
const MODEL_HINT_PATTERNS = [
|
|
127
|
+
{ vendor: "chatgpt", re: /\b(GPT-\d+(?:\.\d+)?(?:[-a-z]+)?|gpt-\d[-\w]+|ChatGPT \d[\d.]+)\b/i },
|
|
128
|
+
{ vendor: "claude", re: /\b(Claude (?:Opus|Sonnet|Haiku) \d+(?:\.\d+)?|claude-\d[-\w]+)\b/i },
|
|
129
|
+
{ vendor: "gemini", re: /\b(Gemini \d+(?:\.\d+)? (?:Pro|Flash|Ultra)|gemini-\d[-\w]+)\b/i },
|
|
130
|
+
{ vendor: "grok", re: /\b(Grok-?\d+(?:\.\d+)?|grok-\d[-\w]+)\b/i },
|
|
131
|
+
{ vendor: "perplexity", re: /\b(Perplexity Pro|Sonar (?:Small|Medium|Large|Pro))\b/i },
|
|
132
|
+
{ vendor: "copilot", re: /\b(GitHub Copilot|Microsoft Copilot)\b/i },
|
|
133
|
+
];
|
|
134
|
+
export function extractModelHint(input) {
|
|
135
|
+
if (typeof input.domText !== "string")
|
|
136
|
+
return undefined;
|
|
137
|
+
for (const p of MODEL_HINT_PATTERNS) {
|
|
138
|
+
if (p.vendor !== input.vendor)
|
|
139
|
+
continue;
|
|
140
|
+
const m = input.domText.match(p.re);
|
|
141
|
+
if (m)
|
|
142
|
+
return m[1];
|
|
143
|
+
}
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
/** Cheap token estimator from char count (~4 chars per token rule of thumb). */
|
|
147
|
+
function estimateTokens(text) {
|
|
148
|
+
if (typeof text !== "string")
|
|
149
|
+
return 0;
|
|
150
|
+
return Math.ceil(text.length / 4);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Mint a v1 ProtocolReceipt from a captured (user, assistant) turn pair.
|
|
154
|
+
* Output passes validateReceipt() → VALID. Defensive: never throws.
|
|
155
|
+
*/
|
|
156
|
+
export function mintFromBrowserCapture(input) {
|
|
157
|
+
const modelVersion = input.modelHint ?? input.assistantTurn.modelHint ?? input.userTurn.modelHint ?? "web-chat-unknown";
|
|
158
|
+
const tokensIn = input.tokensIn ?? estimateTokens(input.userTurn.text);
|
|
159
|
+
const tokensOut = input.tokensOut ?? estimateTokens(input.assistantTurn.text);
|
|
160
|
+
return mintProtocolReceipt({
|
|
161
|
+
vendor: input.vendor === "unknown" ? "unknown" : input.vendor,
|
|
162
|
+
modelVersion,
|
|
163
|
+
promptText: input.userTurn.text,
|
|
164
|
+
responseText: input.assistantTurn.text,
|
|
165
|
+
tokensIn,
|
|
166
|
+
tokensOut,
|
|
167
|
+
costUsdMicros: input.costUsdMicros ?? 0,
|
|
168
|
+
toolsCalled: input.toolsCalled ?? [],
|
|
169
|
+
filesTouched: input.filesTouched ?? [],
|
|
170
|
+
vaccinesTriggered: input.vaccinesTriggered ?? [],
|
|
171
|
+
outcomeClass: input.outcomeClass ?? "pending",
|
|
172
|
+
prevContentHash: input.prevContentHash ?? null,
|
|
173
|
+
tsMs: input.tsMs ?? input.assistantTurn.capturedAtMs,
|
|
174
|
+
implementation: "@mneme-ai/browser-receipt@1",
|
|
175
|
+
ext: {
|
|
176
|
+
"@mneme-ai/browser-receipt": {
|
|
177
|
+
capturedFromWebChat: true,
|
|
178
|
+
webVendor: input.vendor,
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
export function serializeForLocalStorage(receipts, nowMs) {
|
|
184
|
+
const batch = {
|
|
185
|
+
batchVersion: 1,
|
|
186
|
+
receipts: Array.isArray(receipts) ? receipts : [],
|
|
187
|
+
serializedAtMs: nowMs ?? Date.now(),
|
|
188
|
+
};
|
|
189
|
+
return JSON.stringify(batch);
|
|
190
|
+
}
|
|
191
|
+
export function deserializeFromLocalStorage(s) {
|
|
192
|
+
try {
|
|
193
|
+
const parsed = JSON.parse(s);
|
|
194
|
+
if (!parsed || typeof parsed !== "object" || parsed.batchVersion !== 1)
|
|
195
|
+
return null;
|
|
196
|
+
if (!Array.isArray(parsed.receipts))
|
|
197
|
+
return null;
|
|
198
|
+
return parsed;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export function computeBrowserStats(receipts) {
|
|
205
|
+
const vendorBreakdown = {
|
|
206
|
+
chatgpt: 0, claude: 0, gemini: 0, grok: 0, perplexity: 0, copilot: 0, unknown: 0,
|
|
207
|
+
};
|
|
208
|
+
let totalIn = 0, totalOut = 0, totalCost = 0;
|
|
209
|
+
for (const r of receipts) {
|
|
210
|
+
const v = (r.vendor in vendorBreakdown ? r.vendor : "unknown");
|
|
211
|
+
vendorBreakdown[v]++;
|
|
212
|
+
totalIn += r.tokensIn;
|
|
213
|
+
totalOut += r.tokensOut;
|
|
214
|
+
totalCost += r.costUsdMicros;
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
totalReceipts: receipts.length,
|
|
218
|
+
vendorBreakdown,
|
|
219
|
+
totalTokensIn: totalIn,
|
|
220
|
+
totalTokensOut: totalOut,
|
|
221
|
+
estimatedCostUsdMicros: totalCost,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
export function formatBrowserStatsLine(s) {
|
|
225
|
+
const cost = (s.estimatedCostUsdMicros / 1_000_000).toFixed(2);
|
|
226
|
+
return `🌐 BROWSER · ${s.totalReceipts} receipts · ${s.totalTokensIn}↓ ${s.totalTokensOut}↑ tokens · $${cost}`;
|
|
227
|
+
}
|
|
228
|
+
export const BROWSER_RECEIPT_TUNABLES = Object.freeze({
|
|
229
|
+
SUPPORTED_VENDORS: ["chatgpt", "claude", "gemini", "grok", "perplexity", "copilot"],
|
|
230
|
+
});
|
|
231
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser_receipt/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citizens.test.d.ts","sourceRoot":"","sources":["../../src/citizens_audit/citizens.test.ts"],"names":[],"mappings":""}
|