10x-chat 0.7.3 → 0.8.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/README.md CHANGED
@@ -71,6 +71,43 @@ npx 10x-chat@latest chat -p "Long task" --timeout 600000 --headed # 10min timeo
71
71
  | `--headed` | Show browser window during chat |
72
72
  | `--timeout <ms>` | Response timeout in milliseconds (default: 300000) |
73
73
 
74
+ ### `image`
75
+
76
+ Generate images via ChatGPT (DALL-E) or Gemini (Imagen) with non-blocking polling.
77
+
78
+ ```bash
79
+ npx 10x-chat@latest image -p "A fox astronaut in space, digital art" --provider chatgpt
80
+ npx 10x-chat@latest image -p "Watercolor landscape" --provider gemini --save-dir ./images
81
+ npx 10x-chat@latest image -p "Logo design" --headed --timeout 120000
82
+ ```
83
+
84
+ | Flag | Description |
85
+ |------|-------------|
86
+ | `-p, --prompt <text>` | **(required)** The image generation prompt |
87
+ | `--provider <name>` | Provider: `chatgpt`, `gemini` (default: chatgpt) |
88
+ | `--headed` | Show browser window |
89
+ | `--timeout <ms>` | Generation timeout (default: 120000) |
90
+ | `--save-dir <dir>` | Directory to save generated images |
91
+
92
+ ### `research`
93
+
94
+ Deep research via ChatGPT, Gemini, or Perplexity with non-blocking progress polling. Designed for long-running research tasks (5-10+ minutes).
95
+
96
+ ```bash
97
+ npx 10x-chat@latest research -p "Latest breakthroughs in quantum computing" --provider gemini
98
+ npx 10x-chat@latest research -p "Market analysis of EVs" --provider chatgpt --timeout 600000
99
+ npx 10x-chat@latest research -p "Compare React vs Vue in 2026" --provider perplexity --save-dir ./reports
100
+ ```
101
+
102
+ | Flag | Description |
103
+ |------|-------------|
104
+ | `-p, --prompt <text>` | **(required)** The research query |
105
+ | `--provider <name>` | Provider: `chatgpt`, `gemini`, `perplexity` (default: gemini) |
106
+ | `--headed` | Show browser window |
107
+ | `--timeout <ms>` | Total timeout (default: 600000 / 10 min) |
108
+ | `--poll-interval <ms>` | Progress check interval (default: 5000) |
109
+ | `--save-dir <dir>` | Directory to save the research report |
110
+
74
111
  ### `status`
75
112
 
76
113
  List recent chat sessions.
package/dist/bin/cli.js CHANGED
@@ -4,14 +4,30 @@ import { dirname, join } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import chalk from 'chalk';
6
6
  import { Command } from 'commander';
7
+ import { stopDaemon } from '../browser/daemon.js';
7
8
  import { createChatCommand } from '../cli/chat.js';
8
9
  import { createConfigCommand } from '../cli/config.js';
10
+ import { createImageCommand } from '../cli/image.js';
9
11
  import { createLoginCommand } from '../cli/login.js';
10
12
  import { createMigrateCommand } from '../cli/migrate.js';
11
13
  import { createNotebookLMCommand } from '../cli/notebooklm.js';
14
+ import { createResearchCommand } from '../cli/research.js';
12
15
  import { createSkillCommand } from '../cli/skill.js';
13
16
  import { createSessionCommand, createStatusCommand } from '../cli/status.js';
14
17
  import { createVideoCommand } from '../cli/video.js';
18
+ // Ensure the browser daemon is stopped on unexpected exit (Ctrl+C, crash, etc.)
19
+ // so Chrome for Testing doesn't linger in the dock after the CLI finishes.
20
+ const cleanupAndExit = (code) => {
21
+ stopDaemon()
22
+ .catch(() => { })
23
+ .finally(() => process.exit(code));
24
+ };
25
+ process.on('SIGINT', () => cleanupAndExit(130));
26
+ process.on('SIGTERM', () => cleanupAndExit(143));
27
+ process.on('uncaughtException', (err) => {
28
+ console.error(chalk.red(err instanceof Error ? err.message : String(err)));
29
+ cleanupAndExit(1);
30
+ });
15
31
  // Read version from package.json at runtime (works for both src and dist)
16
32
  const __dirname = dirname(fileURLToPath(import.meta.url));
17
33
  const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf-8'));
@@ -22,6 +38,8 @@ program
22
38
  .version(pkg.version);
23
39
  program.addCommand(createLoginCommand());
24
40
  program.addCommand(createChatCommand());
41
+ program.addCommand(createImageCommand());
42
+ program.addCommand(createResearchCommand());
25
43
  program.addCommand(createVideoCommand());
26
44
  program.addCommand(createStatusCommand());
27
45
  program.addCommand(createSessionCommand());
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,0EAA0E;AAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,0EAA0E,CAAC;KACvF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC;AAC9C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE3C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
@@ -82,13 +82,11 @@ async function launchSharedBrowser(opts) {
82
82
  catch {
83
83
  // already closed
84
84
  }
85
- // Unregister tab and check if we're the last one
86
- const remaining = await unregisterTab(tabKey);
87
- if (remaining === 0) {
88
- // Last tab — stop the browser daemon entirely
89
- await stopDaemon();
90
- }
91
- // else: other tabs still open — leave daemon running
85
+ // Unregister tab and stop daemon for single-shot CLI commands the
86
+ // browser should not linger after the task completes. This also handles
87
+ // stale tab files from crashed processes (unregisterTab cleans them).
88
+ await unregisterTab(tabKey);
89
+ await stopDaemon();
92
90
  };
93
91
  return { context, page, lock: null, close };
94
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/browser/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/browser/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createImageCommand(): Command;
3
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/cli/image.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,kBAAkB,IAAI,OAAO,CAkD5C"}
@@ -0,0 +1,76 @@
1
+ import chalk from 'chalk';
2
+ import { Command } from 'commander';
3
+ import { runImageGen } from '../core/image-orchestrator.js';
4
+ import { isValidProvider } from '../providers/index.js';
5
+ const IMAGE_PROVIDERS = ['chatgpt', 'gemini'];
6
+ export function createImageCommand() {
7
+ const cmd = new Command('image')
8
+ .description('Generate images via ChatGPT (DALL-E) or Gemini (Imagen) with browser automation')
9
+ .requiredOption('-p, --prompt <text>', 'The image generation prompt')
10
+ .option('--provider <name>', `Provider (${IMAGE_PROVIDERS.join(', ')})`, 'chatgpt')
11
+ .option('--headed', 'Show browser window')
12
+ .option('--timeout <ms>', 'Generation timeout in milliseconds', '120000')
13
+ .option('--save-dir <dir>', 'Directory to save generated images')
14
+ .option('--isolated-profile', 'Use per-provider browser profiles')
15
+ .action(async (options) => {
16
+ const provider = options.provider ?? 'chatgpt';
17
+ if (!isValidProvider(provider)) {
18
+ console.error(chalk.red(`Unknown provider: ${provider}`));
19
+ process.exit(1);
20
+ }
21
+ if (!IMAGE_PROVIDERS.includes(provider)) {
22
+ console.error(chalk.red(`Provider "${provider}" does not support image generation. Use: ${IMAGE_PROVIDERS.join(', ')}`));
23
+ process.exit(1);
24
+ }
25
+ const timeoutMs = (() => {
26
+ const t = Number.parseInt(options.timeout, 10);
27
+ return Number.isFinite(t) && t > 0 ? t : 120_000;
28
+ })();
29
+ try {
30
+ console.log(chalk.bold.blue('🖼 Image Generation\n'));
31
+ const result = await runImageGen({
32
+ prompt: options.prompt,
33
+ provider: provider,
34
+ headed: options.headed,
35
+ timeoutMs,
36
+ saveDir: options.saveDir,
37
+ isolatedProfile: options.isolatedProfile,
38
+ });
39
+ renderImageResult(result);
40
+ }
41
+ catch (error) {
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ console.error(chalk.red(`Error: ${message}`));
44
+ process.exit(1);
45
+ }
46
+ });
47
+ return cmd;
48
+ }
49
+ function renderImageResult(result) {
50
+ console.log('');
51
+ if (result.images.length > 0) {
52
+ console.log(chalk.bold.green(`--- ${result.images.length} Image(s) Generated ---\n`));
53
+ for (const img of result.images) {
54
+ if (img.localPath) {
55
+ console.log(chalk.green(` 🖼 ${img.localPath}`));
56
+ }
57
+ else {
58
+ console.log(chalk.dim(` 🔗 ${img.url?.slice(0, 100)}`));
59
+ }
60
+ }
61
+ }
62
+ else {
63
+ console.log(chalk.yellow('No images were generated.'));
64
+ }
65
+ if (result.text) {
66
+ console.log(chalk.dim(`\n${result.text}`));
67
+ }
68
+ console.log('');
69
+ console.log(chalk.dim(`Session: ${result.sessionId}`));
70
+ console.log(chalk.dim(`Provider: ${result.provider}`));
71
+ console.log(chalk.dim(`Duration: ${Math.round(result.durationMs / 1000)}s`));
72
+ if (result.truncated) {
73
+ console.log(chalk.yellow('⚠ Generation may be incomplete (timeout reached)'));
74
+ }
75
+ }
76
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/cli/image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createResearchCommand(): Command;
3
+ //# sourceMappingURL=research.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/cli/research.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,IAAI,OAAO,CA2D/C"}
@@ -0,0 +1,70 @@
1
+ import chalk from 'chalk';
2
+ import { Command } from 'commander';
3
+ import { runResearch } from '../core/research-orchestrator.js';
4
+ import { isValidProvider } from '../providers/index.js';
5
+ const RESEARCH_PROVIDERS = ['chatgpt', 'gemini', 'perplexity'];
6
+ export function createResearchCommand() {
7
+ const cmd = new Command('research')
8
+ .description('Deep research via ChatGPT, Gemini, or Perplexity — non-blocking with progress polling')
9
+ .requiredOption('-p, --prompt <text>', 'The research query')
10
+ .option('--provider <name>', `Provider (${RESEARCH_PROVIDERS.join(', ')})`, 'gemini')
11
+ .option('--headed', 'Show browser window')
12
+ .option('--timeout <ms>', 'Total timeout in milliseconds', '600000')
13
+ .option('--poll-interval <ms>', 'Progress check interval in milliseconds', '5000')
14
+ .option('--save-dir <dir>', 'Directory to save the research report')
15
+ .option('--isolated-profile', 'Use per-provider browser profiles')
16
+ .action(async (options) => {
17
+ const provider = options.provider ?? 'gemini';
18
+ if (!isValidProvider(provider)) {
19
+ console.error(chalk.red(`Unknown provider: ${provider}`));
20
+ process.exit(1);
21
+ }
22
+ if (!RESEARCH_PROVIDERS.includes(provider)) {
23
+ console.error(chalk.red(`Provider "${provider}" does not support deep research. Use: ${RESEARCH_PROVIDERS.join(', ')}`));
24
+ process.exit(1);
25
+ }
26
+ const timeoutMs = (() => {
27
+ const t = Number.parseInt(options.timeout, 10);
28
+ return Number.isFinite(t) && t > 0 ? t : 600_000;
29
+ })();
30
+ const pollIntervalMs = (() => {
31
+ const t = Number.parseInt(options.pollInterval, 10);
32
+ return Number.isFinite(t) && t > 0 ? t : 5_000;
33
+ })();
34
+ try {
35
+ console.log(chalk.bold.blue('🔬 Deep Research\n'));
36
+ const result = await runResearch({
37
+ prompt: options.prompt,
38
+ provider: provider,
39
+ headed: options.headed,
40
+ timeoutMs,
41
+ pollIntervalMs,
42
+ saveDir: options.saveDir,
43
+ isolatedProfile: options.isolatedProfile,
44
+ });
45
+ renderResearchResult(result);
46
+ }
47
+ catch (error) {
48
+ const message = error instanceof Error ? error.message : String(error);
49
+ console.error(chalk.red(`Error: ${message}`));
50
+ process.exit(1);
51
+ }
52
+ });
53
+ return cmd;
54
+ }
55
+ function renderResearchResult(result) {
56
+ console.log('');
57
+ console.log(chalk.bold.green('--- Research Report ---\n'));
58
+ console.log(result.report);
59
+ console.log('');
60
+ if (result.savedPath) {
61
+ console.log(chalk.green(`📄 Saved: ${result.savedPath}`));
62
+ }
63
+ console.log(chalk.dim(`Session: ${result.sessionId}`));
64
+ console.log(chalk.dim(`Provider: ${result.provider}`));
65
+ console.log(chalk.dim(`Duration: ${Math.round(result.durationMs / 1000)}s`));
66
+ if (result.truncated) {
67
+ console.log(chalk.yellow('⚠ Report may be incomplete (timeout reached)'));
68
+ }
69
+ }
70
+ //# sourceMappingURL=research.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/cli/research.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ImageGenOptions, ImageGenResult } from '../types.js';
2
+ /**
3
+ * Run image generation:
4
+ * 1. Launch browser → navigate to provider
5
+ * 2. Submit the image prompt
6
+ * 3. Poll for generation progress (non-blocking)
7
+ * 4. Extract and download generated images
8
+ */
9
+ export declare function runImageGen(options: ImageGenOptions): Promise<ImageGenResult>;
10
+ //# sourceMappingURL=image-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/image-orchestrator.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAkB,eAAe,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAgJjG;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAyHnF"}
@@ -0,0 +1,237 @@
1
+ import chalk from 'chalk';
2
+ import { launchBrowser } from '../browser/index.js';
3
+ import { resolveHeadlessMode } from '../browser/mode.js';
4
+ import { loadConfig } from '../config.js';
5
+ import { getProvider } from '../providers/index.js';
6
+ import { createSession, saveBundle, saveResponse, updateSession } from '../session/index.js';
7
+ import { downloadImages } from './images.js';
8
+ const chatgptImageGen = {
9
+ async isGenerating(page) {
10
+ // ChatGPT shows a stop button while DALL-E is generating
11
+ const stopBtn = await page
12
+ .locator('button[aria-label="Stop streaming"]')
13
+ .first()
14
+ .isVisible()
15
+ .catch(() => false);
16
+ if (stopBtn)
17
+ return true;
18
+ // Also check for "Creating image..." text in the last assistant turn
19
+ const lastTurn = page.locator('[data-message-author-role="assistant"]').last();
20
+ const text = (await lastTurn.textContent().catch(() => ''))?.toLowerCase() ?? '';
21
+ return text.includes('creating') || text.includes('generating');
22
+ },
23
+ async extractImages(page) {
24
+ return page.evaluate(() => {
25
+ const seen = new Set();
26
+ const results = [];
27
+ // DALL-E generated images
28
+ const imgs = Array.from(document.querySelectorAll('img[alt="Generated image"], img[alt*="DALL"], img[data-testid*="image"]'));
29
+ for (const img of imgs) {
30
+ const src = img.getAttribute('src') ?? '';
31
+ const idMatch = src.match(/[?&]id=([^&]+)/);
32
+ const key = idMatch ? idMatch[1] : src;
33
+ if (!key || seen.has(key))
34
+ continue;
35
+ const w = img.naturalWidth;
36
+ const h = img.naturalHeight;
37
+ if (w > 0 && w < 64 && h > 0 && h < 64)
38
+ continue;
39
+ seen.add(key);
40
+ results.push({
41
+ url: src,
42
+ alt: img.getAttribute('alt') ?? '',
43
+ width: w,
44
+ height: h,
45
+ });
46
+ }
47
+ return results;
48
+ });
49
+ },
50
+ async extractText(page) {
51
+ const lastTurn = page.locator('[data-message-author-role="assistant"]').last();
52
+ return (await lastTurn.textContent().catch(() => ''))?.trim() ?? '';
53
+ },
54
+ };
55
+ const geminiImageGen = {
56
+ async isGenerating(page) {
57
+ // Check for Gemini image generation indicators
58
+ const indicators = [
59
+ 'button[aria-label="Stop generating"]',
60
+ 'button[aria-label="Cancel"]',
61
+ '.image-generation-loading',
62
+ '.loading-indicator',
63
+ 'model-response [class*="loading"]',
64
+ 'model-response [class*="progress"]',
65
+ ];
66
+ for (const sel of indicators) {
67
+ const visible = await page
68
+ .locator(sel)
69
+ .first()
70
+ .isVisible()
71
+ .catch(() => false);
72
+ if (visible)
73
+ return true;
74
+ }
75
+ // Check for "Loading Nano Banana" or "Generating image" text
76
+ const lastTurn = page
77
+ .locator('model-response .model-response-text, model-response message-content')
78
+ .last();
79
+ const text = (await lastTurn.textContent().catch(() => ''))?.toLowerCase() ?? '';
80
+ return (text.includes('loading nano banana') ||
81
+ text.includes('generating image') ||
82
+ text.includes('creating image') ||
83
+ text.includes('loading imagen'));
84
+ },
85
+ async extractImages(page) {
86
+ return page.evaluate(() => {
87
+ const seen = new Set();
88
+ const results = [];
89
+ const selectors = [
90
+ 'img.image.loaded',
91
+ 'img[alt*="AI generated"]',
92
+ 'img[alt*="Generated"]',
93
+ 'model-response img[src*="lh3.googleusercontent.com"]',
94
+ 'model-response img[src*="encrypted"]',
95
+ ];
96
+ const imgs = Array.from(document.querySelectorAll(selectors.join(', ')));
97
+ for (const img of imgs) {
98
+ const src = img.getAttribute('src') ?? '';
99
+ if (!src || seen.has(src))
100
+ continue;
101
+ const w = img.naturalWidth;
102
+ const h = img.naturalHeight;
103
+ if (w > 0 && w < 64 && h > 0 && h < 64)
104
+ continue;
105
+ seen.add(src);
106
+ const fullSizeUrl = src.includes('=s') ? src : `${src}=s1024-rj`;
107
+ results.push({
108
+ url: fullSizeUrl,
109
+ alt: img.getAttribute('alt') ?? '',
110
+ width: w,
111
+ height: h,
112
+ });
113
+ }
114
+ return results;
115
+ });
116
+ },
117
+ async extractText(page) {
118
+ const lastTurn = page
119
+ .locator('model-response .model-response-text, model-response message-content')
120
+ .last();
121
+ return (await lastTurn.textContent().catch(() => ''))?.trim() ?? '';
122
+ },
123
+ };
124
+ const IMAGE_GEN_CONFIGS = {
125
+ chatgpt: chatgptImageGen,
126
+ gemini: geminiImageGen,
127
+ };
128
+ /**
129
+ * Run image generation:
130
+ * 1. Launch browser → navigate to provider
131
+ * 2. Submit the image prompt
132
+ * 3. Poll for generation progress (non-blocking)
133
+ * 4. Extract and download generated images
134
+ */
135
+ export async function runImageGen(options) {
136
+ const config = await loadConfig();
137
+ const providerName = options.provider ?? 'chatgpt';
138
+ const provider = getProvider(providerName);
139
+ const imageGenConfig = IMAGE_GEN_CONFIGS[providerName];
140
+ if (!imageGenConfig) {
141
+ throw new Error(`Provider "${providerName}" does not support image generation. Use: chatgpt, gemini`);
142
+ }
143
+ const timeoutMs = options.timeoutMs ?? 120_000;
144
+ const headless = resolveHeadlessMode(providerName, config.headless, options.headed === true);
145
+ const profileMode = options.isolatedProfile ? 'isolated' : config.profileMode;
146
+ const session = await createSession(providerName, options.prompt);
147
+ await saveBundle(session.id, options.prompt);
148
+ console.log(chalk.dim(`Session: ${session.id}`));
149
+ console.log(chalk.blue(`Provider: ${provider.config.displayName}`));
150
+ console.log(chalk.dim(`Timeout: ${Math.round(timeoutMs / 1000)}s\n`));
151
+ let browser;
152
+ try {
153
+ await updateSession(session.id, { status: 'running' });
154
+ browser = await launchBrowser({
155
+ provider: providerName,
156
+ headless,
157
+ url: provider.config.url,
158
+ profileMode,
159
+ });
160
+ }
161
+ catch (error) {
162
+ await updateSession(session.id, { status: 'failed' });
163
+ throw error;
164
+ }
165
+ const startTime = Date.now();
166
+ try {
167
+ // Check login
168
+ const loggedIn = await provider.actions.isLoggedIn(browser.page);
169
+ if (!loggedIn) {
170
+ throw new Error(`Not logged in to ${provider.config.displayName}. Run: 10x-chat login ${providerName}`);
171
+ }
172
+ // Submit the image generation prompt
173
+ console.log(chalk.dim('Submitting image prompt...'));
174
+ await provider.actions.submitPrompt(browser.page, options.prompt);
175
+ // Poll for image generation with progress updates
176
+ console.log(chalk.dim('Generating image(s)...\n'));
177
+ const pollInterval = 3_000;
178
+ let lastLogTime = Date.now();
179
+ while (Date.now() - startTime < timeoutMs) {
180
+ const generating = await imageGenConfig.isGenerating(browser.page);
181
+ // Log periodic progress
182
+ if (Date.now() - lastLogTime > 10_000) {
183
+ const elapsed = Math.round((Date.now() - startTime) / 1000);
184
+ console.log(chalk.dim(` [${elapsed}s] Still generating...`));
185
+ lastLogTime = Date.now();
186
+ }
187
+ if (!generating) {
188
+ // Double-check: wait one more interval to be sure
189
+ await browser.page.waitForTimeout(pollInterval);
190
+ const stillGenerating = await imageGenConfig.isGenerating(browser.page);
191
+ if (!stillGenerating)
192
+ break;
193
+ }
194
+ await browser.page.waitForTimeout(pollInterval);
195
+ }
196
+ // Wait for images to fully load
197
+ await browser.page.waitForTimeout(2_000);
198
+ // Extract images
199
+ const images = await imageGenConfig.extractImages(browser.page);
200
+ const text = await imageGenConfig.extractText(browser.page);
201
+ console.log(chalk.green(`\n✓ Found ${images.length} image(s)`));
202
+ // Download images
203
+ let savedImages = images;
204
+ if (images.length > 0) {
205
+ console.log(chalk.dim('Downloading images...'));
206
+ savedImages = await downloadImages(browser.page, images, session.id, options.saveDir);
207
+ }
208
+ const durationMs = Date.now() - startTime;
209
+ const truncated = durationMs >= timeoutMs;
210
+ await saveResponse(session.id, text);
211
+ await updateSession(session.id, {
212
+ status: truncated ? 'timeout' : 'completed',
213
+ durationMs,
214
+ });
215
+ return {
216
+ sessionId: session.id,
217
+ provider: providerName,
218
+ images: savedImages,
219
+ text,
220
+ truncated,
221
+ durationMs,
222
+ };
223
+ }
224
+ catch (error) {
225
+ const durationMs = Date.now() - startTime;
226
+ const isTimeout = error instanceof Error && error.message.toLowerCase().includes('timeout');
227
+ await updateSession(session.id, {
228
+ status: isTimeout ? 'timeout' : 'failed',
229
+ durationMs,
230
+ });
231
+ throw error;
232
+ }
233
+ finally {
234
+ await browser.close();
235
+ }
236
+ }
237
+ //# sourceMappingURL=image-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-orchestrator.js","sourceRoot":"","sources":["../../src/core/image-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ResearchOptions, ResearchResult } from '../types.js';
2
+ /**
3
+ * Run a deep research session:
4
+ * 1. Launch browser → navigate to provider
5
+ * 2. Activate deep research mode
6
+ * 3. Submit the research query
7
+ * 4. Poll for progress (non-blocking style with status updates)
8
+ * 5. Wait for completion
9
+ * 6. Extract and save the report
10
+ */
11
+ export declare function runResearch(options: ResearchOptions): Promise<ResearchResult>;
12
+ //# sourceMappingURL=research-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/research-orchestrator.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAgB,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA6JjF;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAkInF"}
@@ -0,0 +1,260 @@
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 { resolveHeadlessMode } from '../browser/mode.js';
7
+ import { loadConfig } from '../config.js';
8
+ import { getProvider } from '../providers/index.js';
9
+ import { createSession, saveBundle, saveResponse, updateSession } from '../session/index.js';
10
+ const geminiResearch = {
11
+ async activateResearch(page) {
12
+ // Gemini Deep Research: click the "Deep Research" chip/button
13
+ // It may appear as a button or in a menu depending on the model
14
+ const deepResearchBtn = page
15
+ .locator('button:has-text("Deep Research"), [aria-label*="Deep Research"], button:has-text("Research")')
16
+ .first();
17
+ const visible = await deepResearchBtn.isVisible().catch(() => false);
18
+ if (visible) {
19
+ await deepResearchBtn.click();
20
+ await page.waitForTimeout(1000);
21
+ }
22
+ // If not visible, Gemini may auto-route to deep research based on prompt
23
+ },
24
+ progressSelector: '.research-progress, .thinking-indicator, model-response [class*="progress"]',
25
+ async getProgress(page) {
26
+ const el = page
27
+ .locator('.research-progress, .thinking-indicator, model-response [class*="progress"]')
28
+ .first();
29
+ return (await el.textContent().catch(() => '')) ?? '';
30
+ },
31
+ async isResearching(page) {
32
+ // Check for active research indicators
33
+ const indicators = [
34
+ '.research-progress',
35
+ '.thinking-indicator',
36
+ 'button[aria-label="Stop generating"]',
37
+ 'button[aria-label="Cancel"]',
38
+ 'model-response [class*="loading"]',
39
+ 'model-response [class*="progress"]',
40
+ ];
41
+ for (const sel of indicators) {
42
+ const visible = await page
43
+ .locator(sel)
44
+ .first()
45
+ .isVisible()
46
+ .catch(() => false);
47
+ if (visible)
48
+ return true;
49
+ }
50
+ return false;
51
+ },
52
+ async getReport(page) {
53
+ const responseTurn = page
54
+ .locator('model-response .model-response-text, model-response message-content')
55
+ .last();
56
+ return (await responseTurn.textContent().catch(() => ''))?.trim() ?? '';
57
+ },
58
+ async getReportHtml(page) {
59
+ const responseTurn = page
60
+ .locator('model-response .model-response-text, model-response message-content')
61
+ .last();
62
+ return (await responseTurn.innerHTML().catch(() => '')) ?? '';
63
+ },
64
+ };
65
+ const chatgptResearch = {
66
+ async activateResearch(page) {
67
+ // ChatGPT deep research: look for "Deep Research" or "Research" button/toggle
68
+ // Usually appears as a mode toggle or in the model picker
69
+ const researchBtn = page
70
+ .locator('button:has-text("Deep research"), [data-testid*="research"], button:has-text("Research")')
71
+ .first();
72
+ const visible = await researchBtn.isVisible().catch(() => false);
73
+ if (visible) {
74
+ await researchBtn.click();
75
+ await page.waitForTimeout(1000);
76
+ }
77
+ },
78
+ progressSelector: '[data-message-author-role="assistant"]',
79
+ async getProgress(page) {
80
+ const lastTurn = page.locator('[data-message-author-role="assistant"]').last();
81
+ const text = (await lastTurn.textContent().catch(() => ''))?.trim() ?? '';
82
+ // Extract just the progress part (first few lines)
83
+ return text.split('\n').slice(0, 3).join(' ').slice(0, 200);
84
+ },
85
+ async isResearching(page) {
86
+ const stopBtn = page.locator('button[aria-label="Stop streaming"]').first();
87
+ return stopBtn.isVisible().catch(() => false);
88
+ },
89
+ async getReport(page) {
90
+ const lastTurn = page.locator('[data-message-author-role="assistant"]').last();
91
+ return (await lastTurn.textContent().catch(() => ''))?.trim() ?? '';
92
+ },
93
+ async getReportHtml(page) {
94
+ const lastTurn = page.locator('[data-message-author-role="assistant"]').last();
95
+ return (await lastTurn.innerHTML().catch(() => '')) ?? '';
96
+ },
97
+ };
98
+ const perplexityResearch = {
99
+ async activateResearch(page) {
100
+ // Perplexity: toggle "Pro Search" or "Deep Research" if available
101
+ const proBtn = page
102
+ .locator('button:has-text("Pro"), button:has-text("Deep"), [aria-label*="Pro Search"]')
103
+ .first();
104
+ const visible = await proBtn.isVisible().catch(() => false);
105
+ if (visible) {
106
+ await proBtn.click();
107
+ await page.waitForTimeout(500);
108
+ }
109
+ },
110
+ progressSelector: '.prose',
111
+ async getProgress(page) {
112
+ const prose = page.locator('.prose').first();
113
+ const text = (await prose.textContent().catch(() => ''))?.trim() ?? '';
114
+ return text.slice(0, 200);
115
+ },
116
+ async isResearching(page) {
117
+ // Perplexity shows a pulsing indicator or "Searching..." text while working
118
+ const searching = await page
119
+ .locator('[class*="searching"], [class*="loading"], [class*="animate-pulse"]')
120
+ .first()
121
+ .isVisible()
122
+ .catch(() => false);
123
+ return searching;
124
+ },
125
+ async getReport(page) {
126
+ const prose = page.locator('.prose').first();
127
+ return (await prose.textContent().catch(() => ''))?.trim() ?? '';
128
+ },
129
+ async getReportHtml(page) {
130
+ const prose = page.locator('.prose').first();
131
+ return (await prose.innerHTML().catch(() => '')) ?? '';
132
+ },
133
+ };
134
+ const RESEARCH_CONFIGS = {
135
+ gemini: geminiResearch,
136
+ chatgpt: chatgptResearch,
137
+ perplexity: perplexityResearch,
138
+ };
139
+ /**
140
+ * Run a deep research session:
141
+ * 1. Launch browser → navigate to provider
142
+ * 2. Activate deep research mode
143
+ * 3. Submit the research query
144
+ * 4. Poll for progress (non-blocking style with status updates)
145
+ * 5. Wait for completion
146
+ * 6. Extract and save the report
147
+ */
148
+ export async function runResearch(options) {
149
+ const config = await loadConfig();
150
+ const providerName = options.provider ?? 'gemini';
151
+ const provider = getProvider(providerName);
152
+ const researchConfig = RESEARCH_CONFIGS[providerName];
153
+ if (!researchConfig) {
154
+ throw new Error(`Provider "${providerName}" does not support deep research. Use: gemini, chatgpt, perplexity`);
155
+ }
156
+ const timeoutMs = options.timeoutMs ?? 600_000; // 10 minutes default
157
+ const pollIntervalMs = options.pollIntervalMs ?? 5_000;
158
+ const headless = resolveHeadlessMode(providerName, config.headless, options.headed === true);
159
+ const profileMode = options.isolatedProfile ? 'isolated' : config.profileMode;
160
+ // Create session
161
+ const session = await createSession(providerName, options.prompt);
162
+ await saveBundle(session.id, options.prompt);
163
+ console.log(chalk.dim(`Session: ${session.id}`));
164
+ console.log(chalk.blue(`Provider: ${provider.config.displayName}`));
165
+ console.log(chalk.dim(`Timeout: ${Math.round(timeoutMs / 1000)}s`));
166
+ console.log(chalk.dim(`Poll interval: ${Math.round(pollIntervalMs / 1000)}s\n`));
167
+ let browser;
168
+ try {
169
+ await updateSession(session.id, { status: 'running' });
170
+ browser = await launchBrowser({
171
+ provider: providerName,
172
+ headless,
173
+ url: provider.config.url,
174
+ profileMode,
175
+ });
176
+ }
177
+ catch (error) {
178
+ await updateSession(session.id, { status: 'failed' });
179
+ throw error;
180
+ }
181
+ const startTime = Date.now();
182
+ try {
183
+ // Check login
184
+ const loggedIn = await provider.actions.isLoggedIn(browser.page);
185
+ if (!loggedIn) {
186
+ throw new Error(`Not logged in to ${provider.config.displayName}. Run: 10x-chat login ${providerName}`);
187
+ }
188
+ // Step 1: Activate deep research mode
189
+ console.log(chalk.dim('Activating deep research mode...'));
190
+ await researchConfig.activateResearch(browser.page);
191
+ // Step 2: Submit the research query
192
+ console.log(chalk.dim('Submitting research query...'));
193
+ await provider.actions.submitPrompt(browser.page, options.prompt);
194
+ // Step 3: Poll for progress with non-blocking status updates
195
+ console.log(chalk.dim('Research in progress...\n'));
196
+ let lastProgress = '';
197
+ let stableCount = 0;
198
+ const stableThreshold = 3;
199
+ while (Date.now() - startTime < timeoutMs) {
200
+ const researching = await researchConfig.isResearching(browser.page);
201
+ const progress = await researchConfig.getProgress(browser.page);
202
+ // Show progress updates
203
+ if (progress && progress !== lastProgress) {
204
+ const elapsed = Math.round((Date.now() - startTime) / 1000);
205
+ const preview = progress.length > 120 ? `${progress.slice(0, 120)}...` : progress;
206
+ console.log(chalk.dim(` [${elapsed}s] ${preview}`));
207
+ lastProgress = progress;
208
+ stableCount = 0;
209
+ }
210
+ else if (!researching) {
211
+ stableCount++;
212
+ if (stableCount >= stableThreshold && lastProgress.length > 0) {
213
+ console.log(chalk.green('\n✓ Research complete'));
214
+ break;
215
+ }
216
+ }
217
+ await browser.page.waitForTimeout(pollIntervalMs);
218
+ }
219
+ // Step 4: Extract the final report
220
+ const report = await researchConfig.getReport(browser.page);
221
+ const truncated = Date.now() - startTime >= timeoutMs && stableCount < stableThreshold;
222
+ // Save response
223
+ await saveResponse(session.id, report);
224
+ // Save report to file if requested
225
+ let savedPath;
226
+ if (options.saveDir || report.length > 0) {
227
+ const saveDir = options.saveDir ?? path.join(os.homedir(), '.10x-chat', 'sessions', session.id);
228
+ await mkdir(saveDir, { recursive: true });
229
+ const filename = `research-${providerName}-${new Date().toISOString().slice(0, 10)}.md`;
230
+ savedPath = path.join(saveDir, filename);
231
+ await writeFile(savedPath, report);
232
+ }
233
+ const durationMs = Date.now() - startTime;
234
+ await updateSession(session.id, {
235
+ status: truncated ? 'timeout' : 'completed',
236
+ durationMs,
237
+ });
238
+ return {
239
+ sessionId: session.id,
240
+ provider: providerName,
241
+ report,
242
+ truncated,
243
+ durationMs,
244
+ savedPath,
245
+ };
246
+ }
247
+ catch (error) {
248
+ const durationMs = Date.now() - startTime;
249
+ const isTimeout = error instanceof Error && error.message.toLowerCase().includes('timeout');
250
+ await updateSession(session.id, {
251
+ status: isTimeout ? 'timeout' : 'failed',
252
+ durationMs,
253
+ });
254
+ throw error;
255
+ }
256
+ finally {
257
+ await browser.close();
258
+ }
259
+ }
260
+ //# sourceMappingURL=research-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-orchestrator.js","sourceRoot":"","sources":["../../src/core/research-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAsB7F,MAAM,cAAc,GAA2B;IAC7C,KAAK,CAAC,gBAAgB,CAAC,IAAU;QAC/B,8DAA8D;QAC9D,gEAAgE;QAChE,MAAM,eAAe,GAAG,IAAI;aACzB,OAAO,CACN,8FAA8F,CAC/F;aACA,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACrE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,yEAAyE;IAC3E,CAAC;IACD,gBAAgB,EAAE,6EAA6E;IAC/F,KAAK,CAAC,WAAW,CAAC,IAAU;QAC1B,MAAM,EAAE,GAAG,IAAI;aACZ,OAAO,CAAC,6EAA6E,CAAC;aACtF,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,IAAU;QAC5B,uCAAuC;QACvC,MAAM,UAAU,GAAG;YACjB,oBAAoB;YACpB,qBAAqB;YACrB,sCAAsC;YACtC,6BAA6B;YAC7B,mCAAmC;YACnC,oCAAoC;SACrC,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,IAAI;iBACvB,OAAO,CAAC,GAAG,CAAC;iBACZ,KAAK,EAAE;iBACP,SAAS,EAAE;iBACX,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,OAAO;gBAAE,OAAO,IAAI,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,IAAU;QACxB,MAAM,YAAY,GAAG,IAAI;aACtB,OAAO,CAAC,qEAAqE,CAAC;aAC9E,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,IAAU;QAC5B,MAAM,YAAY,GAAG,IAAI;aACtB,OAAO,CAAC,qEAAqE,CAAC;aAC9E,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;CACF,CAAC;AAEF,MAAM,eAAe,GAA2B;IAC9C,KAAK,CAAC,gBAAgB,CAAC,IAAU;QAC/B,8EAA8E;QAC9E,0DAA0D;QAC1D,MAAM,WAAW,GAAG,IAAI;aACrB,OAAO,CACN,0FAA0F,CAC3F;aACA,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,gBAAgB,EAAE,wCAAwC;IAC1D,KAAK,CAAC,WAAW,CAAC,IAAU;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC1E,mDAAmD;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,IAAU;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC5E,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,IAAU;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtE,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,IAAU;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAA2B;IACjD,KAAK,CAAC,gBAAgB,CAAC,IAAU;QAC/B,kEAAkE;QAClE,MAAM,MAAM,GAAG,IAAI;aAChB,OAAO,CAAC,6EAA6E,CAAC;aACtF,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,gBAAgB,EAAE,QAAQ;IAC1B,KAAK,CAAC,WAAW,CAAC,IAAU;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,IAAU;QAC5B,4EAA4E;QAC5E,MAAM,SAAS,GAAG,MAAM,IAAI;aACzB,OAAO,CAAC,oEAAoE,CAAC;aAC7E,KAAK,EAAE;aACP,SAAS,EAAE;aACX,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,IAAU;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,IAAU;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;CACF,CAAC;AAEF,MAAM,gBAAgB,GAA0D;IAC9E,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;IACxB,UAAU,EAAE,kBAAkB;CAC/B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAwB;IACxD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAClD,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAEtD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,oEAAoE,CAC9F,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,qBAAqB;IACrE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC;IACvD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAC7F,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;IAE9E,iBAAiB;IACjB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEjF,IAAI,OAAkD,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,OAAO,GAAG,MAAM,aAAa,CAAC;YAC5B,QAAQ,EAAE,YAAY;YACtB,QAAQ;YACR,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG;YACxB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,cAAc;QACd,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,oBAAoB,QAAQ,CAAC,MAAM,CAAC,WAAW,yBAAyB,YAAY,EAAE,CACvF,CAAC;QACJ,CAAC;QAED,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC3D,MAAM,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEpD,oCAAoC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACvD,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAElE,6DAA6D;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACpD,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,eAAe,GAAG,CAAC,CAAC;QAE1B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEhE,wBAAwB;YACxB,IAAI,QAAQ,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,OAAO,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;gBACrD,YAAY,GAAG,QAAQ,CAAC;gBACxB,WAAW,GAAG,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxB,WAAW,EAAE,CAAC;gBACd,IAAI,WAAW,IAAI,eAAe,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;oBAClD,MAAM;gBACR,CAAC;YACH,CAAC;YAED,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC;QAED,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,SAAS,IAAI,WAAW,GAAG,eAAe,CAAC;QAEvF,gBAAgB;QAChB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEvC,mCAAmC;QACnC,IAAI,SAA6B,CAAC;QAClC,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YAClF,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,YAAY,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;YACxF,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACzC,MAAM,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;YAC9B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;YAC3C,UAAU;SACX,CAAC,CAAC;QAEH,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,YAAY;YACtB,MAAM;YACN,SAAS;YACT,UAAU;YACV,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC5F,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;YAC9B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YACxC,UAAU;SACX,CAAC,CAAC;QACH,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
package/dist/types.d.ts CHANGED
@@ -103,6 +103,39 @@ export interface ChatOptions {
103
103
  /** Override to use isolated (per-provider) profiles regardless of config. */
104
104
  isolatedProfile?: boolean;
105
105
  }
106
+ export interface ResearchOptions {
107
+ prompt: string;
108
+ provider?: ProviderName;
109
+ headed?: boolean;
110
+ timeoutMs?: number;
111
+ pollIntervalMs?: number;
112
+ saveDir?: string;
113
+ isolatedProfile?: boolean;
114
+ }
115
+ export interface ResearchResult {
116
+ sessionId: string;
117
+ provider: ProviderName;
118
+ report: string;
119
+ truncated: boolean;
120
+ durationMs: number;
121
+ savedPath?: string;
122
+ }
123
+ export interface ImageGenOptions {
124
+ prompt: string;
125
+ provider?: ProviderName;
126
+ headed?: boolean;
127
+ timeoutMs?: number;
128
+ saveDir?: string;
129
+ isolatedProfile?: boolean;
130
+ }
131
+ export interface ImageGenResult {
132
+ sessionId: string;
133
+ provider: ProviderName;
134
+ images: GeneratedImage[];
135
+ text: string;
136
+ truncated: boolean;
137
+ durationMs: number;
138
+ }
106
139
  export type VideoMode = 'ingredients' | 'frames';
107
140
  export type VideoModel = 'Veo 3.1 - Fast' | 'Veo 3.1 - Fast [Lower Priority]' | 'Veo 3.1 - Quality' | 'Veo 2 - Fast' | 'Veo 2 - Quality';
108
141
  export type VideoOrientation = 'landscape' | 'portrait';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "10x-chat",
3
- "version": "0.7.3",
3
+ "version": "0.8.0",
4
4
  "description": "CLI to chat with web AI agents (ChatGPT, Gemini, Claude) via browser automation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",