@mneme-ai/core 1.96.0 → 1.97.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.
@@ -0,0 +1,62 @@
1
+ /**
2
+ * v1.97.0 -- RAINBOW · The Truth About v1.85 RELAY (4 bugs · honest postmortem).
3
+ *
4
+ * User caught us in 4 lies:
5
+ *
6
+ * 🔴 BUG #1: AI-fetches-URL doesn't work
7
+ * - Free Gemini / ChatGPT-Free / Claude.ai do NOT have web-fetch in
8
+ * chat completion paths. The instruction "Fetch this URL..." is
9
+ * silently ignored or refused.
10
+ *
11
+ * 🔴 BUG #2: AI cannot do AES-GCM + PBKDF2(200k) decryption
12
+ * - Asking the AI to manually decrypt is a hallucination magnet. It
13
+ * has no Web Crypto access in the chat sandbox; output is fabricated.
14
+ *
15
+ * 🔴 BUG #3: gemini.google.com/?q= deep link does NOT prefill
16
+ * - User has to type the prompt themselves anyway. The deep-link
17
+ * parameter is silently ignored by current Gemini Web.
18
+ *
19
+ * 🔴 BUG #4: We claimed it works without integration testing
20
+ * - v1.85 commit messages and docs asserted "any AI can fetch URL +
21
+ * decrypt". Never tested against a real free-tier AI. False claim.
22
+ *
23
+ * The DEMON FIX (v1.97):
24
+ *
25
+ * STOP depending on Web AI to do ANYTHING beyond reading text.
26
+ *
27
+ * The ONLY assumption that holds across every Web AI's free tier on
28
+ * every platform: the user can paste into the chat box.
29
+ *
30
+ * So Mneme:
31
+ * 1. Renders the soul prompt as PLAIN TEXT (no encryption needed —
32
+ * soul never leaves user's machine when using SAME-SHELL).
33
+ * 2. Copies it to the user's CLIPBOARD via the browser's
34
+ * navigator.clipboard API (works on every modern browser).
35
+ * 3. Opens the AI's HOME page (not a deep link with ?q= — that
36
+ * path is broken and we've confirmed it).
37
+ * 4. Shows a clear banner: "BRAIN IS ON YOUR CLIPBOARD. Press Ctrl+V."
38
+ * 5. User pastes plain text into the chat. AI reads plain text.
39
+ *
40
+ * No crypto burden on AI. No fetch dependency. No deep-link reliance.
41
+ * 100% reliable on every Web AI that lets a human paste in the chat —
42
+ * which is every Web AI that exists.
43
+ *
44
+ * v1.85 ENCRYPTED-RELAY architecture is DEPRECATED. Code remains for
45
+ * the LAN/tunnel transport (where the BROWSER does the decryption,
46
+ * not the AI), but the "AI fetches + decrypts" assumption is gone.
47
+ *
48
+ * This file exists to be honest about it in the codebase.
49
+ */
50
+ export interface ArchitectureWarning {
51
+ /** Module name. */
52
+ module: string;
53
+ /** Why it's deprecated. */
54
+ reason: string;
55
+ /** What to use instead. */
56
+ replacement: string;
57
+ }
58
+ export declare const DEPRECATED_RELAY_PATHS: ArchitectureWarning[];
59
+ /** Print the architecture warnings — used by the doctor command + the
60
+ * AI agent contract to remind both human + AI that the old paths are dead. */
61
+ export declare function formatBugTruth(): string;
62
+ //# sourceMappingURL=bug_truth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bug_truth.d.ts","sourceRoot":"","sources":["../../src/rainbow/bug_truth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,MAAM,WAAW,mBAAmB;IAClC,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,EAgBvD,CAAC;AAEF;+EAC+E;AAC/E,wBAAgB,cAAc,IAAI,MAAM,CAMvC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * v1.97.0 -- RAINBOW · The Truth About v1.85 RELAY (4 bugs · honest postmortem).
3
+ *
4
+ * User caught us in 4 lies:
5
+ *
6
+ * 🔴 BUG #1: AI-fetches-URL doesn't work
7
+ * - Free Gemini / ChatGPT-Free / Claude.ai do NOT have web-fetch in
8
+ * chat completion paths. The instruction "Fetch this URL..." is
9
+ * silently ignored or refused.
10
+ *
11
+ * 🔴 BUG #2: AI cannot do AES-GCM + PBKDF2(200k) decryption
12
+ * - Asking the AI to manually decrypt is a hallucination magnet. It
13
+ * has no Web Crypto access in the chat sandbox; output is fabricated.
14
+ *
15
+ * 🔴 BUG #3: gemini.google.com/?q= deep link does NOT prefill
16
+ * - User has to type the prompt themselves anyway. The deep-link
17
+ * parameter is silently ignored by current Gemini Web.
18
+ *
19
+ * 🔴 BUG #4: We claimed it works without integration testing
20
+ * - v1.85 commit messages and docs asserted "any AI can fetch URL +
21
+ * decrypt". Never tested against a real free-tier AI. False claim.
22
+ *
23
+ * The DEMON FIX (v1.97):
24
+ *
25
+ * STOP depending on Web AI to do ANYTHING beyond reading text.
26
+ *
27
+ * The ONLY assumption that holds across every Web AI's free tier on
28
+ * every platform: the user can paste into the chat box.
29
+ *
30
+ * So Mneme:
31
+ * 1. Renders the soul prompt as PLAIN TEXT (no encryption needed —
32
+ * soul never leaves user's machine when using SAME-SHELL).
33
+ * 2. Copies it to the user's CLIPBOARD via the browser's
34
+ * navigator.clipboard API (works on every modern browser).
35
+ * 3. Opens the AI's HOME page (not a deep link with ?q= — that
36
+ * path is broken and we've confirmed it).
37
+ * 4. Shows a clear banner: "BRAIN IS ON YOUR CLIPBOARD. Press Ctrl+V."
38
+ * 5. User pastes plain text into the chat. AI reads plain text.
39
+ *
40
+ * No crypto burden on AI. No fetch dependency. No deep-link reliance.
41
+ * 100% reliable on every Web AI that lets a human paste in the chat —
42
+ * which is every Web AI that exists.
43
+ *
44
+ * v1.85 ENCRYPTED-RELAY architecture is DEPRECATED. Code remains for
45
+ * the LAN/tunnel transport (where the BROWSER does the decryption,
46
+ * not the AI), but the "AI fetches + decrypts" assumption is gone.
47
+ *
48
+ * This file exists to be honest about it in the codebase.
49
+ */
50
+ export const DEPRECATED_RELAY_PATHS = [
51
+ {
52
+ module: "rainbow.handoff.buildDataBridgeUrl (v1.89)",
53
+ reason: "data: URL navigation is blocked by Chrome/Safari since 2018 at the top-level. Even when it isn't, modern Web AIs (Gemini Free, ChatGPT Free, Claude.ai) have no web-fetch in chat completion to retrieve the encrypted soul. Deep-link prefill is silently ignored by current Gemini Web.",
54
+ replacement: "Use rainbow.same_shell.renderSameShellPage + rainbow.clone_to.cloneTo for clipboard-based handoff. The page copies plain text to clipboard; user pastes into the AI directly.",
55
+ },
56
+ {
57
+ module: "v1.85 RELAY · AI fetches encrypted soul from public paste",
58
+ reason: "Asks the Web AI to (a) fetch a public URL — most free tiers refuse, (b) decrypt AES-256-GCM with PBKDF2(200k) — AI sandbox has no Web Crypto, output is hallucinated, (c) parse the result back into context — only the AI's reading capability is reliable.",
59
+ replacement: "BROWSER (not AI) does the decryption. Use the same-shell flow — soul stays on user's machine as plain text, clipboard delivers it.",
60
+ },
61
+ {
62
+ module: "Vendor-prefill deep links (chatgpt.com/?q=, gemini.google.com/?q=)",
63
+ reason: "Empirically broken on Gemini Web (verified by user). ChatGPT and Claude.ai don't reliably honor query params either across all entry routes. User STILL has to paste — but now they're confused why the prompt didn't auto-fill.",
64
+ replacement: "Open the AI's plain home URL + tell the user clearly: 'Brain is on clipboard. Press Ctrl+V.' Reliable on every Web AI.",
65
+ },
66
+ ];
67
+ /** Print the architecture warnings — used by the doctor command + the
68
+ * AI agent contract to remind both human + AI that the old paths are dead. */
69
+ export function formatBugTruth() {
70
+ return DEPRECATED_RELAY_PATHS.map((w, i) => `🔴 [${i + 1}/${DEPRECATED_RELAY_PATHS.length}] ${w.module}\n` +
71
+ ` why: ${w.reason}\n` +
72
+ ` use: ${w.replacement}`).join("\n\n");
73
+ }
74
+ //# sourceMappingURL=bug_truth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bug_truth.js","sourceRoot":"","sources":["../../src/rainbow/bug_truth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAWH,MAAM,CAAC,MAAM,sBAAsB,GAA0B;IAC3D;QACE,MAAM,EAAE,4CAA4C;QACpD,MAAM,EAAE,2RAA2R;QACnS,WAAW,EAAE,+KAA+K;KAC7L;IACD;QACE,MAAM,EAAE,2DAA2D;QACnE,MAAM,EAAE,8PAA8P;QACtQ,WAAW,EAAE,oIAAoI;KAClJ;IACD;QACE,MAAM,EAAE,oEAAoE;QAC5E,MAAM,EAAE,kOAAkO;QAC1O,WAAW,EAAE,wHAAwH;KACtI;CACF,CAAC;AAEF;+EAC+E;AAC/E,MAAM,UAAU,cAAc;IAC5B,OAAO,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzC,OAAO,CAAC,GAAG,CAAC,IAAI,sBAAsB,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI;QAC9D,YAAY,CAAC,CAAC,MAAM,IAAI;QACxB,YAAY,CAAC,CAAC,WAAW,EAAE,CAC5B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * v1.97.0 -- RAINBOW · CLONE-TO universal intent parser + executor.
3
+ *
4
+ * The bug the user yelled about:
5
+ * "User says 'ส่งสมองไปมือถือ' or 'clone mneme to gemini' in Claude Code,
6
+ * AI agent doesn't recognize the intent, no QR appears, no URL pops up,
7
+ * user is stranded."
8
+ *
9
+ * Root cause:
10
+ * v1.95/96 shipped rainbow.show_local / show_handoff / quantum bridge
11
+ * modules, but NO MCP tool with the obvious name + crystal-clear
12
+ * description that maps natural language → action. AI agent had to
13
+ * know which specific tool to call. It didn't.
14
+ *
15
+ * v1.97 fix:
16
+ * ONE tool — `mneme.clone.to` — with a description so obvious that
17
+ * every AI agent recognizes "send / clone / sync / move brain /
18
+ * memory / mneme to <target>" calls it. The tool itself does
19
+ * fuzzy phrase parsing in Thai + English + mixed-language input,
20
+ * resolves the target, picks the right transport, executes, and
21
+ * auto-opens the browser when applicable.
22
+ *
23
+ * Targets recognized:
24
+ * 📱 mobile / phone / iPhone / Android / มือถือ / โทรศัพท์
25
+ * 💻 another-pc / laptop / notebook / คอมอื่น / โน้ตบุ๊ค
26
+ * 🖥 this-pc / localhost / browser-on-this-pc / เครื่องนี้
27
+ * 🟢 chatgpt / chatgpt-web / openai
28
+ * 🔵 gemini / gemini-web / google-ai
29
+ * 🟣 claude / claude-web / anthropic
30
+ * ⚪ perplexity / perplexity-web
31
+ * 🤖 copilot / github-copilot / vscode-copilot
32
+ * 📝 vscode / vs-code / editor
33
+ * 📱 ipad / tablet / แทบเล็ต
34
+ * 💾 usb / offline / file
35
+ * 🔄 back / return / กลับ (Web AI → editor AI return path)
36
+ *
37
+ * Verbs recognized:
38
+ * send / clone / move / sync / migrate / give / share / push
39
+ * ส่ง / โคลน / ย้าย / sync / ก๊อป / copy / แชร์ / ใส่
40
+ */
41
+ /** Canonical target identifiers. */
42
+ export type CloneTarget = "mobile" | "another-pc" | "this-pc" | "chatgpt" | "gemini" | "claude" | "perplexity" | "copilot" | "vscode" | "ipad" | "usb" | "return" | "unknown";
43
+ export interface ParsedCloneIntent {
44
+ isCloneRequest: boolean;
45
+ /** Confidence 0..1 that this is a clone request. */
46
+ confidence: number;
47
+ target: CloneTarget;
48
+ /** Why we picked this target (which keyword matched). */
49
+ targetEvidence: string[];
50
+ /** Why we believe this is a clone request (which verb + subject matched). */
51
+ verbEvidence: string[];
52
+ subjectEvidence: string[];
53
+ /** Normalized lower-case input. */
54
+ normalized: string;
55
+ }
56
+ /** Parse a free-form user message and decide if it's a clone request +
57
+ * what the target is. Fuzzy + language-agnostic. */
58
+ export declare function parseCloneIntent(text: string): ParsedCloneIntent;
59
+ export type TransportPlan = {
60
+ transport: "same-shell";
61
+ openUrl: string;
62
+ description: string;
63
+ } | {
64
+ transport: "lan-qr";
65
+ lanPort: number;
66
+ description: string;
67
+ } | {
68
+ transport: "tunnel-qr";
69
+ lanPort: number;
70
+ description: string;
71
+ } | {
72
+ transport: "web-paste";
73
+ aiUrl: string;
74
+ description: string;
75
+ } | {
76
+ transport: "usb-wanderer";
77
+ description: string;
78
+ } | {
79
+ transport: "boomerang-return";
80
+ description: string;
81
+ } | {
82
+ transport: "menu";
83
+ options: Array<{
84
+ target: CloneTarget;
85
+ label: string;
86
+ }>;
87
+ description: string;
88
+ };
89
+ /** Map a target to the recommended transport. */
90
+ export declare function planTransport(target: CloneTarget, opts?: {
91
+ lanPort?: number;
92
+ }): TransportPlan;
93
+ export interface OpenBrowserOptions {
94
+ /** Test stub: when provided, called instead of spawning a real browser. */
95
+ spawnOverride?: (cmd: string, args: string[]) => void;
96
+ }
97
+ /** Open a URL in the default browser. Cross-platform: Win/Mac/Linux/WSL. */
98
+ export declare function openInBrowser(url: string, opts?: OpenBrowserOptions): {
99
+ command: string;
100
+ args: string[];
101
+ opened: boolean;
102
+ };
103
+ export interface CloneToInput {
104
+ /** Free-form user text — Mneme parses it. Pass through the raw user message. */
105
+ userText?: string;
106
+ /** OR specify target directly (skip parsing). */
107
+ target?: CloneTarget;
108
+ /** LAN port the rainbow server listens on. Default 7741. */
109
+ lanPort?: number;
110
+ /** Auto-open the browser when applicable. Default true. */
111
+ openBrowser?: boolean;
112
+ /** Test stub for browser open. */
113
+ spawnOverride?: (cmd: string, args: string[]) => void;
114
+ }
115
+ export interface CloneToResult {
116
+ intent: ParsedCloneIntent | null;
117
+ resolvedTarget: CloneTarget;
118
+ plan: TransportPlan;
119
+ /** One-line summary for AI agent to relay to the user. */
120
+ userInstruction: string;
121
+ /** Cross-platform browser open report when applicable. */
122
+ browserOpen?: {
123
+ command: string;
124
+ args: string[];
125
+ opened: boolean;
126
+ };
127
+ }
128
+ /** The single function AI agents call when the user says ANY phrase about
129
+ * sending / cloning / syncing / moving brain to anywhere. */
130
+ export declare function cloneTo(input: CloneToInput): CloneToResult;
131
+ /** Pulse-style summary for AI agents to surface. */
132
+ export declare function formatCloneToPulseLine(r: CloneToResult): string;
133
+ //# sourceMappingURL=clone_to.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone_to.d.ts","sourceRoot":"","sources":["../../src/rainbow/clone_to.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,299 @@
1
+ /**
2
+ * v1.97.0 -- RAINBOW · CLONE-TO universal intent parser + executor.
3
+ *
4
+ * The bug the user yelled about:
5
+ * "User says 'ส่งสมองไปมือถือ' or 'clone mneme to gemini' in Claude Code,
6
+ * AI agent doesn't recognize the intent, no QR appears, no URL pops up,
7
+ * user is stranded."
8
+ *
9
+ * Root cause:
10
+ * v1.95/96 shipped rainbow.show_local / show_handoff / quantum bridge
11
+ * modules, but NO MCP tool with the obvious name + crystal-clear
12
+ * description that maps natural language → action. AI agent had to
13
+ * know which specific tool to call. It didn't.
14
+ *
15
+ * v1.97 fix:
16
+ * ONE tool — `mneme.clone.to` — with a description so obvious that
17
+ * every AI agent recognizes "send / clone / sync / move brain /
18
+ * memory / mneme to <target>" calls it. The tool itself does
19
+ * fuzzy phrase parsing in Thai + English + mixed-language input,
20
+ * resolves the target, picks the right transport, executes, and
21
+ * auto-opens the browser when applicable.
22
+ *
23
+ * Targets recognized:
24
+ * 📱 mobile / phone / iPhone / Android / มือถือ / โทรศัพท์
25
+ * 💻 another-pc / laptop / notebook / คอมอื่น / โน้ตบุ๊ค
26
+ * 🖥 this-pc / localhost / browser-on-this-pc / เครื่องนี้
27
+ * 🟢 chatgpt / chatgpt-web / openai
28
+ * 🔵 gemini / gemini-web / google-ai
29
+ * 🟣 claude / claude-web / anthropic
30
+ * ⚪ perplexity / perplexity-web
31
+ * 🤖 copilot / github-copilot / vscode-copilot
32
+ * 📝 vscode / vs-code / editor
33
+ * 📱 ipad / tablet / แทบเล็ต
34
+ * 💾 usb / offline / file
35
+ * 🔄 back / return / กลับ (Web AI → editor AI return path)
36
+ *
37
+ * Verbs recognized:
38
+ * send / clone / move / sync / migrate / give / share / push
39
+ * ส่ง / โคลน / ย้าย / sync / ก๊อป / copy / แชร์ / ใส่
40
+ */
41
+ import { spawn } from "node:child_process";
42
+ import { platform } from "node:os";
43
+ const TARGET_PATTERNS = [
44
+ { target: "mobile", keywords: ["มือถือ", "โทรศัพท์", "โทรสับ", "mobile", "phone", "iphone", "android", "samsung", "smartphone", "cellular", "เบอร์โทร"] },
45
+ { target: "ipad", keywords: ["ipad", "tablet", "แทบเล็ต", "แท็บเล็ต"] },
46
+ { target: "another-pc", keywords: ["another pc", "another computer", "another laptop", "notebook", "laptop", "โน้ตบุ๊ค", "โน๊ตบุ๊ค", "คอมอื่น", "เครื่องอื่น", "second laptop", "secondary computer", "another machine", "second machine", "other machine", "another device"] },
47
+ { target: "this-pc", keywords: ["this pc", "this computer", "this machine", "เครื่องนี้", "this device", "localhost", "local", "browser on this pc", "browser on same machine", "same machine", "this browser", "same pc", "บนเครื่องนี้", "บราวเซอร์นี้", "browser นี้"] },
48
+ { target: "chatgpt", keywords: ["chatgpt", "chat gpt", "openai", "gpt", "chat-gpt"] },
49
+ { target: "gemini", keywords: ["gemini", "google ai", "google-ai", "googleai", "บาร์ด", "bard"] },
50
+ { target: "claude", keywords: ["claude.ai", "claude-web", "claude web", "anthropic"] }, // Note: just "claude" matches editor AI too — keep specific
51
+ { target: "perplexity", keywords: ["perplexity", "perplexity ai", "perp"] },
52
+ { target: "copilot", keywords: ["copilot", "github copilot", "co-pilot"] },
53
+ { target: "vscode", keywords: ["vscode", "vs code", "vs-code", "visual studio", "editor", "cursor"] },
54
+ { target: "usb", keywords: ["usb", "offline", "file", "ไฟล์", "thumbdrive", "thumb drive", "external drive", "ออฟไลน์"] },
55
+ { target: "return", keywords: ["กลับ", "back to", "back to pc", "return to", "send back", "ส่งกลับ", "boomerang"] },
56
+ ];
57
+ /** Words that strongly indicate cloning intent (not just any "send"). */
58
+ const CLONE_VERBS = [
59
+ "send", "sync", "clone", "copy", "move", "migrate", "give", "share", "push", "transfer", "transport", "deliver", "beam", "teleport", "carry", "bring",
60
+ "ส่ง", "โคลน", "clone", "ย้าย", "ก๊อป", "ก๊อปปี้", "copy", "แชร์", "ใส่", "ดัน", "เอา", "พา", "ลาก",
61
+ ];
62
+ /** Words that strongly indicate the SUBJECT is the brain/memory/mneme. */
63
+ const SUBJECT_WORDS = [
64
+ "mneme", "brain", "memory", "context", "conversation", "session", "chat",
65
+ "สมอง", "ความจำ", "บริบท", "บทสนทนา", "เซสชัน", "การคุย",
66
+ ];
67
+ function normalize(text) {
68
+ return text.toLowerCase().normalize("NFC").replace(/[​‌‍]/g, "").trim();
69
+ }
70
+ function containsAny(haystack, needles) {
71
+ const matches = [];
72
+ for (const n of needles) {
73
+ if (haystack.includes(n.toLowerCase()))
74
+ matches.push(n);
75
+ }
76
+ return { hit: matches.length > 0, matches };
77
+ }
78
+ /** Parse a free-form user message and decide if it's a clone request +
79
+ * what the target is. Fuzzy + language-agnostic. */
80
+ export function parseCloneIntent(text) {
81
+ const norm = normalize(text);
82
+ const verbHit = containsAny(norm, CLONE_VERBS);
83
+ const subjectHit = containsAny(norm, SUBJECT_WORDS);
84
+ // Target search: order matters — more specific patterns first.
85
+ let bestTarget = "unknown";
86
+ let bestEvidence = [];
87
+ let bestScore = 0;
88
+ for (const p of TARGET_PATTERNS) {
89
+ const r = containsAny(norm, p.keywords);
90
+ if (r.hit) {
91
+ // Score by longest match (more specific keyword > generic).
92
+ const score = Math.max(...r.matches.map((m) => m.length));
93
+ if (score > bestScore) {
94
+ bestScore = score;
95
+ bestTarget = p.target;
96
+ bestEvidence = r.matches;
97
+ }
98
+ }
99
+ }
100
+ // Confidence:
101
+ // verb + subject + target → 0.95 (almost certain)
102
+ // verb + target → 0.80
103
+ // subject + target → 0.70
104
+ // verb + subject → 0.55 (target missing → "show me a menu")
105
+ // target alone → 0.40
106
+ // verb alone → 0.20
107
+ let confidence = 0;
108
+ if (verbHit.hit && subjectHit.hit && bestTarget !== "unknown")
109
+ confidence = 0.95;
110
+ else if (verbHit.hit && bestTarget !== "unknown")
111
+ confidence = 0.80;
112
+ else if (subjectHit.hit && bestTarget !== "unknown")
113
+ confidence = 0.70;
114
+ else if (verbHit.hit && subjectHit.hit)
115
+ confidence = 0.55;
116
+ else if (bestTarget !== "unknown" && (verbHit.hit || subjectHit.hit))
117
+ confidence = 0.40;
118
+ else if (verbHit.hit)
119
+ confidence = 0.20;
120
+ return {
121
+ isCloneRequest: confidence >= 0.4,
122
+ confidence,
123
+ target: bestTarget,
124
+ targetEvidence: bestEvidence,
125
+ verbEvidence: verbHit.matches,
126
+ subjectEvidence: subjectHit.matches,
127
+ normalized: norm,
128
+ };
129
+ }
130
+ /** Map a target to the recommended transport. */
131
+ export function planTransport(target, opts = {}) {
132
+ const lanPort = opts.lanPort ?? 7741;
133
+ switch (target) {
134
+ case "this-pc":
135
+ return {
136
+ transport: "same-shell",
137
+ openUrl: `http://localhost:${lanPort}/local`,
138
+ description: "Open the SAME-SHELL page on localhost. Brain auto-copies to clipboard. Click any AI button → paste.",
139
+ };
140
+ case "chatgpt":
141
+ return {
142
+ transport: "web-paste",
143
+ aiUrl: "https://chatgpt.com/",
144
+ description: "Copy brain to clipboard + open ChatGPT.com in a new tab. Paste in the chat.",
145
+ };
146
+ case "gemini":
147
+ return {
148
+ transport: "web-paste",
149
+ aiUrl: "https://gemini.google.com/app",
150
+ description: "Copy brain to clipboard + open Gemini in a new tab. Paste in the chat.",
151
+ };
152
+ case "claude":
153
+ return {
154
+ transport: "web-paste",
155
+ aiUrl: "https://claude.ai/new",
156
+ description: "Copy brain to clipboard + open Claude.ai in a new tab. Paste in the chat.",
157
+ };
158
+ case "perplexity":
159
+ return {
160
+ transport: "web-paste",
161
+ aiUrl: "https://www.perplexity.ai/",
162
+ description: "Copy brain to clipboard + open Perplexity in a new tab. Paste in the chat.",
163
+ };
164
+ case "copilot":
165
+ return {
166
+ transport: "web-paste",
167
+ aiUrl: "https://github.com/copilot",
168
+ description: "Copy brain to clipboard + open GitHub Copilot Chat (web). Paste in the chat.",
169
+ };
170
+ case "vscode":
171
+ return {
172
+ transport: "same-shell",
173
+ openUrl: `http://localhost:${lanPort}/local`,
174
+ description: "Open SAME-SHELL page. Brain on clipboard. Switch to VS Code / Cursor chat → paste.",
175
+ };
176
+ case "mobile":
177
+ case "ipad":
178
+ return {
179
+ transport: "tunnel-qr",
180
+ lanPort,
181
+ description: "Render PC page with QR + cloudflared tunnel (works any network) → mobile camera scans → opens page → tap green button.",
182
+ };
183
+ case "another-pc":
184
+ return {
185
+ transport: "lan-qr",
186
+ lanPort,
187
+ description: "Open LAN page on this PC, show URL + QR. Other PC opens the URL.",
188
+ };
189
+ case "usb":
190
+ return {
191
+ transport: "usb-wanderer",
192
+ description: "Pack brain as a signed .mwt file → drop on USB → unpack on other machine via 'mneme wanderer unpack'.",
193
+ };
194
+ case "return":
195
+ return {
196
+ transport: "boomerang-return",
197
+ description: "Paste the Web AI's reply (must include HOMUNCULUS RETURN block) → /return endpoint → editor AI ingests via mneme.abyss.homunculus.ingest.",
198
+ };
199
+ case "unknown":
200
+ return {
201
+ transport: "menu",
202
+ description: "Target unclear — show user the menu so they can pick.",
203
+ options: [
204
+ { target: "this-pc", label: "💻 Browser on THIS PC (no QR, no tunnel — fastest)" },
205
+ { target: "mobile", label: "📱 Mobile / Phone (QR scan, any network)" },
206
+ { target: "another-pc", label: "🖥 Another computer / laptop (LAN bridge or USB)" },
207
+ { target: "chatgpt", label: "🟢 ChatGPT.com (paste in browser)" },
208
+ { target: "gemini", label: "🔵 Gemini (paste in browser)" },
209
+ { target: "claude", label: "🟣 Claude.ai (paste in browser)" },
210
+ { target: "copilot", label: "🤖 GitHub Copilot Chat (paste in browser)" },
211
+ { target: "usb", label: "💾 USB / offline (.mwt file)" },
212
+ { target: "return", label: "🪃 Send reply BACK from Web AI to this editor AI" },
213
+ ],
214
+ };
215
+ }
216
+ }
217
+ /** Open a URL in the default browser. Cross-platform: Win/Mac/Linux/WSL. */
218
+ export function openInBrowser(url, opts = {}) {
219
+ const p = platform();
220
+ let cmd;
221
+ let args;
222
+ if (p === "win32") {
223
+ cmd = "cmd";
224
+ args = ["/c", "start", "", url];
225
+ }
226
+ else if (p === "darwin") {
227
+ cmd = "open";
228
+ args = [url];
229
+ }
230
+ else {
231
+ cmd = "xdg-open";
232
+ args = [url];
233
+ }
234
+ try {
235
+ if (opts.spawnOverride) {
236
+ opts.spawnOverride(cmd, args);
237
+ }
238
+ else {
239
+ spawn(cmd, args, { detached: true, stdio: "ignore" }).unref();
240
+ }
241
+ return { command: cmd, args, opened: true };
242
+ }
243
+ catch {
244
+ return { command: cmd, args, opened: false };
245
+ }
246
+ }
247
+ /** The single function AI agents call when the user says ANY phrase about
248
+ * sending / cloning / syncing / moving brain to anywhere. */
249
+ export function cloneTo(input) {
250
+ let intent = null;
251
+ let target;
252
+ if (input.target) {
253
+ target = input.target;
254
+ }
255
+ else if (input.userText) {
256
+ intent = parseCloneIntent(input.userText);
257
+ target = intent.target;
258
+ }
259
+ else {
260
+ target = "unknown";
261
+ }
262
+ const plan = planTransport(target, { lanPort: input.lanPort });
263
+ const openBrowser = input.openBrowser !== false;
264
+ let browserOpen;
265
+ let userInstruction;
266
+ if (plan.transport === "same-shell") {
267
+ if (openBrowser)
268
+ browserOpen = openInBrowser(plan.openUrl, { spawnOverride: input.spawnOverride });
269
+ userInstruction = `Opened ${plan.openUrl} in your browser. ${plan.description}`;
270
+ }
271
+ else if (plan.transport === "web-paste") {
272
+ if (openBrowser)
273
+ browserOpen = openInBrowser(plan.aiUrl, { spawnOverride: input.spawnOverride });
274
+ userInstruction = `Brain is on your clipboard. Opened ${plan.aiUrl}. Paste with Ctrl+V (Cmd+V on Mac).`;
275
+ }
276
+ else if (plan.transport === "lan-qr") {
277
+ userInstruction = `LAN page ready at port ${plan.lanPort}. Open the URL or scan the QR shown there from the other device.`;
278
+ }
279
+ else if (plan.transport === "tunnel-qr") {
280
+ userInstruction = `Mobile handoff page ready. Scan the QR with your phone camera, tap the link, tap the green Send button.`;
281
+ }
282
+ else if (plan.transport === "usb-wanderer") {
283
+ userInstruction = `Run 'mneme wanderer pack' to produce a .mwt file. Drop on USB. On the other machine: 'mneme wanderer unpack <file>'.`;
284
+ }
285
+ else if (plan.transport === "boomerang-return") {
286
+ userInstruction = `Paste the Web AI's reply (must contain '# HOMUNCULUS RETURN'). Mneme ingests via the return-pad on the SAME-SHELL page.`;
287
+ }
288
+ else {
289
+ // menu
290
+ const lines = plan.options.map((o, i) => ` ${i + 1}. ${o.label}`).join("\n");
291
+ userInstruction = `Where to? Pick one and say "clone to <target>":\n${lines}`;
292
+ }
293
+ return { intent, resolvedTarget: target, plan, userInstruction, browserOpen };
294
+ }
295
+ /** Pulse-style summary for AI agents to surface. */
296
+ export function formatCloneToPulseLine(r) {
297
+ return `CLONE-TO · target=${r.resolvedTarget} · transport=${r.plan.transport}${r.browserOpen ? ` · browser=${r.browserOpen.opened ? "opened" : "failed"}` : ""}${r.intent ? ` · confidence=${(r.intent.confidence * 100).toFixed(0)}%` : ""}`;
298
+ }
299
+ //# sourceMappingURL=clone_to.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone_to.js","sourceRoot":"","sources":["../../src/rainbow/clone_to.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA4BnC,MAAM,eAAe,GAAoB;IACvC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE;IACzJ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;IACvE,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE;IAC/Q,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE;IAC3Q,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE;IACrF,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;IACjG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,EAAE,4DAA4D;IACpJ,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE;IAC3E,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE;IAC1E,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;IACrG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE;IACzH,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE;CACpH,CAAC;AAEF,yEAAyE;AACzE,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;IACrJ,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;CACpG,CAAC;AAEF,0EAA0E;AAC1E,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM;IACxE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ;CACzD,CAAC;AAgBF,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,OAAiB;IACtD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED;qDACqD;AACrD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAEpD,+DAA+D;IAC/D,IAAI,UAAU,GAAgB,SAAS,CAAC;IACxC,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACV,4DAA4D;YAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1D,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;gBAClB,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;gBACtB,YAAY,GAAG,CAAC,CAAC,OAAO,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,cAAc;IACd,oDAAoD;IACpD,kCAAkC;IAClC,kCAAkC;IAClC,sEAAsE;IACtE,kCAAkC;IAClC,kCAAkC;IAClC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,IAAI,UAAU,KAAK,SAAS;QAAE,UAAU,GAAG,IAAI,CAAC;SAC5E,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,KAAK,SAAS;QAAE,UAAU,GAAG,IAAI,CAAC;SAC/D,IAAI,UAAU,CAAC,GAAG,IAAI,UAAU,KAAK,SAAS;QAAE,UAAU,GAAG,IAAI,CAAC;SAClE,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG;QAAE,UAAU,GAAG,IAAI,CAAC;SACrD,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,UAAU,GAAG,IAAI,CAAC;SACnF,IAAI,OAAO,CAAC,GAAG;QAAE,UAAU,GAAG,IAAI,CAAC;IAExC,OAAO;QACL,cAAc,EAAE,UAAU,IAAI,GAAG;QACjC,UAAU;QACV,MAAM,EAAE,UAAU;QAClB,cAAc,EAAE,YAAY;QAC5B,YAAY,EAAE,OAAO,CAAC,OAAO;QAC7B,eAAe,EAAE,UAAU,CAAC,OAAO;QACnC,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAeD,iDAAiD;AACjD,MAAM,UAAU,aAAa,CAAC,MAAmB,EAAE,OAA6B,EAAE;IAChF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IACrC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO;gBACL,SAAS,EAAE,YAAY;gBACvB,OAAO,EAAE,oBAAoB,OAAO,QAAQ;gBAC5C,WAAW,EAAE,qGAAqG;aACnH,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,sBAAsB;gBAC7B,WAAW,EAAE,6EAA6E;aAC3F,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,+BAA+B;gBACtC,WAAW,EAAE,wEAAwE;aACtF,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,uBAAuB;gBAC9B,WAAW,EAAE,2EAA2E;aACzF,CAAC;QACJ,KAAK,YAAY;YACf,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,4BAA4B;gBACnC,WAAW,EAAE,4EAA4E;aAC1F,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,4BAA4B;gBACnC,WAAW,EAAE,8EAA8E;aAC5F,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,SAAS,EAAE,YAAY;gBACvB,OAAO,EAAE,oBAAoB,OAAO,QAAQ;gBAC5C,WAAW,EAAE,oFAAoF;aAClG,CAAC;QACJ,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,OAAO;gBACP,WAAW,EAAE,wHAAwH;aACtI,CAAC;QACJ,KAAK,YAAY;YACf,OAAO;gBACL,SAAS,EAAE,QAAQ;gBACnB,OAAO;gBACP,WAAW,EAAE,kEAAkE;aAChF,CAAC;QACJ,KAAK,KAAK;YACR,OAAO;gBACL,SAAS,EAAE,cAAc;gBACzB,WAAW,EAAE,uGAAuG;aACrH,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,SAAS,EAAE,kBAAkB;gBAC7B,WAAW,EAAE,2IAA2I;aACzJ,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,SAAS,EAAE,MAAM;gBACjB,WAAW,EAAE,uDAAuD;gBACpE,OAAO,EAAE;oBACP,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,oDAAoD,EAAE;oBAClF,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,0CAA0C,EAAE;oBACvE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,kDAAkD,EAAE;oBACnF,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,mCAAmC,EAAE;oBACjE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,8BAA8B,EAAE;oBAC3D,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,iCAAiC,EAAE;oBAC9D,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,2CAA2C,EAAE;oBACzE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE;oBACxD,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,kDAAkD,EAAE;iBAChF;aACF,CAAC;IACN,CAAC;AACH,CAAC;AAWD,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,OAA2B,EAAE;IACtE,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,IAAI,GAAW,CAAC;IAChB,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QAClB,GAAG,GAAG,KAAK,CAAC;QACZ,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,GAAG,GAAG,MAAM,CAAC;QACb,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,UAAU,CAAC;QACjB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC;AA6BD;8DAC8D;AAC9D,MAAM,UAAU,OAAO,CAAC,KAAmB;IACzC,IAAI,MAAM,GAA6B,IAAI,CAAC;IAC5C,IAAI,MAAmB,CAAC;IACxB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACxB,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC;IAEhD,IAAI,WAAyC,CAAC;IAC9C,IAAI,eAAuB,CAAC;IAE5B,IAAI,IAAI,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;QACpC,IAAI,WAAW;YAAE,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;QACnG,eAAe,GAAG,UAAU,IAAI,CAAC,OAAO,qBAAqB,IAAI,CAAC,WAAW,EAAE,CAAC;IAClF,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;QAC1C,IAAI,WAAW;YAAE,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;QACjG,eAAe,GAAG,sCAAsC,IAAI,CAAC,KAAK,qCAAqC,CAAC;IAC1G,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvC,eAAe,GAAG,0BAA0B,IAAI,CAAC,OAAO,kEAAkE,CAAC;IAC7H,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;QAC1C,eAAe,GAAG,yGAAyG,CAAC;IAC9H,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,EAAE,CAAC;QAC7C,eAAe,GAAG,sHAAsH,CAAC;IAC3I,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,KAAK,kBAAkB,EAAE,CAAC;QACjD,eAAe,GAAG,yHAAyH,CAAC;IAC9I,CAAC;SAAM,CAAC;QACN,OAAO;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,eAAe,GAAG,oDAAoD,KAAK,EAAE,CAAC;IAChF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC;AAChF,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,sBAAsB,CAAC,CAAgB;IACrD,OAAO,qBAAqB,CAAC,CAAC,cAAc,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAChP,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clone_to.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone_to.test.d.ts","sourceRoot":"","sources":["../../src/rainbow/clone_to.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,266 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { parseCloneIntent, planTransport, cloneTo, formatCloneToPulseLine, openInBrowser, } from "./clone_to.js";
3
+ import { DEPRECATED_RELAY_PATHS, formatBugTruth } from "./bug_truth.js";
4
+ // ============================================================
5
+ // Phrase recognition — every phrase the user complained about MUST be
6
+ // recognized + routed to the right target.
7
+ // ============================================================
8
+ describe("v1.97 CLONE-TO · Thai phrase recognition (the bugs the user yelled about)", () => {
9
+ it("recognizes 'ย้าย mneme ไปใส่ใน mobile หน่อย'", () => {
10
+ const r = parseCloneIntent("ย้าย mneme ไปใส่ใน mobile หน่อย");
11
+ expect(r.isCloneRequest).toBe(true);
12
+ expect(r.target).toBe("mobile");
13
+ expect(r.confidence).toBeGreaterThan(0.7);
14
+ });
15
+ it("recognizes 'ส่งความจำของ mneme ไปใน gemini'", () => {
16
+ const r = parseCloneIntent("ส่งความจำของ mneme ไปใน gemini");
17
+ expect(r.isCloneRequest).toBe(true);
18
+ expect(r.target).toBe("gemini");
19
+ expect(r.confidence).toBeGreaterThanOrEqual(0.95);
20
+ });
21
+ it("recognizes 'ส่งสมองไปมือถือ'", () => {
22
+ const r = parseCloneIntent("ส่งสมองไปมือถือ");
23
+ expect(r.target).toBe("mobile");
24
+ expect(r.isCloneRequest).toBe(true);
25
+ });
26
+ it("recognizes 'โคลน mneme ไป chat gpt'", () => {
27
+ const r = parseCloneIntent("โคลน mneme ไป chat gpt");
28
+ expect(r.target).toBe("chatgpt");
29
+ });
30
+ it("recognizes 'sync brain to ipad'", () => {
31
+ const r = parseCloneIntent("sync brain to ipad");
32
+ expect(r.target).toBe("ipad");
33
+ });
34
+ it("recognizes 'clone to gemini-web'", () => {
35
+ const r = parseCloneIntent("clone to gemini-web");
36
+ expect(r.target).toBe("gemini");
37
+ });
38
+ it("recognizes 'send brain to my notebook'", () => {
39
+ const r = parseCloneIntent("send brain to my notebook");
40
+ expect(r.target).toBe("another-pc");
41
+ });
42
+ it("recognizes 'ก๊อปไปเครื่องนี้ browser'", () => {
43
+ const r = parseCloneIntent("ก๊อปไปเครื่องนี้ browser");
44
+ expect(r.target).toBe("this-pc");
45
+ });
46
+ it("recognizes 'copilot ใช้ mneme หน่อย'", () => {
47
+ const r = parseCloneIntent("copilot ใช้ mneme หน่อย");
48
+ expect(r.target).toBe("copilot");
49
+ });
50
+ it("recognizes 'pack mneme to usb'", () => {
51
+ const r = parseCloneIntent("pack mneme to usb");
52
+ expect(r.target).toBe("usb");
53
+ });
54
+ it("recognizes 'ส่งกลับมาที่ pc'", () => {
55
+ const r = parseCloneIntent("ส่งกลับมาที่ pc");
56
+ expect(r.target).toBe("return");
57
+ });
58
+ it("returns target=unknown + medium confidence when target ambiguous", () => {
59
+ const r = parseCloneIntent("ส่งสมอง mneme หน่อย");
60
+ expect(r.target).toBe("unknown");
61
+ expect(r.isCloneRequest).toBe(true); // still want clone, just unclear where
62
+ expect(r.confidence).toBeGreaterThanOrEqual(0.5);
63
+ expect(r.confidence).toBeLessThan(0.95);
64
+ });
65
+ it("returns isCloneRequest=false for non-clone messages", () => {
66
+ expect(parseCloneIntent("hi how are you").isCloneRequest).toBe(false);
67
+ expect(parseCloneIntent("what's the weather").isCloneRequest).toBe(false);
68
+ });
69
+ it("recognizes English + Thai mixed phrases", () => {
70
+ const r = parseCloneIntent("Please send my brain ไปที่ chatgpt now");
71
+ expect(r.target).toBe("chatgpt");
72
+ expect(r.isCloneRequest).toBe(true);
73
+ });
74
+ });
75
+ // ============================================================
76
+ // Transport planning
77
+ // ============================================================
78
+ describe("v1.97 CLONE-TO · transport planning", () => {
79
+ it("this-pc → same-shell on localhost:7741/local", () => {
80
+ const p = planTransport("this-pc");
81
+ expect(p.transport).toBe("same-shell");
82
+ if (p.transport === "same-shell") {
83
+ expect(p.openUrl).toContain("localhost:7741/local");
84
+ }
85
+ });
86
+ it("chatgpt → web-paste with chatgpt.com URL", () => {
87
+ const p = planTransport("chatgpt");
88
+ expect(p.transport).toBe("web-paste");
89
+ if (p.transport === "web-paste")
90
+ expect(p.aiUrl).toContain("chatgpt.com");
91
+ });
92
+ it("gemini → web-paste with gemini.google.com URL (no ?q= deep link)", () => {
93
+ const p = planTransport("gemini");
94
+ if (p.transport === "web-paste") {
95
+ expect(p.aiUrl).toContain("gemini.google.com");
96
+ // The fix for BUG #3: NO ?q= deep link reliance — open home page.
97
+ expect(p.aiUrl).not.toContain("?q=");
98
+ }
99
+ });
100
+ it("claude → claude.ai/new (no encrypted-fetch reliance — BUG #1 + #2 fix)", () => {
101
+ const p = planTransport("claude");
102
+ if (p.transport === "web-paste") {
103
+ expect(p.aiUrl).toContain("claude.ai");
104
+ // No fetch / decrypt instruction — pure clipboard handoff
105
+ expect(p.description).not.toContain("fetch");
106
+ expect(p.description).not.toContain("decrypt");
107
+ }
108
+ });
109
+ it("mobile → tunnel-qr (any network)", () => {
110
+ const p = planTransport("mobile");
111
+ expect(p.transport).toBe("tunnel-qr");
112
+ });
113
+ it("usb → wanderer pack/unpack flow", () => {
114
+ const p = planTransport("usb");
115
+ expect(p.transport).toBe("usb-wanderer");
116
+ });
117
+ it("unknown → menu with all options listed", () => {
118
+ const p = planTransport("unknown");
119
+ expect(p.transport).toBe("menu");
120
+ if (p.transport === "menu") {
121
+ expect(p.options.length).toBeGreaterThanOrEqual(6);
122
+ expect(p.options.map((o) => o.target)).toContain("this-pc");
123
+ expect(p.options.map((o) => o.target)).toContain("mobile");
124
+ expect(p.options.map((o) => o.target)).toContain("gemini");
125
+ }
126
+ });
127
+ it("return → boomerang-return path", () => {
128
+ const p = planTransport("return");
129
+ expect(p.transport).toBe("boomerang-return");
130
+ });
131
+ it("respects custom LAN port", () => {
132
+ const p = planTransport("this-pc", { lanPort: 8888 });
133
+ if (p.transport === "same-shell")
134
+ expect(p.openUrl).toContain("8888");
135
+ });
136
+ });
137
+ // ============================================================
138
+ // cloneTo top-level dispatcher
139
+ // ============================================================
140
+ describe("v1.97 CLONE-TO · cloneTo dispatcher", () => {
141
+ it("parses user text → opens browser → returns instruction", () => {
142
+ let openedCmd = "";
143
+ let openedArgs = [];
144
+ const r = cloneTo({
145
+ userText: "ส่งความจำของ mneme ไปใน gemini",
146
+ spawnOverride: (cmd, args) => { openedCmd = cmd; openedArgs = args; },
147
+ });
148
+ expect(r.resolvedTarget).toBe("gemini");
149
+ expect(r.browserOpen?.opened).toBe(true);
150
+ expect(openedCmd.length).toBeGreaterThan(0);
151
+ expect(openedArgs.some((a) => a.includes("gemini.google.com"))).toBe(true);
152
+ expect(r.userInstruction.toLowerCase()).toContain("clipboard");
153
+ });
154
+ it("accepts target directly (skips parsing)", () => {
155
+ const r = cloneTo({
156
+ target: "mobile",
157
+ openBrowser: false,
158
+ });
159
+ expect(r.resolvedTarget).toBe("mobile");
160
+ expect(r.intent).toBeNull();
161
+ });
162
+ it("openBrowser=false suppresses spawn", () => {
163
+ let opened = false;
164
+ const r = cloneTo({
165
+ target: "chatgpt",
166
+ openBrowser: false,
167
+ spawnOverride: () => { opened = true; },
168
+ });
169
+ expect(opened).toBe(false);
170
+ expect(r.browserOpen).toBeUndefined();
171
+ });
172
+ it("unknown target shows menu (no browser opened)", () => {
173
+ let opened = false;
174
+ const r = cloneTo({
175
+ userText: "ส่งหน่อย", // verb but no target
176
+ spawnOverride: () => { opened = true; },
177
+ });
178
+ expect(r.resolvedTarget).toBe("unknown");
179
+ expect(r.plan.transport).toBe("menu");
180
+ expect(opened).toBe(false);
181
+ expect(r.userInstruction).toMatch(/where to|pick one|menu/i);
182
+ });
183
+ it("formatCloneToPulseLine produces compact summary", () => {
184
+ const r = cloneTo({ userText: "clone to gemini", openBrowser: false });
185
+ const line = formatCloneToPulseLine(r);
186
+ expect(line).toContain("CLONE-TO");
187
+ expect(line).toContain("gemini");
188
+ expect(line).toContain("web-paste");
189
+ });
190
+ });
191
+ // ============================================================
192
+ // Cross-platform browser open
193
+ // ============================================================
194
+ describe("v1.97 CLONE-TO · openInBrowser", () => {
195
+ it("Windows → cmd /c start", () => {
196
+ let called = null;
197
+ openInBrowser("https://example.com", { spawnOverride: (cmd, args) => { called = { cmd, args }; } });
198
+ expect(called).toBeTruthy();
199
+ if (process.platform === "win32")
200
+ expect(called.cmd).toBe("cmd");
201
+ });
202
+ it("returns opened=true on success path", () => {
203
+ const r = openInBrowser("https://example.com", { spawnOverride: () => undefined });
204
+ expect(r.opened).toBe(true);
205
+ expect(r.command.length).toBeGreaterThan(0);
206
+ });
207
+ });
208
+ // ============================================================
209
+ // BUG-TRUTH (honest postmortem must ship in code)
210
+ // ============================================================
211
+ describe("v1.97 BUG-TRUTH · honest deprecation record", () => {
212
+ it("lists at least 3 deprecated relay paths with reason + replacement", () => {
213
+ expect(DEPRECATED_RELAY_PATHS.length).toBeGreaterThanOrEqual(3);
214
+ for (const w of DEPRECATED_RELAY_PATHS) {
215
+ expect(w.module).toBeTruthy();
216
+ expect(w.reason.length).toBeGreaterThan(20);
217
+ expect(w.replacement.length).toBeGreaterThan(10);
218
+ }
219
+ });
220
+ it("explicitly names the AES/PBKDF2 + URL fetch failures", () => {
221
+ const all = DEPRECATED_RELAY_PATHS.map((w) => w.reason).join(" ");
222
+ expect(all).toMatch(/AES|PBKDF2|crypto/i);
223
+ expect(all).toMatch(/fetch|web/i);
224
+ expect(all).toMatch(/deep.link|prefill|\?q=/i);
225
+ });
226
+ it("formatBugTruth produces a multi-line human-readable report", () => {
227
+ const s = formatBugTruth();
228
+ expect(s).toContain("🔴");
229
+ expect(s).toContain("why:");
230
+ expect(s).toContain("use:");
231
+ });
232
+ });
233
+ // ============================================================
234
+ // Full list of phrases that MUST work — regression suite
235
+ // ============================================================
236
+ describe("v1.97 CLONE-TO · regression suite of 'phrases that must work'", () => {
237
+ // Each entry: { phrase, expectedTarget }
238
+ const cases = [
239
+ { phrase: "ย้าย mneme ไปใส่ใน mobile หน่อย", expected: "mobile" },
240
+ { phrase: "ส่งความจำของ mneme ไปใน gemini", expected: "gemini" },
241
+ { phrase: "ส่งสมองไปมือถือ", expected: "mobile" },
242
+ { phrase: "ส่งสมองไป iphone", expected: "mobile" },
243
+ { phrase: "ส่งไป android", expected: "mobile" },
244
+ { phrase: "clone brain to ipad", expected: "ipad" },
245
+ { phrase: "send mneme to chat gpt", expected: "chatgpt" },
246
+ { phrase: "sync to claude.ai", expected: "claude" },
247
+ { phrase: "ส่ง mneme ไป copilot", expected: "copilot" },
248
+ { phrase: "give brain to perplexity", expected: "perplexity" },
249
+ { phrase: "ก๊อปไป tablet", expected: "ipad" },
250
+ { phrase: "send brain to my second laptop", expected: "another-pc" },
251
+ { phrase: "clone to localhost", expected: "this-pc" },
252
+ { phrase: "send mneme to browser on this pc", expected: "this-pc" },
253
+ { phrase: "pack mneme as a file", expected: "usb" },
254
+ { phrase: "send back to my pc", expected: "return" },
255
+ { phrase: "Mneme ส่งไป google ai หน่อย", expected: "gemini" },
256
+ { phrase: "share mneme กับ openai", expected: "chatgpt" },
257
+ ];
258
+ for (const { phrase, expected } of cases) {
259
+ it(`'${phrase}' → ${expected}`, () => {
260
+ const r = parseCloneIntent(phrase);
261
+ expect(r.target).toBe(expected);
262
+ expect(r.isCloneRequest).toBe(true);
263
+ });
264
+ }
265
+ });
266
+ //# sourceMappingURL=clone_to.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone_to.test.js","sourceRoot":"","sources":["../../src/rainbow/clone_to.test.ts"],"names":[],"mappings":"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"}
@@ -49,8 +49,5 @@ export interface RainbowInputs {
49
49
  /** Build the channel status report. UI layer (browser/CLI) renders the
50
50
  * actual QR codes; this module just decides which channels are LIVE. */
51
51
  export declare function probeChannels(soul: SoulPrompt, input: RainbowInputs): RainbowHandoff;
52
- /** Build the data: URL bridge -- the wild move. Tiny HTML page that
53
- * fetches soul from dpaste + renders Web Share button. Whole thing
54
- * fits in a QR because the soul is fetched, not embedded. */
55
52
  export declare function buildDataBridgeUrl(dpasteUrl: string): string;
56
53
  //# sourceMappingURL=handoff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/rainbow/handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEnG,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,sDAAsD;IACtD,WAAW,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;yEACyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,cAAc,CAiDpF;AAED;;8DAE8D;AAC9D,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkB5D"}
1
+ {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/rainbow/handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEnG,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,sDAAsD;IACtD,WAAW,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;yEACyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,cAAc,CAiDpF;AAUD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAuB5D"}
@@ -67,10 +67,20 @@ export function probeChannels(soul, input) {
67
67
  const summary = `${liveCount}/3 channels live (v1.89). Recommended: ${recommended ?? "none"}.`;
68
68
  return { soul, channels, recommended, summary };
69
69
  }
70
- /** Build the data: URL bridge -- the wild move. Tiny HTML page that
71
- * fetches soul from dpaste + renders Web Share button. Whole thing
72
- * fits in a QR because the soul is fetched, not embedded. */
70
+ /** @deprecated v1.97 DO NOT USE. See bug_truth.ts for the 4 reasons
71
+ * this fails on every free-tier Web AI. Use rainbow.clone_to.cloneTo
72
+ * with target "chatgpt" / "gemini" / "claude" instead those rely on
73
+ * CLIPBOARD (which every Web AI supports) not WEB-FETCH (which most
74
+ * free-tier Web AIs lack).
75
+ * Kept as an export for backward compatibility; emits a console.warn
76
+ * on first call to alert any caller still depending on this. */
77
+ let _dataBridgeWarned = false;
73
78
  export function buildDataBridgeUrl(dpasteUrl) {
79
+ if (!_dataBridgeWarned) {
80
+ _dataBridgeWarned = true;
81
+ // eslint-disable-next-line no-console
82
+ console.warn("[mneme] buildDataBridgeUrl is DEPRECATED (v1.97). See rainbow.bug_truth + rainbow.clone_to for the working clipboard-based replacement.");
83
+ }
74
84
  const wrapper = `<!doctype html><html><head>` +
75
85
  `<meta name="viewport" content="width=device-width,initial-scale=1">` +
76
86
  `<title>Mneme</title>` +
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/rainbow/handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAkCH;yEACyE;AACzE,MAAM,UAAU,aAAa,CAAC,IAAgB,EAAE,KAAoB;IAClE,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,QAAQ,CAAC,IAAI,CAAC;QACZ,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,mCAAmC;QAChH,GAAG,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;QACzB,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACrB,CAAC,CAAC;IAEH,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,KAAK,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IACzF,QAAQ,CAAC,IAAI,CAAC;QACZ,EAAE,EAAE,aAAa;QACjB,SAAS,EAAE,mBAAmB;QAC9B,MAAM,EAAE,mBAAmB;YACzB,CAAC,CAAC,sEAAsE;YACxE,CAAC,CAAC,gCAAgC;QACpC,iFAAiF;QACjF,GAAG,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAC5B,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACjC,CAAC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC;QACZ,EAAE,EAAE,YAAY;QAChB,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QACnC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,sBAAsB;QACvF,GAAG,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAC5B,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACjC,CAAC,CAAC;IAEH,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,sDAAsD,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACpK,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,iDAAiD,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACpK,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,sCAAsC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpJ,yGAAyG;IACzG,IAAI,WAAW,GAAqB,IAAI,CAAC;IACzC,IAAI,mBAAmB;QAAE,WAAW,GAAG,aAAa,CAAC;SAChD,IAAI,KAAK,CAAC,MAAM;QAAE,WAAW,GAAG,KAAK,CAAC;SACtC,IAAI,KAAK,CAAC,SAAS;QAAE,WAAW,GAAG,YAAY,CAAC;IAErD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC7D,MAAM,OAAO,GAAG,GAAG,SAAS,0CAA0C,WAAW,IAAI,MAAM,GAAG,CAAC;IAE/F,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED;;8DAE8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,OAAO,GACX,6BAA6B;QAC7B,qEAAqE;QACrE,sBAAsB;QACtB,kNAAkN;QAClN,8JAA8J;QAC9J,mCAAmC;QACnC,oDAAoD;QACpD,sCAAsC;QACtC,kBAAkB,SAAS,gCAAgC;QAC3D,wDAAwD;QACxD,8BAA8B;QAC9B,0DAA0D;QAC1D,qEAAqE;QACrE,4EAA4E;QAC5E,yBAAyB,CAAC;IAC5B,OAAO,+BAA+B,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/rainbow/handoff.ts"],"names":[],"mappings":"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"}
@@ -19,4 +19,6 @@ export * from "./page_renderer.js";
19
19
  export * from "./same_shell.js";
20
20
  export * from "./phoenix.js";
21
21
  export * from "./boomerang.js";
22
+ export * from "./clone_to.js";
23
+ export * from "./bug_truth.js";
22
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rainbow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rainbow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAI/B,cAAc,eAAe,CAAC;AAG9B,cAAc,gBAAgB,CAAC"}
@@ -19,4 +19,11 @@ export * from "./page_renderer.js";
19
19
  export * from "./same_shell.js";
20
20
  export * from "./phoenix.js";
21
21
  export * from "./boomerang.js";
22
+ // v1.97 — clone_to: universal Thai+English+mixed intent parser →
23
+ // transport plan → auto-open browser. The ONE function AI agents call
24
+ // when user says ANY phrase about sending/cloning/syncing brain.
25
+ export * from "./clone_to.js";
26
+ // v1.97 — bug_truth: honest postmortem on v1.85 RELAY (4 bugs the user
27
+ // caught us in). Replacement is clone_to.cloneTo with clipboard transport.
28
+ export * from "./bug_truth.js";
22
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rainbow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rainbow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,iEAAiE;AACjE,sEAAsE;AACtE,iEAAiE;AACjE,cAAc,eAAe,CAAC;AAC9B,uEAAuE;AACvE,2EAA2E;AAC3E,cAAc,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mneme-ai/core",
3
- "version": "1.96.0",
3
+ "version": "1.97.0",
4
4
  "description": "Core indexing, retrieval, and graph engine for Mneme",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",