@love-moon/chat-web 0.17.1 → 0.18.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/CHANGELOG.md +97 -0
- package/README.md +176 -0
- package/dist/cli.js +8 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/login.js +11 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/core/broker-protocol.d.ts +13 -0
- package/dist/core/broker-protocol.js +29 -0
- package/dist/core/broker-protocol.js.map +1 -0
- package/dist/core/broker-worker.d.ts +1 -0
- package/dist/core/broker-worker.js +105 -0
- package/dist/core/broker-worker.js.map +1 -0
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/provider.d.ts +4 -0
- package/dist/core/provider.js.map +1 -1
- package/dist/core/turn-broker.d.ts +12 -0
- package/dist/core/turn-broker.js +331 -0
- package/dist/core/turn-broker.js.map +1 -0
- package/dist/core/turn-queue.d.ts +12 -0
- package/dist/core/turn-queue.js +54 -0
- package/dist/core/turn-queue.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/providers/chatgpt-sse-collector.d.ts +2 -0
- package/dist/providers/chatgpt-sse-collector.js +4 -0
- package/dist/providers/chatgpt-sse-collector.js.map +1 -1
- package/dist/providers/chatgpt.d.ts +1 -0
- package/dist/providers/chatgpt.js +6 -0
- package/dist/providers/chatgpt.js.map +1 -1
- package/dist/providers/gemini.d.ts +1 -0
- package/dist/providers/gemini.js +5 -0
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/kimi.d.ts +38 -0
- package/dist/providers/kimi.js +270 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/queued-session.d.ts +31 -0
- package/dist/queued-session.js +224 -0
- package/dist/queued-session.js.map +1 -0
- package/dist/runtime/accounts.d.ts +13 -0
- package/dist/runtime/accounts.js +86 -0
- package/dist/runtime/accounts.js.map +1 -0
- package/dist/runtime/archive.d.ts +9 -0
- package/dist/runtime/archive.js +54 -0
- package/dist/runtime/archive.js.map +1 -0
- package/dist/runtime/browser-worker.d.ts +14 -0
- package/dist/runtime/browser-worker.js +87 -0
- package/dist/runtime/browser-worker.js.map +1 -0
- package/dist/runtime/cli.d.ts +1 -0
- package/dist/runtime/cli.js +141 -0
- package/dist/runtime/cli.js.map +1 -0
- package/dist/runtime/client.d.ts +84 -0
- package/dist/runtime/client.js +258 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/daemon.d.ts +1 -0
- package/dist/runtime/daemon.js +33 -0
- package/dist/runtime/daemon.js.map +1 -0
- package/dist/runtime/engine.d.ts +105 -0
- package/dist/runtime/engine.js +605 -0
- package/dist/runtime/engine.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/managed.d.ts +7 -0
- package/dist/runtime/managed.js +75 -0
- package/dist/runtime/managed.js.map +1 -0
- package/dist/runtime/process-env.d.ts +2 -0
- package/dist/runtime/process-env.js +5 -0
- package/dist/runtime/process-env.js.map +1 -0
- package/dist/runtime/retention.d.ts +15 -0
- package/dist/runtime/retention.js +62 -0
- package/dist/runtime/retention.js.map +1 -0
- package/dist/runtime/server.d.ts +12 -0
- package/dist/runtime/server.js +246 -0
- package/dist/runtime/server.js.map +1 -0
- package/dist/runtime/sites.d.ts +2 -0
- package/dist/runtime/sites.js +40 -0
- package/dist/runtime/sites.js.map +1 -0
- package/dist/runtime/store.d.ts +17 -0
- package/dist/runtime/store.js +61 -0
- package/dist/runtime/store.js.map +1 -0
- package/dist/runtime/stream-decoder.d.ts +30 -0
- package/dist/runtime/stream-decoder.js +227 -0
- package/dist/runtime/stream-decoder.js.map +1 -0
- package/dist/runtime/types.d.ts +102 -0
- package/dist/runtime/types.js +12 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/worker.d.ts +1 -0
- package/dist/runtime/worker.js +422 -0
- package/dist/runtime/worker.js.map +1 -0
- package/dist/session.d.ts +5 -0
- package/dist/session.js +14 -3
- package/dist/session.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import net from "node:net";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import readline from "node:readline";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { BROKER_PROTOCOL, brokerPaths } from "./core/broker-protocol.js";
|
|
9
|
+
import { ChatWebError } from "./core/errors.js";
|
|
10
|
+
import { logsDir } from "./core/paths.js";
|
|
11
|
+
class BrokerConnection {
|
|
12
|
+
socket;
|
|
13
|
+
provider;
|
|
14
|
+
nextId = 1;
|
|
15
|
+
pending = new Map();
|
|
16
|
+
intentionalClose = false;
|
|
17
|
+
constructor(socket, provider) {
|
|
18
|
+
this.socket = socket;
|
|
19
|
+
this.provider = provider;
|
|
20
|
+
const lines = readline.createInterface({ input: socket });
|
|
21
|
+
lines.on("error", () => socket.destroy());
|
|
22
|
+
lines.on("line", (line) => {
|
|
23
|
+
let message;
|
|
24
|
+
try {
|
|
25
|
+
message = JSON.parse(line);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
socket.destroy();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const pending = this.pending.get(message.id);
|
|
32
|
+
if (!pending)
|
|
33
|
+
return;
|
|
34
|
+
if (message.type === "progress" || message.type === "queue") {
|
|
35
|
+
try {
|
|
36
|
+
if (message.type === "progress")
|
|
37
|
+
pending.onProgress?.(message.text ?? "");
|
|
38
|
+
else
|
|
39
|
+
pending.onQueue?.(message.position ?? 0);
|
|
40
|
+
}
|
|
41
|
+
catch { /* User observers cannot interrupt the transport. */ }
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.pending.delete(message.id);
|
|
45
|
+
pending.cleanup();
|
|
46
|
+
if (message.error) {
|
|
47
|
+
const error = Object.assign(new Error(message.error.message), message.error);
|
|
48
|
+
pending.reject(error);
|
|
49
|
+
}
|
|
50
|
+
else
|
|
51
|
+
pending.resolve(message.result);
|
|
52
|
+
});
|
|
53
|
+
socket.on("error", () => socket.destroy());
|
|
54
|
+
socket.once("close", () => {
|
|
55
|
+
lines.close();
|
|
56
|
+
for (const pending of this.pending.values()) {
|
|
57
|
+
pending.cleanup();
|
|
58
|
+
pending.reject(this.intentionalClose
|
|
59
|
+
? new DOMException("Chat session closed", "AbortError")
|
|
60
|
+
: new ChatWebError("BROKER_UNAVAILABLE", "The chat-web browser broker disconnected. Create a new session; the previous message was not retried.", { provider }));
|
|
61
|
+
}
|
|
62
|
+
this.pending.clear();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
request(method, args = {}, options = {}) {
|
|
66
|
+
if (options.signal?.aborted)
|
|
67
|
+
return Promise.reject(new DOMException("Aborted", "AbortError"));
|
|
68
|
+
if (this.socket.destroyed)
|
|
69
|
+
return Promise.reject(new ChatWebError("BROKER_UNAVAILABLE", "The chat-web browser broker is disconnected.", { provider: this.provider }));
|
|
70
|
+
const id = this.nextId++;
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
const abort = () => {
|
|
73
|
+
if (!this.socket.destroyed)
|
|
74
|
+
this.socket.write(`${JSON.stringify({ type: "cancel", id })}\n`);
|
|
75
|
+
};
|
|
76
|
+
this.pending.set(id, {
|
|
77
|
+
resolve: (value) => resolve(value), reject,
|
|
78
|
+
onProgress: options.onProgress, onQueue: options.onQueue,
|
|
79
|
+
cleanup: () => options.signal?.removeEventListener("abort", abort),
|
|
80
|
+
});
|
|
81
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
82
|
+
this.socket.write(`${JSON.stringify({ id, method, args })}\n`);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
destroy() { this.intentionalClose = true; this.socket.destroy(); }
|
|
86
|
+
}
|
|
87
|
+
async function connect(socketPath) {
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
const socket = net.createConnection(socketPath);
|
|
90
|
+
const fail = (error) => { socket.destroy(); reject(error); };
|
|
91
|
+
socket.once("error", fail);
|
|
92
|
+
socket.setTimeout(1_000, () => fail(new Error("Broker connection timed out")));
|
|
93
|
+
socket.once("connect", () => {
|
|
94
|
+
socket.removeListener("error", fail);
|
|
95
|
+
socket.setTimeout(0);
|
|
96
|
+
resolve(socket);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function launchBroker(provider, options) {
|
|
101
|
+
let worker = fileURLToPath(new URL("./core/broker-worker.js", import.meta.url));
|
|
102
|
+
const nodeArgs = [];
|
|
103
|
+
if (!fs.existsSync(worker)) {
|
|
104
|
+
worker = worker.replace(/\.js$/, ".ts");
|
|
105
|
+
nodeArgs.push("--import", createRequire(import.meta.url).resolve("tsx"));
|
|
106
|
+
}
|
|
107
|
+
const launch = Object.fromEntries(Object.entries(options.launch ?? {}).filter(([key]) => key !== "logger"));
|
|
108
|
+
fs.mkdirSync(logsDir(), { recursive: true });
|
|
109
|
+
const fd = fs.openSync(path.join(logsDir(), `${provider.replace(/[^a-zA-Z0-9_-]/g, "_")}-broker.log`), "a", 0o600);
|
|
110
|
+
try {
|
|
111
|
+
const child = spawn(process.execPath, [...nodeArgs, worker, provider, JSON.stringify({ headless: options.headless, launch })], {
|
|
112
|
+
detached: true, stdio: ["ignore", fd, fd], env: process.env,
|
|
113
|
+
});
|
|
114
|
+
child.on("error", () => { });
|
|
115
|
+
child.unref();
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
fs.closeSync(fd);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* A conversation tab in a profile-wide broker. Different processes share the
|
|
123
|
+
* browser and FIFO, while every session keeps its own page and chat context.
|
|
124
|
+
* Use ChatSession instead when direct Playwright Page access is required.
|
|
125
|
+
*/
|
|
126
|
+
export class QueuedChatSession {
|
|
127
|
+
provider;
|
|
128
|
+
userDataDir;
|
|
129
|
+
connection;
|
|
130
|
+
static async open(provider, options = {}) {
|
|
131
|
+
const paths = brokerPaths(provider);
|
|
132
|
+
const deadline = Date.now() + 20_000;
|
|
133
|
+
let nextLaunch = 0;
|
|
134
|
+
let socket;
|
|
135
|
+
while (Date.now() < deadline) {
|
|
136
|
+
try {
|
|
137
|
+
socket = await connect(paths.socket);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
if (Date.now() >= nextLaunch) {
|
|
142
|
+
launchBroker(provider, options);
|
|
143
|
+
nextLaunch = Date.now() + 500;
|
|
144
|
+
}
|
|
145
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (!socket)
|
|
149
|
+
throw new ChatWebError("BROKER_UNAVAILABLE", "Could not start the chat-web browser broker. Check the provider broker log in the chat-web logs directory.", { provider });
|
|
150
|
+
const connection = new BrokerConnection(socket, provider);
|
|
151
|
+
try {
|
|
152
|
+
const result = await connection.request("open", { protocol: BROKER_PROTOCOL, autoOpen: options.autoOpen });
|
|
153
|
+
return new QueuedChatSession(provider, result.userDataDir, connection);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
connection.destroy();
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
queue = Promise.resolve();
|
|
161
|
+
closed = false;
|
|
162
|
+
turnCounter = 0;
|
|
163
|
+
providerConversationId;
|
|
164
|
+
constructor(provider, userDataDir, connection) {
|
|
165
|
+
this.provider = provider;
|
|
166
|
+
this.userDataDir = userDataDir;
|
|
167
|
+
this.connection = connection;
|
|
168
|
+
}
|
|
169
|
+
get turns() { return this.turnCounter; }
|
|
170
|
+
get conversationId() { return this.providerConversationId; }
|
|
171
|
+
get isClosed() { return this.closed; }
|
|
172
|
+
async isLoggedIn() { this.assertOpen(); return this.connection.request("isLoggedIn"); }
|
|
173
|
+
async diagnose() { this.assertOpen(); return this.connection.request("diagnose"); }
|
|
174
|
+
async snapshot() { this.assertOpen(); return this.connection.request("snapshot"); }
|
|
175
|
+
async send(message, options = {}) {
|
|
176
|
+
this.assertOpen();
|
|
177
|
+
return this.enqueue(async () => {
|
|
178
|
+
const result = await this.connection.request("send", {
|
|
179
|
+
message, timeoutMs: options.timeoutMs, stableMs: options.stableMs, newChat: options.newChat,
|
|
180
|
+
}, options);
|
|
181
|
+
this.turnCounter = result.turnIndex + 1;
|
|
182
|
+
this.providerConversationId = result.conversationId;
|
|
183
|
+
return result;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async newChat() {
|
|
187
|
+
this.assertOpen();
|
|
188
|
+
return this.enqueue(async () => {
|
|
189
|
+
await this.connection.request("newChat");
|
|
190
|
+
this.turnCounter = 0;
|
|
191
|
+
this.providerConversationId = undefined;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
async close() {
|
|
195
|
+
if (this.closed)
|
|
196
|
+
return;
|
|
197
|
+
this.closed = true;
|
|
198
|
+
let timer;
|
|
199
|
+
try {
|
|
200
|
+
await Promise.race([
|
|
201
|
+
this.connection.request("close"),
|
|
202
|
+
new Promise((resolve) => { timer = setTimeout(resolve, 8_000); }),
|
|
203
|
+
]);
|
|
204
|
+
}
|
|
205
|
+
catch { /* A disconnected broker has already released this client. */ }
|
|
206
|
+
finally {
|
|
207
|
+
if (timer)
|
|
208
|
+
clearTimeout(timer);
|
|
209
|
+
this.connection.destroy();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async [Symbol.asyncDispose]() { await this.close(); }
|
|
213
|
+
assertOpen() {
|
|
214
|
+
if (this.closed)
|
|
215
|
+
throw new Error(`QueuedChatSession for "${this.provider}" is already closed.`);
|
|
216
|
+
}
|
|
217
|
+
enqueue(task) {
|
|
218
|
+
const run = () => { this.assertOpen(); return task(); };
|
|
219
|
+
const result = this.queue.then(run, run);
|
|
220
|
+
this.queue = result.then(() => undefined, () => undefined);
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=queued-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queued-session.js","sourceRoot":"","sources":["../src/queued-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAa1C,MAAM,gBAAgB;IAKS;IAAqC;IAJ1D,MAAM,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IACrC,gBAAgB,GAAG,KAAK,CAAC;IAEjC,YAA6B,MAAkB,EAAmB,QAAgB;QAArD,WAAM,GAAN,MAAM,CAAY;QAAmB,aAAQ,GAAR,QAAQ,CAAQ;QAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,OAA6G,CAAC;YAClH,IAAI,CAAC;gBAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5D,IAAI,CAAC;oBACH,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;wBAAE,OAAO,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;;wBACrE,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;gBAChD,CAAC;gBAAC,MAAM,CAAC,CAAC,oDAAoD,CAAC,CAAC;gBAChE,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;;gBAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC5C,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB;oBAClC,CAAC,CAAC,IAAI,YAAY,CAAC,qBAAqB,EAAE,YAAY,CAAC;oBACvD,CAAC,CAAC,IAAI,YAAY,CAAC,oBAAoB,EAAE,uGAAuG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YACrK,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAI,MAAc,EAAE,OAAgC,EAAE,EAAE,UAAkE,EAAE;QACjI,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QAC9F,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,oBAAoB,EAAE,8CAA8C,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACtK,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,GAAG,EAAE;gBACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YAC/F,CAAC,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAU,CAAC,EAAE,MAAM;gBAC/C,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;aACnE,CAAC,CAAC;YACH,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAW,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;CACzE;AAED,KAAK,UAAU,OAAO,CAAC,UAAkB;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,OAA2B;IACjE,IAAI,MAAM,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,yBAAyB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;IAC5G,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACnH,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;YAC7H,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG;SAC5D,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA0D,CAAC,CAAC,CAAC;QACpF,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IA2BV;IACA;IACC;IA5BnB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,UAA8B,EAAE;QAClE,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;QACrC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,MAA8B,CAAC;QACnC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC;gBAAC,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;YACpD,MAAM,CAAC;gBACL,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,EAAE,CAAC;oBAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;gBAAC,CAAC;gBACjG,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE,4GAA4G,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtL,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAA0B,MAAM,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpI,OAAO,IAAI,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IACxD,CAAC;IAEO,KAAK,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5C,MAAM,GAAG,KAAK,CAAC;IACf,WAAW,GAAG,CAAC,CAAC;IAChB,sBAAsB,CAAqB;IAEnD,YACkB,QAAgB,EAChB,WAAmB,EAClB,UAA4B;QAF7B,aAAQ,GAAR,QAAQ,CAAQ;QAChB,gBAAW,GAAX,WAAW,CAAQ;QAClB,eAAU,GAAV,UAAU,CAAkB;IAC5C,CAAC;IAEJ,IAAI,KAAK,KAAa,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAChD,IAAI,cAAc,KAAyB,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChF,IAAI,QAAQ,KAAc,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/C,KAAK,CAAC,UAAU,KAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzG,KAAK,CAAC,QAAQ,KAAmC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACjH,KAAK,CAAC,QAAQ,KAA4B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAE1G,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,UAAuB,EAAE;QACnD,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAa,MAAM,EAAE;gBAC/D,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO;aAC5F,EAAE,OAAO,CAAC,CAAC;YACZ,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,cAAc,CAAC;YACpD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,KAAgD,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC;gBAChC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACxE,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,6DAA6D,CAAC,CAAC;gBACjE,CAAC;YAAC,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAoB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE5D,UAAU;QAChB,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,QAAQ,sBAAsB,CAAC,CAAC;IAClG,CAAC;IAEO,OAAO,CAAI,IAAsB;QACvC,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BrowserContext } from "playwright";
|
|
2
|
+
type StorageState = Awaited<ReturnType<BrowserContext["storageState"]>>;
|
|
3
|
+
interface AccountAuth {
|
|
4
|
+
version: 1;
|
|
5
|
+
updatedAt: number;
|
|
6
|
+
state: StorageState;
|
|
7
|
+
}
|
|
8
|
+
export declare function runtimeAccountsDirectory(): string;
|
|
9
|
+
/** Account snapshots contain credentials, never conversation profiles or browser locks. */
|
|
10
|
+
export declare function saveRuntimeAccount(provider: string, state: StorageState, accountId?: string, directory?: string): Promise<void>;
|
|
11
|
+
export declare function readRuntimeAccount(provider: string, accountId?: string, directory?: string): Promise<AccountAuth | undefined>;
|
|
12
|
+
export declare function applyRuntimeAccount(context: BrowserContext, state: StorageState): Promise<void>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { rootDir } from "../core/paths.js";
|
|
5
|
+
import { RuntimeError } from "./types.js";
|
|
6
|
+
export function runtimeAccountsDirectory() { return path.join(rootDir(), "runtime", "accounts"); }
|
|
7
|
+
function accountFile(provider, accountId, directory) {
|
|
8
|
+
if (![provider, accountId].every(value => /^[a-zA-Z0-9_-]{1,80}$/.test(value))) {
|
|
9
|
+
throw new RuntimeError("INVALID_PARAMS", "Invalid provider or account id");
|
|
10
|
+
}
|
|
11
|
+
return path.join(directory, provider, accountId + ".json");
|
|
12
|
+
}
|
|
13
|
+
function credentialsOnly(provider, state) {
|
|
14
|
+
const keys = provider === "kimi"
|
|
15
|
+
? /^(access_token|refresh_token|msh_user_id|msh_user_subscription_data|__snaker__id|ntes_utid|volcano-token-info|[A-F0-9]{16,64})$/
|
|
16
|
+
: provider === "deepseek"
|
|
17
|
+
? /^(userToken|__appKit_userInfo|deepseek-device-id:chat|settingsJwt|smidV2|__ds_remote_feature_did)$/
|
|
18
|
+
: undefined;
|
|
19
|
+
if (!keys)
|
|
20
|
+
return state;
|
|
21
|
+
// Draft databases and last-selected conversation keys must never seed a new chat.
|
|
22
|
+
return { cookies: state.cookies, origins: state.origins.map(origin => ({
|
|
23
|
+
origin: origin.origin, localStorage: origin.localStorage.filter(item => keys.test(item.name)),
|
|
24
|
+
})).filter(origin => origin.localStorage.length > 0) };
|
|
25
|
+
}
|
|
26
|
+
/** Account snapshots contain credentials, never conversation profiles or browser locks. */
|
|
27
|
+
export async function saveRuntimeAccount(provider, state, accountId = "default", directory = runtimeAccountsDirectory()) {
|
|
28
|
+
const file = accountFile(provider, accountId, directory);
|
|
29
|
+
await fs.mkdir(directory, { recursive: true, mode: 0o700 });
|
|
30
|
+
await fs.chmod(directory, 0o700);
|
|
31
|
+
await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
32
|
+
await fs.chmod(path.dirname(file), 0o700);
|
|
33
|
+
const temporary = file + "." + randomUUID() + ".tmp";
|
|
34
|
+
try {
|
|
35
|
+
await fs.writeFile(temporary, JSON.stringify({ version: 1, updatedAt: Date.now(), state: credentialsOnly(provider, state) }), { mode: 0o600 });
|
|
36
|
+
await fs.rename(temporary, file);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await fs.rm(temporary, { force: true });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function readRuntimeAccount(provider, accountId = "default", directory = runtimeAccountsDirectory()) {
|
|
43
|
+
let text;
|
|
44
|
+
try {
|
|
45
|
+
text = await fs.readFile(accountFile(provider, accountId, directory), "utf8");
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error.code === "ENOENT")
|
|
49
|
+
return;
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
const auth = JSON.parse(text);
|
|
53
|
+
if (auth.version !== 1 || !Number.isFinite(auth.updatedAt) || !Array.isArray(auth.state?.cookies) || !Array.isArray(auth.state?.origins)) {
|
|
54
|
+
throw new RuntimeError("INVALID_AUTH_STATE", "Account login state is invalid; sign in again");
|
|
55
|
+
}
|
|
56
|
+
return { ...auth, state: credentialsOnly(provider, auth.state) };
|
|
57
|
+
}
|
|
58
|
+
export async function applyRuntimeAccount(context, state) {
|
|
59
|
+
if (typeof context.setStorageState === "function") {
|
|
60
|
+
await context.setStorageState(state);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (state.origins.some(origin => origin.indexedDB?.length)) {
|
|
64
|
+
throw new RuntimeError("BROWSER_UPGRADE_REQUIRED", "This login uses IndexedDB; upgrade Playwright to restore it");
|
|
65
|
+
}
|
|
66
|
+
// Older Playwright can seed localStorage on an intercepted temporary page.
|
|
67
|
+
// A permanent init script would reset refreshed tokens on every navigation.
|
|
68
|
+
await context.clearCookies();
|
|
69
|
+
await context.addCookies(state.cookies);
|
|
70
|
+
const page = await context.newPage();
|
|
71
|
+
try {
|
|
72
|
+
await page.route("**/*", route => route.fulfill({ status: 200, contentType: "text/html", body: "<!doctype html>" }));
|
|
73
|
+
for (const origin of state.origins) {
|
|
74
|
+
await page.goto(origin.origin, { waitUntil: "domcontentloaded" });
|
|
75
|
+
await page.evaluate(items => {
|
|
76
|
+
localStorage.clear();
|
|
77
|
+
for (const item of items)
|
|
78
|
+
localStorage.setItem(item.name, item.value);
|
|
79
|
+
}, origin.localStorage);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
await page.close();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/runtime/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Conversation } from "./types.js";
|
|
2
|
+
/** Small identity records outlive profile/history GC, so Conductor IDs remain resumable. */
|
|
3
|
+
export declare class ConversationArchive {
|
|
4
|
+
private directory;
|
|
5
|
+
constructor(directory: string);
|
|
6
|
+
private file;
|
|
7
|
+
read(id: string): Conversation | undefined;
|
|
8
|
+
save(chat: Conversation): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { RuntimeError } from "./types.js";
|
|
6
|
+
/** Small identity records outlive profile/history GC, so Conductor IDs remain resumable. */
|
|
7
|
+
export class ConversationArchive {
|
|
8
|
+
directory;
|
|
9
|
+
constructor(directory) {
|
|
10
|
+
this.directory = directory;
|
|
11
|
+
}
|
|
12
|
+
file(id) {
|
|
13
|
+
if (!/^[a-zA-Z0-9_-]{1,160}$/.test(id))
|
|
14
|
+
throw new RuntimeError("NOT_FOUND", "Conversation not found");
|
|
15
|
+
return path.join(this.directory, "archive", id + ".json");
|
|
16
|
+
}
|
|
17
|
+
read(id) {
|
|
18
|
+
let text;
|
|
19
|
+
try {
|
|
20
|
+
text = readFileSync(this.file(id), "utf8");
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error.code === "ENOENT")
|
|
24
|
+
return;
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
const record = JSON.parse(text);
|
|
28
|
+
if (record.version !== 1 || record.conversation?.id !== id || typeof record.conversation.provider !== "string" ||
|
|
29
|
+
typeof record.conversation.accountId !== "string")
|
|
30
|
+
throw new RuntimeError("INVALID_ARCHIVE", "Saved conversation identity is invalid");
|
|
31
|
+
return { ...record.conversation, archived: true };
|
|
32
|
+
}
|
|
33
|
+
async save(chat) {
|
|
34
|
+
const file = this.file(chat.id);
|
|
35
|
+
await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
36
|
+
const { archived: _archived, ...conversation } = chat;
|
|
37
|
+
const temporary = file + "." + randomUUID() + ".tmp";
|
|
38
|
+
const handle = await fs.open(temporary, "wx", 0o600);
|
|
39
|
+
try {
|
|
40
|
+
try {
|
|
41
|
+
await handle.writeFile(JSON.stringify({ version: 1, conversation }));
|
|
42
|
+
await handle.sync();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await handle.close();
|
|
46
|
+
}
|
|
47
|
+
await fs.rename(temporary, file);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
await fs.rm(temporary, { force: true });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/runtime/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAE7D,4FAA4F;AAC5F,MAAM,OAAO,mBAAmB;IACV;IAApB,YAAoB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IACjC,IAAI,CAAC,EAAU;QACrB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,YAAY,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QACtG,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,EAAU;QACb,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QACnD,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,OAAO,MAAM,CAAC,YAAY,CAAC,QAAQ,KAAK,QAAQ;YAC5G,OAAO,MAAM,CAAC,YAAY,CAAC,SAAS,KAAK,QAAQ;YAAE,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,CAAC;QACzI,OAAO,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,IAAkB;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,GAAG,GAAG,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;gBAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;oBAC1F,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YACjC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;gBAAS,CAAC;YAAC,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ChatWorker, WorkerConfig, WorkerNotice, WorkerResult } from "./types.js";
|
|
2
|
+
export declare class BrowserWorker implements ChatWorker {
|
|
3
|
+
private child;
|
|
4
|
+
private counter;
|
|
5
|
+
private pending;
|
|
6
|
+
constructor(config: WorkerConfig);
|
|
7
|
+
private request;
|
|
8
|
+
open(): Promise<WorkerResult>;
|
|
9
|
+
send(input: string, timeoutMs: number, notify: (notice: WorkerNotice) => void, options?: {
|
|
10
|
+
deepThink?: boolean;
|
|
11
|
+
}): Promise<WorkerResult>;
|
|
12
|
+
cancel(): void;
|
|
13
|
+
close(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { runtimeProcessEnv } from "./process-env.js";
|
|
2
|
+
import { fork } from "node:child_process";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { RuntimeError } from "./types.js";
|
|
7
|
+
export class BrowserWorker {
|
|
8
|
+
child;
|
|
9
|
+
counter = 0;
|
|
10
|
+
pending = new Map();
|
|
11
|
+
constructor(config) {
|
|
12
|
+
const js = new URL("./worker.js", import.meta.url);
|
|
13
|
+
const target = existsSync(js) ? js : new URL("./worker.ts", import.meta.url);
|
|
14
|
+
this.child = fork(fileURLToPath(target), [], {
|
|
15
|
+
stdio: ["ignore", "ignore", "ignore", "ipc"],
|
|
16
|
+
execArgv: target.pathname.endsWith(".ts") ? ["--import", createRequire(import.meta.url).resolve("tsx")] : [],
|
|
17
|
+
env: { ...runtimeProcessEnv(), CHAT_WEB_LOG: "silent" },
|
|
18
|
+
});
|
|
19
|
+
this.child.on("message", (message) => {
|
|
20
|
+
const pending = this.pending.get(message?.id);
|
|
21
|
+
if (!pending)
|
|
22
|
+
return;
|
|
23
|
+
if (message.notice) {
|
|
24
|
+
pending.notify?.(message.notice);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
clearTimeout(pending.timer);
|
|
28
|
+
this.pending.delete(message.id);
|
|
29
|
+
if (message.error)
|
|
30
|
+
pending.reject(Object.assign(new RuntimeError(message.error.code ?? "WORKER_ERROR", message.error.message), { stopConfirmed: message.error.stopConfirmed }));
|
|
31
|
+
else
|
|
32
|
+
pending.resolve(message.result);
|
|
33
|
+
});
|
|
34
|
+
const fail = () => {
|
|
35
|
+
for (const entry of this.pending.values()) {
|
|
36
|
+
clearTimeout(entry.timer);
|
|
37
|
+
entry.reject(new RuntimeError("WORKER_EXITED", "Chat worker exited; submitted turns must be reconciled"));
|
|
38
|
+
}
|
|
39
|
+
this.pending.clear();
|
|
40
|
+
};
|
|
41
|
+
this.child.on("exit", fail);
|
|
42
|
+
this.child.on("error", fail);
|
|
43
|
+
this.child.send({ config });
|
|
44
|
+
}
|
|
45
|
+
request(command, params = {}, timeoutMs = 60_000, notify) {
|
|
46
|
+
if (!this.child.connected)
|
|
47
|
+
return Promise.reject(new RuntimeError("WORKER_EXITED", "Chat worker is disconnected"));
|
|
48
|
+
const id = ++this.counter;
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
const timer = setTimeout(() => {
|
|
51
|
+
this.pending.delete(id);
|
|
52
|
+
this.child.kill("SIGTERM");
|
|
53
|
+
reject(new RuntimeError("WORKER_TIMEOUT", "Chat worker timed out"));
|
|
54
|
+
}, timeoutMs);
|
|
55
|
+
this.pending.set(id, { resolve, reject, timer, notify });
|
|
56
|
+
this.child.send({ id, command, ...params }, (error) => {
|
|
57
|
+
if (error) {
|
|
58
|
+
clearTimeout(timer);
|
|
59
|
+
this.pending.delete(id);
|
|
60
|
+
reject(new RuntimeError("WORKER_EXITED", error.message));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
open() { return this.request("open"); }
|
|
66
|
+
send(input, timeoutMs, notify, options = {}) {
|
|
67
|
+
return this.request("send", { input, timeoutMs, deepThink: options.deepThink }, timeoutMs + 60_000, notify);
|
|
68
|
+
}
|
|
69
|
+
cancel() {
|
|
70
|
+
if (this.child.connected)
|
|
71
|
+
this.child.send({ command: "cancel" }, () => undefined);
|
|
72
|
+
}
|
|
73
|
+
async close() {
|
|
74
|
+
if (this.child.connected)
|
|
75
|
+
await this.request("close", {}, 5_000).catch(() => undefined);
|
|
76
|
+
if (this.child.exitCode === null && this.child.signalCode === null) {
|
|
77
|
+
const exited = new Promise((resolve) => this.child.once("exit", () => resolve()));
|
|
78
|
+
this.child.kill("SIGTERM");
|
|
79
|
+
await Promise.race([exited, new Promise((resolve) => setTimeout(resolve, 2_000).unref())]);
|
|
80
|
+
if (this.child.exitCode === null && this.child.signalCode === null) {
|
|
81
|
+
this.child.kill("SIGKILL");
|
|
82
|
+
await exited;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=browser-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-worker.js","sourceRoot":"","sources":["../../src/runtime/browser-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runRuntimeCli(argv: string[], write?: (text: string) => void): Promise<number>;
|