funolio-agent 0.3.7 → 0.5.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 (81) hide show
  1. package/dist/agent-config.d.ts +39 -0
  2. package/dist/agent-config.d.ts.map +1 -0
  3. package/dist/agent-config.js +123 -0
  4. package/dist/agent-config.js.map +1 -0
  5. package/dist/approval.d.ts +26 -0
  6. package/dist/approval.d.ts.map +1 -0
  7. package/dist/approval.js +73 -0
  8. package/dist/approval.js.map +1 -0
  9. package/dist/bot-manager.d.ts +21 -14
  10. package/dist/bot-manager.d.ts.map +1 -1
  11. package/dist/bot-manager.js +75 -82
  12. package/dist/bot-manager.js.map +1 -1
  13. package/dist/cli.js +120 -4
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands/add.d.ts +8 -0
  16. package/dist/commands/add.d.ts.map +1 -0
  17. package/dist/commands/add.js +212 -0
  18. package/dist/commands/add.js.map +1 -0
  19. package/dist/commands/configure-provider.d.ts +14 -0
  20. package/dist/commands/configure-provider.d.ts.map +1 -0
  21. package/dist/commands/configure-provider.js +332 -0
  22. package/dist/commands/configure-provider.js.map +1 -0
  23. package/dist/commands/detect-tools.d.ts +7 -0
  24. package/dist/commands/detect-tools.d.ts.map +1 -0
  25. package/dist/commands/detect-tools.js +151 -0
  26. package/dist/commands/detect-tools.js.map +1 -0
  27. package/dist/commands/service.d.ts +6 -0
  28. package/dist/commands/service.d.ts.map +1 -0
  29. package/dist/commands/service.js +228 -0
  30. package/dist/commands/service.js.map +1 -0
  31. package/dist/commands/setup.d.ts +9 -0
  32. package/dist/commands/setup.d.ts.map +1 -0
  33. package/dist/commands/setup.js +220 -0
  34. package/dist/commands/setup.js.map +1 -0
  35. package/dist/commands/start.d.ts +2 -0
  36. package/dist/commands/start.d.ts.map +1 -1
  37. package/dist/commands/start.js +142 -45
  38. package/dist/commands/start.js.map +1 -1
  39. package/dist/commands/status.d.ts.map +1 -1
  40. package/dist/commands/status.js +54 -22
  41. package/dist/commands/status.js.map +1 -1
  42. package/dist/config.d.ts +23 -1
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +1 -1
  45. package/dist/config.js.map +1 -1
  46. package/dist/funolio-agent-linux-x64 +0 -0
  47. package/dist/message-loop.d.ts +6 -0
  48. package/dist/message-loop.d.ts.map +1 -1
  49. package/dist/message-loop.js +54 -15
  50. package/dist/message-loop.js.map +1 -1
  51. package/dist/mqtt-client.d.ts +19 -1
  52. package/dist/mqtt-client.d.ts.map +1 -1
  53. package/dist/mqtt-client.js +82 -1
  54. package/dist/mqtt-client.js.map +1 -1
  55. package/dist/providers/anthropic.d.ts +1 -0
  56. package/dist/providers/anthropic.d.ts.map +1 -1
  57. package/dist/providers/anthropic.js +58 -26
  58. package/dist/providers/anthropic.js.map +1 -1
  59. package/dist/providers/claude-cli.d.ts +1 -0
  60. package/dist/providers/claude-cli.d.ts.map +1 -1
  61. package/dist/providers/claude-cli.js +88 -14
  62. package/dist/providers/claude-cli.js.map +1 -1
  63. package/dist/providers/google.d.ts.map +1 -1
  64. package/dist/providers/google.js +31 -2
  65. package/dist/providers/google.js.map +1 -1
  66. package/dist/providers/index.d.ts +8 -1
  67. package/dist/providers/index.d.ts.map +1 -1
  68. package/dist/providers/index.js +42 -2
  69. package/dist/providers/index.js.map +1 -1
  70. package/dist/providers/openai.d.ts +3 -1
  71. package/dist/providers/openai.d.ts.map +1 -1
  72. package/dist/providers/openai.js +23 -3
  73. package/dist/providers/openai.js.map +1 -1
  74. package/dist/service-mode.d.ts +24 -0
  75. package/dist/service-mode.d.ts.map +1 -0
  76. package/dist/service-mode.js +123 -0
  77. package/dist/service-mode.js.map +1 -0
  78. package/dist/tools/run-command.d.ts.map +1 -1
  79. package/dist/tools/run-command.js +4 -1
  80. package/dist/tools/run-command.js.map +1 -1
  81. package/package.json +21 -4
@@ -0,0 +1,332 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.configureProvider = configureProvider;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const child_process_1 = require("child_process");
42
+ const readline = __importStar(require("readline"));
43
+ const https = __importStar(require("https"));
44
+ const config_1 = require("../config");
45
+ function prompt(question) {
46
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
47
+ return new Promise((resolve) => {
48
+ rl.question(question, (answer) => {
49
+ rl.close();
50
+ resolve(answer.trim());
51
+ });
52
+ });
53
+ }
54
+ function validateApiKey(providerId, apiKey) {
55
+ return new Promise((resolve) => {
56
+ let options;
57
+ switch (providerId) {
58
+ case 'anthropic':
59
+ options = {
60
+ hostname: 'api.anthropic.com',
61
+ path: '/v1/models',
62
+ headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },
63
+ };
64
+ break;
65
+ case 'openai':
66
+ options = {
67
+ hostname: 'api.openai.com',
68
+ path: '/v1/models?limit=1',
69
+ headers: { Authorization: `Bearer ${apiKey}` },
70
+ };
71
+ break;
72
+ case 'google':
73
+ options = {
74
+ hostname: 'generativelanguage.googleapis.com',
75
+ path: `/v1/models?key=${apiKey}&pageSize=1`,
76
+ headers: {},
77
+ };
78
+ break;
79
+ default:
80
+ resolve(true);
81
+ return;
82
+ }
83
+ const req = https.get({ ...options, port: 443 }, (res) => {
84
+ resolve(res.statusCode === 200);
85
+ res.resume();
86
+ });
87
+ req.on('error', () => resolve(false));
88
+ req.setTimeout(10000, () => { req.destroy(); resolve(false); });
89
+ });
90
+ }
91
+ async function setupClaudeCli() {
92
+ // Check if claude CLI exists
93
+ let found = false;
94
+ try {
95
+ (0, child_process_1.execSync)('claude --version', { stdio: 'pipe', timeout: 5000 });
96
+ found = true;
97
+ console.log(chalk_1.default.green(' āœ“ Claude CLI found'));
98
+ }
99
+ catch {
100
+ // Not found
101
+ }
102
+ if (!found) {
103
+ // Check if npm exists
104
+ let hasNpm = false;
105
+ try {
106
+ (0, child_process_1.execSync)('npm --version', { stdio: 'pipe', timeout: 3000 });
107
+ hasNpm = true;
108
+ }
109
+ catch { /* no npm */ }
110
+ if (!hasNpm) {
111
+ console.log(chalk_1.default.yellow(' ⚠ Claude CLI not found and npm is not available.'));
112
+ console.log(chalk_1.default.gray(' You can still use an Anthropic API key instead.'));
113
+ console.log(chalk_1.default.gray(' Or install Node.js/npm first, then: npm install -g @anthropic-ai/claude-code\n'));
114
+ // Fall through to token/key prompt below
115
+ }
116
+ else {
117
+ const install = await prompt(' Claude CLI not found. Install it? (Y/n): ');
118
+ if (install.toLowerCase() !== 'n') {
119
+ console.log(chalk_1.default.blue(' Installing Claude Code CLI...'));
120
+ try {
121
+ (0, child_process_1.execSync)('npm install -g @anthropic-ai/claude-code', { stdio: 'inherit', timeout: 120000 });
122
+ console.log(chalk_1.default.green(' āœ“ Claude CLI installed'));
123
+ found = true;
124
+ }
125
+ catch {
126
+ console.log(chalk_1.default.yellow(' ⚠ Install failed — you can enter an API key instead.\n'));
127
+ }
128
+ }
129
+ }
130
+ }
131
+ // Check if already authenticated
132
+ let authed = false;
133
+ try {
134
+ const result = (0, child_process_1.execSync)('claude --print "test" 2>/dev/null', {
135
+ encoding: 'utf-8',
136
+ timeout: 15000,
137
+ stdio: ['pipe', 'pipe', 'pipe'],
138
+ });
139
+ if (result && result.length > 0) {
140
+ authed = true;
141
+ }
142
+ }
143
+ catch {
144
+ // Not authed
145
+ }
146
+ if (authed) {
147
+ console.log(chalk_1.default.green(' āœ“ Claude CLI already authenticated'));
148
+ return;
149
+ }
150
+ console.log(chalk_1.default.cyan('\n Claude needs an API key to work on this server.\n'));
151
+ console.log(chalk_1.default.white(' Get one from: ') + chalk_1.default.cyan.underline('https://console.anthropic.com/settings/keys'));
152
+ console.log(chalk_1.default.gray(' (Create a key → copy it → paste below)\n'));
153
+ let tokenOrKey = '';
154
+ while (true) {
155
+ tokenOrKey = await prompt(chalk_1.default.cyan(' Paste your Anthropic API key (or "skip" to do later): '));
156
+ if (tokenOrKey.toLowerCase() === 'skip') {
157
+ console.log(chalk_1.default.yellow(' ⚠ Skipped. Set ANTHROPIC_API_KEY before starting the agent.'));
158
+ return;
159
+ }
160
+ if (!tokenOrKey) {
161
+ console.log(chalk_1.default.yellow(' No key entered. Try again or type "skip".\n'));
162
+ continue;
163
+ }
164
+ if (!tokenOrKey.startsWith('sk-ant-')) {
165
+ console.log(chalk_1.default.yellow(' ⚠ That doesn\'t look like an Anthropic key (should start with sk-ant-).'));
166
+ const proceed = await prompt(' Use it anyway? (y/N): ');
167
+ if (proceed.toLowerCase() !== 'y') {
168
+ continue;
169
+ }
170
+ }
171
+ break;
172
+ }
173
+ // Determine if it's an OAuth token or API key
174
+ const isOAuthToken = tokenOrKey.startsWith('sk-ant-oat01-');
175
+ const envVar = isOAuthToken ? 'CLAUDE_CODE_OAUTH_TOKEN' : 'ANTHROPIC_API_KEY';
176
+ // Save to agent config for the systemd service
177
+ const agentConfig = (0, config_1.loadConfig)();
178
+ if (!agentConfig.env)
179
+ agentConfig.env = {};
180
+ agentConfig.env[envVar] = tokenOrKey;
181
+ (0, config_1.saveConfig)(agentConfig);
182
+ // Also write to shell profile for manual usage
183
+ const profileLine = `export ${envVar}="${tokenOrKey}"`;
184
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
185
+ const os = await Promise.resolve().then(() => __importStar(require('os')));
186
+ const profilePath = `${os.homedir()}/.bashrc`;
187
+ try {
188
+ const existing = fs.readFileSync(profilePath, 'utf-8');
189
+ if (!existing.includes(envVar)) {
190
+ fs.appendFileSync(profilePath, `\n# Funolio Agent - Claude Code auth\n${profileLine}\n`);
191
+ console.log(chalk_1.default.gray(` Added ${envVar} to ~/.bashrc`));
192
+ }
193
+ }
194
+ catch { /* ignore */ }
195
+ // Set for current process so verification works
196
+ process.env[envVar] = tokenOrKey;
197
+ // Verify it works
198
+ console.log(chalk_1.default.blue(' Verifying authentication...'));
199
+ try {
200
+ const result = (0, child_process_1.execSync)('claude --print "say ok" 2>/dev/null', {
201
+ encoding: 'utf-8',
202
+ timeout: 30000,
203
+ stdio: ['pipe', 'pipe', 'pipe'],
204
+ env: { ...process.env, [envVar]: tokenOrKey },
205
+ });
206
+ if (result && result.length > 0) {
207
+ console.log(chalk_1.default.green(' āœ“ Claude CLI authenticated'));
208
+ }
209
+ else {
210
+ throw new Error('empty response');
211
+ }
212
+ }
213
+ catch {
214
+ console.log(chalk_1.default.yellow(' ⚠ Could not verify token — it may still work. Saved to config.'));
215
+ }
216
+ }
217
+ /**
218
+ * Interactive LLM provider configuration.
219
+ * Used by both `setup` and `add` commands.
220
+ * Saves the provider config to the provided config object (or global config).
221
+ * Returns the configured provider.
222
+ */
223
+ async function configureProvider(options, config) {
224
+ console.log(chalk_1.default.blue.bold('\nšŸ“” LLM Provider Setup\n'));
225
+ const providers = [
226
+ { id: 'claude-cli', label: 'Claude Code CLI (uses Anthropic OAuth — no API key needed)' },
227
+ { id: 'anthropic', label: 'Anthropic API (bring your own key)' },
228
+ { id: 'openai', label: 'OpenAI API (bring your own key)' },
229
+ { id: 'google', label: 'Google Gemini API (bring your own key)' },
230
+ ];
231
+ let providerId = options.provider;
232
+ if (!providerId && !options.nonInteractive) {
233
+ console.log(chalk_1.default.white(' Select your AI provider:\n'));
234
+ for (let i = 0; i < providers.length; i++) {
235
+ const marker = i === 0 ? chalk_1.default.cyan('āÆ') : ' ';
236
+ console.log(chalk_1.default.white(` ${marker} ${i + 1}. ${providers[i].label}`));
237
+ }
238
+ console.log('');
239
+ const choice = await prompt(' Choice (1-4): ');
240
+ const idx = parseInt(choice, 10) - 1;
241
+ providerId = providers[idx]?.id;
242
+ if (!providerId) {
243
+ console.error(chalk_1.default.red(' āœ— Invalid choice'));
244
+ process.exit(1);
245
+ }
246
+ }
247
+ if (!providerId) {
248
+ providerId = 'claude-cli';
249
+ }
250
+ const cfg = config || (0, config_1.loadConfig)();
251
+ let providerConfig;
252
+ if (providerId === 'claude-cli') {
253
+ await setupClaudeCli();
254
+ providerConfig = {
255
+ id: 'claude-cli',
256
+ authType: 'oauth',
257
+ defaultModel: 'claude-code',
258
+ };
259
+ }
260
+ else {
261
+ // API key providers
262
+ const envVarMap = {
263
+ anthropic: 'ANTHROPIC_API_KEY',
264
+ openai: 'OPENAI_API_KEY',
265
+ google: 'GOOGLE_API_KEY',
266
+ };
267
+ let apiKey = process.env[envVarMap[providerId] || ''] || '';
268
+ if (!apiKey && !options.nonInteractive) {
269
+ apiKey = await prompt(` ${providerId} API key: `);
270
+ }
271
+ if (!apiKey) {
272
+ console.error(chalk_1.default.red(' āœ— No API key provided'));
273
+ process.exit(1);
274
+ }
275
+ console.log(chalk_1.default.blue(' Validating API key...'));
276
+ const valid = await validateApiKey(providerId, apiKey);
277
+ if (!valid) {
278
+ console.log(chalk_1.default.yellow(' ⚠ API key validation failed — it may still work.'));
279
+ if (!options.nonInteractive) {
280
+ const proceed = await prompt(' Continue anyway? (y/N): ');
281
+ if (proceed.toLowerCase() !== 'y') {
282
+ process.exit(1);
283
+ }
284
+ }
285
+ }
286
+ else {
287
+ console.log(chalk_1.default.green(' āœ“ API key valid'));
288
+ }
289
+ // Model selection
290
+ let selectedModel = config_1.DEFAULT_MODELS[providerId] || '';
291
+ const models = config_1.PROVIDER_MODELS[providerId];
292
+ if (models && models.length > 0 && !options.nonInteractive) {
293
+ console.log(chalk_1.default.white('\n Select model:\n'));
294
+ for (let i = 0; i < models.length; i++) {
295
+ console.log(chalk_1.default.white(` ${i + 1}. ${models[i].label}`));
296
+ }
297
+ const modelChoice = await prompt(`\n Choice (1-${models.length}) [1]: `);
298
+ const modelIdx = parseInt(modelChoice, 10) - 1;
299
+ if (modelIdx >= 0 && modelIdx < models.length) {
300
+ selectedModel = models[modelIdx].id;
301
+ }
302
+ else {
303
+ selectedModel = models[0].id;
304
+ }
305
+ }
306
+ providerConfig = {
307
+ id: providerId,
308
+ authType: 'apiKey',
309
+ apiKey,
310
+ defaultModel: selectedModel,
311
+ };
312
+ }
313
+ // Save to config
314
+ if (!cfg.providers) {
315
+ cfg.providers = [];
316
+ }
317
+ const existingIdx = cfg.providers.findIndex((p) => p.id === providerId);
318
+ if (existingIdx >= 0) {
319
+ cfg.providers[existingIdx] = providerConfig;
320
+ }
321
+ else {
322
+ cfg.providers.push(providerConfig);
323
+ }
324
+ cfg.defaultProvider = providerId;
325
+ if (!config) {
326
+ // Save to global config if no config was passed
327
+ (0, config_1.saveConfig)(cfg);
328
+ }
329
+ console.log(chalk_1.default.green(` āœ“ Provider configured: ${providerId}`));
330
+ return providerConfig;
331
+ }
332
+ //# sourceMappingURL=configure-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure-provider.js","sourceRoot":"","sources":["../../src/commands/configure-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface DetectedTool {
2
+ name: string;
3
+ version: string;
4
+ }
5
+ export declare function detectTools(): DetectedTool[];
6
+ export declare function detectAndReport(token: string): Promise<DetectedTool[]>;
7
+ //# sourceMappingURL=detect-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-tools.d.ts","sourceRoot":"","sources":["../../src/commands/detect-tools.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AA8DD,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAoB5C;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoC5E"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.detectTools = detectTools;
40
+ exports.detectAndReport = detectAndReport;
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const child_process_1 = require("child_process");
43
+ const os = __importStar(require("os"));
44
+ const fs = __importStar(require("fs"));
45
+ const config_1 = require("../config");
46
+ const KNOWN_TOOLS = [
47
+ { name: 'git', cmd: 'git --version', parse: (s) => s.replace('git version ', '').trim().split('\n')[0] },
48
+ { name: 'gh', cmd: 'gh --version', parse: (s) => s.split('\n')[0].replace('gh version ', '').split(' ')[0] },
49
+ { name: 'node', cmd: 'node --version', parse: (s) => s.trim() },
50
+ { name: 'npm', cmd: 'npm --version', parse: (s) => s.trim() },
51
+ { name: 'python3', cmd: 'python3 --version', parse: (s) => s.replace('Python ', '').trim() },
52
+ { name: 'pip', cmd: 'pip3 --version', parse: (s) => { const m = s.match(/pip\s+([\d.]+)/); return m ? m[1] : s.trim().split(' ')[1] || ''; } },
53
+ { name: 'docker', cmd: 'docker --version', parse: (s) => s.replace('Docker version ', '').split(',')[0].trim() },
54
+ { name: 'cargo', cmd: 'cargo --version', parse: (s) => s.replace('cargo ', '').trim().split(' ')[0] },
55
+ { name: 'go', cmd: 'go version', parse: (s) => (s.split(' ')[2] || '').replace('go', '') },
56
+ { name: 'kubectl', cmd: 'kubectl version --client -o json 2>/dev/null', parse: (s) => { try {
57
+ return JSON.parse(s).clientVersion?.gitVersion || '';
58
+ }
59
+ catch {
60
+ return '';
61
+ } } },
62
+ { name: 'terraform', cmd: 'terraform version 2>/dev/null', parse: (s) => s.split('\n')[0].replace('Terraform v', '').trim() },
63
+ { name: 'aws', cmd: 'aws --version 2>&1', parse: (s) => s.split(' ')[0].replace('aws-cli/', '').trim() },
64
+ { name: 'gcloud', cmd: 'gcloud --version 2>/dev/null | head -1', parse: (s) => s.replace('Google Cloud SDK ', '').trim() },
65
+ { name: 'ffmpeg', cmd: 'ffmpeg -version 2>/dev/null | head -1', parse: (s) => { const m = s.match(/version\s+([\d.]+)/); return m ? m[1] : ''; } },
66
+ { name: 'claude', cmd: 'claude --version 2>/dev/null', parse: (s) => s.trim() },
67
+ ];
68
+ function getSystemInfo() {
69
+ let osRelease = '';
70
+ try {
71
+ if (fs.existsSync('/etc/os-release')) {
72
+ const content = fs.readFileSync('/etc/os-release', 'utf-8');
73
+ const match = content.match(/PRETTY_NAME="?([^"\n]+)"?/);
74
+ if (match)
75
+ osRelease = match[1];
76
+ }
77
+ }
78
+ catch { /* ignore */ }
79
+ let diskMb;
80
+ try {
81
+ const dfOutput = (0, child_process_1.execSync)('df -m / 2>/dev/null | tail -1', { encoding: 'utf-8', timeout: 3000 });
82
+ const parts = dfOutput.trim().split(/\s+/);
83
+ if (parts.length >= 4) {
84
+ diskMb = parseInt(parts[3], 10); // available space
85
+ }
86
+ }
87
+ catch { /* ignore */ }
88
+ return {
89
+ hostname: os.hostname(),
90
+ platform: os.platform(),
91
+ arch: os.arch(),
92
+ cpus: os.cpus().length,
93
+ memoryMb: Math.round(os.totalmem() / 1024 / 1024),
94
+ diskMb,
95
+ nodeVersion: process.version,
96
+ osRelease: osRelease || `${os.type()} ${os.release()}`,
97
+ };
98
+ }
99
+ function detectTools() {
100
+ const tools = [];
101
+ for (const tool of KNOWN_TOOLS) {
102
+ try {
103
+ const output = (0, child_process_1.execSync)(tool.cmd, {
104
+ encoding: 'utf-8',
105
+ timeout: 5000,
106
+ stdio: ['pipe', 'pipe', 'pipe'],
107
+ });
108
+ const version = tool.parse(output);
109
+ if (version) {
110
+ tools.push({ name: tool.name, version });
111
+ }
112
+ }
113
+ catch {
114
+ // Not installed
115
+ }
116
+ }
117
+ return tools;
118
+ }
119
+ async function detectAndReport(token) {
120
+ console.log(chalk_1.default.blue('\nšŸ” Detecting tools...'));
121
+ const tools = detectTools();
122
+ for (const tool of tools) {
123
+ console.log(chalk_1.default.green(` āœ“ ${tool.name} ${tool.version}`));
124
+ }
125
+ if (tools.length === 0) {
126
+ console.log(chalk_1.default.yellow(' No known tools detected'));
127
+ }
128
+ const serverInfo = getSystemInfo();
129
+ try {
130
+ await fetch(`${config_1.FUNOLIO_API_URL}/api/v1/agent/status`, {
131
+ method: 'POST',
132
+ headers: {
133
+ 'Content-Type': 'application/json',
134
+ Authorization: `Bearer ${token}`,
135
+ },
136
+ body: JSON.stringify({
137
+ status: 'online',
138
+ capabilities: {
139
+ tools: tools.map((t) => ({ name: t.name, version: t.version })),
140
+ serverInfo,
141
+ },
142
+ }),
143
+ });
144
+ console.log(chalk_1.default.green(' āœ“ Capabilities reported to funolio.com'));
145
+ }
146
+ catch {
147
+ console.log(chalk_1.default.yellow(' ⚠ Could not report capabilities (non-fatal)'));
148
+ }
149
+ return tools;
150
+ }
151
+ //# sourceMappingURL=detect-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-tools.js","sourceRoot":"","sources":["../../src/commands/detect-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function serviceInstallCommand(agentName?: string): Promise<void>;
2
+ export declare function serviceStartCommand(agentName?: string): Promise<void>;
3
+ export declare function serviceStopCommand(agentName?: string): Promise<void>;
4
+ export declare function serviceStatusCommand(agentName?: string): Promise<void>;
5
+ export declare function serviceUninstallCommand(agentName?: string): Promise<void>;
6
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAiFA,wBAAsB,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC7E;AAED,wBAAsB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3E;AAED,wBAAsB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa1E;AAED,wBAAsB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5E;AAED,wBAAsB,uBAAuB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB/E"}