10x-chat 0.1.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 (95) hide show
  1. package/README.md +168 -0
  2. package/dist/bin/cli.d.ts +3 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +24 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/browser/index.d.ts +3 -0
  7. package/dist/browser/index.d.ts.map +1 -0
  8. package/dist/browser/index.js +3 -0
  9. package/dist/browser/index.js.map +1 -0
  10. package/dist/browser/lock.d.ts +14 -0
  11. package/dist/browser/lock.d.ts.map +1 -0
  12. package/dist/browser/lock.js +89 -0
  13. package/dist/browser/lock.js.map +1 -0
  14. package/dist/browser/manager.d.ts +21 -0
  15. package/dist/browser/manager.d.ts.map +1 -0
  16. package/dist/browser/manager.js +46 -0
  17. package/dist/browser/manager.js.map +1 -0
  18. package/dist/cli/chat.d.ts +3 -0
  19. package/dist/cli/chat.d.ts.map +1 -0
  20. package/dist/cli/chat.js +74 -0
  21. package/dist/cli/chat.js.map +1 -0
  22. package/dist/cli/config.d.ts +3 -0
  23. package/dist/cli/config.d.ts.map +1 -0
  24. package/dist/cli/config.js +49 -0
  25. package/dist/cli/config.js.map +1 -0
  26. package/dist/cli/login.d.ts +3 -0
  27. package/dist/cli/login.d.ts.map +1 -0
  28. package/dist/cli/login.js +89 -0
  29. package/dist/cli/login.js.map +1 -0
  30. package/dist/cli/skill.d.ts +3 -0
  31. package/dist/cli/skill.d.ts.map +1 -0
  32. package/dist/cli/skill.js +51 -0
  33. package/dist/cli/skill.js.map +1 -0
  34. package/dist/cli/status.d.ts +4 -0
  35. package/dist/cli/status.d.ts.map +1 -0
  36. package/dist/cli/status.js +73 -0
  37. package/dist/cli/status.js.map +1 -0
  38. package/dist/config.d.ts +6 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/config.js +25 -0
  41. package/dist/config.js.map +1 -0
  42. package/dist/core/bundle.d.ts +12 -0
  43. package/dist/core/bundle.d.ts.map +1 -0
  44. package/dist/core/bundle.js +77 -0
  45. package/dist/core/bundle.js.map +1 -0
  46. package/dist/core/index.d.ts +3 -0
  47. package/dist/core/index.d.ts.map +1 -0
  48. package/dist/core/index.js +3 -0
  49. package/dist/core/index.js.map +1 -0
  50. package/dist/core/orchestrator.d.ts +18 -0
  51. package/dist/core/orchestrator.d.ts.map +1 -0
  52. package/dist/core/orchestrator.js +90 -0
  53. package/dist/core/orchestrator.js.map +1 -0
  54. package/dist/index.d.ts +7 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +6 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/paths.d.ts +11 -0
  59. package/dist/paths.d.ts.map +1 -0
  60. package/dist/paths.js +24 -0
  61. package/dist/paths.js.map +1 -0
  62. package/dist/providers/chatgpt.d.ts +4 -0
  63. package/dist/providers/chatgpt.d.ts.map +1 -0
  64. package/dist/providers/chatgpt.js +107 -0
  65. package/dist/providers/chatgpt.js.map +1 -0
  66. package/dist/providers/claude.d.ts +4 -0
  67. package/dist/providers/claude.d.ts.map +1 -0
  68. package/dist/providers/claude.js +89 -0
  69. package/dist/providers/claude.js.map +1 -0
  70. package/dist/providers/gemini.d.ts +4 -0
  71. package/dist/providers/gemini.d.ts.map +1 -0
  72. package/dist/providers/gemini.js +89 -0
  73. package/dist/providers/gemini.js.map +1 -0
  74. package/dist/providers/index.d.ts +5 -0
  75. package/dist/providers/index.d.ts.map +1 -0
  76. package/dist/providers/index.js +5 -0
  77. package/dist/providers/index.js.map +1 -0
  78. package/dist/providers/registry.d.ts +8 -0
  79. package/dist/providers/registry.d.ts.map +1 -0
  80. package/dist/providers/registry.js +26 -0
  81. package/dist/providers/registry.js.map +1 -0
  82. package/dist/session/index.d.ts +2 -0
  83. package/dist/session/index.d.ts.map +1 -0
  84. package/dist/session/index.js +2 -0
  85. package/dist/session/index.js.map +1 -0
  86. package/dist/session/store.d.ts +16 -0
  87. package/dist/session/store.d.ts.map +1 -0
  88. package/dist/session/store.js +95 -0
  89. package/dist/session/store.js.map +1 -0
  90. package/dist/types.d.ts +70 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +6 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +74 -0
  95. package/skills/10x-chat/SKILL.md +57 -0
@@ -0,0 +1,89 @@
1
+ import chalk from 'chalk';
2
+ import { Command } from 'commander';
3
+ import { launchBrowser } from '../browser/index.js';
4
+ import { getProvider, isValidProvider, listProviders } from '../providers/index.js';
5
+ export function createLoginCommand() {
6
+ const cmd = new Command('login')
7
+ .description('Login to an AI provider (opens browser for authentication)')
8
+ .argument('[provider]', 'Provider to login to (chatgpt, gemini, claude)')
9
+ .option('--all', 'Login to all providers')
10
+ .option('--status', 'Check login status for all providers')
11
+ .action(async (providerArg, options) => {
12
+ if (options?.status) {
13
+ await checkLoginStatus();
14
+ return;
15
+ }
16
+ if (options?.all) {
17
+ for (const name of listProviders()) {
18
+ await loginToProvider(name);
19
+ }
20
+ return;
21
+ }
22
+ if (!providerArg) {
23
+ console.log(chalk.yellow('Usage: 10x-chat login <provider>'));
24
+ console.log(chalk.dim(`Available providers: ${listProviders().join(', ')}`));
25
+ return;
26
+ }
27
+ if (!isValidProvider(providerArg)) {
28
+ console.log(chalk.red(`Unknown provider: ${providerArg}`));
29
+ console.log(chalk.dim(`Available: ${listProviders().join(', ')}`));
30
+ process.exit(1);
31
+ }
32
+ await loginToProvider(providerArg);
33
+ });
34
+ return cmd;
35
+ }
36
+ async function loginToProvider(providerName) {
37
+ const provider = getProvider(providerName);
38
+ console.log(chalk.blue(`Opening ${provider.config.displayName} for login...`));
39
+ console.log(chalk.dim('Please login in the browser window. The session will be saved.'));
40
+ const browser = await launchBrowser({
41
+ provider: providerName,
42
+ headless: false, // Always headed for login
43
+ url: provider.config.loginUrl,
44
+ });
45
+ try {
46
+ // Wait for the user to login — poll until logged in or timeout
47
+ const timeoutMs = 5 * 60 * 1000; // 5 minutes to login
48
+ const startTime = Date.now();
49
+ while (Date.now() - startTime < timeoutMs) {
50
+ const loggedIn = await provider.actions.isLoggedIn(browser.page);
51
+ if (loggedIn) {
52
+ console.log(chalk.green(`✓ Logged in to ${provider.config.displayName}`));
53
+ return;
54
+ }
55
+ await browser.page.waitForTimeout(2000);
56
+ }
57
+ console.log(chalk.yellow('Login timed out. You can try again.'));
58
+ }
59
+ finally {
60
+ await browser.close();
61
+ }
62
+ }
63
+ async function checkLoginStatus() {
64
+ console.log(chalk.bold('Login Status\n'));
65
+ for (const name of listProviders()) {
66
+ const provider = getProvider(name);
67
+ try {
68
+ const browser = await launchBrowser({
69
+ provider: name,
70
+ headless: true,
71
+ url: provider.config.url,
72
+ });
73
+ try {
74
+ // Give the page a moment to load
75
+ await browser.page.waitForTimeout(3000);
76
+ const loggedIn = await provider.actions.isLoggedIn(browser.page);
77
+ const status = loggedIn ? chalk.green('✓ logged in') : chalk.red('✗ not logged in');
78
+ console.log(` ${provider.config.displayName}: ${status}`);
79
+ }
80
+ finally {
81
+ await browser.close();
82
+ }
83
+ }
84
+ catch {
85
+ console.log(` ${provider.config.displayName}: ${chalk.dim('unable to check')}`);
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/cli/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createSkillCommand(): Command;
3
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/cli/skill.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,kBAAkB,IAAI,OAAO,CAqC5C"}
@@ -0,0 +1,51 @@
1
+ import { cp, mkdir, readFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import chalk from 'chalk';
6
+ import { Command } from 'commander';
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ function getSkillSourceDir() {
9
+ // Navigate from src/cli/ or dist/cli/ up to project root, then into skills/
10
+ return path.resolve(__dirname, '..', '..', 'skills', '10x-chat');
11
+ }
12
+ function getSkillTargetDir() {
13
+ return path.join(os.homedir(), '.codex', 'skills', '10x-chat');
14
+ }
15
+ export function createSkillCommand() {
16
+ const cmd = new Command('skill').description('Manage the 10x-chat agent skill');
17
+ cmd
18
+ .command('install')
19
+ .description('Install SKILL.md into the agent skills directory')
20
+ .action(async () => {
21
+ const sourceDir = getSkillSourceDir();
22
+ const targetDir = getSkillTargetDir();
23
+ try {
24
+ await mkdir(targetDir, { recursive: true });
25
+ await cp(sourceDir, targetDir, { recursive: true, force: true });
26
+ console.log(chalk.green(`✓ Skill installed to ${targetDir}`));
27
+ }
28
+ catch (error) {
29
+ const message = error instanceof Error ? error.message : String(error);
30
+ console.error(chalk.red(`Failed to install skill: ${message}`));
31
+ process.exit(1);
32
+ }
33
+ });
34
+ cmd
35
+ .command('show')
36
+ .description('Display the SKILL.md content')
37
+ .action(async () => {
38
+ const sourceDir = getSkillSourceDir();
39
+ const skillPath = path.join(sourceDir, 'SKILL.md');
40
+ try {
41
+ const content = await readFile(skillPath, 'utf-8');
42
+ console.log(content);
43
+ }
44
+ catch {
45
+ console.error(chalk.red('SKILL.md not found. Is the package installed correctly?'));
46
+ process.exit(1);
47
+ }
48
+ });
49
+ return cmd;
50
+ }
51
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/cli/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,SAAS,iBAAiB;IACxB,4EAA4E;IAC5E,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAC;IAEhF,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function createStatusCommand(): Command;
3
+ export declare function createSessionCommand(): Command;
4
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,mBAAmB,IAAI,OAAO,CAqC7C;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAmC9C"}
@@ -0,0 +1,73 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import chalk from 'chalk';
3
+ import { Command } from 'commander';
4
+ import { getSession, listSessions } from '../session/index.js';
5
+ export function createStatusCommand() {
6
+ return new Command('status')
7
+ .description('List recent chat sessions')
8
+ .option('--hours <n>', 'Show sessions from last N hours', '24')
9
+ .action(async (options) => {
10
+ const hours = Number.parseInt(options.hours, 10);
11
+ const sessions = await listSessions({ hours });
12
+ if (sessions.length === 0) {
13
+ console.log(chalk.dim(`No sessions in the last ${hours} hours.`));
14
+ return;
15
+ }
16
+ console.log(chalk.bold(`Sessions (last ${hours}h)\n`));
17
+ for (const session of sessions) {
18
+ const statusIcon = {
19
+ pending: '⏳',
20
+ running: '🔄',
21
+ completed: '✅',
22
+ failed: '❌',
23
+ timeout: '⏰',
24
+ }[session.status];
25
+ const duration = session.durationMs
26
+ ? chalk.dim(` (${Math.round(session.durationMs / 1000)}s)`)
27
+ : '';
28
+ console.log(` ${statusIcon} ${chalk.cyan(session.id.slice(0, 8))} ` +
29
+ `${chalk.bold(session.provider)} ${duration}`);
30
+ console.log(` ${chalk.dim(session.promptPreview.slice(0, 80))}`);
31
+ console.log(` ${chalk.dim(new Date(session.createdAt).toLocaleString())}`);
32
+ console.log('');
33
+ }
34
+ });
35
+ }
36
+ export function createSessionCommand() {
37
+ return new Command('session')
38
+ .description('View details of a specific session')
39
+ .argument('<id>', 'Session ID (or prefix)')
40
+ .option('--render', 'Pretty-print the response')
41
+ .action(async (id, options) => {
42
+ try {
43
+ const result = await getSession(id);
44
+ const meta = result.meta;
45
+ console.log(chalk.bold('Session Details\n'));
46
+ console.log(` ID: ${meta.id}`);
47
+ console.log(` Provider: ${meta.provider}`);
48
+ console.log(` Model: ${meta.model ?? chalk.dim('(default)')}`);
49
+ console.log(` Status: ${meta.status}`);
50
+ console.log(` Created: ${new Date(meta.createdAt).toLocaleString()}`);
51
+ if (meta.durationMs) {
52
+ console.log(` Duration: ${Math.round(meta.durationMs / 1000)}s`);
53
+ }
54
+ console.log('');
55
+ if (options.render && result.responsePath) {
56
+ const response = await readFile(result.responsePath, 'utf-8');
57
+ console.log(chalk.bold('--- Response ---\n'));
58
+ console.log(response);
59
+ }
60
+ else if (result.responsePath) {
61
+ console.log(chalk.dim(`Response saved at: ${result.responsePath}`));
62
+ }
63
+ else {
64
+ console.log(chalk.dim('No response captured yet.'));
65
+ }
66
+ }
67
+ catch {
68
+ console.error(chalk.red(`Session not found: ${id}`));
69
+ process.exit(1);
70
+ }
71
+ });
72
+ }
73
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type AppConfig } from './types.js';
2
+ /** Load config from disk, falling back to defaults for missing keys. */
3
+ export declare function loadConfig(): Promise<AppConfig>;
4
+ /** Save config to disk. */
5
+ export declare function saveConfig(config: AppConfig): Promise<void>;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,YAAY,CAAC;AAE5D,wEAAwE;AACxE,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAWrD;AAED,2BAA2B;AAC3B,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjE"}
package/dist/config.js ADDED
@@ -0,0 +1,25 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { getConfigPath } from './paths.js';
4
+ import { DEFAULT_CONFIG } from './types.js';
5
+ /** Load config from disk, falling back to defaults for missing keys. */
6
+ export async function loadConfig() {
7
+ const configPath = getConfigPath();
8
+ try {
9
+ const raw = await readFile(configPath, 'utf-8');
10
+ // Dynamic import JSON5 only when needed
11
+ const JSON5 = await import('json5');
12
+ const parsed = JSON5.parse(raw);
13
+ return { ...DEFAULT_CONFIG, ...parsed };
14
+ }
15
+ catch {
16
+ return { ...DEFAULT_CONFIG };
17
+ }
18
+ }
19
+ /** Save config to disk. */
20
+ export async function saveConfig(config) {
21
+ const configPath = getConfigPath();
22
+ await mkdir(path.dirname(configPath), { recursive: true });
23
+ await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');
24
+ }
25
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChD,wCAAwC;QACxC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACtD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAiB;IAChD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,12 @@
1
+ interface BundleOptions {
2
+ prompt: string;
3
+ files?: string[];
4
+ cwd?: string;
5
+ }
6
+ /**
7
+ * Assemble a markdown bundle from a prompt and file paths/globs.
8
+ * Inspired by Oracle's bundle approach — one self-contained markdown document.
9
+ */
10
+ export declare function buildBundle(opts: BundleOptions): Promise<string>;
11
+ export {};
12
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/core/bundle.ts"],"names":[],"mappings":"AAyBA,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA2DtE"}
@@ -0,0 +1,77 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import fg from 'fast-glob';
4
+ const DEFAULT_EXCLUDES = [
5
+ 'node_modules/**',
6
+ 'dist/**',
7
+ 'build/**',
8
+ '.git/**',
9
+ '.next/**',
10
+ 'coverage/**',
11
+ '*.tgz',
12
+ '.DS_Store',
13
+ // Security: never bundle secrets
14
+ '.env*',
15
+ '*.pem',
16
+ '*.key',
17
+ '**/id_rsa',
18
+ '**/id_ed25519',
19
+ '**/.credentials/**',
20
+ '**/secrets/**',
21
+ ];
22
+ const MAX_FILE_SIZE = 1024 * 1024; // 1 MB
23
+ /**
24
+ * Assemble a markdown bundle from a prompt and file paths/globs.
25
+ * Inspired by Oracle's bundle approach — one self-contained markdown document.
26
+ */
27
+ export async function buildBundle(opts) {
28
+ const { prompt, files = [], cwd = process.cwd() } = opts;
29
+ const parts = [];
30
+ // Header
31
+ parts.push('# Prompt\n');
32
+ parts.push(prompt);
33
+ parts.push('');
34
+ if (files.length === 0) {
35
+ return parts.join('\n');
36
+ }
37
+ // Resolve file globs
38
+ const includes = [];
39
+ const excludes = [...DEFAULT_EXCLUDES];
40
+ for (const pattern of files) {
41
+ if (pattern.startsWith('!')) {
42
+ excludes.push(pattern.slice(1));
43
+ }
44
+ else {
45
+ includes.push(pattern);
46
+ }
47
+ }
48
+ const resolvedFiles = await fg(includes, {
49
+ cwd,
50
+ ignore: excludes,
51
+ absolute: true,
52
+ followSymbolicLinks: false,
53
+ onlyFiles: true,
54
+ dot: false,
55
+ });
56
+ if (resolvedFiles.length === 0) {
57
+ parts.push('> No files matched the provided patterns.\n');
58
+ return parts.join('\n');
59
+ }
60
+ parts.push(`# Context Files (${resolvedFiles.length})\n`);
61
+ for (const filePath of resolvedFiles.sort()) {
62
+ const fileStat = await stat(filePath);
63
+ if (fileStat.size > MAX_FILE_SIZE) {
64
+ parts.push(`## ${path.relative(cwd, filePath)} (SKIPPED — exceeds 1 MB)\n`);
65
+ continue;
66
+ }
67
+ const content = await readFile(filePath, 'utf-8');
68
+ const ext = path.extname(filePath).slice(1) || 'txt';
69
+ const relativePath = path.relative(cwd, filePath);
70
+ parts.push(`## ${relativePath}\n`);
71
+ parts.push(`\`\`\`${ext}`);
72
+ parts.push(content);
73
+ parts.push('```\n');
74
+ }
75
+ return parts.join('\n');
76
+ }
77
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/core/bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { buildBundle } from './bundle.js';
2
+ export { type ChatResult, runChat } from './orchestrator.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { buildBundle } from './bundle.js';
2
+ export { runChat } from './orchestrator.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAmB,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ChatOptions, ProviderName } from '../types.js';
2
+ export interface ChatResult {
3
+ sessionId: string;
4
+ provider: ProviderName;
5
+ response: string;
6
+ truncated: boolean;
7
+ durationMs: number;
8
+ }
9
+ /**
10
+ * Execute a chat interaction with a provider:
11
+ * 1. Build the prompt bundle
12
+ * 2. Launch the browser
13
+ * 3. Submit the prompt
14
+ * 4. Capture the response
15
+ * 5. Save session
16
+ */
17
+ export declare function runChat(options: ChatOptions): Promise<ChatResult>;
18
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAoFvE"}
@@ -0,0 +1,90 @@
1
+ import chalk from 'chalk';
2
+ import { launchBrowser } from '../browser/index.js';
3
+ import { loadConfig } from '../config.js';
4
+ import { getProvider } from '../providers/index.js';
5
+ import { createSession, saveBundle, saveResponse, updateSession } from '../session/index.js';
6
+ import { buildBundle } from './bundle.js';
7
+ /**
8
+ * Execute a chat interaction with a provider:
9
+ * 1. Build the prompt bundle
10
+ * 2. Launch the browser
11
+ * 3. Submit the prompt
12
+ * 4. Capture the response
13
+ * 5. Save session
14
+ */
15
+ export async function runChat(options) {
16
+ const config = await loadConfig();
17
+ const providerName = options.provider ?? config.defaultProvider;
18
+ const provider = getProvider(providerName);
19
+ const timeoutMs = options.timeoutMs ?? config.defaultTimeoutMs;
20
+ const headless = options.headed === true ? false : config.headless;
21
+ // Build the bundle
22
+ const bundle = await buildBundle({
23
+ prompt: options.prompt,
24
+ files: options.file,
25
+ });
26
+ // Create session
27
+ const session = await createSession(providerName, options.prompt, options.model);
28
+ await saveBundle(session.id, bundle);
29
+ console.log(chalk.dim(`Session: ${session.id}`));
30
+ console.log(chalk.blue(`Provider: ${provider.config.displayName}`));
31
+ // Launch browser — if this fails, mark session as failed
32
+ let browser;
33
+ try {
34
+ await updateSession(session.id, { status: 'running' });
35
+ browser = await launchBrowser({
36
+ provider: providerName,
37
+ headless,
38
+ url: provider.config.url,
39
+ });
40
+ }
41
+ catch (error) {
42
+ await updateSession(session.id, { status: 'failed' });
43
+ throw error;
44
+ }
45
+ const startTime = Date.now();
46
+ try {
47
+ // Check login
48
+ const loggedIn = await provider.actions.isLoggedIn(browser.page);
49
+ if (!loggedIn) {
50
+ throw new Error(`Not logged in to ${provider.config.displayName}. Run: 10x-chat login ${providerName}`);
51
+ }
52
+ // Submit prompt
53
+ console.log(chalk.dim('Submitting prompt...'));
54
+ await provider.actions.submitPrompt(browser.page, bundle);
55
+ // Capture response
56
+ console.log(chalk.dim('Waiting for response...'));
57
+ const captured = await provider.actions.captureResponse(browser.page, {
58
+ timeoutMs,
59
+ onChunk: (chunk) => process.stdout.write(chalk.dim(chunk)),
60
+ });
61
+ const durationMs = Date.now() - startTime;
62
+ // Save response
63
+ await saveResponse(session.id, captured.text);
64
+ await updateSession(session.id, {
65
+ status: captured.truncated ? 'timeout' : 'completed',
66
+ durationMs,
67
+ });
68
+ return {
69
+ sessionId: session.id,
70
+ provider: providerName,
71
+ response: captured.text,
72
+ truncated: captured.truncated,
73
+ durationMs,
74
+ };
75
+ }
76
+ catch (error) {
77
+ const durationMs = Date.now() - startTime;
78
+ // Distinguish timeout from other failures
79
+ const isTimeout = error instanceof Error && error.message.toLowerCase().includes('timeout');
80
+ await updateSession(session.id, {
81
+ status: isTimeout ? 'timeout' : 'failed',
82
+ durationMs,
83
+ });
84
+ throw error;
85
+ }
86
+ finally {
87
+ await browser.close();
88
+ }
89
+ }
90
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,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;AAE7F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU1C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB;IAChD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,eAAe,CAAC;IAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,gBAAgB,CAAC;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;IAEnE,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,IAAI;KACpB,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACjF,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAErC,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;IAEpE,yDAAyD;IACzD,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;SACzB,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,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC/C,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE1D,mBAAmB;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE;YACpE,SAAS;YACT,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC3D,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE1C,gBAAgB;QAChB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;YAC9B,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;YACpD,UAAU;SACX,CAAC,CAAC;QAEH,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,UAAU;SACX,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,0CAA0C;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"}
@@ -0,0 +1,7 @@
1
+ export { type BrowserSession, launchBrowser } from './browser/index.js';
2
+ export { loadConfig, saveConfig } from './config.js';
3
+ export { buildBundle, type ChatResult, runChat } from './core/index.js';
4
+ export { getProvider, isValidProvider, listProviders } from './providers/index.js';
5
+ export { createSession, getSession, listSessions, } from './session/index.js';
6
+ export type { AppConfig, CapturedResponse, ChatOptions, Provider, ProviderActions, ProviderConfig, ProviderName, SessionMeta, SessionResult, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { launchBrowser } from './browser/index.js';
2
+ export { loadConfig, saveConfig } from './config.js';
3
+ export { buildBundle, runChat } from './core/index.js';
4
+ export { getProvider, isValidProvider, listProviders } from './providers/index.js';
5
+ export { createSession, getSession, listSessions, } from './session/index.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,WAAW,EAAmB,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Root directory for all 10x-chat data: ~/.10x-chat */
2
+ export declare function getAppDir(): string;
3
+ /** Profile directory for a specific provider: ~/.10x-chat/profiles/<provider> */
4
+ export declare function getProfileDir(provider: string): string;
5
+ /** Sessions root: ~/.10x-chat/sessions */
6
+ export declare function getSessionsDir(): string;
7
+ /** Session directory for a specific session: ~/.10x-chat/sessions/<id> */
8
+ export declare function getSessionDir(sessionId: string): string;
9
+ /** Config file path: ~/.10x-chat/config.json */
10
+ export declare function getConfigPath(): string;
11
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA,wDAAwD;AACxD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,0CAA0C;AAC1C,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,gDAAgD;AAChD,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
package/dist/paths.js ADDED
@@ -0,0 +1,24 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ const APP_DIR_NAME = '.10x-chat';
4
+ /** Root directory for all 10x-chat data: ~/.10x-chat */
5
+ export function getAppDir() {
6
+ return process.env.TEN_X_CHAT_HOME ?? path.join(os.homedir(), APP_DIR_NAME);
7
+ }
8
+ /** Profile directory for a specific provider: ~/.10x-chat/profiles/<provider> */
9
+ export function getProfileDir(provider) {
10
+ return path.join(getAppDir(), 'profiles', provider);
11
+ }
12
+ /** Sessions root: ~/.10x-chat/sessions */
13
+ export function getSessionsDir() {
14
+ return path.join(getAppDir(), 'sessions');
15
+ }
16
+ /** Session directory for a specific session: ~/.10x-chat/sessions/<id> */
17
+ export function getSessionDir(sessionId) {
18
+ return path.join(getSessionsDir(), sessionId);
19
+ }
20
+ /** Config file path: ~/.10x-chat/config.json */
21
+ export function getConfigPath() {
22
+ return path.join(getAppDir(), 'config.json');
23
+ }
24
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,YAAY,GAAG,WAAW,CAAC;AAEjC,wDAAwD;AACxD,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAC9E,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ProviderActions, ProviderConfig } from '../types.js';
2
+ export declare const CHATGPT_CONFIG: ProviderConfig;
3
+ export declare const chatgptActions: ProviderActions;
4
+ //# sourceMappingURL=chatgpt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt.d.ts","sourceRoot":"","sources":["../../src/providers/chatgpt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErF,eAAO,MAAM,cAAc,EAAE,cAQ5B,CAAC;AAUF,eAAO,MAAM,cAAc,EAAE,eA8G5B,CAAC"}