codevf 1.0.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 (78) hide show
  1. package/ARCHITECTURE.md +285 -0
  2. package/BUILD_SUMMARY.md +340 -0
  3. package/LICENSE +21 -0
  4. package/QUICKSTART.md +180 -0
  5. package/README.md +104 -0
  6. package/dist/commands/fix.d.ts +2 -0
  7. package/dist/commands/fix.d.ts.map +1 -0
  8. package/dist/commands/fix.js +118 -0
  9. package/dist/commands/fix.js.map +1 -0
  10. package/dist/commands/init.d.ts +2 -0
  11. package/dist/commands/init.d.ts.map +1 -0
  12. package/dist/commands/init.js +270 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/login.d.ts +2 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +62 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/logout.d.ts +2 -0
  19. package/dist/commands/logout.d.ts.map +1 -0
  20. package/dist/commands/logout.js +14 -0
  21. package/dist/commands/logout.js.map +1 -0
  22. package/dist/commands/sync.d.ts +4 -0
  23. package/dist/commands/sync.d.ts.map +1 -0
  24. package/dist/commands/sync.js +93 -0
  25. package/dist/commands/sync.js.map +1 -0
  26. package/dist/commands/tasks.d.ts +2 -0
  27. package/dist/commands/tasks.d.ts.map +1 -0
  28. package/dist/commands/tasks.js +41 -0
  29. package/dist/commands/tasks.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +248 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/modules/api.d.ts +36 -0
  35. package/dist/modules/api.d.ts.map +1 -0
  36. package/dist/modules/api.js +107 -0
  37. package/dist/modules/api.js.map +1 -0
  38. package/dist/modules/auth.d.ts +13 -0
  39. package/dist/modules/auth.d.ts.map +1 -0
  40. package/dist/modules/auth.js +80 -0
  41. package/dist/modules/auth.js.map +1 -0
  42. package/dist/modules/config.d.ts +17 -0
  43. package/dist/modules/config.d.ts.map +1 -0
  44. package/dist/modules/config.js +76 -0
  45. package/dist/modules/config.js.map +1 -0
  46. package/dist/modules/git.d.ts +13 -0
  47. package/dist/modules/git.d.ts.map +1 -0
  48. package/dist/modules/git.js +78 -0
  49. package/dist/modules/git.js.map +1 -0
  50. package/dist/modules/permissions.d.ts +5 -0
  51. package/dist/modules/permissions.d.ts.map +1 -0
  52. package/dist/modules/permissions.js +42 -0
  53. package/dist/modules/permissions.js.map +1 -0
  54. package/dist/modules/websocket.d.ts +17 -0
  55. package/dist/modules/websocket.d.ts.map +1 -0
  56. package/dist/modules/websocket.js +80 -0
  57. package/dist/modules/websocket.js.map +1 -0
  58. package/dist/types/index.d.ts +186 -0
  59. package/dist/types/index.d.ts.map +1 -0
  60. package/dist/types/index.js +40 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/ui/LiveSession.d.ts +13 -0
  63. package/dist/ui/LiveSession.d.ts.map +1 -0
  64. package/dist/ui/LiveSession.js +451 -0
  65. package/dist/ui/LiveSession.js.map +1 -0
  66. package/dist/utils/detect.d.ts +3 -0
  67. package/dist/utils/detect.d.ts.map +1 -0
  68. package/dist/utils/detect.js +78 -0
  69. package/dist/utils/detect.js.map +1 -0
  70. package/dist/utils/errors.d.ts +3 -0
  71. package/dist/utils/errors.d.ts.map +1 -0
  72. package/dist/utils/errors.js +36 -0
  73. package/dist/utils/errors.js.map +1 -0
  74. package/dist/utils/upload.d.ts +3 -0
  75. package/dist/utils/upload.d.ts.map +1 -0
  76. package/dist/utils/upload.js +75 -0
  77. package/dist/utils/upload.js.map +1 -0
  78. package/package.json +76 -0
package/dist/index.js ADDED
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env node
2
+ // Load environment variables from .env before any other modules run
3
+ import 'dotenv/config';
4
+ import yargs from 'yargs';
5
+ import { hideBin } from 'yargs/helpers';
6
+ import chalk from 'chalk';
7
+ import prompts from 'prompts';
8
+ import { exec, spawn } from 'child_process';
9
+ import { promisify } from 'util';
10
+ import { loginCommand } from './commands/login.js';
11
+ import { logoutCommand } from './commands/logout.js';
12
+ import { initCommand } from './commands/init.js';
13
+ import { syncCommand } from './commands/sync.js';
14
+ import { fixCommand } from './commands/fix.js';
15
+ import { tasksCommand } from './commands/tasks.js';
16
+ import { handleError } from './utils/errors.js';
17
+ import { ConfigManager } from './modules/config.js';
18
+ const CLI_VERSION = '1.0.0';
19
+ const execAsync = promisify(exec);
20
+ const args = hideBin(process.argv);
21
+ if (args.length === 0) {
22
+ // Minimal interactive entry (Codex-style): no question, just a prompt
23
+ (async () => {
24
+ try {
25
+ const cwd = process.cwd();
26
+ const configManager = new ConfigManager();
27
+ const isInitialized = configManager.isInitialized();
28
+ const boxInfo = isInitialized
29
+ ? chalk.green(`Initialized project: ${configManager.loadConfig().projectId}`)
30
+ : chalk.yellow('Not initialized (run `codevf init`)');
31
+ // Header box similar to Codex
32
+ const boxLines = [
33
+ `${chalk.dim('>_')} ${chalk.bold.white('CodeVF CLI')} ${chalk.dim(`(v${CLI_VERSION})`)}`,
34
+ `${chalk.dim('model:')} ${chalk.cyan('codevf-live')} ${chalk.dim('/human to ask for help')}`,
35
+ `${chalk.dim('dir:')} ${chalk.cyan(cwd)}`,
36
+ `${chalk.dim('init:')} ${boxInfo}`,
37
+ ];
38
+ const maxLen = Math.max(...boxLines.map((l) => l.length));
39
+ const width = maxLen + 2; // padding inside box
40
+ const border = chalk.dim('┌' + '─'.repeat(width) + '┐');
41
+ const footer = chalk.dim('└' + '─'.repeat(width) + '┘');
42
+ console.log('\n' + border);
43
+ boxLines.forEach((line) => {
44
+ const padLength = width - line.length;
45
+ const padding = padLength > 0 ? ' '.repeat(padLength) : '';
46
+ console.log(chalk.dim('│') + line + padding + chalk.dim('│'));
47
+ });
48
+ console.log(footer + '\n');
49
+ console.log(chalk.dim('To get started, type your issue or one of these commands:\n'));
50
+ const commands = [
51
+ ['/human <text>', 'ask for help from a human engineer'],
52
+ ['/shell', 'switch to local shell (not shared)'],
53
+ ['/codevf', 'return from shell to session'],
54
+ ['/end', 'end the session'],
55
+ ['/tasks', 'list open tasks'],
56
+ ['/cancel <id>', 'cancel a task'],
57
+ ['/?', 'list commands'],
58
+ ['/exit', 'quit the CLI'],
59
+ ];
60
+ commands.forEach(([cmd, desc]) => {
61
+ console.log(`${chalk.white(cmd.padEnd(15))}${chalk.dim('–')} ${chalk.gray(desc)}`);
62
+ });
63
+ console.log();
64
+ while (true) {
65
+ let shellMode = false;
66
+ const shellHistory = [];
67
+ console.log(chalk.dim('Type /? for menu'));
68
+ const { line } = await prompts({
69
+ type: 'text',
70
+ name: 'line',
71
+ message: chalk.bold('codevf> '),
72
+ });
73
+ if (!line || !line.trim()) {
74
+ // empty input: re-prompt instead of exiting
75
+ continue;
76
+ }
77
+ let trimmed = line.trim();
78
+ // Any slash command is handled locally; do not start a session
79
+ if (trimmed.startsWith('/')) {
80
+ if (['/?', '/help', '/commands'].includes(trimmed)) {
81
+ console.log();
82
+ console.log(chalk.white('/human <text>').padEnd(18) + chalk.gray('ask for help from a human engineer'));
83
+ console.log(chalk.white('/shell').padEnd(18) + chalk.gray('local shell (not shared)'));
84
+ console.log(chalk.white('/codevf').padEnd(18) + chalk.gray('back to session'));
85
+ console.log(chalk.white('/end').padEnd(18) + chalk.gray('end the session'));
86
+ console.log(chalk.white('/tasks').padEnd(18) + chalk.gray('list open tasks'));
87
+ console.log(chalk.white('/cancel <id>').padEnd(18) + chalk.gray('cancel a task'));
88
+ console.log(chalk.white('/?').padEnd(18) + chalk.gray('list commands'));
89
+ console.log(chalk.white('/exit').padEnd(18) + chalk.gray('quit'));
90
+ console.log();
91
+ continue;
92
+ }
93
+ else if (trimmed === '/tasks') {
94
+ await tasksCommand(undefined);
95
+ }
96
+ else if (trimmed.startsWith('/cancel ')) {
97
+ const id = trimmed.replace('/cancel', '').trim();
98
+ if (!id) {
99
+ console.log(chalk.red('Usage: /cancel <taskId>'));
100
+ }
101
+ else {
102
+ await tasksCommand(id);
103
+ }
104
+ }
105
+ else if (trimmed === '/exit' || trimmed === '/quit') {
106
+ console.log(chalk.dim('Goodbye.'));
107
+ process.exit(0);
108
+ }
109
+ else if (trimmed === '/shell') {
110
+ shellMode = true;
111
+ console.log(chalk.dim('Entered local shell mode (not shared). Type /resume to go back.'));
112
+ // enter shell loop
113
+ while (shellMode) {
114
+ const { line: shellLine } = await prompts({
115
+ type: 'text',
116
+ name: 'line',
117
+ message: chalk.bold('shell> ') + chalk.dim('(local)'),
118
+ });
119
+ if (!shellLine) {
120
+ continue;
121
+ }
122
+ const shellTrimmed = shellLine.trim();
123
+ if (shellTrimmed === '/resume' || shellTrimmed === '/session' || shellTrimmed === '/codevf') {
124
+ shellMode = false;
125
+ console.log(chalk.dim('Back to CodeVF prompt.'));
126
+ continue;
127
+ }
128
+ if (shellTrimmed === '/exit' || shellTrimmed === '/quit') {
129
+ console.log(chalk.dim('Goodbye.'));
130
+ process.exit(0);
131
+ }
132
+ if (shellTrimmed.startsWith('/')) {
133
+ console.log(chalk.yellow(`Unknown command in shell: ${shellTrimmed}`));
134
+ console.log(chalk.dim('Use /resume to return to the session prompt.'));
135
+ continue;
136
+ }
137
+ try {
138
+ await new Promise((resolve) => {
139
+ const child = spawn(shellTrimmed, {
140
+ shell: true,
141
+ stdio: 'inherit',
142
+ cwd: process.cwd(),
143
+ });
144
+ child.on('exit', () => resolve());
145
+ child.on('error', (err) => {
146
+ console.log(chalk.red(`Command failed: ${err.message}`));
147
+ resolve();
148
+ });
149
+ });
150
+ shellHistory.push(`$ ${shellTrimmed} (ran with stdio:inherit)`);
151
+ }
152
+ catch (error) {
153
+ console.log(chalk.red(`Command failed: ${error.message || error}`));
154
+ }
155
+ }
156
+ }
157
+ else {
158
+ console.log(chalk.yellow(`Unknown command: ${trimmed}`));
159
+ console.log(chalk.dim('Type /? to see available commands.'));
160
+ }
161
+ continue;
162
+ }
163
+ await fixCommand(trimmed);
164
+ // After session ends, return to prompt loop
165
+ }
166
+ }
167
+ catch (error) {
168
+ handleError(error);
169
+ }
170
+ })();
171
+ }
172
+ else {
173
+ yargs(args)
174
+ .scriptName('codevf')
175
+ .version(CLI_VERSION)
176
+ .usage('$0 <command> [options]')
177
+ .command('login', 'Authenticate with CodeVF', () => { }, async () => {
178
+ try {
179
+ await loginCommand();
180
+ }
181
+ catch (error) {
182
+ handleError(error);
183
+ }
184
+ })
185
+ .command('logout', 'Clear local authentication', () => { }, async () => {
186
+ try {
187
+ await logoutCommand();
188
+ }
189
+ catch (error) {
190
+ handleError(error);
191
+ }
192
+ })
193
+ .command('init', 'Initialize CodeVF in your project', () => { }, async () => {
194
+ try {
195
+ await initCommand();
196
+ }
197
+ catch (error) {
198
+ handleError(error);
199
+ }
200
+ })
201
+ .command('sync', 'Sync your local changes with CodeVF', (yargs) => {
202
+ return yargs.option('force', {
203
+ alias: 'f',
204
+ type: 'boolean',
205
+ description: 'Force sync even with uncommitted changes',
206
+ default: false,
207
+ });
208
+ }, async (argv) => {
209
+ try {
210
+ await syncCommand({ force: argv.force });
211
+ }
212
+ catch (error) {
213
+ handleError(error);
214
+ }
215
+ })
216
+ .command('tasks', 'List open tasks (use /cancel <id> inside interactive mode)', () => { }, async () => {
217
+ try {
218
+ await tasksCommand(undefined);
219
+ }
220
+ catch (error) {
221
+ handleError(error);
222
+ }
223
+ })
224
+ .command('fix <issue>', 'Start a live debugging session', (yargs) => {
225
+ return yargs.positional('issue', {
226
+ type: 'string',
227
+ describe: 'Description of the issue to fix (or type commands like /human need help with X)',
228
+ demandOption: true,
229
+ });
230
+ }, async (argv) => {
231
+ try {
232
+ await fixCommand(argv.issue);
233
+ }
234
+ catch (error) {
235
+ handleError(error);
236
+ }
237
+ })
238
+ .demandCommand(1, chalk.yellow('Run a command, e.g., "codevf fix \"need help with X\""'))
239
+ .recommendCommands()
240
+ .strict()
241
+ .help()
242
+ .alias('help', 'h')
243
+ .alias('version', 'v')
244
+ .epilogue(chalk.dim('For more information, visit: https://docs.codevf.com\n' +
245
+ 'Report issues: https://github.com/codevf/cli/issues'))
246
+ .parse();
247
+ }
248
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,oEAAoE;AACpE,OAAO,eAAe,CAAC;AAEvB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtB,sEAAsE;IACtE,CAAC,KAAK,IAAI,EAAE;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;YAC1C,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,aAAa;gBAC3B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,aAAa,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC7E,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC;YAExD,8BAA8B;YAC9B,MAAM,QAAQ,GAAG;gBACf,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,EAAE;gBACxF,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE;gBAC9F,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC5C,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,OAAO,EAAE;aACrC,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,qBAAqB;YAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;YAC3B,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxB,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;gBACtC,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YAE3B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CACzE,CAAC;YACF,MAAM,QAAQ,GAAG;gBACf,CAAC,eAAe,EAAE,oCAAoC,CAAC;gBACvD,CAAC,QAAQ,EAAE,oCAAoC,CAAC;gBAChD,CAAC,SAAS,EAAE,8BAA8B,CAAC;gBAC3C,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAC3B,CAAC,QAAQ,EAAE,iBAAiB,CAAC;gBAC7B,CAAC,cAAc,EAAE,eAAe,CAAC;gBACjC,CAAC,IAAI,EAAE,eAAe,CAAC;gBACvB,CAAC,OAAO,EAAE,cAAc,CAAC;aAC1B,CAAC;YACF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;gBAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,MAAM,YAAY,GAAa,EAAE,CAAC;gBAElC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC;oBAC7B,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;iBAChC,CAAC,CAAC;gBAEH,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1B,4CAA4C;oBAC5C,SAAS;gBACX,CAAC;gBAED,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAE1B,+DAA+D;gBAC/D,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBACnD,OAAO,CAAC,GAAG,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;wBACxG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;wBACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;wBAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;wBAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;wBAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;wBAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;wBACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;wBAClE,OAAO,CAAC,GAAG,EAAE,CAAC;wBACd,SAAS;oBACX,CAAC;yBAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;wBAChC,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;oBAChC,CAAC;yBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC1C,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;wBACjD,IAAI,CAAC,EAAE,EAAE,CAAC;4BACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;wBACpD,CAAC;6BAAM,CAAC;4BACN,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;wBACzB,CAAC;oBACH,CAAC;yBAAM,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;wBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;wBACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;yBAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;wBAChC,SAAS,GAAG,IAAI,CAAC;wBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;wBAC1F,mBAAmB;wBACnB,OAAO,SAAS,EAAE,CAAC;4BACjB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;gCACxC,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,MAAM;gCACZ,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;6BACtD,CAAC,CAAC;4BAEH,IAAI,CAAC,SAAS,EAAE,CAAC;gCACf,SAAS;4BACX,CAAC;4BAED,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;4BAEtC,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,UAAU,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gCAC5F,SAAS,GAAG,KAAK,CAAC;gCAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;gCACjD,SAAS;4BACX,CAAC;4BAED,IAAI,YAAY,KAAK,OAAO,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gCACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;gCACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BAClB,CAAC;4BAED,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC,CAAC;gCACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;gCACvE,SAAS;4BACX,CAAC;4BAED,IAAI,CAAC;gCACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oCAClC,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE;wCAChC,KAAK,EAAE,IAAI;wCACX,KAAK,EAAE,SAAS;wCAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;qCACnB,CAAC,CAAC;oCACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;oCAClC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;wCACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;wCACzD,OAAO,EAAE,CAAC;oCACZ,CAAC,CAAC,CAAC;gCACL,CAAC,CAAC,CAAC;gCACH,YAAY,CAAC,IAAI,CAAC,KAAK,YAAY,2BAA2B,CAAC,CAAC;4BAClE,CAAC;4BAAC,OAAO,KAAU,EAAE,CAAC;gCACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;4BACtE,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAC;wBACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;oBAC/D,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC1B,4CAA4C;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;KAAM,CAAC;IACN,KAAK,CAAC,IAAI,CAAC;SACR,UAAU,CAAC,QAAQ,CAAC;SACpB,OAAO,CAAC,WAAW,CAAC;SACpB,KAAK,CAAC,wBAAwB,CAAC;SAC/B,OAAO,CACN,OAAO,EACP,0BAA0B,EAC1B,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CACF;SACA,OAAO,CACN,QAAQ,EACR,4BAA4B,EAC5B,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,aAAa,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CACF;SACA,OAAO,CACN,MAAM,EACN,mCAAmC,EACnC,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,WAAW,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CACF;SACA,OAAO,CACN,MAAM,EACN,qCAAqC,EACrC,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;YAC3B,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,0CAA0C;YACvD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CACJ;SACA,OAAO,CACN,OAAO,EACP,4DAA4D,EAC5D,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CACF;SACA,OAAO,CACN,aAAa,EACb,gCAAgC,EAC9B,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE;YAC/B,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,iFAAiF;YAC3F,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CACF;SACA,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC;SACxF,iBAAiB,EAAE;SACnB,MAAM,EAAE;SACR,IAAI,EAAE;SACN,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;SAClB,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;SACrB,QAAQ,CACP,KAAK,CAAC,GAAG,CACP,wDAAwD;QACtD,qDAAqD,CACxD,CACF;SACA,KAAK,EAAE,CAAC;AACb,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { AuthManager } from './auth.js';
2
+ import { CreateTaskRequest, CreateTaskResponse, InitProjectRequest, InitProjectResponse, SyncProjectRequest } from '../types/index.js';
3
+ export declare class ApiClient {
4
+ private client;
5
+ private authManager;
6
+ constructor(authManager: AuthManager);
7
+ initAuth(): Promise<{
8
+ authUrl: string;
9
+ pollToken: string;
10
+ }>;
11
+ pollAuth(pollToken: string): Promise<{
12
+ accessToken: string;
13
+ refreshToken: string;
14
+ expiresIn: number;
15
+ }>;
16
+ getProjects(): Promise<{
17
+ projects: any[];
18
+ }>;
19
+ createProject(repoUrl: string, problemDescription?: string): Promise<{
20
+ project: any;
21
+ }>;
22
+ initProject(request: InitProjectRequest): Promise<InitProjectResponse>;
23
+ syncProject(request: SyncProjectRequest): Promise<void>;
24
+ uploadRepoSnapshot(projectId: string, zipBuffer: Buffer): Promise<void>;
25
+ createTask(request: CreateTaskRequest): Promise<CreateTaskResponse & {
26
+ warning?: string;
27
+ }>;
28
+ sendMessage(taskId: string, message: string): Promise<void>;
29
+ approveCommand(taskId: string, command: string, approved: boolean): Promise<void>;
30
+ cancelTask(taskId: string): Promise<void>;
31
+ uploadFile(taskId: string, filePath: string, content: string): Promise<void>;
32
+ endSession(taskId: string): Promise<void>;
33
+ rateEngineer(taskId: string, rating: number, feedback?: string): Promise<void>;
34
+ getWebSocketUrl(taskId: string, token: string): string;
35
+ }
36
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/modules/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAIL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,EAAE,WAAW;IA2C9B,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAK3D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAMtG,WAAW,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IAK3C,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC;IAQtF,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKtE,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevE,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAM1F,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjF,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CAMvD"}
@@ -0,0 +1,107 @@
1
+ import axios from 'axios';
2
+ import { NetworkError, AuthError, } from '../types/index.js';
3
+ const API_BASE_URL = process.env.CODEVF_API_URL || 'https://api.codevf.com';
4
+ console.log(API_BASE_URL);
5
+ export class ApiClient {
6
+ constructor(authManager) {
7
+ this.authManager = authManager;
8
+ this.client = axios.create({
9
+ baseURL: API_BASE_URL,
10
+ timeout: 30000,
11
+ headers: {
12
+ 'Content-Type': 'application/json',
13
+ },
14
+ });
15
+ // Add request interceptor to add auth token
16
+ this.client.interceptors.request.use((config) => {
17
+ if (this.authManager.isAuthenticated()) {
18
+ config.headers.Authorization = `Bearer ${this.authManager.getAccessToken()}`;
19
+ }
20
+ return config;
21
+ }, (error) => Promise.reject(error));
22
+ // Add response interceptor for error handling
23
+ this.client.interceptors.response.use((response) => response, (error) => {
24
+ if (error.code === 'ECONNREFUSED' || error.code === 'ENOTFOUND') {
25
+ throw new NetworkError('Cannot connect to CodeVF servers.\nPlease check your internet connection.');
26
+ }
27
+ if (error.response?.status === 401) {
28
+ throw new AuthError('Authentication failed.\nPlease run: codevf login');
29
+ }
30
+ if (error.response?.status === 403) {
31
+ throw new AuthError('Access denied. Please check your permissions.');
32
+ }
33
+ throw new NetworkError(`API request failed: ${error.message}`);
34
+ });
35
+ }
36
+ // Auth endpoints
37
+ async initAuth() {
38
+ const response = await this.client.post('/api/cli/auth/init');
39
+ return response.data.data;
40
+ }
41
+ async pollAuth(pollToken) {
42
+ const response = await this.client.post('/api/cli/auth/token', { pollToken });
43
+ return response.data.data;
44
+ }
45
+ // Project endpoints
46
+ async getProjects() {
47
+ const response = await this.client.get('/api/cli/projects');
48
+ return response.data;
49
+ }
50
+ async createProject(repoUrl, problemDescription) {
51
+ const response = await this.client.post('/api/cli/projects', {
52
+ repoUrl,
53
+ problemDescription,
54
+ });
55
+ return response.data;
56
+ }
57
+ async initProject(request) {
58
+ const response = await this.client.post('/project/init', request);
59
+ return response.data.data;
60
+ }
61
+ async syncProject(request) {
62
+ await this.client.post('/project/sync', request);
63
+ }
64
+ async uploadRepoSnapshot(projectId, zipBuffer) {
65
+ const formData = new FormData();
66
+ const blob = new Blob([zipBuffer], { type: 'application/zip' });
67
+ formData.append('file', blob, 'repo.zip');
68
+ formData.append('projectId', projectId);
69
+ await this.client.post('/api/cli/upload-repo-snapshot', formData, {
70
+ headers: {
71
+ 'Content-Type': 'multipart/form-data',
72
+ },
73
+ timeout: 120000, // 2 minutes for large uploads
74
+ });
75
+ }
76
+ // Task endpoints
77
+ async createTask(request) {
78
+ const response = await this.client.post('/api/cli/tasks/create', request);
79
+ const data = response.data;
80
+ return { ...data.data, warning: data.data?.warning || data.warning };
81
+ }
82
+ async sendMessage(taskId, message) {
83
+ await this.client.post(`/api/cli/tasks/${taskId}/send-message`, { message });
84
+ }
85
+ async approveCommand(taskId, command, approved) {
86
+ await this.client.post(`/api/cli/tasks/${taskId}/approve-command`, { command, approved });
87
+ }
88
+ async cancelTask(taskId) {
89
+ await this.client.post(`/api/cli/tasks/${taskId}/cancel`);
90
+ }
91
+ async uploadFile(taskId, filePath, content) {
92
+ await this.client.post(`/api/cli/tasks/${taskId}/upload-file`, { filePath, content });
93
+ }
94
+ async endSession(taskId) {
95
+ await this.client.post(`/api/cli/tasks/${taskId}/end-session`);
96
+ }
97
+ async rateEngineer(taskId, rating, feedback) {
98
+ await this.client.post(`/api/cli/tasks/${taskId}/rate`, { rating, feedback });
99
+ }
100
+ getWebSocketUrl(taskId, token) {
101
+ // For the custom server, WebSocket is at /ws with query params
102
+ const baseUrl = process.env.CODEVF_API_URL || API_BASE_URL;
103
+ const wsUrl = baseUrl.replace('https://', 'wss://').replace('http://', 'ws://').replace('/api/cli', '');
104
+ return `${wsUrl}/ws?taskId=${taskId}&userType=customer&token=${token}`;
105
+ }
106
+ }
107
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/modules/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { AuthToken } from '../types/index.js';
2
+ export declare class AuthManager {
3
+ private authPath;
4
+ constructor();
5
+ isAuthenticated(): boolean;
6
+ loadToken(): AuthToken;
7
+ saveToken(token: AuthToken): void;
8
+ clearToken(): void;
9
+ getAccessToken(): string;
10
+ private isTokenExpired;
11
+ private ensureConfigDir;
12
+ }
13
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/modules/auth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAa,MAAM,mBAAmB,CAAC;AAKzD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;;IAMzB,eAAe,IAAI,OAAO;IAa1B,SAAS,IAAI,SAAS;IAsBtB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAYjC,UAAU,IAAI,IAAI;IAUlB,cAAc,IAAI,MAAM;IAKxB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,eAAe;CAKxB"}
@@ -0,0 +1,80 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ import { AuthError } from '../types/index.js';
5
+ const CONFIG_DIR = path.join(os.homedir(), '.config', 'codevf');
6
+ const AUTH_FILE = 'auth.json';
7
+ export class AuthManager {
8
+ constructor() {
9
+ this.authPath = path.join(CONFIG_DIR, AUTH_FILE);
10
+ }
11
+ isAuthenticated() {
12
+ if (!fs.existsSync(this.authPath)) {
13
+ return false;
14
+ }
15
+ try {
16
+ const token = this.loadToken();
17
+ return !this.isTokenExpired(token);
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ loadToken() {
24
+ if (!fs.existsSync(this.authPath)) {
25
+ throw new AuthError('Not authenticated.\n\nPlease run: codevf login');
26
+ }
27
+ try {
28
+ const content = fs.readFileSync(this.authPath, 'utf-8');
29
+ const token = JSON.parse(content);
30
+ if (this.isTokenExpired(token)) {
31
+ throw new AuthError('Authentication expired.\n\nPlease run: codevf login');
32
+ }
33
+ return token;
34
+ }
35
+ catch (error) {
36
+ if (error instanceof AuthError) {
37
+ throw error;
38
+ }
39
+ throw new AuthError(`Failed to read auth token: ${error}`);
40
+ }
41
+ }
42
+ saveToken(token) {
43
+ this.ensureConfigDir();
44
+ try {
45
+ fs.writeFileSync(this.authPath, JSON.stringify(token, null, 2), 'utf-8');
46
+ // Set file permissions to 0600 (read/write owner only)
47
+ fs.chmodSync(this.authPath, 0o600);
48
+ }
49
+ catch (error) {
50
+ throw new AuthError(`Failed to save auth token: ${error}`);
51
+ }
52
+ }
53
+ clearToken() {
54
+ if (fs.existsSync(this.authPath)) {
55
+ try {
56
+ fs.unlinkSync(this.authPath);
57
+ }
58
+ catch (error) {
59
+ throw new AuthError(`Failed to clear auth token: ${error}`);
60
+ }
61
+ }
62
+ }
63
+ getAccessToken() {
64
+ const token = this.loadToken();
65
+ return token.accessToken;
66
+ }
67
+ isTokenExpired(token) {
68
+ const expiresAt = new Date(token.expiresAt);
69
+ const now = new Date();
70
+ // Consider expired if less than 5 minutes remaining
71
+ const bufferTime = 5 * 60 * 1000;
72
+ return expiresAt.getTime() - now.getTime() < bufferTime;
73
+ }
74
+ ensureConfigDir() {
75
+ if (!fs.existsSync(CONFIG_DIR)) {
76
+ fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/modules/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Config, LastSync } from '../types/index.js';
2
+ export declare class ConfigManager {
3
+ private cwd;
4
+ private configPath;
5
+ private lastSyncPath;
6
+ private cachePath;
7
+ constructor(cwd?: string);
8
+ isInitialized(): boolean;
9
+ ensureConfigDir(): void;
10
+ loadConfig(): Config;
11
+ saveConfig(config: Config): void;
12
+ loadLastSync(): LastSync | null;
13
+ saveLastSync(lastSync: LastSync): void;
14
+ getConfigDir(): string;
15
+ getCacheDir(): string;
16
+ }
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/modules/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAe,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAOlE,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,GAAE,MAAsB;IAOvC,aAAa,IAAI,OAAO;IAIxB,eAAe,IAAI,IAAI;IAWvB,UAAU,IAAI,MAAM;IAepB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUhC,YAAY,IAAI,QAAQ,GAAG,IAAI;IAa/B,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAUtC,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,76 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { ConfigError } from '../types/index.js';
4
+ const CONFIG_DIR = '.codevf';
5
+ const CONFIG_FILE = 'config.json';
6
+ const LAST_SYNC_FILE = 'last_sync.json';
7
+ const CACHE_DIR = 'cache';
8
+ export class ConfigManager {
9
+ constructor(cwd = process.cwd()) {
10
+ this.cwd = cwd;
11
+ this.configPath = path.join(cwd, CONFIG_DIR, CONFIG_FILE);
12
+ this.lastSyncPath = path.join(cwd, CONFIG_DIR, LAST_SYNC_FILE);
13
+ this.cachePath = path.join(cwd, CONFIG_DIR, CACHE_DIR);
14
+ }
15
+ isInitialized() {
16
+ return fs.existsSync(this.configPath);
17
+ }
18
+ ensureConfigDir() {
19
+ const configDir = path.join(this.cwd, CONFIG_DIR);
20
+ if (!fs.existsSync(configDir)) {
21
+ fs.mkdirSync(configDir, { recursive: true });
22
+ }
23
+ if (!fs.existsSync(this.cachePath)) {
24
+ fs.mkdirSync(this.cachePath, { recursive: true });
25
+ }
26
+ }
27
+ loadConfig() {
28
+ if (!this.isInitialized()) {
29
+ throw new ConfigError('No CodeVF project found in this directory.\n\nPlease run: codevf init');
30
+ }
31
+ try {
32
+ const content = fs.readFileSync(this.configPath, 'utf-8');
33
+ return JSON.parse(content);
34
+ }
35
+ catch (error) {
36
+ throw new ConfigError(`Failed to read config file: ${error}`);
37
+ }
38
+ }
39
+ saveConfig(config) {
40
+ this.ensureConfigDir();
41
+ try {
42
+ fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf-8');
43
+ }
44
+ catch (error) {
45
+ throw new ConfigError(`Failed to write config file: ${error}`);
46
+ }
47
+ }
48
+ loadLastSync() {
49
+ if (!fs.existsSync(this.lastSyncPath)) {
50
+ return null;
51
+ }
52
+ try {
53
+ const content = fs.readFileSync(this.lastSyncPath, 'utf-8');
54
+ return JSON.parse(content);
55
+ }
56
+ catch (error) {
57
+ return null;
58
+ }
59
+ }
60
+ saveLastSync(lastSync) {
61
+ this.ensureConfigDir();
62
+ try {
63
+ fs.writeFileSync(this.lastSyncPath, JSON.stringify(lastSync, null, 2), 'utf-8');
64
+ }
65
+ catch (error) {
66
+ throw new ConfigError(`Failed to write last sync file: ${error}`);
67
+ }
68
+ }
69
+ getConfigDir() {
70
+ return path.join(this.cwd, CONFIG_DIR);
71
+ }
72
+ getCacheDir() {
73
+ return this.cachePath;
74
+ }
75
+ }
76
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/modules/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare class GitManager {
2
+ private git;
3
+ constructor(cwd?: string);
4
+ isGitRepo(): Promise<boolean>;
5
+ getCurrentBranch(): Promise<string>;
6
+ getCommitHash(): Promise<string>;
7
+ hasUncommittedChanges(): Promise<boolean>;
8
+ createBranch(branchName: string): Promise<void>;
9
+ switchBranch(branchName: string): Promise<void>;
10
+ branchExists(branchName: string): Promise<boolean>;
11
+ ensureBranch(branchName: string): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=git.d.ts.map