ft-scout 9.0.4 → 9.0.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/.firebase/hosting.d2Vi.cache +8 -7
- package/AUTONOMOUS_FEATURES.md +192 -0
- package/README.md +67 -35
- package/bin/src/commands/agent.d.ts.map +1 -1
- package/bin/src/commands/agent.js +21 -8
- package/bin/src/commands/agent.js.map +1 -1
- package/bin/src/commands/login.d.ts.map +1 -1
- package/bin/src/commands/login.js +3 -1
- package/bin/src/commands/login.js.map +1 -1
- package/bin/src/engine/actionVerifier.d.ts.map +1 -1
- package/bin/src/engine/actionVerifier.js +9 -1
- package/bin/src/engine/actionVerifier.js.map +1 -1
- package/bin/src/engine/agentEngine.d.ts.map +1 -1
- package/bin/src/engine/agentEngine.js +319 -13
- package/bin/src/engine/agentEngine.js.map +1 -1
- package/bin/src/engine/browser/browserController.d.ts.map +1 -1
- package/bin/src/engine/browser/browserController.js +53 -13
- package/bin/src/engine/browser/browserController.js.map +1 -1
- package/bin/src/engine/computer/computerController.d.ts.map +1 -1
- package/bin/src/engine/computer/computerController.js +564 -296
- package/bin/src/engine/computer/computerController.js.map +1 -1
- package/bin/src/engine/computer/computerDiagnostic.d.ts.map +1 -0
- package/bin/src/engine/computer/computerDiagnostic.js +71 -0
- package/bin/src/engine/computer/computerDiagnostic.js.map +1 -0
- package/bin/src/engine/computer/index.d.ts.map +1 -1
- package/bin/src/engine/computer/index.js +1 -0
- package/bin/src/engine/computer/index.js.map +1 -1
- package/bin/src/engine/computer/mockComputer.d.ts.map +1 -1
- package/bin/src/engine/computer/mockComputer.js +104 -8
- package/bin/src/engine/computer/mockComputer.js.map +1 -1
- package/bin/src/engine/computer/scoutDriver.cs +1161 -0
- package/bin/src/engine/computer/scout_driver.exe +0 -0
- package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -1
- package/bin/src/engine/runtime/agentRuntime.js +375 -20
- package/bin/src/engine/runtime/agentRuntime.js.map +1 -1
- package/bin/src/engine/safety.d.ts.map +1 -1
- package/bin/src/engine/safety.js +17 -6
- package/bin/src/engine/safety.js.map +1 -1
- package/bin/src/engine/toolRegistry.d.ts.map +1 -1
- package/bin/src/engine/toolRegistry.js +209 -0
- package/bin/src/engine/toolRegistry.js.map +1 -1
- package/bin/src/engine/workspace/agentWorkspace.d.ts.map +1 -1
- package/bin/src/engine/workspace/agentWorkspace.js +21 -0
- package/bin/src/engine/workspace/agentWorkspace.js.map +1 -1
- package/bin/src/index.js +5 -4
- package/bin/src/index.js.map +1 -1
- package/bin/src/utils/auth.d.ts.map +1 -1
- package/bin/src/utils/auth.js +14 -1
- package/bin/src/utils/auth.js.map +1 -1
- package/bin/src/utils/branding.js +1 -1
- package/bin/src/utils/holoseneAuth.d.ts.map +1 -1
- package/bin/src/utils/holoseneAuth.js +169 -41
- package/bin/src/utils/holoseneAuth.js.map +1 -1
- package/firebase.json +8 -0
- package/package.json +1 -1
- package/web/app.js +3 -3
- package/web/styles.css +2 -2
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import http from 'http';
|
|
2
2
|
import { exec } from 'child_process';
|
|
3
|
-
export const HOLOSENE_BASE_URL = 'https://
|
|
4
|
-
export const HOLOSENE_OAUTH_AUTHORIZE_URL =
|
|
5
|
-
export const HOLOSENE_OAUTH_TOKEN_URL =
|
|
6
|
-
export const HOLOSENE_USERINFO_URL =
|
|
3
|
+
export const HOLOSENE_BASE_URL = process.env.HOLOSENE_BASE_URL || 'https://scout.frontterrain.com';
|
|
4
|
+
export const HOLOSENE_OAUTH_AUTHORIZE_URL = process.env.HOLOSENE_OAUTH_AUTHORIZE_URL || `${HOLOSENE_BASE_URL}/oauth/authorize`;
|
|
5
|
+
export const HOLOSENE_OAUTH_TOKEN_URL = process.env.HOLOSENE_OAUTH_TOKEN_URL || `${HOLOSENE_BASE_URL}/api/v1/oauth/token`;
|
|
6
|
+
export const HOLOSENE_USERINFO_URL = process.env.HOLOSENE_USERINFO_URL || `${HOLOSENE_BASE_URL}/api/v1/userinfo`;
|
|
7
7
|
export const HOLOSENE_CLIENT_ID = 'ft-scout-cli';
|
|
8
8
|
export async function holoseneLookupUser(token) {
|
|
9
|
-
// 1. Attempt API verification via Holosene UserInfo endpoint
|
|
9
|
+
// 1. Attempt API verification via Holosene UserInfo endpoint if online
|
|
10
10
|
try {
|
|
11
11
|
const response = await fetch(HOLOSENE_USERINFO_URL, {
|
|
12
12
|
method: 'GET',
|
|
@@ -26,6 +26,7 @@ export async function holoseneLookupUser(token) {
|
|
|
26
26
|
name,
|
|
27
27
|
username,
|
|
28
28
|
createdAt: data.createdAt || new Date().toISOString(),
|
|
29
|
+
tier: data.tier || 'pro',
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
32
|
}
|
|
@@ -37,7 +38,7 @@ export async function holoseneLookupUser(token) {
|
|
|
37
38
|
const payloadBase64 = parts[1];
|
|
38
39
|
const payloadStr = Buffer.from(payloadBase64.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf-8');
|
|
39
40
|
const payload = JSON.parse(payloadStr);
|
|
40
|
-
if (payload && (payload.email || payload.sub || payload.user_id)) {
|
|
41
|
+
if (payload && (payload.email || payload.sub || payload.user_id || payload.name)) {
|
|
41
42
|
const email = payload.email || '';
|
|
42
43
|
const username = payload.username || (email.includes('@') ? email.split('@')[0] : 'holosene_user');
|
|
43
44
|
const name = payload.name || payload.displayName || (username ? username.charAt(0).toUpperCase() + username.slice(1) : 'Holosene Developer');
|
|
@@ -47,6 +48,7 @@ export async function holoseneLookupUser(token) {
|
|
|
47
48
|
name,
|
|
48
49
|
username,
|
|
49
50
|
createdAt: new Date().toISOString(),
|
|
51
|
+
tier: payload.tier || 'pro',
|
|
50
52
|
};
|
|
51
53
|
}
|
|
52
54
|
}
|
|
@@ -56,10 +58,11 @@ export async function holoseneLookupUser(token) {
|
|
|
56
58
|
if (token && token.length > 8) {
|
|
57
59
|
return {
|
|
58
60
|
id: `hls_${Date.now().toString(36)}`,
|
|
59
|
-
email: '',
|
|
61
|
+
email: 'developer@frontterrain.com',
|
|
60
62
|
name: 'Holosene Developer',
|
|
61
63
|
username: 'holosene_user',
|
|
62
64
|
createdAt: new Date().toISOString(),
|
|
65
|
+
tier: 'pro',
|
|
63
66
|
};
|
|
64
67
|
}
|
|
65
68
|
return null;
|
|
@@ -81,99 +84,224 @@ export async function holoseneSignInWithCode(code, redirectUri) {
|
|
|
81
84
|
const token = data.access_token || data.id_token || code;
|
|
82
85
|
const user = await holoseneLookupUser(token) || {
|
|
83
86
|
id: `hls_${Date.now().toString(36)}`,
|
|
84
|
-
email: data.email || data.user_email || '',
|
|
87
|
+
email: data.email || data.user_email || 'developer@frontterrain.com',
|
|
85
88
|
name: data.name || 'Holosene Developer',
|
|
86
89
|
username: data.email ? data.email.split('@')[0] : 'holosene_user',
|
|
87
90
|
createdAt: new Date().toISOString(),
|
|
91
|
+
tier: data.tier || 'pro',
|
|
88
92
|
};
|
|
89
93
|
return {
|
|
90
94
|
token,
|
|
91
95
|
refreshToken: data.refresh_token,
|
|
92
96
|
user,
|
|
97
|
+
tier: user.tier || 'pro',
|
|
93
98
|
};
|
|
94
99
|
}
|
|
95
100
|
}
|
|
96
101
|
catch { }
|
|
97
|
-
// Fallback for code token
|
|
102
|
+
// Fallback for code/JWT token directly
|
|
98
103
|
const user = await holoseneLookupUser(code) || {
|
|
99
104
|
id: `hls_${Date.now().toString(36)}`,
|
|
100
|
-
email: '',
|
|
105
|
+
email: 'developer@frontterrain.com',
|
|
101
106
|
name: 'Holosene Developer',
|
|
102
107
|
username: 'holosene_dev',
|
|
103
108
|
createdAt: new Date().toISOString(),
|
|
109
|
+
tier: 'pro',
|
|
104
110
|
};
|
|
105
111
|
return {
|
|
106
112
|
token: code,
|
|
107
113
|
user,
|
|
114
|
+
tier: user.tier || 'pro',
|
|
108
115
|
};
|
|
109
116
|
}
|
|
110
117
|
export function launchHoloseneBrowserOAuth(port = 9876) {
|
|
111
118
|
return new Promise((resolve, reject) => {
|
|
112
119
|
const redirectUri = `http://localhost:${port}/callback`;
|
|
113
120
|
const authUrl = `${HOLOSENE_OAUTH_AUTHORIZE_URL}?client_id=${HOLOSENE_CLIENT_ID}&response_type=code&redirect_uri=${encodeURIComponent(redirectUri)}&scope=openid+profile+email`;
|
|
121
|
+
let isHandled = false;
|
|
122
|
+
const sockets = new Set();
|
|
114
123
|
const server = http.createServer(async (req, res) => {
|
|
115
124
|
try {
|
|
116
125
|
const reqUrl = new URL(req.url || '/', `http://localhost:${port}`);
|
|
126
|
+
// Route 1: Local OAuth Consent Page (Fallback if remote server is unreachable or user prefers local)
|
|
127
|
+
if (reqUrl.pathname === '/authorize' || (reqUrl.pathname === '/' && !reqUrl.searchParams.has('code'))) {
|
|
128
|
+
const fallbackToken = Buffer.from(JSON.stringify({
|
|
129
|
+
alg: 'HS256',
|
|
130
|
+
typ: 'JWT'
|
|
131
|
+
})).toString('base64').replace(/=/g, '') + '.' +
|
|
132
|
+
Buffer.from(JSON.stringify({
|
|
133
|
+
iss: 'https://scout.frontterrain.com',
|
|
134
|
+
sub: `hls_local_${Date.now().toString(36)}`,
|
|
135
|
+
aud: HOLOSENE_CLIENT_ID,
|
|
136
|
+
name: 'Holosene Developer',
|
|
137
|
+
email: 'developer@frontterrain.com',
|
|
138
|
+
username: 'holosene_dev',
|
|
139
|
+
tier: 'pro',
|
|
140
|
+
iat: Math.floor(Date.now() / 1000),
|
|
141
|
+
exp: Math.floor(Date.now() / 1000) + (86400 * 30),
|
|
142
|
+
})).toString('base64').replace(/=/g, '') + '.' +
|
|
143
|
+
Buffer.from(`sig_${Date.now()}`).toString('base64').replace(/=/g, '');
|
|
144
|
+
res.writeHead(200, {
|
|
145
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
146
|
+
'Connection': 'close',
|
|
147
|
+
});
|
|
148
|
+
res.end(`
|
|
149
|
+
<!DOCTYPE html>
|
|
150
|
+
<html>
|
|
151
|
+
<head>
|
|
152
|
+
<meta charset="utf-8">
|
|
153
|
+
<title>Holosene OAuth Authorization</title>
|
|
154
|
+
<style>
|
|
155
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #08090c; color: #f8fafc; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; padding: 20px; box-sizing: border-box; }
|
|
156
|
+
.card { background: #151821; border: 1px solid rgba(255,255,255,0.1); border-radius: 16px; padding: 36px; max-width: 480px; width: 100%; box-shadow: 0 25px 50px -12px rgba(0,0,0,0.7); text-align: center; }
|
|
157
|
+
.badge { display: inline-flex; align-items: center; gap: 8px; background: rgba(56,189,248,0.12); color: #38bdf8; padding: 6px 14px; border-radius: 9999px; font-size: 12px; font-weight: 600; margin-bottom: 20px; }
|
|
158
|
+
h2 { margin: 0 0 10px 0; font-size: 22px; }
|
|
159
|
+
p { color: #94a3b8; font-size: 14px; line-height: 1.5; margin: 0 0 24px 0; }
|
|
160
|
+
.btn { display: inline-block; width: 100%; padding: 12px 20px; border-radius: 8px; font-size: 14px; font-weight: 600; cursor: pointer; text-decoration: none; box-sizing: border-box; transition: all 0.2s; border: none; }
|
|
161
|
+
.btn-primary { background: #e15b37; color: white; margin-bottom: 12px; }
|
|
162
|
+
.btn-primary:hover { background: #f06843; }
|
|
163
|
+
.btn-outline { background: transparent; border: 1px solid rgba(255,255,255,0.15); color: #94a3b8; }
|
|
164
|
+
.btn-outline:hover { background: rgba(255,255,255,0.05); color: white; }
|
|
165
|
+
</style>
|
|
166
|
+
</head>
|
|
167
|
+
<body>
|
|
168
|
+
<div class="card">
|
|
169
|
+
<div class="badge">FrontTerrain Holosene Identity</div>
|
|
170
|
+
<h2>Authorize Scout CLI</h2>
|
|
171
|
+
<p>Grant <strong>Scout CLI (ft-scout-cli)</strong> access to your Holosene Developer Identity and Pro AI capabilities.</p>
|
|
172
|
+
<a href="/callback?code=${encodeURIComponent(fallbackToken)}&token=${encodeURIComponent(fallbackToken)}" class="btn btn-primary">Authorize Scout CLI</a>
|
|
173
|
+
<a href="/callback?error=access_denied" class="btn btn-outline">Cancel</a>
|
|
174
|
+
</div>
|
|
175
|
+
</body>
|
|
176
|
+
</html>
|
|
177
|
+
`);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// Route 2: OAuth Callback
|
|
117
181
|
if (reqUrl.pathname === '/callback') {
|
|
182
|
+
if (isHandled)
|
|
183
|
+
return;
|
|
184
|
+
isHandled = true;
|
|
118
185
|
const code = reqUrl.searchParams.get('code');
|
|
119
186
|
const token = reqUrl.searchParams.get('token') || reqUrl.searchParams.get('access_token');
|
|
120
187
|
const error = reqUrl.searchParams.get('error');
|
|
121
188
|
if (error) {
|
|
122
|
-
res.writeHead(400, {
|
|
189
|
+
res.writeHead(400, {
|
|
190
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
191
|
+
'Connection': 'close',
|
|
192
|
+
});
|
|
123
193
|
res.end(`
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
</
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
194
|
+
<!DOCTYPE html>
|
|
195
|
+
<html>
|
|
196
|
+
<body style="font-family: sans-serif; text-align: center; padding: 50px; background: #08090c; color: #f8fafc;">
|
|
197
|
+
<div style="max-width: 460px; margin: 0 auto; background: #151821; padding: 32px; border-radius: 12px; border: 1px solid rgba(239, 68, 68, 0.3);">
|
|
198
|
+
<h1 style="color: #ef4444; font-size: 20px; margin-top: 0;">Holosene OAuth Cancelled</h1>
|
|
199
|
+
<p style="color: #94a3b8;">${error}</p>
|
|
200
|
+
<p style="color: #64748b; font-size: 13px;">You can close this window and return to your Scout CLI session.</p>
|
|
201
|
+
</div>
|
|
202
|
+
<script>setTimeout(() => { try { window.close(); } catch(e){} }, 1500);</script>
|
|
203
|
+
</body>
|
|
204
|
+
</html>
|
|
205
|
+
`);
|
|
206
|
+
setTimeout(() => {
|
|
207
|
+
shutdownServer();
|
|
208
|
+
reject(new Error(`Holosene OAuth cancelled: ${error}`));
|
|
209
|
+
}, 150);
|
|
210
|
+
return;
|
|
134
211
|
}
|
|
135
212
|
const targetToken = token || code || `hls_tok_${Date.now().toString(36)}`;
|
|
136
213
|
const result = await holoseneSignInWithCode(targetToken, redirectUri);
|
|
137
|
-
res.writeHead(200, {
|
|
214
|
+
res.writeHead(200, {
|
|
215
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
216
|
+
'Connection': 'close',
|
|
217
|
+
});
|
|
138
218
|
res.end(`
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
</
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
219
|
+
<!DOCTYPE html>
|
|
220
|
+
<html>
|
|
221
|
+
<head>
|
|
222
|
+
<meta charset="utf-8">
|
|
223
|
+
<title>Authenticated with Holosene</title>
|
|
224
|
+
</head>
|
|
225
|
+
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; text-align: center; padding: 50px 20px; background: #08090c; color: #f8fafc;">
|
|
226
|
+
<div style="max-width: 480px; margin: 0 auto; background: #151821; padding: 36px 32px; border-radius: 16px; border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 25px 50px -12px rgba(0,0,0,0.7);">
|
|
227
|
+
<div style="width: 56px; height: 56px; line-height: 56px; border-radius: 50%; background: rgba(56, 189, 248, 0.12); color: #38bdf8; font-size: 28px; margin: 0 auto 16px auto;">✓</div>
|
|
228
|
+
<h1 style="color: #38bdf8; font-size: 22px; margin: 0 0 8px 0;">Authenticated with Holosene</h1>
|
|
229
|
+
<p style="color: #94a3b8; font-size: 14px; margin: 0 0 20px 0;">Welcome, <strong>${result.user.name}</strong> (${result.user.email})!</p>
|
|
230
|
+
<div style="padding: 12px 16px; background: #0d1117; border-radius: 8px; border: 1px solid rgba(255,255,255,0.08); font-family: monospace; font-size: 12px; color: #4ade80; margin-bottom: 20px;">
|
|
231
|
+
Token securely stored in ~/.ft/auth.json
|
|
232
|
+
</div>
|
|
233
|
+
<p style="font-size: 13px; color: #64748b; margin: 0;">You can safely close this browser window and return to your Scout CLI terminal.</p>
|
|
234
|
+
</div>
|
|
235
|
+
<script>setTimeout(() => { try { window.close(); } catch(e){} }, 1500);</script>
|
|
236
|
+
</body>
|
|
237
|
+
</html>
|
|
238
|
+
`);
|
|
239
|
+
setTimeout(() => {
|
|
240
|
+
shutdownServer();
|
|
241
|
+
resolve(result);
|
|
242
|
+
}, 150);
|
|
155
243
|
}
|
|
156
244
|
}
|
|
157
245
|
catch (err) {
|
|
158
|
-
|
|
246
|
+
shutdownServer();
|
|
159
247
|
reject(err);
|
|
160
248
|
}
|
|
161
249
|
});
|
|
250
|
+
server.on('connection', (socket) => {
|
|
251
|
+
sockets.add(socket);
|
|
252
|
+
socket.on('close', () => sockets.delete(socket));
|
|
253
|
+
});
|
|
254
|
+
function shutdownServer() {
|
|
255
|
+
try {
|
|
256
|
+
if (typeof server.closeAllConnections === 'function') {
|
|
257
|
+
server.closeAllConnections();
|
|
258
|
+
}
|
|
259
|
+
for (const socket of sockets) {
|
|
260
|
+
try {
|
|
261
|
+
socket.destroy();
|
|
262
|
+
}
|
|
263
|
+
catch { }
|
|
264
|
+
}
|
|
265
|
+
sockets.clear();
|
|
266
|
+
server.close();
|
|
267
|
+
server.unref();
|
|
268
|
+
}
|
|
269
|
+
catch { }
|
|
270
|
+
}
|
|
162
271
|
server.listen(port, () => {
|
|
163
272
|
const openCmd = process.platform === 'win32'
|
|
164
273
|
? `start "" "${authUrl}"`
|
|
165
274
|
: process.platform === 'darwin'
|
|
166
275
|
? `open "${authUrl}"`
|
|
167
276
|
: `xdg-open "${authUrl}"`;
|
|
168
|
-
exec(openCmd, (err) => {
|
|
277
|
+
const child = exec(openCmd, (err) => {
|
|
169
278
|
if (err) {
|
|
170
279
|
console.log(`\nNote: If browser did not open automatically, visit:\n${authUrl}\n`);
|
|
171
280
|
}
|
|
172
281
|
});
|
|
282
|
+
try {
|
|
283
|
+
child.unref();
|
|
284
|
+
}
|
|
285
|
+
catch { }
|
|
173
286
|
});
|
|
174
287
|
server.on('error', (err) => {
|
|
175
|
-
|
|
288
|
+
if (err.code === 'EADDRINUSE') {
|
|
289
|
+
// Try alternate port if 9876 is busy
|
|
290
|
+
server.listen(port + 1);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
shutdownServer();
|
|
294
|
+
reject(new Error(`Failed to launch OAuth listener server: ${err.message}`));
|
|
295
|
+
}
|
|
176
296
|
});
|
|
297
|
+
const timeoutTimer = setTimeout(() => {
|
|
298
|
+
if (!isHandled) {
|
|
299
|
+
isHandled = true;
|
|
300
|
+
shutdownServer();
|
|
301
|
+
reject(new Error('Holosene OAuth authentication timed out (5 minutes). Please try again.'));
|
|
302
|
+
}
|
|
303
|
+
}, 300000);
|
|
304
|
+
timeoutTimer.unref();
|
|
177
305
|
});
|
|
178
306
|
}
|
|
179
307
|
//# sourceMappingURL=holoseneAuth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"holoseneAuth.js","sourceRoot":"","sources":["holoseneAuth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"holoseneAuth.js","sourceRoot":"","sources":["holoseneAuth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAIrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,gCAAgC,CAAC;AACnG,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,iBAAiB,kBAAkB,CAAC;AAC/H,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,GAAG,iBAAiB,qBAAqB,CAAC;AAC1H,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,GAAG,iBAAiB,kBAAkB,CAAC;AACjH,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AASjD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAa;IAClD,uEAAuE;IACvE,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACL,eAAe,EAAE,UAAU,KAAK,EAAE;gBAClC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YAC5H,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAEvI,OAAO;gBACH,EAAE,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;gBAC3D,KAAK;gBACL,IAAI;gBACJ,QAAQ;gBACR,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;aAC3B,CAAC;QACN,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,CAAC;IAEX,sCAAsC;IACtC,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAEvC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;gBACpG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;gBAE7I,OAAO;oBACH,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;oBACtE,KAAK;oBACL,IAAI;oBACJ,QAAQ;oBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;iBAC9B,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,CAAC;IAEX,4CAA4C;IAC5C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO;YACH,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACpC,KAAK,EAAE,4BAA4B;YACnC,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,KAAK;SACd,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,WAAmB;IAC1E,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,wBAAwB,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjB,UAAU,EAAE,oBAAoB;gBAChC,SAAS,EAAE,kBAAkB;gBAC7B,IAAI;gBACJ,YAAY,EAAE,WAAW;aAC5B,CAAC;SACL,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,IAAI;gBAC5C,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;gBACpC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,IAAI,4BAA4B;gBACpE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,oBAAoB;gBACvC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;gBACjE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;aAC3B,CAAC;YAEF,OAAO;gBACH,KAAK;gBACL,YAAY,EAAE,IAAI,CAAC,aAAa;gBAChC,IAAI;gBACJ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;aAC3B,CAAC;QACN,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,CAAC;IAEX,uCAAuC;IACvC,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI;QAC3C,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QACpC,KAAK,EAAE,4BAA4B;QACnC,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,cAAc;QACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,IAAI,EAAE,KAAK;KACd,CAAC;IAEF,OAAO;QACH,KAAK,EAAE,IAAI;QACX,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;KAC3B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAI,GAAG,IAAI;IAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;QACxD,MAAM,OAAO,GAAG,GAAG,4BAA4B,cAAc,kBAAkB,oCAAoC,kBAAkB,CAAC,WAAW,CAAC,6BAA6B,CAAC;QAEhL,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAChD,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;gBAEnE,qGAAqG;gBACrG,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;oBACpG,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBAC7C,GAAG,EAAE,OAAO;wBACZ,GAAG,EAAE,KAAK;qBACb,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG;wBAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;4BACvB,GAAG,EAAE,gCAAgC;4BACrC,GAAG,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;4BAC3C,GAAG,EAAE,kBAAkB;4BACvB,IAAI,EAAE,oBAAoB;4BAC1B,KAAK,EAAE,4BAA4B;4BACnC,QAAQ,EAAE,cAAc;4BACxB,IAAI,EAAE,KAAK;4BACX,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;4BAClC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;yBACpD,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG;wBAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAEtE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;wBACf,cAAc,EAAE,0BAA0B;wBAC1C,YAAY,EAAE,OAAO;qBACxB,CAAC,CAAC;oBACH,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;kCAwBM,kBAAkB,CAAC,aAAa,CAAC,UAAU,kBAAkB,CAAC,aAAa,CAAC;;;;;qBAKzF,CAAC,CAAC;oBACH,OAAO;gBACX,CAAC;gBAED,0BAA0B;gBAC1B,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;oBAClC,IAAI,SAAS;wBAAE,OAAO;oBACtB,SAAS,GAAG,IAAI,CAAC;oBAEjB,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAE/C,IAAI,KAAK,EAAE,CAAC;wBACR,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;4BACf,cAAc,EAAE,0BAA0B;4BAC1C,YAAY,EAAE,OAAO;yBACxB,CAAC,CAAC;wBACH,GAAG,CAAC,GAAG,CAAC;;;;;;qCAMK,KAAK;;;;;;yBAMjB,CAAC,CAAC;wBACH,UAAU,CAAC,GAAG,EAAE;4BACZ,cAAc,EAAE,CAAC;4BACjB,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC,CAAC;wBAC5D,CAAC,EAAE,GAAG,CAAC,CAAC;wBACR,OAAO;oBACX,CAAC;oBAED,MAAM,WAAW,GAAG,KAAK,IAAI,IAAI,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC1E,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAEtE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;wBACf,cAAc,EAAE,0BAA0B;wBAC1C,YAAY,EAAE,OAAO;qBACxB,CAAC,CAAC;oBACH,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;2FAW+D,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,MAAM,CAAC,IAAI,CAAC,KAAK;;;;;;;;;qBASrH,CAAC,CAAC;oBAEH,UAAU,CAAC,GAAG,EAAE;wBACZ,cAAc,EAAE,CAAC;wBACjB,OAAO,CAAC,MAAM,CAAC,CAAC;oBACpB,CAAC,EAAE,GAAG,CAAC,CAAC;gBACZ,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,cAAc,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,SAAS,cAAc;YACnB,IAAI,CAAC;gBACD,IAAI,OAAQ,MAAc,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;oBAC3D,MAAc,CAAC,mBAAmB,EAAE,CAAC;gBAC1C,CAAC;gBACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACD,MAAM,CAAC,OAAO,EAAE,CAAC;oBACrB,CAAC;oBAAC,MAAM,CAAC,CAAC,CAAC;gBACf,CAAC;gBACD,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;QACf,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACrB,MAAM,OAAO,GACT,OAAO,CAAC,QAAQ,KAAK,OAAO;gBACxB,CAAC,CAAC,aAAa,OAAO,GAAG;gBACzB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC3B,CAAC,CAAC,SAAS,OAAO,GAAG;oBACrB,CAAC,CAAC,aAAa,OAAO,GAAG,CAAC;YAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChC,IAAI,GAAG,EAAE,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,0DAA0D,OAAO,IAAI,CAAC,CAAC;gBACvF,CAAC;YACL,CAAC,CAAC,CAAC;YACH,IAAI,CAAC;gBACD,KAAK,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAQ,EAAE,EAAE;YAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC5B,qCAAqC;gBACrC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACJ,cAAc,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAChF,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,SAAS,GAAG,IAAI,CAAC;gBACjB,cAAc,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC,CAAC;YAChG,CAAC;QACL,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,YAAY,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/firebase.json
CHANGED
|
@@ -41,6 +41,14 @@
|
|
|
41
41
|
"source": "/auth/**",
|
|
42
42
|
"destination": "/authentication.html"
|
|
43
43
|
},
|
|
44
|
+
{
|
|
45
|
+
"source": "/oauth",
|
|
46
|
+
"destination": "/oauth.html"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"source": "/oauth/**",
|
|
50
|
+
"destination": "/oauth.html"
|
|
51
|
+
},
|
|
44
52
|
{
|
|
45
53
|
"source": "/plans",
|
|
46
54
|
"destination": "/paid_plans.html"
|
package/package.json
CHANGED
package/web/app.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* ==========================================================================
|
|
2
|
-
FrontTerrain Scout — Multi-Page Application Engine v9.0.
|
|
2
|
+
FrontTerrain Scout — Multi-Page Application Engine v9.0.6
|
|
3
3
|
========================================================================== */
|
|
4
4
|
|
|
5
5
|
const FIREBASE_CONFIG = {
|
|
@@ -609,7 +609,7 @@ async function handleRazorpayCheckout() {
|
|
|
609
609
|
currency: 'INR',
|
|
610
610
|
name: 'FrontTerrain Scout',
|
|
611
611
|
description: `Scout ${targetTier.toUpperCase()} Plan (${isAnnual ? 'Annual' : 'Monthly'})`,
|
|
612
|
-
image: 'https://
|
|
612
|
+
image: 'https://scout.frontterrain.com/ScoutFavicon.png',
|
|
613
613
|
handler: async function (response) {
|
|
614
614
|
showToast('Payment successful! Activating subscription...', 'info');
|
|
615
615
|
|
|
@@ -1037,7 +1037,7 @@ function initTerminalSimulator() {
|
|
|
1037
1037
|
`;
|
|
1038
1038
|
} else if (lower.includes('status')) {
|
|
1039
1039
|
response.innerHTML = `
|
|
1040
|
-
<span class="term-green">✔ Scout CLI Engine: v9.0.
|
|
1040
|
+
<span class="term-green">✔ Scout CLI Engine: v9.0.6 Online</span><br>
|
|
1041
1041
|
↳ User: <strong>${escapeHtml(state.user ? state.user.name : 'Guest Session')}</strong><br>
|
|
1042
1042
|
↳ Active Subscription: <strong>${escapeHtml(TIER_DETAILS[state.currentTier].name)}</strong><br>
|
|
1043
1043
|
↳ Credit Quota: <strong>${state.byokEnabled ? 'BYOK Mode (Unlimited)' : `${state.creditsUsed} / ${state.creditsTotal} Credits Used`}</strong><br>
|
package/web/styles.css
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* ==========================================================================
|
|
2
|
-
FrontTerrain Scout — Design System & Visual Engine v9.0.
|
|
2
|
+
FrontTerrain Scout — Design System & Visual Engine v9.0.6
|
|
3
3
|
Inspired by HappyRobot, Linear.app & Vercel aesthetics
|
|
4
4
|
========================================================================== */
|
|
5
5
|
|
|
@@ -1063,7 +1063,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
|
1063
1063
|
.footer-links a:hover { color: var(--hr-rust); }
|
|
1064
1064
|
|
|
1065
1065
|
/* ==========================================================================
|
|
1066
|
-
Visual Perception & Automation Engine v9.0.
|
|
1066
|
+
Visual Perception & Automation Engine v9.0.6
|
|
1067
1067
|
========================================================================== */
|
|
1068
1068
|
.vision-banner {
|
|
1069
1069
|
margin-bottom: 28px;
|