repowise 0.1.4 → 0.1.6
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/bin/repowise.js +116 -14
- package/dist/src/commands/create.d.ts +1 -1
- package/dist/src/commands/create.d.ts.map +1 -1
- package/dist/src/commands/create.js +237 -2
- package/dist/src/commands/create.js.map +1 -1
- package/dist/src/commands/listen.d.ts +3 -2
- package/dist/src/commands/listen.d.ts.map +1 -1
- package/dist/src/commands/listen.js +45 -3
- package/dist/src/commands/listen.js.map +1 -1
- package/dist/src/commands/login.d.ts +4 -1
- package/dist/src/commands/login.d.ts.map +1 -1
- package/dist/src/commands/login.js +56 -2
- package/dist/src/commands/login.js.map +1 -1
- package/dist/src/commands/logout.d.ts +1 -1
- package/dist/src/commands/logout.d.ts.map +1 -1
- package/dist/src/commands/logout.js +10 -2
- package/dist/src/commands/logout.js.map +1 -1
- package/dist/src/commands/start.d.ts +2 -0
- package/dist/src/commands/start.d.ts.map +1 -0
- package/dist/src/commands/start.js +17 -0
- package/dist/src/commands/start.js.map +1 -0
- package/dist/src/commands/status.d.ts +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +61 -2
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/stop.d.ts +2 -0
- package/dist/src/commands/stop.d.ts.map +1 -0
- package/dist/src/commands/stop.js +17 -0
- package/dist/src/commands/stop.js.map +1 -0
- package/dist/src/lib/ai-tools.d.ts +23 -0
- package/dist/src/lib/ai-tools.d.ts.map +1 -0
- package/dist/src/lib/ai-tools.js +193 -0
- package/dist/src/lib/ai-tools.js.map +1 -0
- package/dist/src/lib/api.d.ts.map +1 -1
- package/dist/src/lib/api.js +25 -4
- package/dist/src/lib/api.js.map +1 -1
- package/dist/src/lib/auth.d.ts +18 -0
- package/dist/src/lib/auth.d.ts.map +1 -1
- package/dist/src/lib/auth.js +251 -7
- package/dist/src/lib/auth.js.map +1 -1
- package/dist/src/lib/config.d.ts +2 -0
- package/dist/src/lib/config.d.ts.map +1 -1
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/env.d.ts +10 -0
- package/dist/src/lib/env.d.ts.map +1 -0
- package/dist/src/lib/env.js +26 -0
- package/dist/src/lib/env.js.map +1 -0
- package/dist/src/lib/interview-handler.d.ts +2 -0
- package/dist/src/lib/interview-handler.d.ts.map +1 -0
- package/dist/src/lib/interview-handler.js +96 -0
- package/dist/src/lib/interview-handler.js.map +1 -0
- package/dist/src/lib/progress-renderer.d.ts +69 -0
- package/dist/src/lib/progress-renderer.d.ts.map +1 -0
- package/dist/src/lib/progress-renderer.js +186 -0
- package/dist/src/lib/progress-renderer.js.map +1 -0
- package/dist/src/lib/prompts.d.ts +6 -1
- package/dist/src/lib/prompts.d.ts.map +1 -1
- package/dist/src/lib/prompts.js +21 -3
- package/dist/src/lib/prompts.js.map +1 -1
- package/dist/src/types/index.d.ts +1 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/tsup.config.d.ts +3 -0
- package/dist/tsup.config.d.ts.map +1 -0
- package/dist/tsup.config.js +18 -0
- package/dist/tsup.config.js.map +1 -0
- package/package.json +1 -1
package/dist/src/lib/auth.js
CHANGED
|
@@ -1,27 +1,271 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { readFile, writeFile, mkdir, chmod, unlink } from 'node:fs/promises';
|
|
3
|
+
import http from 'node:http';
|
|
2
4
|
import { homedir } from 'node:os';
|
|
3
5
|
import { join } from 'node:path';
|
|
6
|
+
import { getEnvConfig } from './env.js';
|
|
4
7
|
const CONFIG_DIR = join(homedir(), '.repowise');
|
|
5
8
|
const CREDENTIALS_PATH = join(CONFIG_DIR, 'credentials.json');
|
|
9
|
+
export const CLI_CALLBACK_PORT = 19876;
|
|
10
|
+
const CALLBACK_TIMEOUT_MS = 120_000; // 2 minutes
|
|
11
|
+
// Cognito config — read lazily so tests can set env vars before function calls
|
|
12
|
+
function getCognitoConfig() {
|
|
13
|
+
const env = getEnvConfig();
|
|
14
|
+
return {
|
|
15
|
+
domain: process.env['REPOWISE_COGNITO_DOMAIN'] ?? env.cognitoDomain,
|
|
16
|
+
clientId: process.env['REPOWISE_COGNITO_CLIENT_ID'] ?? env.cognitoClientId,
|
|
17
|
+
region: process.env['REPOWISE_COGNITO_REGION'] ?? env.cognitoRegion,
|
|
18
|
+
customDomain: env.customDomain,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function getCognitoBaseUrl() {
|
|
22
|
+
const { domain, region, customDomain } = getCognitoConfig();
|
|
23
|
+
return customDomain ? `https://${domain}` : `https://${domain}.auth.${region}.amazoncognito.com`;
|
|
24
|
+
}
|
|
25
|
+
// --- PKCE (Proof Key for Code Exchange) ---
|
|
26
|
+
export function generateCodeVerifier() {
|
|
27
|
+
return randomBytes(32).toString('base64url');
|
|
28
|
+
}
|
|
29
|
+
export function generateCodeChallenge(verifier) {
|
|
30
|
+
return createHash('sha256').update(verifier).digest('base64url');
|
|
31
|
+
}
|
|
32
|
+
export function generateState() {
|
|
33
|
+
return randomBytes(32).toString('hex');
|
|
34
|
+
}
|
|
35
|
+
// --- Cognito URL Construction ---
|
|
36
|
+
export function getAuthorizeUrl(codeChallenge, state) {
|
|
37
|
+
const { clientId } = getCognitoConfig();
|
|
38
|
+
if (!clientId) {
|
|
39
|
+
throw new Error('Missing REPOWISE_COGNITO_CLIENT_ID environment variable. Configure it before running login.');
|
|
40
|
+
}
|
|
41
|
+
const params = new URLSearchParams({
|
|
42
|
+
response_type: 'code',
|
|
43
|
+
client_id: clientId,
|
|
44
|
+
redirect_uri: `http://localhost:${CLI_CALLBACK_PORT}/callback`,
|
|
45
|
+
code_challenge: codeChallenge,
|
|
46
|
+
code_challenge_method: 'S256',
|
|
47
|
+
scope: 'openid email profile',
|
|
48
|
+
state,
|
|
49
|
+
});
|
|
50
|
+
return `${getCognitoBaseUrl()}/oauth2/authorize?${params.toString()}`;
|
|
51
|
+
}
|
|
52
|
+
function getTokenUrl() {
|
|
53
|
+
return `${getCognitoBaseUrl()}/oauth2/token`;
|
|
54
|
+
}
|
|
55
|
+
export function startCallbackServer() {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
const server = http.createServer((req, res) => {
|
|
58
|
+
// req.url is always defined for incoming HTTP requests (only undefined for client requests)
|
|
59
|
+
const url = new URL(req.url, `http://localhost:${CLI_CALLBACK_PORT}`);
|
|
60
|
+
if (url.pathname !== '/callback') {
|
|
61
|
+
res.writeHead(404);
|
|
62
|
+
res.end();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const code = url.searchParams.get('code');
|
|
66
|
+
const state = url.searchParams.get('state');
|
|
67
|
+
const error = url.searchParams.get('error');
|
|
68
|
+
if (error) {
|
|
69
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
70
|
+
res.end(callbackPage('Authentication Failed', 'Something went wrong. Please close this tab and try again.', true));
|
|
71
|
+
server.close();
|
|
72
|
+
reject(new Error(`Authentication error: ${error}`));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!code || !state) {
|
|
76
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
77
|
+
res.end(callbackPage('Missing Parameters', 'The callback was missing required data. Please close this tab and try again.', true));
|
|
78
|
+
server.close();
|
|
79
|
+
reject(new Error('Missing code or state in callback'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
83
|
+
res.end(callbackPage('Authentication Successful', 'You can close this tab and return to the terminal.', false));
|
|
84
|
+
server.close();
|
|
85
|
+
resolve({ code, state });
|
|
86
|
+
});
|
|
87
|
+
server.listen(CLI_CALLBACK_PORT, '127.0.0.1');
|
|
88
|
+
server.on('error', (err) => {
|
|
89
|
+
if (err.code === 'EADDRINUSE') {
|
|
90
|
+
reject(new Error(`Port ${CLI_CALLBACK_PORT} is already in use. Close the conflicting process and try again.`));
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
reject(err);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
const timeout = setTimeout(() => {
|
|
97
|
+
server.close();
|
|
98
|
+
reject(new Error('Authentication timed out. Please try again.'));
|
|
99
|
+
}, CALLBACK_TIMEOUT_MS);
|
|
100
|
+
server.on('close', () => clearTimeout(timeout));
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// --- Token Exchange ---
|
|
104
|
+
export async function exchangeCodeForTokens(code, codeVerifier) {
|
|
105
|
+
const response = await fetch(getTokenUrl(), {
|
|
106
|
+
method: 'POST',
|
|
107
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
108
|
+
body: new URLSearchParams({
|
|
109
|
+
grant_type: 'authorization_code',
|
|
110
|
+
client_id: getCognitoConfig().clientId,
|
|
111
|
+
redirect_uri: `http://localhost:${CLI_CALLBACK_PORT}/callback`,
|
|
112
|
+
code,
|
|
113
|
+
code_verifier: codeVerifier,
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
const text = await response.text();
|
|
118
|
+
throw new Error(`Token exchange failed: ${response.status} ${text}`);
|
|
119
|
+
}
|
|
120
|
+
const data = (await response.json());
|
|
121
|
+
return {
|
|
122
|
+
accessToken: data.access_token,
|
|
123
|
+
refreshToken: data.refresh_token,
|
|
124
|
+
idToken: data.id_token,
|
|
125
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// --- Token Refresh ---
|
|
129
|
+
export async function refreshTokens(refreshToken) {
|
|
130
|
+
const response = await fetch(getTokenUrl(), {
|
|
131
|
+
method: 'POST',
|
|
132
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
133
|
+
body: new URLSearchParams({
|
|
134
|
+
grant_type: 'refresh_token',
|
|
135
|
+
client_id: getCognitoConfig().clientId,
|
|
136
|
+
refresh_token: refreshToken,
|
|
137
|
+
}),
|
|
138
|
+
});
|
|
139
|
+
if (!response.ok) {
|
|
140
|
+
throw new Error(`Token refresh failed: ${response.status}`);
|
|
141
|
+
}
|
|
142
|
+
const data = (await response.json());
|
|
143
|
+
return {
|
|
144
|
+
accessToken: data.access_token,
|
|
145
|
+
refreshToken, // Cognito does not return a new refresh token
|
|
146
|
+
idToken: data.id_token,
|
|
147
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// --- Credential Storage ---
|
|
6
151
|
export async function getStoredCredentials() {
|
|
7
152
|
try {
|
|
8
153
|
const data = await readFile(CREDENTIALS_PATH, 'utf-8');
|
|
9
154
|
return JSON.parse(data);
|
|
10
155
|
}
|
|
11
|
-
catch {
|
|
12
|
-
|
|
156
|
+
catch (err) {
|
|
157
|
+
// File doesn't exist or corrupt JSON — treat as no credentials
|
|
158
|
+
if (err.code === 'ENOENT' || err instanceof SyntaxError) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
// Permission errors (EPERM, EACCES) should surface — the file exists but can't be read
|
|
162
|
+
throw err;
|
|
13
163
|
}
|
|
14
164
|
}
|
|
15
165
|
export async function storeCredentials(credentials) {
|
|
16
|
-
await mkdir(CONFIG_DIR, { recursive: true });
|
|
17
|
-
await writeFile(CREDENTIALS_PATH, JSON.stringify(credentials, null, 2)
|
|
166
|
+
await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
167
|
+
await writeFile(CREDENTIALS_PATH, JSON.stringify(credentials, null, 2));
|
|
168
|
+
await chmod(CREDENTIALS_PATH, 0o600);
|
|
18
169
|
}
|
|
19
170
|
export async function clearCredentials() {
|
|
20
171
|
try {
|
|
21
|
-
await
|
|
172
|
+
await unlink(CREDENTIALS_PATH);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err.code !== 'ENOENT')
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export async function getValidCredentials() {
|
|
180
|
+
const creds = await getStoredCredentials();
|
|
181
|
+
if (!creds)
|
|
182
|
+
return null;
|
|
183
|
+
// Refresh if within 5 minutes of expiry
|
|
184
|
+
if (Date.now() > creds.expiresAt - 5 * 60 * 1000) {
|
|
185
|
+
try {
|
|
186
|
+
const refreshed = await refreshTokens(creds.refreshToken);
|
|
187
|
+
await storeCredentials(refreshed);
|
|
188
|
+
return refreshed;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
await clearCredentials();
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return creds;
|
|
196
|
+
}
|
|
197
|
+
// --- Auto-Login (Story 2.1) ---
|
|
198
|
+
export async function performLogin() {
|
|
199
|
+
const codeVerifier = generateCodeVerifier();
|
|
200
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
201
|
+
const state = generateState();
|
|
202
|
+
const authorizeUrl = getAuthorizeUrl(codeChallenge, state);
|
|
203
|
+
const callbackPromise = startCallbackServer();
|
|
204
|
+
try {
|
|
205
|
+
const open = (await import('open')).default;
|
|
206
|
+
await open(authorizeUrl);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Print URL as fallback
|
|
210
|
+
console.log(`\nOpen this URL in your browser to authenticate:\n`);
|
|
211
|
+
console.log(authorizeUrl);
|
|
212
|
+
}
|
|
213
|
+
const { code, state: returnedState } = await callbackPromise;
|
|
214
|
+
if (returnedState !== state) {
|
|
215
|
+
throw new Error('State mismatch — possible CSRF attack. Please try again.');
|
|
216
|
+
}
|
|
217
|
+
const credentials = await exchangeCodeForTokens(code, codeVerifier);
|
|
218
|
+
await storeCredentials(credentials);
|
|
219
|
+
return credentials;
|
|
220
|
+
}
|
|
221
|
+
// --- ID Token Decoding ---
|
|
222
|
+
function callbackPage(title, message, isError) {
|
|
223
|
+
const icon = isError
|
|
224
|
+
? '<svg width="48" height="48" fill="none" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" stroke="#ef4444" stroke-width="2"/><path stroke="#ef4444" stroke-width="2" stroke-linecap="round" d="M15 9l-6 6M9 9l6 6"/></svg>'
|
|
225
|
+
: '<svg width="48" height="48" fill="none" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" stroke="#10b981" stroke-width="2"/><path stroke="#10b981" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M8 12l3 3 5-5"/></svg>';
|
|
226
|
+
return `<!DOCTYPE html>
|
|
227
|
+
<html lang="en">
|
|
228
|
+
<head>
|
|
229
|
+
<meta charset="UTF-8">
|
|
230
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
231
|
+
<title>${title} — RepoWise</title>
|
|
232
|
+
<link rel="icon" href="https://staging.repowise.ai/favicon.svg" type="image/svg+xml">
|
|
233
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
234
|
+
<style>
|
|
235
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
236
|
+
body { font-family: 'Inter', system-ui, sans-serif; background: #0a0b14; color: #e4e4e7; min-height: 100vh; display: flex; align-items: center; justify-content: center; }
|
|
237
|
+
.card { text-align: center; max-width: 440px; padding: 48px 40px; }
|
|
238
|
+
.logo { margin-bottom: 32px; }
|
|
239
|
+
.logo svg { height: 48px; width: auto; }
|
|
240
|
+
.icon { margin-bottom: 20px; }
|
|
241
|
+
h1 { font-size: 24px; font-weight: 700; margin-bottom: 8px; color: ${isError ? '#ef4444' : '#e4e4e7'}; }
|
|
242
|
+
p { font-size: 15px; color: #a1a1aa; line-height: 1.5; }
|
|
243
|
+
</style>
|
|
244
|
+
</head>
|
|
245
|
+
<body>
|
|
246
|
+
<div class="card">
|
|
247
|
+
<div class="logo">
|
|
248
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 50" height="48">
|
|
249
|
+
<text x="0" y="38" font-family="Inter, system-ui, sans-serif" font-weight="700" font-size="36" fill="#e4e4e7">Repo<tspan fill="#6c5ce7">Wise</tspan></text>
|
|
250
|
+
</svg>
|
|
251
|
+
</div>
|
|
252
|
+
<div class="icon">${icon}</div>
|
|
253
|
+
<h1>${title}</h1>
|
|
254
|
+
<p>${message}</p>
|
|
255
|
+
</div>
|
|
256
|
+
</body>
|
|
257
|
+
</html>`;
|
|
258
|
+
}
|
|
259
|
+
export function decodeIdToken(idToken) {
|
|
260
|
+
try {
|
|
261
|
+
const parts = idToken.split('.');
|
|
262
|
+
if (parts.length < 2)
|
|
263
|
+
return { email: 'unknown' };
|
|
264
|
+
const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString());
|
|
265
|
+
return { email: payload.email ?? 'unknown', tenantId: payload['custom:tenant_id'] };
|
|
22
266
|
}
|
|
23
267
|
catch {
|
|
24
|
-
|
|
268
|
+
return { email: 'unknown' };
|
|
25
269
|
}
|
|
26
270
|
}
|
|
27
271
|
//# sourceMappingURL=auth.js.map
|
package/dist/src/lib/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/src/lib/config.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export interface CliConfig {
|
|
2
2
|
apiUrl?: string;
|
|
3
3
|
wsUrl?: string;
|
|
4
|
+
aiTools?: import('./ai-tools.js').AiTool[];
|
|
5
|
+
contextFolder?: string;
|
|
4
6
|
}
|
|
5
7
|
export declare function getConfig(): Promise<CliConfig>;
|
|
6
8
|
export declare function saveConfig(config: CliConfig): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,eAAe,EAAE,MAAM,EAAE,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAOpD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AASpD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAiB;IAChD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function setStagingMode(value: boolean): void;
|
|
2
|
+
export declare function isStagingMode(): boolean;
|
|
3
|
+
export declare function getEnvConfig(): {
|
|
4
|
+
apiUrl: string;
|
|
5
|
+
cognitoDomain: string;
|
|
6
|
+
cognitoClientId: string;
|
|
7
|
+
cognitoRegion: string;
|
|
8
|
+
customDomain: boolean;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/lib/env.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEnD;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAkBD,wBAAgB,YAAY;;;;;;EAE3B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Global environment toggle — set by --staging flag in bin/repowise.ts
|
|
2
|
+
let staging = false;
|
|
3
|
+
export function setStagingMode(value) {
|
|
4
|
+
staging = value;
|
|
5
|
+
}
|
|
6
|
+
export function isStagingMode() {
|
|
7
|
+
return staging;
|
|
8
|
+
}
|
|
9
|
+
const PRODUCTION = {
|
|
10
|
+
apiUrl: 'https://api.repowise.ai',
|
|
11
|
+
cognitoDomain: 'auth.repowise.ai',
|
|
12
|
+
cognitoClientId: '', // TODO: set after production Cognito deploy
|
|
13
|
+
cognitoRegion: 'us-east-1',
|
|
14
|
+
customDomain: true,
|
|
15
|
+
};
|
|
16
|
+
const STAGING = {
|
|
17
|
+
apiUrl: 'https://staging-api.repowise.ai',
|
|
18
|
+
cognitoDomain: 'auth-staging.repowise.ai',
|
|
19
|
+
cognitoClientId: '7h0l0dhjcb1v5erer0gaclv0q6',
|
|
20
|
+
cognitoRegion: 'us-east-1',
|
|
21
|
+
customDomain: true,
|
|
22
|
+
};
|
|
23
|
+
export function getEnvConfig() {
|
|
24
|
+
return staging ? STAGING : PRODUCTION;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/lib/env.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,GAAG,KAAK,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,MAAM,EAAE,yBAAyB;IACjC,aAAa,EAAE,kBAAkB;IACjC,eAAe,EAAE,EAAE,EAAE,4CAA4C;IACjE,aAAa,EAAE,WAAW;IAC1B,YAAY,EAAE,IAAI;CACnB,CAAC;AAEF,MAAM,OAAO,GAAG;IACd,MAAM,EAAE,iCAAiC;IACzC,aAAa,EAAE,0BAA0B;IACzC,eAAe,EAAE,4BAA4B;IAC7C,aAAa,EAAE,WAAW;IAC1B,YAAY,EAAE,IAAI;CACnB,CAAC;AAEF,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interview-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/interview-handler.ts"],"names":[],"mappings":"AAQA,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,EACxB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAmGf"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { input } from '@inquirer/prompts';
|
|
3
|
+
import { apiRequest } from './api.js';
|
|
4
|
+
const INTERVIEW_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes per question
|
|
5
|
+
let questionCounter = 0;
|
|
6
|
+
export async function handleInterview(syncId, questionId, questionText, questionContext, estimatedQuestions) {
|
|
7
|
+
questionCounter++;
|
|
8
|
+
// Show section header on first question
|
|
9
|
+
if (questionCounter === 1) {
|
|
10
|
+
console.log('');
|
|
11
|
+
console.log(chalk.cyan.bold(' ── Interview ──'));
|
|
12
|
+
console.log(chalk.dim(' Help us understand your project better. Answer a few short'));
|
|
13
|
+
console.log(chalk.dim(' questions so we can generate more relevant context files.'));
|
|
14
|
+
if (estimatedQuestions) {
|
|
15
|
+
console.log(chalk.dim(` The AI estimates ${chalk.white(`~${estimatedQuestions}`)} questions based on your codebase.`));
|
|
16
|
+
}
|
|
17
|
+
console.log(chalk.dim(' Type "skip" to skip a question, "done" to finish early.'));
|
|
18
|
+
}
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(chalk.cyan.bold(` Question ${questionCounter}${estimatedQuestions ? `/${estimatedQuestions}` : ''}`));
|
|
21
|
+
if (questionContext) {
|
|
22
|
+
console.log(chalk.dim(` ${questionContext}`));
|
|
23
|
+
}
|
|
24
|
+
console.log(` ${questionText}`);
|
|
25
|
+
let answer;
|
|
26
|
+
try {
|
|
27
|
+
answer = await Promise.race([
|
|
28
|
+
input({
|
|
29
|
+
message: chalk.cyan('>'),
|
|
30
|
+
theme: { prefix: ' ' },
|
|
31
|
+
}),
|
|
32
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('INTERVIEW_TIMEOUT')), INTERVIEW_TIMEOUT_MS)),
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (err instanceof Error && err.message === 'INTERVIEW_TIMEOUT') {
|
|
37
|
+
console.log(chalk.yellow(' Timed out — auto-skipping this question.'));
|
|
38
|
+
answer = 'skip';
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Some other error (e.g., user pressed Ctrl+C on the prompt)
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const trimmed = answer.trim();
|
|
46
|
+
let action;
|
|
47
|
+
let answerText = '';
|
|
48
|
+
if (trimmed.toLowerCase() === 'done') {
|
|
49
|
+
action = 'done';
|
|
50
|
+
}
|
|
51
|
+
else if (trimmed === '' || trimmed.toLowerCase() === 'skip') {
|
|
52
|
+
action = 'skip';
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
action = 'answer';
|
|
56
|
+
answerText = trimmed;
|
|
57
|
+
}
|
|
58
|
+
// Submit answer with graceful network error recovery
|
|
59
|
+
try {
|
|
60
|
+
await apiRequest(`/v1/sync/${syncId}/answer`, {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
body: JSON.stringify({ questionId, answerText, action }),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
// If the pipeline already moved past interview, that's okay
|
|
67
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
68
|
+
if (message.includes('not awaiting input') || message.includes('expired')) {
|
|
69
|
+
console.log(chalk.dim(' Pipeline has already moved on — continuing.'));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Retry once for transient network errors
|
|
73
|
+
try {
|
|
74
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
75
|
+
await apiRequest(`/v1/sync/${syncId}/answer`, {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
body: JSON.stringify({ questionId, answerText, action }),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
console.log(chalk.yellow(' Could not submit answer — pipeline will continue.'));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (action === 'done') {
|
|
86
|
+
console.log(chalk.dim(' Interview ended early.'));
|
|
87
|
+
}
|
|
88
|
+
else if (action === 'skip') {
|
|
89
|
+
console.log(chalk.dim(' Skipped.'));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log(chalk.dim(' Answer recorded.'));
|
|
93
|
+
}
|
|
94
|
+
console.log('');
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=interview-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interview-handler.js","sourceRoot":"","sources":["../../../src/lib/interview-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Ora } from 'ora';
|
|
2
|
+
interface DiscoveryResult {
|
|
3
|
+
languages: Array<{
|
|
4
|
+
name: string;
|
|
5
|
+
percentage: number;
|
|
6
|
+
}>;
|
|
7
|
+
frameworks: Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
}>;
|
|
10
|
+
structureType: string;
|
|
11
|
+
fileCount: number;
|
|
12
|
+
existingDocs: string[];
|
|
13
|
+
fileTree?: Array<{
|
|
14
|
+
path: string;
|
|
15
|
+
type: 'blob' | 'tree';
|
|
16
|
+
}>;
|
|
17
|
+
estimatedInterviewQuestions?: number;
|
|
18
|
+
}
|
|
19
|
+
interface ScanProgress {
|
|
20
|
+
currentBatch: number;
|
|
21
|
+
totalBatches: number;
|
|
22
|
+
summary?: {
|
|
23
|
+
totalFiles: number;
|
|
24
|
+
totalFunctions: number;
|
|
25
|
+
totalClasses: number;
|
|
26
|
+
totalEndpoints: number;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
interface GenerationProgress {
|
|
30
|
+
currentFile: number;
|
|
31
|
+
totalFiles: number;
|
|
32
|
+
currentFileName: string;
|
|
33
|
+
}
|
|
34
|
+
interface ValidationProgress {
|
|
35
|
+
round: number;
|
|
36
|
+
maxRounds: number;
|
|
37
|
+
personaResults: Array<{
|
|
38
|
+
persona: string;
|
|
39
|
+
score: string;
|
|
40
|
+
}>;
|
|
41
|
+
status: string;
|
|
42
|
+
}
|
|
43
|
+
interface SyncStatusResponse {
|
|
44
|
+
currentStep?: string;
|
|
45
|
+
stepLabel?: string;
|
|
46
|
+
progressPercentage?: number;
|
|
47
|
+
discoveryResult?: DiscoveryResult | null;
|
|
48
|
+
scanProgress?: ScanProgress | null;
|
|
49
|
+
generationProgress?: GenerationProgress | null;
|
|
50
|
+
validationProgress?: ValidationProgress | null;
|
|
51
|
+
privacyShieldEnabled?: boolean;
|
|
52
|
+
}
|
|
53
|
+
export declare class ProgressRenderer {
|
|
54
|
+
private privacyShieldShown;
|
|
55
|
+
private discoveryShown;
|
|
56
|
+
private scanSummaryShown;
|
|
57
|
+
private validationShown;
|
|
58
|
+
private lastValidationRound;
|
|
59
|
+
private shownPersonas;
|
|
60
|
+
renderPrivacyShield(enabled: boolean, spinner: Ora): void;
|
|
61
|
+
renderDiscovery(result: DiscoveryResult, spinner: Ora): void;
|
|
62
|
+
private renderTree;
|
|
63
|
+
renderScanSummary(summary: NonNullable<ScanProgress['summary']>, spinner: Ora): void;
|
|
64
|
+
renderValidation(progress: ValidationProgress, spinner: Ora): void;
|
|
65
|
+
getSpinnerText(syncResult: SyncStatusResponse): string;
|
|
66
|
+
update(syncResult: SyncStatusResponse, spinner: Ora): void;
|
|
67
|
+
}
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=progress-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-renderer.d.ts","sourceRoot":"","sources":["../../../src/lib/progress-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,UAAU,eAAe;IACvB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,aAAa,CAAqB;IAE1C,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;IAkBzD,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;IAkC5D,OAAO,CAAC,UAAU;IA0DlB,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;IAcpF,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;IAsClE,cAAc,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM;IA0BtD,MAAM,CAAC,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;CAwB3D"}
|