@mneme-ai/core 1.90.0 → 1.92.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/genesplice/soul_prompt.d.ts.map +1 -1
- package/dist/genesplice/soul_prompt.js +7 -0
- package/dist/genesplice/soul_prompt.js.map +1 -1
- package/dist/rainbow/boomerang.d.ts +79 -0
- package/dist/rainbow/boomerang.d.ts.map +1 -0
- package/dist/rainbow/boomerang.js +130 -0
- package/dist/rainbow/boomerang.js.map +1 -0
- package/dist/rainbow/index.d.ts +4 -0
- package/dist/rainbow/index.d.ts.map +1 -1
- package/dist/rainbow/index.js +4 -0
- package/dist/rainbow/index.js.map +1 -1
- package/dist/rainbow/page_renderer.d.ts +48 -0
- package/dist/rainbow/page_renderer.d.ts.map +1 -0
- package/dist/rainbow/page_renderer.js +229 -0
- package/dist/rainbow/page_renderer.js.map +1 -0
- package/dist/rainbow/phoenix.d.ts +72 -0
- package/dist/rainbow/phoenix.d.ts.map +1 -0
- package/dist/rainbow/phoenix.js +159 -0
- package/dist/rainbow/phoenix.js.map +1 -0
- package/dist/rainbow/same_shell.d.ts +34 -0
- package/dist/rainbow/same_shell.d.ts.map +1 -0
- package/dist/rainbow/same_shell.js +167 -0
- package/dist/rainbow/same_shell.js.map +1 -0
- package/dist/rainbow/v1_91.test.d.ts +2 -0
- package/dist/rainbow/v1_91.test.d.ts.map +1 -0
- package/dist/rainbow/v1_91.test.js +111 -0
- package/dist/rainbow/v1_91.test.js.map +1 -0
- package/dist/rainbow/v1_92.test.d.ts +2 -0
- package/dist/rainbow/v1_92.test.d.ts.map +1 -0
- package/dist/rainbow/v1_92.test.js +295 -0
- package/dist/rainbow/v1_92.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"soul_prompt.d.ts","sourceRoot":"","sources":["../../src/genesplice/soul_prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"soul_prompt.d.ts","sourceRoot":"","sources":["../../src/genesplice/soul_prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAOpF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,CAAC;IACxB;uEACmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;2CAGuC;IACvC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAcD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAqEvE;AAED,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,gCAAgC;IAChC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;CAC9D;AAED;;0CAE0C;AAC1C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAsDrF"}
|
|
@@ -46,6 +46,7 @@ import { renderVoiceDirective } from "../seamless/voice_directive.js";
|
|
|
46
46
|
import { renderDictionary } from "../lattice/dictionary.js";
|
|
47
47
|
import { renderRelayBlock } from "../conduit/relay_prompt.js";
|
|
48
48
|
import { renderVersionGate } from "../conduit/version_gate.js";
|
|
49
|
+
import { renderHomunculusRequest } from "../abyss/homunculus.js";
|
|
49
50
|
const TOK_PER_WORD = 1.3;
|
|
50
51
|
function estTokens(s) {
|
|
51
52
|
return Math.round(s.split(/\s+/).filter(Boolean).length * TOK_PER_WORD);
|
|
@@ -88,6 +89,12 @@ export function compressToSoulPrompt(input) {
|
|
|
88
89
|
"",
|
|
89
90
|
renderVersionGate(capsule.createdAt),
|
|
90
91
|
"",
|
|
92
|
+
// v1.91: embed HOMUNCULUS request by default so receiving AIs know
|
|
93
|
+
// to emit a structured RETURN block the user can paste back to the
|
|
94
|
+
// editor AI for actual Mneme tool execution. Closes the cycle:
|
|
95
|
+
// editor → web (memory) → web suggests → user pastes back → editor executes.
|
|
96
|
+
renderHomunculusRequest({ originatorVendor: capsule.originVendor, ask: ["decisions", "reasoning", "next-actions"] }),
|
|
97
|
+
"",
|
|
91
98
|
`## Origin`,
|
|
92
99
|
`vendor=${capsule.originVendor} capsule=${capsule.id} fingerprint=${capsule.repoFingerprint} createdAt=${capsule.createdAt}`,
|
|
93
100
|
"",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"soul_prompt.js","sourceRoot":"","sources":["../../src/genesplice/soul_prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,EAAE,uBAAuB,EAAkB,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"soul_prompt.js","sourceRoot":"","sources":["../../src/genesplice/soul_prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.92.0 -- RAINBOW: BOOMERANG (return-pad → MCP-watched inbox).
|
|
3
|
+
*
|
|
4
|
+
* Closes the HOMUNCULUS loop without requiring the Web AI to call MCP.
|
|
5
|
+
*
|
|
6
|
+
* Editor AI (Mneme MCP) --soul--> Web AI (chatgpt/gemini)
|
|
7
|
+
* ^ |
|
|
8
|
+
* | inbox.jsonl | emits HOMUNCULUS RETURN
|
|
9
|
+
* | v
|
|
10
|
+
* Mneme MCP watcher <-- POST /return -- return-pad (page)
|
|
11
|
+
*
|
|
12
|
+
* The page (SAME-SHELL or mobile) has a textarea + Send button. User
|
|
13
|
+
* pastes the Web AI's full reply (must contain HOMUNCULUS RETURN). The
|
|
14
|
+
* page POSTs the body to /return. The HTTP server validates + appends
|
|
15
|
+
* one line to `.mneme/inbox/homunculus-return.jsonl`. Mneme MCP daemon
|
|
16
|
+
* tails this file and surfaces new entries through the supersonic
|
|
17
|
+
* pulse so the editor AI sees "[BOOMERANG] new return -- ingest?".
|
|
18
|
+
*
|
|
19
|
+
* Zero credentials. Zero webhook. Zero new daemon process. Just append
|
|
20
|
+
* + tail of a local file that MCP already watches.
|
|
21
|
+
*/
|
|
22
|
+
import { type HomunculusReturn } from "../abyss/homunculus.js";
|
|
23
|
+
export interface BoomerangEntry {
|
|
24
|
+
/** Stable per-entry id (12-hex). */
|
|
25
|
+
id: string;
|
|
26
|
+
/** Wall-clock when ingested. */
|
|
27
|
+
receivedAt: number;
|
|
28
|
+
/** Where the return was posted from (lan/same-shell/tunnel). */
|
|
29
|
+
source: "lan" | "same-shell" | "tunnel" | "manual";
|
|
30
|
+
/** Raw POST body. */
|
|
31
|
+
raw: string;
|
|
32
|
+
/** SHA-256 of raw (dedup signal). */
|
|
33
|
+
rawSha256: string;
|
|
34
|
+
/** Parsed HOMUNCULUS RETURN block (null if invalid). */
|
|
35
|
+
parsed: HomunculusReturn | null;
|
|
36
|
+
/** Whether the editor AI has acknowledged this entry. */
|
|
37
|
+
ingested: boolean;
|
|
38
|
+
/** Free-form note (filled when ingested=true). */
|
|
39
|
+
ingestNote?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface IngestResult {
|
|
42
|
+
ok: boolean;
|
|
43
|
+
id: string;
|
|
44
|
+
parsed: HomunculusReturn | null;
|
|
45
|
+
/** Reason on failure (validation/io). */
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface BoomerangInbox {
|
|
49
|
+
path: string;
|
|
50
|
+
ingest(args: {
|
|
51
|
+
raw: string;
|
|
52
|
+
source?: BoomerangEntry["source"];
|
|
53
|
+
}): IngestResult;
|
|
54
|
+
list(): BoomerangEntry[];
|
|
55
|
+
pending(): BoomerangEntry[];
|
|
56
|
+
markIngested(ids: string[], note?: string): number;
|
|
57
|
+
}
|
|
58
|
+
/** Open or create a BOOMERANG inbox at the given JSONL path. */
|
|
59
|
+
export declare function openBoomerangInbox(path: string): BoomerangInbox;
|
|
60
|
+
/** Render a one-line summary of a pending boomerang entry, for the
|
|
61
|
+
* supersonic pulse. */
|
|
62
|
+
export declare function formatPulseLine(entry: BoomerangEntry): string;
|
|
63
|
+
/** Server-side helper: validate + handle a /return POST body and
|
|
64
|
+
* produce a JSON response payload. Caller wires this into their
|
|
65
|
+
* HTTP framework. */
|
|
66
|
+
export interface ReturnPostResult {
|
|
67
|
+
status: number;
|
|
68
|
+
body: {
|
|
69
|
+
ok: boolean;
|
|
70
|
+
id?: string;
|
|
71
|
+
error?: string;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export declare function handleReturnPost(args: {
|
|
75
|
+
inbox: BoomerangInbox;
|
|
76
|
+
body: string;
|
|
77
|
+
source: BoomerangEntry["source"];
|
|
78
|
+
}): ReturnPostResult;
|
|
79
|
+
//# sourceMappingURL=boomerang.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boomerang.d.ts","sourceRoot":"","sources":["../../src/rainbow/boomerang.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,MAAM,EAAE,KAAK,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnD,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,yDAAyD;IACzD,QAAQ,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;KAAE,GAAG,YAAY,CAAC;IAC/E,IAAI,IAAI,cAAc,EAAE,CAAC;IACzB,OAAO,IAAI,cAAc,EAAE,CAAC;IAC5B,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACpD;AAUD,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAyE/D;AAED;wBACwB;AACxB,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAU7D;AAED;;sBAEsB;AACtB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;CAAE,GAAG,gBAAgB,CAMlI"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.92.0 -- RAINBOW: BOOMERANG (return-pad → MCP-watched inbox).
|
|
3
|
+
*
|
|
4
|
+
* Closes the HOMUNCULUS loop without requiring the Web AI to call MCP.
|
|
5
|
+
*
|
|
6
|
+
* Editor AI (Mneme MCP) --soul--> Web AI (chatgpt/gemini)
|
|
7
|
+
* ^ |
|
|
8
|
+
* | inbox.jsonl | emits HOMUNCULUS RETURN
|
|
9
|
+
* | v
|
|
10
|
+
* Mneme MCP watcher <-- POST /return -- return-pad (page)
|
|
11
|
+
*
|
|
12
|
+
* The page (SAME-SHELL or mobile) has a textarea + Send button. User
|
|
13
|
+
* pastes the Web AI's full reply (must contain HOMUNCULUS RETURN). The
|
|
14
|
+
* page POSTs the body to /return. The HTTP server validates + appends
|
|
15
|
+
* one line to `.mneme/inbox/homunculus-return.jsonl`. Mneme MCP daemon
|
|
16
|
+
* tails this file and surfaces new entries through the supersonic
|
|
17
|
+
* pulse so the editor AI sees "[BOOMERANG] new return -- ingest?".
|
|
18
|
+
*
|
|
19
|
+
* Zero credentials. Zero webhook. Zero new daemon process. Just append
|
|
20
|
+
* + tail of a local file that MCP already watches.
|
|
21
|
+
*/
|
|
22
|
+
import { appendFileSync, mkdirSync, existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
23
|
+
import { dirname } from "node:path";
|
|
24
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
25
|
+
import { parseHomunculusReturn } from "../abyss/homunculus.js";
|
|
26
|
+
function sha256(s) {
|
|
27
|
+
return createHash("sha256").update(s).digest("hex");
|
|
28
|
+
}
|
|
29
|
+
function randomId() {
|
|
30
|
+
return randomBytes(6).toString("hex");
|
|
31
|
+
}
|
|
32
|
+
/** Open or create a BOOMERANG inbox at the given JSONL path. */
|
|
33
|
+
export function openBoomerangInbox(path) {
|
|
34
|
+
const dir = dirname(path);
|
|
35
|
+
if (!existsSync(dir))
|
|
36
|
+
mkdirSync(dir, { recursive: true });
|
|
37
|
+
if (!existsSync(path))
|
|
38
|
+
writeFileSync(path, "", "utf8");
|
|
39
|
+
function readAll() {
|
|
40
|
+
const text = readFileSync(path, "utf8");
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const line of text.split(/\r?\n/)) {
|
|
43
|
+
if (!line.trim())
|
|
44
|
+
continue;
|
|
45
|
+
try {
|
|
46
|
+
const obj = JSON.parse(line);
|
|
47
|
+
out.push(obj);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// skip malformed lines (forward-compat)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
function writeAll(entries) {
|
|
56
|
+
const buf = entries.map((e) => JSON.stringify(e)).join("\n") + (entries.length > 0 ? "\n" : "");
|
|
57
|
+
writeFileSync(path, buf, "utf8");
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
path,
|
|
61
|
+
ingest({ raw, source }) {
|
|
62
|
+
if (typeof raw !== "string" || raw.length === 0) {
|
|
63
|
+
return { ok: false, id: "", parsed: null, error: "empty body" };
|
|
64
|
+
}
|
|
65
|
+
if (raw.length > 256 * 1024) {
|
|
66
|
+
return { ok: false, id: "", parsed: null, error: "body too large (>256KB)" };
|
|
67
|
+
}
|
|
68
|
+
const parsed = parseHomunculusReturn(raw);
|
|
69
|
+
if (!parsed) {
|
|
70
|
+
return { ok: false, id: "", parsed: null, error: "no HOMUNCULUS RETURN block detected" };
|
|
71
|
+
}
|
|
72
|
+
const rawSha256 = sha256(raw);
|
|
73
|
+
// Dedup: if exact sha already in the inbox, return existing id without re-appending.
|
|
74
|
+
const existing = readAll().find((e) => e.rawSha256 === rawSha256);
|
|
75
|
+
if (existing) {
|
|
76
|
+
return { ok: true, id: existing.id, parsed: existing.parsed };
|
|
77
|
+
}
|
|
78
|
+
const entry = {
|
|
79
|
+
id: randomId(),
|
|
80
|
+
receivedAt: Date.now(),
|
|
81
|
+
source: source ?? "manual",
|
|
82
|
+
raw,
|
|
83
|
+
rawSha256,
|
|
84
|
+
parsed,
|
|
85
|
+
ingested: false,
|
|
86
|
+
};
|
|
87
|
+
appendFileSync(path, JSON.stringify(entry) + "\n", "utf8");
|
|
88
|
+
return { ok: true, id: entry.id, parsed };
|
|
89
|
+
},
|
|
90
|
+
list: readAll,
|
|
91
|
+
pending: () => readAll().filter((e) => !e.ingested),
|
|
92
|
+
markIngested(ids, note) {
|
|
93
|
+
const all = readAll();
|
|
94
|
+
const idSet = new Set(ids);
|
|
95
|
+
let count = 0;
|
|
96
|
+
for (const e of all) {
|
|
97
|
+
if (idSet.has(e.id) && !e.ingested) {
|
|
98
|
+
e.ingested = true;
|
|
99
|
+
if (note)
|
|
100
|
+
e.ingestNote = note;
|
|
101
|
+
count++;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
writeAll(all);
|
|
105
|
+
return count;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Render a one-line summary of a pending boomerang entry, for the
|
|
110
|
+
* supersonic pulse. */
|
|
111
|
+
export function formatPulseLine(entry) {
|
|
112
|
+
if (!entry.parsed)
|
|
113
|
+
return `[BOOMERANG ${entry.id}] (unparsed body, ${entry.raw.length}B)`;
|
|
114
|
+
const p = entry.parsed;
|
|
115
|
+
const counts = [
|
|
116
|
+
p.decisions.length > 0 ? `d:${p.decisions.length}` : null,
|
|
117
|
+
p.reasoning.length > 0 ? `r:${p.reasoning.length}` : null,
|
|
118
|
+
p.vaccines.length > 0 ? `v:${p.vaccines.length}` : null,
|
|
119
|
+
p.nextActions.length > 0 ? `n:${p.nextActions.length}` : null,
|
|
120
|
+
].filter(Boolean).join(" ");
|
|
121
|
+
return `[BOOMERANG ${entry.id}] from ${p.returningFrom} -> ${p.originator} (${counts})`;
|
|
122
|
+
}
|
|
123
|
+
export function handleReturnPost(args) {
|
|
124
|
+
const r = args.inbox.ingest({ raw: args.body, source: args.source });
|
|
125
|
+
if (!r.ok) {
|
|
126
|
+
return { status: 400, body: { ok: false, error: r.error ?? "validation failed" } };
|
|
127
|
+
}
|
|
128
|
+
return { status: 200, body: { ok: true, id: r.id } };
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=boomerang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boomerang.js","sourceRoot":"","sources":["../../src/rainbow/boomerang.ts"],"names":[],"mappings":"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"}
|
package/dist/rainbow/index.d.ts
CHANGED
|
@@ -15,4 +15,8 @@ export * from "./handoff.js";
|
|
|
15
15
|
export * from "./tunnel.js";
|
|
16
16
|
export * from "./multi_paste.js";
|
|
17
17
|
export * from "./resource_hints.js";
|
|
18
|
+
export * from "./page_renderer.js";
|
|
19
|
+
export * from "./same_shell.js";
|
|
20
|
+
export * from "./phoenix.js";
|
|
21
|
+
export * from "./boomerang.js";
|
|
18
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rainbow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rainbow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
|
package/dist/rainbow/index.js
CHANGED
|
@@ -15,4 +15,8 @@ export * from "./handoff.js";
|
|
|
15
15
|
export * from "./tunnel.js";
|
|
16
16
|
export * from "./multi_paste.js";
|
|
17
17
|
export * from "./resource_hints.js";
|
|
18
|
+
export * from "./page_renderer.js";
|
|
19
|
+
export * from "./same_shell.js";
|
|
20
|
+
export * from "./phoenix.js";
|
|
21
|
+
export * from "./boomerang.js";
|
|
18
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rainbow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rainbow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.91.0 -- RAINBOW: PC + mobile page renderers.
|
|
3
|
+
*
|
|
4
|
+
* Was previously inline JS inside `.brain-show*.mjs` scripts. v1.91
|
|
5
|
+
* promotes them into proper, testable, reusable modules.
|
|
6
|
+
*
|
|
7
|
+
* renderMobilePage({ soulText, lang })
|
|
8
|
+
* → HTML page served from LAN/tunnel; phone scans → opens here
|
|
9
|
+
* → green Share button + blue Copy button (3-tier fallback)
|
|
10
|
+
* → bilingual EN/TH toggle
|
|
11
|
+
* → honest capability matrix (paste vs editor-AI MCP truth)
|
|
12
|
+
*
|
|
13
|
+
* renderPcPage({ primaryUrl, label, note, soulTokens, hasTunnel })
|
|
14
|
+
* → Page that opens in PC default browser
|
|
15
|
+
* → ONE big primary QR (no second-QR confusion)
|
|
16
|
+
* → STOP button (no Ctrl+C jargon)
|
|
17
|
+
* → bilingual toggle
|
|
18
|
+
*
|
|
19
|
+
* Both pages: zero external CSS/JS deps. Single-file output.
|
|
20
|
+
*/
|
|
21
|
+
export interface MobilePageInput {
|
|
22
|
+
soulText: string;
|
|
23
|
+
/** Optional override for default lang. Default "en" with toggle. */
|
|
24
|
+
defaultLang?: "en" | "th";
|
|
25
|
+
}
|
|
26
|
+
export interface PcPageInput {
|
|
27
|
+
primaryUrl: string;
|
|
28
|
+
/** Channel label (e.g. "Same Wi-Fi · 1 tap" / "Works ANYWHERE · 1 tap"). */
|
|
29
|
+
label: {
|
|
30
|
+
en: string;
|
|
31
|
+
th: string;
|
|
32
|
+
};
|
|
33
|
+
/** Channel note (e.g. "Phone MUST be on the SAME WiFi"). */
|
|
34
|
+
note: {
|
|
35
|
+
en: string;
|
|
36
|
+
th: string;
|
|
37
|
+
};
|
|
38
|
+
/** Soul prompt size in tokens (for footer). */
|
|
39
|
+
soulTokens: number;
|
|
40
|
+
/** True if cloudflared tunnel is in use (footer mention). */
|
|
41
|
+
hasTunnel: boolean;
|
|
42
|
+
/** True if a paste fallback exists. */
|
|
43
|
+
hasPaste: boolean;
|
|
44
|
+
defaultLang?: "en" | "th";
|
|
45
|
+
}
|
|
46
|
+
export declare function renderMobilePage(input: MobilePageInput): string;
|
|
47
|
+
export declare function renderPcPage(input: PcPageInput): string;
|
|
48
|
+
//# sourceMappingURL=page_renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page_renderer.d.ts","sourceRoot":"","sources":["../../src/rainbow/page_renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,4DAA4D;IAC5D,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAmBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAuG/D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA0FvD"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.91.0 -- RAINBOW: PC + mobile page renderers.
|
|
3
|
+
*
|
|
4
|
+
* Was previously inline JS inside `.brain-show*.mjs` scripts. v1.91
|
|
5
|
+
* promotes them into proper, testable, reusable modules.
|
|
6
|
+
*
|
|
7
|
+
* renderMobilePage({ soulText, lang })
|
|
8
|
+
* → HTML page served from LAN/tunnel; phone scans → opens here
|
|
9
|
+
* → green Share button + blue Copy button (3-tier fallback)
|
|
10
|
+
* → bilingual EN/TH toggle
|
|
11
|
+
* → honest capability matrix (paste vs editor-AI MCP truth)
|
|
12
|
+
*
|
|
13
|
+
* renderPcPage({ primaryUrl, label, note, soulTokens, hasTunnel })
|
|
14
|
+
* → Page that opens in PC default browser
|
|
15
|
+
* → ONE big primary QR (no second-QR confusion)
|
|
16
|
+
* → STOP button (no Ctrl+C jargon)
|
|
17
|
+
* → bilingual toggle
|
|
18
|
+
*
|
|
19
|
+
* Both pages: zero external CSS/JS deps. Single-file output.
|
|
20
|
+
*/
|
|
21
|
+
function jsSafe(s) {
|
|
22
|
+
return JSON.stringify(s).replace(/<\/(script)/gi, "<\\/$1");
|
|
23
|
+
}
|
|
24
|
+
function escapeHtml(s) {
|
|
25
|
+
return s
|
|
26
|
+
.replace(/&/g, "&")
|
|
27
|
+
.replace(/</g, "<")
|
|
28
|
+
.replace(/>/g, ">")
|
|
29
|
+
.replace(/"/g, """)
|
|
30
|
+
.replace(/'/g, "'");
|
|
31
|
+
}
|
|
32
|
+
function buildQrUrl(payload, size = 360) {
|
|
33
|
+
return `https://api.qrserver.com/v1/create-qr-code/?size=${size}x${size}&format=svg&margin=10&data=${encodeURIComponent(payload)}`;
|
|
34
|
+
}
|
|
35
|
+
export function renderMobilePage(input) {
|
|
36
|
+
const lang = input.defaultLang ?? "en";
|
|
37
|
+
return `<!doctype html><html lang="${lang}"><head>
|
|
38
|
+
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
39
|
+
<title>Mneme</title>
|
|
40
|
+
<style>
|
|
41
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
42
|
+
body{font-family:-apple-system,sans-serif;background:#1abc9c;color:#fff;min-height:100vh;padding:24px 18px}
|
|
43
|
+
.wrap{max-width:540px;margin:0 auto;display:flex;flex-direction:column;gap:18px}
|
|
44
|
+
h1{font-size:32px;text-align:center;font-weight:800}
|
|
45
|
+
.lang{position:fixed;top:14px;right:14px;background:rgba(0,0,0,0.4);border:0;color:#fff;padding:10px 16px;border-radius:8px;font-weight:700;cursor:pointer;font-size:15px}
|
|
46
|
+
.btn{width:100%;background:#fff;color:#16a085;border:0;padding:24px;border-radius:14px;font-weight:800;font-size:22px;cursor:pointer;box-shadow:0 8px 20px rgba(0,0,0,0.3)}
|
|
47
|
+
.btn:active{transform:scale(0.97)}
|
|
48
|
+
.btn.blue{background:#3498db;color:#fff}
|
|
49
|
+
.step{background:rgba(0,0,0,0.25);padding:18px;border-radius:12px;font-size:18px;line-height:1.6}
|
|
50
|
+
.matrix{background:rgba(0,0,0,0.3);padding:18px;border-radius:12px;font-size:14px;line-height:1.6}
|
|
51
|
+
.matrix h3{font-size:17px;margin-bottom:10px}
|
|
52
|
+
.matrix table{width:100%;border-collapse:collapse}
|
|
53
|
+
.matrix td{padding:8px 4px;border-bottom:1px solid rgba(255,255,255,0.15)}
|
|
54
|
+
.matrix td:last-child{text-align:center;font-weight:700}
|
|
55
|
+
.ok{display:none;background:#27ae60;padding:18px;border-radius:12px;text-align:center;font-weight:800;font-size:17px}
|
|
56
|
+
textarea{width:100%;height:1px;opacity:0;position:absolute;left:-9999px}
|
|
57
|
+
.preview{background:rgba(0,0,0,0.4);padding:14px;border-radius:8px;font-family:monospace;font-size:11px;line-height:1.4;max-height:140px;overflow:auto;white-space:pre-wrap;word-break:break-word;-webkit-user-select:all;user-select:all}
|
|
58
|
+
details summary{cursor:pointer;padding:14px;background:rgba(0,0,0,0.25);border-radius:10px;font-weight:700;font-size:16px}
|
|
59
|
+
.grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
|
|
60
|
+
.grid a{display:block;background:rgba(255,255,255,0.18);padding:16px;border-radius:10px;text-align:center;text-decoration:none;color:#fff;font-weight:700;font-size:15px}
|
|
61
|
+
</style></head><body>
|
|
62
|
+
<button class="lang" id="lang">ไทย</button>
|
|
63
|
+
<div class="wrap">
|
|
64
|
+
<h1 data-en="Mneme handoff" data-th="ส่งสมอง Mneme"></h1>
|
|
65
|
+
<div class="step" data-en="Tap GREEN to send. If share menu doesn't appear, tap BLUE COPY then paste in any AI." data-th="กดปุ่มเขียวเพื่อส่ง. ถ้าไม่มี share menu ขึ้น กด COPY สีฟ้าแล้ว paste ใน AI"></div>
|
|
66
|
+
<button id="s" class="btn">📤 Send to AI app</button>
|
|
67
|
+
<div id="ok" class="ok" data-en="✓ Sent! Open your AI to check." data-th="✓ ส่งแล้ว เปิด AI ดู"></div>
|
|
68
|
+
<button id="c" class="btn blue">📋 Copy soul prompt</button>
|
|
69
|
+
<details>
|
|
70
|
+
<summary data-en="🔧 Backup: long-press to copy" data-th="🔧 สำรอง: กดค้างเพื่อก๊อป"></summary>
|
|
71
|
+
<div style="padding:10px 0;font-size:14px" data-en="If both buttons fail, long-press the box → Select All → Copy:" data-th="ถ้าปุ่มทั้งสองไม่ work กดค้างกล่องล่าง → Select All → Copy:"></div>
|
|
72
|
+
<div class="preview" id="prev"></div>
|
|
73
|
+
</details>
|
|
74
|
+
<div class="grid">
|
|
75
|
+
<a href="https://chatgpt.com/" target="_blank">🟢 ChatGPT</a>
|
|
76
|
+
<a href="https://gemini.google.com/app" target="_blank">🔵 Gemini</a>
|
|
77
|
+
<a href="https://claude.ai/new" target="_blank">🟣 Claude</a>
|
|
78
|
+
<a href="https://www.perplexity.ai/" target="_blank">⚪ Perplexity</a>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="matrix">
|
|
81
|
+
<h3 data-en="🎯 What this AI can do AFTER you paste" data-th="🎯 หลัง paste แล้ว AI ทำอะไรได้บ้าง"></h3>
|
|
82
|
+
<table>
|
|
83
|
+
<tr><td data-en="Read this conversation" data-th="อ่านบทสนทนานี้"></td><td>✅</td></tr>
|
|
84
|
+
<tr><td data-en="Continue discussing it" data-th="คุยต่อจากเดิม"></td><td>✅</td></tr>
|
|
85
|
+
<tr><td data-en="Understand recent decisions" data-th="เข้าใจการตัดสินใจล่าสุด"></td><td>✅</td></tr>
|
|
86
|
+
<tr><td data-en="Suggest next actions back" data-th="เสนอ next actions กลับมา"></td><td>✅</td></tr>
|
|
87
|
+
<tr><td data-en="Call Mneme MCP tools (live)" data-th="เรียก MCP tools จริง"></td><td>❌</td></tr>
|
|
88
|
+
<tr><td data-en="Read your .mneme/ files" data-th="อ่านไฟล์ .mneme/ บน PC"></td><td>❌</td></tr>
|
|
89
|
+
<tr><td data-en="True real-time sync" data-th="sync แบบ real-time จริง"></td><td>❌</td></tr>
|
|
90
|
+
</table>
|
|
91
|
+
<div style="margin-top:12px;padding:12px;background:rgba(255,255,255,0.1);border-radius:8px;font-size:13px;line-height:1.5">
|
|
92
|
+
<span data-en="The soul prompt gives the AI MEMORY (read-only). The HOMUNCULUS request inside it asks the AI to emit a HOMUNCULUS RETURN block with suggestions you paste BACK to your editor AI for execution. Web AI = brain. Editor AI = hands. You = courier." data-th="soul prompt ให้ AI เห็น MEMORY (อ่านอย่างเดียว). HOMUNCULUS request ที่อยู่ในนั้นจะขอให้ AI ตอบกลับเป็น HOMUNCULUS RETURN block ที่คุณ paste กลับไป editor AI เพื่อ execute. Web AI = สมอง. Editor AI = มือ. คุณ = courier"></span>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
<textarea id="ta"></textarea>
|
|
97
|
+
<script>
|
|
98
|
+
const SOUL = ${jsSafe(input.soulText)};
|
|
99
|
+
let lang = ${JSON.stringify(lang)};
|
|
100
|
+
function applyLang() {
|
|
101
|
+
document.querySelectorAll("[data-en]").forEach(el => { el.textContent = el.dataset[lang] || el.dataset.en; });
|
|
102
|
+
document.getElementById("lang").textContent = lang === "en" ? "ไทย" : "EN";
|
|
103
|
+
document.documentElement.lang = lang;
|
|
104
|
+
}
|
|
105
|
+
applyLang();
|
|
106
|
+
document.getElementById("lang").onclick = () => { lang = lang === "en" ? "th" : "en"; applyLang(); };
|
|
107
|
+
document.getElementById("prev").textContent = SOUL;
|
|
108
|
+
document.getElementById("ta").value = SOUL;
|
|
109
|
+
document.getElementById("s").onclick = async () => {
|
|
110
|
+
if (navigator.share) {
|
|
111
|
+
try { await navigator.share({ text: SOUL, title: "Mneme" }); document.getElementById("ok").style.display = "block"; return; }
|
|
112
|
+
catch (e) {}
|
|
113
|
+
}
|
|
114
|
+
copySoul();
|
|
115
|
+
};
|
|
116
|
+
function copySoul() {
|
|
117
|
+
if (navigator.clipboard && window.isSecureContext) {
|
|
118
|
+
navigator.clipboard.writeText(SOUL).then(() => {
|
|
119
|
+
document.getElementById("c").textContent = lang === "th" ? "✓ ก๊อปแล้ว เปิด AI app paste เลย" : "✓ Copied! Open AI app and paste.";
|
|
120
|
+
}).catch(() => fallbackCopy());
|
|
121
|
+
} else { fallbackCopy(); }
|
|
122
|
+
}
|
|
123
|
+
function fallbackCopy() {
|
|
124
|
+
const ta = document.getElementById("ta");
|
|
125
|
+
ta.value = SOUL; ta.style.opacity = "1"; ta.style.position = "static"; ta.style.height = "60px"; ta.style.left = "0";
|
|
126
|
+
ta.focus(); ta.select(); ta.setSelectionRange(0, SOUL.length);
|
|
127
|
+
try {
|
|
128
|
+
if (document.execCommand("copy")) {
|
|
129
|
+
document.getElementById("c").textContent = lang === "th" ? "✓ ก๊อปแล้ว" : "✓ Copied!";
|
|
130
|
+
ta.style.opacity = "0"; ta.style.position = "absolute"; ta.style.height = "1px"; ta.style.left = "-9999px";
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
} catch (e) {}
|
|
134
|
+
document.getElementById("c").textContent = lang === "th" ? "⬇ กดค้างกล่อง → Select All → Copy" : "⬇ Long-press box → Select All → Copy";
|
|
135
|
+
}
|
|
136
|
+
document.getElementById("c").onclick = copySoul;
|
|
137
|
+
</script></body></html>`;
|
|
138
|
+
}
|
|
139
|
+
export function renderPcPage(input) {
|
|
140
|
+
const lang = input.defaultLang ?? "en";
|
|
141
|
+
const labelEn = escapeHtml(input.label.en);
|
|
142
|
+
const labelTh = escapeHtml(input.label.th);
|
|
143
|
+
const noteEn = escapeHtml(input.note.en);
|
|
144
|
+
const noteTh = escapeHtml(input.note.th);
|
|
145
|
+
const url = escapeHtml(input.primaryUrl);
|
|
146
|
+
const tunnelMention = input.hasTunnel ? "Cloudflare tunnel + " : "";
|
|
147
|
+
const pasteMention = input.hasPaste ? " · paste fallback" : "";
|
|
148
|
+
return `<!doctype html><html lang="${lang}"><head>
|
|
149
|
+
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
150
|
+
<title>Mneme — Send brain to phone</title>
|
|
151
|
+
<style>
|
|
152
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
153
|
+
body{font-family:-apple-system,"Segoe UI",sans-serif;background:linear-gradient(135deg,#1abc9c 0%,#16a085 50%,#2c3e50 100%);color:#fff;min-height:100vh;padding:32px 24px}
|
|
154
|
+
.wrap{max-width:760px;margin:0 auto;display:flex;flex-direction:column;align-items:center;gap:28px}
|
|
155
|
+
.lang-btn,.stop-btn{position:fixed;top:18px;background:rgba(0,0,0,0.4);border:0;color:#fff;padding:12px 20px;border-radius:10px;font-weight:700;font-size:16px;cursor:pointer;z-index:99}
|
|
156
|
+
.lang-btn{right:18px}
|
|
157
|
+
.stop-btn{right:130px;background:#c0392b}
|
|
158
|
+
.stop-btn:hover{background:#e74c3c}
|
|
159
|
+
h1{font-size:46px;text-align:center;font-weight:800}
|
|
160
|
+
.tagline{font-size:22px;opacity:0.92;text-align:center;line-height:1.5;max-width:600px}
|
|
161
|
+
.primary{background:rgba(255,255,255,0.1);border:2px solid rgba(255,255,255,0.25);border-radius:24px;padding:32px;display:flex;flex-direction:column;align-items:center;gap:18px;width:100%;max-width:520px;box-shadow:0 24px 70px rgba(0,0,0,0.4)}
|
|
162
|
+
.pill{display:inline-block;background:#27ae60;padding:10px 22px;border-radius:99px;font-size:18px;font-weight:800}
|
|
163
|
+
h2{font-size:32px;text-align:center}
|
|
164
|
+
.qr-box{background:#fff;padding:22px;border-radius:18px}
|
|
165
|
+
.qr-box img{display:block;width:320px;height:320px}
|
|
166
|
+
.url{font-family:monospace;font-size:16px;background:rgba(0,0,0,0.35);padding:12px 18px;border-radius:8px;word-break:break-all;text-align:center;max-width:100%}
|
|
167
|
+
.note{font-size:20px;text-align:center;line-height:1.5;opacity:0.95}
|
|
168
|
+
.howto{background:rgba(0,0,0,0.3);border-radius:14px;padding:22px;font-size:19px;line-height:1.7;width:100%;max-width:600px}
|
|
169
|
+
.howto h3{font-size:22px;margin-bottom:12px}
|
|
170
|
+
.howto ol{padding-left:28px}
|
|
171
|
+
.howto li{margin:8px 0}
|
|
172
|
+
.warn-soft{background:rgba(241,196,15,0.2);border:1px solid rgba(241,196,15,0.4);padding:18px;border-radius:12px;font-size:17px;line-height:1.5;text-align:center;max-width:600px}
|
|
173
|
+
.stop-help{background:rgba(0,0,0,0.35);padding:16px;border-radius:12px;font-size:14px;line-height:1.6;max-width:600px}
|
|
174
|
+
.stop-help h4{font-size:16px;margin-bottom:8px}
|
|
175
|
+
footer{font-size:14px;opacity:0.7;text-align:center;line-height:1.6;max-width:700px;padding:16px;background:rgba(0,0,0,0.2);border-radius:10px}
|
|
176
|
+
</style></head><body>
|
|
177
|
+
<button class="lang-btn" id="lang">ไทย</button>
|
|
178
|
+
<button class="stop-btn" id="stop" data-en="🛑 STOP" data-th="🛑 หยุด"></button>
|
|
179
|
+
<div class="wrap">
|
|
180
|
+
<h1 data-en="Send brain to phone" data-th="ส่งสมองไปมือถือ"></h1>
|
|
181
|
+
<div class="tagline" data-en="Open your phone camera. Scan the QR. Tap the link. Tap green button." data-th="เปิดกล้องมือถือ → สแกน QR → กดที่ link → กดปุ่มเขียว"></div>
|
|
182
|
+
<div class="primary">
|
|
183
|
+
<span class="pill" data-en="${labelEn}" data-th="${labelTh}"></span>
|
|
184
|
+
<h2 data-en="Scan this QR" data-th="สแกน QR นี้"></h2>
|
|
185
|
+
<div class="qr-box"><img src="${escapeHtml(buildQrUrl(input.primaryUrl, 360))}" alt=""></div>
|
|
186
|
+
<div class="url">${url}</div>
|
|
187
|
+
<div class="note" data-en="${noteEn}" data-th="${noteTh}"></div>
|
|
188
|
+
</div>
|
|
189
|
+
<div class="howto">
|
|
190
|
+
<h3 data-en="📱 What happens after you scan" data-th="📱 หลังสแกน QR จะเกิดอะไรขึ้น"></h3>
|
|
191
|
+
<ol>
|
|
192
|
+
<li data-en="Phone camera shows the URL — tap it." data-th="กล้องมือถือแสดง URL — กดที่ URL"></li>
|
|
193
|
+
<li data-en="Mobile browser opens a page with a green button + capability matrix." data-th="เบราว์เซอร์เปิดหน้าเว็บที่มีปุ่มเขียว + ตารางความสามารถ"></li>
|
|
194
|
+
<li data-en="Tap green → pick AI app from share menu → tap send." data-th="กดปุ่มเขียว → เลือก AI app จาก share menu → กด send"></li>
|
|
195
|
+
<li data-en="If share menu doesn't appear, tap blue COPY → open AI app → paste." data-th="ถ้าไม่มี share menu ขึ้น กด COPY สีฟ้า → เปิด AI app → paste"></li>
|
|
196
|
+
</ol>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="warn-soft">
|
|
199
|
+
<span data-en="⚠ Honest truth: paste gives the AI READ-ONLY memory. For LIVE Mneme tool execution that AI must have Mneme installed (Cursor / Claude Code / Codex / VS Code MCP). Web AIs (chatgpt.com, gemini.com) read but can NOT call MCP. They CAN suggest next actions back via HOMUNCULUS RETURN block — paste it back to your editor AI to execute." data-th="⚠ ความจริง: paste ให้ AI เห็น MEMORY แบบอ่านอย่างเดียว. ถ้าจะให้ AI เรียก Mneme tools จริง AI ตัวนั้นต้องติดตั้ง Mneme (Cursor / Claude Code / Codex / VS Code MCP). Web AIs อ่านได้แต่เรียก MCP ไม่ได้. แต่มัน suggest next actions กลับมาเป็น HOMUNCULUS RETURN block ได้ — paste กลับไป editor AI เพื่อ execute"></span>
|
|
200
|
+
</div>
|
|
201
|
+
<div class="stop-help">
|
|
202
|
+
<h4 data-en="🛑 What the STOP button does" data-th="🛑 ปุ่ม STOP ทำอะไร"></h4>
|
|
203
|
+
<div data-en="Press STOP when you're DONE. It shuts down: (1) the local LAN server on this PC, (2) the public tunnel (if any), and (3) makes this page stop working. The QR will 404." data-th="กด STOP ตอนเสร็จแล้ว — มันจะปิด: (1) LAN server บน PC, (2) public tunnel (ถ้ามี), (3) หน้านี้จะใช้ไม่ได้แล้ว และ QR จะ 404"></div>
|
|
204
|
+
<div style="margin-top:8px" data-en="If you DON'T press STOP: server keeps running until you close this terminal or reboot. That's fine — it's local only. Public quick-tunnels self-expire after ~30 min of idle anyway." data-th="ถ้าไม่กด STOP: server จะรันไปเรื่อยๆ จนกว่าจะปิด terminal หรือ reboot. ไม่อันตราย เพราะเป็น local only. ส่วน quick-tunnel จะตายเองหลัง idle ~30 นาที"></div>
|
|
205
|
+
<div style="margin-top:8px" data-en="Closed the browser by accident? Just say to your editor AI: 'show handoff again'. The page regenerates with a fresh URL." data-th="เผลอปิด browser ไปแล้ว? บอก editor AI ของคุณ: 'show handoff again' หน้าจะ generate ใหม่พร้อม URL ใหม่"></div>
|
|
206
|
+
</div>
|
|
207
|
+
<footer>
|
|
208
|
+
<span data-en="Soul ${input.soulTokens} tokens · ${tunnelMention}LAN :7741${pasteMention}" data-th="สมอง ${input.soulTokens} โทเค็น · ${tunnelMention}LAN :7741${pasteMention}"></span><br>
|
|
209
|
+
<span data-en="Done? Click the red STOP button at top-right." data-th="เสร็จแล้ว? กดปุ่ม STOP สีแดงมุมขวาบน"></span>
|
|
210
|
+
</footer>
|
|
211
|
+
</div>
|
|
212
|
+
<script>
|
|
213
|
+
let lang = ${JSON.stringify(lang)};
|
|
214
|
+
function applyLang() {
|
|
215
|
+
document.querySelectorAll("[data-en]").forEach(el => { el.textContent = el.dataset[lang] || el.dataset.en; });
|
|
216
|
+
document.getElementById("lang").textContent = lang === "en" ? "ไทย" : "EN";
|
|
217
|
+
document.documentElement.lang = lang;
|
|
218
|
+
}
|
|
219
|
+
applyLang();
|
|
220
|
+
document.getElementById("lang").onclick = () => { lang = lang === "en" ? "th" : "en"; applyLang(); };
|
|
221
|
+
document.getElementById("stop").onclick = async () => {
|
|
222
|
+
if (!confirm(lang === "th" ? "หยุด server? หน้านี้จะใช้ไม่ได้แล้ว" : "Stop the server? This page will stop working.")) return;
|
|
223
|
+
try { await fetch(${jsSafe(input.primaryUrl)} + "/stop"); } catch (e) {}
|
|
224
|
+
document.body.innerHTML = '<div style="padding:60px;text-align:center;font-size:24px;color:#fff;background:#16a085;min-height:100vh">' + (lang === "th" ? "✓ Server หยุดแล้ว ปิด tab นี้ได้" : "✓ Server stopped. You can close this tab.") + '</div>';
|
|
225
|
+
};
|
|
226
|
+
</script>
|
|
227
|
+
</body></html>`;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=page_renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page_renderer.js","sourceRoot":"","sources":["../../src/rainbow/page_renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAuBH,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,IAAI,GAAG,GAAG;IAC7C,OAAO,oDAAoD,IAAI,IAAI,IAAI,8BAA8B,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AACrI,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC;IACvC,OAAO,8BAA8B,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA6D5B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;aACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAsCT,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,OAAO,8BAA8B,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAmCX,OAAO,cAAc,OAAO;;kCAE1B,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;qBAC1D,GAAG;+BACO,MAAM,cAAc,MAAM;;;;;;;;;;;;;;;;;;;;;wBAqBjC,KAAK,CAAC,UAAU,aAAa,aAAa,YAAY,YAAY,mBAAmB,KAAK,CAAC,UAAU,aAAa,aAAa,YAAY,YAAY;;;;;aAKlK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;;;;;;;;sBAUX,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;;;;eAI/B,CAAC;AAChB,CAAC"}
|