@su-record/vibe 2.6.53 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +64 -291
- package/README.md +112 -217
- package/dist/cli/collaborator.js +1 -1
- package/dist/cli/commands/info.js +1 -1
- package/dist/cli/setup/GlobalInstaller.d.ts +0 -7
- package/dist/cli/setup/GlobalInstaller.d.ts.map +1 -1
- package/dist/cli/setup/GlobalInstaller.js +4 -23
- package/dist/cli/setup/GlobalInstaller.js.map +1 -1
- package/hooks/scripts/utils.js +13 -27
- package/package.json +4 -4
- package/dist/cli/commands/sync.d.ts +0 -9
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/sync.js +0 -166
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/infra/lib/claude-storage.d.ts +0 -12
- package/dist/infra/lib/claude-storage.d.ts.map +0 -1
- package/dist/infra/lib/claude-storage.js +0 -59
- package/dist/infra/lib/claude-storage.js.map +0 -1
- package/dist/infra/lib/gemini-api.d.ts +0 -13
- package/dist/infra/lib/gemini-api.d.ts.map +0 -1
- package/dist/infra/lib/gemini-api.js +0 -13
- package/dist/infra/lib/gemini-api.js.map +0 -1
- package/dist/infra/lib/gemini-constants.d.ts +0 -8
- package/dist/infra/lib/gemini-constants.d.ts.map +0 -1
- package/dist/infra/lib/gemini-constants.js +0 -18
- package/dist/infra/lib/gemini-constants.js.map +0 -1
- package/dist/infra/lib/gemini-oauth.d.ts.map +0 -1
- package/dist/infra/lib/gemini-oauth.js.map +0 -1
- package/dist/infra/lib/gemini-storage.d.ts.map +0 -1
- package/dist/infra/lib/gemini-storage.js.map +0 -1
- package/dist/infra/lib/gpt-api.d.ts +0 -13
- package/dist/infra/lib/gpt-api.d.ts.map +0 -1
- package/dist/infra/lib/gpt-api.js +0 -13
- package/dist/infra/lib/gpt-api.js.map +0 -1
- package/dist/infra/lib/gpt-constants.d.ts +0 -12
- package/dist/infra/lib/gpt-constants.d.ts.map +0 -1
- package/dist/infra/lib/gpt-constants.js +0 -18
- package/dist/infra/lib/gpt-constants.js.map +0 -1
- package/dist/infra/lib/gpt-oauth.d.ts +0 -66
- package/dist/infra/lib/gpt-oauth.d.ts.map +0 -1
- package/dist/infra/lib/gpt-oauth.js +0 -389
- package/dist/infra/lib/gpt-oauth.js.map +0 -1
- package/dist/infra/lib/gpt-storage.d.ts +0 -40
- package/dist/infra/lib/gpt-storage.d.ts.map +0 -1
- package/dist/infra/lib/gpt-storage.js +0 -106
- package/dist/infra/lib/gpt-storage.js.map +0 -1
- package/dist/infra/lib/sync/constants.d.ts +0 -21
- package/dist/infra/lib/sync/constants.d.ts.map +0 -1
- package/dist/infra/lib/sync/constants.js +0 -78
- package/dist/infra/lib/sync/constants.js.map +0 -1
- package/dist/infra/lib/sync/crypto.d.ts +0 -23
- package/dist/infra/lib/sync/crypto.d.ts.map +0 -1
- package/dist/infra/lib/sync/crypto.js +0 -55
- package/dist/infra/lib/sync/crypto.js.map +0 -1
- package/dist/infra/lib/sync/drive.d.ts +0 -22
- package/dist/infra/lib/sync/drive.d.ts.map +0 -1
- package/dist/infra/lib/sync/drive.js +0 -99
- package/dist/infra/lib/sync/drive.js.map +0 -1
- package/dist/infra/lib/sync/index.d.ts +0 -9
- package/dist/infra/lib/sync/index.d.ts.map +0 -1
- package/dist/infra/lib/sync/index.js +0 -9
- package/dist/infra/lib/sync/index.js.map +0 -1
- package/dist/infra/lib/sync/oauth.d.ts +0 -12
- package/dist/infra/lib/sync/oauth.d.ts.map +0 -1
- package/dist/infra/lib/sync/oauth.js +0 -157
- package/dist/infra/lib/sync/oauth.js.map +0 -1
- package/dist/infra/lib/sync/storage.d.ts +0 -21
- package/dist/infra/lib/sync/storage.d.ts.map +0 -1
- package/dist/infra/lib/sync/storage.js +0 -32
- package/dist/infra/lib/sync/storage.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gpt-constants.js","sourceRoot":"","sources":["../../../src/infra/lib/gpt-constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oCAAoC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,8BAA8B,CAAC;AAE5D,cAAc;AACd,MAAM,CAAC,MAAM,iBAAiB,GAAG,yCAAyC,CAAC;AAC3E,MAAM,CAAC,MAAM,aAAa,GAAG,qCAAqC,CAAC;AAEnE,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAEtE,YAAY;AACZ,MAAM,CAAC,MAAM,SAAS,GAAG,mDAAmD,CAAC;AAE7E,oBAAoB;AACpB,MAAM,CAAC,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAElE,yBAAyB;AACzB,MAAM,CAAC,MAAM,cAAc,GAAG,6BAA6B,CAAC"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GPT OAuth 인증 (OpenAI Codex CLI 방식)
|
|
3
|
-
* PKCE를 사용한 OpenAI OAuth 인증
|
|
4
|
-
*/
|
|
5
|
-
interface AuthorizationUrlResult {
|
|
6
|
-
url: string;
|
|
7
|
-
verifier: string;
|
|
8
|
-
state: string;
|
|
9
|
-
}
|
|
10
|
-
interface RefreshedTokens {
|
|
11
|
-
accessToken: string;
|
|
12
|
-
refreshToken: string;
|
|
13
|
-
expires: number;
|
|
14
|
-
}
|
|
15
|
-
export interface OAuthTokens {
|
|
16
|
-
accessToken: string;
|
|
17
|
-
refreshToken: string;
|
|
18
|
-
idToken?: string;
|
|
19
|
-
expires: number;
|
|
20
|
-
email: string;
|
|
21
|
-
accountId?: string;
|
|
22
|
-
}
|
|
23
|
-
interface ValidAccessToken {
|
|
24
|
-
accessToken: string;
|
|
25
|
-
email: string;
|
|
26
|
-
accountId?: string;
|
|
27
|
-
}
|
|
28
|
-
interface JWTPayload {
|
|
29
|
-
email?: string;
|
|
30
|
-
sub?: string;
|
|
31
|
-
[key: string]: unknown;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* JWT 디코딩 (서명 검증 없이)
|
|
35
|
-
*/
|
|
36
|
-
export declare function decodeJWT(token: string): JWTPayload | null;
|
|
37
|
-
/**
|
|
38
|
-
* JWT에서 이메일 추출
|
|
39
|
-
*/
|
|
40
|
-
export declare function extractEmailFromToken(token: string): string | null;
|
|
41
|
-
/**
|
|
42
|
-
* JWT에서 ChatGPT 계정 ID 추출
|
|
43
|
-
*/
|
|
44
|
-
export declare function extractAccountId(token: string): string | null;
|
|
45
|
-
/**
|
|
46
|
-
* OAuth 인증 URL 생성
|
|
47
|
-
*/
|
|
48
|
-
export declare function createAuthorizationUrl(): AuthorizationUrlResult;
|
|
49
|
-
/**
|
|
50
|
-
* Authorization code를 토큰으로 교환
|
|
51
|
-
*/
|
|
52
|
-
export declare function exchangeCodeForTokens(code: string, verifier: string): Promise<OAuthTokens>;
|
|
53
|
-
/**
|
|
54
|
-
* 액세스 토큰 갱신
|
|
55
|
-
*/
|
|
56
|
-
export declare function refreshAccessToken(refreshToken: string): Promise<RefreshedTokens>;
|
|
57
|
-
/**
|
|
58
|
-
* 로컬 서버로 OAuth 콜백 처리
|
|
59
|
-
*/
|
|
60
|
-
export declare function startOAuthFlow(): Promise<OAuthTokens>;
|
|
61
|
-
/**
|
|
62
|
-
* 유효한 액세스 토큰 가져오기 (필요시 갱신)
|
|
63
|
-
*/
|
|
64
|
-
export declare function getValidAccessToken(): Promise<ValidAccessToken>;
|
|
65
|
-
export {};
|
|
66
|
-
//# sourceMappingURL=gpt-oauth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gpt-oauth.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/gpt-oauth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,UAAU,sBAAsB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAyBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB7D;AASD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,sBAAsB,CAsB/D;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwChG;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA2BvF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CA2LrD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA6CrE"}
|
|
@@ -1,389 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GPT OAuth 인증 (OpenAI Codex CLI 방식)
|
|
3
|
-
* PKCE를 사용한 OpenAI OAuth 인증
|
|
4
|
-
*/
|
|
5
|
-
import http from 'http';
|
|
6
|
-
import crypto from 'crypto';
|
|
7
|
-
import { exec } from 'child_process';
|
|
8
|
-
import { GPT_CLIENT_ID, GPT_AUTHORIZE_URL, GPT_TOKEN_URL, GPT_REDIRECT_URI, GPT_SCOPE, JWT_CLAIM_PATH, } from './gpt-constants.js';
|
|
9
|
-
import * as storage from './gpt-storage.js';
|
|
10
|
-
import { tokenRefresher } from './llm/auth/TokenRefresher.js';
|
|
11
|
-
/**
|
|
12
|
-
* PKCE 코드 생성 (OpenAI 스펙: S256)
|
|
13
|
-
*/
|
|
14
|
-
function generatePKCE() {
|
|
15
|
-
// code_verifier: 43-128자의 랜덤 문자열
|
|
16
|
-
const verifier = crypto.randomBytes(32).toString('base64url');
|
|
17
|
-
// code_challenge: verifier의 SHA256 해시 (base64url)
|
|
18
|
-
const challenge = crypto
|
|
19
|
-
.createHash('sha256')
|
|
20
|
-
.update(verifier)
|
|
21
|
-
.digest('base64url');
|
|
22
|
-
return { verifier, challenge };
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* 랜덤 state 생성
|
|
26
|
-
*/
|
|
27
|
-
function generateState() {
|
|
28
|
-
return crypto.randomBytes(16).toString('hex');
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* JWT 디코딩 (서명 검증 없이)
|
|
32
|
-
*/
|
|
33
|
-
export function decodeJWT(token) {
|
|
34
|
-
try {
|
|
35
|
-
const parts = token.split('.');
|
|
36
|
-
if (parts.length !== 3)
|
|
37
|
-
return null;
|
|
38
|
-
const payload = parts[1];
|
|
39
|
-
const decoded = Buffer.from(payload, 'base64url').toString('utf-8');
|
|
40
|
-
return JSON.parse(decoded);
|
|
41
|
-
}
|
|
42
|
-
catch { /* ignore: optional operation */
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* JWT에서 이메일 추출
|
|
48
|
-
*/
|
|
49
|
-
export function extractEmailFromToken(token) {
|
|
50
|
-
const payload = decodeJWT(token);
|
|
51
|
-
if (!payload)
|
|
52
|
-
return null;
|
|
53
|
-
return payload.email || payload.sub || null;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* JWT에서 ChatGPT 계정 ID 추출
|
|
57
|
-
*/
|
|
58
|
-
export function extractAccountId(token) {
|
|
59
|
-
const payload = decodeJWT(token);
|
|
60
|
-
if (!payload)
|
|
61
|
-
return null;
|
|
62
|
-
// OpenAI 토큰 클레임 경로에서 계정 ID 추출
|
|
63
|
-
const authClaim = payload[JWT_CLAIM_PATH];
|
|
64
|
-
if (authClaim?.chatgpt_account_id) {
|
|
65
|
-
return authClaim.chatgpt_account_id;
|
|
66
|
-
}
|
|
67
|
-
if (authClaim?.organization_id) {
|
|
68
|
-
return authClaim.organization_id;
|
|
69
|
-
}
|
|
70
|
-
if (authClaim?.organizations && authClaim.organizations.length > 0) {
|
|
71
|
-
return authClaim.organizations[0].organization_id;
|
|
72
|
-
}
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 토큰 만료 시간 계산
|
|
77
|
-
*/
|
|
78
|
-
function calculateTokenExpiry(startTime, expiresIn) {
|
|
79
|
-
return startTime + (expiresIn * 1000) - 60000; // 1분 여유
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* OAuth 인증 URL 생성
|
|
83
|
-
*/
|
|
84
|
-
export function createAuthorizationUrl() {
|
|
85
|
-
const pkce = generatePKCE();
|
|
86
|
-
const state = generateState();
|
|
87
|
-
const url = new URL(GPT_AUTHORIZE_URL);
|
|
88
|
-
url.searchParams.set('response_type', 'code');
|
|
89
|
-
url.searchParams.set('client_id', GPT_CLIENT_ID);
|
|
90
|
-
url.searchParams.set('redirect_uri', GPT_REDIRECT_URI);
|
|
91
|
-
url.searchParams.set('scope', GPT_SCOPE);
|
|
92
|
-
url.searchParams.set('code_challenge', pkce.challenge);
|
|
93
|
-
url.searchParams.set('code_challenge_method', 'S256');
|
|
94
|
-
url.searchParams.set('state', state);
|
|
95
|
-
// Codex CLI 특수 파라미터
|
|
96
|
-
url.searchParams.set('id_token_add_organizations', 'true');
|
|
97
|
-
url.searchParams.set('codex_cli_simplified_flow', 'true');
|
|
98
|
-
url.searchParams.set('originator', 'codex_cli_rs');
|
|
99
|
-
return {
|
|
100
|
-
url: url.toString(),
|
|
101
|
-
verifier: pkce.verifier,
|
|
102
|
-
state,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Authorization code를 토큰으로 교환
|
|
107
|
-
*/
|
|
108
|
-
export async function exchangeCodeForTokens(code, verifier) {
|
|
109
|
-
const startTime = Date.now();
|
|
110
|
-
const response = await fetch(GPT_TOKEN_URL, {
|
|
111
|
-
method: 'POST',
|
|
112
|
-
headers: {
|
|
113
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
114
|
-
},
|
|
115
|
-
body: new URLSearchParams({
|
|
116
|
-
grant_type: 'authorization_code',
|
|
117
|
-
client_id: GPT_CLIENT_ID,
|
|
118
|
-
code,
|
|
119
|
-
code_verifier: verifier,
|
|
120
|
-
redirect_uri: GPT_REDIRECT_URI,
|
|
121
|
-
}),
|
|
122
|
-
});
|
|
123
|
-
if (!response.ok) {
|
|
124
|
-
const errorText = await response.text();
|
|
125
|
-
throw new Error(`Token exchange failed (${response.status}): ${errorText}`);
|
|
126
|
-
}
|
|
127
|
-
const payload = await response.json();
|
|
128
|
-
if (!payload.access_token || !payload.refresh_token) {
|
|
129
|
-
throw new Error('Token response missing required fields.');
|
|
130
|
-
}
|
|
131
|
-
// 이메일 및 계정 ID 추출
|
|
132
|
-
const email = extractEmailFromToken(payload.id_token || payload.access_token);
|
|
133
|
-
const accountId = extractAccountId(payload.id_token || payload.access_token);
|
|
134
|
-
return {
|
|
135
|
-
accessToken: payload.access_token,
|
|
136
|
-
refreshToken: payload.refresh_token,
|
|
137
|
-
idToken: payload.id_token,
|
|
138
|
-
expires: calculateTokenExpiry(startTime, payload.expires_in || 3600),
|
|
139
|
-
email: email || 'unknown',
|
|
140
|
-
accountId: accountId || undefined,
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* 액세스 토큰 갱신
|
|
145
|
-
*/
|
|
146
|
-
export async function refreshAccessToken(refreshToken) {
|
|
147
|
-
const startTime = Date.now();
|
|
148
|
-
const response = await fetch(GPT_TOKEN_URL, {
|
|
149
|
-
method: 'POST',
|
|
150
|
-
headers: {
|
|
151
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
152
|
-
},
|
|
153
|
-
body: new URLSearchParams({
|
|
154
|
-
grant_type: 'refresh_token',
|
|
155
|
-
refresh_token: refreshToken,
|
|
156
|
-
client_id: GPT_CLIENT_ID,
|
|
157
|
-
}),
|
|
158
|
-
});
|
|
159
|
-
if (!response.ok) {
|
|
160
|
-
const errorText = await response.text();
|
|
161
|
-
throw new Error(`Token refresh failed (${response.status}): ${errorText}`);
|
|
162
|
-
}
|
|
163
|
-
const payload = await response.json();
|
|
164
|
-
return {
|
|
165
|
-
accessToken: payload.access_token,
|
|
166
|
-
refreshToken: payload.refresh_token || refreshToken,
|
|
167
|
-
expires: calculateTokenExpiry(startTime, payload.expires_in || 3600),
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* 로컬 서버로 OAuth 콜백 처리
|
|
172
|
-
*/
|
|
173
|
-
export function startOAuthFlow() {
|
|
174
|
-
return new Promise((resolve, reject) => {
|
|
175
|
-
const auth = createAuthorizationUrl();
|
|
176
|
-
let server = null;
|
|
177
|
-
let timeoutId = null;
|
|
178
|
-
let isResolved = false;
|
|
179
|
-
// 안전하게 서버 종료 (Windows libuv 핸들 충돌 방지)
|
|
180
|
-
const closeServer = () => {
|
|
181
|
-
if (timeoutId) {
|
|
182
|
-
clearTimeout(timeoutId);
|
|
183
|
-
timeoutId = null;
|
|
184
|
-
}
|
|
185
|
-
if (server) {
|
|
186
|
-
const serverToClose = server;
|
|
187
|
-
server = null; // 먼저 null로 설정하여 중복 호출 방지
|
|
188
|
-
// Windows에서 libuv 핸들 충돌 방지를 위해 충분한 지연 후 종료
|
|
189
|
-
setTimeout(() => {
|
|
190
|
-
try {
|
|
191
|
-
// closeAllConnections가 있으면 먼저 호출
|
|
192
|
-
if ('closeAllConnections' in serverToClose) {
|
|
193
|
-
serverToClose.closeAllConnections();
|
|
194
|
-
}
|
|
195
|
-
// 서버 종료 (에러 무시)
|
|
196
|
-
serverToClose.close(() => { });
|
|
197
|
-
}
|
|
198
|
-
catch {
|
|
199
|
-
// 이미 닫힌 경우 무시
|
|
200
|
-
}
|
|
201
|
-
}, 100);
|
|
202
|
-
}
|
|
203
|
-
};
|
|
204
|
-
// 콜백 서버 시작 (포트 1455 - Codex CLI와 동일)
|
|
205
|
-
server = http.createServer(async (req, res) => {
|
|
206
|
-
const url = new URL(req.url || '', 'http://localhost:1455');
|
|
207
|
-
if (url.pathname === '/auth/callback') {
|
|
208
|
-
const code = url.searchParams.get('code');
|
|
209
|
-
const state = url.searchParams.get('state');
|
|
210
|
-
const error = url.searchParams.get('error');
|
|
211
|
-
const errorDescription = url.searchParams.get('error_description');
|
|
212
|
-
if (error) {
|
|
213
|
-
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
214
|
-
res.end(`
|
|
215
|
-
<html>
|
|
216
|
-
<head><title>Authentication Failed</title></head>
|
|
217
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
218
|
-
<h1>Authentication Failed</h1>
|
|
219
|
-
<p>Error: ${error}</p>
|
|
220
|
-
<p>${errorDescription || ''}</p>
|
|
221
|
-
<p>Please close this window and try again.</p>
|
|
222
|
-
</body>
|
|
223
|
-
</html>
|
|
224
|
-
`);
|
|
225
|
-
if (!isResolved) {
|
|
226
|
-
isResolved = true;
|
|
227
|
-
closeServer();
|
|
228
|
-
reject(new Error(`OAuth error: ${error} - ${errorDescription || ''}`));
|
|
229
|
-
}
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
// state 검증
|
|
233
|
-
if (state !== auth.state) {
|
|
234
|
-
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
235
|
-
res.end(`
|
|
236
|
-
<html>
|
|
237
|
-
<head><title>Authentication Failed</title></head>
|
|
238
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
239
|
-
<h1>Authentication Failed</h1>
|
|
240
|
-
<p>State mismatch - possible CSRF attack</p>
|
|
241
|
-
</body>
|
|
242
|
-
</html>
|
|
243
|
-
`);
|
|
244
|
-
if (!isResolved) {
|
|
245
|
-
isResolved = true;
|
|
246
|
-
closeServer();
|
|
247
|
-
reject(new Error('State mismatch'));
|
|
248
|
-
}
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
if (!code) {
|
|
252
|
-
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
253
|
-
res.end(`
|
|
254
|
-
<html>
|
|
255
|
-
<head><title>Authentication Failed</title></head>
|
|
256
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
257
|
-
<h1>Authentication Failed</h1>
|
|
258
|
-
<p>Authorization code missing.</p>
|
|
259
|
-
</body>
|
|
260
|
-
</html>
|
|
261
|
-
`);
|
|
262
|
-
if (!isResolved) {
|
|
263
|
-
isResolved = true;
|
|
264
|
-
closeServer();
|
|
265
|
-
reject(new Error('Authorization code missing'));
|
|
266
|
-
}
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
try {
|
|
270
|
-
const tokens = await exchangeCodeForTokens(code, auth.verifier);
|
|
271
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
272
|
-
res.end(`
|
|
273
|
-
<html>
|
|
274
|
-
<head><title>Authentication Successful</title></head>
|
|
275
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
276
|
-
<h1>Authentication Successful!</h1>
|
|
277
|
-
<p>Logged in as ${tokens.email}.</p>
|
|
278
|
-
<p>You may close this window.</p>
|
|
279
|
-
<script>setTimeout(() => window.close(), 2000);</script>
|
|
280
|
-
</body>
|
|
281
|
-
</html>
|
|
282
|
-
`);
|
|
283
|
-
if (!isResolved) {
|
|
284
|
-
isResolved = true;
|
|
285
|
-
closeServer();
|
|
286
|
-
resolve(tokens);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
catch (err) {
|
|
290
|
-
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
291
|
-
res.end(`
|
|
292
|
-
<html>
|
|
293
|
-
<head><title>Authentication Failed</title></head>
|
|
294
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
295
|
-
<h1>Authentication Failed</h1>
|
|
296
|
-
<p>${err.message}</p>
|
|
297
|
-
</body>
|
|
298
|
-
</html>
|
|
299
|
-
`);
|
|
300
|
-
if (!isResolved) {
|
|
301
|
-
isResolved = true;
|
|
302
|
-
closeServer();
|
|
303
|
-
reject(err);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
res.writeHead(404);
|
|
309
|
-
res.end('Not Found');
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
// Keep-alive 비활성화
|
|
313
|
-
server.keepAliveTimeout = 0;
|
|
314
|
-
server.headersTimeout = 5000;
|
|
315
|
-
server.listen(1455, 'localhost', () => {
|
|
316
|
-
console.log('\nOpening OpenAI login page in browser...\n');
|
|
317
|
-
console.log(`Auth URL: ${auth.url}\n`);
|
|
318
|
-
// 브라우저 열기
|
|
319
|
-
const platform = process.platform;
|
|
320
|
-
if (platform === 'darwin') {
|
|
321
|
-
exec(`open "${auth.url}"`);
|
|
322
|
-
}
|
|
323
|
-
else if (platform === 'win32') {
|
|
324
|
-
exec(`start "" "${auth.url}"`);
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
exec(`xdg-open "${auth.url}"`);
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
server.on('error', (err) => {
|
|
331
|
-
if (!isResolved) {
|
|
332
|
-
isResolved = true;
|
|
333
|
-
if (err.code === 'EADDRINUSE') {
|
|
334
|
-
reject(new Error('Port 1455 is already in use. Check if another auth process is running.'));
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
reject(err);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
// 5분 타임아웃
|
|
342
|
-
timeoutId = setTimeout(() => {
|
|
343
|
-
if (!isResolved) {
|
|
344
|
-
isResolved = true;
|
|
345
|
-
closeServer();
|
|
346
|
-
reject(new Error('Authentication timeout (5 minutes)'));
|
|
347
|
-
}
|
|
348
|
-
}, 5 * 60 * 1000);
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
/**
|
|
352
|
-
* 유효한 액세스 토큰 가져오기 (필요시 갱신)
|
|
353
|
-
*/
|
|
354
|
-
export async function getValidAccessToken() {
|
|
355
|
-
const account = storage.loadAccount();
|
|
356
|
-
if (!account) {
|
|
357
|
-
throw new Error('No authenticated GPT account. Run vibe gpt auth to login.');
|
|
358
|
-
}
|
|
359
|
-
// accountId가 저장에 없으면 현재 토큰에서 추출
|
|
360
|
-
const accountId = account.accountId || extractAccountId(account.accessToken) || undefined;
|
|
361
|
-
// 토큰이 만료되었으면 갱신 (TokenRefresher로 race condition 방지)
|
|
362
|
-
if (storage.isTokenExpired(account)) {
|
|
363
|
-
const result = await tokenRefresher.refreshWithLock('gpt', async () => {
|
|
364
|
-
const newTokens = await refreshAccessToken(account.refreshToken);
|
|
365
|
-
storage.updateAccessToken(newTokens.accessToken, newTokens.refreshToken, newTokens.expires);
|
|
366
|
-
return {
|
|
367
|
-
accessToken: newTokens.accessToken,
|
|
368
|
-
refreshToken: newTokens.refreshToken,
|
|
369
|
-
expires: newTokens.expires,
|
|
370
|
-
};
|
|
371
|
-
}, () => {
|
|
372
|
-
const current = storage.loadAccount();
|
|
373
|
-
if (!current)
|
|
374
|
-
return null;
|
|
375
|
-
return { accessToken: current.accessToken, expires: current.expires };
|
|
376
|
-
});
|
|
377
|
-
return {
|
|
378
|
-
accessToken: result.accessToken,
|
|
379
|
-
email: account.email,
|
|
380
|
-
accountId,
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
return {
|
|
384
|
-
accessToken: account.accessToken,
|
|
385
|
-
email: account.email,
|
|
386
|
-
accountId,
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
//# sourceMappingURL=gpt-oauth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gpt-oauth.js","sourceRoot":"","sources":["../../../src/infra/lib/gpt-oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GPT OAuth 토큰 저장/로드 (단일 계정)
|
|
3
|
-
*/
|
|
4
|
-
export interface GptAccount {
|
|
5
|
-
email: string;
|
|
6
|
-
accessToken: string;
|
|
7
|
-
refreshToken: string;
|
|
8
|
-
idToken?: string;
|
|
9
|
-
expires: number;
|
|
10
|
-
accountId?: string;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* 설정 디렉토리 경로 반환
|
|
14
|
-
*/
|
|
15
|
-
export declare function getConfigDir(): string;
|
|
16
|
-
/**
|
|
17
|
-
* 토큰 저장 경로 반환
|
|
18
|
-
*/
|
|
19
|
-
export declare function getStoragePath(): string;
|
|
20
|
-
/**
|
|
21
|
-
* 계정 정보 로드
|
|
22
|
-
*/
|
|
23
|
-
export declare function loadAccount(): GptAccount | null;
|
|
24
|
-
/**
|
|
25
|
-
* 계정 정보 저장
|
|
26
|
-
*/
|
|
27
|
-
export declare function saveAccount(account: GptAccount): void;
|
|
28
|
-
/**
|
|
29
|
-
* 계정 삭제
|
|
30
|
-
*/
|
|
31
|
-
export declare function clearAccount(): void;
|
|
32
|
-
/**
|
|
33
|
-
* 토큰 만료 여부 확인
|
|
34
|
-
*/
|
|
35
|
-
export declare function isTokenExpired(account: GptAccount | null): boolean;
|
|
36
|
-
/**
|
|
37
|
-
* 액세스 토큰 업데이트
|
|
38
|
-
*/
|
|
39
|
-
export declare function updateAccessToken(accessToken: string, refreshToken: string | null, expires: number): void;
|
|
40
|
-
//# sourceMappingURL=gpt-storage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gpt-storage.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/gpt-storage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAOrC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAWD;;GAEG;AACH,wBAAgB,WAAW,IAAI,UAAU,GAAG,IAAI,CAwB/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAIrD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CASnC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAMlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,OAAO,EAAE,MAAM,GACd,IAAI,CAUN"}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GPT OAuth 토큰 저장/로드 (단일 계정)
|
|
3
|
-
*/
|
|
4
|
-
import fs from 'fs';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import os from 'os';
|
|
7
|
-
/**
|
|
8
|
-
* 설정 디렉토리 경로 반환
|
|
9
|
-
*/
|
|
10
|
-
export function getConfigDir() {
|
|
11
|
-
const platform = process.platform;
|
|
12
|
-
if (platform === 'win32') {
|
|
13
|
-
return path.join(process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming'), 'vibe');
|
|
14
|
-
}
|
|
15
|
-
const xdgConfig = process.env.XDG_CONFIG_HOME || path.join(os.homedir(), '.config');
|
|
16
|
-
return path.join(xdgConfig, 'vibe');
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* 토큰 저장 경로 반환
|
|
20
|
-
*/
|
|
21
|
-
export function getStoragePath() {
|
|
22
|
-
return path.join(getConfigDir(), 'gpt-auth.json');
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* 디렉토리 생성 (존재하지 않으면)
|
|
26
|
-
*/
|
|
27
|
-
function ensureDir(dir) {
|
|
28
|
-
if (!fs.existsSync(dir)) {
|
|
29
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* 계정 정보 로드
|
|
34
|
-
*/
|
|
35
|
-
export function loadAccount() {
|
|
36
|
-
try {
|
|
37
|
-
const storagePath = getStoragePath();
|
|
38
|
-
if (!fs.existsSync(storagePath)) {
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
const content = fs.readFileSync(storagePath, 'utf-8');
|
|
42
|
-
const data = JSON.parse(content);
|
|
43
|
-
// 레거시 멀티 계정 포맷 마이그레이션
|
|
44
|
-
if (data && typeof data === 'object' && 'accounts' in data) {
|
|
45
|
-
const legacy = data;
|
|
46
|
-
if (legacy.accounts.length === 0)
|
|
47
|
-
return null;
|
|
48
|
-
const idx = Math.min(legacy.activeIndex || 0, legacy.accounts.length - 1);
|
|
49
|
-
const account = legacy.accounts[idx];
|
|
50
|
-
// 새 포맷으로 저장
|
|
51
|
-
saveAccount(account);
|
|
52
|
-
return account;
|
|
53
|
-
}
|
|
54
|
-
return data;
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* 계정 정보 저장
|
|
62
|
-
*/
|
|
63
|
-
export function saveAccount(account) {
|
|
64
|
-
const storagePath = getStoragePath();
|
|
65
|
-
ensureDir(path.dirname(storagePath));
|
|
66
|
-
fs.writeFileSync(storagePath, JSON.stringify(account, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* 계정 삭제
|
|
70
|
-
*/
|
|
71
|
-
export function clearAccount() {
|
|
72
|
-
try {
|
|
73
|
-
const storagePath = getStoragePath();
|
|
74
|
-
if (fs.existsSync(storagePath)) {
|
|
75
|
-
fs.unlinkSync(storagePath);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
// ignore
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 토큰 만료 여부 확인
|
|
84
|
-
*/
|
|
85
|
-
export function isTokenExpired(account) {
|
|
86
|
-
if (!account || !account.expires) {
|
|
87
|
-
return true;
|
|
88
|
-
}
|
|
89
|
-
// 5분 여유를 두고 만료 확인
|
|
90
|
-
return Date.now() > account.expires - 5 * 60 * 1000;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* 액세스 토큰 업데이트
|
|
94
|
-
*/
|
|
95
|
-
export function updateAccessToken(accessToken, refreshToken, expires) {
|
|
96
|
-
const account = loadAccount();
|
|
97
|
-
if (!account)
|
|
98
|
-
return;
|
|
99
|
-
account.accessToken = accessToken;
|
|
100
|
-
if (refreshToken) {
|
|
101
|
-
account.refreshToken = refreshToken;
|
|
102
|
-
}
|
|
103
|
-
account.expires = expires;
|
|
104
|
-
saveAccount(account);
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=gpt-storage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gpt-storage.js","sourceRoot":"","sources":["../../../src/infra/lib/gpt-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vibe sync — Google Drive AppData OAuth 상수
|
|
3
|
-
* Google Cloud Console에서 Desktop OAuth 클라이언트 생성 후
|
|
4
|
-
* VIBE_SYNC_GOOGLE_CLIENT_ID 환경변수 또는 ~/.config/vibe/google-oauth-client.json 으로 설정
|
|
5
|
-
*/
|
|
6
|
-
export declare const SYNC_REDIRECT_PORT = 51122;
|
|
7
|
-
export declare const SYNC_REDIRECT_PATH = "/oauth-callback";
|
|
8
|
-
export declare const SYNC_REDIRECT_URI = "http://localhost:51122/oauth-callback";
|
|
9
|
-
export declare const SYNC_SCOPES: string[];
|
|
10
|
-
export declare const SYNC_OAUTH_AUTH_URL = "https://accounts.google.com/o/oauth2/auth";
|
|
11
|
-
export declare const SYNC_OAUTH_TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
12
|
-
export declare const SYNC_OAUTH_USERINFO_URL = "https://www.googleapis.com/oauth2/v1/userinfo?alt=json";
|
|
13
|
-
export declare const SYNC_DRIVE_APPDATA_FOLDER = "vibe-sync";
|
|
14
|
-
export declare const SYNC_FILE_AUTH = "vibe-auth.enc";
|
|
15
|
-
export declare const SYNC_FILE_MEMORY = "vibe-memory.enc";
|
|
16
|
-
export declare const SYNC_OAUTH_TIMEOUT_MS: number;
|
|
17
|
-
export declare function getSyncClientId(): string;
|
|
18
|
-
export declare function getSyncClientSecret(): string;
|
|
19
|
-
/** Check if OAuth credentials are available (env or JSON file) */
|
|
20
|
-
export declare function isGoogleOAuthConfigured(): boolean;
|
|
21
|
-
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/sync/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,eAAO,MAAM,iBAAiB,0CAAgE,CAAC;AAE/F,eAAO,MAAM,WAAW,UAUvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,8CAA8C,CAAC;AAC/E,eAAO,MAAM,oBAAoB,wCAAwC,CAAC;AAC1E,eAAO,MAAM,uBAAuB,2DAA2D,CAAC;AAEhG,eAAO,MAAM,yBAAyB,cAAc,CAAC;AACrD,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAC9C,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAElD,eAAO,MAAM,qBAAqB,QAAgB,CAAC;AA6BnD,wBAAgB,eAAe,IAAI,MAAM,CAUxC;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAM5C;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,IAAI,OAAO,CAGjD"}
|