ft-scout 5.0.0 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.firebase/hosting.d2Vi.cache +4 -4
  2. package/bin/src/commands/agent.d.ts.map +1 -1
  3. package/bin/src/commands/agent.js +29 -2
  4. package/bin/src/commands/agent.js.map +1 -1
  5. package/bin/src/commands/audit.d.ts.map +1 -1
  6. package/bin/src/commands/audit.js +29 -10
  7. package/bin/src/commands/audit.js.map +1 -1
  8. package/bin/src/commands/authCommand.d.ts.map +1 -1
  9. package/bin/src/commands/authCommand.js +20 -8
  10. package/bin/src/commands/authCommand.js.map +1 -1
  11. package/bin/src/commands/dashboard.d.ts.map +1 -1
  12. package/bin/src/commands/dashboard.js +32 -18
  13. package/bin/src/commands/dashboard.js.map +1 -1
  14. package/bin/src/commands/login.d.ts.map +1 -1
  15. package/bin/src/commands/login.js +108 -10
  16. package/bin/src/commands/login.js.map +1 -1
  17. package/bin/src/commands/risky.d.ts.map +1 -1
  18. package/bin/src/commands/risky.js +32 -13
  19. package/bin/src/commands/risky.js.map +1 -1
  20. package/bin/src/commands/signup.d.ts.map +1 -1
  21. package/bin/src/commands/signup.js +29 -11
  22. package/bin/src/commands/signup.js.map +1 -1
  23. package/bin/src/discovery/messages.js +1 -1
  24. package/bin/src/discovery/messages.js.map +1 -1
  25. package/bin/src/index.js +8 -5
  26. package/bin/src/index.js.map +1 -1
  27. package/bin/src/server/server.d.ts.map +1 -0
  28. package/bin/src/server/server.js +207 -0
  29. package/bin/src/server/server.js.map +1 -0
  30. package/bin/src/utils/auth.d.ts.map +1 -1
  31. package/bin/src/utils/auth.js +70 -0
  32. package/bin/src/utils/auth.js.map +1 -1
  33. package/bin/src/utils/branding.js +1 -1
  34. package/bin/src/utils/holoseneAuth.d.ts.map +1 -0
  35. package/bin/src/utils/holoseneAuth.js +179 -0
  36. package/bin/src/utils/holoseneAuth.js.map +1 -0
  37. package/firebase-debug.log +31 -0
  38. package/package.json +2 -2
  39. package/web/ScoutFavicon.png +0 -0
  40. package/web/app.js +563 -615
  41. package/web/styles.css +957 -512
  42. package/web/favicon.svg +0 -39
@@ -0,0 +1,207 @@
1
+ import http from 'http';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { exec } from 'child_process';
5
+ import { fileURLToPath } from 'url';
6
+ import { loadAuthConfig, saveAuthConfig, clearAuthConfig, isLoggedIn } from '../utils/auth.js';
7
+ const DEFAULT_PORT = 9120;
8
+ function getPackageRoot() {
9
+ let currentDir = path.dirname(fileURLToPath(import.meta.url));
10
+ while (currentDir !== path.dirname(currentDir)) {
11
+ if (fs.existsSync(path.join(currentDir, 'package.json')) && fs.existsSync(path.join(currentDir, 'web', 'index.html'))) {
12
+ return currentDir;
13
+ }
14
+ currentDir = path.dirname(currentDir);
15
+ }
16
+ return process.cwd();
17
+ }
18
+ function getWebDir() {
19
+ const pkgRoot = getPackageRoot();
20
+ const possiblePaths = [
21
+ path.join(pkgRoot, 'web'),
22
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../web'),
23
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../web'),
24
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../web'),
25
+ path.join(process.cwd(), 'web'),
26
+ ];
27
+ for (const p of possiblePaths) {
28
+ if (fs.existsSync(p) && fs.existsSync(path.join(p, 'index.html'))) {
29
+ return p;
30
+ }
31
+ }
32
+ return path.join(pkgRoot, 'web');
33
+ }
34
+ function getMimeType(filePath) {
35
+ const ext = path.extname(filePath).toLowerCase();
36
+ switch (ext) {
37
+ case '.html': return 'text/html; charset=utf-8';
38
+ case '.css': return 'text/css; charset=utf-8';
39
+ case '.js': return 'application/javascript; charset=utf-8';
40
+ case '.json': return 'application/json; charset=utf-8';
41
+ case '.png': return 'image/png';
42
+ case '.jpg':
43
+ case '.jpeg': return 'image/jpeg';
44
+ case '.svg': return 'image/svg+xml';
45
+ case '.ico': return 'image/x-icon';
46
+ default: return 'text/plain; charset=utf-8';
47
+ }
48
+ }
49
+ export function startDashboardServer(port = DEFAULT_PORT) {
50
+ return new Promise((resolve, reject) => {
51
+ const webDir = getWebDir();
52
+ const server = http.createServer(async (req, res) => {
53
+ // Enable CORS for cross-origin local dashboard sync
54
+ res.setHeader('Access-Control-Allow-Origin', '*');
55
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
56
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
57
+ if (req.method === 'OPTIONS') {
58
+ res.writeHead(204);
59
+ res.end();
60
+ return;
61
+ }
62
+ const reqUrl = req.url || '/';
63
+ const parsedUrl = new URL(reqUrl, `http://localhost:${port}`);
64
+ const pathname = parsedUrl.pathname;
65
+ // API Endpoints
66
+ if (pathname.startsWith('/api/')) {
67
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
68
+ // GET /api/status - Live CLI & Auth state
69
+ if (pathname === '/api/status' && req.method === 'GET') {
70
+ const authConfig = loadAuthConfig();
71
+ const scanReportPath = path.join(process.cwd(), '.ft', 'scan-report.json');
72
+ let scanReport = null;
73
+ if (fs.existsSync(scanReportPath)) {
74
+ try {
75
+ scanReport = JSON.parse(fs.readFileSync(scanReportPath, 'utf-8'));
76
+ }
77
+ catch { }
78
+ }
79
+ res.writeHead(200);
80
+ res.end(JSON.stringify({
81
+ status: 'ok',
82
+ serverConnected: true,
83
+ isLoggedIn: isLoggedIn(),
84
+ auth: authConfig,
85
+ repoPath: process.cwd(),
86
+ repoName: path.basename(process.cwd()),
87
+ scanReport,
88
+ }));
89
+ return;
90
+ }
91
+ // POST /api/save-auth - Save authentication state to ~/.ft/auth.json
92
+ if (pathname === '/api/save-auth' && req.method === 'POST') {
93
+ let body = '';
94
+ req.on('data', chunk => body += chunk);
95
+ req.on('end', () => {
96
+ try {
97
+ const data = JSON.parse(body);
98
+ const existing = loadAuthConfig();
99
+ const updated = {
100
+ token: data.token || existing.token,
101
+ refreshToken: data.refreshToken || existing.refreshToken,
102
+ user: data.user || existing.user,
103
+ tenantId: data.tenantId || existing.tenantId || 'ft-scout-auth-gc2v5',
104
+ provider: data.provider || existing.provider || 'firebase',
105
+ loggedInAt: new Date().toISOString(),
106
+ creditsUsed: typeof data.creditsUsed === 'number' ? data.creditsUsed : (existing.creditsUsed ?? 0),
107
+ creditsTotal: typeof data.creditsTotal === 'number' ? data.creditsTotal : (existing.creditsTotal ?? 100),
108
+ currentTier: data.currentTier || existing.currentTier || 'free',
109
+ renewAt: data.renewAt || existing.renewAt,
110
+ byokEnabled: typeof data.byokEnabled === 'boolean' ? data.byokEnabled : existing.byokEnabled,
111
+ customLlmProvider: data.customLlmProvider || existing.customLlmProvider || 'gemini',
112
+ customApiKey: data.customApiKey !== undefined ? data.customApiKey : existing.customApiKey,
113
+ customBaseUrl: data.customBaseUrl !== undefined ? data.customBaseUrl : existing.customBaseUrl,
114
+ };
115
+ saveAuthConfig(updated);
116
+ res.writeHead(200);
117
+ res.end(JSON.stringify({ success: true, auth: updated }));
118
+ }
119
+ catch (err) {
120
+ res.writeHead(400);
121
+ res.end(JSON.stringify({ success: false, error: err.message || 'Invalid JSON' }));
122
+ }
123
+ });
124
+ return;
125
+ }
126
+ // POST /api/logout - Clear CLI session
127
+ if (pathname === '/api/logout' && req.method === 'POST') {
128
+ clearAuthConfig();
129
+ res.writeHead(200);
130
+ res.end(JSON.stringify({ success: true }));
131
+ return;
132
+ }
133
+ // POST /api/cli/exec - Execute real CLI command locally
134
+ if (pathname === '/api/cli/exec' && req.method === 'POST') {
135
+ let body = '';
136
+ req.on('data', chunk => body += chunk);
137
+ req.on('end', () => {
138
+ try {
139
+ const data = JSON.parse(body);
140
+ let command = data.command || '';
141
+ command = command.trim().replace(/^(scout|ft)\s*/i, '');
142
+ if (!command) {
143
+ res.writeHead(400);
144
+ res.end(JSON.stringify({ error: 'Command string required' }));
145
+ return;
146
+ }
147
+ const pkgRoot = getPackageRoot();
148
+ const binScript = path.join(pkgRoot, 'bin', 'ft.js');
149
+ const indexScript = path.join(pkgRoot, 'bin', 'src', 'index.ts');
150
+ let execCmd;
151
+ if (fs.existsSync(binScript)) {
152
+ execCmd = `node "${binScript}" ${command}`;
153
+ }
154
+ else if (fs.existsSync(indexScript)) {
155
+ execCmd = `npx tsx "${indexScript}" ${command}`;
156
+ }
157
+ else {
158
+ execCmd = `ft ${command}`;
159
+ }
160
+ exec(execCmd, { cwd: process.cwd() }, (err, stdout, stderr) => {
161
+ const output = (stdout || '') + (stderr || '');
162
+ res.writeHead(200);
163
+ res.end(JSON.stringify({ success: !err, output: output || 'Command executed successfully.' }));
164
+ });
165
+ }
166
+ catch (err) {
167
+ res.writeHead(400);
168
+ res.end(JSON.stringify({ error: err.message || 'Invalid payload' }));
169
+ }
170
+ });
171
+ return;
172
+ }
173
+ res.writeHead(404);
174
+ res.end(JSON.stringify({ error: 'API route not found' }));
175
+ return;
176
+ }
177
+ // Static File Server
178
+ let targetFile = pathname === '/' ? 'index.html' : pathname.replace(/^\//, '');
179
+ let filePath = path.join(webDir, targetFile);
180
+ if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) {
181
+ filePath = path.join(webDir, 'index.html');
182
+ }
183
+ try {
184
+ const content = fs.readFileSync(filePath);
185
+ res.writeHead(200, { 'Content-Type': getMimeType(filePath) });
186
+ res.end(content);
187
+ }
188
+ catch (err) {
189
+ res.writeHead(500);
190
+ res.end('Error loading dashboard files');
191
+ }
192
+ });
193
+ server.on('error', (err) => {
194
+ if (err.code === 'EADDRINUSE') {
195
+ startDashboardServer(port + 1).then(resolve).catch(reject);
196
+ }
197
+ else {
198
+ reject(err);
199
+ }
200
+ });
201
+ server.listen(port, () => {
202
+ const url = `http://localhost:${port}`;
203
+ resolve({ server, url });
204
+ });
205
+ });
206
+ }
207
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAmBD,wBAAgB,cAAc,IAAI,UAAU,CAiB3C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAGvD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAG5C;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAGnD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/D,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AA4BD,wBAAgB,cAAc,IAAI,UAAU,CA0B3C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAGvD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAG5C;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAGnD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAU,GAAG,mBAAmB,CA0CrE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAkB3G"}
@@ -7,8 +7,17 @@ const DEFAULT_AUTH_CONFIG = {
7
7
  token: null,
8
8
  refreshToken: null,
9
9
  tenantId: null,
10
+ provider: null,
10
11
  user: null,
11
12
  loggedInAt: null,
13
+ creditsUsed: 0,
14
+ creditsTotal: 100,
15
+ currentTier: 'free',
16
+ renewAt: null,
17
+ byokEnabled: false,
18
+ customLlmProvider: 'gemini',
19
+ customApiKey: undefined,
20
+ customBaseUrl: undefined,
12
21
  };
13
22
  function ensureAuthDir() {
14
23
  if (!fs.existsSync(AUTH_DIR)) {
@@ -26,8 +35,17 @@ export function loadAuthConfig() {
26
35
  token: typeof parsed.token === 'string' ? parsed.token : null,
27
36
  refreshToken: typeof parsed.refreshToken === 'string' ? parsed.refreshToken : null,
28
37
  tenantId: typeof parsed.tenantId === 'string' ? parsed.tenantId : null,
38
+ provider: typeof parsed.provider === 'string' ? parsed.provider : 'firebase',
29
39
  user: parsed.user && typeof parsed.user === 'object' ? parsed.user : null,
30
40
  loggedInAt: typeof parsed.loggedInAt === 'string' ? parsed.loggedInAt : null,
41
+ creditsUsed: typeof parsed.creditsUsed === 'number' ? parsed.creditsUsed : 0,
42
+ creditsTotal: typeof parsed.creditsTotal === 'number' ? parsed.creditsTotal : 100,
43
+ currentTier: typeof parsed.currentTier === 'string' ? parsed.currentTier : 'free',
44
+ renewAt: typeof parsed.renewAt === 'string' ? parsed.renewAt : null,
45
+ byokEnabled: typeof parsed.byokEnabled === 'boolean' ? parsed.byokEnabled : false,
46
+ customLlmProvider: typeof parsed.customLlmProvider === 'string' ? parsed.customLlmProvider : 'gemini',
47
+ customApiKey: typeof parsed.customApiKey === 'string' ? parsed.customApiKey : undefined,
48
+ customBaseUrl: typeof parsed.customBaseUrl === 'string' ? parsed.customBaseUrl : undefined,
31
49
  };
32
50
  }
33
51
  catch {
@@ -54,4 +72,56 @@ export function getCurrentUser() {
54
72
  const config = loadAuthConfig();
55
73
  return config.user;
56
74
  }
75
+ export function consumeCredit(amount = 1) {
76
+ const config = loadAuthConfig();
77
+ if (config.byokEnabled) {
78
+ return {
79
+ success: true,
80
+ isByok: true,
81
+ remaining: Infinity,
82
+ isLowCredit: false,
83
+ reason: 'BYOK Mode Active (Custom API / Proxy Endpoint used)',
84
+ };
85
+ }
86
+ const used = config.creditsUsed ?? 0;
87
+ const total = config.creditsTotal ?? 100;
88
+ const remaining = total - used;
89
+ if (remaining < amount) {
90
+ return {
91
+ success: false,
92
+ isByok: false,
93
+ remaining: Math.max(0, remaining),
94
+ isLowCredit: true,
95
+ reason: `Credit limit reached for ${config.currentTier || 'Free'} plan (${used}/${total} credits consumed).`,
96
+ };
97
+ }
98
+ const remainingAfter = total - (used + amount);
99
+ const isLowCredit = remainingAfter <= Math.ceil(total * 0.15);
100
+ const updatedConfig = {
101
+ ...config,
102
+ creditsUsed: used + amount,
103
+ };
104
+ saveAuthConfig(updatedConfig);
105
+ return {
106
+ success: true,
107
+ isByok: false,
108
+ remaining: remainingAfter,
109
+ isLowCredit,
110
+ };
111
+ }
112
+ export function checkTierAccess(feature) {
113
+ const config = loadAuthConfig();
114
+ if (config.byokEnabled) {
115
+ return { allowed: true };
116
+ }
117
+ const used = config.creditsUsed ?? 0;
118
+ const total = config.creditsTotal ?? 100;
119
+ if (used >= total) {
120
+ return {
121
+ allowed: false,
122
+ reason: `Credit quota exhausted (${used}/${total} credits used). Upgrade your plan or enable BYOK mode in dashboard.`,
123
+ };
124
+ }
125
+ return { allowed: true };
126
+ }
57
127
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAkBpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAEnD,MAAM,mBAAmB,GAAe;IACtC,KAAK,EAAE,IAAI;IACX,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,SAAS,aAAa;IACpB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAC7D,YAAY,EAAE,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;YAClF,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;YACtE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YACzE,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;SAC7E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,aAAa,EAAE,CAAC;IAChB,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,aAAa,EAAE,CAAC;IAChB,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import chalk from 'chalk';
2
- export function renderBranding(version = '5.0.0') {
2
+ export function renderBranding(version = '5.0.2') {
3
3
  const logo = chalk.cyan.bold(' ███████╗████████╗') + ' ' + chalk.white.bold('███████╗██████╗ ██████╗ ██╗ ██╗████████╗') + '\n' +
4
4
  chalk.cyan.bold(' ██╔════╝╚══██╔══╝') + ' ' + chalk.white.bold('██╔════╝██╔════╝██╔═══██╗██║ ██║╚══██╔══╝') + '\n' +
5
5
  chalk.cyan.bold(' █████╗ ██║ ') + ' ' + chalk.white.bold('███████╗██║ ██║ ██║██║ ██║ ██║ ') + '\n' +
@@ -0,0 +1 @@
1
+ {"version":3,"file":"holoseneAuth.d.ts","sourceRoot":"","sources":["holoseneAuth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,eAAO,MAAM,iBAAiB,sCAAsC,CAAC;AACrE,eAAO,MAAM,4BAA4B,sDAAsD,CAAC;AAChG,eAAO,MAAM,wBAAwB,yDAAyD,CAAC;AAC/F,eAAO,MAAM,qBAAqB,sDAAsD,CAAC;AACzF,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA+DnF;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6C3G;AAED,wBAAgB,0BAA0B,CAAC,IAAI,SAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4EnF"}
@@ -0,0 +1,179 @@
1
+ import http from 'http';
2
+ import { exec } from 'child_process';
3
+ export const HOLOSENE_BASE_URL = 'https://holosene.frontterrain.com';
4
+ export const HOLOSENE_OAUTH_AUTHORIZE_URL = 'https://holosene.frontterrain.com/oauth/authorize';
5
+ export const HOLOSENE_OAUTH_TOKEN_URL = 'https://holosene.frontterrain.com/api/v1/oauth/token';
6
+ export const HOLOSENE_USERINFO_URL = 'https://holosene.frontterrain.com/api/v1/userinfo';
7
+ export const HOLOSENE_CLIENT_ID = 'ft-scout-cli';
8
+ export async function holoseneLookupUser(token) {
9
+ // 1. Attempt API verification via Holosene UserInfo endpoint
10
+ try {
11
+ const response = await fetch(HOLOSENE_USERINFO_URL, {
12
+ method: 'GET',
13
+ headers: {
14
+ 'Authorization': `Bearer ${token}`,
15
+ 'Content-Type': 'application/json',
16
+ },
17
+ });
18
+ if (response.ok) {
19
+ const data = await response.json();
20
+ const email = data.email || data.user?.email || '';
21
+ const username = data.username || data.preferred_username || (email.includes('@') ? email.split('@')[0] : 'holosene_user');
22
+ const name = data.name || data.displayName || (username ? username.charAt(0).toUpperCase() + username.slice(1) : 'Holosene Developer');
23
+ return {
24
+ id: data.sub || data.id || `hls_${Date.now().toString(36)}`,
25
+ email,
26
+ name,
27
+ username,
28
+ createdAt: data.createdAt || new Date().toISOString(),
29
+ };
30
+ }
31
+ }
32
+ catch { }
33
+ // 2. Fallback to JWT payload decoding
34
+ try {
35
+ const parts = token.split('.');
36
+ if (parts.length === 3 && parts[1]) {
37
+ const payloadBase64 = parts[1];
38
+ const payloadStr = Buffer.from(payloadBase64.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf-8');
39
+ const payload = JSON.parse(payloadStr);
40
+ if (payload && (payload.email || payload.sub || payload.user_id)) {
41
+ const email = payload.email || '';
42
+ const username = payload.username || (email.includes('@') ? email.split('@')[0] : 'holosene_user');
43
+ const name = payload.name || payload.displayName || (username ? username.charAt(0).toUpperCase() + username.slice(1) : 'Holosene Developer');
44
+ return {
45
+ id: payload.sub || payload.user_id || `hls_${Date.now().toString(36)}`,
46
+ email,
47
+ name,
48
+ username,
49
+ createdAt: new Date().toISOString(),
50
+ };
51
+ }
52
+ }
53
+ }
54
+ catch { }
55
+ // 3. Opaque / direct token fallback profile
56
+ if (token && token.length > 8) {
57
+ return {
58
+ id: `hls_${Date.now().toString(36)}`,
59
+ email: '',
60
+ name: 'Holosene Developer',
61
+ username: 'holosene_user',
62
+ createdAt: new Date().toISOString(),
63
+ };
64
+ }
65
+ return null;
66
+ }
67
+ export async function holoseneSignInWithCode(code, redirectUri) {
68
+ try {
69
+ const res = await fetch(HOLOSENE_OAUTH_TOKEN_URL, {
70
+ method: 'POST',
71
+ headers: { 'Content-Type': 'application/json' },
72
+ body: JSON.stringify({
73
+ grant_type: 'authorization_code',
74
+ client_id: HOLOSENE_CLIENT_ID,
75
+ code,
76
+ redirect_uri: redirectUri,
77
+ }),
78
+ });
79
+ if (res.ok) {
80
+ const data = await res.json();
81
+ const token = data.access_token || data.id_token || code;
82
+ const user = await holoseneLookupUser(token) || {
83
+ id: `hls_${Date.now().toString(36)}`,
84
+ email: data.email || data.user_email || '',
85
+ name: data.name || 'Holosene Developer',
86
+ username: data.email ? data.email.split('@')[0] : 'holosene_user',
87
+ createdAt: new Date().toISOString(),
88
+ };
89
+ return {
90
+ token,
91
+ refreshToken: data.refresh_token,
92
+ user,
93
+ };
94
+ }
95
+ }
96
+ catch { }
97
+ // Fallback for code token
98
+ const user = await holoseneLookupUser(code) || {
99
+ id: `hls_${Date.now().toString(36)}`,
100
+ email: '',
101
+ name: 'Holosene Developer',
102
+ username: 'holosene_dev',
103
+ createdAt: new Date().toISOString(),
104
+ };
105
+ return {
106
+ token: code,
107
+ user,
108
+ };
109
+ }
110
+ export function launchHoloseneBrowserOAuth(port = 9876) {
111
+ return new Promise((resolve, reject) => {
112
+ const redirectUri = `http://localhost:${port}/callback`;
113
+ const authUrl = `${HOLOSENE_OAUTH_AUTHORIZE_URL}?client_id=${HOLOSENE_CLIENT_ID}&response_type=code&redirect_uri=${encodeURIComponent(redirectUri)}&scope=openid+profile+email`;
114
+ const server = http.createServer(async (req, res) => {
115
+ try {
116
+ const reqUrl = new URL(req.url || '/', `http://localhost:${port}`);
117
+ if (reqUrl.pathname === '/callback') {
118
+ const code = reqUrl.searchParams.get('code');
119
+ const token = reqUrl.searchParams.get('token') || reqUrl.searchParams.get('access_token');
120
+ const error = reqUrl.searchParams.get('error');
121
+ if (error) {
122
+ res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
123
+ res.end(`
124
+ <html>
125
+ <body style="font-family: sans-serif; text-align: center; padding: 50px; background: #0f172a; color: #f8fafc;">
126
+ <h1 style="color: #ef4444;">Holosene OAuth Cancelled</h1>
127
+ <p>${error}</p>
128
+ <p>You can close this tab and return to your terminal.</p>
129
+ </body>
130
+ </html>
131
+ `);
132
+ server.close();
133
+ return reject(new Error(`Holosene OAuth error: ${error}`));
134
+ }
135
+ const targetToken = token || code || `hls_tok_${Date.now().toString(36)}`;
136
+ const result = await holoseneSignInWithCode(targetToken, redirectUri);
137
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
138
+ res.end(`
139
+ <html>
140
+ <body style="font-family: system-ui, sans-serif; text-align: center; padding: 50px; background: #0f172a; color: #f8fafc;">
141
+ <div style="max-width: 480px; margin: 0 auto; background: #1e293b; padding: 32px; border-radius: 12px; border: 1px solid #334155; box-shadow: 0 20px 25px -5px rgba(0,0,0,0.5);">
142
+ <div style="font-size: 48px; margin-bottom: 16px;">🌌</div>
143
+ <h1 style="color: #38bdf8; margin-top: 0;">Authenticated with Holosene</h1>
144
+ <p style="color: #94a3b8; font-size: 16px;">Welcome back, <strong>${result.user.name}</strong> (${result.user.email})!</p>
145
+ <div style="margin-top: 24px; padding: 12px; background: #0f172a; border-radius: 8px; font-family: monospace; color: #4ade80;">
146
+ ✓ Token stored in ~/.ft/auth.json
147
+ </div>
148
+ <p style="margin-top: 24px; font-size: 14px; color: #64748b;">You can safely close this browser window and return to your Scout CLI session.</p>
149
+ </div>
150
+ </body>
151
+ </html>
152
+ `);
153
+ server.close();
154
+ resolve(result);
155
+ }
156
+ }
157
+ catch (err) {
158
+ server.close();
159
+ reject(err);
160
+ }
161
+ });
162
+ server.listen(port, () => {
163
+ const openCmd = process.platform === 'win32'
164
+ ? `start "" "${authUrl}"`
165
+ : process.platform === 'darwin'
166
+ ? `open "${authUrl}"`
167
+ : `xdg-open "${authUrl}"`;
168
+ exec(openCmd, (err) => {
169
+ if (err) {
170
+ console.log(`\nNote: If browser did not open automatically, visit:\n${authUrl}\n`);
171
+ }
172
+ });
173
+ });
174
+ server.on('error', (err) => {
175
+ reject(new Error(`Failed to launch OAuth listener server: ${err.message}`));
176
+ });
177
+ });
178
+ }
179
+ //# sourceMappingURL=holoseneAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"holoseneAuth.js","sourceRoot":"","sources":["holoseneAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ [debug] [2026-08-08T14:20:30.561Z] ----------------------------------------------------------------------
2
+ [debug] [2026-08-08T14:20:30.565Z] Command: C:\Program Files\nodejs\node.exe C:\Users\rishi\AppData\Roaming\npm\node_modules\firebase-tools\lib\bin\firebase.js deploy --only hosting
3
+ [debug] [2026-08-08T14:20:30.565Z] CLI Version: 15.24.0
4
+ [debug] [2026-08-08T14:20:30.566Z] Platform: win32
5
+ [debug] [2026-08-08T14:20:30.566Z] Node Version: v22.20.0
6
+ [debug] [2026-08-08T14:20:30.566Z] Detected Agent: unknown
7
+ [debug] [2026-08-08T14:20:30.566Z] Time: Sat Aug 08 2026 19:50:30 GMT+0530 (India Standard Time)
8
+ [debug] [2026-08-08T14:20:30.567Z] ----------------------------------------------------------------------
9
+ [debug]
10
+ [debug] [2026-08-08T14:20:33.083Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
11
+ [debug] [2026-08-08T14:20:33.084Z] > authorizing via signed-in user (rishishandilya40@gmail.com)
12
+ [debug] [2026-08-08T14:20:33.084Z] [iam] checking project frontterrain for permissions ["firebase.projects.get","firebasehosting.sites.update"]
13
+ [debug] [2026-08-08T14:20:33.098Z] Checked if tokens are valid: true, expires at: 1786200042441
14
+ [debug] [2026-08-08T14:20:33.098Z] Checked if tokens are valid: true, expires at: 1786200042441
15
+ [debug] [2026-08-08T14:20:33.100Z] >>> [apiv2][query] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions [none]
16
+ [debug] [2026-08-08T14:20:33.100Z] >>> [apiv2][(partial)header] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions x-goog-user-project=frontterrain
17
+ [debug] [2026-08-08T14:20:33.100Z] >>> [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions {"permissions":["firebase.projects.get","firebasehosting.sites.update"]}
18
+ [debug] [2026-08-08T14:20:34.674Z] <<< [apiv2][status] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions 200
19
+ [debug] [2026-08-08T14:20:34.675Z] <<< [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/frontterrain:testIamPermissions {"permissions":["firebase.projects.get","firebasehosting.sites.update"]}
20
+ [debug] [2026-08-08T14:20:34.677Z] Checked if tokens are valid: true, expires at: 1786200042441
21
+ [debug] [2026-08-08T14:20:34.677Z] Checked if tokens are valid: true, expires at: 1786200042441
22
+ [debug] [2026-08-08T14:20:34.677Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/frontterrain [none]
23
+ [debug] [2026-08-08T14:20:35.561Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/frontterrain 200
24
+ [debug] [2026-08-08T14:20:35.562Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/frontterrain {"projectId":"frontterrain","projectNumber":"443977559241","displayName":"frontterrain","name":"projects/frontterrain","resources":{"hostingSite":"frontterrain","realtimeDatabaseInstance":"frontterrain-default-rtdb"},"state":"ACTIVE","labels":{"firebase":"enabled","firebase/storage-default-bucket":"created","firebaseworkflows/environment":"production"},"etag":"1_78a6722f-2aff-4818-b8b5-030f66204476"}
25
+ [info]
26
+ [info] === Deploying to 'frontterrain'...
27
+ [info]
28
+ [info] i deploying hosting
29
+ [debug] [2026-08-08T14:20:35.569Z] Checked if tokens are valid: true, expires at: 1786200042441
30
+ [debug] [2026-08-08T14:20:35.569Z] Checked if tokens are valid: true, expires at: 1786200042441
31
+ [debug] [2026-08-08T14:20:35.569Z] >>> [apiv2][query] GET https://firebasehosting.googleapis.com/v1beta1/projects/frontterrain/sites/tryscout [none]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ft-scout",
3
- "version": "5.0.0",
3
+ "version": "5.0.2",
4
4
  "type": "module",
5
5
  "description": "FrontTerrain — The Onboarding Co-Pilot for New Codebases",
6
6
  "main": "index.js",
@@ -36,7 +36,7 @@
36
36
  "@clack/prompts": "^1.7.0",
37
37
  "@types/nodemailer": "^8.0.1",
38
38
  "chalk": "^6.0.0",
39
- "commander": "^15.0.0",
39
+ "commander": "^15.0.2",
40
40
  "dotenv": "^17.4.2",
41
41
  "nodemailer": "^9.0.4",
42
42
  "openai": "^7.1.0",
Binary file