@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.
Files changed (59) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/built-in-backends.d.ts +1 -0
  3. package/dist/built-in-backends.js +6 -0
  4. package/dist/client.d.ts +15 -0
  5. package/dist/client.js +103 -1
  6. package/dist/external-provider-registry.js +4 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.js +3 -0
  9. package/dist/manager/account.d.ts +6 -0
  10. package/dist/manager/account.js +121 -0
  11. package/dist/manager/auth-parser.d.ts +27 -0
  12. package/dist/manager/auth-parser.js +54 -0
  13. package/dist/manager/config.d.ts +6 -0
  14. package/dist/manager/config.js +32 -0
  15. package/dist/manager/index.d.ts +12 -0
  16. package/dist/manager/index.js +11 -0
  17. package/dist/manager/install.d.ts +9 -0
  18. package/dist/manager/install.js +117 -0
  19. package/dist/manager/manager.d.ts +51 -0
  20. package/dist/manager/manager.js +105 -0
  21. package/dist/manager/network.d.ts +8 -0
  22. package/dist/manager/network.js +46 -0
  23. package/dist/manager/paths.d.ts +6 -0
  24. package/dist/manager/paths.js +16 -0
  25. package/dist/manager/quota/cache.d.ts +9 -0
  26. package/dist/manager/quota/cache.js +33 -0
  27. package/dist/manager/quota/claude.d.ts +19 -0
  28. package/dist/manager/quota/claude.js +193 -0
  29. package/dist/manager/quota/codex.d.ts +27 -0
  30. package/dist/manager/quota/codex.js +182 -0
  31. package/dist/manager/quota/copilot.d.ts +64 -0
  32. package/dist/manager/quota/copilot.js +718 -0
  33. package/dist/manager/quota/external.d.ts +29 -0
  34. package/dist/manager/quota/external.js +176 -0
  35. package/dist/manager/quota/headers.d.ts +5 -0
  36. package/dist/manager/quota/headers.js +29 -0
  37. package/dist/manager/quota/kimi.d.ts +24 -0
  38. package/dist/manager/quota/kimi.js +230 -0
  39. package/dist/manager/types.d.ts +166 -0
  40. package/dist/manager/types.js +1 -0
  41. package/dist/providers/chat-web-session.d.ts +218 -0
  42. package/dist/providers/chat-web-session.js +584 -0
  43. package/dist/providers/claude-agent-sdk-session.d.ts +35 -1
  44. package/dist/providers/claude-agent-sdk-session.js +109 -1
  45. package/dist/providers/codex-app-server-session.d.ts +107 -0
  46. package/dist/providers/codex-app-server-session.js +479 -9
  47. package/dist/providers/copilot-sdk-session.d.ts +9 -1
  48. package/dist/providers/copilot-sdk-session.js +48 -0
  49. package/dist/resume/chat-web.d.ts +20 -0
  50. package/dist/resume/chat-web.js +44 -0
  51. package/dist/resume/index.js +2 -0
  52. package/dist/session-factory.d.ts +3 -1
  53. package/dist/session-factory.js +17 -4
  54. package/dist/shared.d.ts +159 -0
  55. package/dist/shared.js +111 -0
  56. package/dist/transports/codex-app-server-transport.d.ts +1 -0
  57. package/dist/transports/codex-app-server-transport.js +45 -1
  58. package/dist/worker.js +19 -5
  59. 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";