ft-scout 8.0.0 → 8.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.
- package/README.md +40 -5
- package/bin/src/commands/agent.d.ts.map +1 -1
- package/bin/src/commands/agent.js +12 -7
- package/bin/src/commands/agent.js.map +1 -1
- package/bin/src/engine/agentEngine.d.ts.map +1 -1
- package/bin/src/engine/agentEngine.js +290 -177
- package/bin/src/engine/agentEngine.js.map +1 -1
- package/bin/src/engine/appControl.d.ts.map +1 -1
- package/bin/src/engine/appControl.js +693 -62
- package/bin/src/engine/appControl.js.map +1 -1
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +4 -3
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/engine/voiceEngine.d.ts.map +1 -1
- package/bin/src/engine/voiceEngine.js +67 -199
- package/bin/src/engine/voiceEngine.js.map +1 -1
- package/bin/src/index.js +4 -4
- package/bin/src/utils/branding.js +1 -1
- package/package.json +2 -2
- package/web/app.js +2 -2
- package/web/styles.css +1 -1
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { exec } from 'child_process';
|
|
1
|
+
import { exec, spawn } from 'child_process';
|
|
3
2
|
import { promisify } from 'util';
|
|
4
3
|
import chalk from 'chalk';
|
|
5
|
-
import { select, isCancel } from '@clack/prompts';
|
|
6
|
-
import { openApp } from './appControl.js';
|
|
4
|
+
import { select, isCancel, spinner } from '@clack/prompts';
|
|
7
5
|
const execAsync = promisify(exec);
|
|
8
6
|
export async function promptInteractionMode() {
|
|
9
7
|
try {
|
|
@@ -47,15 +45,18 @@ export async function speakText(text, options) {
|
|
|
47
45
|
const truncatedText = cleanStr.length > 500 ? cleanStr.slice(0, 500) + '...' : cleanStr;
|
|
48
46
|
try {
|
|
49
47
|
if (platform === 'win32') {
|
|
50
|
-
|
|
51
|
-
const escaped = truncatedText.replace(/`/g, '``').replace(/"/g, '`"').replace(/'/g, "''");
|
|
48
|
+
const escaped = truncatedText.replace(/"/g, '`"').replace(/'/g, "''");
|
|
52
49
|
const psScript = `Add-Type -AssemblyName System.Speech; $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer; $synth.Speak("${escaped}");`;
|
|
53
|
-
const cmd = `powershell -NoProfile -ExecutionPolicy Bypass -Command "${psScript}"`;
|
|
54
50
|
if (options?.async) {
|
|
55
|
-
|
|
51
|
+
const child = spawn('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psScript], { detached: true, stdio: 'ignore' });
|
|
52
|
+
child.unref();
|
|
56
53
|
}
|
|
57
54
|
else {
|
|
58
|
-
await
|
|
55
|
+
await new Promise((resolve) => {
|
|
56
|
+
const child = spawn('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psScript]);
|
|
57
|
+
child.on('close', () => resolve());
|
|
58
|
+
child.on('error', () => resolve());
|
|
59
|
+
});
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
else if (platform === 'darwin') {
|
|
@@ -85,202 +86,69 @@ export async function speakText(text, options) {
|
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
/**
|
|
88
|
-
* Speech-to-Text (STT)
|
|
89
|
+
* Native Speech-to-Text (STT) directly inside the terminal (no browser webpage).
|
|
89
90
|
*/
|
|
90
91
|
export function listenSpeechToText(options) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
133
|
-
res.end(JSON.stringify({ error: 'invalid payload' }));
|
|
92
|
+
const timeoutSecs = Math.max(5, Math.round((options?.timeoutMs || 15000) / 1000));
|
|
93
|
+
const s = spinner();
|
|
94
|
+
s.start(chalk.cyan(` Listening to your microphone in terminal (${timeoutSecs}s timeout)... Speak now!`));
|
|
95
|
+
const platform = process.platform;
|
|
96
|
+
if (platform === 'win32') {
|
|
97
|
+
return new Promise((resolve) => {
|
|
98
|
+
const psScript = `
|
|
99
|
+
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
100
|
+
Add-Type -AssemblyName System.Speech
|
|
101
|
+
try {
|
|
102
|
+
$culture = New-Object System.Globalization.CultureInfo("en-US")
|
|
103
|
+
$engine = New-Object System.Speech.Recognition.SpeechRecognitionEngine($culture)
|
|
104
|
+
$engine.SetInputToDefaultAudioDevice()
|
|
105
|
+
$grammar = New-Object System.Speech.Recognition.DictationGrammar
|
|
106
|
+
$engine.LoadGrammar($grammar)
|
|
107
|
+
$result = $engine.Recognize([TimeSpan]::FromSeconds(${timeoutSecs}))
|
|
108
|
+
if ($result -and $result.Text) {
|
|
109
|
+
[Console]::WriteLine("TRANSCRIPT:" + $result.Text)
|
|
110
|
+
} else {
|
|
111
|
+
[Console]::WriteLine("NO_SPEECH")
|
|
112
|
+
}
|
|
113
|
+
} catch {
|
|
114
|
+
[Console]::WriteLine("ERROR:" + $_.Exception.Message)
|
|
115
|
+
}
|
|
116
|
+
`.trim();
|
|
117
|
+
const child = spawn('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psScript]);
|
|
118
|
+
let output = '';
|
|
119
|
+
child.stdout?.on('data', (data) => {
|
|
120
|
+
output += data.toString();
|
|
121
|
+
});
|
|
122
|
+
child.on('close', () => {
|
|
123
|
+
s.stop('Terminal microphone recording complete.');
|
|
124
|
+
let transcript = '';
|
|
125
|
+
const lines = output.split('\n').map((l) => l.trim());
|
|
126
|
+
for (const line of lines) {
|
|
127
|
+
if (line.startsWith('TRANSCRIPT:')) {
|
|
128
|
+
transcript = line.replace('TRANSCRIPT:', '').trim();
|
|
129
|
+
break;
|
|
134
130
|
}
|
|
135
|
-
});
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
// Options CORS preflight
|
|
139
|
-
if (req.method === 'OPTIONS') {
|
|
140
|
-
res.writeHead(204, {
|
|
141
|
-
'Access-Control-Allow-Origin': '*',
|
|
142
|
-
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
143
|
-
'Access-Control-Allow-Headers': 'Content-Type',
|
|
144
|
-
});
|
|
145
|
-
res.end();
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
// HTML Page for Web Speech API Microphone listener
|
|
149
|
-
const html = `<!DOCTYPE html>
|
|
150
|
-
<html lang="en">
|
|
151
|
-
<head>
|
|
152
|
-
<meta charset="UTF-8">
|
|
153
|
-
<title>Scout Agent Voice Listener</title>
|
|
154
|
-
<style>
|
|
155
|
-
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
156
|
-
body {
|
|
157
|
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
158
|
-
background: #0f172a;
|
|
159
|
-
color: #f8fafc;
|
|
160
|
-
display: flex;
|
|
161
|
-
align-items: center;
|
|
162
|
-
justify-content: center;
|
|
163
|
-
height: 100vh;
|
|
164
|
-
text-align: center;
|
|
165
|
-
}
|
|
166
|
-
.card {
|
|
167
|
-
background: #1e293b;
|
|
168
|
-
padding: 40px 30px;
|
|
169
|
-
border-radius: 20px;
|
|
170
|
-
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5);
|
|
171
|
-
max-width: 450px;
|
|
172
|
-
width: 90%;
|
|
173
|
-
border: 1px solid #334155;
|
|
174
|
-
}
|
|
175
|
-
.mic-icon {
|
|
176
|
-
width: 80px;
|
|
177
|
-
height: 80px;
|
|
178
|
-
background: #0284c7;
|
|
179
|
-
border-radius: 50%;
|
|
180
|
-
display: flex;
|
|
181
|
-
align-items: center;
|
|
182
|
-
justify-content: center;
|
|
183
|
-
margin: 0 auto 20px;
|
|
184
|
-
box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.7);
|
|
185
|
-
animation: pulse 1.5s infinite;
|
|
186
|
-
}
|
|
187
|
-
@keyframes pulse {
|
|
188
|
-
0% { box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.7); }
|
|
189
|
-
70% { box-shadow: 0 0 0 20px rgba(2, 132, 199, 0); }
|
|
190
|
-
100% { box-shadow: 0 0 0 0 rgba(2, 132, 199, 0); }
|
|
191
|
-
}
|
|
192
|
-
h2 { font-size: 24px; color: #38bdf8; margin-bottom: 10px; }
|
|
193
|
-
p { font-size: 15px; color: #94a3b8; margin-bottom: 20px; }
|
|
194
|
-
.transcript {
|
|
195
|
-
font-size: 18px;
|
|
196
|
-
font-weight: 600;
|
|
197
|
-
color: #f1f5f9;
|
|
198
|
-
min-height: 50px;
|
|
199
|
-
background: #0f172a;
|
|
200
|
-
padding: 15px;
|
|
201
|
-
border-radius: 10px;
|
|
202
|
-
border: 1px dashed #475569;
|
|
203
|
-
margin-bottom: 15px;
|
|
204
|
-
word-wrap: break-word;
|
|
205
|
-
}
|
|
206
|
-
.status { font-size: 13px; color: #64748b; }
|
|
207
|
-
</style>
|
|
208
|
-
</head>
|
|
209
|
-
<body>
|
|
210
|
-
<div class="card">
|
|
211
|
-
<div class="mic-icon">
|
|
212
|
-
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2">
|
|
213
|
-
<path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/>
|
|
214
|
-
<path d="M19 10v2a7 7 0 0 1-14 0v-2"/>
|
|
215
|
-
<line x1="12" y1="19" x2="12" y2="23"/>
|
|
216
|
-
<line x1="8" y1="23" x2="16" y2="23"/>
|
|
217
|
-
</svg>
|
|
218
|
-
</div>
|
|
219
|
-
<h2>Listening to your voice...</h2>
|
|
220
|
-
<p>Speak your prompt or goal clearly into your microphone.</p>
|
|
221
|
-
<div class="transcript" id="transcript">Listening...</div>
|
|
222
|
-
<div class="status" id="status">Scout Agent Voice Bridge Active</div>
|
|
223
|
-
</div>
|
|
224
|
-
<script>
|
|
225
|
-
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
|
|
226
|
-
const transcriptEl = document.getElementById('transcript');
|
|
227
|
-
const statusEl = document.getElementById('status');
|
|
228
|
-
|
|
229
|
-
if (!SpeechRecognition) {
|
|
230
|
-
transcriptEl.textContent = "Web Speech API not supported in this browser.";
|
|
231
|
-
statusEl.textContent = "Please use Chrome, Edge, or Brave.";
|
|
232
|
-
} else {
|
|
233
|
-
const recognition = new SpeechRecognition();
|
|
234
|
-
recognition.continuous = false;
|
|
235
|
-
recognition.interimResults = true;
|
|
236
|
-
recognition.lang = 'en-US';
|
|
237
|
-
|
|
238
|
-
recognition.onresult = (event) => {
|
|
239
|
-
let current = '';
|
|
240
|
-
for (let i = event.resultIndex; i < event.results.length; i++) {
|
|
241
|
-
current += event.results[i][0].transcript;
|
|
242
131
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
if (event.results[0].isFinal) {
|
|
246
|
-
statusEl.textContent = "Sending transcript to Scout CLI...";
|
|
247
|
-
fetch('/api/speech', {
|
|
248
|
-
method: 'POST',
|
|
249
|
-
headers: { 'Content-Type': 'application/json' },
|
|
250
|
-
body: JSON.stringify({ transcript: current })
|
|
251
|
-
}).then(() => {
|
|
252
|
-
statusEl.textContent = "Done! Closing window...";
|
|
253
|
-
setTimeout(() => window.close(), 1000);
|
|
254
|
-
}).catch(err => {
|
|
255
|
-
console.error(err);
|
|
256
|
-
});
|
|
132
|
+
if (transcript) {
|
|
133
|
+
resolve(transcript);
|
|
257
134
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
recognition.start();
|
|
269
|
-
}
|
|
270
|
-
</script>
|
|
271
|
-
</body>
|
|
272
|
-
</html>`;
|
|
273
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
274
|
-
res.end(html);
|
|
135
|
+
else {
|
|
136
|
+
resolve('');
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
child.on('error', () => {
|
|
140
|
+
s.stop(chalk.yellow('Terminal microphone listener ended.'));
|
|
141
|
+
resolve('');
|
|
142
|
+
});
|
|
275
143
|
});
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
return new Promise((resolve) => {
|
|
147
|
+
setTimeout(() => {
|
|
148
|
+
s.stop(chalk.yellow('Terminal microphone listening finished.'));
|
|
149
|
+
resolve('');
|
|
150
|
+
}, 3000);
|
|
283
151
|
});
|
|
284
|
-
}
|
|
152
|
+
}
|
|
285
153
|
}
|
|
286
154
|
//# sourceMappingURL=voiceEngine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voiceEngine.js","sourceRoot":"","sources":["voiceEngine.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"voiceEngine.js","sourceRoot":"","sources":["voiceEngine.ts"],"names":[],"mappings":"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"}
|
package/bin/src/index.js
CHANGED
|
@@ -32,13 +32,13 @@ program
|
|
|
32
32
|
.name('scout')
|
|
33
33
|
.alias('ft')
|
|
34
34
|
.description('FrontTerrain — The Onboarding Co-Pilot for New Codebases')
|
|
35
|
-
.version('8.0.
|
|
35
|
+
.version('8.0.2');
|
|
36
36
|
// Header UI on execution with FrontTerrain proprietary logo & version auto-checker
|
|
37
37
|
program.hook('preAction', async (_thisCommand, actionCommand) => {
|
|
38
|
-
intro(renderBranding('8.0.
|
|
38
|
+
intro(renderBranding('8.0.2'));
|
|
39
39
|
const cmdName = actionCommand ? actionCommand.name() : '';
|
|
40
40
|
if (cmdName !== 'upgrade') {
|
|
41
|
-
await checkForUpdates('8.0.
|
|
41
|
+
await checkForUpdates('8.0.2');
|
|
42
42
|
}
|
|
43
43
|
// Auth Guard: enforce authentication for all commands except login, signup, upgrade, help, dashboard, auth, status
|
|
44
44
|
const EXEMPT_COMMANDS = ['login', 'signin', 'signup', 'register', 'upgrade', 'help', 'dashboard', 'web-ui', 'gui', 'auth', 'status', 'quota', 'usage', 'credits'];
|
|
@@ -233,7 +233,7 @@ program
|
|
|
233
233
|
.command('upgrade')
|
|
234
234
|
.description('Check for updates and auto-upgrade Scout to the latest version')
|
|
235
235
|
.action(async () => {
|
|
236
|
-
await checkForUpdates('8.0.
|
|
236
|
+
await checkForUpdates('8.0.2', true);
|
|
237
237
|
outro(chalk.cyan('Upgrade check complete.'));
|
|
238
238
|
});
|
|
239
239
|
program
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
export function renderBranding(version = '8.0.
|
|
2
|
+
export function renderBranding(version = '8.0.2') {
|
|
3
3
|
const logo = chalk.cyan.bold(' ███████╗████████╗') + ' ' + chalk.cyan.bold('███████╗ ██████╗ ██████╗ ██╗ ██╗████████╗') + '\n' +
|
|
4
4
|
chalk.cyan.bold(' ██╔════╝╚══██╔══╝') + ' ' + chalk.cyan.bold('██╔════╝ ██╔════╝██╔═══██╗ ██║ ██║╚══██╔══╝') + '\n' +
|
|
5
5
|
chalk.cyan.bold(' █████╗ ██║ ') + ' ' + chalk.cyan.bold(' ███████╗ ██║ ██║ ██║ ██║ ██║ ██║ ') + '\n' +
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ft-scout",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "FrontTerrain — The Onboarding Co-Pilot for New Codebases",
|
|
6
6
|
"main": "index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@clack/prompts": "^1.7.0",
|
|
37
|
-
"@types/nodemailer": "^8.0.
|
|
37
|
+
"@types/nodemailer": "^8.0.2",
|
|
38
38
|
"chalk": "^6.0.0",
|
|
39
39
|
"commander": "^13.1.0",
|
|
40
40
|
"dotenv": "^17.4.2",
|
package/web/app.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* ==========================================================================
|
|
2
|
-
FrontTerrain Scout — Multi-Page Application Engine v8.0.
|
|
2
|
+
FrontTerrain Scout — Multi-Page Application Engine v8.0.2
|
|
3
3
|
========================================================================== */
|
|
4
4
|
|
|
5
5
|
const FIREBASE_CONFIG = {
|
|
@@ -452,7 +452,7 @@ function initTerminalSimulator() {
|
|
|
452
452
|
`;
|
|
453
453
|
} else if (lower.includes('status')) {
|
|
454
454
|
response.innerHTML = `
|
|
455
|
-
<span class="term-green">✔ Scout CLI Engine: v8.0.
|
|
455
|
+
<span class="term-green">✔ Scout CLI Engine: v8.0.2 Online</span><br>
|
|
456
456
|
↳ User: <strong>${escapeHtml(state.user ? state.user.name : 'Guest Session')}</strong><br>
|
|
457
457
|
↳ Active Subscription: <strong>${escapeHtml(TIER_DETAILS[state.currentTier].name)}</strong><br>
|
|
458
458
|
↳ 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 v8.0.
|
|
2
|
+
FrontTerrain Scout — Design System & Visual Engine v8.0.2
|
|
3
3
|
Inspired by HappyRobot, Linear.app & Vercel aesthetics
|
|
4
4
|
========================================================================== */
|
|
5
5
|
|