@mneme-ai/core 1.95.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.
- package/dist/qx_bridge/agnostic.d.ts +180 -0
- package/dist/qx_bridge/agnostic.d.ts.map +1 -0
- package/dist/qx_bridge/agnostic.js +320 -0
- package/dist/qx_bridge/agnostic.js.map +1 -0
- package/dist/qx_bridge/agnostic.test.d.ts +2 -0
- package/dist/qx_bridge/agnostic.test.d.ts.map +1 -0
- package/dist/qx_bridge/agnostic.test.js +333 -0
- package/dist/qx_bridge/agnostic.test.js.map +1 -0
- package/dist/qx_bridge/capabilities.d.ts +51 -0
- package/dist/qx_bridge/capabilities.d.ts.map +1 -0
- package/dist/qx_bridge/capabilities.js +116 -0
- package/dist/qx_bridge/capabilities.js.map +1 -0
- package/dist/qx_bridge/decomposer.d.ts +43 -0
- package/dist/qx_bridge/decomposer.d.ts.map +1 -0
- package/dist/qx_bridge/decomposer.js +123 -0
- package/dist/qx_bridge/decomposer.js.map +1 -0
- package/dist/qx_bridge/index.d.ts +5 -0
- package/dist/qx_bridge/index.d.ts.map +1 -1
- package/dist/qx_bridge/index.js +7 -0
- package/dist/qx_bridge/index.js.map +1 -1
- package/dist/qx_bridge/qasm_parser.d.ts +56 -0
- package/dist/qx_bridge/qasm_parser.d.ts.map +1 -0
- package/dist/qx_bridge/qasm_parser.js +362 -0
- package/dist/qx_bridge/qasm_parser.js.map +1 -0
- package/dist/qx_bridge/simulator.d.ts +3 -1
- package/dist/qx_bridge/simulator.d.ts.map +1 -1
- package/dist/qx_bridge/simulator.js +11 -0
- package/dist/qx_bridge/simulator.js.map +1 -1
- package/dist/rainbow/bug_truth.d.ts +62 -0
- package/dist/rainbow/bug_truth.d.ts.map +1 -0
- package/dist/rainbow/bug_truth.js +74 -0
- package/dist/rainbow/bug_truth.js.map +1 -0
- package/dist/rainbow/clone_to.d.ts +133 -0
- package/dist/rainbow/clone_to.d.ts.map +1 -0
- package/dist/rainbow/clone_to.js +299 -0
- package/dist/rainbow/clone_to.js.map +1 -0
- package/dist/rainbow/clone_to.test.d.ts +2 -0
- package/dist/rainbow/clone_to.test.d.ts.map +1 -0
- package/dist/rainbow/clone_to.test.js +266 -0
- package/dist/rainbow/clone_to.test.js.map +1 -0
- package/dist/rainbow/handoff.d.ts +0 -3
- package/dist/rainbow/handoff.d.ts.map +1 -1
- package/dist/rainbow/handoff.js +13 -3
- package/dist/rainbow/handoff.js.map +1 -1
- package/dist/rainbow/index.d.ts +2 -0
- package/dist/rainbow/index.d.ts.map +1 -1
- package/dist/rainbow/index.js +7 -0
- package/dist/rainbow/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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":"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"}
|
|
@@ -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;
|
|
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"}
|