10x-chat 0.4.2 → 0.5.6
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/dist/bin/cli.js +2 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/browser/daemon.d.ts +39 -0
- package/dist/browser/daemon.d.ts.map +1 -0
- package/dist/browser/daemon.js +114 -0
- package/dist/browser/daemon.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +2 -0
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/manager.d.ts.map +1 -1
- package/dist/browser/manager.js +25 -12
- package/dist/browser/manager.js.map +1 -1
- package/dist/browser/tabs.d.ts +22 -0
- package/dist/browser/tabs.d.ts.map +1 -0
- package/dist/browser/tabs.js +97 -0
- package/dist/browser/tabs.js.map +1 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +56 -21
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/login.d.ts.map +1 -1
- package/dist/cli/login.js +96 -3
- package/dist/cli/login.js.map +1 -1
- package/dist/cli/video.d.ts +3 -0
- package/dist/cli/video.d.ts.map +1 -0
- package/dist/cli/video.js +99 -0
- package/dist/cli/video.js.map +1 -0
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/orchestrator.d.ts +10 -0
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +23 -0
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/polling.d.ts +30 -0
- package/dist/core/polling.d.ts.map +1 -0
- package/dist/core/polling.js +37 -0
- package/dist/core/polling.js.map +1 -0
- package/dist/core/video-orchestrator.d.ts +22 -0
- package/dist/core/video-orchestrator.d.ts.map +1 -0
- package/dist/core/video-orchestrator.js +269 -0
- package/dist/core/video-orchestrator.js.map +1 -0
- package/dist/providers/chatgpt.d.ts.map +1 -1
- package/dist/providers/chatgpt.js +67 -19
- package/dist/providers/chatgpt.js.map +1 -1
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +27 -36
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/flow.d.ts +55 -0
- package/dist/providers/flow.d.ts.map +1 -0
- package/dist/providers/flow.js +273 -0
- package/dist/providers/flow.js.map +1 -0
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +33 -38
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/grok.d.ts.map +1 -1
- package/dist/providers/grok.js +23 -23
- package/dist/providers/grok.js.map +1 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +2 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/types.d.ts +24 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { launchBrowser } from '../browser/index.js';
|
|
6
|
+
import { loadConfig } from '../config.js';
|
|
7
|
+
import { configureVideoMode, FLOW_CONFIG, uploadKeyframes, waitForGeneration, } from '../providers/flow.js';
|
|
8
|
+
import { getProvider } from '../providers/index.js';
|
|
9
|
+
import { createSession, saveBundle, saveResponse, updateSession } from '../session/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Execute a video generation interaction with Google Flow:
|
|
12
|
+
* 1. Launch browser → navigate to Flow
|
|
13
|
+
* 2. Click "New project"
|
|
14
|
+
* 3. Configure video mode (model, orientation, count, sub-mode)
|
|
15
|
+
* 4. If frames mode: upload Start/End keyframe images
|
|
16
|
+
* 5. Enter prompt → click Create
|
|
17
|
+
* 6. Poll for generation progress
|
|
18
|
+
* 7. When complete: download video files
|
|
19
|
+
* 8. Save session
|
|
20
|
+
*/
|
|
21
|
+
export async function runVideo(options) {
|
|
22
|
+
const config = await loadConfig();
|
|
23
|
+
const providerName = 'flow';
|
|
24
|
+
const provider = getProvider(providerName);
|
|
25
|
+
const timeoutMs = options.timeoutMs ?? FLOW_CONFIG.defaultTimeoutMs;
|
|
26
|
+
const headless = options.headed === true ? false : config.headless;
|
|
27
|
+
// Create session
|
|
28
|
+
const session = await createSession(providerName, options.prompt, options.model);
|
|
29
|
+
await saveBundle(session.id, options.prompt);
|
|
30
|
+
console.log(chalk.dim(`Session: ${session.id}`));
|
|
31
|
+
console.log(chalk.blue(`Provider: ${FLOW_CONFIG.displayName}`));
|
|
32
|
+
console.log(chalk.dim(`Model: ${options.model ?? FLOW_CONFIG.defaultModel}`));
|
|
33
|
+
console.log(chalk.dim(`Mode: ${options.mode ?? 'ingredients'}`));
|
|
34
|
+
// Note: Flow always uses shared persistent profile for Google SPA auth
|
|
35
|
+
// Launch browser — Flow needs a persistent browser context for Google SPA auth.
|
|
36
|
+
// Use shared profile (default/) with persistent: true.
|
|
37
|
+
let browser;
|
|
38
|
+
try {
|
|
39
|
+
await updateSession(session.id, { status: 'running' });
|
|
40
|
+
browser = await launchBrowser({
|
|
41
|
+
provider: 'gemini',
|
|
42
|
+
headless,
|
|
43
|
+
url: FLOW_CONFIG.url,
|
|
44
|
+
profileMode: 'shared',
|
|
45
|
+
persistent: true,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
await updateSession(session.id, { status: 'failed' });
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
const startTime = Date.now();
|
|
53
|
+
const page = browser.page;
|
|
54
|
+
try {
|
|
55
|
+
// ── Remove all blocking overlays from DOM ──
|
|
56
|
+
await page.waitForTimeout(5000);
|
|
57
|
+
const dismissOverlays = async () => {
|
|
58
|
+
// Only remove cookie consent bar — nothing else
|
|
59
|
+
await page.evaluate(() => {
|
|
60
|
+
for (const el of Array.from(document.querySelectorAll('.glue-cookie-notification-bar'))) {
|
|
61
|
+
el.remove();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
await page.waitForTimeout(500);
|
|
65
|
+
// Click "Get started" on onboarding modal if visible
|
|
66
|
+
const getStarted = page.locator('button:has-text("Get started")').first();
|
|
67
|
+
if (await getStarted.isVisible({ timeout: 2000 }).catch(() => false)) {
|
|
68
|
+
await getStarted.click({ force: true });
|
|
69
|
+
console.log(chalk.dim('Dismissed onboarding modal'));
|
|
70
|
+
await page.waitForTimeout(2000);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
await dismissOverlays();
|
|
74
|
+
// ── Handle marketing page → studio navigation ──
|
|
75
|
+
const isMarketingPage = await page.evaluate(() => {
|
|
76
|
+
const body = document.body.textContent ?? '';
|
|
77
|
+
return body.includes('Where the next wave') || body.includes('Scroll to Explore');
|
|
78
|
+
});
|
|
79
|
+
if (isMarketingPage) {
|
|
80
|
+
console.log(chalk.dim('On marketing page, entering studio...'));
|
|
81
|
+
await page.evaluate(() => {
|
|
82
|
+
for (const el of Array.from(document.querySelectorAll('a, button'))) {
|
|
83
|
+
if (el.textContent?.includes('Create with Flow')) {
|
|
84
|
+
el.click();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
await page.waitForTimeout(8000);
|
|
90
|
+
await dismissOverlays();
|
|
91
|
+
}
|
|
92
|
+
// Step 3: Now we should be in the studio. Check if we need to create a new project.
|
|
93
|
+
// Wait for SPA content to render (studio loads asynchronously)
|
|
94
|
+
await page.waitForTimeout(5000);
|
|
95
|
+
let currentUrl = page.url();
|
|
96
|
+
console.log(chalk.dim(`Studio URL: ${currentUrl}`));
|
|
97
|
+
const isProjectPage = currentUrl.includes('/project/');
|
|
98
|
+
if (!isProjectPage) {
|
|
99
|
+
console.log(chalk.dim('Creating new project...'));
|
|
100
|
+
// Try JS click on "New project" since overlays may still intercept
|
|
101
|
+
const clicked = await page.evaluate(() => {
|
|
102
|
+
for (const btn of Array.from(document.querySelectorAll('button'))) {
|
|
103
|
+
if (btn.textContent?.includes('New project') || btn.textContent?.includes('新建项目')) {
|
|
104
|
+
btn.click();
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
});
|
|
110
|
+
if (clicked) {
|
|
111
|
+
console.log(chalk.dim('Clicked New project, waiting for project to load...'));
|
|
112
|
+
// Wait for URL to change to /project/
|
|
113
|
+
try {
|
|
114
|
+
await page.waitForURL('**/project/**', { timeout: 15_000 });
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
await page.waitForTimeout(5000);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log(chalk.dim('New project button not found in DOM'));
|
|
122
|
+
}
|
|
123
|
+
currentUrl = page.url();
|
|
124
|
+
console.log(chalk.dim(`After new project: ${currentUrl}`));
|
|
125
|
+
}
|
|
126
|
+
// Configure video mode
|
|
127
|
+
console.log(chalk.dim('Configuring video mode...'));
|
|
128
|
+
await configureVideoMode(page, {
|
|
129
|
+
mode: options.mode,
|
|
130
|
+
model: options.model,
|
|
131
|
+
orientation: options.orientation,
|
|
132
|
+
count: options.count,
|
|
133
|
+
});
|
|
134
|
+
// Upload keyframes if in frames mode
|
|
135
|
+
if (options.mode === 'frames' && (options.startFrame || options.endFrame)) {
|
|
136
|
+
console.log(chalk.dim('Uploading keyframes...'));
|
|
137
|
+
await uploadKeyframes(page, {
|
|
138
|
+
startFrame: options.startFrame,
|
|
139
|
+
endFrame: options.endFrame,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// Enter prompt and submit
|
|
143
|
+
console.log(chalk.dim('Submitting prompt...'));
|
|
144
|
+
await provider.actions.submitPrompt(page, options.prompt);
|
|
145
|
+
// Wait for generation
|
|
146
|
+
console.log(chalk.dim('Generating video...'));
|
|
147
|
+
let lastPct = -1;
|
|
148
|
+
await waitForGeneration(page, {
|
|
149
|
+
timeoutMs,
|
|
150
|
+
onProgress: (pct) => {
|
|
151
|
+
if (pct !== lastPct) {
|
|
152
|
+
lastPct = pct;
|
|
153
|
+
process.stdout.write(`\r${chalk.blue('▸')} Generating... ${chalk.bold(`${pct}%`)}`);
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
process.stdout.write('\n');
|
|
158
|
+
const durationMs = Date.now() - startTime;
|
|
159
|
+
const timedOut = durationMs >= timeoutMs;
|
|
160
|
+
// Download generated videos
|
|
161
|
+
const videos = await downloadVideos(page, session.id, options.saveDir);
|
|
162
|
+
const savedVideos = videos.filter((v) => v.localPath);
|
|
163
|
+
const count = savedVideos.length;
|
|
164
|
+
const message = count > 0
|
|
165
|
+
? `Generated ${count} video(s) in ${Math.round(durationMs / 1000)}s`
|
|
166
|
+
: timedOut
|
|
167
|
+
? 'Video generation timed out'
|
|
168
|
+
: 'No videos detected';
|
|
169
|
+
await saveResponse(session.id, message);
|
|
170
|
+
await updateSession(session.id, {
|
|
171
|
+
status: timedOut ? 'timeout' : count > 0 ? 'completed' : 'failed',
|
|
172
|
+
durationMs,
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
sessionId: session.id,
|
|
176
|
+
provider: providerName,
|
|
177
|
+
message,
|
|
178
|
+
videos,
|
|
179
|
+
truncated: timedOut,
|
|
180
|
+
durationMs,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
const durationMs = Date.now() - startTime;
|
|
185
|
+
const isTimeout = error instanceof Error && error.message.toLowerCase().includes('timeout');
|
|
186
|
+
await updateSession(session.id, {
|
|
187
|
+
status: isTimeout ? 'timeout' : 'failed',
|
|
188
|
+
durationMs,
|
|
189
|
+
});
|
|
190
|
+
throw error;
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
await browser.close();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Download generated videos from the browser.
|
|
198
|
+
* Finds <video> elements, fetches their src blobs via the browser context, and saves locally.
|
|
199
|
+
*/
|
|
200
|
+
async function downloadVideos(page, sessionId, saveDir) {
|
|
201
|
+
const outputDir = saveDir ?? path.join(os.homedir(), '.10x-chat', 'sessions', sessionId, 'videos');
|
|
202
|
+
await mkdir(outputDir, { recursive: true });
|
|
203
|
+
// Get video source URLs from the page
|
|
204
|
+
const videoSources = await page.evaluate(() => {
|
|
205
|
+
const videos = document.querySelectorAll('video');
|
|
206
|
+
const sources = [];
|
|
207
|
+
for (const v of Array.from(videos)) {
|
|
208
|
+
const src = v.src || v.querySelector('source')?.src || '';
|
|
209
|
+
if (src)
|
|
210
|
+
sources.push(src);
|
|
211
|
+
}
|
|
212
|
+
return sources;
|
|
213
|
+
});
|
|
214
|
+
if (videoSources.length === 0) {
|
|
215
|
+
console.log(chalk.yellow(' No downloadable videos found.'));
|
|
216
|
+
return [];
|
|
217
|
+
}
|
|
218
|
+
const results = [];
|
|
219
|
+
for (let i = 0; i < videoSources.length; i++) {
|
|
220
|
+
const src = videoSources[i];
|
|
221
|
+
try {
|
|
222
|
+
// Fetch video via browser context (handles auth cookies)
|
|
223
|
+
const dataUrl = await page.evaluate(async (videoUrl) => {
|
|
224
|
+
try {
|
|
225
|
+
const r = await fetch(videoUrl, { credentials: 'include' });
|
|
226
|
+
if (!r.ok)
|
|
227
|
+
return null;
|
|
228
|
+
const blob = await r.blob();
|
|
229
|
+
return new Promise((resolve) => {
|
|
230
|
+
const reader = new FileReader();
|
|
231
|
+
reader.onloadend = () => resolve(reader.result);
|
|
232
|
+
reader.readAsDataURL(blob);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
}, src);
|
|
239
|
+
if (!dataUrl) {
|
|
240
|
+
console.warn(chalk.yellow(` ⚠ Failed to download video ${i + 1}`));
|
|
241
|
+
results.push({});
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);
|
|
245
|
+
if (!match) {
|
|
246
|
+
results.push({});
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const contentType = match[1];
|
|
250
|
+
const ext = contentType.includes('mp4')
|
|
251
|
+
? 'mp4'
|
|
252
|
+
: contentType.includes('webm')
|
|
253
|
+
? 'webm'
|
|
254
|
+
: 'mp4';
|
|
255
|
+
const filename = `video_${i + 1}.${ext}`;
|
|
256
|
+
const filePath = path.join(outputDir, filename);
|
|
257
|
+
const buf = Buffer.from(match[2], 'base64');
|
|
258
|
+
await writeFile(filePath, buf);
|
|
259
|
+
console.log(chalk.green(` ✓ Saved: ${filePath}`));
|
|
260
|
+
results.push({ localPath: filePath });
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
console.warn(chalk.yellow(` ⚠ Error downloading video ${i + 1}: ${err}`));
|
|
264
|
+
results.push({});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return results;
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=video-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-orchestrator.js","sourceRoot":"","sources":["../../src/core/video-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatgpt.d.ts","sourceRoot":"","sources":["../../src/providers/chatgpt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,eAAe,EACf,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,cAAc,EAAE,cAQ5B,CAAC;
|
|
1
|
+
{"version":3,"file":"chatgpt.d.ts","sourceRoot":"","sources":["../../src/providers/chatgpt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,eAAe,EACf,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,cAAc,EAAE,cAQ5B,CAAC;AAmDF,eAAO,MAAM,cAAc,EAAE,eAsL5B,CAAC"}
|
|
@@ -16,19 +16,66 @@ const SELECTORS = {
|
|
|
16
16
|
/** Hidden file input — exclude the dedicated photo/camera inputs */
|
|
17
17
|
fileInput: 'input[type="file"]:not(#upload-photos):not(#upload-camera)',
|
|
18
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* Dismiss ChatGPT onboarding modals, cookie banners, and other overlays
|
|
21
|
+
* that can block the composer input. Fails silently if no overlays are present.
|
|
22
|
+
*/
|
|
23
|
+
async function dismissOverlays(page) {
|
|
24
|
+
const overlaySelectors = [
|
|
25
|
+
// Onboarding modal skip/dismiss buttons
|
|
26
|
+
'#modal-onboarding button:has-text("Skip")',
|
|
27
|
+
'#modal-onboarding button:has-text("Next")',
|
|
28
|
+
'#modal-onboarding button:has-text("Okay")',
|
|
29
|
+
'#modal-onboarding button:has-text("Got it")',
|
|
30
|
+
'#modal-onboarding button:has-text("Done")',
|
|
31
|
+
'[data-testid="onboarding-skip"]',
|
|
32
|
+
// Generic dialog dismiss
|
|
33
|
+
'dialog button:has-text("Dismiss")',
|
|
34
|
+
'dialog button:has-text("Close")',
|
|
35
|
+
'[role="dialog"] button[aria-label="Close"]',
|
|
36
|
+
// Cookie consent
|
|
37
|
+
'button:has-text("Decline optional cookies")',
|
|
38
|
+
'button:has-text("Accept all")',
|
|
39
|
+
// "Stay logged out" prompt
|
|
40
|
+
'button:has-text("Stay logged out")',
|
|
41
|
+
];
|
|
42
|
+
for (const selector of overlaySelectors) {
|
|
43
|
+
try {
|
|
44
|
+
const btn = page.locator(selector).first();
|
|
45
|
+
if (await btn.isVisible().catch(() => false)) {
|
|
46
|
+
await btn.click();
|
|
47
|
+
await page.waitForTimeout(300);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Ignore — overlay may not exist
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
19
55
|
export const chatgptActions = {
|
|
20
56
|
async isLoggedIn(page) {
|
|
21
57
|
try {
|
|
22
58
|
// Wait for either composer or login indicators to appear
|
|
23
|
-
await
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
59
|
+
await page
|
|
60
|
+
.locator(`${SELECTORS.composer}, ${SELECTORS.loginPage}`)
|
|
61
|
+
.first()
|
|
62
|
+
.waitFor({ state: 'visible', timeout: 8_000 })
|
|
63
|
+
.catch(() => { });
|
|
64
|
+
// Dismiss any overlays that might be hiding the composer
|
|
65
|
+
await dismissOverlays(page);
|
|
66
|
+
const composerVisible = await page
|
|
67
|
+
.locator(SELECTORS.composer)
|
|
68
|
+
.first()
|
|
69
|
+
.isVisible()
|
|
70
|
+
.catch(() => false);
|
|
71
|
+
if (composerVisible)
|
|
29
72
|
return true;
|
|
30
|
-
const
|
|
31
|
-
|
|
73
|
+
const loginVisible = await page
|
|
74
|
+
.locator(SELECTORS.loginPage)
|
|
75
|
+
.first()
|
|
76
|
+
.isVisible()
|
|
77
|
+
.catch(() => false);
|
|
78
|
+
if (loginVisible)
|
|
32
79
|
return false;
|
|
33
80
|
return false;
|
|
34
81
|
}
|
|
@@ -43,12 +90,12 @@ export const chatgptActions = {
|
|
|
43
90
|
await page.waitForTimeout(2000);
|
|
44
91
|
},
|
|
45
92
|
async submitPrompt(page, prompt) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
93
|
+
// Dismiss onboarding/welcome modals that block the composer
|
|
94
|
+
await dismissOverlays(page);
|
|
95
|
+
const composer = page.locator(SELECTORS.composer).first();
|
|
96
|
+
await composer.waitFor({ state: 'visible', timeout: 15_000 });
|
|
50
97
|
await composer.click();
|
|
51
|
-
await page.keyboard.press('
|
|
98
|
+
await page.keyboard.press('ControlOrMeta+a');
|
|
52
99
|
await page.keyboard.press('Backspace');
|
|
53
100
|
// Use evaluate for large text to avoid keyboard.type slowness
|
|
54
101
|
try {
|
|
@@ -65,10 +112,8 @@ export const chatgptActions = {
|
|
|
65
112
|
}, { sel: SELECTORS.composer, text: prompt });
|
|
66
113
|
}
|
|
67
114
|
await page.waitForTimeout(300);
|
|
68
|
-
const sendButton =
|
|
69
|
-
|
|
70
|
-
throw new Error('ChatGPT send button not found. The UI may have changed.');
|
|
71
|
-
}
|
|
115
|
+
const sendButton = page.locator(SELECTORS.sendButton).first();
|
|
116
|
+
await sendButton.waitFor({ state: 'visible', timeout: 5_000 });
|
|
72
117
|
await sendButton.click();
|
|
73
118
|
},
|
|
74
119
|
async captureResponse(page, opts) {
|
|
@@ -102,8 +147,11 @@ export const chatgptActions = {
|
|
|
102
147
|
const POLL_INTERVAL = 1000;
|
|
103
148
|
while (Date.now() - startTime < timeoutMs) {
|
|
104
149
|
// If stop button is visible, streaming is still in progress — reset stability
|
|
105
|
-
const
|
|
106
|
-
|
|
150
|
+
const isStreaming = await page
|
|
151
|
+
.locator(SELECTORS.stopButton)
|
|
152
|
+
.first()
|
|
153
|
+
.isVisible()
|
|
154
|
+
.catch(() => false);
|
|
107
155
|
const lastTurn = page.locator(SELECTORS.assistantTurn).last();
|
|
108
156
|
const remainingMs = Math.max(timeoutMs - (Date.now() - startTime), 5_000);
|
|
109
157
|
const currentText = (await lastTurn.textContent({ timeout: remainingMs }))?.trim() ?? '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatgpt.js","sourceRoot":"","sources":["../../src/providers/chatgpt.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,SAAS;IACtB,GAAG,EAAE,qBAAqB;IAC1B,QAAQ,EAAE,gCAAgC;IAC1C,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;IAC7D,YAAY,EAAE,QAAQ;IACtB,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;CAChC,CAAC;AAEF,MAAM,SAAS,GAAG;IAChB,QAAQ,EACN,2FAA2F;IAC7F,UAAU,EACR,wFAAwF;IAC1F,UAAU,EAAE,qCAAqC;IACjD,aAAa,EAAE,wCAAwC;IACvD,SAAS,EAAE,uDAAuD;IAClE,oEAAoE;IACpE,SAAS,EAAE,4DAA4D;CAC/D,CAAC;AAEX,
|
|
1
|
+
{"version":3,"file":"chatgpt.js","sourceRoot":"","sources":["../../src/providers/chatgpt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErF,eAAO,MAAM,aAAa,EAAE,cAQ3B,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,eAyF3B,CAAC"}
|
package/dist/providers/claude.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { pollUntilStable } from '../core/polling.js';
|
|
1
2
|
export const CLAUDE_CONFIG = {
|
|
2
3
|
name: 'claude',
|
|
3
4
|
displayName: 'Claude',
|
|
@@ -16,9 +17,17 @@ const SELECTORS = {
|
|
|
16
17
|
export const claudeActions = {
|
|
17
18
|
async isLoggedIn(page) {
|
|
18
19
|
try {
|
|
19
|
-
await page
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
await page
|
|
21
|
+
.locator(SELECTORS.composer)
|
|
22
|
+
.first()
|
|
23
|
+
.waitFor({ state: 'visible', timeout: 8_000 })
|
|
24
|
+
.catch(() => { });
|
|
25
|
+
const composerVisible = await page
|
|
26
|
+
.locator(SELECTORS.composer)
|
|
27
|
+
.first()
|
|
28
|
+
.isVisible()
|
|
29
|
+
.catch(() => false);
|
|
30
|
+
return composerVisible;
|
|
22
31
|
}
|
|
23
32
|
catch {
|
|
24
33
|
return false;
|
|
@@ -30,12 +39,10 @@ export const claudeActions = {
|
|
|
30
39
|
await page.waitForTimeout(2000);
|
|
31
40
|
},
|
|
32
41
|
async submitPrompt(page, prompt) {
|
|
33
|
-
const composer =
|
|
34
|
-
|
|
35
|
-
throw new Error('Claude composer not found. The UI may have changed. Try running with --headed to debug.');
|
|
36
|
-
}
|
|
42
|
+
const composer = page.locator(SELECTORS.composer).first();
|
|
43
|
+
await composer.waitFor({ state: 'visible', timeout: 15_000 });
|
|
37
44
|
await composer.click();
|
|
38
|
-
await page.keyboard.press('
|
|
45
|
+
await page.keyboard.press('ControlOrMeta+a');
|
|
39
46
|
await page.keyboard.press('Backspace');
|
|
40
47
|
try {
|
|
41
48
|
await composer.fill(prompt);
|
|
@@ -50,9 +57,8 @@ export const claudeActions = {
|
|
|
50
57
|
}, { sel: SELECTORS.composer, text: prompt });
|
|
51
58
|
}
|
|
52
59
|
await page.waitForTimeout(300);
|
|
53
|
-
const sendButton =
|
|
54
|
-
|
|
55
|
-
throw new Error('Claude send button not found.');
|
|
60
|
+
const sendButton = page.locator(SELECTORS.sendButton).first();
|
|
61
|
+
await sendButton.waitFor({ state: 'visible', timeout: 5_000 });
|
|
56
62
|
await sendButton.click();
|
|
57
63
|
},
|
|
58
64
|
async captureResponse(page, opts) {
|
|
@@ -60,35 +66,20 @@ export const claudeActions = {
|
|
|
60
66
|
const startTime = Date.now();
|
|
61
67
|
const existingTurns = await page.locator(SELECTORS.responseTurn).count();
|
|
62
68
|
await page.locator(SELECTORS.responseTurn).nth(existingTurns).waitFor({ timeout: timeoutMs });
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const currentText = (await lastTurn.textContent())?.trim() ?? '';
|
|
70
|
-
if (currentText === lastText) {
|
|
71
|
-
stableCount++;
|
|
72
|
-
if (stableCount >= STABLE_THRESHOLD && currentText.length > 0)
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
if (onChunk && currentText.length > lastText.length) {
|
|
77
|
-
onChunk(currentText.slice(lastText.length));
|
|
78
|
-
}
|
|
79
|
-
lastText = currentText;
|
|
80
|
-
stableCount = 0;
|
|
81
|
-
}
|
|
82
|
-
await page.waitForTimeout(POLL_INTERVAL);
|
|
83
|
-
}
|
|
69
|
+
const remainingMs = Math.max(timeoutMs - (Date.now() - startTime), 5_000);
|
|
70
|
+
const { text, elapsed: _pollElapsed, truncated, } = await pollUntilStable(page, {
|
|
71
|
+
getText: async (p) => (await p.locator(SELECTORS.responseTurn).last().textContent())?.trim() ?? '',
|
|
72
|
+
timeoutMs: remainingMs,
|
|
73
|
+
onChunk,
|
|
74
|
+
});
|
|
84
75
|
const lastTurn = page.locator(SELECTORS.responseTurn).last();
|
|
85
76
|
const markdown = (await lastTurn.innerHTML()) ?? '';
|
|
86
|
-
const
|
|
77
|
+
const totalElapsed = Date.now() - startTime;
|
|
87
78
|
return {
|
|
88
|
-
text
|
|
79
|
+
text,
|
|
89
80
|
markdown,
|
|
90
|
-
truncated
|
|
91
|
-
thinkingTime: Math.round(
|
|
81
|
+
truncated,
|
|
82
|
+
thinkingTime: Math.round(totalElapsed / 1000),
|
|
92
83
|
};
|
|
93
84
|
},
|
|
94
85
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
import type { ProviderActions, ProviderConfig, VideoModel } from '../types.js';
|
|
3
|
+
export declare const FLOW_CONFIG: ProviderConfig;
|
|
4
|
+
export declare const FLOW_SELECTORS: {
|
|
5
|
+
readonly newProject: "button:has-text(\"New project\")";
|
|
6
|
+
readonly goBack: "button:has-text(\"Go Back\")";
|
|
7
|
+
readonly composer: "div[contenteditable=\"true\"]";
|
|
8
|
+
readonly composerTextbox: "[role=\"textbox\"]";
|
|
9
|
+
readonly createButton: "button:has-text(\"arrow_forward\")";
|
|
10
|
+
readonly modelPill: ".sc-46973129-1";
|
|
11
|
+
readonly imageTab: "button[role=\"tab\"]:has-text(\"Image\")";
|
|
12
|
+
readonly videoTab: "button[role=\"tab\"]:has-text(\"Video\")";
|
|
13
|
+
readonly ingredientsTab: "button[role=\"tab\"]:has-text(\"Ingredients\")";
|
|
14
|
+
readonly framesTab: "button[role=\"tab\"]:has-text(\"Frames\")";
|
|
15
|
+
readonly landscapeBtn: "button:has-text(\"Landscape\")";
|
|
16
|
+
readonly portraitBtn: "button:has-text(\"Portrait\")";
|
|
17
|
+
readonly countX1: "button[role=\"tab\"]:has-text(\"x1\")";
|
|
18
|
+
readonly countX2: "button[role=\"tab\"]:has-text(\"x2\")";
|
|
19
|
+
readonly countX3: "button[role=\"tab\"]:has-text(\"x3\")";
|
|
20
|
+
readonly countX4: "button[role=\"tab\"]:has-text(\"x4\")";
|
|
21
|
+
readonly modelDropdown: "button:has-text(\"arrow_drop_down\")";
|
|
22
|
+
readonly startFrame: "text=\"Start\"";
|
|
23
|
+
readonly endFrame: "text=\"End\"";
|
|
24
|
+
readonly addMedia: "button:has-text(\"Add Media\")";
|
|
25
|
+
readonly uploadImage: "[role=\"menuitem\"]:has-text(\"Upload image\")";
|
|
26
|
+
readonly fileInput: "input[type=\"file\"][accept=\"image/*\"]";
|
|
27
|
+
readonly cookieAgree: "button:has-text(\"Agree\")";
|
|
28
|
+
readonly scenebuilder: "button:has-text(\"Scenebuilder\")";
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Configure the model selector for video generation.
|
|
32
|
+
*/
|
|
33
|
+
export declare function configureVideoMode(page: Page, opts: {
|
|
34
|
+
mode?: 'ingredients' | 'frames';
|
|
35
|
+
model?: VideoModel;
|
|
36
|
+
orientation?: 'landscape' | 'portrait';
|
|
37
|
+
count?: 1 | 2 | 3 | 4;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Upload keyframe images in Frames mode.
|
|
41
|
+
*/
|
|
42
|
+
export declare function uploadKeyframes(page: Page, opts: {
|
|
43
|
+
startFrame?: string;
|
|
44
|
+
endFrame?: string;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Poll for video generation progress. Returns when all tiles show completion
|
|
48
|
+
* or when the timeout is reached.
|
|
49
|
+
*/
|
|
50
|
+
export declare function waitForGeneration(page: Page, opts: {
|
|
51
|
+
timeoutMs: number;
|
|
52
|
+
onProgress?: (pct: number) => void;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
export declare const flowActions: ProviderActions;
|
|
55
|
+
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/providers/flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAoB,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjG,eAAO,MAAM,WAAW,EAAE,cAczB,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;CAkDjB,CAAC;AAuBX;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAC;IAChC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IACvC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACvB,GACA,OAAO,CAAC,IAAI,CAAC,CAmEf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAC9D,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,eAAO,MAAM,WAAW,EAAE,eAqFzB,CAAC"}
|