replicas-cli 0.2.12 → 0.2.14

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.
@@ -0,0 +1,2 @@
1
+ export declare function claudeAuthCommand(): Promise<void>;
2
+ //# sourceMappingURL=claude-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-auth.d.ts","sourceRoot":"","sources":["../../src/commands/claude-auth.ts"],"names":[],"mappings":"AAIA,wBAAsB,iBAAiB,kBA4CtC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.claudeAuthCommand = claudeAuthCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const api_1 = require("../lib/api");
9
+ const claude_oauth_1 = require("../lib/claude-oauth");
10
+ async function claudeAuthCommand() {
11
+ console.log(chalk_1.default.cyan('Authenticating with Claude Code...\n'));
12
+ try {
13
+ const tokens = await (0, claude_oauth_1.runClaudeOAuthFlow)();
14
+ console.log(chalk_1.default.gray('\nUploading credentials to Replicas...'));
15
+ const response = await (0, api_1.authenticatedFetch)('/v1/claude/credentials', {
16
+ method: 'POST',
17
+ body: {
18
+ access_token: tokens.accessToken,
19
+ refresh_token: tokens.refreshToken,
20
+ token_type: tokens.tokenType,
21
+ scope: tokens.scope,
22
+ expires_at: tokens.expiresAt,
23
+ refresh_token_expires_at: tokens.refreshTokenExpiresAt,
24
+ },
25
+ });
26
+ if (!response.success) {
27
+ throw new Error(response.error || 'Failed to upload Claude credentials to Replicas');
28
+ }
29
+ console.log(chalk_1.default.green('\n✓ Claude authentication complete!'));
30
+ if (response.email) {
31
+ console.log(chalk_1.default.gray(` Account: ${response.email}`));
32
+ }
33
+ if (response.planType) {
34
+ console.log(chalk_1.default.gray(` Plan: ${response.planType}`));
35
+ }
36
+ console.log(chalk_1.default.gray('\nYou can now use Claude Code in your workspaces.\n'));
37
+ }
38
+ catch (error) {
39
+ console.log(chalk_1.default.red('\n✗ Error:'), error instanceof Error ? error.message : error);
40
+ process.exit(1);
41
+ }
42
+ }
43
+ //# sourceMappingURL=claude-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-auth.js","sourceRoot":"","sources":["../../src/commands/claude-auth.ts"],"names":[],"mappings":";;;;;AAIA,8CA4CC;AAhDD,kDAA0B;AAC1B,oCAAgD;AAChD,sDAAyD;AAElD,KAAK,UAAU,iBAAiB;IACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,iCAAkB,GAAE,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAElE,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAkB,EAMvC,wBAAwB,EACxB;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,YAAY,EAAE,MAAM,CAAC,WAAW;gBAChC,aAAa,EAAE,MAAM,CAAC,YAAY;gBAClC,UAAU,EAAE,MAAM,CAAC,SAAS;gBAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE,MAAM,CAAC,SAAS;gBAC5B,wBAAwB,EAAE,MAAM,CAAC,qBAAqB;aACvD;SACF,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,iDAAiD,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAChE,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-auth.d.ts","sourceRoot":"","sources":["../../src/commands/codex-auth.ts"],"names":[],"mappings":"AAiBA,wBAAsB,gBAAgB,kBAkDrC"}
1
+ {"version":3,"file":"codex-auth.d.ts","sourceRoot":"","sources":["../../src/commands/codex-auth.ts"],"names":[],"mappings":"AAIA,wBAAsB,gBAAgB,kBA2CrC"}
@@ -5,49 +5,40 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.codexAuthCommand = codexAuthCommand;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
- const fs_1 = __importDefault(require("fs"));
9
- const path_1 = __importDefault(require("path"));
10
- const os_1 = __importDefault(require("os"));
11
8
  const api_1 = require("../lib/api");
9
+ const codex_oauth_1 = require("../lib/codex-oauth");
12
10
  async function codexAuthCommand() {
13
- console.log(chalk_1.default.gray('Uploading Codex authentication...\n'));
14
- const authJsonPath = path_1.default.join(os_1.default.homedir(), '.codex', 'auth.json');
15
- let authData = null;
16
- if (fs_1.default.existsSync(authJsonPath)) {
17
- try {
18
- const fileContent = fs_1.default.readFileSync(authJsonPath, 'utf-8');
19
- authData = JSON.parse(fileContent);
20
- }
21
- catch (error) {
22
- console.log(chalk_1.default.yellow(` Warning: Found auth.json but failed to parse it`));
23
- }
24
- }
25
- if (!authData) {
26
- throw new Error('Could not find Codex auth.json. Expected at:\n' +
27
- ` - ${authJsonPath}\n\n` +
28
- 'Make sure you have authenticated with Codex CLI first.');
29
- }
30
- console.log(chalk_1.default.gray(` Found auth.json at: ${authJsonPath}`));
31
- if (!authData.tokens || !authData.tokens.access_token || !authData.tokens.refresh_token || !authData.tokens.id_token) {
32
- throw new Error('Invalid auth.json format: missing required tokens');
33
- }
11
+ console.log(chalk_1.default.cyan('Authenticating with Codex...\n'));
34
12
  try {
13
+ // Run OAuth flow (opens browser, starts local server, gets tokens)
14
+ const tokens = await (0, codex_oauth_1.runCodexOAuthFlow)();
15
+ console.log(chalk_1.default.gray('\nUploading credentials to Replicas...'));
16
+ // Upload credentials to Replicas API
35
17
  const response = await (0, api_1.authenticatedFetch)('/v1/codex/credentials', {
36
18
  method: 'POST',
37
19
  body: {
38
- access_token: authData.tokens.access_token,
39
- refresh_token: authData.tokens.refresh_token,
40
- id_token: authData.tokens.id_token,
20
+ access_token: tokens.accessToken,
21
+ refresh_token: tokens.refreshToken,
22
+ id_token: tokens.idToken,
41
23
  },
42
24
  });
43
- console.log(chalk_1.default.green('\n✓ Codex credentials uploaded successfully!'));
44
- console.log(chalk_1.default.gray(' Your Codex authentication will now be available in all workspaces.\n'));
25
+ if (response.success) {
26
+ console.log(chalk_1.default.green('\n✓ Codex authentication complete!'));
27
+ if (response.email) {
28
+ console.log(chalk_1.default.gray(` Account: ${response.email}`));
29
+ }
30
+ if (response.planType) {
31
+ console.log(chalk_1.default.gray(` Plan: ${response.planType}`));
32
+ }
33
+ console.log(chalk_1.default.gray('\nYou can now use Codex in your workspaces.\n'));
34
+ }
35
+ else {
36
+ throw new Error(response.error || 'Failed to upload Codex credentials to Replicas');
37
+ }
45
38
  }
46
39
  catch (error) {
47
- if (error instanceof Error) {
48
- throw new Error(`Failed to upload credentials: ${error.message}`);
49
- }
50
- throw error;
40
+ console.log(chalk_1.default.red('\n✗ Error:'), error instanceof Error ? error.message : error);
41
+ process.exit(1);
51
42
  }
52
43
  }
53
44
  //# sourceMappingURL=codex-auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-auth.js","sourceRoot":"","sources":["../../src/commands/codex-auth.ts"],"names":[],"mappings":";;;;;AAiBA,4CAkDC;AAnED,kDAA0B;AAC1B,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,oCAAgD;AAazC,KAAK,UAAU,gBAAgB;IACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAE/D,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAE1C,IAAI,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC3D,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAkB,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,gDAAgD;YAChD,OAAO,YAAY,MAAM;YACzB,wDAAwD,CACzD,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC,CAAC;IAEjE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrH,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAkB,EACvC,uBAAuB,EACvB;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY;gBAC1C,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa;gBAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;aACnC;SACF,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC,CAAC;IACpG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"codex-auth.js","sourceRoot":"","sources":["../../src/commands/codex-auth.ts"],"names":[],"mappings":";;;;;AAIA,4CA2CC;AA/CD,kDAA0B;AAC1B,oCAAgD;AAChD,oDAAuD;AAEhD,KAAK,UAAU,gBAAgB;IACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,mEAAmE;QACnE,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAiB,GAAE,CAAC;QAEzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAElE,qCAAqC;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAkB,EAMvC,uBAAuB,EACvB;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,YAAY,EAAE,MAAM,CAAC,WAAW;gBAChC,aAAa,EAAE,MAAM,CAAC,YAAY;gBAClC,QAAQ,EAAE,MAAM,CAAC,OAAO;aACzB;SACF,CACF,CAAC;QAEF,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC/D,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,gDAAgD,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function devSyncCommand(workspaceName: string): Promise<void>;
2
+ //# sourceMappingURL=dev-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-sync.d.ts","sourceRoot":"","sources":["../../src/commands/dev-sync.ts"],"names":[],"mappings":"AAMA,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EzE"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.devSyncCommand = devSyncCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const child_process_1 = require("child_process");
9
+ const path_1 = __importDefault(require("path"));
10
+ const config_1 = require("../lib/config");
11
+ const workspace_connection_1 = require("../lib/workspace-connection");
12
+ async function devSyncCommand(workspaceName) {
13
+ if (!(0, config_1.isAuthenticated)()) {
14
+ console.log(chalk_1.default.red('Not logged in. Please run "replicas login" first.'));
15
+ process.exit(1);
16
+ }
17
+ try {
18
+ const { workspace, sshKeyPath } = await (0, workspace_connection_1.prepareWorkspaceConnection)(workspaceName, {});
19
+ if (!workspace.ipv4_address) {
20
+ throw new Error('Workspace does not have an IP address');
21
+ }
22
+ console.log(chalk_1.default.blue(`\nSyncing engine to ${workspace.name}...`));
23
+ // Path to dev-sync.sh script in engine/scripts/
24
+ // From cli/dist/commands/ -> ../../../engine/scripts/
25
+ const scriptPath = path_1.default.resolve(__dirname, '../../../engine/scripts/dev-sync.sh');
26
+ // Spawn the dev-sync script
27
+ const devSync = (0, child_process_1.spawn)(scriptPath, [
28
+ '--ip',
29
+ workspace.ipv4_address,
30
+ '--key',
31
+ sshKeyPath,
32
+ ], {
33
+ stdio: 'inherit',
34
+ shell: true,
35
+ });
36
+ // Wait for the script to complete
37
+ await new Promise((resolve, reject) => {
38
+ devSync.on('close', (code) => {
39
+ if (code === 0) {
40
+ resolve();
41
+ }
42
+ else {
43
+ reject(new Error(`dev-sync script exited with code ${code}`));
44
+ }
45
+ });
46
+ devSync.on('error', (error) => {
47
+ reject(error);
48
+ });
49
+ });
50
+ console.log(chalk_1.default.green('\n✓ Engine synced successfully.\n'));
51
+ console.log(chalk_1.default.blue('Viewing logs (Ctrl+C to exit)...\n'));
52
+ // Follow logs after sync
53
+ const logs = (0, child_process_1.spawn)('ssh', [
54
+ '-i',
55
+ sshKeyPath,
56
+ `ubuntu@${workspace.ipv4_address}`,
57
+ 'sudo journalctl -fu replicas-engine',
58
+ ], {
59
+ stdio: 'inherit',
60
+ });
61
+ // Handle Ctrl+C gracefully
62
+ process.on('SIGINT', () => {
63
+ logs.kill('SIGTERM');
64
+ console.log(chalk_1.default.green('\n\n✓ Disconnected from logs.\n'));
65
+ process.exit(0);
66
+ });
67
+ await new Promise((resolve) => {
68
+ logs.on('close', () => {
69
+ resolve();
70
+ });
71
+ });
72
+ }
73
+ catch (error) {
74
+ console.error(chalk_1.default.red(`\nError: ${error instanceof Error ? error.message : 'Unknown error'}`));
75
+ process.exit(1);
76
+ }
77
+ }
78
+ //# sourceMappingURL=dev-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-sync.js","sourceRoot":"","sources":["../../src/commands/dev-sync.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -16,11 +16,13 @@ const org_1 = require("./commands/org");
16
16
  const config_1 = require("./commands/config");
17
17
  const tools_1 = require("./commands/tools");
18
18
  const codex_auth_1 = require("./commands/codex-auth");
19
+ const claude_auth_1 = require("./commands/claude-auth");
20
+ const dev_sync_1 = require("./commands/dev-sync");
19
21
  const program = new commander_1.Command();
20
22
  program
21
23
  .name('replicas')
22
24
  .description('CLI for managing Replicas workspaces')
23
- .version('0.2.12');
25
+ .version('0.2.14');
24
26
  program
25
27
  .command('login')
26
28
  .description('Authenticate with your Replicas account')
@@ -91,6 +93,20 @@ program
91
93
  process.exit(1);
92
94
  }
93
95
  });
96
+ program
97
+ .command('claude-auth')
98
+ .description('Authenticate Replicas with your Claude Code credentials')
99
+ .action(async () => {
100
+ try {
101
+ await (0, claude_auth_1.claudeAuthCommand)();
102
+ }
103
+ catch (error) {
104
+ if (error instanceof Error) {
105
+ console.error(chalk_1.default.red(`\n✗ ${error.message}\n`));
106
+ }
107
+ process.exit(1);
108
+ }
109
+ });
94
110
  // Organization commands
95
111
  const org = program
96
112
  .command('org')
@@ -153,6 +169,23 @@ program
153
169
  process.exit(1);
154
170
  }
155
171
  });
172
+ // Dev-sync command (only available if ENABLE_DEV_SYNC_COMMAND is set)
173
+ if (process.env.ENABLE_DEV_SYNC_COMMAND === 'true') {
174
+ program
175
+ .command('dev-sync <workspace-name>')
176
+ .description('[Dev] Sync local engine to workspace VM')
177
+ .action(async (workspaceName) => {
178
+ try {
179
+ await (0, dev_sync_1.devSyncCommand)(workspaceName);
180
+ }
181
+ catch (error) {
182
+ if (error instanceof Error) {
183
+ console.error(chalk_1.default.red(`\n✗ ${error.message}\n`));
184
+ }
185
+ process.exit(1);
186
+ }
187
+ });
188
+ }
156
189
  // Config commands
157
190
  const config = program
158
191
  .command('config')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface ClaudeTokens {
2
+ accessToken: string;
3
+ refreshToken: string;
4
+ tokenType: string;
5
+ scope?: string;
6
+ expiresAt: string;
7
+ refreshTokenExpiresAt?: string;
8
+ }
9
+ export declare function runClaudeOAuthFlow(): Promise<ClaudeTokens>;
10
+ //# sourceMappingURL=claude-oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-oauth.d.ts","sourceRoot":"","sources":["../../src/lib/claude-oauth.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAiHD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CAkChE"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runClaudeOAuthFlow = runClaudeOAuthFlow;
7
+ const open_1 = __importDefault(require("open"));
8
+ const readline_1 = __importDefault(require("readline"));
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const pkce_1 = require("./pkce");
11
+ const DEFAULT_CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
12
+ const CLAUDE_CLIENT_ID = process.env.CLAUDE_OAUTH_CLIENT_ID || DEFAULT_CLIENT_ID;
13
+ const AUTHORIZATION_ENDPOINT = 'https://claude.ai/oauth/authorize';
14
+ const TOKEN_ENDPOINT = 'https://console.anthropic.com/v1/oauth/token';
15
+ const REDIRECT_URI = 'https://console.anthropic.com/oauth/code/callback';
16
+ const SCOPES = 'org:create_api_key user:profile user:inference';
17
+ function buildAuthorizationUrl(codeChallenge, state) {
18
+ const params = new URLSearchParams({
19
+ code: 'true',
20
+ client_id: CLAUDE_CLIENT_ID,
21
+ response_type: 'code',
22
+ redirect_uri: REDIRECT_URI,
23
+ scope: SCOPES,
24
+ code_challenge: codeChallenge,
25
+ code_challenge_method: 'S256',
26
+ state,
27
+ });
28
+ return `${AUTHORIZATION_ENDPOINT}?${params.toString()}`;
29
+ }
30
+ async function promptForAuthorizationCode(instruction) {
31
+ const rl = readline_1.default.createInterface({
32
+ input: process.stdin,
33
+ output: process.stdout,
34
+ });
35
+ return new Promise((resolve) => {
36
+ rl.question(instruction, (answer) => {
37
+ rl.close();
38
+ resolve(answer.trim());
39
+ });
40
+ });
41
+ }
42
+ function parseUserInput(input) {
43
+ if (!input.includes('#') && !input.includes('code=')) {
44
+ return { code: input };
45
+ }
46
+ if (input.startsWith('http://') || input.startsWith('https://')) {
47
+ try {
48
+ const url = new URL(input);
49
+ const fragment = url.hash.startsWith('#') ? url.hash.slice(1) : url.hash;
50
+ const params = new URLSearchParams(fragment);
51
+ const code = params.get('code') ?? undefined;
52
+ const state = params.get('state') ?? undefined;
53
+ if (code) {
54
+ return { code, state };
55
+ }
56
+ }
57
+ catch {
58
+ // fall through to split handling
59
+ }
60
+ }
61
+ const [code, state] = input.split('#');
62
+ return { code, state };
63
+ }
64
+ async function exchangeCodeForTokens(code, state, expectedState, codeVerifier) {
65
+ if (state && state !== expectedState) {
66
+ throw new Error('State mismatch detected. Please restart the authentication flow.');
67
+ }
68
+ const payload = {
69
+ code,
70
+ state: state ?? expectedState,
71
+ grant_type: 'authorization_code',
72
+ client_id: CLAUDE_CLIENT_ID,
73
+ redirect_uri: REDIRECT_URI,
74
+ code_verifier: codeVerifier,
75
+ };
76
+ const response = await fetch(TOKEN_ENDPOINT, {
77
+ method: 'POST',
78
+ headers: {
79
+ 'Content-Type': 'application/json',
80
+ },
81
+ body: JSON.stringify(payload),
82
+ });
83
+ if (!response.ok) {
84
+ const text = await response.text();
85
+ throw new Error(`Failed to exchange authorization code: ${response.status} ${text}`);
86
+ }
87
+ const data = await response.json();
88
+ const now = Date.now();
89
+ const expiresAt = new Date(now + data.expires_in * 1000).toISOString();
90
+ const refreshTokenExpiresAt = data.refresh_token_expires_in
91
+ ? new Date(now + data.refresh_token_expires_in * 1000).toISOString()
92
+ : undefined;
93
+ return {
94
+ accessToken: data.access_token,
95
+ refreshToken: data.refresh_token,
96
+ tokenType: data.token_type,
97
+ scope: data.scope,
98
+ expiresAt,
99
+ refreshTokenExpiresAt,
100
+ };
101
+ }
102
+ async function runClaudeOAuthFlow() {
103
+ const pkce = (0, pkce_1.generatePkceCodes)();
104
+ const state = (0, pkce_1.generateState)();
105
+ const authUrl = buildAuthorizationUrl(pkce.codeChallenge, state);
106
+ console.log(chalk_1.default.gray('We will open your browser so you can authenticate with Claude Code.'));
107
+ console.log(chalk_1.default.gray('If the browser does not open automatically, use the URL below:\n'));
108
+ console.log(authUrl);
109
+ console.log();
110
+ try {
111
+ await (0, open_1.default)(authUrl);
112
+ }
113
+ catch {
114
+ console.warn(chalk_1.default.yellow('Failed to open browser automatically. Please copy and open the URL manually.'));
115
+ }
116
+ console.log(chalk_1.default.cyan('After completing authentication, copy the code shown on the success page.'));
117
+ console.log(chalk_1.default.cyan('You can paste either the full URL, or a value formatted as CODE#STATE.\n'));
118
+ const userInput = await promptForAuthorizationCode('Paste the authorization code (or URL) here: ');
119
+ if (!userInput) {
120
+ throw new Error('No authorization code provided.');
121
+ }
122
+ const { code, state: returnedState } = parseUserInput(userInput);
123
+ if (!code) {
124
+ throw new Error('Unable to parse authorization code. Please try again.');
125
+ }
126
+ console.log(chalk_1.default.gray('\nExchanging authorization code for tokens...'));
127
+ const tokens = await exchangeCodeForTokens(code, returnedState, state, pkce.codeVerifier);
128
+ console.log(chalk_1.default.green('✓ Successfully obtained Claude credentials'));
129
+ return tokens;
130
+ }
131
+ //# sourceMappingURL=claude-oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-oauth.js","sourceRoot":"","sources":["../../src/lib/claude-oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface CodexTokens {
2
+ idToken: string;
3
+ accessToken: string;
4
+ refreshToken: string;
5
+ }
6
+ /**
7
+ * Run the complete OAuth flow
8
+ * Opens browser, starts local server, waits for callback, exchanges code for tokens
9
+ */
10
+ export declare function runCodexOAuthFlow(): Promise<CodexTokens>;
11
+ //# sourceMappingURL=codex-oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-oauth.d.ts","sourceRoot":"","sources":["../../src/lib/codex-oauth.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAyKD;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAiC9D"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runCodexOAuthFlow = runCodexOAuthFlow;
7
+ const http_1 = __importDefault(require("http"));
8
+ const url_1 = require("url");
9
+ const open_1 = __importDefault(require("open"));
10
+ const pkce_1 = require("./pkce");
11
+ const CODEX_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
12
+ const AUTHORIZATION_ENDPOINT = 'https://auth.openai.com/oauth/authorize';
13
+ const TOKEN_ENDPOINT = 'https://auth.openai.com/oauth/token';
14
+ const CALLBACK_PORT = 1455;
15
+ const CALLBACK_PATH = '/auth/callback';
16
+ const WEB_APP_URL = process.env.REPLICAS_WEB_URL || 'https://replicas.dev';
17
+ /**
18
+ * Build OAuth authorization URL with PKCE
19
+ */
20
+ function buildAuthorizationUrl(codeChallenge, state) {
21
+ const redirectUri = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
22
+ const params = new URLSearchParams({
23
+ response_type: 'code',
24
+ client_id: CODEX_OAUTH_CLIENT_ID,
25
+ redirect_uri: redirectUri,
26
+ scope: 'openid profile email offline_access',
27
+ code_challenge: codeChallenge,
28
+ code_challenge_method: 'S256',
29
+ id_token_add_organizations: 'true',
30
+ codex_cli_simplified_flow: 'true',
31
+ state: state,
32
+ originator: 'codex_cli_rs',
33
+ });
34
+ return `${AUTHORIZATION_ENDPOINT}?${params.toString()}`;
35
+ }
36
+ /**
37
+ * Exchange authorization code for tokens
38
+ */
39
+ async function exchangeCodeForTokens(code, codeVerifier) {
40
+ const redirectUri = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
41
+ const params = new URLSearchParams({
42
+ grant_type: 'authorization_code',
43
+ code: code,
44
+ redirect_uri: redirectUri,
45
+ client_id: CODEX_OAUTH_CLIENT_ID,
46
+ code_verifier: codeVerifier,
47
+ });
48
+ const response = await fetch(TOKEN_ENDPOINT, {
49
+ method: 'POST',
50
+ headers: {
51
+ 'Content-Type': 'application/x-www-form-urlencoded',
52
+ },
53
+ body: params.toString(),
54
+ });
55
+ if (!response.ok) {
56
+ const errorText = await response.text();
57
+ throw new Error(`Failed to exchange code for tokens: ${response.status} ${errorText}`);
58
+ }
59
+ const data = await response.json();
60
+ return {
61
+ idToken: data.id_token,
62
+ accessToken: data.access_token,
63
+ refreshToken: data.refresh_token,
64
+ };
65
+ }
66
+ /**
67
+ * Start local HTTP server to receive OAuth callback
68
+ */
69
+ function startCallbackServer(expectedState, codeVerifier) {
70
+ return new Promise((resolve, reject) => {
71
+ const server = http_1.default.createServer(async (req, res) => {
72
+ try {
73
+ if (!req.url) {
74
+ res.writeHead(400);
75
+ res.end('Bad Request');
76
+ return;
77
+ }
78
+ const url = new url_1.URL(req.url, `http://127.0.0.1:${CALLBACK_PORT}`);
79
+ // Handle callback
80
+ if (url.pathname === CALLBACK_PATH) {
81
+ const code = url.searchParams.get('code');
82
+ const state = url.searchParams.get('state');
83
+ const error = url.searchParams.get('error');
84
+ const errorDescription = url.searchParams.get('error_description');
85
+ // Check for errors from OAuth provider
86
+ if (error) {
87
+ const errorMessage = encodeURIComponent(`${error}: ${errorDescription || 'Unknown error'}`);
88
+ res.writeHead(302, { 'Location': `${WEB_APP_URL}/codex/oauth/error?message=${errorMessage}` });
89
+ res.end();
90
+ server.close();
91
+ reject(new Error(`OAuth error: ${error} - ${errorDescription}`));
92
+ return;
93
+ }
94
+ // Validate state (CSRF protection)
95
+ if (state !== expectedState) {
96
+ const errorMessage = encodeURIComponent('State parameter mismatch. Possible CSRF attack.');
97
+ res.writeHead(302, { 'Location': `${WEB_APP_URL}/codex/oauth/error?message=${errorMessage}` });
98
+ res.end();
99
+ server.close();
100
+ reject(new Error('State mismatch - possible CSRF attack'));
101
+ return;
102
+ }
103
+ // Validate code
104
+ if (!code) {
105
+ const errorMessage = encodeURIComponent('No authorization code received.');
106
+ res.writeHead(302, { 'Location': `${WEB_APP_URL}/codex/oauth/error?message=${errorMessage}` });
107
+ res.end();
108
+ server.close();
109
+ reject(new Error('No authorization code received'));
110
+ return;
111
+ }
112
+ // Exchange code for tokens
113
+ try {
114
+ const tokens = await exchangeCodeForTokens(code, codeVerifier);
115
+ res.writeHead(302, { 'Location': `${WEB_APP_URL}/codex/oauth/success` });
116
+ res.end();
117
+ server.close();
118
+ resolve(tokens);
119
+ }
120
+ catch (tokenError) {
121
+ const errorMessage = encodeURIComponent(tokenError instanceof Error ? tokenError.message : 'Unknown error');
122
+ res.writeHead(302, { 'Location': `${WEB_APP_URL}/codex/oauth/error?message=${errorMessage}` });
123
+ res.end();
124
+ server.close();
125
+ reject(tokenError);
126
+ }
127
+ }
128
+ else {
129
+ res.writeHead(404);
130
+ res.end('Not Found');
131
+ }
132
+ }
133
+ catch (serverError) {
134
+ res.writeHead(500);
135
+ res.end('Internal Server Error');
136
+ server.close();
137
+ reject(serverError);
138
+ }
139
+ });
140
+ // Handle server errors
141
+ server.on('error', (err) => {
142
+ if (err.code === 'EADDRINUSE') {
143
+ reject(new Error(`Port ${CALLBACK_PORT} is already in use. Please close any other OAuth flows and try again.`));
144
+ }
145
+ else {
146
+ reject(err);
147
+ }
148
+ });
149
+ // Start server
150
+ server.listen(CALLBACK_PORT, '127.0.0.1');
151
+ });
152
+ }
153
+ /**
154
+ * Run the complete OAuth flow
155
+ * Opens browser, starts local server, waits for callback, exchanges code for tokens
156
+ */
157
+ async function runCodexOAuthFlow() {
158
+ // Generate PKCE codes and state
159
+ const pkce = (0, pkce_1.generatePkceCodes)();
160
+ const state = (0, pkce_1.generateState)();
161
+ // Build authorization URL
162
+ const authUrl = buildAuthorizationUrl(pkce.codeChallenge, state);
163
+ // Start callback server (non-blocking)
164
+ const tokensPromise = startCallbackServer(state, pkce.codeVerifier);
165
+ // Wait a moment for server to start
166
+ await new Promise(resolve => setTimeout(resolve, 500));
167
+ console.log('If the browser does not open automatically, visit:');
168
+ console.log(authUrl);
169
+ console.log();
170
+ // Open browser
171
+ try {
172
+ await (0, open_1.default)(authUrl);
173
+ }
174
+ catch (openError) {
175
+ console.warn('Failed to open browser automatically. Please open the URL manually.');
176
+ }
177
+ console.log('Waiting for authentication...');
178
+ // Wait for callback and token exchange
179
+ const tokens = await tokensPromise;
180
+ console.log('✓ Successfully obtained Codex credentials');
181
+ return tokens;
182
+ }
183
+ //# sourceMappingURL=codex-oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-oauth.js","sourceRoot":"","sources":["../../src/lib/codex-oauth.ts"],"names":[],"mappings":";;;;;AA6LA,8CAiCC;AA9ND,gDAAwB;AACxB,6BAA0B;AAC1B,gDAAwB;AACxB,iCAA0D;AAE1D,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AAC7D,MAAM,sBAAsB,GAAG,yCAAyC,CAAC;AACzE,MAAM,cAAc,GAAG,qCAAqC,CAAC;AAC7D,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,aAAa,GAAG,gBAAgB,CAAC;AACvC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,sBAAsB,CAAC;AAc3E;;GAEG;AACH,SAAS,qBAAqB,CAC5B,aAAqB,EACrB,KAAa;IAEb,MAAM,WAAW,GAAG,oBAAoB,aAAa,GAAG,aAAa,EAAE,CAAC;IAExE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,qBAAqB;QAChC,YAAY,EAAE,WAAW;QACzB,KAAK,EAAE,qCAAqC;QAC5C,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,MAAM;QAC7B,0BAA0B,EAAE,MAAM;QAClC,yBAAyB,EAAE,MAAM;QACjC,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,cAAc;KAC3B,CAAC,CAAC;IAEH,OAAO,GAAG,sBAAsB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAClC,IAAY,EACZ,YAAoB;IAEpB,MAAM,WAAW,GAAG,oBAAoB,aAAa,GAAG,aAAa,EAAE,CAAC;IAExE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,UAAU,EAAE,oBAAoB;QAChC,IAAI,EAAE,IAAI;QACV,YAAY,EAAE,WAAW;QACzB,SAAS,EAAE,qBAAqB;QAChC,aAAa,EAAE,YAAY;KAC5B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,IAAI,GAAkB,MAAM,QAAQ,CAAC,IAAI,EAAmB,CAAC;IAEnE,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,QAAQ;QACtB,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,IAAI,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,aAAqB,EACrB,YAAoB;IAEpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAClD,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACvB,OAAO;gBACT,CAAC;gBAED,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,aAAa,EAAE,CAAC,CAAC;gBAElE,kBAAkB;gBAClB,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;oBACnC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC5C,MAAM,gBAAgB,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBAEnE,uCAAuC;oBACvC,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,KAAK,KAAK,gBAAgB,IAAI,eAAe,EAAE,CAAC,CAAC;wBAC5F,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,8BAA8B,YAAY,EAAE,EAAE,CAAC,CAAC;wBAC/F,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,MAAM,gBAAgB,EAAE,CAAC,CAAC,CAAC;wBACjE,OAAO;oBACT,CAAC;oBAED,mCAAmC;oBACnC,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;wBAC5B,MAAM,YAAY,GAAG,kBAAkB,CAAC,iDAAiD,CAAC,CAAC;wBAC3F,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,8BAA8B,YAAY,EAAE,EAAE,CAAC,CAAC;wBAC/F,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;wBAC3D,OAAO;oBACT,CAAC;oBAED,gBAAgB;oBAChB,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,MAAM,YAAY,GAAG,kBAAkB,CAAC,iCAAiC,CAAC,CAAC;wBAC3E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,8BAA8B,YAAY,EAAE,EAAE,CAAC,CAAC;wBAC/F,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;wBACpD,OAAO;oBACT,CAAC;oBAED,2BAA2B;oBAC3B,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;wBAE/D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,sBAAsB,EAAE,CAAC,CAAC;wBACzE,GAAG,CAAC,GAAG,EAAE,CAAC;wBAEV,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClB,CAAC;oBAAC,OAAO,UAAU,EAAE,CAAC;wBACpB,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;wBAC5G,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,8BAA8B,YAAY,EAAE,EAAE,CAAC,CAAC;wBAC/F,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,UAAU,CAAC,CAAC;oBACrB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACjC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,WAAW,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAK,GAA6B,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACzD,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,aAAa,uEAAuE,CAAC,CAAC,CAAC;YAClH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,iBAAiB;IACrC,gCAAgC;IAChC,MAAM,IAAI,GAAG,IAAA,wBAAiB,GAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAA,oBAAa,GAAE,CAAC;IAE9B,0BAA0B;IAC1B,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAEjE,uCAAuC;IACvC,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAEpE,oCAAoC;IACpC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,eAAe;IACf,IAAI,CAAC;QACH,MAAM,IAAA,cAAI,EAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7C,uCAAuC;IACvC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAEzD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface PkceCodes {
2
+ codeVerifier: string;
3
+ codeChallenge: string;
4
+ }
5
+ /**
6
+ * Generate PKCE (Proof Key for Code Exchange) codes for OAuth flow
7
+ * Implements RFC 7636 for enhanced security
8
+ */
9
+ export declare function generatePkceCodes(): PkceCodes;
10
+ /**
11
+ * Generate random state for OAuth flow
12
+ */
13
+ export declare function generateState(): string;
14
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAsB7C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generatePkceCodes = generatePkceCodes;
4
+ exports.generateState = generateState;
5
+ const crypto_1 = require("crypto");
6
+ /**
7
+ * Generate PKCE (Proof Key for Code Exchange) codes for OAuth flow
8
+ * Implements RFC 7636 for enhanced security
9
+ */
10
+ function generatePkceCodes() {
11
+ // Generate 32 random bytes for code verifier
12
+ const verifierBytes = (0, crypto_1.randomBytes)(32);
13
+ const codeVerifier = verifierBytes
14
+ .toString('base64')
15
+ .replace(/\+/g, '-')
16
+ .replace(/\//g, '_')
17
+ .replace(/=+$/, '');
18
+ // Create SHA256 hash for code challenge
19
+ const hash = (0, crypto_1.createHash)('sha256');
20
+ hash.update(codeVerifier);
21
+ const codeChallenge = hash
22
+ .digest('base64')
23
+ .replace(/\+/g, '-')
24
+ .replace(/\//g, '_')
25
+ .replace(/=+$/, '');
26
+ return {
27
+ codeVerifier,
28
+ codeChallenge,
29
+ };
30
+ }
31
+ /**
32
+ * Generate random state for OAuth flow
33
+ */
34
+ function generateState() {
35
+ return (0, crypto_1.randomBytes)(16).toString('hex');
36
+ }
37
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":";;AAWA,8CAsBC;AAKD,sCAEC;AAxCD,mCAAiD;AAOjD;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,6CAA6C;IAC7C,MAAM,aAAa,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,aAAa;SAC/B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtB,wCAAwC;IACxC,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,aAAa,GAAG,IAAI;SACvB,MAAM,CAAC,QAAQ,CAAC;SAChB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtB,OAAO;QACL,YAAY;QACZ,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa;IAC3B,OAAO,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.12",
3
+ "version": "0.2.14",
4
4
  "description": "CLI for managing Replicas workspaces - SSH into cloud dev environments with automatic port forwarding",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -1,6 +0,0 @@
1
- /**
2
- * Start OAuth proxy server for Codex authentication
3
- * This server receives OAuth callbacks from OpenAI and proxies them to the Replicas web app
4
- */
5
- export declare function useCodexCommand(): Promise<void>;
6
- //# sourceMappingURL=use-codex.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-codex.d.ts","sourceRoot":"","sources":["../../src/commands/use-codex.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,eAAe,kBAgDpC"}
@@ -1,58 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.useCodexCommand = useCodexCommand;
7
- const chalk_1 = __importDefault(require("chalk"));
8
- const http_1 = __importDefault(require("http"));
9
- const url_1 = __importDefault(require("url"));
10
- const PORT = 1455;
11
- const CALLBACK_PATH = '/auth/callback';
12
- /**
13
- * Start OAuth proxy server for Codex authentication
14
- * This server receives OAuth callbacks from OpenAI and proxies them to the Replicas web app
15
- */
16
- async function useCodexCommand() {
17
- console.log(chalk_1.default.cyan('\n╭─────────────────────────────────────────╮'));
18
- console.log(chalk_1.default.cyan('│') + ' ' + chalk_1.default.bold('Codex OAuth Proxy Server') + ' ' + chalk_1.default.cyan('│'));
19
- console.log(chalk_1.default.cyan('╰─────────────────────────────────────────╯\n'));
20
- console.log(chalk_1.default.gray('Starting OAuth proxy server for Codex...\n'));
21
- const server = http_1.default.createServer((req, res) => {
22
- const parsedUrl = url_1.default.parse(req.url || '', true);
23
- if (parsedUrl.pathname === CALLBACK_PATH) {
24
- // Extract query parameters
25
- const queryParams = parsedUrl.query;
26
- const queryString = Object.keys(queryParams)
27
- .map(key => `${key}=${encodeURIComponent(String(queryParams[key]))}`)
28
- .join('&');
29
- // Redirect to Replicas web app callback
30
- const redirectUrl = `http://localhost:3000/api/codex/oauth/callback?${queryString}`;
31
- console.log(chalk_1.default.green('✓') + ' Received OAuth callback');
32
- console.log(chalk_1.default.gray(` Redirecting to: ${redirectUrl}\n`));
33
- res.writeHead(302, {
34
- 'Location': redirectUrl,
35
- });
36
- res.end();
37
- }
38
- else {
39
- res.writeHead(404);
40
- res.end('Not Found');
41
- }
42
- });
43
- server.listen(PORT, () => {
44
- console.log(chalk_1.default.green('✓') + ` Server listening on ${chalk_1.default.bold(`http://localhost:${PORT}`)}`);
45
- console.log(chalk_1.default.gray(` Waiting for OAuth callbacks from OpenAI...\n`));
46
- console.log(chalk_1.default.yellow('ℹ') + ' You can now click ' + chalk_1.default.bold('Connect') + ' in the Replicas web app');
47
- console.log(chalk_1.default.gray(' Press Ctrl+C to stop the server\n'));
48
- });
49
- // Handle shutdown gracefully
50
- process.on('SIGINT', () => {
51
- console.log(chalk_1.default.yellow('\n\n✓ Shutting down OAuth proxy server...'));
52
- server.close(() => {
53
- console.log(chalk_1.default.green('✓ Server stopped\n'));
54
- process.exit(0);
55
- });
56
- });
57
- }
58
- //# sourceMappingURL=use-codex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-codex.js","sourceRoot":"","sources":["../../src/commands/use-codex.ts"],"names":[],"mappings":";;;;;AAWA,0CAgDC;AA3DD,kDAA0B;AAC1B,gDAAwB;AACxB,8CAAsB;AAEtB,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC;;;GAGG;AACI,KAAK,UAAU,eAAe;IACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,SAAS,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3G,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAEzE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;IAEtE,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAG,aAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAEjD,IAAI,SAAS,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YACzC,2BAA2B;YAC3B,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC;YACpC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;iBACzC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpE,IAAI,CAAC,GAAG,CAAC,CAAC;YAEb,wCAAwC;YACxC,MAAM,WAAW,GAAG,kDAAkD,WAAW,EAAE,CAAC;YAEpF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,0BAA0B,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qBAAqB,WAAW,IAAI,CAAC,CAAC,CAAC;YAE9D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,UAAU,EAAE,WAAW;aACxB,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,wBAAwB,eAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,sBAAsB,GAAG,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,0BAA0B,CAAC,CAAC;QAC7G,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}