@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,17 @@
|
|
|
1
|
+
import type { Conversation, RuntimeState, Turn } from "./types.js";
|
|
2
|
+
export declare class RuntimeStore {
|
|
3
|
+
readonly directory: string;
|
|
4
|
+
private state;
|
|
5
|
+
private queue;
|
|
6
|
+
private constructor();
|
|
7
|
+
static open(directory: string): Promise<RuntimeStore>;
|
|
8
|
+
read(): RuntimeState;
|
|
9
|
+
conversation(id: string): Conversation | undefined;
|
|
10
|
+
turn(id: string): Turn | undefined;
|
|
11
|
+
conversations(): Conversation[];
|
|
12
|
+
turnStatus(id: string): import("./types.js").TurnStatus;
|
|
13
|
+
update<T>(change: (state: RuntimeState) => T | Promise<T>, durable?: boolean, hooks?: {
|
|
14
|
+
beforeCommit?: () => Promise<void>;
|
|
15
|
+
afterCommit?: () => void;
|
|
16
|
+
}): Promise<T>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export class RuntimeStore {
|
|
4
|
+
directory;
|
|
5
|
+
state;
|
|
6
|
+
queue = Promise.resolve();
|
|
7
|
+
constructor(directory, state) {
|
|
8
|
+
this.directory = directory;
|
|
9
|
+
this.state = state;
|
|
10
|
+
}
|
|
11
|
+
static async open(directory) {
|
|
12
|
+
await fs.mkdir(directory, { recursive: true, mode: 0o700 });
|
|
13
|
+
await fs.chmod(directory, 0o700);
|
|
14
|
+
let state = { version: 1, conversations: {}, turns: {} };
|
|
15
|
+
try {
|
|
16
|
+
state = JSON.parse(await fs.readFile(path.join(directory, "state.json"), "utf8"));
|
|
17
|
+
if (state.version !== 1 || !state.conversations || !state.turns)
|
|
18
|
+
throw new Error("Unsupported chat runtime state");
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error.code !== "ENOENT")
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
return new RuntimeStore(directory, state);
|
|
25
|
+
}
|
|
26
|
+
read() {
|
|
27
|
+
return structuredClone(this.state);
|
|
28
|
+
}
|
|
29
|
+
conversation(id) { return Object.hasOwn(this.state.conversations, id) ? structuredClone(this.state.conversations[id]) : undefined; }
|
|
30
|
+
turn(id) { return Object.hasOwn(this.state.turns, id) ? structuredClone(this.state.turns[id]) : undefined; }
|
|
31
|
+
conversations() { return structuredClone(Object.values(this.state.conversations)); }
|
|
32
|
+
turnStatus(id) { return this.state.turns[id]?.status; }
|
|
33
|
+
// Volatile callbacks validate before mutating; they only update live stream
|
|
34
|
+
// text/events. The next durable transition includes all preceding deltas.
|
|
35
|
+
update(change, durable = true, hooks = {}) {
|
|
36
|
+
const run = this.queue.then(async () => {
|
|
37
|
+
const next = durable ? structuredClone(this.state) : this.state;
|
|
38
|
+
const result = await change(next);
|
|
39
|
+
if (durable) {
|
|
40
|
+
await hooks.beforeCommit?.();
|
|
41
|
+
const file = path.join(this.directory, "state.json");
|
|
42
|
+
const temporary = file + ".tmp";
|
|
43
|
+
const handle = await fs.open(temporary, "w", 0o600);
|
|
44
|
+
try {
|
|
45
|
+
await handle.writeFile(JSON.stringify(next));
|
|
46
|
+
await handle.sync();
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await handle.close();
|
|
50
|
+
}
|
|
51
|
+
await fs.rename(temporary, file);
|
|
52
|
+
}
|
|
53
|
+
this.state = next;
|
|
54
|
+
hooks.afterCommit?.();
|
|
55
|
+
return structuredClone(result);
|
|
56
|
+
});
|
|
57
|
+
this.queue = run.catch(() => undefined);
|
|
58
|
+
return run;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/runtime/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SiteDefinition } from "./types.js";
|
|
2
|
+
/** Incremental SSE framing; input is decoded with TextDecoder(stream: true). */
|
|
3
|
+
export declare class ChatStreamDecoder {
|
|
4
|
+
private format;
|
|
5
|
+
text: string;
|
|
6
|
+
complete: boolean;
|
|
7
|
+
error?: string;
|
|
8
|
+
errorCode?: string;
|
|
9
|
+
source: "sse" | "connect";
|
|
10
|
+
captured: boolean;
|
|
11
|
+
private connectPending;
|
|
12
|
+
private connectEnded;
|
|
13
|
+
private kimiDone;
|
|
14
|
+
private kimiMessageId;
|
|
15
|
+
private kimiBlocks;
|
|
16
|
+
private pending;
|
|
17
|
+
private gpt;
|
|
18
|
+
private fragments;
|
|
19
|
+
private fragmentTypes;
|
|
20
|
+
private lastPath;
|
|
21
|
+
constructor(format: SiteDefinition["format"]);
|
|
22
|
+
push(chunk: string): void;
|
|
23
|
+
/** Connect's five-byte envelope must be decoded before UTF-8, including split headers. */
|
|
24
|
+
pushConnect(chunk: Uint8Array): void;
|
|
25
|
+
finishConnect(): void;
|
|
26
|
+
private kimiConnect;
|
|
27
|
+
private deepseek;
|
|
28
|
+
private providerError;
|
|
29
|
+
private event;
|
|
30
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { ChatGPTSSECollector } from "../providers/chatgpt-sse-collector.js";
|
|
2
|
+
import { parseSSE } from "../core/sse-parser.js";
|
|
3
|
+
/** Incremental SSE framing; input is decoded with TextDecoder(stream: true). */
|
|
4
|
+
export class ChatStreamDecoder {
|
|
5
|
+
format;
|
|
6
|
+
text = "";
|
|
7
|
+
complete = false;
|
|
8
|
+
error;
|
|
9
|
+
errorCode;
|
|
10
|
+
source = "sse";
|
|
11
|
+
captured = false;
|
|
12
|
+
connectPending = Buffer.alloc(0);
|
|
13
|
+
connectEnded = false;
|
|
14
|
+
kimiDone = false;
|
|
15
|
+
kimiMessageId = "";
|
|
16
|
+
kimiBlocks = new Map();
|
|
17
|
+
pending = "";
|
|
18
|
+
gpt = new ChatGPTSSECollector();
|
|
19
|
+
fragments = new Map();
|
|
20
|
+
fragmentTypes = new Map();
|
|
21
|
+
lastPath = "";
|
|
22
|
+
constructor(format) {
|
|
23
|
+
this.format = format;
|
|
24
|
+
}
|
|
25
|
+
push(chunk) {
|
|
26
|
+
this.captured = true;
|
|
27
|
+
this.pending += chunk;
|
|
28
|
+
if (this.pending.length > 2_000_000)
|
|
29
|
+
throw new Error("SSE frame exceeds limit");
|
|
30
|
+
// Keep a trailing CR until its LF arrives in the next chunk.
|
|
31
|
+
const normalized = this.pending.replace(/\r\n/g, "\n");
|
|
32
|
+
const frames = normalized.split("\n\n");
|
|
33
|
+
this.pending = frames.pop() ?? "";
|
|
34
|
+
for (const frame of frames) {
|
|
35
|
+
for (const event of parseSSE(frame + "\n\n"))
|
|
36
|
+
this.event(event.data);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Connect's five-byte envelope must be decoded before UTF-8, including split headers. */
|
|
40
|
+
pushConnect(chunk) {
|
|
41
|
+
this.source = "connect";
|
|
42
|
+
this.captured = true;
|
|
43
|
+
if (this.connectEnded)
|
|
44
|
+
throw new Error("Data after Connect end stream");
|
|
45
|
+
this.connectPending = Buffer.concat([this.connectPending, chunk]);
|
|
46
|
+
let offset = 0;
|
|
47
|
+
while (this.connectPending.length - offset >= 5) {
|
|
48
|
+
const flags = this.connectPending[offset];
|
|
49
|
+
const size = this.connectPending.readUInt32BE(offset + 1);
|
|
50
|
+
if (size > 2_000_000)
|
|
51
|
+
throw new Error("Connect frame exceeds limit");
|
|
52
|
+
if (flags !== 0 && flags !== 2)
|
|
53
|
+
throw new Error("Unsupported Connect frame flags");
|
|
54
|
+
if (this.connectPending.length - offset < size + 5)
|
|
55
|
+
break;
|
|
56
|
+
const body = this.connectPending.subarray(offset + 5, offset + 5 + size);
|
|
57
|
+
const value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(body));
|
|
58
|
+
offset += size + 5;
|
|
59
|
+
if (flags === 2) {
|
|
60
|
+
this.connectEnded = true;
|
|
61
|
+
if (value.error)
|
|
62
|
+
this.providerError(value, "Provider returned a Connect error");
|
|
63
|
+
else
|
|
64
|
+
this.complete = !this.error && this.kimiDone && !!this.text;
|
|
65
|
+
if (offset !== this.connectPending.length)
|
|
66
|
+
throw new Error("Data after Connect end stream");
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
if (this.format !== "kimi")
|
|
70
|
+
throw new Error("Connect is unsupported for this provider");
|
|
71
|
+
this.kimiConnect(value);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
this.connectPending = this.connectPending.subarray(offset);
|
|
75
|
+
}
|
|
76
|
+
finishConnect() {
|
|
77
|
+
if (!this.complete && (this.connectPending.length || !this.connectEnded))
|
|
78
|
+
throw new Error("Connect stream ended without a complete trailer");
|
|
79
|
+
}
|
|
80
|
+
kimiConnect(value) {
|
|
81
|
+
if (this.error)
|
|
82
|
+
return;
|
|
83
|
+
if (value.error) {
|
|
84
|
+
this.providerError(value, "Provider returned an error");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (value.message?.role === "assistant")
|
|
88
|
+
this.kimiMessageId = value.message.id;
|
|
89
|
+
const block = value.block;
|
|
90
|
+
if (block && typeof block.text?.content === "string" &&
|
|
91
|
+
typeof block.id === "string" && /^block\.text(?:\.content)?$/.test(value.mask ?? "") &&
|
|
92
|
+
(!block.messageId || block.messageId === this.kimiMessageId)) {
|
|
93
|
+
const key = this.kimiMessageId + ":" + block.id;
|
|
94
|
+
this.kimiBlocks.set(key, value.op === "append"
|
|
95
|
+
? (this.kimiBlocks.get(key) ?? "") + block.text.content : block.text.content);
|
|
96
|
+
this.text = [...this.kimiBlocks.values()].join("");
|
|
97
|
+
}
|
|
98
|
+
// Kimi can abort fetch after turn done, before the clone receives the Connect trailer.
|
|
99
|
+
// Message completion alone is insufficient: tool rounds can create more messages.
|
|
100
|
+
if (value.done) {
|
|
101
|
+
this.kimiDone = true;
|
|
102
|
+
this.complete = !!this.text;
|
|
103
|
+
}
|
|
104
|
+
if (this.text.length > 1_000_000)
|
|
105
|
+
throw new Error("Response exceeds limit");
|
|
106
|
+
}
|
|
107
|
+
deepseek(value, base = "") {
|
|
108
|
+
const response = value.response ?? value.v?.response ?? (value.p === "response" && !Array.isArray(value.v) ? value.v : undefined);
|
|
109
|
+
if (Array.isArray(response?.fragments)) {
|
|
110
|
+
this.fragments.clear();
|
|
111
|
+
this.fragmentTypes.clear();
|
|
112
|
+
response.fragments.forEach((fragment, index) => {
|
|
113
|
+
this.fragmentTypes.set(index, fragment.type);
|
|
114
|
+
this.fragments.set(index, fragment.content ?? "");
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const path = typeof value.p === "string" ? (base ? base + "/" + value.p : value.p) : this.lastPath;
|
|
118
|
+
if (value.o === "BATCH" && Array.isArray(value.v)) {
|
|
119
|
+
for (const patch of value.v)
|
|
120
|
+
this.deepseek(patch, path);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
if (typeof value.p === "string")
|
|
124
|
+
this.lastPath = path;
|
|
125
|
+
if (path === "response/fragments" && Array.isArray(value.v)) {
|
|
126
|
+
if (value.o === "SET") {
|
|
127
|
+
this.fragments.clear();
|
|
128
|
+
this.fragmentTypes.clear();
|
|
129
|
+
}
|
|
130
|
+
for (const fragment of value.v) {
|
|
131
|
+
const index = this.fragments.size;
|
|
132
|
+
this.fragmentTypes.set(index, fragment.type);
|
|
133
|
+
this.fragments.set(index, fragment.content ?? "");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const match = /(?:response\/)?fragments\/(-?\d+)\/content$/.exec(path);
|
|
137
|
+
if (match && typeof value.v === "string") {
|
|
138
|
+
const raw = Number(match[1]);
|
|
139
|
+
const index = raw < 0 ? this.fragments.size + raw : raw;
|
|
140
|
+
if (index >= 0)
|
|
141
|
+
this.fragments.set(index, value.o === "SET" ? value.v : (this.fragments.get(index) ?? "") + value.v);
|
|
142
|
+
}
|
|
143
|
+
if (response?.status === "FINISHED" || (path === "response/status" && value.v === "FINISHED"))
|
|
144
|
+
this.complete = true;
|
|
145
|
+
}
|
|
146
|
+
this.text = [...this.fragments].filter(([index]) => this.fragmentTypes.get(index) === "RESPONSE")
|
|
147
|
+
.sort(([a], [b]) => a - b).map(([, text]) => text).join("");
|
|
148
|
+
}
|
|
149
|
+
providerError(value, fallback) {
|
|
150
|
+
if (this.error)
|
|
151
|
+
return;
|
|
152
|
+
const error = value.error;
|
|
153
|
+
const details = Array.isArray(error?.details) ? error.details : [];
|
|
154
|
+
const concurrency = (this.format === "deepseek" && value.finish_reason === "parallel_chat_limit") ||
|
|
155
|
+
(this.format === "kimi" && details.some(detail => detail?.debug?.reason === "REASON_CHAT_CONCURRENCY_EXCEEDED"));
|
|
156
|
+
this.errorCode = concurrency ? "PROVIDER_CONCURRENCY_LIMIT" : "PROVIDER_ERROR";
|
|
157
|
+
this.complete = false;
|
|
158
|
+
if (concurrency) {
|
|
159
|
+
const provider = this.format === "kimi" ? "Kimi" : "DeepSeek";
|
|
160
|
+
this.error = provider + " 账号同时生成的对话过多,请等待其他对话结束后重试。";
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Forward only the provider's error message, never its full response,
|
|
164
|
+
// encoded details, metadata or account data.
|
|
165
|
+
const message = [
|
|
166
|
+
typeof error === "string" ? error : error?.message,
|
|
167
|
+
...details.map(detail => detail?.debug?.localizedMessage?.message),
|
|
168
|
+
value.message,
|
|
169
|
+
this.format === "deepseek" ? value.content : undefined,
|
|
170
|
+
].find(item => typeof item === "string" && item.trim());
|
|
171
|
+
const code = typeof error?.code === "string" && /^[a-zA-Z0-9_.-]{1,80}$/.test(error.code) ? error.code : "";
|
|
172
|
+
const text = typeof message === "string" ? message.replace(/[\u0000-\u001f\u007f]/g, " ").trim().slice(0, 500) : "";
|
|
173
|
+
this.error = fallback + (code ? " [" + code + "]" : "") + (text ? ": " + text : "");
|
|
174
|
+
}
|
|
175
|
+
event(data) {
|
|
176
|
+
if (this.error)
|
|
177
|
+
return;
|
|
178
|
+
if (data.trim() === "[DONE]") {
|
|
179
|
+
this.complete = true;
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
let value;
|
|
183
|
+
try {
|
|
184
|
+
value = JSON.parse(data);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (!value || typeof value !== "object")
|
|
190
|
+
return;
|
|
191
|
+
if (value.error || value.type === "error" || value.event === "error") {
|
|
192
|
+
this.providerError(value, "Provider returned an error");
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (this.format === "chatgpt") {
|
|
196
|
+
this.gpt.ingestEvents([{ data, event: "message" }]);
|
|
197
|
+
this.text = this.gpt.getCurrentTurnText();
|
|
198
|
+
this.complete ||= this.gpt.isStreamComplete();
|
|
199
|
+
}
|
|
200
|
+
else if (this.format === "claude") {
|
|
201
|
+
if (value.type === "content_block_delta" && value.delta?.type === "text_delta")
|
|
202
|
+
this.text += value.delta.text ?? "";
|
|
203
|
+
if (value.type === "completion" && typeof value.completion === "string")
|
|
204
|
+
this.text += value.completion;
|
|
205
|
+
if (value.type === "message_stop")
|
|
206
|
+
this.complete = true;
|
|
207
|
+
}
|
|
208
|
+
else if (this.format === "kimi") {
|
|
209
|
+
if (value.event === "cmpl" && typeof value.text === "string")
|
|
210
|
+
this.text += value.text;
|
|
211
|
+
if (value.event === "all_done")
|
|
212
|
+
this.complete = true;
|
|
213
|
+
}
|
|
214
|
+
else if (this.format === "deepseek") {
|
|
215
|
+
this.deepseek(value);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
if (value.type === "delta" && typeof value.text === "string")
|
|
219
|
+
this.text += value.text;
|
|
220
|
+
if (value.type === "done")
|
|
221
|
+
this.complete = true;
|
|
222
|
+
}
|
|
223
|
+
if (this.text.length > 1_000_000)
|
|
224
|
+
throw new Error("Response exceeds limit");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=stream-decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-decoder.js","sourceRoot":"","sources":["../../src/runtime/stream-decoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export type TurnStatus = "queued" | "starting" | "submitting" | "streaming" | "cancelling" | "completed" | "cancelled" | "failed" | "uncertain";
|
|
2
|
+
export interface Conversation {
|
|
3
|
+
id: string;
|
|
4
|
+
provider: string;
|
|
5
|
+
accountId: string;
|
|
6
|
+
headless: boolean;
|
|
7
|
+
deepThink?: boolean;
|
|
8
|
+
createdAt: string;
|
|
9
|
+
url?: string;
|
|
10
|
+
providerConversationId?: string;
|
|
11
|
+
needsReview: boolean;
|
|
12
|
+
closed: boolean;
|
|
13
|
+
closedAt?: string;
|
|
14
|
+
lastActivityAt?: string;
|
|
15
|
+
hasCompletedTurn?: boolean;
|
|
16
|
+
archived?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface TurnEvent {
|
|
19
|
+
seq: number;
|
|
20
|
+
turnId: string;
|
|
21
|
+
type: TurnStatus | "message_delta" | "message_snapshot";
|
|
22
|
+
at: string;
|
|
23
|
+
text?: string;
|
|
24
|
+
error?: string;
|
|
25
|
+
errorCode?: string;
|
|
26
|
+
stopConfirmed?: boolean;
|
|
27
|
+
source?: "sse" | "connect" | "dom";
|
|
28
|
+
}
|
|
29
|
+
export interface Turn {
|
|
30
|
+
id: string;
|
|
31
|
+
conversationId: string;
|
|
32
|
+
requestId: string;
|
|
33
|
+
input: string;
|
|
34
|
+
timeoutMs: number;
|
|
35
|
+
deepThink?: boolean;
|
|
36
|
+
status: TurnStatus;
|
|
37
|
+
text: string;
|
|
38
|
+
events: TurnEvent[];
|
|
39
|
+
createdAt: string;
|
|
40
|
+
error?: string;
|
|
41
|
+
errorCode?: string;
|
|
42
|
+
stopConfirmed?: boolean;
|
|
43
|
+
source?: "sse" | "connect" | "dom";
|
|
44
|
+
}
|
|
45
|
+
export interface RuntimeState {
|
|
46
|
+
version: 1;
|
|
47
|
+
conversations: Record<string, Conversation>;
|
|
48
|
+
turns: Record<string, Turn>;
|
|
49
|
+
}
|
|
50
|
+
export interface SiteDefinition {
|
|
51
|
+
name: string;
|
|
52
|
+
homeUrl: string;
|
|
53
|
+
input: string;
|
|
54
|
+
send: string;
|
|
55
|
+
assistant: string;
|
|
56
|
+
stop: string;
|
|
57
|
+
conversationPath: string;
|
|
58
|
+
conversationUrl?: string;
|
|
59
|
+
streamPath: string;
|
|
60
|
+
format: "chatgpt" | "deepseek" | "kimi" | "claude" | "text";
|
|
61
|
+
experimental?: boolean;
|
|
62
|
+
deepThink?: string;
|
|
63
|
+
authenticated?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface WorkerResult {
|
|
66
|
+
queued?: boolean;
|
|
67
|
+
authRequired?: boolean;
|
|
68
|
+
text?: string;
|
|
69
|
+
url?: string;
|
|
70
|
+
providerConversationId?: string;
|
|
71
|
+
ready?: boolean;
|
|
72
|
+
stopConfirmed?: boolean;
|
|
73
|
+
source?: "sse" | "connect" | "dom";
|
|
74
|
+
}
|
|
75
|
+
export interface WorkerNotice {
|
|
76
|
+
type: "submitting" | "progress";
|
|
77
|
+
text?: string;
|
|
78
|
+
url?: string;
|
|
79
|
+
providerConversationId?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface ChatWorker {
|
|
82
|
+
open(): Promise<WorkerResult>;
|
|
83
|
+
send(input: string, timeoutMs: number, notify: (notice: WorkerNotice) => void, options?: {
|
|
84
|
+
deepThink?: boolean;
|
|
85
|
+
}): Promise<WorkerResult>;
|
|
86
|
+
cancel(): void;
|
|
87
|
+
close(): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
export interface WorkerConfig {
|
|
90
|
+
conversation: Conversation;
|
|
91
|
+
profileDir: string;
|
|
92
|
+
authDirectory?: string;
|
|
93
|
+
site: SiteDefinition;
|
|
94
|
+
executablePath?: string;
|
|
95
|
+
channel?: string;
|
|
96
|
+
}
|
|
97
|
+
export type WorkerFactory = (config: WorkerConfig) => ChatWorker;
|
|
98
|
+
export declare function isTerminal(status: TurnStatus): boolean;
|
|
99
|
+
export declare class RuntimeError extends Error {
|
|
100
|
+
readonly code: string;
|
|
101
|
+
constructor(code: string, message: string);
|
|
102
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function isTerminal(status) {
|
|
2
|
+
return ["completed", "cancelled", "failed", "uncertain"].includes(status);
|
|
3
|
+
}
|
|
4
|
+
export class RuntimeError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "RuntimeError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAsGA,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5E,CAAC;AACD,MAAM,OAAO,YAAa,SAAQ,KAAK;IACT;IAA5B,YAA4B,IAAY,EAAE,OAAe;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QADW,SAAI,GAAJ,IAAI,CAAQ;QAEtC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|