@love-moon/ai-sdk 0.3.1 → 0.4.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 +18 -0
- package/dist/built-in-backends.d.ts +1 -0
- package/dist/built-in-backends.js +6 -0
- package/dist/client.d.ts +15 -0
- package/dist/client.js +103 -1
- package/dist/external-provider-registry.js +4 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/manager/account.d.ts +6 -0
- package/dist/manager/account.js +121 -0
- package/dist/manager/auth-parser.d.ts +27 -0
- package/dist/manager/auth-parser.js +54 -0
- package/dist/manager/config.d.ts +6 -0
- package/dist/manager/config.js +32 -0
- package/dist/manager/index.d.ts +12 -0
- package/dist/manager/index.js +11 -0
- package/dist/manager/install.d.ts +9 -0
- package/dist/manager/install.js +117 -0
- package/dist/manager/manager.d.ts +51 -0
- package/dist/manager/manager.js +105 -0
- package/dist/manager/network.d.ts +8 -0
- package/dist/manager/network.js +46 -0
- package/dist/manager/paths.d.ts +6 -0
- package/dist/manager/paths.js +16 -0
- package/dist/manager/quota/cache.d.ts +9 -0
- package/dist/manager/quota/cache.js +33 -0
- package/dist/manager/quota/claude.d.ts +19 -0
- package/dist/manager/quota/claude.js +193 -0
- package/dist/manager/quota/codex.d.ts +27 -0
- package/dist/manager/quota/codex.js +182 -0
- package/dist/manager/quota/copilot.d.ts +64 -0
- package/dist/manager/quota/copilot.js +718 -0
- package/dist/manager/quota/external.d.ts +29 -0
- package/dist/manager/quota/external.js +176 -0
- package/dist/manager/quota/headers.d.ts +5 -0
- package/dist/manager/quota/headers.js +29 -0
- package/dist/manager/quota/kimi.d.ts +24 -0
- package/dist/manager/quota/kimi.js +230 -0
- package/dist/manager/types.d.ts +166 -0
- package/dist/manager/types.js +1 -0
- package/dist/providers/chat-web-session.d.ts +218 -0
- package/dist/providers/chat-web-session.js +584 -0
- package/dist/providers/claude-agent-sdk-session.d.ts +35 -1
- package/dist/providers/claude-agent-sdk-session.js +109 -1
- package/dist/providers/codex-app-server-session.d.ts +107 -0
- package/dist/providers/codex-app-server-session.js +479 -9
- package/dist/providers/copilot-sdk-session.d.ts +9 -1
- package/dist/providers/copilot-sdk-session.js +48 -0
- package/dist/resume/chat-web.d.ts +20 -0
- package/dist/resume/chat-web.js +44 -0
- package/dist/resume/index.js +2 -0
- package/dist/session-factory.d.ts +3 -1
- package/dist/session-factory.js +17 -4
- package/dist/shared.d.ts +159 -0
- package/dist/shared.js +111 -0
- package/dist/transports/codex-app-server-transport.d.ts +1 -0
- package/dist/transports/codex-app-server-transport.js +45 -1
- package/dist/worker.js +19 -5
- package/package.json +10 -3
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI SDK provider that delegates to the chat-web runtime
|
|
3
|
+
* (`@love-moon/chat-web`), which automates a real Chromium browser against
|
|
4
|
+
* ChatGPT / Gemini / DeepSeek and ferries conversations through their web
|
|
5
|
+
* UIs. Choose the underlying chat-web provider via:
|
|
6
|
+
*
|
|
7
|
+
* - `options.chatWebProvider`: "chatgpt" | "gemini" (preferred)
|
|
8
|
+
* - `options.provider`: same surface
|
|
9
|
+
* - `options.model`: same surface (fallback for ergonomic
|
|
10
|
+
* `createAiSession("chat-web", { model: "gemini" })`)
|
|
11
|
+
*
|
|
12
|
+
* Defaults to "chatgpt". Aliases: "openai"/"gpt" → chatgpt, "google" → gemini.
|
|
13
|
+
*
|
|
14
|
+
* Lifecycle:
|
|
15
|
+
* - `boot()` lazily imports `@love-moon/chat-web`, registers its built-in
|
|
16
|
+
* providers, and opens a long-lived `ChatSession` (headless by default).
|
|
17
|
+
* - `runTurn(prompt)` calls `session.send(prompt)` and emits a single
|
|
18
|
+
* `assistant_message` with the model's reply.
|
|
19
|
+
* - `close()` tears the Chromium context down.
|
|
20
|
+
*
|
|
21
|
+
* Resume: chat-web's "session" is a Chromium browser context, not a
|
|
22
|
+
* conversation ID — there is no native cross-process resume. We synthesise
|
|
23
|
+
* an id so the rest of ai-sdk has something stable to thread on, but
|
|
24
|
+
* passing `resumeSessionId` does not reattach to a prior conversation.
|
|
25
|
+
*/
|
|
26
|
+
export class ChatWebSession extends EventEmitter<[never]> {
|
|
27
|
+
constructor(backend: any, options?: {});
|
|
28
|
+
backend: string;
|
|
29
|
+
options: {};
|
|
30
|
+
logger: any;
|
|
31
|
+
chatWebProvider: string;
|
|
32
|
+
headless: boolean;
|
|
33
|
+
browserChannel: any;
|
|
34
|
+
browserExecutablePath: any;
|
|
35
|
+
turnTimeoutMs: number;
|
|
36
|
+
cwd: any;
|
|
37
|
+
sessionId: any;
|
|
38
|
+
/** Real provider-side conversation id, populated after the first turn lands. */
|
|
39
|
+
providerConversationId: any;
|
|
40
|
+
sessionInfo: {
|
|
41
|
+
backend: string;
|
|
42
|
+
sessionId: any;
|
|
43
|
+
model: string;
|
|
44
|
+
modelProvider: string;
|
|
45
|
+
};
|
|
46
|
+
chatSession: any;
|
|
47
|
+
booted: boolean;
|
|
48
|
+
bootPromise: Promise<void> | null;
|
|
49
|
+
closeRequested: boolean;
|
|
50
|
+
closed: boolean;
|
|
51
|
+
currentTurn: {
|
|
52
|
+
aborted: boolean;
|
|
53
|
+
} | null;
|
|
54
|
+
currentTurnStatus: {
|
|
55
|
+
source: string;
|
|
56
|
+
reply_in_progress: boolean;
|
|
57
|
+
replyTo: any;
|
|
58
|
+
state: any;
|
|
59
|
+
phase: any;
|
|
60
|
+
status_line: any;
|
|
61
|
+
status_done_line: any;
|
|
62
|
+
reply_preview: any;
|
|
63
|
+
thread_id: any;
|
|
64
|
+
session_id: any;
|
|
65
|
+
session_file_path: undefined;
|
|
66
|
+
updated_at: string;
|
|
67
|
+
} | null;
|
|
68
|
+
sessionMessageHandler: any;
|
|
69
|
+
workingStatusHandler: any;
|
|
70
|
+
activeReplyTarget: string;
|
|
71
|
+
lastReplyTarget: string;
|
|
72
|
+
history: any[];
|
|
73
|
+
writeLog(message: any): void;
|
|
74
|
+
trace(message: any): void;
|
|
75
|
+
get threadId(): any;
|
|
76
|
+
get threadOptions(): {
|
|
77
|
+
model: string;
|
|
78
|
+
modelProvider: string;
|
|
79
|
+
};
|
|
80
|
+
getSnapshot(): {
|
|
81
|
+
backend: string;
|
|
82
|
+
provider: string;
|
|
83
|
+
cwd: any;
|
|
84
|
+
sessionId: any;
|
|
85
|
+
sessionInfo: {
|
|
86
|
+
sessionIdDeferred: boolean;
|
|
87
|
+
backend: string;
|
|
88
|
+
sessionId: any;
|
|
89
|
+
model: string;
|
|
90
|
+
modelProvider: string;
|
|
91
|
+
} | null;
|
|
92
|
+
useSessionFileReplyStream: boolean;
|
|
93
|
+
resumeReady: boolean;
|
|
94
|
+
manualResume: {
|
|
95
|
+
ready: boolean;
|
|
96
|
+
command: string | undefined;
|
|
97
|
+
} | null;
|
|
98
|
+
currentTurnStatus: {
|
|
99
|
+
source: string;
|
|
100
|
+
reply_in_progress: boolean;
|
|
101
|
+
replyTo: any;
|
|
102
|
+
state: any;
|
|
103
|
+
phase: any;
|
|
104
|
+
status_line: any;
|
|
105
|
+
status_done_line: any;
|
|
106
|
+
reply_preview: any;
|
|
107
|
+
thread_id: any;
|
|
108
|
+
session_id: any;
|
|
109
|
+
session_file_path: undefined;
|
|
110
|
+
updated_at: string;
|
|
111
|
+
} | null;
|
|
112
|
+
chatWebProvider: string;
|
|
113
|
+
providerConversationId: any;
|
|
114
|
+
providerUrl: string | undefined;
|
|
115
|
+
};
|
|
116
|
+
getSessionInfo(): {
|
|
117
|
+
sessionIdDeferred: boolean;
|
|
118
|
+
backend: string;
|
|
119
|
+
sessionId: any;
|
|
120
|
+
model: string;
|
|
121
|
+
modelProvider: string;
|
|
122
|
+
} | null;
|
|
123
|
+
getCurrentTurnStatus(): {
|
|
124
|
+
source: string;
|
|
125
|
+
reply_in_progress: boolean;
|
|
126
|
+
replyTo: any;
|
|
127
|
+
state: any;
|
|
128
|
+
phase: any;
|
|
129
|
+
status_line: any;
|
|
130
|
+
status_done_line: any;
|
|
131
|
+
reply_preview: any;
|
|
132
|
+
thread_id: any;
|
|
133
|
+
session_id: any;
|
|
134
|
+
session_file_path: undefined;
|
|
135
|
+
updated_at: string;
|
|
136
|
+
} | null;
|
|
137
|
+
usesSessionFileReplyStream(): boolean;
|
|
138
|
+
setSessionMessageHandler(handler: any): void;
|
|
139
|
+
setWorkingStatusHandler(handler: any): void;
|
|
140
|
+
setSessionReplyTarget(replyTo: any): void;
|
|
141
|
+
getCurrentReplyTarget(): string | undefined;
|
|
142
|
+
ensureSessionInfo(): Promise<{
|
|
143
|
+
sessionIdDeferred: boolean;
|
|
144
|
+
backend: string;
|
|
145
|
+
sessionId: any;
|
|
146
|
+
model: string;
|
|
147
|
+
modelProvider: string;
|
|
148
|
+
} | null>;
|
|
149
|
+
getSessionUsageSummary(): Promise<{
|
|
150
|
+
sessionId: any;
|
|
151
|
+
sessionFilePath: undefined;
|
|
152
|
+
totalCostUsd: undefined;
|
|
153
|
+
usage: null;
|
|
154
|
+
rateLimits: null;
|
|
155
|
+
manualResume: null;
|
|
156
|
+
}>;
|
|
157
|
+
getChatWebModule(): Promise<any>;
|
|
158
|
+
boot(): Promise<void>;
|
|
159
|
+
bootInternal(): Promise<void>;
|
|
160
|
+
/**
|
|
161
|
+
* Adopt the provider-side conversation id (ChatGPT /c/{uuid} or
|
|
162
|
+
* equivalent) as our canonical sessionId, update sessionInfo, and emit
|
|
163
|
+
* a fresh `session` event so downstream consumers (ai-sdk runner,
|
|
164
|
+
* conductor daemon, web UI) pick up the change.
|
|
165
|
+
*
|
|
166
|
+
* Idempotent on identical values. Once promoted, the id stays stable
|
|
167
|
+
* for the rest of this ChatWebSession (next runTurn won't re-promote
|
|
168
|
+
* to something else unless the provider session truly changes).
|
|
169
|
+
*/
|
|
170
|
+
applyProviderConversationId(conversationId: any): void;
|
|
171
|
+
/**
|
|
172
|
+
* Build a deep-link to the provider's conversation page so the UI can
|
|
173
|
+
* render "open in ChatGPT" / "open in AI Studio" links.
|
|
174
|
+
*/
|
|
175
|
+
providerConversationUrl(): string | undefined;
|
|
176
|
+
runTurn(promptText: any, { onProgress }?: {
|
|
177
|
+
onProgress?: null | undefined;
|
|
178
|
+
}): Promise<{
|
|
179
|
+
text: string;
|
|
180
|
+
usage: null;
|
|
181
|
+
items: never[];
|
|
182
|
+
events: never[];
|
|
183
|
+
provider: string;
|
|
184
|
+
metadata: {
|
|
185
|
+
source: string;
|
|
186
|
+
sessionId: any;
|
|
187
|
+
chatWebProvider: string;
|
|
188
|
+
conversationId?: undefined;
|
|
189
|
+
providerUrl?: undefined;
|
|
190
|
+
turnIndex?: undefined;
|
|
191
|
+
durationMs?: undefined;
|
|
192
|
+
};
|
|
193
|
+
} | {
|
|
194
|
+
text: string;
|
|
195
|
+
usage: null;
|
|
196
|
+
items: never[];
|
|
197
|
+
events: never[];
|
|
198
|
+
provider: string;
|
|
199
|
+
metadata: {
|
|
200
|
+
source: string;
|
|
201
|
+
sessionId: any;
|
|
202
|
+
chatWebProvider: string;
|
|
203
|
+
conversationId: any;
|
|
204
|
+
providerUrl: string | undefined;
|
|
205
|
+
turnIndex: any;
|
|
206
|
+
durationMs: any;
|
|
207
|
+
};
|
|
208
|
+
}>;
|
|
209
|
+
interruptCurrentTurn(): Promise<void>;
|
|
210
|
+
close(): Promise<void>;
|
|
211
|
+
createSessionClosedError(): Error;
|
|
212
|
+
emitWorkingStatus(payload: any, onProgress?: null): Promise<void>;
|
|
213
|
+
emitTerminalWorkingStatus(payload: any, onProgress?: null): Promise<void>;
|
|
214
|
+
emitAssistantMessage(text: any): Promise<void>;
|
|
215
|
+
}
|
|
216
|
+
import { EventEmitter } from "node:events";
|
|
217
|
+
export const SUPPORTED_CHAT_WEB_PROVIDERS: Set<string>;
|
|
218
|
+
export const DEFAULT_CHAT_WEB_PROVIDER: "chatgpt";
|