ft-scout 1.0.9 → 1.1.0
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 +9 -0
- package/.firebaserc +14 -0
- package/AUTONOMOUS_FEATURES.md +192 -0
- package/README.md +482 -29
- package/bin/ft.js +2 -0
- package/bin/src/commands/agent.d.ts.map +1 -0
- package/bin/src/commands/agent.js +1230 -0
- package/bin/src/commands/agent.js.map +1 -0
- package/bin/src/commands/audit.d.ts.map +1 -0
- package/bin/src/commands/audit.js +104 -0
- package/bin/src/commands/audit.js.map +1 -0
- package/bin/src/commands/authCommand.d.ts.map +1 -0
- package/bin/src/commands/authCommand.js +38 -0
- package/bin/src/commands/authCommand.js.map +1 -0
- package/bin/src/commands/benchmark.d.ts.map +1 -0
- package/bin/src/commands/benchmark.js +135 -0
- package/bin/src/commands/benchmark.js.map +1 -0
- package/bin/src/commands/brief.d.ts.map +1 -0
- package/bin/src/commands/brief.js +37 -0
- package/bin/src/commands/brief.js.map +1 -0
- package/bin/src/commands/configCommand.d.ts.map +1 -0
- package/bin/src/commands/configCommand.js +53 -0
- package/bin/src/commands/configCommand.js.map +1 -0
- package/bin/src/commands/dashboard.d.ts.map +1 -0
- package/bin/src/commands/dashboard.js +41 -0
- package/bin/src/commands/dashboard.js.map +1 -0
- package/bin/src/commands/history.d.ts.map +1 -0
- package/bin/src/commands/history.js +20 -0
- package/bin/src/commands/history.js.map +1 -0
- package/bin/src/commands/init.d.ts.map +1 -1
- package/bin/src/commands/init.js +408 -79
- package/bin/src/commands/init.js.map +1 -1
- package/bin/src/commands/login.d.ts.map +1 -0
- package/bin/src/commands/login.js +190 -0
- package/bin/src/commands/login.js.map +1 -0
- package/bin/src/commands/logout.d.ts.map +1 -0
- package/bin/src/commands/logout.js +15 -0
- package/bin/src/commands/logout.js.map +1 -0
- package/bin/src/commands/mcp.d.ts.map +1 -0
- package/bin/src/commands/mcp.js +393 -0
- package/bin/src/commands/mcp.js.map +1 -0
- package/bin/src/commands/owners.js +6 -6
- package/bin/src/commands/owners.js.map +1 -1
- package/bin/src/commands/plan.d.ts.map +1 -0
- package/bin/src/commands/plan.js +152 -0
- package/bin/src/commands/plan.js.map +1 -0
- package/bin/src/commands/quota.d.ts.map +1 -0
- package/bin/src/commands/quota.js +32 -0
- package/bin/src/commands/quota.js.map +1 -0
- package/bin/src/commands/recommend.d.ts.map +1 -0
- package/bin/src/commands/recommend.js +46 -0
- package/bin/src/commands/recommend.js.map +1 -0
- package/bin/src/commands/risky.d.ts.map +1 -1
- package/bin/src/commands/risky.js +235 -39
- package/bin/src/commands/risky.js.map +1 -1
- package/bin/src/commands/setup.d.ts.map +1 -1
- package/bin/src/commands/setup.js +411 -16
- package/bin/src/commands/setup.js.map +1 -1
- package/bin/src/commands/signup.d.ts.map +1 -0
- package/bin/src/commands/signup.js +118 -0
- package/bin/src/commands/signup.js.map +1 -0
- package/bin/src/commands/undo.d.ts.map +1 -0
- package/bin/src/commands/undo.js +59 -0
- package/bin/src/commands/undo.js.map +1 -0
- package/bin/src/commands/web.d.ts.map +1 -0
- package/bin/src/commands/web.js +90 -0
- package/bin/src/commands/web.js.map +1 -0
- package/bin/src/discovery/config.d.ts.map +1 -0
- package/bin/src/discovery/config.js +41 -0
- package/bin/src/discovery/config.js.map +1 -0
- package/bin/src/discovery/display.d.ts.map +1 -0
- package/bin/src/discovery/display.js +57 -0
- package/bin/src/discovery/display.js.map +1 -0
- package/bin/src/discovery/messages.d.ts.map +1 -0
- package/bin/src/discovery/messages.js +7 -0
- package/bin/src/discovery/messages.js.map +1 -0
- package/bin/src/discovery/signals.d.ts.map +1 -0
- package/bin/src/discovery/signals.js +33 -0
- package/bin/src/discovery/signals.js.map +1 -0
- package/bin/src/engine/actionVerifier.d.ts.map +1 -0
- package/bin/src/engine/actionVerifier.js +283 -0
- package/bin/src/engine/actionVerifier.js.map +1 -0
- package/bin/src/engine/agentEngine.d.ts.map +1 -0
- package/bin/src/engine/agentEngine.js +2188 -0
- package/bin/src/engine/agentEngine.js.map +1 -0
- package/bin/src/engine/agentState.d.ts.map +1 -0
- package/bin/src/engine/agentState.js +381 -0
- package/bin/src/engine/agentState.js.map +1 -0
- package/bin/src/engine/browser/browserController.d.ts.map +1 -0
- package/bin/src/engine/browser/browserController.js +737 -0
- package/bin/src/engine/browser/browserController.js.map +1 -0
- package/bin/src/engine/browser/index.d.ts.map +1 -0
- package/bin/src/engine/browser/index.js +2 -0
- package/bin/src/engine/browser/index.js.map +1 -0
- package/bin/src/engine/computer/computerController.d.ts.map +1 -0
- package/bin/src/engine/computer/computerController.js +773 -0
- package/bin/src/engine/computer/computerController.js.map +1 -0
- 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 -0
- package/bin/src/engine/computer/index.js +4 -0
- package/bin/src/engine/computer/index.js.map +1 -0
- package/bin/src/engine/computer/mockComputer.d.ts.map +1 -0
- package/bin/src/engine/computer/mockComputer.js +260 -0
- package/bin/src/engine/computer/mockComputer.js.map +1 -0
- package/bin/src/engine/computer/scoutDriver.cs +1161 -0
- package/bin/src/engine/computer/scout_driver.exe +0 -0
- package/bin/src/engine/git.d.ts.map +1 -1
- package/bin/src/engine/git.js +71 -0
- package/bin/src/engine/git.js.map +1 -1
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +1264 -35
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/engine/planner.d.ts.map +1 -0
- package/bin/src/engine/planner.js +321 -0
- package/bin/src/engine/planner.js.map +1 -0
- package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -0
- package/bin/src/engine/runtime/agentRuntime.js +1258 -0
- package/bin/src/engine/runtime/agentRuntime.js.map +1 -0
- package/bin/src/engine/runtime/index.d.ts.map +1 -0
- package/bin/src/engine/runtime/index.js +2 -0
- package/bin/src/engine/runtime/index.js.map +1 -0
- package/bin/src/engine/safety.d.ts.map +1 -0
- package/bin/src/engine/safety.js +316 -0
- package/bin/src/engine/safety.js.map +1 -0
- package/bin/src/engine/scoutAudioRecorder.cs +215 -0
- package/bin/src/engine/scout_audio_recorder.exe +0 -0
- package/bin/src/engine/toolRegistry.d.ts.map +1 -0
- package/bin/src/engine/toolRegistry.js +521 -0
- package/bin/src/engine/toolRegistry.js.map +1 -0
- package/bin/src/engine/verifier.d.ts.map +1 -0
- package/bin/src/engine/verifier.js +414 -0
- package/bin/src/engine/verifier.js.map +1 -0
- package/bin/src/engine/voiceEngine.d.ts.map +1 -0
- package/bin/src/engine/voiceEngine.js +474 -0
- package/bin/src/engine/voiceEngine.js.map +1 -0
- package/bin/src/engine/web.d.ts.map +1 -0
- package/bin/src/engine/web.js +161 -0
- package/bin/src/engine/web.js.map +1 -0
- package/bin/src/engine/workspace/agentWorkspace.d.ts.map +1 -0
- package/bin/src/engine/workspace/agentWorkspace.js +505 -0
- package/bin/src/engine/workspace/agentWorkspace.js.map +1 -0
- package/bin/src/engine/workspace/index.d.ts.map +1 -0
- package/bin/src/engine/workspace/index.js +2 -0
- package/bin/src/engine/workspace/index.js.map +1 -0
- package/bin/src/index.js +369 -19
- package/bin/src/index.js.map +1 -1
- package/bin/src/mcp/client.d.ts.map +1 -0
- package/bin/src/mcp/client.js +127 -0
- package/bin/src/mcp/client.js.map +1 -0
- package/bin/src/mcp/discovery.d.ts.map +1 -0
- package/bin/src/mcp/discovery.js +91 -0
- package/bin/src/mcp/discovery.js.map +1 -0
- package/bin/src/mcp/health.d.ts.map +1 -0
- package/bin/src/mcp/health.js +44 -0
- package/bin/src/mcp/health.js.map +1 -0
- package/bin/src/mcp/index.d.ts.map +1 -0
- package/bin/src/mcp/index.js +15 -0
- package/bin/src/mcp/index.js.map +1 -0
- package/bin/src/mcp/manager.d.ts.map +1 -0
- package/bin/src/mcp/manager.js +648 -0
- package/bin/src/mcp/manager.js.map +1 -0
- package/bin/src/mcp/permissions.d.ts.map +1 -0
- package/bin/src/mcp/permissions.js +50 -0
- package/bin/src/mcp/permissions.js.map +1 -0
- package/bin/src/mcp/persistence.d.ts.map +1 -0
- package/bin/src/mcp/persistence.js +171 -0
- package/bin/src/mcp/persistence.js.map +1 -0
- package/bin/src/mcp/recovery.d.ts.map +1 -0
- package/bin/src/mcp/recovery.js +75 -0
- package/bin/src/mcp/recovery.js.map +1 -0
- package/bin/src/mcp/telemetry.d.ts.map +1 -0
- package/bin/src/mcp/telemetry.js +82 -0
- package/bin/src/mcp/telemetry.js.map +1 -0
- package/bin/src/mcp/toolRouter.d.ts.map +1 -0
- package/bin/src/mcp/toolRouter.js +127 -0
- package/bin/src/mcp/toolRouter.js.map +1 -0
- package/bin/src/mcp/transport.d.ts.map +1 -0
- package/bin/src/mcp/transport.js +328 -0
- package/bin/src/mcp/transport.js.map +1 -0
- package/bin/src/mcp/types.d.ts.map +1 -0
- package/bin/src/mcp/types.js +6 -0
- package/bin/src/mcp/types.js.map +1 -0
- package/bin/src/server/server.d.ts.map +1 -0
- package/bin/src/server/server.js +989 -0
- package/bin/src/server/server.js.map +1 -0
- package/bin/src/utils/admin.d.ts.map +1 -0
- package/bin/src/utils/admin.js +231 -0
- package/bin/src/utils/admin.js.map +1 -0
- package/bin/src/utils/auditLogger.d.ts.map +1 -0
- package/bin/src/utils/auditLogger.js +70 -0
- package/bin/src/utils/auditLogger.js.map +1 -0
- package/bin/src/utils/auth.d.ts.map +1 -0
- package/bin/src/utils/auth.js +679 -0
- package/bin/src/utils/auth.js.map +1 -0
- package/bin/src/utils/branding.d.ts.map +1 -0
- package/bin/src/utils/branding.js +14 -0
- package/bin/src/utils/branding.js.map +1 -0
- package/bin/src/utils/config.d.ts.map +1 -1
- package/bin/src/utils/config.js +124 -3
- package/bin/src/utils/config.js.map +1 -1
- package/bin/src/utils/email.d.ts.map +1 -0
- package/bin/src/utils/email.js +267 -0
- package/bin/src/utils/email.js.map +1 -0
- package/bin/src/utils/firebaseAuth.d.ts.map +1 -0
- package/bin/src/utils/firebaseAuth.js +174 -0
- package/bin/src/utils/firebaseAuth.js.map +1 -0
- package/bin/src/utils/holoseneAuth.d.ts.map +1 -0
- package/bin/src/utils/holoseneAuth.js +307 -0
- package/bin/src/utils/holoseneAuth.js.map +1 -0
- package/bin/src/utils/language.d.ts.map +1 -0
- package/bin/src/utils/language.js +181 -0
- package/bin/src/utils/language.js.map +1 -0
- package/bin/src/utils/markdown.d.ts.map +1 -0
- package/bin/src/utils/markdown.js +215 -0
- package/bin/src/utils/markdown.js.map +1 -0
- package/bin/src/utils/payment.d.ts.map +1 -0
- package/bin/src/utils/payment.js +290 -0
- package/bin/src/utils/payment.js.map +1 -0
- package/bin/src/utils/pricing.d.ts.map +1 -0
- package/bin/src/utils/pricing.js +165 -0
- package/bin/src/utils/pricing.js.map +1 -0
- package/bin/src/utils/razorpay.d.ts.map +1 -0
- package/bin/src/utils/razorpay.js +144 -0
- package/bin/src/utils/razorpay.js.map +1 -0
- package/bin/src/utils/session.d.ts.map +1 -0
- package/bin/src/utils/session.js +82 -0
- package/bin/src/utils/session.js.map +1 -0
- package/bin/src/utils/updateCheck.d.ts.map +1 -0
- package/bin/src/utils/updateCheck.js +108 -0
- package/bin/src/utils/updateCheck.js.map +1 -0
- package/downloads/invoice-2026-03.pdf +1 -0
- package/firebase.json +74 -0
- package/package.json +49 -46
- package/web/ScoutFavicon.png +0 -0
- package/web/app.js +3944 -0
- package/web/styles.css +3081 -0
- package/.ft/context.json +0 -17
- package/email-template.txt +0 -44
|
@@ -1,35 +1,430 @@
|
|
|
1
|
-
import { spinner
|
|
1
|
+
import { spinner } from '@clack/prompts';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import { safeNote } from '../utils/markdown.js';
|
|
5
7
|
export async function handleSetup() {
|
|
6
8
|
const s = spinner();
|
|
7
|
-
s.start('Diagnosing local runtime environment...');
|
|
8
|
-
const
|
|
9
|
+
s.start('Diagnosing local runtime environment & dependencies...');
|
|
10
|
+
const cwd = process.cwd();
|
|
9
11
|
const passes = [];
|
|
12
|
+
const issues = [];
|
|
13
|
+
const manualDependencies = [];
|
|
14
|
+
// Helper to check if a command executable exists on system PATH
|
|
15
|
+
function commandExists(cmd) {
|
|
16
|
+
try {
|
|
17
|
+
const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `command -v ${cmd}`;
|
|
18
|
+
execSync(checkCmd, { stdio: 'ignore', cwd });
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
try {
|
|
23
|
+
execSync(`${cmd} --version`, { stdio: 'ignore', cwd });
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
10
31
|
// Check 1: .env vs .env.example
|
|
11
|
-
const cwd = process.cwd();
|
|
12
32
|
const hasEnv = fs.existsSync(path.join(cwd, '.env'));
|
|
13
33
|
const hasExample = fs.existsSync(path.join(cwd, '.env.example'));
|
|
14
34
|
if (!hasEnv && hasExample) {
|
|
15
|
-
|
|
35
|
+
try {
|
|
36
|
+
fs.copyFileSync(path.join(cwd, '.env.example'), path.join(cwd, '.env'));
|
|
37
|
+
passes.push(`${chalk.green('')} Auto-created ${chalk.cyan('.env')} file from ${chalk.cyan('.env.example')}.`);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
issues.push(`Found .env.example but failed to copy to .env.`);
|
|
41
|
+
}
|
|
16
42
|
}
|
|
17
43
|
else if (hasEnv) {
|
|
18
|
-
passes.push(`${chalk.green('
|
|
44
|
+
passes.push(`${chalk.green('')} Environment file .env present.`);
|
|
19
45
|
}
|
|
20
|
-
// Check 2: Node version check
|
|
46
|
+
// Check 2: Node version check
|
|
21
47
|
const pkgPath = path.join(cwd, 'package.json');
|
|
22
48
|
if (fs.existsSync(pkgPath)) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
49
|
+
try {
|
|
50
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
51
|
+
if (pkg.engines?.node) {
|
|
52
|
+
passes.push(`${chalk.green('')} Expected Node engine: ${pkg.engines.node} (Current: ${process.version})`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch { }
|
|
56
|
+
}
|
|
57
|
+
// Check 3: Internet & Web Access check
|
|
58
|
+
try {
|
|
59
|
+
const checkRes = await fetch('https://registry.npmjs.org/', { method: 'HEAD', signal: AbortSignal.timeout(4000) });
|
|
60
|
+
if (checkRes.ok) {
|
|
61
|
+
passes.push(`${chalk.green('')} Internet connection active (Web search & remote git access ready).`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
issues.push(`Internet connection check returned status ${checkRes.status}. Remote repo access may be limited.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
issues.push(`No active internet access detected. Scout web search & remote git cloning will be disabled.`);
|
|
69
|
+
}
|
|
70
|
+
// Step 2: Auto-Install Repository Dependencies
|
|
71
|
+
s.message('Scanning project manifests & installing dependencies...');
|
|
72
|
+
// 1. Node.js / JavaScript / TypeScript Ecosystem
|
|
73
|
+
if (fs.existsSync(pkgPath)) {
|
|
74
|
+
const hasBunLock = fs.existsSync(path.join(cwd, 'bun.lockb')) || fs.existsSync(path.join(cwd, 'bun.lock'));
|
|
75
|
+
const hasPnpmLock = fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'));
|
|
76
|
+
const hasYarnLock = fs.existsSync(path.join(cwd, 'yarn.lock'));
|
|
77
|
+
if (hasBunLock) {
|
|
78
|
+
if (commandExists('bun')) {
|
|
79
|
+
s.message('Installing dependencies with Bun (bun install)...');
|
|
80
|
+
try {
|
|
81
|
+
execSync('bun install', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
82
|
+
passes.push(`${chalk.green('')} Installed Bun dependencies (bun install).`);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
manualDependencies.push({
|
|
86
|
+
name: 'Bun Dependencies (`bun install`)',
|
|
87
|
+
url: 'https://bun.sh',
|
|
88
|
+
reason: '`bun install` command failed during execution.'
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
manualDependencies.push({
|
|
94
|
+
name: 'Bun CLI runtime',
|
|
95
|
+
url: 'https://bun.sh',
|
|
96
|
+
reason: 'Project requires Bun (`bun.lock` found) but `bun` is not installed on PATH.'
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (hasPnpmLock) {
|
|
101
|
+
if (commandExists('pnpm')) {
|
|
102
|
+
s.message('Installing dependencies with pnpm (pnpm install)...');
|
|
103
|
+
try {
|
|
104
|
+
execSync('pnpm install', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
105
|
+
passes.push(`${chalk.green('')} Installed pnpm dependencies (pnpm install).`);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
manualDependencies.push({
|
|
109
|
+
name: 'pnpm Dependencies (`pnpm install`)',
|
|
110
|
+
url: 'https://pnpm.io/installation',
|
|
111
|
+
reason: '`pnpm install` command failed.'
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
manualDependencies.push({
|
|
117
|
+
name: 'pnpm Package Manager',
|
|
118
|
+
url: 'https://pnpm.io/installation',
|
|
119
|
+
reason: 'Project uses pnpm (`pnpm-lock.yaml` found) but `pnpm` is not installed on PATH.'
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else if (hasYarnLock) {
|
|
124
|
+
if (commandExists('yarn')) {
|
|
125
|
+
s.message('Installing dependencies with Yarn (yarn install)...');
|
|
126
|
+
try {
|
|
127
|
+
execSync('yarn install', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
128
|
+
passes.push(`${chalk.green('')} Installed Yarn dependencies (yarn install).`);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
manualDependencies.push({
|
|
132
|
+
name: 'Yarn Dependencies (`yarn install`)',
|
|
133
|
+
url: 'https://yarnpkg.com/getting-started/install',
|
|
134
|
+
reason: '`yarn install` command failed.'
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
manualDependencies.push({
|
|
140
|
+
name: 'Yarn Package Manager',
|
|
141
|
+
url: 'https://yarnpkg.com/getting-started/install',
|
|
142
|
+
reason: 'Project uses Yarn (`yarn.lock` found) but `yarn` is not installed on PATH.'
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
// Standard npm project
|
|
148
|
+
if (commandExists('npm')) {
|
|
149
|
+
s.message('Installing dependencies with npm (npm install)...');
|
|
150
|
+
try {
|
|
151
|
+
execSync('npm install', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
152
|
+
passes.push(`${chalk.green('')} Installed Node dependencies (npm install).`);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
manualDependencies.push({
|
|
156
|
+
name: 'npm Dependencies (`npm install`)',
|
|
157
|
+
url: 'https://nodejs.org/',
|
|
158
|
+
reason: '`npm install` command failed.'
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
manualDependencies.push({
|
|
164
|
+
name: 'Node.js / npm',
|
|
165
|
+
url: 'https://nodejs.org/',
|
|
166
|
+
reason: '`package.json` present but `npm` is not installed on PATH.'
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// 2. Python Ecosystem
|
|
172
|
+
const hasPipfile = fs.existsSync(path.join(cwd, 'Pipfile'));
|
|
173
|
+
const hasPoetry = fs.existsSync(path.join(cwd, 'poetry.lock')) || fs.existsSync(path.join(cwd, 'pyproject.toml'));
|
|
174
|
+
const hasReqs = fs.existsSync(path.join(cwd, 'requirements.txt'));
|
|
175
|
+
if (hasPipfile) {
|
|
176
|
+
if (commandExists('pipenv')) {
|
|
177
|
+
s.message('Installing Python dependencies with Pipenv...');
|
|
178
|
+
try {
|
|
179
|
+
execSync('pipenv install', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
180
|
+
passes.push(`${chalk.green('')} Installed Python dependencies (pipenv install).`);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
manualDependencies.push({
|
|
184
|
+
name: 'Pipenv Dependencies',
|
|
185
|
+
url: 'https://pipenv.pypa.io/',
|
|
186
|
+
reason: '`pipenv install` command failed.'
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
manualDependencies.push({
|
|
192
|
+
name: 'Pipenv CLI Tool',
|
|
193
|
+
url: 'https://pipenv.pypa.io/',
|
|
194
|
+
reason: '`Pipfile` found but `pipenv` is not installed.'
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else if (hasPoetry) {
|
|
199
|
+
if (commandExists('poetry')) {
|
|
200
|
+
s.message('Installing Python dependencies with Poetry...');
|
|
201
|
+
try {
|
|
202
|
+
execSync('poetry install', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
203
|
+
passes.push(`${chalk.green('')} Installed Python dependencies (poetry install).`);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
manualDependencies.push({
|
|
207
|
+
name: 'Poetry Dependencies',
|
|
208
|
+
url: 'https://python-poetry.org/docs/#installation',
|
|
209
|
+
reason: '`poetry install` command failed.'
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else if (fs.existsSync(path.join(cwd, 'poetry.lock'))) {
|
|
214
|
+
manualDependencies.push({
|
|
215
|
+
name: 'Poetry Dependency Manager',
|
|
216
|
+
url: 'https://python-poetry.org/docs/#installation',
|
|
217
|
+
reason: '`poetry.lock` found but `poetry` is not installed on PATH.'
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (hasReqs) {
|
|
222
|
+
const pyCmd = commandExists('python3') ? 'python3' : commandExists('python') ? 'python' : null;
|
|
223
|
+
if (pyCmd) {
|
|
224
|
+
s.message('Installing Python dependencies (pip install -r requirements.txt)...');
|
|
225
|
+
try {
|
|
226
|
+
execSync(`${pyCmd} -m pip install -r requirements.txt`, { cwd, stdio: 'pipe', timeout: 300000 });
|
|
227
|
+
passes.push(`${chalk.green('')} Installed Python requirements (pip install -r requirements.txt).`);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
manualDependencies.push({
|
|
231
|
+
name: 'Python Dependencies (`requirements.txt`)',
|
|
232
|
+
url: 'https://pip.pypa.io/',
|
|
233
|
+
reason: '`pip install -r requirements.txt` command failed.'
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
manualDependencies.push({
|
|
239
|
+
name: 'Python 3 Environment',
|
|
240
|
+
url: 'https://www.python.org/downloads/',
|
|
241
|
+
reason: '`requirements.txt` found but Python is not installed on PATH.'
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// 3. Rust Ecosystem
|
|
246
|
+
if (fs.existsSync(path.join(cwd, 'Cargo.toml'))) {
|
|
247
|
+
if (commandExists('cargo')) {
|
|
248
|
+
s.message('Fetching Rust crate dependencies (cargo fetch)...');
|
|
249
|
+
try {
|
|
250
|
+
execSync('cargo fetch', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
251
|
+
passes.push(`${chalk.green('')} Fetched Rust crate dependencies (cargo fetch).`);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
manualDependencies.push({
|
|
255
|
+
name: 'Rust Crate Dependencies (`cargo fetch`)',
|
|
256
|
+
url: 'https://rustup.rs/',
|
|
257
|
+
reason: '`cargo fetch` command failed.'
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
manualDependencies.push({
|
|
263
|
+
name: 'Rust / Cargo toolchain',
|
|
264
|
+
url: 'https://rustup.rs/',
|
|
265
|
+
reason: '`Cargo.toml` found but `cargo` is not installed on PATH.'
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// 4. Go Ecosystem
|
|
270
|
+
if (fs.existsSync(path.join(cwd, 'go.mod'))) {
|
|
271
|
+
if (commandExists('go')) {
|
|
272
|
+
s.message('Downloading Go module dependencies (go mod download)...');
|
|
273
|
+
try {
|
|
274
|
+
execSync('go mod download', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
275
|
+
passes.push(`${chalk.green('')} Downloaded Go module dependencies (go mod download).`);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
manualDependencies.push({
|
|
279
|
+
name: 'Go Module Dependencies (`go mod download`)',
|
|
280
|
+
url: 'https://go.dev/doc/install',
|
|
281
|
+
reason: '`go mod download` command failed.'
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
manualDependencies.push({
|
|
287
|
+
name: 'Go Programming Language SDK',
|
|
288
|
+
url: 'https://go.dev/doc/install',
|
|
289
|
+
reason: '`go.mod` found but `go` compiler is not installed on PATH.'
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// 5. Ruby Ecosystem
|
|
294
|
+
if (fs.existsSync(path.join(cwd, 'Gemfile'))) {
|
|
295
|
+
if (commandExists('bundle')) {
|
|
296
|
+
s.message('Installing Ruby gems (bundle install)...');
|
|
297
|
+
try {
|
|
298
|
+
execSync('bundle install', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
299
|
+
passes.push(`${chalk.green('')} Installed Ruby gems (bundle install).`);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
manualDependencies.push({
|
|
303
|
+
name: 'Ruby Gems (`bundle install`)',
|
|
304
|
+
url: 'https://bundler.io/',
|
|
305
|
+
reason: '`bundle install` command failed.'
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
manualDependencies.push({
|
|
311
|
+
name: 'Bundler / Ruby',
|
|
312
|
+
url: 'https://bundler.io/',
|
|
313
|
+
reason: '`Gemfile` found but `bundle` is not installed on PATH.'
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// 6. PHP Ecosystem
|
|
318
|
+
if (fs.existsSync(path.join(cwd, 'composer.json'))) {
|
|
319
|
+
if (commandExists('composer')) {
|
|
320
|
+
s.message('Installing PHP Composer dependencies (composer install)...');
|
|
321
|
+
try {
|
|
322
|
+
execSync('composer install', { cwd, stdio: 'pipe', timeout: 300000 });
|
|
323
|
+
passes.push(`${chalk.green('')} Installed PHP Composer packages (composer install).`);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
manualDependencies.push({
|
|
327
|
+
name: 'Composer Dependencies (`composer install`)',
|
|
328
|
+
url: 'https://getcomposer.org/',
|
|
329
|
+
reason: '`composer install` command failed.'
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
manualDependencies.push({
|
|
335
|
+
name: 'Composer PHP Package Manager',
|
|
336
|
+
url: 'https://getcomposer.org/',
|
|
337
|
+
reason: '`composer.json` found but `composer` is not installed on PATH.'
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// 7. Java / Gradle / Maven
|
|
342
|
+
const hasGradlew = fs.existsSync(path.join(cwd, 'gradlew')) || fs.existsSync(path.join(cwd, 'gradlew.bat'));
|
|
343
|
+
const hasGradle = fs.existsSync(path.join(cwd, 'build.gradle')) || fs.existsSync(path.join(cwd, 'build.gradle.kts'));
|
|
344
|
+
const hasMvnw = fs.existsSync(path.join(cwd, 'mvnw')) || fs.existsSync(path.join(cwd, 'mvnw.cmd'));
|
|
345
|
+
const hasMaven = fs.existsSync(path.join(cwd, 'pom.xml'));
|
|
346
|
+
if (hasGradlew || hasGradle) {
|
|
347
|
+
const gradleExecutable = hasGradlew ? (process.platform === 'win32' ? '.\\gradlew.bat' : './gradlew') : 'gradle';
|
|
348
|
+
if (hasGradlew || commandExists('gradle')) {
|
|
349
|
+
s.message('Resolving Gradle dependencies...');
|
|
350
|
+
try {
|
|
351
|
+
execSync(`${gradleExecutable} dependencies`, { cwd, stdio: 'pipe', timeout: 300000 });
|
|
352
|
+
passes.push(`${chalk.green('')} Resolved Gradle dependencies.`);
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
manualDependencies.push({
|
|
356
|
+
name: 'Gradle Dependencies',
|
|
357
|
+
url: 'https://gradle.org/install/',
|
|
358
|
+
reason: 'Gradle dependencies resolution command failed.'
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
manualDependencies.push({
|
|
364
|
+
name: 'Gradle Build Tool',
|
|
365
|
+
url: 'https://gradle.org/install/',
|
|
366
|
+
reason: 'Gradle build file found but `gradle` is not installed on PATH.'
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else if (hasMvnw || hasMaven) {
|
|
371
|
+
const mvnExecutable = hasMvnw ? (process.platform === 'win32' ? '.\\mvnw.cmd' : './mvnw') : 'mvn';
|
|
372
|
+
if (hasMvnw || commandExists('mvn')) {
|
|
373
|
+
s.message('Resolving Maven dependencies (dependency:resolve)...');
|
|
374
|
+
try {
|
|
375
|
+
execSync(`${mvnExecutable} dependency:resolve`, { cwd, stdio: 'pipe', timeout: 300000 });
|
|
376
|
+
passes.push(`${chalk.green('')} Resolved Maven dependencies.`);
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
manualDependencies.push({
|
|
380
|
+
name: 'Maven Dependencies',
|
|
381
|
+
url: 'https://maven.apache.org/install.html',
|
|
382
|
+
reason: 'Maven `dependency:resolve` command failed.'
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
manualDependencies.push({
|
|
388
|
+
name: 'Apache Maven',
|
|
389
|
+
url: 'https://maven.apache.org/install.html',
|
|
390
|
+
reason: '`pom.xml` found but `mvn` is not installed on PATH.'
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// 8. Docker / Container check
|
|
395
|
+
if (fs.existsSync(path.join(cwd, 'Dockerfile')) || fs.existsSync(path.join(cwd, 'docker-compose.yml')) || fs.existsSync(path.join(cwd, 'compose.yaml'))) {
|
|
396
|
+
if (commandExists('docker')) {
|
|
397
|
+
passes.push(`${chalk.green('')} Docker CLI detected on PATH.`);
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
manualDependencies.push({
|
|
401
|
+
name: 'Docker Desktop / Engine',
|
|
402
|
+
url: 'https://docs.docker.com/get-docker/',
|
|
403
|
+
reason: '`Dockerfile` or `docker-compose.yml` present, but `docker` CLI was not found.'
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
s.stop('Setup & dependency configuration complete.');
|
|
408
|
+
// Build final report
|
|
409
|
+
const reportLines = [];
|
|
410
|
+
for (const pass of passes) {
|
|
411
|
+
reportLines.push(`${pass}`);
|
|
412
|
+
}
|
|
413
|
+
for (const issue of issues) {
|
|
414
|
+
reportLines.push(`${chalk.yellow('️')} ${issue}`);
|
|
415
|
+
}
|
|
416
|
+
if (manualDependencies.length > 0) {
|
|
417
|
+
reportLines.push('');
|
|
418
|
+
reportLines.push(`${chalk.bold.red(' Uninstalled Dependencies / Missing Tools:')}`);
|
|
419
|
+
reportLines.push(chalk.dim('Please install the required tools using the URLs below:'));
|
|
420
|
+
reportLines.push('');
|
|
421
|
+
for (const dep of manualDependencies) {
|
|
422
|
+
reportLines.push(` • ${chalk.bold.yellow(dep.name)}`);
|
|
423
|
+
reportLines.push(` Reason: ${dep.reason}`);
|
|
424
|
+
reportLines.push(` Download/Install URL: ${chalk.cyan.underline(dep.url)}`);
|
|
425
|
+
reportLines.push('');
|
|
26
426
|
}
|
|
27
427
|
}
|
|
28
|
-
|
|
29
|
-
const report = [
|
|
30
|
-
...passes,
|
|
31
|
-
...issues.map((i) => `${chalk.red('⚠️ ')} ${i}`),
|
|
32
|
-
].join('\n');
|
|
33
|
-
note(report, '🛠️ Setup Doctor');
|
|
428
|
+
safeNote(reportLines.join('\n'), '️ Setup Doctor & Dependency Manager');
|
|
34
429
|
}
|
|
35
430
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,gCAAgC;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;IAEjE,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAC5E,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACpE,CAAC;IAED,+DAA+D;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,GAAG,CAAC,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG;QACb,GAAG,MAAM;QACT,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;KACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AACnC,CAAC"}
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC7B,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAElE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,kBAAkB,GAAgB,EAAE,CAAC;IAE3C,gEAAgE;IAChE,SAAS,aAAa,CAAC,GAAW;QAC9B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC;YACrF,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC;gBACD,QAAQ,CAAC,GAAG,GAAG,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvD,OAAO,IAAI,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;IAEjE,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC;YACD,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAClH,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAAC;IACrE,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,0BAA0B,GAAG,CAAC,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;YAC9G,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;IACf,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,qEAAqE,CAAC,CAAC;QACzG,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,6CAA6C,QAAQ,CAAC,MAAM,sCAAsC,CAAC,CAAC;QACpH,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;IAC/G,CAAC;IAED,+CAA+C;IAC/C,CAAC,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;IAErE,iDAAiD;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3G,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QAE/D,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,CAAC,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;gBAC/D,IAAI,CAAC;oBACD,QAAQ,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBACjE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,4CAA4C,CAAC,CAAC;gBAChF,CAAC;gBAAC,MAAM,CAAC;oBACL,kBAAkB,CAAC,IAAI,CAAC;wBACpB,IAAI,EAAE,kCAAkC;wBACxC,GAAG,EAAE,gBAAgB;wBACrB,MAAM,EAAE,gDAAgD;qBAC3D,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,iBAAiB;oBACvB,GAAG,EAAE,gBAAgB;oBACrB,MAAM,EAAE,6EAA6E;iBACxF,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACrB,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxB,CAAC,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;gBACjE,IAAI,CAAC;oBACD,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBAClE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,8CAA8C,CAAC,CAAC;gBAClF,CAAC;gBAAC,MAAM,CAAC;oBACL,kBAAkB,CAAC,IAAI,CAAC;wBACpB,IAAI,EAAE,oCAAoC;wBAC1C,GAAG,EAAE,8BAA8B;wBACnC,MAAM,EAAE,gCAAgC;qBAC3C,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,sBAAsB;oBAC5B,GAAG,EAAE,8BAA8B;oBACnC,MAAM,EAAE,iFAAiF;iBAC5F,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACrB,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxB,CAAC,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;gBACjE,IAAI,CAAC;oBACD,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBAClE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,8CAA8C,CAAC,CAAC;gBAClF,CAAC;gBAAC,MAAM,CAAC;oBACL,kBAAkB,CAAC,IAAI,CAAC;wBACpB,IAAI,EAAE,oCAAoC;wBAC1C,GAAG,EAAE,6CAA6C;wBAClD,MAAM,EAAE,gCAAgC;qBAC3C,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,sBAAsB;oBAC5B,GAAG,EAAE,6CAA6C;oBAClD,MAAM,EAAE,4EAA4E;iBACvF,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,uBAAuB;YACvB,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,CAAC,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;gBAC/D,IAAI,CAAC;oBACD,QAAQ,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBACjE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,6CAA6C,CAAC,CAAC;gBACjF,CAAC;gBAAC,MAAM,CAAC;oBACL,kBAAkB,CAAC,IAAI,CAAC;wBACpB,IAAI,EAAE,kCAAkC;wBACxC,GAAG,EAAE,qBAAqB;wBAC1B,MAAM,EAAE,+BAA+B;qBAC1C,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,eAAe;oBACrB,GAAG,EAAE,qBAAqB;oBAC1B,MAAM,EAAE,4DAA4D;iBACvE,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAClH,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAElE,IAAI,UAAU,EAAE,CAAC;QACb,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;YAC3D,IAAI,CAAC;gBACD,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,kDAAkD,CAAC,CAAC;YACtF,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,qBAAqB;oBAC3B,GAAG,EAAE,yBAAyB;oBAC9B,MAAM,EAAE,kCAAkC;iBAC7C,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,iBAAiB;gBACvB,GAAG,EAAE,yBAAyB;gBAC9B,MAAM,EAAE,gDAAgD;aAC3D,CAAC,CAAC;QACP,CAAC;IACL,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACnB,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;YAC3D,IAAI,CAAC;gBACD,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,kDAAkD,CAAC,CAAC;YACtF,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,qBAAqB;oBAC3B,GAAG,EAAE,8CAA8C;oBACnD,MAAM,EAAE,kCAAkC;iBAC7C,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;YACtD,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,2BAA2B;gBACjC,GAAG,EAAE,8CAA8C;gBACnD,MAAM,EAAE,4DAA4D;aACvE,CAAC,CAAC;QACP,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/F,IAAI,KAAK,EAAE,CAAC;YACR,CAAC,CAAC,OAAO,CAAC,qEAAqE,CAAC,CAAC;YACjF,IAAI,CAAC;gBACD,QAAQ,CAAC,GAAG,KAAK,qCAAqC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACjG,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,mEAAmE,CAAC,CAAC;YACvG,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,0CAA0C;oBAChD,GAAG,EAAE,sBAAsB;oBAC3B,MAAM,EAAE,mDAAmD;iBAC9D,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,sBAAsB;gBAC5B,GAAG,EAAE,mCAAmC;gBACxC,MAAM,EAAE,+DAA+D;aAC1E,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC9C,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;YAC/D,IAAI,CAAC;gBACD,QAAQ,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,iDAAiD,CAAC,CAAC;YACrF,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,yCAAyC;oBAC/C,GAAG,EAAE,oBAAoB;oBACzB,MAAM,EAAE,+BAA+B;iBAC1C,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,wBAAwB;gBAC9B,GAAG,EAAE,oBAAoB;gBACzB,MAAM,EAAE,0DAA0D;aACrE,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,kBAAkB;IAClB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC1C,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,CAAC,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;YACrE,IAAI,CAAC;gBACD,QAAQ,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACrE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,uDAAuD,CAAC,CAAC;YAC3F,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,4CAA4C;oBAClD,GAAG,EAAE,4BAA4B;oBACjC,MAAM,EAAE,mCAAmC;iBAC9C,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,6BAA6B;gBACnC,GAAG,EAAE,4BAA4B;gBACjC,MAAM,EAAE,4DAA4D;aACvE,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QAC3C,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;YACtD,IAAI,CAAC;gBACD,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,8BAA8B;oBACpC,GAAG,EAAE,qBAAqB;oBAC1B,MAAM,EAAE,kCAAkC;iBAC7C,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,gBAAgB;gBACtB,GAAG,EAAE,qBAAqB;gBAC1B,MAAM,EAAE,wDAAwD;aACnE,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QACjD,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,CAAC,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;YACxE,IAAI,CAAC;gBACD,QAAQ,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACtE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,sDAAsD,CAAC,CAAC;YAC1F,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,4CAA4C;oBAClD,GAAG,EAAE,0BAA0B;oBAC/B,MAAM,EAAE,oCAAoC;iBAC/C,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,8BAA8B;gBACpC,GAAG,EAAE,0BAA0B;gBAC/B,MAAM,EAAE,gEAAgE;aAC3E,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;IAC5G,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACrH,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IACnG,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1D,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjH,IAAI,UAAU,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACD,QAAQ,CAAC,GAAG,gBAAgB,eAAe,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACtF,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,gCAAgC,CAAC,CAAC;YACpE,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,qBAAqB;oBAC3B,GAAG,EAAE,6BAA6B;oBAClC,MAAM,EAAE,gDAAgD;iBAC3D,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,mBAAmB;gBACzB,GAAG,EAAE,6BAA6B;gBAClC,MAAM,EAAE,gEAAgE;aAC3E,CAAC,CAAC;QACP,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAClG,IAAI,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,CAAC,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC;YAClE,IAAI,CAAC;gBACD,QAAQ,CAAC,GAAG,aAAa,qBAAqB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzF,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,oBAAoB;oBAC1B,GAAG,EAAE,uCAAuC;oBAC5C,MAAM,EAAE,4CAA4C;iBACvD,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,cAAc;gBACpB,GAAG,EAAE,uCAAuC;gBAC5C,MAAM,EAAE,qDAAqD;aAChE,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,8BAA8B;IAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACtJ,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,kBAAkB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,yBAAyB;gBAC/B,GAAG,EAAE,qCAAqC;gBAC1C,MAAM,EAAE,+EAA+E;aAC1F,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAErD,qBAAqB;IACrB,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,4CAA4C,CAAC,EAAE,CAAC,CAAC;QACpF,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;QACvF,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAErB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACnC,WAAW,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtD,WAAW,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3C,WAAW,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5E,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,qCAAqC,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["signup.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE,aAAa,iBAiIzD"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { text, password, select, spinner, isCancel, cancel } from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { safeNote } from '../utils/markdown.js';
|
|
4
|
+
import { saveAuthConfig } from '../utils/auth.js';
|
|
5
|
+
import { firebaseSignUp, FIREBASE_TENANT_ID } from '../utils/firebaseAuth.js';
|
|
6
|
+
import { dispatchAmbientWelcomeEmail } from '../utils/email.js';
|
|
7
|
+
export async function handleSignup(options) {
|
|
8
|
+
let name = options?.name?.trim();
|
|
9
|
+
let email = options?.email?.trim();
|
|
10
|
+
let pwd = options?.password?.trim();
|
|
11
|
+
let isHoloseneMode = Boolean(options?.holosene);
|
|
12
|
+
// Interactive Prompt Provider Choice
|
|
13
|
+
if (!name && !email && !pwd && !isHoloseneMode) {
|
|
14
|
+
const providerChoice = await select({
|
|
15
|
+
message: 'Choose Sign Up Method:',
|
|
16
|
+
options: [
|
|
17
|
+
{ label: ' Sign Up with Holosene Account (holosene.frontterrain.com)', value: 'holosene' },
|
|
18
|
+
{ label: ' Create New FrontTerrain Account', value: 'firebase' },
|
|
19
|
+
],
|
|
20
|
+
});
|
|
21
|
+
if (isCancel(providerChoice)) {
|
|
22
|
+
cancel('Sign up cancelled.');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
isHoloseneMode = providerChoice === 'holosene';
|
|
26
|
+
}
|
|
27
|
+
// Interactive prompts if values are not provided via flags
|
|
28
|
+
if (!name) {
|
|
29
|
+
const nameRes = await text({
|
|
30
|
+
message: 'Enter your full name:',
|
|
31
|
+
placeholder: 'Ada Lovelace',
|
|
32
|
+
validate(val) {
|
|
33
|
+
if (!val || val.trim().length < 2)
|
|
34
|
+
return 'Name must be at least 2 characters.';
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
if (isCancel(nameRes)) {
|
|
38
|
+
cancel('Sign up cancelled.');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
name = String(nameRes).trim();
|
|
42
|
+
}
|
|
43
|
+
if (!email) {
|
|
44
|
+
const emailRes = await text({
|
|
45
|
+
message: isHoloseneMode ? 'Enter your Holosene email address:' : 'Enter your email address:',
|
|
46
|
+
placeholder: 'ada@example.com',
|
|
47
|
+
validate(val) {
|
|
48
|
+
if (!val || !val.includes('@') || !val.includes('.')) {
|
|
49
|
+
return 'Please enter a valid email address.';
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
if (isCancel(emailRes)) {
|
|
54
|
+
cancel('Sign up cancelled.');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
email = String(emailRes).trim();
|
|
58
|
+
}
|
|
59
|
+
if (!pwd) {
|
|
60
|
+
const pwdRes = await password({
|
|
61
|
+
message: 'Create a password (min 6 characters):',
|
|
62
|
+
validate(val) {
|
|
63
|
+
if (!val || val.length < 6)
|
|
64
|
+
return 'Password must be at least 6 characters long.';
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
if (isCancel(pwdRes)) {
|
|
68
|
+
cancel('Sign up cancelled.');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
pwd = String(pwdRes);
|
|
72
|
+
const confirmPwdRes = await password({
|
|
73
|
+
message: 'Confirm your password:',
|
|
74
|
+
validate(val) {
|
|
75
|
+
if (val !== pwd)
|
|
76
|
+
return 'Passwords do not match.';
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
if (isCancel(confirmPwdRes)) {
|
|
80
|
+
cancel('Sign up cancelled.');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const s = spinner();
|
|
85
|
+
s.start(`Creating account on FrontTerrain / Holosene...`);
|
|
86
|
+
try {
|
|
87
|
+
const authRes = await firebaseSignUp(name, email, pwd);
|
|
88
|
+
saveAuthConfig({
|
|
89
|
+
token: authRes.token,
|
|
90
|
+
refreshToken: authRes.refreshToken || null,
|
|
91
|
+
tenantId: FIREBASE_TENANT_ID,
|
|
92
|
+
provider: isHoloseneMode ? 'holosene' : 'firebase',
|
|
93
|
+
user: authRes.user,
|
|
94
|
+
loggedInAt: new Date().toISOString(),
|
|
95
|
+
});
|
|
96
|
+
// Dispatch Welcome Email asynchronously
|
|
97
|
+
await dispatchAmbientWelcomeEmail({
|
|
98
|
+
name,
|
|
99
|
+
email,
|
|
100
|
+
userId: authRes.user.id,
|
|
101
|
+
idToken: authRes.token,
|
|
102
|
+
tenantId: FIREBASE_TENANT_ID,
|
|
103
|
+
});
|
|
104
|
+
s.stop(chalk.green(` ${isHoloseneMode ? 'Holosene' : 'FrontTerrain'} account registered successfully!`));
|
|
105
|
+
safeNote(`${chalk.bold.green('Account Created for ' + name + '!')}\n\n` +
|
|
106
|
+
`Account Email: ${chalk.bold.cyan(email)}\n` +
|
|
107
|
+
`Provider: ${isHoloseneMode ? chalk.magenta('Holosene Platform') : chalk.cyan('FrontTerrain Auth')}\n` +
|
|
108
|
+
`️ Welcome Ambient Email dispatched to ${email}\n\n` +
|
|
109
|
+
`You are automatically logged in! Run ${chalk.cyan('scout agent')} or ${chalk.cyan('scout init')} to start.`, isHoloseneMode ? ' Holosene Account Success' : 'Authentication Success, ready to launch!');
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
s.stop(chalk.red(' Sign up failed.'));
|
|
113
|
+
safeNote(`${chalk.bold.red('Sign Up Error')}\n\n` +
|
|
114
|
+
`${error?.message || 'Failed to create account.'}\n\n` +
|
|
115
|
+
`If you already have an account, try logging in with ${chalk.cyan('scout login')}.`, '️ FrontTerrain Sign Up Error');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=signup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.js","sourceRoot":"","sources":["signup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAShE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB;IACtD,IAAI,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,GAAG,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACpC,IAAI,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEhD,qCAAqC;IACrC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC;YAChC,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE;gBACL,EAAE,KAAK,EAAE,4DAA4D,EAAE,KAAK,EAAE,UAAU,EAAE;gBAC1F,EAAE,KAAK,EAAE,kCAAkC,EAAE,KAAK,EAAE,UAAU,EAAE;aACnE;SACJ,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC7B,OAAO;QACX,CAAC;QAED,cAAc,GAAG,cAAc,KAAK,UAAU,CAAC;IACnD,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;YACvB,OAAO,EAAE,uBAAuB;YAChC,WAAW,EAAE,cAAc;YAC3B,QAAQ,CAAC,GAAG;gBACR,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,qCAAqC,CAAC;YACpF,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;YACxB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,2BAA2B;YAC5F,WAAW,EAAE,iBAAiB;YAC9B,QAAQ,CAAC,GAAG;gBACR,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnD,OAAO,qCAAqC,CAAC;gBACjD,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC1B,OAAO,EAAE,uCAAuC;YAChD,QAAQ,CAAC,GAAG;gBACR,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,8CAA8C,CAAC;YACtF,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAErB,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC;YACjC,OAAO,EAAE,wBAAwB;YACjC,QAAQ,CAAC,GAAG;gBACR,IAAI,GAAG,KAAK,GAAG;oBAAE,OAAO,yBAAyB,CAAC;YACtD,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC7B,OAAO;QACX,CAAC;IACL,CAAC;IAED,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAE1D,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAEvD,cAAc,CAAC;YACX,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;YAC1C,QAAQ,EAAE,kBAAkB;YAC5B,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;YAClD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,2BAA2B,CAAC;YAC9B,IAAI;YACJ,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,EAAE,OAAO,CAAC,KAAK;YACtB,QAAQ,EAAE,kBAAkB;SAC/B,CAAC,CAAC;QAEH,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,mCAAmC,CAAC,CAAC,CAAC;QAEzG,QAAQ,CACJ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM;YAC9D,kBAAkB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;YAC5C,aAAa,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI;YACtG,yCAAyC,KAAK,MAAM;YACpD,wCAAwC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAC5G,cAAc,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,0CAA0C,CAC5F,CAAC;IACN,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACtC,QAAQ,CACJ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM;YACxC,GAAG,KAAK,EAAE,OAAO,IAAI,2BAA2B,MAAM;YACtD,uDAAuD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EACnF,8BAA8B,CACjC,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undo.d.ts","sourceRoot":"","sources":["undo.ts"],"names":[],"mappings":"AAQA,wBAAsB,UAAU,kBAsD/B"}
|