@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,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 {};
|