@mneme-ai/core 1.97.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1_98.test.js","sourceRoot":"","sources":["../../src/rainbow/v1_98.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
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
+ export interface ProbeResult {
26
+ vendor: string;
27
+ url: string;
28
+ finalUrl: string | null;
29
+ status: number | null;
30
+ hostChanged: boolean;
31
+ /** Verdict: OK / REDIRECT_HOST_CHANGE / 404 / NETWORK_ERR / SKIP. */
32
+ verdict: "OK" | "REDIRECT_HOST_CHANGE" | "NOT_FOUND" | "NETWORK_ERR" | "BLOCKED" | "SKIP";
33
+ /** Notes for human / AI agent. */
34
+ notes: string;
35
+ elapsedMs: number;
36
+ }
37
+ export interface ProbeOptions {
38
+ /** Override fetch (for tests). */
39
+ fetchImpl?: typeof fetch;
40
+ /** Max time per probe in ms. Default 8000. */
41
+ timeoutMs?: number;
42
+ /** User-Agent header. */
43
+ userAgent?: string;
44
+ }
45
+ /** Probe every registered vendor concurrently. Returns one ProbeResult
46
+ * per vendor. Total elapsed time ≈ slowest probe. */
47
+ export declare function probeAllVendors(opts?: ProbeOptions): Promise<ProbeResult[]>;
48
+ /** Probe results that should ALERT — anything that isn't OK or SKIP. */
49
+ export declare function failingProbes(results: ProbeResult[]): ProbeResult[];
50
+ /** One-line summary suitable for the pulse / CI logs. */
51
+ export declare function formatProbePulseLine(results: ProbeResult[]): string;
52
+ //# sourceMappingURL=vendor_probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor_probe.d.ts","sourceRoot":"","sources":["../../src/rainbow/vendor_probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,OAAO,EAAE,IAAI,GAAG,sBAAsB,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1F,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8DD;sDACsD;AACtD,wBAAsB,eAAe,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAErF;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAEnE;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAMnE"}
@@ -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
- * Modern AI apps + web AIs accept a query parameter that pre-fills
5
- * the chat input. Combine that with a paste URL + decryption code
6
- * user scans QR AI app opens with the full instruction ready
7
- * to send. ONE TAP cross-device handover.
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 308chatgpt.com)
15
+ * - Claude web: claude.ai/new?q=<urlenc> (Cloudflare may 403 headless)
8
16
  *
9
- * Verified URL params (May 2026):
10
- * - Gemini web: gemini.google.com/?q=<urlenc>
11
- * - ChatGPT web: chat.openai.com/?q=<urlenc>
12
- * - Claude web: claude.ai/new?q=<urlenc>
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
- /** Compose a single-line instruction the destination AI will receive
26
- * as its first message. Kept SHORT so URL+query fits in a QR. */
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;;;;;;;;;;;;;;;;;GAiBG;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;AASD;kEACkE;AAClE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIzE;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"}
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"}
@@ -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
- * Modern AI apps + web AIs accept a query parameter that pre-fills
5
- * the chat input. Combine that with a paste URL + decryption code
6
- * user scans QR AI app opens with the full instruction ready
7
- * to send. ONE TAP cross-device handover.
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 308chatgpt.com)
15
+ * - Claude web: claude.ai/new?q=<urlenc> (Cloudflare may 403 headless)
8
16
  *
9
- * Verified URL params (May 2026):
10
- * - Gemini web: gemini.google.com/?q=<urlenc>
11
- * - ChatGPT web: chat.openai.com/?q=<urlenc>
12
- * - Claude web: claude.ai/new?q=<urlenc>
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
- chatgpt: "https://chat.openai.com/?q=",
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
- /** Compose a single-line instruction the destination AI will receive
26
- * as its first message. Kept SHORT so URL+query fits in a QR. */
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;;;;;;;;;;;;;;;;;GAiBG;AAUH,MAAM,SAAS,GAAmC;IAChD,MAAM,EAAE,+BAA+B;IACvC,OAAO,EAAE,6BAA6B;IACtC,MAAM,EAAE,0BAA0B;IAClC,GAAG,EAAE,EAAE,EAAE,qBAAqB;CAC/B,CAAC;AAEF;kEACkE;AAClE,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,SAAiB;IAC/D,8DAA8D;IAC9D,6DAA6D;IAC7D,OAAO,SAAS,QAAQ,kDAAkD,SAAS,wCAAwC,CAAC;AAC9H,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"}
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://chat.openai.com/?q=")).toBe(true);
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" });