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.
Files changed (240) hide show
  1. package/.firebase/hosting.d2Vi.cache +9 -0
  2. package/.firebaserc +14 -0
  3. package/AUTONOMOUS_FEATURES.md +192 -0
  4. package/README.md +482 -29
  5. package/bin/ft.js +2 -0
  6. package/bin/src/commands/agent.d.ts.map +1 -0
  7. package/bin/src/commands/agent.js +1230 -0
  8. package/bin/src/commands/agent.js.map +1 -0
  9. package/bin/src/commands/audit.d.ts.map +1 -0
  10. package/bin/src/commands/audit.js +104 -0
  11. package/bin/src/commands/audit.js.map +1 -0
  12. package/bin/src/commands/authCommand.d.ts.map +1 -0
  13. package/bin/src/commands/authCommand.js +38 -0
  14. package/bin/src/commands/authCommand.js.map +1 -0
  15. package/bin/src/commands/benchmark.d.ts.map +1 -0
  16. package/bin/src/commands/benchmark.js +135 -0
  17. package/bin/src/commands/benchmark.js.map +1 -0
  18. package/bin/src/commands/brief.d.ts.map +1 -0
  19. package/bin/src/commands/brief.js +37 -0
  20. package/bin/src/commands/brief.js.map +1 -0
  21. package/bin/src/commands/configCommand.d.ts.map +1 -0
  22. package/bin/src/commands/configCommand.js +53 -0
  23. package/bin/src/commands/configCommand.js.map +1 -0
  24. package/bin/src/commands/dashboard.d.ts.map +1 -0
  25. package/bin/src/commands/dashboard.js +41 -0
  26. package/bin/src/commands/dashboard.js.map +1 -0
  27. package/bin/src/commands/history.d.ts.map +1 -0
  28. package/bin/src/commands/history.js +20 -0
  29. package/bin/src/commands/history.js.map +1 -0
  30. package/bin/src/commands/init.d.ts.map +1 -1
  31. package/bin/src/commands/init.js +408 -79
  32. package/bin/src/commands/init.js.map +1 -1
  33. package/bin/src/commands/login.d.ts.map +1 -0
  34. package/bin/src/commands/login.js +190 -0
  35. package/bin/src/commands/login.js.map +1 -0
  36. package/bin/src/commands/logout.d.ts.map +1 -0
  37. package/bin/src/commands/logout.js +15 -0
  38. package/bin/src/commands/logout.js.map +1 -0
  39. package/bin/src/commands/mcp.d.ts.map +1 -0
  40. package/bin/src/commands/mcp.js +393 -0
  41. package/bin/src/commands/mcp.js.map +1 -0
  42. package/bin/src/commands/owners.js +6 -6
  43. package/bin/src/commands/owners.js.map +1 -1
  44. package/bin/src/commands/plan.d.ts.map +1 -0
  45. package/bin/src/commands/plan.js +152 -0
  46. package/bin/src/commands/plan.js.map +1 -0
  47. package/bin/src/commands/quota.d.ts.map +1 -0
  48. package/bin/src/commands/quota.js +32 -0
  49. package/bin/src/commands/quota.js.map +1 -0
  50. package/bin/src/commands/recommend.d.ts.map +1 -0
  51. package/bin/src/commands/recommend.js +46 -0
  52. package/bin/src/commands/recommend.js.map +1 -0
  53. package/bin/src/commands/risky.d.ts.map +1 -1
  54. package/bin/src/commands/risky.js +235 -39
  55. package/bin/src/commands/risky.js.map +1 -1
  56. package/bin/src/commands/setup.d.ts.map +1 -1
  57. package/bin/src/commands/setup.js +411 -16
  58. package/bin/src/commands/setup.js.map +1 -1
  59. package/bin/src/commands/signup.d.ts.map +1 -0
  60. package/bin/src/commands/signup.js +118 -0
  61. package/bin/src/commands/signup.js.map +1 -0
  62. package/bin/src/commands/undo.d.ts.map +1 -0
  63. package/bin/src/commands/undo.js +59 -0
  64. package/bin/src/commands/undo.js.map +1 -0
  65. package/bin/src/commands/web.d.ts.map +1 -0
  66. package/bin/src/commands/web.js +90 -0
  67. package/bin/src/commands/web.js.map +1 -0
  68. package/bin/src/discovery/config.d.ts.map +1 -0
  69. package/bin/src/discovery/config.js +41 -0
  70. package/bin/src/discovery/config.js.map +1 -0
  71. package/bin/src/discovery/display.d.ts.map +1 -0
  72. package/bin/src/discovery/display.js +57 -0
  73. package/bin/src/discovery/display.js.map +1 -0
  74. package/bin/src/discovery/messages.d.ts.map +1 -0
  75. package/bin/src/discovery/messages.js +7 -0
  76. package/bin/src/discovery/messages.js.map +1 -0
  77. package/bin/src/discovery/signals.d.ts.map +1 -0
  78. package/bin/src/discovery/signals.js +33 -0
  79. package/bin/src/discovery/signals.js.map +1 -0
  80. package/bin/src/engine/actionVerifier.d.ts.map +1 -0
  81. package/bin/src/engine/actionVerifier.js +283 -0
  82. package/bin/src/engine/actionVerifier.js.map +1 -0
  83. package/bin/src/engine/agentEngine.d.ts.map +1 -0
  84. package/bin/src/engine/agentEngine.js +2188 -0
  85. package/bin/src/engine/agentEngine.js.map +1 -0
  86. package/bin/src/engine/agentState.d.ts.map +1 -0
  87. package/bin/src/engine/agentState.js +381 -0
  88. package/bin/src/engine/agentState.js.map +1 -0
  89. package/bin/src/engine/browser/browserController.d.ts.map +1 -0
  90. package/bin/src/engine/browser/browserController.js +737 -0
  91. package/bin/src/engine/browser/browserController.js.map +1 -0
  92. package/bin/src/engine/browser/index.d.ts.map +1 -0
  93. package/bin/src/engine/browser/index.js +2 -0
  94. package/bin/src/engine/browser/index.js.map +1 -0
  95. package/bin/src/engine/computer/computerController.d.ts.map +1 -0
  96. package/bin/src/engine/computer/computerController.js +773 -0
  97. package/bin/src/engine/computer/computerController.js.map +1 -0
  98. package/bin/src/engine/computer/computerDiagnostic.d.ts.map +1 -0
  99. package/bin/src/engine/computer/computerDiagnostic.js +71 -0
  100. package/bin/src/engine/computer/computerDiagnostic.js.map +1 -0
  101. package/bin/src/engine/computer/index.d.ts.map +1 -0
  102. package/bin/src/engine/computer/index.js +4 -0
  103. package/bin/src/engine/computer/index.js.map +1 -0
  104. package/bin/src/engine/computer/mockComputer.d.ts.map +1 -0
  105. package/bin/src/engine/computer/mockComputer.js +260 -0
  106. package/bin/src/engine/computer/mockComputer.js.map +1 -0
  107. package/bin/src/engine/computer/scoutDriver.cs +1161 -0
  108. package/bin/src/engine/computer/scout_driver.exe +0 -0
  109. package/bin/src/engine/git.d.ts.map +1 -1
  110. package/bin/src/engine/git.js +71 -0
  111. package/bin/src/engine/git.js.map +1 -1
  112. package/bin/src/engine/llm.d.ts.map +1 -1
  113. package/bin/src/engine/llm.js +1264 -35
  114. package/bin/src/engine/llm.js.map +1 -1
  115. package/bin/src/engine/planner.d.ts.map +1 -0
  116. package/bin/src/engine/planner.js +321 -0
  117. package/bin/src/engine/planner.js.map +1 -0
  118. package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -0
  119. package/bin/src/engine/runtime/agentRuntime.js +1258 -0
  120. package/bin/src/engine/runtime/agentRuntime.js.map +1 -0
  121. package/bin/src/engine/runtime/index.d.ts.map +1 -0
  122. package/bin/src/engine/runtime/index.js +2 -0
  123. package/bin/src/engine/runtime/index.js.map +1 -0
  124. package/bin/src/engine/safety.d.ts.map +1 -0
  125. package/bin/src/engine/safety.js +316 -0
  126. package/bin/src/engine/safety.js.map +1 -0
  127. package/bin/src/engine/scoutAudioRecorder.cs +215 -0
  128. package/bin/src/engine/scout_audio_recorder.exe +0 -0
  129. package/bin/src/engine/toolRegistry.d.ts.map +1 -0
  130. package/bin/src/engine/toolRegistry.js +521 -0
  131. package/bin/src/engine/toolRegistry.js.map +1 -0
  132. package/bin/src/engine/verifier.d.ts.map +1 -0
  133. package/bin/src/engine/verifier.js +414 -0
  134. package/bin/src/engine/verifier.js.map +1 -0
  135. package/bin/src/engine/voiceEngine.d.ts.map +1 -0
  136. package/bin/src/engine/voiceEngine.js +474 -0
  137. package/bin/src/engine/voiceEngine.js.map +1 -0
  138. package/bin/src/engine/web.d.ts.map +1 -0
  139. package/bin/src/engine/web.js +161 -0
  140. package/bin/src/engine/web.js.map +1 -0
  141. package/bin/src/engine/workspace/agentWorkspace.d.ts.map +1 -0
  142. package/bin/src/engine/workspace/agentWorkspace.js +505 -0
  143. package/bin/src/engine/workspace/agentWorkspace.js.map +1 -0
  144. package/bin/src/engine/workspace/index.d.ts.map +1 -0
  145. package/bin/src/engine/workspace/index.js +2 -0
  146. package/bin/src/engine/workspace/index.js.map +1 -0
  147. package/bin/src/index.js +369 -19
  148. package/bin/src/index.js.map +1 -1
  149. package/bin/src/mcp/client.d.ts.map +1 -0
  150. package/bin/src/mcp/client.js +127 -0
  151. package/bin/src/mcp/client.js.map +1 -0
  152. package/bin/src/mcp/discovery.d.ts.map +1 -0
  153. package/bin/src/mcp/discovery.js +91 -0
  154. package/bin/src/mcp/discovery.js.map +1 -0
  155. package/bin/src/mcp/health.d.ts.map +1 -0
  156. package/bin/src/mcp/health.js +44 -0
  157. package/bin/src/mcp/health.js.map +1 -0
  158. package/bin/src/mcp/index.d.ts.map +1 -0
  159. package/bin/src/mcp/index.js +15 -0
  160. package/bin/src/mcp/index.js.map +1 -0
  161. package/bin/src/mcp/manager.d.ts.map +1 -0
  162. package/bin/src/mcp/manager.js +648 -0
  163. package/bin/src/mcp/manager.js.map +1 -0
  164. package/bin/src/mcp/permissions.d.ts.map +1 -0
  165. package/bin/src/mcp/permissions.js +50 -0
  166. package/bin/src/mcp/permissions.js.map +1 -0
  167. package/bin/src/mcp/persistence.d.ts.map +1 -0
  168. package/bin/src/mcp/persistence.js +171 -0
  169. package/bin/src/mcp/persistence.js.map +1 -0
  170. package/bin/src/mcp/recovery.d.ts.map +1 -0
  171. package/bin/src/mcp/recovery.js +75 -0
  172. package/bin/src/mcp/recovery.js.map +1 -0
  173. package/bin/src/mcp/telemetry.d.ts.map +1 -0
  174. package/bin/src/mcp/telemetry.js +82 -0
  175. package/bin/src/mcp/telemetry.js.map +1 -0
  176. package/bin/src/mcp/toolRouter.d.ts.map +1 -0
  177. package/bin/src/mcp/toolRouter.js +127 -0
  178. package/bin/src/mcp/toolRouter.js.map +1 -0
  179. package/bin/src/mcp/transport.d.ts.map +1 -0
  180. package/bin/src/mcp/transport.js +328 -0
  181. package/bin/src/mcp/transport.js.map +1 -0
  182. package/bin/src/mcp/types.d.ts.map +1 -0
  183. package/bin/src/mcp/types.js +6 -0
  184. package/bin/src/mcp/types.js.map +1 -0
  185. package/bin/src/server/server.d.ts.map +1 -0
  186. package/bin/src/server/server.js +989 -0
  187. package/bin/src/server/server.js.map +1 -0
  188. package/bin/src/utils/admin.d.ts.map +1 -0
  189. package/bin/src/utils/admin.js +231 -0
  190. package/bin/src/utils/admin.js.map +1 -0
  191. package/bin/src/utils/auditLogger.d.ts.map +1 -0
  192. package/bin/src/utils/auditLogger.js +70 -0
  193. package/bin/src/utils/auditLogger.js.map +1 -0
  194. package/bin/src/utils/auth.d.ts.map +1 -0
  195. package/bin/src/utils/auth.js +679 -0
  196. package/bin/src/utils/auth.js.map +1 -0
  197. package/bin/src/utils/branding.d.ts.map +1 -0
  198. package/bin/src/utils/branding.js +14 -0
  199. package/bin/src/utils/branding.js.map +1 -0
  200. package/bin/src/utils/config.d.ts.map +1 -1
  201. package/bin/src/utils/config.js +124 -3
  202. package/bin/src/utils/config.js.map +1 -1
  203. package/bin/src/utils/email.d.ts.map +1 -0
  204. package/bin/src/utils/email.js +267 -0
  205. package/bin/src/utils/email.js.map +1 -0
  206. package/bin/src/utils/firebaseAuth.d.ts.map +1 -0
  207. package/bin/src/utils/firebaseAuth.js +174 -0
  208. package/bin/src/utils/firebaseAuth.js.map +1 -0
  209. package/bin/src/utils/holoseneAuth.d.ts.map +1 -0
  210. package/bin/src/utils/holoseneAuth.js +307 -0
  211. package/bin/src/utils/holoseneAuth.js.map +1 -0
  212. package/bin/src/utils/language.d.ts.map +1 -0
  213. package/bin/src/utils/language.js +181 -0
  214. package/bin/src/utils/language.js.map +1 -0
  215. package/bin/src/utils/markdown.d.ts.map +1 -0
  216. package/bin/src/utils/markdown.js +215 -0
  217. package/bin/src/utils/markdown.js.map +1 -0
  218. package/bin/src/utils/payment.d.ts.map +1 -0
  219. package/bin/src/utils/payment.js +290 -0
  220. package/bin/src/utils/payment.js.map +1 -0
  221. package/bin/src/utils/pricing.d.ts.map +1 -0
  222. package/bin/src/utils/pricing.js +165 -0
  223. package/bin/src/utils/pricing.js.map +1 -0
  224. package/bin/src/utils/razorpay.d.ts.map +1 -0
  225. package/bin/src/utils/razorpay.js +144 -0
  226. package/bin/src/utils/razorpay.js.map +1 -0
  227. package/bin/src/utils/session.d.ts.map +1 -0
  228. package/bin/src/utils/session.js +82 -0
  229. package/bin/src/utils/session.js.map +1 -0
  230. package/bin/src/utils/updateCheck.d.ts.map +1 -0
  231. package/bin/src/utils/updateCheck.js +108 -0
  232. package/bin/src/utils/updateCheck.js.map +1 -0
  233. package/downloads/invoice-2026-03.pdf +1 -0
  234. package/firebase.json +74 -0
  235. package/package.json +49 -46
  236. package/web/ScoutFavicon.png +0 -0
  237. package/web/app.js +3944 -0
  238. package/web/styles.css +3081 -0
  239. package/.ft/context.json +0 -17
  240. package/email-template.txt +0 -44
@@ -0,0 +1,393 @@
1
+ /**
2
+ * Scout MCP Ecosystem - CLI Commands
3
+ * Implements scout mcp list, add, remove, connect, disconnect, inspect, tools, health.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { intro, outro, spinner, text, select, confirm, isCancel, cancel, note } from '@clack/prompts';
7
+ import { getMCPManager } from '../mcp/index.js';
8
+ function formatRelativeTime(isoDate) {
9
+ if (!isoDate)
10
+ return 'Never';
11
+ const ms = Date.now() - new Date(isoDate).getTime();
12
+ if (ms < 0)
13
+ return 'Just now';
14
+ const secs = Math.floor(ms / 1000);
15
+ if (secs < 60)
16
+ return `${secs}s ago`;
17
+ const mins = Math.floor(secs / 60);
18
+ if (mins < 60)
19
+ return `${mins}m ago`;
20
+ const hours = Math.floor(mins / 60);
21
+ if (hours < 24)
22
+ return `${hours}h ago`;
23
+ const days = Math.floor(hours / 24);
24
+ return `${days}d ago`;
25
+ }
26
+ /**
27
+ * scout mcp list
28
+ */
29
+ export async function handleMcpList() {
30
+ const manager = getMCPManager();
31
+ const servers = manager.listServers();
32
+ if (servers.length === 0) {
33
+ console.log(chalk.dim('\nNo MCP servers configured yet.'));
34
+ console.log(chalk.cyan('Connect an MCP server using: ') + chalk.bold('scout mcp add\n'));
35
+ return;
36
+ }
37
+ console.log(chalk.bold.cyan('\nMCP CONNECTIONS\n'));
38
+ for (const server of servers) {
39
+ const isConnected = server.status === 'connected';
40
+ const isConnecting = server.status === 'connecting';
41
+ const isError = server.status === 'error';
42
+ const isUnauthorized = server.status === 'unauthorized';
43
+ let icon = chalk.gray('○');
44
+ let statusText = chalk.dim('Disconnected');
45
+ if (isConnected) {
46
+ icon = chalk.green('✓');
47
+ statusText = chalk.green('Connected');
48
+ }
49
+ else if (isConnecting) {
50
+ icon = chalk.yellow('◌');
51
+ statusText = chalk.yellow('Connecting');
52
+ }
53
+ else if (isUnauthorized) {
54
+ icon = chalk.red('⚠');
55
+ statusText = chalk.red('Unauthorized');
56
+ }
57
+ else if (isError) {
58
+ icon = chalk.red('✕');
59
+ statusText = chalk.red('Error');
60
+ }
61
+ const toolCount = server.tools.length;
62
+ const enabledTools = server.tools.filter((t) => t.enabled).length;
63
+ const toolStr = toolCount > 0
64
+ ? `${enabledTools}/${toolCount} tools active`
65
+ : '0 tools';
66
+ const lastActivity = formatRelativeTime(server.lastActivityAt || server.lastConnectedAt);
67
+ console.log(`${icon} ${chalk.bold(server.name)}`);
68
+ console.log(` ${statusText}`);
69
+ console.log(` ${toolStr}`);
70
+ console.log(` Transport: ${server.transport.toUpperCase()}`);
71
+ console.log(` Last used: ${lastActivity}`);
72
+ if (server.health.latencyMs !== undefined) {
73
+ console.log(` Latency: ${server.health.latencyMs}ms`);
74
+ }
75
+ console.log('');
76
+ }
77
+ }
78
+ /**
79
+ * scout mcp add [name] [options]
80
+ */
81
+ export async function handleMcpAdd(nameArg, options = {}) {
82
+ const manager = getMCPManager();
83
+ let name = nameArg;
84
+ let transportType = options.transport || (options.command ? 'stdio' : 'http');
85
+ let endpoint = options.url || options.endpoint;
86
+ let command = options.command;
87
+ let argsArray = options.args ? options.args.split(',').map((s) => s.trim()) : [];
88
+ let authType = options.auth || 'none';
89
+ let secret = options.token || options.key || options.secret;
90
+ // Interactive flow when options missing
91
+ if (!name || (!endpoint && !command)) {
92
+ if (!name) {
93
+ const nameInput = await text({
94
+ message: 'MCP Server Name:',
95
+ placeholder: 'e.g. Higgsfield, Motion, GitHub, Figma',
96
+ validate: (val) => (!val || !val.trim() ? 'Server name is required' : undefined),
97
+ });
98
+ if (isCancel(nameInput)) {
99
+ cancel('Operation cancelled.');
100
+ return;
101
+ }
102
+ name = String(nameInput).trim();
103
+ }
104
+ const transportChoice = await select({
105
+ message: 'Transport Type:',
106
+ options: [
107
+ { label: 'Streamable HTTP (Remote / Webhooks)', value: 'http' },
108
+ { label: 'Local stdio Process (CLI / Node / Python)', value: 'stdio' },
109
+ ],
110
+ initialValue: 'http',
111
+ });
112
+ if (isCancel(transportChoice)) {
113
+ cancel('Operation cancelled.');
114
+ return;
115
+ }
116
+ transportType = transportChoice;
117
+ if (transportType === 'http') {
118
+ const endpointInput = await text({
119
+ message: 'MCP Endpoint URL:',
120
+ placeholder: 'https://api.higgsfield.ai/mcp or http://localhost:8000/mcp',
121
+ validate: (val) => (!val || !val.trim() ? 'Endpoint URL is required' : undefined),
122
+ });
123
+ if (isCancel(endpointInput)) {
124
+ cancel('Operation cancelled.');
125
+ return;
126
+ }
127
+ endpoint = String(endpointInput).trim();
128
+ const authChoice = await select({
129
+ message: 'Authentication:',
130
+ options: [
131
+ { label: 'None (Public / Local)', value: 'none' },
132
+ { label: 'Bearer Token (API / OAuth)', value: 'bearer' },
133
+ { label: 'API Key', value: 'api-key' },
134
+ ],
135
+ initialValue: 'none',
136
+ });
137
+ if (isCancel(authChoice)) {
138
+ cancel('Operation cancelled.');
139
+ return;
140
+ }
141
+ authType = authChoice;
142
+ if (authType !== 'none') {
143
+ const secretInput = await text({
144
+ message: authType === 'bearer' ? 'Bearer Token:' : 'API Key:',
145
+ placeholder: 'Enter token or key (will be stored encrypted)',
146
+ validate: (val) => (!val || !val.trim() ? 'Secret is required' : undefined),
147
+ });
148
+ if (isCancel(secretInput)) {
149
+ cancel('Operation cancelled.');
150
+ return;
151
+ }
152
+ secret = String(secretInput).trim();
153
+ }
154
+ }
155
+ else {
156
+ const cmdInput = await text({
157
+ message: 'Process Command:',
158
+ placeholder: 'e.g. npx, node, uvx, python',
159
+ validate: (val) => (!val || !val.trim() ? 'Command is required' : undefined),
160
+ });
161
+ if (isCancel(cmdInput)) {
162
+ cancel('Operation cancelled.');
163
+ return;
164
+ }
165
+ command = String(cmdInput).trim();
166
+ const argsInput = await text({
167
+ message: 'Process Arguments (comma-separated):',
168
+ placeholder: 'e.g. -y, @modelcontextprotocol/server-github',
169
+ });
170
+ if (isCancel(argsInput)) {
171
+ cancel('Operation cancelled.');
172
+ return;
173
+ }
174
+ const rawArgs = String(argsInput || '').trim();
175
+ argsArray = rawArgs ? rawArgs.split(',').map((s) => s.trim()) : [];
176
+ }
177
+ }
178
+ if (!name) {
179
+ cancel('Server name is required.');
180
+ return;
181
+ }
182
+ const s = spinner();
183
+ s.start(`Connecting to MCP server "${name}"...`);
184
+ try {
185
+ const added = await manager.addServer({
186
+ name,
187
+ transport: transportType,
188
+ endpoint: endpoint || undefined,
189
+ command: command || undefined,
190
+ args: argsArray,
191
+ authType,
192
+ }, secret);
193
+ s.message(`Initializing MCP session with ${name}...`);
194
+ const connected = await manager.connectServer(added.id);
195
+ s.stop(chalk.green(`✓ MCP server "${connected.name}" connected`));
196
+ console.log(chalk.green('✓ Server initialized'));
197
+ console.log(chalk.green('✓ Capabilities discovered'));
198
+ console.log(chalk.green(`✓ ${connected.tools.length} tool(s) discovered`));
199
+ if (connected.tools.length > 0) {
200
+ console.log(chalk.dim('\nDiscovered Tools:'));
201
+ for (const tool of connected.tools.slice(0, 10)) {
202
+ console.log(` • ${chalk.cyan(tool.name)}: ${chalk.dim(tool.description.slice(0, 70))}`);
203
+ }
204
+ if (connected.tools.length > 10) {
205
+ console.log(chalk.dim(` ... and ${connected.tools.length - 10} more tools.`));
206
+ }
207
+ }
208
+ console.log('');
209
+ }
210
+ catch (err) {
211
+ s.stop(chalk.red(`✕ Failed to connect MCP server "${name}"`));
212
+ console.error(chalk.red(`\nError: ${err?.message || String(err)}\n`));
213
+ }
214
+ }
215
+ /**
216
+ * scout mcp remove <server>
217
+ */
218
+ export async function handleMcpRemove(serverArg) {
219
+ if (!serverArg) {
220
+ console.log(chalk.red('Please specify a server name or ID: ') + chalk.bold('scout mcp remove <server>'));
221
+ return;
222
+ }
223
+ const manager = getMCPManager();
224
+ const server = manager.getServer(serverArg);
225
+ if (!server) {
226
+ console.log(chalk.red(`MCP server "${serverArg}" not found.`));
227
+ return;
228
+ }
229
+ const s = spinner();
230
+ s.start(`Removing MCP server "${server.name}"...`);
231
+ await manager.removeServer(server.id);
232
+ s.stop(chalk.green(`✓ Removed MCP server "${server.name}"`));
233
+ }
234
+ /**
235
+ * scout mcp connect <server>
236
+ */
237
+ export async function handleMcpConnect(serverArg) {
238
+ if (!serverArg) {
239
+ console.log(chalk.red('Please specify a server name or ID: ') + chalk.bold('scout mcp connect <server>'));
240
+ return;
241
+ }
242
+ const manager = getMCPManager();
243
+ const server = manager.getServer(serverArg);
244
+ if (!server) {
245
+ console.log(chalk.red(`MCP server "${serverArg}" not found.`));
246
+ return;
247
+ }
248
+ const s = spinner();
249
+ s.start(`Connecting to MCP server "${server.name}"...`);
250
+ try {
251
+ const connected = await manager.connectServer(server.id);
252
+ s.stop(chalk.green(`✓ Connected to "${connected.name}"`));
253
+ console.log(chalk.green(`✓ ${connected.tools.length} tools discovered and ready.`));
254
+ }
255
+ catch (err) {
256
+ s.stop(chalk.red(`✕ Failed to connect to "${server.name}"`));
257
+ console.error(chalk.red(`\nError: ${err?.message || String(err)}\n`));
258
+ }
259
+ }
260
+ /**
261
+ * scout mcp disconnect <server>
262
+ */
263
+ export async function handleMcpDisconnect(serverArg) {
264
+ if (!serverArg) {
265
+ console.log(chalk.red('Please specify a server name or ID: ') + chalk.bold('scout mcp disconnect <server>'));
266
+ return;
267
+ }
268
+ const manager = getMCPManager();
269
+ const server = manager.getServer(serverArg);
270
+ if (!server) {
271
+ console.log(chalk.red(`MCP server "${serverArg}" not found.`));
272
+ return;
273
+ }
274
+ const s = spinner();
275
+ s.start(`Disconnecting from MCP server "${server.name}"...`);
276
+ try {
277
+ await manager.disconnectServer(server.id);
278
+ s.stop(chalk.cyan(`✓ Disconnected from "${server.name}"`));
279
+ }
280
+ catch (err) {
281
+ s.stop(chalk.red(`✕ Failed to disconnect from "${server.name}"`));
282
+ console.error(chalk.red(`\nError: ${err?.message || String(err)}\n`));
283
+ }
284
+ }
285
+ /**
286
+ * scout mcp inspect <server>
287
+ */
288
+ export async function handleMcpInspect(serverArg) {
289
+ if (!serverArg) {
290
+ console.log(chalk.red('Please specify a server name or ID: ') + chalk.bold('scout mcp inspect <server>'));
291
+ return;
292
+ }
293
+ const manager = getMCPManager();
294
+ const server = manager.getServer(serverArg);
295
+ if (!server) {
296
+ console.log(chalk.red(`MCP server "${serverArg}" not found.`));
297
+ return;
298
+ }
299
+ console.log(chalk.bold.cyan(`\nMCP SERVER: ${server.name}\n`));
300
+ console.log(` ID: ${server.id}`);
301
+ console.log(` Status: ${server.status === 'connected' ? chalk.green('● Connected') : chalk.gray('○ ' + server.status)}`);
302
+ console.log(` Transport: ${server.transport.toUpperCase()}`);
303
+ if (server.endpoint)
304
+ console.log(` Endpoint: ${server.endpoint}`);
305
+ if (server.command)
306
+ console.log(` Command: ${server.command} ${(server.args || []).join(' ')}`);
307
+ console.log(` Auth Type: ${server.authType}`);
308
+ console.log(` Has Secret: ${server.hasSecret ? chalk.green('Yes (Encrypted)') : 'No'}`);
309
+ console.log(` Last Connected: ${formatRelativeTime(server.lastConnectedAt)}`);
310
+ console.log(` Last Activity: ${formatRelativeTime(server.lastActivityAt)}`);
311
+ console.log(` Discovered Tools:${server.tools.length}`);
312
+ console.log(` Permissions: ${server.permissions.enabled ? chalk.green('Enabled') : chalk.red('Disabled')}`);
313
+ if (server.health.latencyMs !== undefined) {
314
+ console.log(` Latency: ${server.health.latencyMs}ms`);
315
+ }
316
+ console.log('');
317
+ }
318
+ /**
319
+ * scout mcp tools <server>
320
+ */
321
+ export async function handleMcpTools(serverArg) {
322
+ if (!serverArg) {
323
+ console.log(chalk.red('Please specify a server name or ID: ') + chalk.bold('scout mcp tools <server>'));
324
+ return;
325
+ }
326
+ const manager = getMCPManager();
327
+ const server = manager.getServer(serverArg);
328
+ if (!server) {
329
+ console.log(chalk.red(`MCP server "${serverArg}" not found.`));
330
+ return;
331
+ }
332
+ console.log(chalk.bold.cyan(`\nTOOLS: ${server.name} (${server.tools.length})\n`));
333
+ if (server.tools.length === 0) {
334
+ console.log(chalk.dim('No tools discovered yet. Make sure the server is connected.\n'));
335
+ return;
336
+ }
337
+ for (const tool of server.tools) {
338
+ const statusBadge = tool.enabled ? chalk.green('[ENABLED]') : chalk.red('[DISABLED]');
339
+ const permBadge = chalk.yellow(`[${tool.permissionLevel.toUpperCase()}]`);
340
+ console.log(`${statusBadge} ${permBadge} ${chalk.bold.white(tool.originalName)}`);
341
+ console.log(` ${chalk.dim(tool.description)}`);
342
+ const propKeys = Object.keys(tool.inputSchema.properties || {});
343
+ if (propKeys.length > 0) {
344
+ console.log(` ${chalk.dim('Parameters: ' + propKeys.join(', '))}`);
345
+ }
346
+ console.log('');
347
+ }
348
+ }
349
+ /**
350
+ * scout mcp health
351
+ */
352
+ export async function handleMcpHealth() {
353
+ const manager = getMCPManager();
354
+ const servers = manager.listServers();
355
+ if (servers.length === 0) {
356
+ console.log(chalk.dim('\nNo MCP servers configured yet.\n'));
357
+ return;
358
+ }
359
+ console.log(chalk.bold.cyan('\nMCP HEALTH\n'));
360
+ const s = spinner();
361
+ s.start('Probing MCP servers...');
362
+ const healthResults = await manager.checkHealth();
363
+ s.stop(chalk.green('Health probe completed'));
364
+ console.log('');
365
+ for (const server of servers) {
366
+ const h = healthResults[server.id] || server.health;
367
+ const isHealthy = h.status === 'connected';
368
+ const isDegraded = h.status === 'degraded';
369
+ const isUnauthorized = h.status === 'unauthorized';
370
+ let icon = chalk.green('✓');
371
+ let statusLabel = chalk.green('Healthy');
372
+ if (isDegraded) {
373
+ icon = chalk.yellow('⚠');
374
+ statusLabel = chalk.yellow('Degraded');
375
+ }
376
+ else if (isUnauthorized) {
377
+ icon = chalk.red('⚠');
378
+ statusLabel = chalk.red('Authentication Expired / Invalid');
379
+ }
380
+ else if (!isHealthy) {
381
+ icon = chalk.red('✕');
382
+ statusLabel = chalk.red(h.error || 'Offline / Error');
383
+ }
384
+ console.log(`${icon} ${chalk.bold(server.name)}`);
385
+ console.log(` Status: ${statusLabel}`);
386
+ if (h.latencyMs !== undefined) {
387
+ console.log(` Latency: ${h.latencyMs}ms`);
388
+ }
389
+ console.log(` Last Checked: ${formatRelativeTime(h.lastCheckedAt)}`);
390
+ console.log('');
391
+ }
392
+ }
393
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["mcp.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export async function handleOwners(targetPath) {
6
6
  s.start(`Analyzing git history for ${chalk.cyan(targetPath)}...`);
7
7
  if (!targetPath || !targetPath.trim()) {
8
8
  s.stop(chalk.red('No path provided.'));
9
- note(chalk.red('Please specify a file or directory path, e.g. `ft owners src/index.ts`'), '👥 File Knowledge Holders');
9
+ note(chalk.red('Please specify a file or directory path, e.g. `ft owners src/index.ts`'), ' File Knowledge Holders');
10
10
  return;
11
11
  }
12
12
  if (/^https?:\/\//i.test(targetPath) ||
@@ -14,14 +14,14 @@ export async function handleOwners(targetPath) {
14
14
  targetPath.includes('github.com') ||
15
15
  targetPath.includes('gitlab.com')) {
16
16
  s.stop(chalk.yellow('Remote repository URL detected.'));
17
- note(`\`ft owners\` is designed for local files and directories (e.g. ${chalk.cyan('ft owners src/index.ts')} or ${chalk.cyan('ft owners .')}).\n\nTo onboard and index a remote repository, please run:\n ${chalk.cyan(`ft init ${targetPath}`)}`, '💡 Usage Tip');
17
+ note(`\`ft owners\` is designed for local files and directories (e.g. ${chalk.cyan('scout owners src/index.ts')} or ${chalk.cyan('scout owners .')}).\n\nTo onboard and index a remote repository, please run:\n ${chalk.cyan(`ft init ${targetPath}`)}`, ' Usage Tip');
18
18
  return;
19
19
  }
20
20
  try {
21
21
  const owners = await getFileOwners(targetPath);
22
22
  if (owners.length === 0) {
23
23
  s.stop('Ownership analysis complete.');
24
- note(chalk.yellow(`No commit history found for "${targetPath}". Make sure the file exists and is tracked by Git.`), '👥 File Knowledge Holders');
24
+ note(chalk.yellow(`No commit history found for "${targetPath}". Make sure the file exists and is tracked by Git.`), ' File Knowledge Holders');
25
25
  return;
26
26
  }
27
27
  s.stop('Ownership analysis complete.');
@@ -32,14 +32,14 @@ export async function handleOwners(targetPath) {
32
32
  const dateStr = o.lastTouched
33
33
  ? chalk.dim(`(last active: ${new Date(o.lastTouched).toLocaleDateString()})`)
34
34
  : '';
35
- return ` ${rank} ${chalk.bold(o.author)} — ${pct} (${o.commits} commit${o.commits > 1 ? 's' : ''}) ${dateStr}`;
35
+ return ` ${rank} ${chalk.bold(o.author)} ${pct} (${o.commits} commit${o.commits > 1 ? 's' : ''}) ${dateStr}`;
36
36
  })
37
37
  .join('\n');
38
- note(`Target: ${chalk.bold.cyan(targetPath)}\n\n${chalk.bold('Knowledge Holders:')}\n${formattedList}`, '👥 File Knowledge Holders');
38
+ note(`Target: ${chalk.bold.cyan(targetPath)}\n\n${chalk.bold('Knowledge Holders:')}\n${formattedList}`, ' File Knowledge Holders');
39
39
  }
40
40
  catch (err) {
41
41
  s.stop(chalk.red('Ownership analysis failed.'));
42
- note(chalk.red(`Could not fetch git history for "${targetPath}". Make sure this is a valid git repository.\nError: ${err?.message || err}`), '👥 File Knowledge Holders');
42
+ note(chalk.red(`Could not fetch git history for "${targetPath}". Make sure this is a valid git repository.\nError: ${err?.message || err}`), ' File Knowledge Holders');
43
43
  }
44
44
  }
45
45
  //# sourceMappingURL=owners.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"owners.js","sourceRoot":"","sources":["owners.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"owners.js","sourceRoot":"","sources":["owners.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["plan.ts"],"names":[],"mappings":"AAOA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmKvD"}
@@ -0,0 +1,152 @@
1
+ import { select, isCancel, confirm, text } from '@clack/prompts';
2
+ import chalk from 'chalk';
3
+ import { exec } from 'child_process';
4
+ import { loadAuthConfig } from '../utils/auth.js';
5
+ import { PLAN_CONFIGS, createCheckoutSession, verifyAndApplyUpgrade, getActivePlanConfigs } from '../utils/payment.js';
6
+ import { safeNote } from '../utils/markdown.js';
7
+ export async function handlePlanCommand() {
8
+ const auth = loadAuthConfig();
9
+ const currentTier = (auth.currentTier || 'free').toLowerCase();
10
+ const used = auth.creditsUsed ?? 0;
11
+ const total = auth.creditsTotal ?? 100;
12
+ const plans = getActivePlanConfigs();
13
+ const proLabel = plans.pro.offerActive
14
+ ? `Pro (SPECIAL OFFER: ₹${plans.pro.monthlyPriceINR}/mo [Original ₹${plans.pro.originalMonthlyPriceINR}])`
15
+ : `Pro ($${plans.pro.monthlyPrice}/mo / ₹${plans.pro.monthlyPriceINR}/mo)`;
16
+ const entLabel = plans.enterprise.offerActive
17
+ ? `Enterprise (OFFER DEAL: ₹${plans.enterprise.monthlyPriceINR}/mo [Original ₹${plans.enterprise.originalMonthlyPriceINR}])`
18
+ : `Enterprise ($${plans.enterprise.monthlyPrice}/mo / ₹${plans.enterprise.monthlyPriceINR}/mo)`;
19
+ let offerHeader = '';
20
+ if (plans.pro.offerActive && plans.pro.offerBannerText) {
21
+ offerHeader += `\n ${chalk.bold.yellow(plans.pro.offerBannerText)}\n`;
22
+ }
23
+ if (plans.enterprise.offerActive && plans.enterprise.offerBannerText) {
24
+ offerHeader += `\n ${chalk.bold.magenta(plans.enterprise.offerBannerText)}\n`;
25
+ }
26
+ const expirationNotice = currentTier !== 'free'
27
+ ? `\n${chalk.dim('ℹ Paid plans cannot be downgraded. Upon reaching expiration date, your plan will auto-shift to Free tier.')}\n`
28
+ : '';
29
+ const expirationInfo = currentTier !== 'free' && auth.renewAt
30
+ ? `Expires: ${chalk.cyan(new Date(auth.renewAt).toLocaleDateString())} (auto-shifts to Free upon expiration)\n`
31
+ : '';
32
+ safeNote(`Current Plan: ${chalk.bold.cyan(currentTier.toUpperCase())}\n` +
33
+ `Account: ${chalk.bold(auth.user?.email || auth.user?.name || 'Local Session')}\n` +
34
+ (expirationInfo ? expirationInfo : '') +
35
+ `Credits: ${chalk.yellow(`${used}/${total}`)} (${chalk.green(`${Math.max(0, total - used)} remaining`)})\n` +
36
+ (offerHeader ? offerHeader + '\n' : '\n') +
37
+ `Available Subscription Tiers:\n` +
38
+ ` • ${chalk.bold.green(proLabel)} - 1,000 credits/mo, priority model, 5 session slots\n` +
39
+ ` • ${chalk.bold.magenta(entLabel)} - 10,000 credits/mo, dedicated scale, HUD vision\n` +
40
+ ` • ${chalk.bold.blue('BYOK Mode (Free)')} - Unlimited credits via your custom API key / proxy` +
41
+ expirationNotice, ' Scout Subscription Plans');
42
+ const menuOptions = [];
43
+ if (currentTier === 'free') {
44
+ menuOptions.push({ label: `Upgrade to ${proLabel}`, value: 'upgrade_pro' });
45
+ menuOptions.push({ label: `Upgrade to ${entLabel}`, value: 'upgrade_enterprise' });
46
+ menuOptions.push({ label: 'Verify & Apply Completed PayPal Payment Token', value: 'verify_token' });
47
+ }
48
+ else if (currentTier === 'pro') {
49
+ menuOptions.push({ label: `Upgrade to ${entLabel}`, value: 'upgrade_enterprise' });
50
+ menuOptions.push({ label: 'Verify & Apply Completed PayPal Payment Token', value: 'verify_token' });
51
+ }
52
+ menuOptions.push({ label: 'Open Web Dashboard Plans (/plans)', value: 'open_dashboard' });
53
+ menuOptions.push({ label: 'Exit', value: 'exit' });
54
+ const action = await select({
55
+ message: currentTier === 'enterprise'
56
+ ? 'You are on the highest plan (Enterprise). Select an option:'
57
+ : 'Select an option:',
58
+ options: menuOptions,
59
+ });
60
+ if (isCancel(action) || action === 'exit') {
61
+ return;
62
+ }
63
+ if (action === 'open_dashboard') {
64
+ const baseUrl = process.env.FRONTTERRAIN_DASHBOARD_URL || 'https://scout.frontterrain.com';
65
+ const url = `${baseUrl.replace(/\/$/, '')}/plans`;
66
+ console.log(`\nOpening ${chalk.cyan(url)} in your browser...`);
67
+ const openCmd = process.platform === 'win32' ? `start "" "${url}"` : process.platform === 'darwin' ? `open "${url}"` : `xdg-open "${url}"`;
68
+ exec(openCmd);
69
+ return;
70
+ }
71
+ if (action === 'verify_token') {
72
+ if (currentTier === 'enterprise') {
73
+ console.log(chalk.yellow('\nYou are already on the Enterprise tier (highest tier). Downgrading is not permitted.\n'));
74
+ return;
75
+ }
76
+ const tokenInput = await text({
77
+ message: 'Enter your PayPal Order Token or Transaction ID:',
78
+ placeholder: '3X325668GU7385727',
79
+ validate(val) {
80
+ if (!val || !val.trim())
81
+ return 'Token or Order ID is required.';
82
+ },
83
+ });
84
+ if (isCancel(tokenInput) || !tokenInput)
85
+ return;
86
+ let targetTierChoice;
87
+ if (currentTier === 'pro') {
88
+ targetTierChoice = 'enterprise';
89
+ }
90
+ else {
91
+ const choice = await select({
92
+ message: 'Select the tier you purchased:',
93
+ options: [
94
+ { label: 'Pro Developer (1,000 credits)', value: 'pro' },
95
+ { label: 'Enterprise (10,000 credits)', value: 'enterprise' },
96
+ ],
97
+ });
98
+ if (isCancel(choice))
99
+ return;
100
+ targetTierChoice = choice;
101
+ }
102
+ try {
103
+ console.log(`\n${chalk.dim('Verifying payment with PayPal...')}`);
104
+ const result = await verifyAndApplyUpgrade({
105
+ orderId: tokenInput.trim(),
106
+ tier: targetTierChoice,
107
+ });
108
+ if (result.success) {
109
+ safeNote(` 🎉 ${chalk.bold.green('Subscription Upgrade Verified & Applied!')}\n\n` +
110
+ `New Tier: ${chalk.bold.cyan(result.tier.toUpperCase())}\n` +
111
+ `Total Credits: ${chalk.bold.yellow(result.totalCredits)}\n` +
112
+ `Transaction ID: ${chalk.dim(result.transactionId)}\n` +
113
+ `Next Renewal: ${chalk.cyan(new Date(result.renewAt).toLocaleDateString())}`, ' Payment Verified');
114
+ }
115
+ }
116
+ catch (err) {
117
+ console.log(`\n${chalk.bold.red('Verification Error:')} ${err.message || err}\n`);
118
+ }
119
+ return;
120
+ }
121
+ const targetTier = action === 'upgrade_enterprise' ? 'enterprise' : 'pro';
122
+ const plan = plans[targetTier];
123
+ const confirmed = await confirm({
124
+ message: `Confirm checkout for ${plan.name} ($${plan.monthlyPrice}/mo / ₹${plan.monthlyPriceINR}/mo for ${plan.credits.toLocaleString()} credits)?`,
125
+ });
126
+ if (isCancel(confirmed) || !confirmed) {
127
+ return;
128
+ }
129
+ try {
130
+ console.log(`\n${chalk.dim('Connecting to PayPal payment gateway...')}`);
131
+ const session = await createCheckoutSession({
132
+ tier: targetTier,
133
+ billingCycle: 'monthly',
134
+ userEmail: auth.user?.email,
135
+ });
136
+ if (session.checkoutUrl) {
137
+ console.log(`\n${chalk.bold.green(' PayPal Checkout Order Created!')}`);
138
+ console.log(`Please complete payment in your browser:\n${chalk.underline.cyan(session.checkoutUrl)}\n`);
139
+ const openCmd = process.platform === 'win32' ? `start "" "${session.checkoutUrl}"` : process.platform === 'darwin' ? `open "${session.checkoutUrl}"` : `xdg-open "${session.checkoutUrl}"`;
140
+ exec(openCmd);
141
+ console.log(chalk.dim('After approving order on PayPal, run "scout plan" and select "Verify & Apply Completed PayPal Payment Token".\n'));
142
+ return;
143
+ }
144
+ else {
145
+ throw new Error('PayPal did not return a valid checkout URL.');
146
+ }
147
+ }
148
+ catch (err) {
149
+ console.log(`\n${chalk.bold.red('Error processing payment:')} ${err.message || err}\n`);
150
+ }
151
+ }
152
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["plan.ts"],"names":[],"mappings":"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"}