@love-moon/chat-web 0.17.2 → 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 +71 -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/index.d.ts +5 -4
- package/dist/index.js +6 -4
- 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/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/package.json +1 -1
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { runtimeDirectory, runtimeSocket } from "./server.js";
|
|
4
|
+
import { isTerminal, RuntimeError } from "./types.js";
|
|
5
|
+
export class ChatRuntimeClient {
|
|
6
|
+
socketPath;
|
|
7
|
+
requestTimeoutMs;
|
|
8
|
+
constructor(socketPath = runtimeSocket(), requestTimeoutMs = 65_000) {
|
|
9
|
+
this.socketPath = socketPath;
|
|
10
|
+
this.requestTimeoutMs = requestTimeoutMs;
|
|
11
|
+
}
|
|
12
|
+
call(method, params = {}) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const request = http.request({ socketPath: this.socketPath, path: "/rpc", method: "POST", agent: false,
|
|
15
|
+
headers: { "content-type": "application/json" } }, (response) => {
|
|
16
|
+
response.setEncoding("utf8");
|
|
17
|
+
let body = "";
|
|
18
|
+
response.on("data", (chunk) => {
|
|
19
|
+
body += chunk;
|
|
20
|
+
if (body.length > 8_000_000) {
|
|
21
|
+
response.destroy(new Error("Runtime response exceeds limit"));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
response.on("error", reject);
|
|
25
|
+
response.on("end", () => {
|
|
26
|
+
try {
|
|
27
|
+
const envelope = JSON.parse(body);
|
|
28
|
+
if (envelope.error)
|
|
29
|
+
reject(new RuntimeError(envelope.error.data?.reason ?? String(envelope.error.code), envelope.error.message));
|
|
30
|
+
else
|
|
31
|
+
resolve(envelope.result);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
reject(error);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
request.setTimeout(this.requestTimeoutMs, () => request.destroy(new RuntimeError("RUNTIME_TIMEOUT", "Runtime request timed out")));
|
|
39
|
+
request.on("error", reject);
|
|
40
|
+
request.end(JSON.stringify({ jsonrpc: "2.0", id: randomUUID(), method, params }));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async checkDeepThink(value) {
|
|
44
|
+
if (value === undefined)
|
|
45
|
+
return;
|
|
46
|
+
if (typeof value !== "boolean")
|
|
47
|
+
throw new RuntimeError("INVALID_PARAMS", "deepThink must be boolean");
|
|
48
|
+
const status = await this.call("runtime.status");
|
|
49
|
+
if (status.capabilities?.deepThink !== true)
|
|
50
|
+
throw new RuntimeError("UNSUPPORTED_OPTION", "Runtime does not support DeepThink; restart it with the updated chat-web package");
|
|
51
|
+
}
|
|
52
|
+
async create(params) {
|
|
53
|
+
await this.checkDeepThink(params.deepThink);
|
|
54
|
+
return this.call("conversations.create", params);
|
|
55
|
+
}
|
|
56
|
+
list() { return this.call("conversations.list"); }
|
|
57
|
+
get(id) { return this.call("conversations.get", { id }); }
|
|
58
|
+
resume(id, options = {}) { return this.call("conversations.resume", { id, ...options }); }
|
|
59
|
+
closeConversation(id) { return this.call("conversations.close", { id }); }
|
|
60
|
+
async submit(params) {
|
|
61
|
+
await this.checkDeepThink(params.deepThink);
|
|
62
|
+
return this.call("turns.create", params);
|
|
63
|
+
}
|
|
64
|
+
getTurn(id) { return this.call("turns.get", { id }); }
|
|
65
|
+
cancel(id) { return this.call("turns.cancel", { id }); }
|
|
66
|
+
async *events(turnId, after = 0, signal) {
|
|
67
|
+
const request = http.request({ socketPath: this.socketPath,
|
|
68
|
+
path: "/events?turnId=" + encodeURIComponent(turnId) + "&after=" + after,
|
|
69
|
+
method: "GET", agent: false, signal });
|
|
70
|
+
const response = await new Promise((resolve, reject) => {
|
|
71
|
+
request.once("response", resolve);
|
|
72
|
+
request.once("error", reject);
|
|
73
|
+
request.end();
|
|
74
|
+
});
|
|
75
|
+
response.setEncoding("utf8");
|
|
76
|
+
try {
|
|
77
|
+
if (response.statusCode !== 200) {
|
|
78
|
+
let body = "";
|
|
79
|
+
for await (const chunk of response)
|
|
80
|
+
body += chunk;
|
|
81
|
+
const envelope = JSON.parse(body);
|
|
82
|
+
throw new RuntimeError(envelope.error?.code ?? "RUNTIME_ERROR", envelope.error?.message ?? "Event subscription failed");
|
|
83
|
+
}
|
|
84
|
+
let pending = "";
|
|
85
|
+
for await (const chunk of response) {
|
|
86
|
+
pending += chunk;
|
|
87
|
+
if (pending.length > 2_000_000)
|
|
88
|
+
throw new RuntimeError("RESPONSE_LIMIT", "Event frame exceeds limit");
|
|
89
|
+
for (;;) {
|
|
90
|
+
const newline = pending.indexOf("\n");
|
|
91
|
+
if (newline < 0)
|
|
92
|
+
break;
|
|
93
|
+
const line = pending.slice(0, newline);
|
|
94
|
+
pending = pending.slice(newline + 1);
|
|
95
|
+
if (line)
|
|
96
|
+
yield JSON.parse(line);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (pending.trim())
|
|
100
|
+
throw new RuntimeError("DISCONNECTED", "Truncated runtime event");
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
response.destroy();
|
|
104
|
+
request.destroy();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async wait(turnId, onEvent, signal) {
|
|
108
|
+
let after = 0;
|
|
109
|
+
for (let attempt = 0; attempt < 4; attempt++) {
|
|
110
|
+
try {
|
|
111
|
+
for await (const event of this.events(turnId, after, signal)) {
|
|
112
|
+
if (event.seq <= after)
|
|
113
|
+
continue;
|
|
114
|
+
after = event.seq;
|
|
115
|
+
onEvent?.(event);
|
|
116
|
+
if (isTerminal(event.type))
|
|
117
|
+
return this.getTurn(turnId);
|
|
118
|
+
}
|
|
119
|
+
const turn = await this.getTurn(turnId);
|
|
120
|
+
if (isTerminal(turn.status))
|
|
121
|
+
return turn;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (signal?.aborted)
|
|
125
|
+
throw new RuntimeError("CLIENT_CLOSED", "Client event subscription closed; remote turn continues");
|
|
126
|
+
if (error instanceof RuntimeError && !["DISCONNECTED", "RUNTIME_ERROR"].includes(error.code))
|
|
127
|
+
throw error;
|
|
128
|
+
const current = await this.getTurn(turnId).catch(() => undefined);
|
|
129
|
+
if (current && isTerminal(current.status))
|
|
130
|
+
return current;
|
|
131
|
+
if (attempt === 3)
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 100 * 2 ** attempt));
|
|
135
|
+
}
|
|
136
|
+
throw new RuntimeError("DISCONNECTED", "Event stream ended before this turn completed");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export class RuntimeChatSession {
|
|
140
|
+
id;
|
|
141
|
+
deepThink;
|
|
142
|
+
releaseOnClose;
|
|
143
|
+
providerConversationId;
|
|
144
|
+
managedOptions;
|
|
145
|
+
client;
|
|
146
|
+
provider;
|
|
147
|
+
activeTurnId;
|
|
148
|
+
interruptRequested = false;
|
|
149
|
+
sending = false;
|
|
150
|
+
localWait;
|
|
151
|
+
turns = 0;
|
|
152
|
+
closed = false;
|
|
153
|
+
constructor(id, provider, socket, deepThink, releaseOnClose = false, providerConversationId, managedOptions) {
|
|
154
|
+
this.id = id;
|
|
155
|
+
this.deepThink = deepThink;
|
|
156
|
+
this.releaseOnClose = releaseOnClose;
|
|
157
|
+
this.providerConversationId = providerConversationId;
|
|
158
|
+
this.managedOptions = managedOptions;
|
|
159
|
+
this.provider = provider;
|
|
160
|
+
this.client = new ChatRuntimeClient(socket);
|
|
161
|
+
}
|
|
162
|
+
static async open(provider, options = {}) {
|
|
163
|
+
if (options.deepThink !== undefined && (provider !== "deepseek" || typeof options.deepThink !== "boolean")) {
|
|
164
|
+
throw new RuntimeError("INVALID_PARAMS", "DeepThink requires a boolean and the DeepSeek provider");
|
|
165
|
+
}
|
|
166
|
+
const managedOptions = options.socketPath ? undefined : { ...options.launch, directory: runtimeDirectory() };
|
|
167
|
+
const socket = options.socketPath ?? await (await import("./managed.js")).ensureChatRuntime(managedOptions);
|
|
168
|
+
const client = new ChatRuntimeClient(socket);
|
|
169
|
+
const chat = options.conversationId ? await client.get(options.conversationId) : await client.create({ provider, accountId: options.accountId, headless: options.headless, deepThink: options.deepThink, providerConversationId: options.providerConversationId });
|
|
170
|
+
if (chat.provider !== provider)
|
|
171
|
+
throw new RuntimeError("PROVIDER_MISMATCH", "Saved conversation uses a different provider");
|
|
172
|
+
return new RuntimeChatSession(chat.id, provider, socket, options.deepThink, options.releaseOnClose, chat.providerConversationId, managedOptions);
|
|
173
|
+
}
|
|
174
|
+
async ensureAvailable() {
|
|
175
|
+
if (this.closed)
|
|
176
|
+
throw new RuntimeError("CHAT_CLOSED", "SDK session is closed");
|
|
177
|
+
if (this.managedOptions)
|
|
178
|
+
await (await import("./managed.js")).ensureChatRuntime(this.managedOptions);
|
|
179
|
+
if (this.closed)
|
|
180
|
+
throw new RuntimeError("CHAT_CLOSED", "SDK session is closed");
|
|
181
|
+
}
|
|
182
|
+
/** Defer browser/auth verification until the queued send owns a worker slot. */
|
|
183
|
+
async prepare() { await this.ensureAvailable(); return this.client.resume(this.id, { allowQueued: true }); }
|
|
184
|
+
async isLoggedIn() { await this.ensureAvailable(); return !!(await this.client.resume(this.id)).ready; }
|
|
185
|
+
async send(message, options = {}) {
|
|
186
|
+
if (options.deepThink !== undefined && typeof options.deepThink !== "boolean")
|
|
187
|
+
throw new RuntimeError("INVALID_PARAMS", "deepThink must be boolean");
|
|
188
|
+
if (this.closed)
|
|
189
|
+
throw new RuntimeError("CHAT_CLOSED", "SDK session is closed");
|
|
190
|
+
if (this.sending)
|
|
191
|
+
throw new RuntimeError("CHAT_BUSY", "This SDK session already has an active send");
|
|
192
|
+
if (options.signal?.aborted)
|
|
193
|
+
throw new DOMException("Aborted", "AbortError");
|
|
194
|
+
this.sending = true;
|
|
195
|
+
this.interruptRequested = false;
|
|
196
|
+
this.localWait = new AbortController();
|
|
197
|
+
const start = Date.now();
|
|
198
|
+
const abort = () => { void this.interruptCurrentTurn().catch(() => undefined); };
|
|
199
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
200
|
+
try {
|
|
201
|
+
await this.ensureAvailable();
|
|
202
|
+
if (options.signal?.aborted || this.interruptRequested)
|
|
203
|
+
throw new DOMException("Aborted", "AbortError");
|
|
204
|
+
const turn = await this.client.submit({ conversationId: this.id, input: message, requestId: options.requestId ?? randomUUID(), timeoutMs: options.timeoutMs, deepThink: options.deepThink ?? this.deepThink });
|
|
205
|
+
this.activeTurnId = turn.id;
|
|
206
|
+
if (this.interruptRequested)
|
|
207
|
+
await this.client.cancel(turn.id);
|
|
208
|
+
let text = "";
|
|
209
|
+
const result = await this.client.wait(turn.id, (event) => {
|
|
210
|
+
if (this.closed)
|
|
211
|
+
return;
|
|
212
|
+
if (event.type === "message_delta")
|
|
213
|
+
text += event.text ?? "";
|
|
214
|
+
else if (event.type === "message_snapshot")
|
|
215
|
+
text = event.text ?? "";
|
|
216
|
+
else {
|
|
217
|
+
options.onStatus?.(event.type);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
options.onProgress?.(text);
|
|
221
|
+
}, this.localWait.signal);
|
|
222
|
+
if (this.closed)
|
|
223
|
+
throw new RuntimeError("CLIENT_CLOSED", "Client detached; remote turn continues");
|
|
224
|
+
if (result.status !== "completed")
|
|
225
|
+
throw Object.assign(new RuntimeError(result.errorCode ?? result.status.toUpperCase(), result.error ?? result.status), { turnStatus: result.status, turnId: result.id, ...(result.status === "cancelled" ? { reason: "turn_cancelled" } : {}) });
|
|
226
|
+
const chat = await this.client.get(this.id);
|
|
227
|
+
return { response: result.text, message, turnIndex: this.turns++, durationMs: Date.now() - start,
|
|
228
|
+
conversationId: chat.providerConversationId, runtimeConversationId: this.id };
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
options.signal?.removeEventListener("abort", abort);
|
|
232
|
+
this.activeTurnId = undefined;
|
|
233
|
+
this.localWait = undefined;
|
|
234
|
+
this.sending = false;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async interruptCurrentTurn() { this.interruptRequested = true; if (this.activeTurnId)
|
|
238
|
+
await this.client.cancel(this.activeTurnId); }
|
|
239
|
+
async close() {
|
|
240
|
+
if (this.closed)
|
|
241
|
+
return;
|
|
242
|
+
this.closed = true;
|
|
243
|
+
this.localWait?.abort();
|
|
244
|
+
// Conductor owns these conversations; closing a task releases its browser.
|
|
245
|
+
// Explicit socket clients keep the original detach-only behavior.
|
|
246
|
+
if (this.releaseOnClose) {
|
|
247
|
+
try {
|
|
248
|
+
await this.client.closeConversation(this.id);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
// An idle managed daemon already released its browsers. Never restart just to close.
|
|
252
|
+
if (!this.managedOptions || !["ENOENT", "ECONNREFUSED"].includes(error.code ?? ""))
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/runtime/client.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAoF,MAAM,YAAY,CAAC;AAExI,MAAM,OAAO,iBAAiB;IACP;IAA+C;IAApE,YAAqB,aAAa,aAAa,EAAE,EAAmB,mBAAmB,MAAM;QAAxE,eAAU,GAAV,UAAU,CAAkB;QAAmB,qBAAgB,GAAhB,gBAAgB,CAAS;IAAG,CAAC;IAEjG,IAAI,CAAc,MAAc,EAAE,SAAiB,EAAE;QACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;gBACpG,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAChE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBACpC,IAAI,IAAI,KAAK,CAAC;oBACd,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;wBAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;oBAAC,CAAC;gBACjG,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACtB,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAClC,IAAI,QAAQ,CAAC,KAAK;4BAAE,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;;4BAC5H,OAAO,CAAC,QAAQ,CAAC,MAAW,CAAC,CAAC;oBACrC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAAC,CAAC;gBACpC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAC;YACnI,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,KAAc;QACzC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAC;QACtG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAA6C,gBAAgB,CAAC,CAAC;QAC7F,IAAI,MAAM,CAAC,YAAY,EAAE,SAAS,KAAK,IAAI;YAAE,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE,kFAAkF,CAAC,CAAC;IAChL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA0H;QACrI,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,KAA8B,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC3E,GAAG,CAAC,EAAU,IAA2B,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,CAAC,EAAU,EAAE,UAAuF,EAAE,IAA0C,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACrN,iBAAiB,CAAC,EAAU,IAA2B,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACzG,KAAK,CAAC,MAAM,CAAC,MAA6G;QACxH,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,EAAU,IAAmB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,CAAC,EAAU,IAAmB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/E,KAAK,CAAC,CAAC,MAAM,CAAC,MAAc,EAAE,KAAK,GAAG,CAAC,EAAE,MAAoB;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU;YACxD,IAAI,EAAE,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,KAAK;YACxE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3E,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAChC,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ;oBAAE,IAAI,IAAI,KAAK,CAAC;gBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI,eAAe,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,2BAA2B,CAAC,CAAC;YAC1H,CAAC;YACD,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACnC,OAAO,IAAI,KAAK,CAAC;gBACjB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS;oBAAE,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAC;gBACtG,SAAS,CAAC;oBACR,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,OAAO,GAAG,CAAC;wBAAE,MAAM;oBACvB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBACvC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;oBACrC,IAAI,IAAI;wBAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;gBAChD,CAAC;YACH,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,EAAE;gBAAE,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;QACxF,CAAC;gBAAS,CAAC;YAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,OAAoC,EAAE,MAAoB;QACnF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC7D,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK;wBAAE,SAAS;oBACjC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;oBAClB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;oBACjB,IAAI,UAAU,CAAC,KAAK,CAAC,IAAsB,CAAC;wBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC5E,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;oBAAE,OAAO,IAAI,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,yDAAyD,CAAC,CAAC;gBACxH,IAAI,KAAK,YAAY,YAAY,IAAI,CAAC,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC1G,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAClE,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE,OAAO,OAAO,CAAC;gBAC1D,IAAI,OAAO,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;YACjC,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,+CAA+C,CAAC,CAAC;IAC1F,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IASA;IAAkE;IAA6B;IAA+B;IAAyC;IAR3L,MAAM,CAAoB;IAC1B,QAAQ,CAAS;IAClB,YAAY,CAAU;IACtB,kBAAkB,GAAG,KAAK,CAAC;IAC3B,OAAO,GAAG,KAAK,CAAC;IAChB,SAAS,CAAmB;IAC5B,KAAK,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,KAAK,CAAC;IACvB,YAA6B,EAAU,EAAE,QAAgB,EAAE,MAA0B,EAAU,SAAmB,EAAU,iBAAiB,KAAK,EAAS,sBAA+B,EAAU,cAAsC;QAA7M,OAAE,GAAF,EAAE,CAAQ;QAAwD,cAAS,GAAT,SAAS,CAAU;QAAU,mBAAc,GAAd,cAAc,CAAQ;QAAS,2BAAsB,GAAtB,sBAAsB,CAAS;QAAU,mBAAc,GAAd,cAAc,CAAwB;QACxO,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,UAA4O,EAAE;QAChR,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;YAC3G,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,wDAAwD,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,CAAC;QAC7G,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC5G,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,sBAAsB,EAAE,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACnQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;YAAE,MAAM,IAAI,YAAY,CAAC,mBAAmB,EAAE,8CAA8C,CAAC,CAAC;QAC5H,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC;IACnJ,CAAC;IACO,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,YAAY,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,cAAc;YAAE,MAAM,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrG,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,YAAY,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;IAClF,CAAC;IACD,gFAAgF;IAChF,KAAK,CAAC,OAAO,KAA4B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnI,KAAK,CAAC,UAAU,KAAuB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1H,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,UAA+K,EAAE;QAC3M,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAC;QACrJ,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,YAAY,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,YAAY,CAAC,WAAW,EAAE,6CAA6C,CAAC,CAAC;QACrG,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,kBAAkB;gBAAE,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACxG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/M,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,kBAAkB;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/D,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvD,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACxB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;oBAAE,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;qBACxD,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;oBAAE,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;qBAC/D,CAAC;oBAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAkB,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBAC9D,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,wCAAwC,CAAC,CAAC;YACnG,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;gBAAE,MAAM,MAAM,CAAC,MAAM,CACpD,IAAI,YAAY,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,EAChG,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACzH,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC9F,cAAc,EAAE,IAAI,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAClF,CAAC;gBAAS,CAAC;YAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAAC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAAC,CAAC;IACrJ,CAAC;IAED,KAAK,CAAC,oBAAoB,KAAoB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnJ,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;QACxB,2EAA2E;QAC3E,kEAAkE;QAClE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACnE,qFAAqF;gBACrF,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAE,KAA+B,CAAC,IAAI,IAAI,EAAE,CAAC;oBAAE,MAAM,KAAK,CAAC;YAC7H,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { startRuntimeServer } from "./server.js";
|
|
2
|
+
const options = JSON.parse(process.argv[2] ?? "{}");
|
|
3
|
+
let server;
|
|
4
|
+
try {
|
|
5
|
+
server = await startRuntimeServer(options);
|
|
6
|
+
const shutdown = () => { void server.close(); };
|
|
7
|
+
process.on("SIGTERM", shutdown);
|
|
8
|
+
process.on("SIGINT", shutdown);
|
|
9
|
+
const configured = Number(process.env.CHAT_WEB_RUNTIME_IDLE_MS ?? 600_000);
|
|
10
|
+
const idleMs = Number.isFinite(configured) && configured >= 1000 ? configured : 600_000;
|
|
11
|
+
const timer = setInterval(() => {
|
|
12
|
+
const status = server.runtime.status();
|
|
13
|
+
if (!status.activeTurns && !status.pinnedChats.length && Date.now() - server.lastActivity > idleMs)
|
|
14
|
+
void server.close();
|
|
15
|
+
}, 1000);
|
|
16
|
+
timer.unref();
|
|
17
|
+
try {
|
|
18
|
+
await server.closed;
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
clearInterval(timer);
|
|
22
|
+
process.off("SIGTERM", shutdown);
|
|
23
|
+
process.off("SIGINT", shutdown);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
// Concurrent starters share the winner; never stop an existing daemon.
|
|
28
|
+
if (error.code !== "RUNTIME_LOCKED") {
|
|
29
|
+
console.error(error);
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/runtime/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACpD,IAAI,MAAkE,CAAC;AACvE,IAAI,CAAC;IACH,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,KAAK,MAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;IACxF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAO,CAAC,YAAY,GAAG,MAAM;YAAE,KAAK,MAAO,CAAC,KAAK,EAAE,CAAC;IAC5H,CAAC,EAAE,IAAI,CAAC,CAAC;IACT,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,MAAM,CAAC;IAAC,CAAC;YACpB,CAAC;QAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAAC,CAAC;AACtG,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,uEAAuE;IACvE,IAAK,KAA2B,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IAAC,CAAC;AAC7G,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { type Conversation, type SiteDefinition, type Turn, type TurnEvent, type WorkerFactory, type WorkerResult } from "./types.js";
|
|
2
|
+
export interface RuntimeOptions {
|
|
3
|
+
directory: string;
|
|
4
|
+
maxWorkers?: number;
|
|
5
|
+
perAccountConcurrency?: number;
|
|
6
|
+
workerFactory?: WorkerFactory;
|
|
7
|
+
sites?: SiteDefinition[];
|
|
8
|
+
executablePath?: string;
|
|
9
|
+
channel?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class ChatRuntime {
|
|
12
|
+
private store;
|
|
13
|
+
private options;
|
|
14
|
+
private events;
|
|
15
|
+
private workers;
|
|
16
|
+
private busy;
|
|
17
|
+
private closing;
|
|
18
|
+
private active;
|
|
19
|
+
private allocation;
|
|
20
|
+
private stopping;
|
|
21
|
+
private failure?;
|
|
22
|
+
private scheduled;
|
|
23
|
+
private archive;
|
|
24
|
+
readonly maxWorkers: number;
|
|
25
|
+
readonly perAccountConcurrency: number;
|
|
26
|
+
readonly sites: SiteDefinition[];
|
|
27
|
+
private constructor();
|
|
28
|
+
static open(options: RuntimeOptions): Promise<ChatRuntime>;
|
|
29
|
+
private conversation;
|
|
30
|
+
private turn;
|
|
31
|
+
list(): Conversation[];
|
|
32
|
+
get(id: string): Conversation;
|
|
33
|
+
getTurn(id: string): Turn;
|
|
34
|
+
status(): {
|
|
35
|
+
version: number;
|
|
36
|
+
capabilities: {
|
|
37
|
+
deepThink: boolean;
|
|
38
|
+
accountBootstrap: boolean;
|
|
39
|
+
queuedStartup: boolean;
|
|
40
|
+
durableResume: boolean;
|
|
41
|
+
};
|
|
42
|
+
maxWorkers: number;
|
|
43
|
+
perAccountConcurrency: number;
|
|
44
|
+
workers: number;
|
|
45
|
+
activeTurns: number;
|
|
46
|
+
stopping: boolean;
|
|
47
|
+
failure: string | undefined;
|
|
48
|
+
pinnedChats: string[];
|
|
49
|
+
retention: Readonly<{
|
|
50
|
+
maxConversations: 256;
|
|
51
|
+
maxClosedConversations: 32;
|
|
52
|
+
maxTurns: 4096;
|
|
53
|
+
closedTtlMs: number;
|
|
54
|
+
openIdleTtlMs: number;
|
|
55
|
+
terminalTtlMs: number;
|
|
56
|
+
resultGraceMs: 60000;
|
|
57
|
+
}>;
|
|
58
|
+
providers: {
|
|
59
|
+
name: string;
|
|
60
|
+
experimental: boolean;
|
|
61
|
+
}[];
|
|
62
|
+
};
|
|
63
|
+
create(params: {
|
|
64
|
+
provider: string;
|
|
65
|
+
accountId?: string;
|
|
66
|
+
headless?: boolean;
|
|
67
|
+
deepThink?: boolean;
|
|
68
|
+
providerConversationId?: string;
|
|
69
|
+
}): Promise<Conversation>;
|
|
70
|
+
resume(id: string, params?: {
|
|
71
|
+
headed?: boolean;
|
|
72
|
+
acknowledgeUncertain?: boolean;
|
|
73
|
+
allowQueued?: boolean;
|
|
74
|
+
}): Promise<Conversation & WorkerResult>;
|
|
75
|
+
closeConversation(id: string): Promise<Conversation>;
|
|
76
|
+
submit(params: {
|
|
77
|
+
conversationId: string;
|
|
78
|
+
requestId: string;
|
|
79
|
+
input: string;
|
|
80
|
+
timeoutMs?: number;
|
|
81
|
+
deepThink?: boolean;
|
|
82
|
+
}): Promise<Turn>;
|
|
83
|
+
private queueExpired;
|
|
84
|
+
private updateRetained;
|
|
85
|
+
private prune;
|
|
86
|
+
private restore;
|
|
87
|
+
private removeProfiles;
|
|
88
|
+
private collect;
|
|
89
|
+
private sweepProfiles;
|
|
90
|
+
private validateDeepThink;
|
|
91
|
+
cancel(id: string): Promise<Turn>;
|
|
92
|
+
history(id: string, after?: number): TurnEvent[];
|
|
93
|
+
subscribe(id: string, listener: (event: TurnEvent) => void): () => void;
|
|
94
|
+
private publish;
|
|
95
|
+
private append;
|
|
96
|
+
private remember;
|
|
97
|
+
private schedule;
|
|
98
|
+
private canEvict;
|
|
99
|
+
private acquire;
|
|
100
|
+
private drop;
|
|
101
|
+
private notice;
|
|
102
|
+
private finish;
|
|
103
|
+
private run;
|
|
104
|
+
shutdown(): Promise<void>;
|
|
105
|
+
}
|