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.
- package/dist/commands/claude-auth.d.ts +2 -0
- package/dist/commands/claude-auth.d.ts.map +1 -0
- package/dist/commands/claude-auth.js +43 -0
- package/dist/commands/claude-auth.js.map +1 -0
- package/dist/commands/codex-auth.d.ts.map +1 -1
- package/dist/commands/codex-auth.js +24 -33
- package/dist/commands/codex-auth.js.map +1 -1
- package/dist/commands/dev-sync.d.ts +2 -0
- package/dist/commands/dev-sync.d.ts.map +1 -0
- package/dist/commands/dev-sync.js +78 -0
- package/dist/commands/dev-sync.js.map +1 -0
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/claude-oauth.d.ts +10 -0
- package/dist/lib/claude-oauth.d.ts.map +1 -0
- package/dist/lib/claude-oauth.js +131 -0
- package/dist/lib/claude-oauth.js.map +1 -0
- package/dist/lib/codex-oauth.d.ts +11 -0
- package/dist/lib/codex-oauth.d.ts.map +1 -0
- package/dist/lib/codex-oauth.js +183 -0
- package/dist/lib/codex-oauth.js.map +1 -0
- package/dist/lib/pkce.d.ts +14 -0
- package/dist/lib/pkce.d.ts.map +1 -0
- package/dist/lib/pkce.js +37 -0
- package/dist/lib/pkce.js.map +1 -0
- package/package.json +1 -1
- package/dist/commands/use-codex.d.ts +0 -6
- package/dist/commands/use-codex.d.ts.map +0 -1
- package/dist/commands/use-codex.js +0 -58
- package/dist/commands/use-codex.js.map +0 -1
|
@@ -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":"
|
|
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.
|
|
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:
|
|
39
|
-
refresh_token:
|
|
40
|
-
id_token:
|
|
20
|
+
access_token: tokens.accessToken,
|
|
21
|
+
refresh_token: tokens.refreshToken,
|
|
22
|
+
id_token: tokens.idToken,
|
|
41
23
|
},
|
|
42
24
|
});
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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":";;;;;
|
|
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 @@
|
|
|
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.
|
|
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":";;;;;;AAEA,yBAAuB;AACvB,yCAAoC;AACpC,kDAA0B;AAC1B,4CAAgD;AAChD,8CAAkD;AAClD,8CAAkD;AAClD,gDAAoD;AACpD,0CAA8C;AAC9C,wCAA8D;AAC9D,8CAA0F;AAC1F,4CAAgD;AAChD,sDAAyD;
|
|
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":"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"}
|
|
@@ -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"}
|
package/dist/lib/pkce.js
ADDED
|
@@ -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 +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":"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"}
|