ft-scout 9.4.6 → 9.4.8
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 -8
- package/.scoutrules +13 -0
- package/AUTONOMOUS_FEATURES.md +15 -10
- package/README.md +588 -482
- package/bin/src/commands/agent.d.ts.map +1 -1
- package/bin/src/commands/agent.js +73 -25
- package/bin/src/commands/agent.js.map +1 -1
- package/bin/src/commands/authCommand.d.ts.map +1 -1
- package/bin/src/commands/authCommand.js +4 -10
- package/bin/src/commands/authCommand.js.map +1 -1
- package/bin/src/commands/benchmark.d.ts.map +1 -1
- package/bin/src/commands/benchmark.js +0 -5
- package/bin/src/commands/benchmark.js.map +1 -1
- package/bin/src/commands/checkpoint.d.ts.map +1 -0
- package/bin/src/commands/checkpoint.js +49 -0
- package/bin/src/commands/checkpoint.js.map +1 -0
- package/bin/src/commands/init.d.ts.map +1 -1
- package/bin/src/commands/init.js +14 -17
- package/bin/src/commands/init.js.map +1 -1
- package/bin/src/commands/login.d.ts.map +1 -1
- package/bin/src/commands/login.js +2 -17
- package/bin/src/commands/login.js.map +1 -1
- package/bin/src/commands/plan.d.ts.map +1 -1
- package/bin/src/commands/plan.js +36 -6
- package/bin/src/commands/plan.js.map +1 -1
- package/bin/src/commands/pr.d.ts.map +1 -0
- package/bin/src/commands/pr.js +191 -0
- package/bin/src/commands/pr.js.map +1 -0
- package/bin/src/commands/watch.d.ts.map +1 -0
- package/bin/src/commands/watch.js +149 -0
- package/bin/src/commands/watch.js.map +1 -0
- package/bin/src/engine/agentEngine.d.ts.map +1 -1
- package/bin/src/engine/agentEngine.js +492 -375
- package/bin/src/engine/agentEngine.js.map +1 -1
- package/bin/src/engine/checkpoints/checkpointManager.d.ts.map +1 -0
- package/bin/src/engine/checkpoints/checkpointManager.js +171 -0
- package/bin/src/engine/checkpoints/checkpointManager.js.map +1 -0
- package/bin/src/engine/computer/computerController.d.ts.map +1 -1
- package/bin/src/engine/computer/computerController.js +49 -0
- package/bin/src/engine/computer/computerController.js.map +1 -1
- package/bin/src/engine/computer/operatorHud.d.ts.map +1 -0
- package/bin/src/engine/computer/operatorHud.js +126 -0
- package/bin/src/engine/computer/operatorHud.js.map +1 -0
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +21 -51
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -1
- package/bin/src/engine/runtime/agentRuntime.js +308 -206
- package/bin/src/engine/runtime/agentRuntime.js.map +1 -1
- package/bin/src/engine/subagents/subagentManager.d.ts.map +1 -0
- package/bin/src/engine/subagents/subagentManager.js +96 -0
- package/bin/src/engine/subagents/subagentManager.js.map +1 -0
- package/bin/src/engine/toolRegistry.js +1 -1
- package/bin/src/engine/toolRegistry.js.map +1 -1
- package/bin/src/engine/voiceEngine.d.ts.map +1 -1
- package/bin/src/engine/voiceEngine.js +27 -238
- package/bin/src/engine/voiceEngine.js.map +1 -1
- package/bin/src/engine/workspace/agentWorkspace.d.ts.map +1 -1
- package/bin/src/engine/workspace/agentWorkspace.js +22 -9
- package/bin/src/engine/workspace/agentWorkspace.js.map +1 -1
- package/bin/src/index.js +76 -9
- package/bin/src/index.js.map +1 -1
- package/bin/src/mcp/client.js +1 -1
- package/bin/src/server/server.d.ts.map +1 -1
- package/bin/src/server/server.js +37 -3
- package/bin/src/server/server.js.map +1 -1
- package/bin/src/utils/admin.d.ts.map +1 -1
- package/bin/src/utils/admin.js +63 -0
- package/bin/src/utils/admin.js.map +1 -1
- package/bin/src/utils/auth.d.ts.map +1 -1
- package/bin/src/utils/auth.js +10 -5
- package/bin/src/utils/auth.js.map +1 -1
- package/bin/src/utils/branding.js +1 -1
- package/bin/src/utils/claudeUI.d.ts.map +1 -0
- package/bin/src/utils/claudeUI.js +404 -0
- package/bin/src/utils/claudeUI.js.map +1 -0
- package/bin/src/utils/interruptHandler.d.ts.map +1 -0
- package/bin/src/utils/interruptHandler.js +121 -0
- package/bin/src/utils/interruptHandler.js.map +1 -0
- package/bin/src/utils/payment.d.ts.map +1 -1
- package/bin/src/utils/payment.js +1 -1
- package/bin/src/utils/payment.js.map +1 -1
- package/bin/src/utils/pricing.d.ts.map +1 -1
- package/bin/src/utils/pricing.js +106 -45
- package/bin/src/utils/pricing.js.map +1 -1
- package/bin/src/utils/qrBridge.d.ts.map +1 -1
- package/bin/src/utils/qrBridge.js +17 -17
- package/bin/src/utils/qrBridge.js.map +1 -1
- package/bin/src/utils/rules.d.ts.map +1 -0
- package/bin/src/utils/rules.js +105 -0
- package/bin/src/utils/rules.js.map +1 -0
- package/bin/src/utils/updateCheck.d.ts.map +1 -1
- package/bin/src/utils/updateCheck.js +12 -1
- package/bin/src/utils/updateCheck.js.map +1 -1
- package/firebase.json +1 -1
- package/package.json +1 -1
- package/web/app.js +110 -52
- package/web/styles.css +3 -3
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
/**
|
|
5
|
+
* Ordered list of candidate filenames for workspace-specific rules.
|
|
6
|
+
* Supports native Scout formats (.scoutrules, SCOUT.md, .scout/rules.md)
|
|
7
|
+
* as well as cross-tool compatibility (.cursorrules, CLAUDE.md).
|
|
8
|
+
*/
|
|
9
|
+
const CANDIDATE_RULE_FILES = [
|
|
10
|
+
'.scoutrules',
|
|
11
|
+
'SCOUT.md',
|
|
12
|
+
path.join('.scout', 'rules.md'),
|
|
13
|
+
path.join('.scout', 'rules'),
|
|
14
|
+
'.cursorrules',
|
|
15
|
+
'CLAUDE.md',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Format raw rules content into an authoritative instruction block for the agent's system prompt.
|
|
19
|
+
*/
|
|
20
|
+
export function formatRulesForPrompt(content, fileName) {
|
|
21
|
+
const trimmed = content.trim();
|
|
22
|
+
if (!trimmed)
|
|
23
|
+
return '';
|
|
24
|
+
return `================================================================================
|
|
25
|
+
PROJECT RULES & CODING STANDARDS (Loaded from ${fileName}):
|
|
26
|
+
You MUST strictly adhere to the following project-specific guidelines, architectural rules,
|
|
27
|
+
and code styling conventions defined for this repository:
|
|
28
|
+
|
|
29
|
+
${trimmed}
|
|
30
|
+
================================================================================`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Discover and load workspace rules from the current working directory.
|
|
34
|
+
*/
|
|
35
|
+
export function loadWorkspaceRules(cwd = process.cwd()) {
|
|
36
|
+
for (const relPath of CANDIDATE_RULE_FILES) {
|
|
37
|
+
const fullPath = path.resolve(cwd, relPath);
|
|
38
|
+
if (fs.existsSync(fullPath)) {
|
|
39
|
+
try {
|
|
40
|
+
const stat = fs.statSync(fullPath);
|
|
41
|
+
if (stat.isFile()) {
|
|
42
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
43
|
+
const fileName = path.basename(relPath);
|
|
44
|
+
const formattedPrompt = formatRulesForPrompt(content, fileName);
|
|
45
|
+
return {
|
|
46
|
+
found: true,
|
|
47
|
+
filePath: fullPath,
|
|
48
|
+
fileName,
|
|
49
|
+
content,
|
|
50
|
+
formattedPrompt,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Ignore unreadable file and proceed to next candidate
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
found: false,
|
|
61
|
+
content: '',
|
|
62
|
+
formattedPrompt: '',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Generate a starter .scoutrules template file for a project repository.
|
|
67
|
+
*/
|
|
68
|
+
export function createDefaultScoutRules(cwd = process.cwd(), overwrite = false) {
|
|
69
|
+
const targetPath = path.resolve(cwd, '.scoutrules');
|
|
70
|
+
if (fs.existsSync(targetPath) && !overwrite) {
|
|
71
|
+
return {
|
|
72
|
+
created: false,
|
|
73
|
+
path: targetPath,
|
|
74
|
+
error: 'File .scoutrules already exists in this directory.',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const template = `# Scout Project Rules (.scoutrules)
|
|
78
|
+
# This file is automatically loaded by Scout CLI AI Agent to enforce repository-specific standards.
|
|
79
|
+
|
|
80
|
+
## Code Quality & Architecture
|
|
81
|
+
- Write modular, type-safe, and self-documenting code.
|
|
82
|
+
- Prefer functional patterns and pure helper functions where applicable.
|
|
83
|
+
- Avoid introducing unnecessary third-party dependencies.
|
|
84
|
+
|
|
85
|
+
## Testing & Verification
|
|
86
|
+
- Always ensure all unit tests pass before completing a task (\`npm test\` or equivalent).
|
|
87
|
+
- Check syntax and type compatibility before calling task_completed.
|
|
88
|
+
|
|
89
|
+
## Style & Conventions
|
|
90
|
+
- Maintain consistent indentation (2 spaces) and clean naming conventions.
|
|
91
|
+
- Never commit secrets, API keys, or temporary debugging logs.
|
|
92
|
+
`;
|
|
93
|
+
try {
|
|
94
|
+
fs.writeFileSync(targetPath, template, 'utf-8');
|
|
95
|
+
return { created: true, path: targetPath };
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return {
|
|
99
|
+
created: false,
|
|
100
|
+
path: targetPath,
|
|
101
|
+
error: err instanceof Error ? err.message : String(err),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B;;;;GAIG;AACH,MAAM,oBAAoB,GAAG;IACzB,aAAa;IACb,UAAU;IACV,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC5B,cAAc;IACd,WAAW;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,QAAgB;IAClE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,OAAO;gDACqC,QAAQ;;;;EAItD,OAAO;iFACwE,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE;IAC1D,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACxC,MAAM,eAAe,GAAG,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oBAChE,OAAO;wBACH,KAAK,EAAE,IAAI;wBACX,QAAQ,EAAE,QAAQ;wBAClB,QAAQ;wBACR,OAAO;wBACP,eAAe;qBAClB,CAAC;gBACN,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,uDAAuD;YAC3D,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,EAAE;KACtB,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACnC,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE,EAC3B,SAAS,GAAY,KAAK;IAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1C,OAAO;YACH,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,oDAAoD;SAC9D,CAAC;IACN,CAAC;IAED,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;CAepB,CAAC;IAEE,IAAI,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACpB,OAAO;YACH,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheck.d.ts","sourceRoot":"","sources":["updateCheck.ts"],"names":[],"mappings":"AA0BA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"updateCheck.d.ts","sourceRoot":"","sources":["updateCheck.ts"],"names":[],"mappings":"AA0BA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBjE;AAED,wBAAsB,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFxG"}
|
|
@@ -20,9 +20,11 @@ function semverGt(latest, current) {
|
|
|
20
20
|
}
|
|
21
21
|
export async function fetchLatestVersion() {
|
|
22
22
|
const controller = new AbortController();
|
|
23
|
-
const timeoutId = setTimeout(() => controller.abort(),
|
|
23
|
+
const timeoutId = setTimeout(() => controller.abort(), 1200);
|
|
24
24
|
const packages = ['ft-scout', 'scout'];
|
|
25
25
|
for (const pkg of packages) {
|
|
26
|
+
if (controller.signal.aborted)
|
|
27
|
+
break;
|
|
26
28
|
try {
|
|
27
29
|
const res = await fetch(`https://registry.npmjs.org/${pkg}/latest`, {
|
|
28
30
|
signal: controller.signal,
|
|
@@ -66,6 +68,15 @@ export async function checkForUpdates(currentVersion, forceCheck = false) {
|
|
|
66
68
|
// Ignore cache write errors
|
|
67
69
|
}
|
|
68
70
|
}
|
|
71
|
+
else {
|
|
72
|
+
// Cache current timestamp so network failures or offline mode don't lag future commands
|
|
73
|
+
try {
|
|
74
|
+
fs.writeFileSync(CACHE_FILE, JSON.stringify({ lastCheck: now, latestVersion: cache?.latestVersion || currentVersion }, null, 2));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Ignore cache write errors
|
|
78
|
+
}
|
|
79
|
+
}
|
|
69
80
|
}
|
|
70
81
|
if (latestVersion && semverGt(latestVersion, currentVersion)) {
|
|
71
82
|
console.log('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["updateCheck.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["updateCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,0BAA0B,CAAC,CAAC;AACvE,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;AAOxD,SAAS,QAAQ,CAAC,MAAc,EAAE,OAAe;IAC7C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACpC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM;QACrC,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,GAAG,SAAS,EAAE;gBAChE,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE,EAAE,YAAY,EAAE,wBAAwB,EAAE;aACtD,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;gBACxD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,OAAO,IAAI,CAAC,OAAO,CAAC;gBACxB,CAAC;YACL,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,4CAA4C;QAChD,CAAC;IACL,CAAC;IACD,YAAY,CAAC,SAAS,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,cAAsB,EAAE,UAAU,GAAY,KAAK;IACrF,IAAI,KAAK,GAAuB,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,IAAI,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,KAAK,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,aAAa,GAAG,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC;IAEjD,IAAI,UAAU,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,aAAa,GAAG,OAAO,CAAC;YACxB,IAAI,CAAC;gBACD,EAAE,CAAC,aAAa,CACZ,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACtE,CAAC;YACN,CAAC;YAAC,MAAM,CAAC;gBACL,4BAA4B;YAChC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,wFAAwF;YACxF,IAAI,CAAC;gBACD,EAAE,CAAC,aAAa,CACZ,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACrG,CAAC;YACN,CAAC;YAAC,MAAM,CAAC;gBACL,4BAA4B;YAChC,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CACA,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC;YAC/D,IAAI;YACJ,YAAY,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC,YAAY,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,MAAM;YACrG,iBAAiB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,EACxD,mBAAmB,CACtB,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;gBAChC,OAAO,EAAE,yDAAyD,aAAa,aAAa;gBAC5F,YAAY,EAAE,IAAI;aACrB,CAAC,CAAC;YAEH,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;gBACpB,CAAC,CAAC,KAAK,CAAC,oCAAoC,aAAa,KAAK,CAAC,CAAC;gBAChE,IAAI,CAAC;oBACD,QAAQ,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBACvD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,gDAAgD,aAAa,IAAI,CAAC,CAAC,CAAC;gBAC3F,CAAC;gBAAC,MAAM,CAAC;oBACL,IAAI,CAAC;wBACD,QAAQ,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;wBACpD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,gDAAgD,aAAa,IAAI,CAAC,CAAC,CAAC;oBAC3F,CAAC;oBAAC,MAAM,CAAC;wBACL,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;wBAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;oBAC3E,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,mDAAmD;QACvD,CAAC;IACL,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACpB,IAAI,CACA,KAAK,CAAC,KAAK,CAAC,oEAAoE,cAAc,IAAI,CAAC,EACnG,aAAa,CAChB,CAAC;IACN,CAAC;AACL,CAAC"}
|
package/firebase.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"headers": [
|
|
16
16
|
{
|
|
17
17
|
"key": "Content-Security-Policy",
|
|
18
|
-
"value": "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdnjs.cloudflare.com https://www.paypal.com https://www.sandbox.paypal.com https://*.paypalobjects.com https://apis.google.com https://static.cloudflareinsights.com https://checkout.razorpay.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdnjs.cloudflare.com; font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com data:; img-src 'self' data: blob: https: https://*.paypalobjects.com https://cdn.razorpay.com; connect-src 'self' http://localhost:* http://127.0.0.1:* https://localhost:* https://identitytoolkit.googleapis.com https://securetoken.googleapis.com https://*.paypal.com https://*.paypalobjects.com https://api.razorpay.com https://lumberjack.razorpay.com https://lumberjack-rzp.razorpay.com https://api.openai.com https://
|
|
18
|
+
"value": "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdnjs.cloudflare.com https://www.paypal.com https://www.sandbox.paypal.com https://*.paypalobjects.com https://apis.google.com https://static.cloudflareinsights.com https://checkout.razorpay.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdnjs.cloudflare.com; font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com data:; img-src 'self' data: blob: https: https://*.paypalobjects.com https://cdn.razorpay.com; connect-src 'self' http://localhost:* http://127.0.0.1:* https://localhost:* https://identitytoolkit.googleapis.com https://securetoken.googleapis.com https://*.paypal.com https://*.paypalobjects.com https://api.razorpay.com https://lumberjack.razorpay.com https://lumberjack-rzp.razorpay.com https://api.openai.com https://integrate.api.nvidia.com https://generativelanguage.googleapis.com https://*.firebaseio.com https://*.googleapis.com https://cloudflareinsights.com https://static.cloudflareinsights.com; frame-src 'self' https://www.paypal.com https://www.sandbox.paypal.com https://*.firebaseapp.com https://api.razorpay.com https://checkout.razorpay.com; object-src 'none'; base-uri 'self';"
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"key": "Cache-Control",
|
package/package.json
CHANGED
package/web/app.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* ==========================================================================
|
|
2
|
-
FrontTerrain Scout Multi-Page Application Engine v9.4.
|
|
2
|
+
FrontTerrain Scout Multi-Page Application Engine v9.4.8
|
|
3
3
|
========================================================================== */
|
|
4
4
|
|
|
5
5
|
const FIREBASE_CONFIG = {
|
|
@@ -20,14 +20,20 @@ const TIER_DETAILS = {
|
|
|
20
20
|
pro: {
|
|
21
21
|
name: 'Pro Developer Tier',
|
|
22
22
|
badge: 'PRO ACTIVE',
|
|
23
|
-
desc: 'High-power AI co-pilot capabilities, priority quota & 5 active CLI sessions.',
|
|
23
|
+
desc: 'High-power AI co-pilot capabilities, Autonomous Computer & Browser Control, priority quota & 5 active CLI sessions.',
|
|
24
24
|
icon: '<i class="fa-solid fa-bolt text-primary" style="font-size: 28px;"></i>',
|
|
25
25
|
},
|
|
26
|
+
team: {
|
|
27
|
+
name: 'Team & Squads Tier',
|
|
28
|
+
badge: 'TEAM ACTIVE',
|
|
29
|
+
desc: 'Shared Onboarding Knowledge Graph, PR Risk Gatekeeper & multi-seat controls.',
|
|
30
|
+
icon: '<i class="fa-solid fa-user-group text-info" style="font-size: 28px;"></i>',
|
|
31
|
+
},
|
|
26
32
|
enterprise: {
|
|
27
|
-
name: '
|
|
33
|
+
name: 'Enterprise Scale Tier',
|
|
28
34
|
badge: 'ENTERPRISE ACTIVE',
|
|
29
|
-
desc: 'Organization
|
|
30
|
-
icon: '<i class="fa-solid fa-building text-warning" style="font-size: 28px;"></i>',
|
|
35
|
+
desc: 'Organization security, SAML SSO, SOC2 compliance & private VPC LLM gateway.',
|
|
36
|
+
icon: '<i class="fa-solid fa-building-shield text-warning" style="font-size: 28px;"></i>',
|
|
31
37
|
},
|
|
32
38
|
};
|
|
33
39
|
|
|
@@ -54,8 +60,9 @@ let state = {
|
|
|
54
60
|
razorpayKeyId: '',
|
|
55
61
|
pricing: {
|
|
56
62
|
free: { monthlyPriceINR: 0, annualPriceINR: 0, monthlyPriceUSD: 0, annualPriceUSD: 0, credits: 100 },
|
|
57
|
-
pro: { monthlyPriceINR:
|
|
58
|
-
|
|
63
|
+
pro: { monthlyPriceINR: 1499, annualPriceINR: 1199, monthlyPriceUSD: 19, annualPriceUSD: 15, credits: 2500 },
|
|
64
|
+
team: { monthlyPriceINR: 3999, annualPriceINR: 3199, monthlyPriceUSD: 49, annualPriceUSD: 39, credits: 10000 },
|
|
65
|
+
enterprise: { monthlyPriceINR: 7999, annualPriceINR: 6399, monthlyPriceUSD: 99, annualPriceUSD: 79, credits: 30000 },
|
|
59
66
|
},
|
|
60
67
|
};
|
|
61
68
|
|
|
@@ -319,6 +326,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|
|
319
326
|
loadSessionsFromStorage();
|
|
320
327
|
initEventListeners();
|
|
321
328
|
initFAQAccordions();
|
|
329
|
+
initRoiCalculator();
|
|
322
330
|
initTerminalSimulator();
|
|
323
331
|
renderAllDynamicComponents();
|
|
324
332
|
await checkServerStatusAndSession();
|
|
@@ -822,12 +830,40 @@ function initEventListeners() {
|
|
|
822
830
|
// Auth Form Tabs Switcher
|
|
823
831
|
getEl('tab-login-btn')?.addEventListener('click', () => switchAuthForm('login'));
|
|
824
832
|
getEl('tab-signup-btn')?.addEventListener('click', () => switchAuthForm('signup'));
|
|
833
|
+
getEl('tab-sso-btn')?.addEventListener('click', () => switchAuthForm('sso'));
|
|
825
834
|
|
|
826
835
|
// Form Submissions
|
|
827
836
|
getEl('login-form')?.addEventListener('submit', handleSignIn);
|
|
828
837
|
getEl('signup-form')?.addEventListener('submit', handleSignUp);
|
|
829
838
|
getEl('btn-demo-mode')?.addEventListener('click', launchDemoSession);
|
|
830
839
|
|
|
840
|
+
// SSO & OAuth listeners
|
|
841
|
+
getEl('btn-submit-sso')?.addEventListener('click', () => {
|
|
842
|
+
const domain = (getEl('sso-domain')?.value || '').trim();
|
|
843
|
+
if (!domain) {
|
|
844
|
+
showToast('Please enter your company work email or organization domain.', 'warning');
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
showToast(`Routing to Enterprise SSO IdP for ${domain}...`, 'info');
|
|
848
|
+
setTimeout(() => {
|
|
849
|
+
showToast(`SSO Handshake established with ${domain}. Team seat license verified.`, 'success');
|
|
850
|
+
}, 1200);
|
|
851
|
+
});
|
|
852
|
+
|
|
853
|
+
document.querySelectorAll('.btn-idp-provider').forEach(btn => {
|
|
854
|
+
btn.addEventListener('click', (e) => {
|
|
855
|
+
const idp = e.currentTarget.getAttribute('data-idp') || 'Okta';
|
|
856
|
+
showToast(`Connecting to ${idp.replace('_', ' ').toUpperCase()} Single Sign-On...`, 'info');
|
|
857
|
+
});
|
|
858
|
+
});
|
|
859
|
+
|
|
860
|
+
document.querySelectorAll('.btn-quick-oauth').forEach(btn => {
|
|
861
|
+
btn.addEventListener('click', (e) => {
|
|
862
|
+
const prov = e.currentTarget.getAttribute('data-provider') || 'OAuth';
|
|
863
|
+
showToast(`Authenticating via ${prov.toUpperCase()} developer token...`, 'info');
|
|
864
|
+
});
|
|
865
|
+
});
|
|
866
|
+
|
|
831
867
|
// Password Strength Checker
|
|
832
868
|
getEl('signup-password')?.addEventListener('input', (e) => {
|
|
833
869
|
const val = e.target.value;
|
|
@@ -956,7 +992,6 @@ function initEventListeners() {
|
|
|
956
992
|
const provider = e.target.value;
|
|
957
993
|
const defaultEndpoints = {
|
|
958
994
|
nvidia: 'https://integrate.api.nvidia.com/v1',
|
|
959
|
-
groq: 'https://api.groq.com/openai/v1',
|
|
960
995
|
gemini: 'https://generativelanguage.googleapis.com/v1beta/openai',
|
|
961
996
|
openai: 'https://api.openai.com/v1',
|
|
962
997
|
custom: 'http://localhost:11434/v1',
|
|
@@ -1043,6 +1078,28 @@ function initFAQAccordions() {
|
|
|
1043
1078
|
});
|
|
1044
1079
|
}
|
|
1045
1080
|
|
|
1081
|
+
// Interactive Team ROI & Seat Calculator for $10M MRR Scale
|
|
1082
|
+
function initRoiCalculator() {
|
|
1083
|
+
const slider = getEl('range-team-size');
|
|
1084
|
+
if (!slider) return;
|
|
1085
|
+
|
|
1086
|
+
function updateRoi() {
|
|
1087
|
+
const teamSize = parseInt(slider.value, 10) || 15;
|
|
1088
|
+
const hoursSaved = teamSize * 14; // ~14 hrs/mo per engineer on onboarding + test self-healing
|
|
1089
|
+
const dollarsSaved = hoursSaved * 50; // $50/hr blended developer rate
|
|
1090
|
+
const teamCost = teamSize * 49; // $49/seat/mo
|
|
1091
|
+
const roiMultiplier = teamCost > 0 ? (dollarsSaved / teamCost).toFixed(1) : '14.0';
|
|
1092
|
+
|
|
1093
|
+
if (getEl('calc-team-count')) getEl('calc-team-count').innerText = `${teamSize} Engineers`;
|
|
1094
|
+
if (getEl('calc-hours-saved')) getEl('calc-hours-saved').innerText = `${hoursSaved.toLocaleString()} hrs`;
|
|
1095
|
+
if (getEl('calc-dollars-saved')) getEl('calc-dollars-saved').innerText = `$${dollarsSaved.toLocaleString()}`;
|
|
1096
|
+
if (getEl('calc-roi-multiplier')) getEl('calc-roi-multiplier').innerText = `${roiMultiplier}x`;
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
slider.addEventListener('input', updateRoi);
|
|
1100
|
+
updateRoi();
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1046
1103
|
// Interactive Web Terminal Simulator
|
|
1047
1104
|
function initTerminalSimulator() {
|
|
1048
1105
|
const form = getEl('cli-terminal-form');
|
|
@@ -1103,7 +1160,7 @@ function initTerminalSimulator() {
|
|
|
1103
1160
|
`;
|
|
1104
1161
|
} else if (lower.includes('status')) {
|
|
1105
1162
|
response.innerHTML = `
|
|
1106
|
-
<span class="term-green">✔ Scout CLI Engine: v9.4.
|
|
1163
|
+
<span class="term-green">✔ Scout CLI Engine: v9.4.8 Online</span><br>
|
|
1107
1164
|
↳ User: <strong>${escapeHtml(state.user ? state.user.name : 'Guest Session')}</strong><br>
|
|
1108
1165
|
↳ Active Subscription: <strong>${escapeHtml(TIER_DETAILS[state.currentTier].name)}</strong><br>
|
|
1109
1166
|
↳ Credit Quota: <strong>${state.byokEnabled ? 'BYOK Mode (Unlimited)' : `${state.creditsUsed} / ${state.creditsTotal} Credits Used`}</strong><br>
|
|
@@ -1338,10 +1395,12 @@ function renderTiersUI() {
|
|
|
1338
1395
|
const isAnnual = state.billingCycle === 'annual';
|
|
1339
1396
|
const p = state.pricing || {};
|
|
1340
1397
|
const isProOffer = p.pro?.offerActive && !isAnnual && p.pro?.offerPriceUSD !== undefined;
|
|
1398
|
+
const isTeamOffer = p.team?.offerActive && !isAnnual && p.team?.offerPriceUSD !== undefined;
|
|
1341
1399
|
const isEntOffer = p.enterprise?.offerActive && !isAnnual && p.enterprise?.offerPriceUSD !== undefined;
|
|
1342
1400
|
|
|
1343
|
-
const proUSD = isProOffer ? p.pro.offerPriceUSD : (isAnnual ? (p.pro?.annualPriceUSD ??
|
|
1344
|
-
const
|
|
1401
|
+
const proUSD = isProOffer ? p.pro.offerPriceUSD : (isAnnual ? (p.pro?.annualPriceUSD ?? 15) : (p.pro?.monthlyPriceUSD ?? 19));
|
|
1402
|
+
const teamUSD = isTeamOffer ? p.team.offerPriceUSD : (isAnnual ? (p.team?.annualPriceUSD ?? 39) : (p.team?.monthlyPriceUSD ?? 49));
|
|
1403
|
+
const entUSD = isEntOffer ? p.enterprise.offerPriceUSD : (isAnnual ? (p.enterprise?.annualPriceUSD ?? 79) : (p.enterprise?.monthlyPriceUSD ?? 99));
|
|
1345
1404
|
|
|
1346
1405
|
if (getEl('price-pro-val')) {
|
|
1347
1406
|
if (isProOffer && p.pro?.monthlyPriceUSD) {
|
|
@@ -1350,10 +1409,19 @@ function renderTiersUI() {
|
|
|
1350
1409
|
getEl('price-pro-val').innerText = proUSD;
|
|
1351
1410
|
}
|
|
1352
1411
|
}
|
|
1353
|
-
if (getEl('price-pro-period')) getEl('price-pro-period').innerText = isProOffer ? `/ month (${p.pro?.offerBadge || 'PROMO OFFER'})` : (isAnnual ? '/month(billed annually)' : '/ month');
|
|
1412
|
+
if (getEl('price-pro-period')) getEl('price-pro-period').innerText = isProOffer ? `/ month (${p.pro?.offerBadge || 'PROMO OFFER'})` : (isAnnual ? '/ month (billed annually)' : '/ month');
|
|
1354
1413
|
const proCurrency = document.querySelector('#tier-card-pro .price-currency');
|
|
1355
1414
|
if (proCurrency) proCurrency.innerText = isProOffer ? '' : '$';
|
|
1356
1415
|
|
|
1416
|
+
if (getEl('price-team-val')) {
|
|
1417
|
+
if (isTeamOffer && p.team?.monthlyPriceUSD) {
|
|
1418
|
+
getEl('price-team-val').innerHTML = `<s style="font-size: 0.55em; opacity: 0.55; margin-right: 6px;">$${p.team.monthlyPriceUSD}</s>$${teamUSD}`;
|
|
1419
|
+
} else {
|
|
1420
|
+
getEl('price-team-val').innerText = teamUSD;
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
if (getEl('price-team-period')) getEl('price-team-period').innerText = isTeamOffer ? `/ seat / mo (${p.team?.offerBadge || 'TEAM PROMO'})` : (isAnnual ? '/ seat / mo (billed annually)' : '/ seat / mo');
|
|
1424
|
+
|
|
1357
1425
|
if (getEl('price-ent-val')) {
|
|
1358
1426
|
if (isEntOffer && p.enterprise?.monthlyPriceUSD) {
|
|
1359
1427
|
getEl('price-ent-val').innerHTML = `<s style="font-size: 0.55em; opacity: 0.55; margin-right: 6px;">$${p.enterprise.monthlyPriceUSD}</s>$${entUSD}`;
|
|
@@ -1361,48 +1429,35 @@ function renderTiersUI() {
|
|
|
1361
1429
|
getEl('price-ent-val').innerText = entUSD;
|
|
1362
1430
|
}
|
|
1363
1431
|
}
|
|
1364
|
-
if (getEl('price-ent-period')) getEl('price-ent-period').innerText = isEntOffer ? `/
|
|
1432
|
+
if (getEl('price-ent-period')) getEl('price-ent-period').innerText = isEntOffer ? `/ seat / mo (${p.enterprise?.offerBadge || 'PROMO OFFER'})` : (isAnnual ? '/ seat / mo (billed annually)' : '/ seat / mo');
|
|
1365
1433
|
const entCurrency = document.querySelector('#tier-card-enterprise .price-currency');
|
|
1366
1434
|
if (entCurrency) entCurrency.innerText = isEntOffer ? '' : '$';
|
|
1367
1435
|
|
|
1368
|
-
|
|
1436
|
+
const tierRankMap = { free: 0, pro: 1, team: 2, enterprise: 3 };
|
|
1437
|
+
const curRank = tierRankMap[state.currentTier] || 0;
|
|
1438
|
+
|
|
1439
|
+
['free', 'pro', 'team', 'enterprise'].forEach((t) => {
|
|
1369
1440
|
const card = getEl(`tier-card-${t}`);
|
|
1370
1441
|
const btn = getEl(`btn-tier-${t}`);
|
|
1371
1442
|
if (!card || !btn) return;
|
|
1372
1443
|
|
|
1373
1444
|
if (t === state.currentTier) {
|
|
1374
1445
|
card.classList.add('active-tier-card');
|
|
1375
|
-
btn.className = (t === 'enterprise' ? 'btn btn-warning' : (t === 'pro' ? 'btn btn-primary' : 'btn btn-success')) + ' btn-block btn-select-tier';
|
|
1446
|
+
btn.className = (t === 'enterprise' ? 'btn btn-warning' : (t === 'team' ? 'btn btn-info' : (t === 'pro' ? 'btn btn-primary' : 'btn btn-success'))) + ' btn-block btn-select-tier';
|
|
1376
1447
|
btn.innerText = 'Current Plan';
|
|
1377
1448
|
btn.disabled = true;
|
|
1378
1449
|
} else {
|
|
1379
1450
|
card.classList.remove('active-tier-card');
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
btn.className = 'btn btn-outline btn-block btn-select-tier';
|
|
1384
|
-
btn.innerHTML = '<i class="fa-solid fa-lock" style="font-size: 11px; margin-right: 4px;"></i> Auto-shifts at Expiration';
|
|
1385
|
-
btn.title = `Paid plans cannot be downgraded. Your account will automatically shift to Free tier on ${formattedDate}.`;
|
|
1386
|
-
} else {
|
|
1387
|
-
btn.disabled = true;
|
|
1388
|
-
btn.className = 'btn btn-outline btn-block btn-select-tier';
|
|
1389
|
-
btn.innerText = 'Current Plan';
|
|
1390
|
-
}
|
|
1391
|
-
} else if (t === 'pro') {
|
|
1392
|
-
if (state.currentTier === 'enterprise') {
|
|
1393
|
-
btn.disabled = true;
|
|
1394
|
-
btn.className = 'btn btn-outline btn-block btn-select-tier';
|
|
1395
|
-
btn.innerText = 'Downgrade Not Allowed';
|
|
1396
|
-
btn.title = 'Downgrading from Enterprise to Pro is not allowed.';
|
|
1397
|
-
} else {
|
|
1398
|
-
btn.className = 'btn btn-primary btn-block btn-select-tier';
|
|
1399
|
-
btn.innerText = 'Upgrade to Pro';
|
|
1400
|
-
btn.disabled = false;
|
|
1401
|
-
}
|
|
1402
|
-
} else if (t === 'enterprise') {
|
|
1451
|
+
const targetRank = tierRankMap[t] || 0;
|
|
1452
|
+
if (targetRank < curRank) {
|
|
1453
|
+
btn.disabled = true;
|
|
1403
1454
|
btn.className = 'btn btn-outline btn-block btn-select-tier';
|
|
1404
|
-
btn.
|
|
1455
|
+
btn.innerHTML = '<i class="fa-solid fa-lock" style="font-size: 11px; margin-right: 4px;"></i> Downgrades Disabled';
|
|
1456
|
+
btn.title = `Paid plans cannot be downgraded during an active billing cycle.`;
|
|
1457
|
+
} else {
|
|
1405
1458
|
btn.disabled = false;
|
|
1459
|
+
btn.className = (t === 'team' ? 'btn btn-primary' : 'btn btn-outline') + ' btn-block btn-select-tier';
|
|
1460
|
+
btn.innerText = t === 'team' ? 'Upgrade to Team' : `Upgrade to ${t.charAt(0).toUpperCase() + t.slice(1)}`;
|
|
1406
1461
|
}
|
|
1407
1462
|
}
|
|
1408
1463
|
});
|
|
@@ -1505,17 +1560,20 @@ function checkLocalStorageSession() {
|
|
|
1505
1560
|
|
|
1506
1561
|
// Switch Auth View Forms
|
|
1507
1562
|
function switchAuthForm(mode) {
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1563
|
+
const tabLogin = getEl('tab-login-btn');
|
|
1564
|
+
const tabSignup = getEl('tab-signup-btn');
|
|
1565
|
+
const tabSso = getEl('tab-sso-btn');
|
|
1566
|
+
const formLogin = getEl('login-form');
|
|
1567
|
+
const formSignup = getEl('signup-form');
|
|
1568
|
+
const formSso = getEl('sso-form');
|
|
1569
|
+
|
|
1570
|
+
tabLogin?.classList.toggle('active', mode === 'login');
|
|
1571
|
+
tabSignup?.classList.toggle('active', mode === 'signup');
|
|
1572
|
+
tabSso?.classList.toggle('active', mode === 'sso');
|
|
1573
|
+
|
|
1574
|
+
formLogin?.classList.toggle('hidden', mode !== 'login');
|
|
1575
|
+
formSignup?.classList.toggle('hidden', mode !== 'signup');
|
|
1576
|
+
formSso?.classList.toggle('hidden', mode !== 'sso');
|
|
1519
1577
|
}
|
|
1520
1578
|
|
|
1521
1579
|
// Handle Sign In Submission
|
|
@@ -2713,7 +2771,8 @@ function initAutonomousAgentMonitor() {
|
|
|
2713
2771
|
// Step counter
|
|
2714
2772
|
const stepCounter = getEl('agent-step-counter');
|
|
2715
2773
|
if (stepCounter) {
|
|
2716
|
-
|
|
2774
|
+
const isUnlimited = !taskState.maxSteps || taskState.maxSteps >= 9999 || taskState.maxSteps === Infinity;
|
|
2775
|
+
stepCounter.innerText = isUnlimited ? `Step ${taskState.currentStep || 0}` : `Step ${taskState.currentStep || 0} / ${taskState.maxSteps}`;
|
|
2717
2776
|
}
|
|
2718
2777
|
|
|
2719
2778
|
// Plan progress & checklist
|
|
@@ -3388,7 +3447,6 @@ function initWorkstationRouter() {
|
|
|
3388
3447
|
if (topbarModel) {
|
|
3389
3448
|
const names = {
|
|
3390
3449
|
nvidia: 'Nemotron 70B',
|
|
3391
|
-
groq: 'Llama 3.3 70B',
|
|
3392
3450
|
gemini: 'Gemini 2.5 Flash',
|
|
3393
3451
|
openai: 'GPT-4o',
|
|
3394
3452
|
anthropic: 'Claude 3.7 Sonnet',
|
package/web/styles.css
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* ==========================================================================
|
|
2
|
-
FrontTerrain Scout Design System & Visual Engine v9.4.
|
|
2
|
+
FrontTerrain Scout Design System & Visual Engine v9.4.8
|
|
3
3
|
Inspired by HappyRobot, Linear.app & Vercel aesthetics
|
|
4
4
|
========================================================================== */
|
|
5
5
|
|
|
@@ -922,7 +922,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
|
922
922
|
/* Pricing Cards Grid */
|
|
923
923
|
.tiers-pricing-grid {
|
|
924
924
|
display: grid;
|
|
925
|
-
grid-template-columns: repeat(
|
|
925
|
+
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
|
926
926
|
gap: 24px;
|
|
927
927
|
margin-top: 32px;
|
|
928
928
|
}
|
|
@@ -1194,7 +1194,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
|
1194
1194
|
.footer-links a:hover { color: var(--hr-rust); }
|
|
1195
1195
|
|
|
1196
1196
|
/* ==========================================================================
|
|
1197
|
-
Visual Perception & Automation Engine v9.4.
|
|
1197
|
+
Visual Perception & Automation Engine v9.4.8
|
|
1198
1198
|
========================================================================== */
|
|
1199
1199
|
.vision-banner {
|
|
1200
1200
|
margin-bottom: 28px;
|