@mneme-ai/core 1.96.0 → 1.98.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/permeate/userscript_generator.d.ts.map +1 -1
- package/dist/permeate/userscript_generator.js +1 -0
- package/dist/permeate/userscript_generator.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 +5 -0
- package/dist/rainbow/index.d.ts.map +1 -1
- package/dist/rainbow/index.js +18 -0
- package/dist/rainbow/index.js.map +1 -1
- package/dist/rainbow/passport.d.ts +107 -0
- package/dist/rainbow/passport.d.ts.map +1 -0
- package/dist/rainbow/passport.js +145 -0
- package/dist/rainbow/passport.js.map +1 -0
- package/dist/rainbow/v1_98.test.d.ts +2 -0
- package/dist/rainbow/v1_98.test.d.ts.map +1 -0
- package/dist/rainbow/v1_98.test.js +307 -0
- package/dist/rainbow/v1_98.test.js.map +1 -0
- package/dist/rainbow/vendor_probe.d.ts +52 -0
- package/dist/rainbow/vendor_probe.d.ts.map +1 -0
- package/dist/rainbow/vendor_probe.js +111 -0
- package/dist/rainbow/vendor_probe.js.map +1 -0
- package/dist/rainbow/vendor_strategy.d.ts +64 -0
- package/dist/rainbow/vendor_strategy.d.ts.map +1 -0
- package/dist/rainbow/vendor_strategy.js +157 -0
- package/dist/rainbow/vendor_strategy.js.map +1 -0
- package/dist/relay/deep_link.d.ts +24 -15
- package/dist/relay/deep_link.d.ts.map +1 -1
- package/dist/relay/deep_link.js +28 -18
- package/dist/relay/deep_link.js.map +1 -1
- package/dist/v1_87_regression.test.js +3 -2
- package/dist/v1_87_regression.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.98.0 -- RAINBOW · Vendor URL probe.
|
|
3
|
+
*
|
|
4
|
+
* Closes the "comment lies" gap that v1.85-1.96 had: code comments
|
|
5
|
+
* claimed "Verified May 2026" but no test actually hit the vendor URL.
|
|
6
|
+
* The user found that `chat.openai.com` had been replaced by
|
|
7
|
+
* `chatgpt.com` more than a year prior and our code was still pointing
|
|
8
|
+
* at the dead host.
|
|
9
|
+
*
|
|
10
|
+
* This module does the simplest thing that catches stale URLs: HEAD
|
|
11
|
+
* each vendor home URL, record the response status + final URL after
|
|
12
|
+
* redirects + whether the host changed. If the host changes (e.g.
|
|
13
|
+
* chat.openai.com → chatgpt.com via 308), we flag it loudly.
|
|
14
|
+
*
|
|
15
|
+
* NOT a Playwright integration test — those need browser binaries +
|
|
16
|
+
* are flaky in CI. This is a deterministic, fast (one HEAD per
|
|
17
|
+
* vendor), zero-dependency check that the URL is at least reachable
|
|
18
|
+
* and not silently redirected to a different host.
|
|
19
|
+
*
|
|
20
|
+
* Run via:
|
|
21
|
+
* - Manually: `node -e "import('./vendor_probe.js').then(m => m.probeAllVendors().then(console.log))"`
|
|
22
|
+
* - In CI: daemon's nightly cycle (future) — surfaces stale URLs as inbox warnings
|
|
23
|
+
* - Test: `vendor_probe.test.ts` mocks fetch + asserts the redirect-detection logic
|
|
24
|
+
*/
|
|
25
|
+
import { VENDOR_REGISTRY } from "./vendor_strategy.js";
|
|
26
|
+
function hostOf(url) {
|
|
27
|
+
try {
|
|
28
|
+
return new URL(url).host;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function probeOne(entry, opts = {}) {
|
|
35
|
+
const url = entry.homeUrl;
|
|
36
|
+
if (!url || !url.startsWith("http")) {
|
|
37
|
+
return {
|
|
38
|
+
vendor: entry.id, url, finalUrl: null, status: null, hostChanged: false,
|
|
39
|
+
verdict: "SKIP", notes: `non-HTTP url (probably an app deep-link scheme)`, elapsedMs: 0,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
43
|
+
const timeoutMs = opts.timeoutMs ?? 8000;
|
|
44
|
+
const t0 = Date.now();
|
|
45
|
+
const ctrl = new AbortController();
|
|
46
|
+
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
|
|
47
|
+
try {
|
|
48
|
+
const res = await fetchImpl(url, {
|
|
49
|
+
method: "HEAD",
|
|
50
|
+
redirect: "follow",
|
|
51
|
+
signal: ctrl.signal,
|
|
52
|
+
headers: { "user-agent": opts.userAgent ?? "Mneme-vendor-probe/1.98 (+https://github.com/patsa2561-art/mneme-ai)" },
|
|
53
|
+
});
|
|
54
|
+
clearTimeout(timer);
|
|
55
|
+
const elapsedMs = Date.now() - t0;
|
|
56
|
+
const finalUrl = res.url || url;
|
|
57
|
+
const originalHost = hostOf(url);
|
|
58
|
+
const finalHost = hostOf(finalUrl);
|
|
59
|
+
const hostChanged = !!(originalHost && finalHost && originalHost !== finalHost);
|
|
60
|
+
let verdict;
|
|
61
|
+
let notes;
|
|
62
|
+
if (res.status === 404) {
|
|
63
|
+
verdict = "NOT_FOUND";
|
|
64
|
+
notes = `404 — vendor URL is dead`;
|
|
65
|
+
}
|
|
66
|
+
else if (res.status === 403 || res.status === 401) {
|
|
67
|
+
verdict = "BLOCKED";
|
|
68
|
+
notes = `${res.status} — vendor likely blocks bots (Cloudflare/UA). Browser-real users still work.`;
|
|
69
|
+
}
|
|
70
|
+
else if (hostChanged) {
|
|
71
|
+
verdict = "REDIRECT_HOST_CHANGE";
|
|
72
|
+
notes = `redirected from ${originalHost} to ${finalHost} — update vendor_strategy.ts homeUrl`;
|
|
73
|
+
}
|
|
74
|
+
else if (res.status >= 200 && res.status < 400) {
|
|
75
|
+
verdict = "OK";
|
|
76
|
+
notes = `reachable (status ${res.status})`;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
verdict = "NETWORK_ERR";
|
|
80
|
+
notes = `unexpected status ${res.status}`;
|
|
81
|
+
}
|
|
82
|
+
return { vendor: entry.id, url, finalUrl, status: res.status, hostChanged, verdict, notes, elapsedMs };
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
const elapsedMs = Date.now() - t0;
|
|
87
|
+
return {
|
|
88
|
+
vendor: entry.id, url, finalUrl: null, status: null, hostChanged: false,
|
|
89
|
+
verdict: "NETWORK_ERR", notes: `fetch error: ${e.message}`, elapsedMs,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Probe every registered vendor concurrently. Returns one ProbeResult
|
|
94
|
+
* per vendor. Total elapsed time ≈ slowest probe. */
|
|
95
|
+
export async function probeAllVendors(opts = {}) {
|
|
96
|
+
return Promise.all(VENDOR_REGISTRY.map((v) => probeOne(v, opts)));
|
|
97
|
+
}
|
|
98
|
+
/** Probe results that should ALERT — anything that isn't OK or SKIP. */
|
|
99
|
+
export function failingProbes(results) {
|
|
100
|
+
return results.filter((r) => r.verdict !== "OK" && r.verdict !== "SKIP" && r.verdict !== "BLOCKED");
|
|
101
|
+
}
|
|
102
|
+
/** One-line summary suitable for the pulse / CI logs. */
|
|
103
|
+
export function formatProbePulseLine(results) {
|
|
104
|
+
const groups = { OK: 0, REDIRECT_HOST_CHANGE: 0, NOT_FOUND: 0, NETWORK_ERR: 0, BLOCKED: 0, SKIP: 0 };
|
|
105
|
+
for (const r of results)
|
|
106
|
+
groups[r.verdict]++;
|
|
107
|
+
const failing = failingProbes(results);
|
|
108
|
+
const verdict = failing.length === 0 ? "✓ ALL_OK" : `✗ ${failing.length}_FAILING`;
|
|
109
|
+
return `VENDOR-PROBE ${verdict} · ok=${groups.OK} redirect=${groups.REDIRECT_HOST_CHANGE} 404=${groups.NOT_FOUND} blocked=${groups.BLOCKED} skip=${groups.SKIP} err=${groups.NETWORK_ERR}`;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=vendor_probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor_probe.js","sourceRoot":"","sources":["../../src/rainbow/vendor_probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.98.0 -- RAINBOW · Vendor strategy map.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the broken "one-size-fits-all RELAY" assumption with explicit
|
|
5
|
+
* per-vendor strategies. Each vendor (web AI, mobile app, MCP-capable
|
|
6
|
+
* editor, etc.) gets the transport that ACTUALLY works for its
|
|
7
|
+
* capability tier.
|
|
8
|
+
*
|
|
9
|
+
* Strategies:
|
|
10
|
+
* clipboard-first — copy plain text + open vendor home page. User pastes.
|
|
11
|
+
* Works on EVERY Web AI's free tier. The default.
|
|
12
|
+
* plain-qr — render plain-text soul as QR (NO encryption, NO
|
|
13
|
+
* fetch-instruction). Phone scans → copies → pastes.
|
|
14
|
+
* mcp-direct — vendor is MCP-aware (Claude Code, Cursor, Codex CLI,
|
|
15
|
+
* Continue) — Mneme MCP server exposes tools directly.
|
|
16
|
+
* No copy/paste needed.
|
|
17
|
+
* prefill-and-paste— vendor honors ?q= deep link AND has web-fetch
|
|
18
|
+
* (paid-tier ChatGPT Plus / Gemini Advanced). The
|
|
19
|
+
* old RELAY path. Used ONLY when caller explicitly
|
|
20
|
+
* asserts "I have a paid-tier AI with browsing".
|
|
21
|
+
* app-deeplink-NA — vendor mobile app does NOT honor any URL scheme.
|
|
22
|
+
* Mneme cannot help; tell the user honestly.
|
|
23
|
+
*
|
|
24
|
+
* Every entry has `verified` (boolean) + `lastChecked` (ISO date) so
|
|
25
|
+
* stale-URL claims like "Verified May 2026" cannot lie silently. The
|
|
26
|
+
* companion `vendor_probe.ts` actually hits each URL with HEAD + asserts.
|
|
27
|
+
*/
|
|
28
|
+
export type VendorStrategy = "clipboard-first" | "plain-qr" | "mcp-direct" | "prefill-and-paste" | "app-deeplink-NA";
|
|
29
|
+
export interface VendorEntry {
|
|
30
|
+
/** Canonical vendor id used across Mneme. */
|
|
31
|
+
id: string;
|
|
32
|
+
/** Display label. */
|
|
33
|
+
label: string;
|
|
34
|
+
/** Primary URL to open (home page for clipboard-first). */
|
|
35
|
+
homeUrl: string;
|
|
36
|
+
/** Default strategy for the FREE tier of this vendor. */
|
|
37
|
+
freeStrategy: VendorStrategy;
|
|
38
|
+
/** Strategy when user explicitly has the paid tier with browsing. */
|
|
39
|
+
paidStrategy: VendorStrategy;
|
|
40
|
+
/** Whether ?q= deep link is verified to work (empirical, not assumed). */
|
|
41
|
+
qParamWorks: boolean;
|
|
42
|
+
/** Whether the vendor offers web-fetch in chat (free tier). */
|
|
43
|
+
webFetchAvailable: boolean;
|
|
44
|
+
/** ISO date the URL was last probed. Updated by vendor_probe.ts. */
|
|
45
|
+
lastChecked: string;
|
|
46
|
+
/** Why we picked this strategy (transparency). */
|
|
47
|
+
reasoning: string;
|
|
48
|
+
}
|
|
49
|
+
/** Canonical vendor table. Source of truth for strategy decisions. */
|
|
50
|
+
export declare const VENDOR_REGISTRY: VendorEntry[];
|
|
51
|
+
export declare function entryOf(id: string): VendorEntry | null;
|
|
52
|
+
/** Decide strategy given vendor + whether user has paid tier. */
|
|
53
|
+
export declare function pickStrategy(vendorId: string, opts?: {
|
|
54
|
+
paidTier?: boolean;
|
|
55
|
+
}): {
|
|
56
|
+
strategy: VendorStrategy;
|
|
57
|
+
entry: VendorEntry | null;
|
|
58
|
+
reason: string;
|
|
59
|
+
};
|
|
60
|
+
/** Render the strategy decision as a pulse line. */
|
|
61
|
+
export declare function formatStrategyPulseLine(vendorId: string, opts?: {
|
|
62
|
+
paidTier?: boolean;
|
|
63
|
+
}): string;
|
|
64
|
+
//# sourceMappingURL=vendor_strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor_strategy.d.ts","sourceRoot":"","sources":["../../src/rainbow/vendor_strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAErH,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,YAAY,EAAE,cAAc,CAAC;IAC7B,qEAAqE;IACrE,YAAY,EAAE,cAAc,CAAC;IAC7B,0EAA0E;IAC1E,WAAW,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sEAAsE;AACtE,eAAO,MAAM,eAAe,EAAE,WAAW,EA+GxC,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAEtD;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKzJ;AAED,oDAAoD;AACpD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAGnG"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.98.0 -- RAINBOW · Vendor strategy map.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the broken "one-size-fits-all RELAY" assumption with explicit
|
|
5
|
+
* per-vendor strategies. Each vendor (web AI, mobile app, MCP-capable
|
|
6
|
+
* editor, etc.) gets the transport that ACTUALLY works for its
|
|
7
|
+
* capability tier.
|
|
8
|
+
*
|
|
9
|
+
* Strategies:
|
|
10
|
+
* clipboard-first — copy plain text + open vendor home page. User pastes.
|
|
11
|
+
* Works on EVERY Web AI's free tier. The default.
|
|
12
|
+
* plain-qr — render plain-text soul as QR (NO encryption, NO
|
|
13
|
+
* fetch-instruction). Phone scans → copies → pastes.
|
|
14
|
+
* mcp-direct — vendor is MCP-aware (Claude Code, Cursor, Codex CLI,
|
|
15
|
+
* Continue) — Mneme MCP server exposes tools directly.
|
|
16
|
+
* No copy/paste needed.
|
|
17
|
+
* prefill-and-paste— vendor honors ?q= deep link AND has web-fetch
|
|
18
|
+
* (paid-tier ChatGPT Plus / Gemini Advanced). The
|
|
19
|
+
* old RELAY path. Used ONLY when caller explicitly
|
|
20
|
+
* asserts "I have a paid-tier AI with browsing".
|
|
21
|
+
* app-deeplink-NA — vendor mobile app does NOT honor any URL scheme.
|
|
22
|
+
* Mneme cannot help; tell the user honestly.
|
|
23
|
+
*
|
|
24
|
+
* Every entry has `verified` (boolean) + `lastChecked` (ISO date) so
|
|
25
|
+
* stale-URL claims like "Verified May 2026" cannot lie silently. The
|
|
26
|
+
* companion `vendor_probe.ts` actually hits each URL with HEAD + asserts.
|
|
27
|
+
*/
|
|
28
|
+
/** Canonical vendor table. Source of truth for strategy decisions. */
|
|
29
|
+
export const VENDOR_REGISTRY = [
|
|
30
|
+
{
|
|
31
|
+
id: "chatgpt-web",
|
|
32
|
+
label: "ChatGPT (web)",
|
|
33
|
+
homeUrl: "https://chatgpt.com/",
|
|
34
|
+
freeStrategy: "clipboard-first",
|
|
35
|
+
paidStrategy: "prefill-and-paste",
|
|
36
|
+
qParamWorks: false, // ChatGPT Free does not reliably prefill; old chat.openai.com 308-redirects
|
|
37
|
+
webFetchAvailable: false,
|
|
38
|
+
lastChecked: "2026-05-13",
|
|
39
|
+
reasoning: "OpenAI rebranded chat.openai.com → chatgpt.com (308 redirect). Free tier has no web-fetch. ?q= prefill is silent in the chat UI for Free. Clipboard works.",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "gemini-web",
|
|
43
|
+
label: "Gemini (web)",
|
|
44
|
+
homeUrl: "https://gemini.google.com/app",
|
|
45
|
+
freeStrategy: "clipboard-first",
|
|
46
|
+
paidStrategy: "clipboard-first", // even Gemini Advanced doesn't reliably prefill from ?q=
|
|
47
|
+
qParamWorks: false, // verified empirically — ?q= returns 200 but does NOT pre-fill the input
|
|
48
|
+
webFetchAvailable: false,
|
|
49
|
+
lastChecked: "2026-05-13",
|
|
50
|
+
reasoning: "Verified by user: ?q= returns 200 but input is not prefilled. Free tier has no web-fetch. Clipboard works on every tier.",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "claude-web",
|
|
54
|
+
label: "Claude (web)",
|
|
55
|
+
homeUrl: "https://claude.ai/new",
|
|
56
|
+
freeStrategy: "clipboard-first",
|
|
57
|
+
paidStrategy: "clipboard-first",
|
|
58
|
+
qParamWorks: false, // Cloudflare 403 on headless; live behavior unverified
|
|
59
|
+
webFetchAvailable: false, // Claude has artifacts but not arbitrary URL fetch in chat
|
|
60
|
+
lastChecked: "2026-05-13",
|
|
61
|
+
reasoning: "Cloudflare blocks headless probes (returns 403). User-agent matters. Claude has artifact tool, not generic web-fetch. Clipboard works.",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "claude-code",
|
|
65
|
+
label: "Claude Code (CLI)",
|
|
66
|
+
homeUrl: "claude://", // not actually used; MCP path is direct
|
|
67
|
+
freeStrategy: "mcp-direct",
|
|
68
|
+
paidStrategy: "mcp-direct",
|
|
69
|
+
qParamWorks: false,
|
|
70
|
+
webFetchAvailable: true,
|
|
71
|
+
lastChecked: "2026-05-13",
|
|
72
|
+
reasoning: "MCP-aware editor. Mneme MCP server exposes tools directly. No clipboard, no QR, no URL needed.",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "cursor",
|
|
76
|
+
label: "Cursor (editor)",
|
|
77
|
+
homeUrl: "cursor://",
|
|
78
|
+
freeStrategy: "mcp-direct",
|
|
79
|
+
paidStrategy: "mcp-direct",
|
|
80
|
+
qParamWorks: false,
|
|
81
|
+
webFetchAvailable: true,
|
|
82
|
+
lastChecked: "2026-05-13",
|
|
83
|
+
reasoning: "MCP-aware. Same as Claude Code path.",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "copilot-web",
|
|
87
|
+
label: "GitHub Copilot Chat (web)",
|
|
88
|
+
homeUrl: "https://github.com/copilot",
|
|
89
|
+
freeStrategy: "clipboard-first",
|
|
90
|
+
paidStrategy: "clipboard-first",
|
|
91
|
+
qParamWorks: false,
|
|
92
|
+
webFetchAvailable: false,
|
|
93
|
+
lastChecked: "2026-05-13",
|
|
94
|
+
reasoning: "No documented ?q= parameter. Clipboard works.",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: "perplexity-web",
|
|
98
|
+
label: "Perplexity (web)",
|
|
99
|
+
homeUrl: "https://www.perplexity.ai/",
|
|
100
|
+
freeStrategy: "clipboard-first",
|
|
101
|
+
paidStrategy: "clipboard-first",
|
|
102
|
+
qParamWorks: true, // perplexity DOES support ?q= reliably across tiers
|
|
103
|
+
webFetchAvailable: true, // Perplexity is search-grounded; fetch works
|
|
104
|
+
lastChecked: "2026-05-13",
|
|
105
|
+
reasoning: "Perplexity is the one major exception — ?q= prefill IS reliable. But for consistency Mneme defaults to clipboard-first; callers can opt in to prefill-and-paste.",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: "gemini-mobile",
|
|
109
|
+
label: "Gemini (mobile app)",
|
|
110
|
+
homeUrl: "gemini://", // does not exist
|
|
111
|
+
freeStrategy: "app-deeplink-NA",
|
|
112
|
+
paidStrategy: "app-deeplink-NA",
|
|
113
|
+
qParamWorks: false,
|
|
114
|
+
webFetchAvailable: false,
|
|
115
|
+
lastChecked: "2026-05-13",
|
|
116
|
+
reasoning: "Gemini iOS/Android does NOT register a custom URL scheme. Tapping a gemini:// link from outside fails. Use plain-qr → user opens browser tab → pastes.",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "chatgpt-mobile",
|
|
120
|
+
label: "ChatGPT (mobile app)",
|
|
121
|
+
homeUrl: "chatgpt://",
|
|
122
|
+
freeStrategy: "app-deeplink-NA",
|
|
123
|
+
paidStrategy: "app-deeplink-NA",
|
|
124
|
+
qParamWorks: false,
|
|
125
|
+
webFetchAvailable: false,
|
|
126
|
+
lastChecked: "2026-05-13",
|
|
127
|
+
reasoning: "Same as Gemini mobile. No public URL scheme that prefills from outside.",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "any-mobile-browser",
|
|
131
|
+
label: "Mobile browser (any AI website)",
|
|
132
|
+
homeUrl: "",
|
|
133
|
+
freeStrategy: "plain-qr",
|
|
134
|
+
paidStrategy: "plain-qr",
|
|
135
|
+
qParamWorks: false,
|
|
136
|
+
webFetchAvailable: false,
|
|
137
|
+
lastChecked: "2026-05-13",
|
|
138
|
+
reasoning: "Render the soul prompt as a plain-text QR — phone scans, gets plain text, pastes into any AI app the user has open. No encryption, no fetch dependency.",
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
export function entryOf(id) {
|
|
142
|
+
return VENDOR_REGISTRY.find((v) => v.id === id) ?? null;
|
|
143
|
+
}
|
|
144
|
+
/** Decide strategy given vendor + whether user has paid tier. */
|
|
145
|
+
export function pickStrategy(vendorId, opts = {}) {
|
|
146
|
+
const e = entryOf(vendorId);
|
|
147
|
+
if (!e)
|
|
148
|
+
return { strategy: "clipboard-first", entry: null, reason: `unknown vendor '${vendorId}' — defaulting to clipboard-first (always-safe)` };
|
|
149
|
+
const strategy = opts.paidTier ? e.paidStrategy : e.freeStrategy;
|
|
150
|
+
return { strategy, entry: e, reason: `${vendorId}: free='${e.freeStrategy}', paid='${e.paidStrategy}', user opts.paidTier=${!!opts.paidTier} → '${strategy}'. ${e.reasoning}` };
|
|
151
|
+
}
|
|
152
|
+
/** Render the strategy decision as a pulse line. */
|
|
153
|
+
export function formatStrategyPulseLine(vendorId, opts = {}) {
|
|
154
|
+
const r = pickStrategy(vendorId, opts);
|
|
155
|
+
return `VENDOR-STRATEGY · ${vendorId} · ${r.strategy}${r.entry ? ` · ?q=${r.entry.qParamWorks ? "yes" : "no"} fetch=${r.entry.webFetchAvailable ? "yes" : "no"}` : ""}`;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=vendor_strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor_strategy.js","sourceRoot":"","sources":["../../src/rainbow/vendor_strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* v1.87.0 -- RELAY: vendor-specific deep links.
|
|
3
|
+
* v1.98.0 -- HONEST UPDATE: 4 things to know
|
|
4
|
+
* 1. chat.openai.com → chatgpt.com (OpenAI rebranded; old URL 308-redirects)
|
|
5
|
+
* 2. The original `composePrompt` asks the AI to fetch+decrypt — Free tier
|
|
6
|
+
* Web AIs (Gemini-Free, ChatGPT-Free) cannot do EITHER. See bug_truth.ts.
|
|
7
|
+
* 3. `?q=` prefill is NOT reliably honored by current Gemini Web (verified).
|
|
8
|
+
* 4. `composeCleanPrompt` is the v1.98 replacement: plain identification, no
|
|
9
|
+
* fetch / decrypt instruction. The PAGE that the user opens copies plain
|
|
10
|
+
* text to clipboard — the AI just reads what's pasted.
|
|
3
11
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
12
|
+
* Updated vendor URLs (May 2026, with redirect-trace verification):
|
|
13
|
+
* - Gemini web: gemini.google.com/?q=<urlenc> (200, ?q= unreliable)
|
|
14
|
+
* - ChatGPT web: chatgpt.com/?q=<urlenc> (chat.openai.com 308→chatgpt.com)
|
|
15
|
+
* - Claude web: claude.ai/new?q=<urlenc> (Cloudflare may 403 headless)
|
|
8
16
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* - Generic fallback: any text the user copies manually
|
|
14
|
-
*
|
|
15
|
-
* QR encoding limit: ~250 bytes for v10. We keep the URL compact:
|
|
16
|
-
* `https://gemini.google.com/?q=Fetch%20<URL>%20with%20code%20<CODE>%20and%20resume`
|
|
17
|
-
* ~ 150 chars → fits in v6 QR easily.
|
|
17
|
+
* v1.98 callers should prefer `composeCleanPrompt` + the clipboard-first
|
|
18
|
+
* strategy from `vendor_strategy.ts`. The fetch+decrypt path lives on for
|
|
19
|
+
* backward compatibility with `Mneme + Pro tier AI` flows where web-fetch
|
|
20
|
+
* IS available, but it must NEVER be the default.
|
|
18
21
|
*/
|
|
19
22
|
export type DeepLinkVendor = "gemini" | "chatgpt" | "claude" | "any";
|
|
20
23
|
export interface DeepLinkInput {
|
|
@@ -22,9 +25,15 @@ export interface DeepLinkInput {
|
|
|
22
25
|
nexusCode: string;
|
|
23
26
|
vendor?: DeepLinkVendor;
|
|
24
27
|
}
|
|
25
|
-
/**
|
|
26
|
-
*
|
|
28
|
+
/** @deprecated v1.98 — relies on Web AI fetching the paste URL + decrypting
|
|
29
|
+
* AES-256-GCM. Free-tier Web AIs cannot do either. Use `composeCleanPrompt`
|
|
30
|
+
* instead, paired with clipboard-first strategy in `vendor_strategy.ts`.
|
|
31
|
+
* Retained for `Mneme + Pro-tier AI` flows where web-fetch is enabled. */
|
|
27
32
|
export declare function composePrompt(pasteUrl: string, nexusCode: string): string;
|
|
33
|
+
/** v1.98 — clean prompt: just identifies the soul as Mneme. NO fetch
|
|
34
|
+
* instruction, NO decryption instruction. The PAGE that handles the
|
|
35
|
+
* user's clipboard puts the actual soul prompt in the AI's input box. */
|
|
36
|
+
export declare function composeCleanPrompt(): string;
|
|
28
37
|
export interface DeepLink {
|
|
29
38
|
vendor: DeepLinkVendor;
|
|
30
39
|
/** Final URL the user opens (or QR scans into). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep_link.d.ts","sourceRoot":"","sources":["../../src/relay/deep_link.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deep_link.d.ts","sourceRoot":"","sources":["../../src/relay/deep_link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAUD;;;2EAG2E;AAC3E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;0EAE0E;AAC1E,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,CAM5D;AAED;mEACmE;AACnE,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,CAS3D"}
|
package/dist/relay/deep_link.js
CHANGED
|
@@ -1,34 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* v1.87.0 -- RELAY: vendor-specific deep links.
|
|
3
|
+
* v1.98.0 -- HONEST UPDATE: 4 things to know
|
|
4
|
+
* 1. chat.openai.com → chatgpt.com (OpenAI rebranded; old URL 308-redirects)
|
|
5
|
+
* 2. The original `composePrompt` asks the AI to fetch+decrypt — Free tier
|
|
6
|
+
* Web AIs (Gemini-Free, ChatGPT-Free) cannot do EITHER. See bug_truth.ts.
|
|
7
|
+
* 3. `?q=` prefill is NOT reliably honored by current Gemini Web (verified).
|
|
8
|
+
* 4. `composeCleanPrompt` is the v1.98 replacement: plain identification, no
|
|
9
|
+
* fetch / decrypt instruction. The PAGE that the user opens copies plain
|
|
10
|
+
* text to clipboard — the AI just reads what's pasted.
|
|
3
11
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
12
|
+
* Updated vendor URLs (May 2026, with redirect-trace verification):
|
|
13
|
+
* - Gemini web: gemini.google.com/?q=<urlenc> (200, ?q= unreliable)
|
|
14
|
+
* - ChatGPT web: chatgpt.com/?q=<urlenc> (chat.openai.com 308→chatgpt.com)
|
|
15
|
+
* - Claude web: claude.ai/new?q=<urlenc> (Cloudflare may 403 headless)
|
|
8
16
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* - Generic fallback: any text the user copies manually
|
|
14
|
-
*
|
|
15
|
-
* QR encoding limit: ~250 bytes for v10. We keep the URL compact:
|
|
16
|
-
* `https://gemini.google.com/?q=Fetch%20<URL>%20with%20code%20<CODE>%20and%20resume`
|
|
17
|
-
* ~ 150 chars → fits in v6 QR easily.
|
|
17
|
+
* v1.98 callers should prefer `composeCleanPrompt` + the clipboard-first
|
|
18
|
+
* strategy from `vendor_strategy.ts`. The fetch+decrypt path lives on for
|
|
19
|
+
* backward compatibility with `Mneme + Pro tier AI` flows where web-fetch
|
|
20
|
+
* IS available, but it must NEVER be the default.
|
|
18
21
|
*/
|
|
19
22
|
const TEMPLATES = {
|
|
20
23
|
gemini: "https://gemini.google.com/?q=",
|
|
21
|
-
|
|
24
|
+
// v1.98: was chat.openai.com (308-redirects to chatgpt.com). Direct URL.
|
|
25
|
+
chatgpt: "https://chatgpt.com/?q=",
|
|
22
26
|
claude: "https://claude.ai/new?q=",
|
|
23
27
|
any: "", // copy-only fallback
|
|
24
28
|
};
|
|
25
|
-
/**
|
|
26
|
-
*
|
|
29
|
+
/** @deprecated v1.98 — relies on Web AI fetching the paste URL + decrypting
|
|
30
|
+
* AES-256-GCM. Free-tier Web AIs cannot do either. Use `composeCleanPrompt`
|
|
31
|
+
* instead, paired with clipboard-first strategy in `vendor_strategy.ts`.
|
|
32
|
+
* Retained for `Mneme + Pro-tier AI` flows where web-fetch is enabled. */
|
|
27
33
|
export function composePrompt(pasteUrl, nexusCode) {
|
|
28
|
-
// v1.87: shortened from 240→~140 chars so deep-link URLs stay
|
|
29
|
-
// under the v10 QR capacity (~270 bytes) after URL encoding.
|
|
30
34
|
return `Fetch ${pasteUrl} . Decrypt with AES-256-GCM (PBKDF2 200k, code ${nexusCode}). It's a Mneme soul prompt -- resume.`;
|
|
31
35
|
}
|
|
36
|
+
/** v1.98 — clean prompt: just identifies the soul as Mneme. NO fetch
|
|
37
|
+
* instruction, NO decryption instruction. The PAGE that handles the
|
|
38
|
+
* user's clipboard puts the actual soul prompt in the AI's input box. */
|
|
39
|
+
export function composeCleanPrompt() {
|
|
40
|
+
return "[Mneme soul prompt — paste from clipboard to continue this conversation across vendors. See https://mneme.dev for context.]";
|
|
41
|
+
}
|
|
32
42
|
export function buildDeepLink(input) {
|
|
33
43
|
const vendor = input.vendor ?? "any";
|
|
34
44
|
const prompt = composePrompt(input.pasteUrl, input.nexusCode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep_link.js","sourceRoot":"","sources":["../../src/relay/deep_link.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deep_link.js","sourceRoot":"","sources":["../../src/relay/deep_link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,MAAM,SAAS,GAAmC;IAChD,MAAM,EAAE,+BAA+B;IACvC,yEAAyE;IACzE,OAAO,EAAE,yBAAyB;IAClC,MAAM,EAAE,0BAA0B;IAClC,GAAG,EAAE,EAAE,EAAE,qBAAqB;CAC/B,CAAC;AAEF;;;2EAG2E;AAC3E,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,SAAiB;IAC/D,OAAO,SAAS,QAAQ,kDAAkD,SAAS,wCAAwC,CAAC;AAC9H,CAAC;AAED;;0EAE0E;AAC1E,MAAM,UAAU,kBAAkB;IAChC,OAAO,6HAA6H,CAAC;AACvI,CAAC;AAYD,MAAM,UAAU,aAAa,CAAC,KAAoB;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;AACvF,CAAC;AAED;mEACmE;AACnE,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,MAAM,UAAU,GAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5E,IAAI,IAAI,GAAoB,IAAI,CAAC;IACjC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC,QAAQ;YAAE,SAAS;QAC3B,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,IAAI,GAAG,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,IAAI,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -51,9 +51,10 @@ describe("v1.87 RELAY · deep link builder", () => {
|
|
|
51
51
|
expect(dl.url.startsWith("https://gemini.google.com/?q=")).toBe(true);
|
|
52
52
|
expect(dl.fitsInQR).toBe(true);
|
|
53
53
|
});
|
|
54
|
-
it("buildDeepLink for ChatGPT uses chat.openai.com", () => {
|
|
54
|
+
it("buildDeepLink for ChatGPT uses chatgpt.com (v1.98: was chat.openai.com → 308 redirect)", () => {
|
|
55
55
|
const dl = buildDeepLink({ pasteUrl: "https://dpaste.com/x", nexusCode: "ABC123", vendor: "chatgpt" });
|
|
56
|
-
expect(dl.url.startsWith("https://
|
|
56
|
+
expect(dl.url.startsWith("https://chatgpt.com/?q=")).toBe(true);
|
|
57
|
+
expect(dl.url).not.toContain("chat.openai.com");
|
|
57
58
|
});
|
|
58
59
|
it("vendor='any' returns the prompt verbatim (copy-only fallback)", () => {
|
|
59
60
|
const dl = buildDeepLink({ pasteUrl: "https://dpaste.com/x", nexusCode: "ABC123", vendor: "any" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v1_87_regression.test.js","sourceRoot":"","sources":["../src/v1_87_regression.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"v1_87_regression.test.js","sourceRoot":"","sources":["../src/v1_87_regression.test.ts"],"names":[],"mappings":"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"}
|