funolio-agent 0.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 (138) hide show
  1. package/README.md +55 -0
  2. package/dist/clerk/index.d.ts +62 -0
  3. package/dist/clerk/index.d.ts.map +1 -0
  4. package/dist/clerk/index.js +186 -0
  5. package/dist/clerk/index.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +42 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/configure.d.ts +2 -0
  11. package/dist/commands/configure.d.ts.map +1 -0
  12. package/dist/commands/configure.js +252 -0
  13. package/dist/commands/configure.js.map +1 -0
  14. package/dist/commands/init.d.ts +6 -0
  15. package/dist/commands/init.d.ts.map +1 -0
  16. package/dist/commands/init.js +151 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/login.d.ts +6 -0
  19. package/dist/commands/login.d.ts.map +1 -0
  20. package/dist/commands/login.js +170 -0
  21. package/dist/commands/login.js.map +1 -0
  22. package/dist/commands/start.d.ts +8 -0
  23. package/dist/commands/start.d.ts.map +1 -0
  24. package/dist/commands/start.js +179 -0
  25. package/dist/commands/start.js.map +1 -0
  26. package/dist/commands/status.d.ts +2 -0
  27. package/dist/commands/status.d.ts.map +1 -0
  28. package/dist/commands/status.js +55 -0
  29. package/dist/commands/status.js.map +1 -0
  30. package/dist/config.d.ts +46 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +113 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/index.d.ts +24 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +48 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp/index.d.ts +9 -0
  39. package/dist/mcp/index.d.ts.map +1 -0
  40. package/dist/mcp/index.js +15 -0
  41. package/dist/mcp/index.js.map +1 -0
  42. package/dist/mcp/manager.d.ts +83 -0
  43. package/dist/mcp/manager.d.ts.map +1 -0
  44. package/dist/mcp/manager.js +338 -0
  45. package/dist/mcp/manager.js.map +1 -0
  46. package/dist/mcp/registry.d.ts +32 -0
  47. package/dist/mcp/registry.d.ts.map +1 -0
  48. package/dist/mcp/registry.js +139 -0
  49. package/dist/mcp/registry.js.map +1 -0
  50. package/dist/message-loop.d.ts +18 -0
  51. package/dist/message-loop.d.ts.map +1 -0
  52. package/dist/message-loop.js +165 -0
  53. package/dist/message-loop.js.map +1 -0
  54. package/dist/mqtt-client.d.ts +67 -0
  55. package/dist/mqtt-client.d.ts.map +1 -0
  56. package/dist/mqtt-client.js +148 -0
  57. package/dist/mqtt-client.js.map +1 -0
  58. package/dist/providers/anthropic.d.ts +10 -0
  59. package/dist/providers/anthropic.d.ts.map +1 -0
  60. package/dist/providers/anthropic.js +183 -0
  61. package/dist/providers/anthropic.js.map +1 -0
  62. package/dist/providers/google.d.ts +10 -0
  63. package/dist/providers/google.d.ts.map +1 -0
  64. package/dist/providers/google.js +161 -0
  65. package/dist/providers/google.js.map +1 -0
  66. package/dist/providers/index.d.ts +42 -0
  67. package/dist/providers/index.d.ts.map +1 -0
  68. package/dist/providers/index.js +19 -0
  69. package/dist/providers/index.js.map +1 -0
  70. package/dist/providers/openai.d.ts +10 -0
  71. package/dist/providers/openai.d.ts.map +1 -0
  72. package/dist/providers/openai.js +173 -0
  73. package/dist/providers/openai.js.map +1 -0
  74. package/dist/providers/retry.d.ts +6 -0
  75. package/dist/providers/retry.d.ts.map +1 -0
  76. package/dist/providers/retry.js +38 -0
  77. package/dist/providers/retry.js.map +1 -0
  78. package/dist/subagent/index.d.ts +8 -0
  79. package/dist/subagent/index.d.ts.map +1 -0
  80. package/dist/subagent/index.js +14 -0
  81. package/dist/subagent/index.js.map +1 -0
  82. package/dist/subagent/orchestrator.d.ts +67 -0
  83. package/dist/subagent/orchestrator.d.ts.map +1 -0
  84. package/dist/subagent/orchestrator.js +152 -0
  85. package/dist/subagent/orchestrator.js.map +1 -0
  86. package/dist/subagent/queue.d.ts +66 -0
  87. package/dist/subagent/queue.d.ts.map +1 -0
  88. package/dist/subagent/queue.js +298 -0
  89. package/dist/subagent/queue.js.map +1 -0
  90. package/dist/subagent/types.d.ts +76 -0
  91. package/dist/subagent/types.d.ts.map +1 -0
  92. package/dist/subagent/types.js +14 -0
  93. package/dist/subagent/types.js.map +1 -0
  94. package/dist/tools/edit-file.d.ts +3 -0
  95. package/dist/tools/edit-file.d.ts.map +1 -0
  96. package/dist/tools/edit-file.js +112 -0
  97. package/dist/tools/edit-file.js.map +1 -0
  98. package/dist/tools/git-tools.d.ts +5 -0
  99. package/dist/tools/git-tools.d.ts.map +1 -0
  100. package/dist/tools/git-tools.js +144 -0
  101. package/dist/tools/git-tools.js.map +1 -0
  102. package/dist/tools/index.d.ts +40 -0
  103. package/dist/tools/index.d.ts.map +1 -0
  104. package/dist/tools/index.js +126 -0
  105. package/dist/tools/index.js.map +1 -0
  106. package/dist/tools/installer.d.ts +41 -0
  107. package/dist/tools/installer.d.ts.map +1 -0
  108. package/dist/tools/installer.js +227 -0
  109. package/dist/tools/installer.js.map +1 -0
  110. package/dist/tools/list-directory.d.ts +3 -0
  111. package/dist/tools/list-directory.d.ts.map +1 -0
  112. package/dist/tools/list-directory.js +107 -0
  113. package/dist/tools/list-directory.js.map +1 -0
  114. package/dist/tools/read-file.d.ts +3 -0
  115. package/dist/tools/read-file.d.ts.map +1 -0
  116. package/dist/tools/read-file.js +89 -0
  117. package/dist/tools/read-file.js.map +1 -0
  118. package/dist/tools/run-command.d.ts +3 -0
  119. package/dist/tools/run-command.d.ts.map +1 -0
  120. package/dist/tools/run-command.js +86 -0
  121. package/dist/tools/run-command.js.map +1 -0
  122. package/dist/tools/sandbox.d.ts +17 -0
  123. package/dist/tools/sandbox.d.ts.map +1 -0
  124. package/dist/tools/sandbox.js +78 -0
  125. package/dist/tools/sandbox.js.map +1 -0
  126. package/dist/tools/write-file.d.ts +3 -0
  127. package/dist/tools/write-file.d.ts.map +1 -0
  128. package/dist/tools/write-file.js +88 -0
  129. package/dist/tools/write-file.js.map +1 -0
  130. package/dist/types.d.ts +67 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +6 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/verification/index.d.ts +17 -0
  135. package/dist/verification/index.d.ts.map +1 -0
  136. package/dist/verification/index.js +224 -0
  137. package/dist/verification/index.js.map +1 -0
  138. package/package.json +41 -0
@@ -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.initCommand = initCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const readline = __importStar(require("readline"));
42
+ const config_1 = require("../config");
43
+ const installer_1 = require("../tools/installer");
44
+ function prompt(question) {
45
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
46
+ return new Promise((resolve) => {
47
+ rl.question(question, (answer) => {
48
+ rl.close();
49
+ resolve(answer.trim());
50
+ });
51
+ });
52
+ }
53
+ async function initCommand(options) {
54
+ console.log(chalk_1.default.blue.bold('\n🚀 Funolio Agent Setup\n'));
55
+ // Step 1: API key entry
56
+ const config = (0, config_1.loadConfig)();
57
+ let token = config.auth?.token;
58
+ if (token) {
59
+ console.log(chalk_1.default.gray(` Found existing API key for ${config.auth?.username || 'unknown user'}`));
60
+ const reuse = await prompt(' Use existing credentials? (Y/n): ');
61
+ if (reuse.toLowerCase() === 'n') {
62
+ token = undefined;
63
+ }
64
+ }
65
+ if (!token) {
66
+ console.log(chalk_1.default.white(' Paste your API key from funolio.com/settings/api-keys:'));
67
+ token = await prompt(' API Key: ');
68
+ if (!token) {
69
+ console.error(chalk_1.default.red('\n✗ No API key provided. Get one at funolio.com/settings/api-keys'));
70
+ process.exit(1);
71
+ }
72
+ }
73
+ // Step 2: Server connection test
74
+ console.log(chalk_1.default.blue('\n Connecting to Funolio...'));
75
+ try {
76
+ const verifyRes = await fetch(`${config_1.FUNOLIO_API_URL}/api/v1/agent/auth/verify`, {
77
+ method: 'POST',
78
+ headers: {
79
+ 'Content-Type': 'application/json',
80
+ Authorization: `Bearer ${token}`,
81
+ },
82
+ });
83
+ if (!verifyRes.ok) {
84
+ const status = verifyRes.status;
85
+ if (status === 401 || status === 403) {
86
+ console.error(chalk_1.default.red(' ✗ Invalid or expired API key.'));
87
+ }
88
+ else {
89
+ console.error(chalk_1.default.red(` ✗ Server returned ${status}: ${verifyRes.statusText}`));
90
+ }
91
+ process.exit(1);
92
+ }
93
+ const authData = await verifyRes.json();
94
+ config.auth = {
95
+ token,
96
+ userId: authData.userId,
97
+ username: authData.username,
98
+ mqttJwt: authData.mqttJwt,
99
+ mqttJwtExpiresAt: authData.mqttJwtExpiresAt,
100
+ expiresAt: authData.expiresAt,
101
+ };
102
+ (0, config_1.saveConfig)(config);
103
+ console.log(chalk_1.default.green(` ✓ Authenticated as ${authData.username}`));
104
+ }
105
+ catch (error) {
106
+ console.error(chalk_1.default.red(` ✗ Could not reach Funolio server: ${error.message}`));
107
+ console.error(chalk_1.default.gray(' Check your internet connection and try again.'));
108
+ process.exit(1);
109
+ }
110
+ // Step 3: Health check
111
+ console.log(chalk_1.default.blue('\n Running health check...'));
112
+ try {
113
+ const healthRes = await fetch(`${config_1.FUNOLIO_API_URL}/api/v1/health`);
114
+ if (healthRes.ok) {
115
+ console.log(chalk_1.default.green(' ✓ Server is healthy'));
116
+ }
117
+ else {
118
+ console.log(chalk_1.default.yellow(' ⚠ Server returned non-OK status (continuing anyway)'));
119
+ }
120
+ }
121
+ catch {
122
+ console.log(chalk_1.default.yellow(' ⚠ Health endpoint unreachable (continuing anyway)'));
123
+ }
124
+ // Step 4: Pull tool selections and auto-install
125
+ console.log(chalk_1.default.blue('\n Checking your tool selections...'));
126
+ const intents = await (0, installer_1.fetchToolSelections)(token);
127
+ const lite = options.lite || false;
128
+ if (intents.length === 0) {
129
+ console.log(chalk_1.default.gray(' No tool selections found (you can configure these at funolio.com/settings)'));
130
+ }
131
+ else {
132
+ console.log(chalk_1.default.white(` Found ${intents.length} tool selection(s): ${intents.join(', ')}`));
133
+ if (lite) {
134
+ console.log(chalk_1.default.yellow(' Lite mode: heavy tools (Playwright, Docker) will be skipped'));
135
+ }
136
+ console.log('');
137
+ (0, installer_1.installTools)(intents, lite);
138
+ }
139
+ // Step 5: Generate MCP config
140
+ if (intents.length > 0) {
141
+ console.log(chalk_1.default.blue('\n Generating MCP configuration...'));
142
+ (0, installer_1.generateMcpConfig)(intents, lite);
143
+ }
144
+ // Done
145
+ console.log(chalk_1.default.green.bold('\n✅ Setup complete!\n'));
146
+ console.log(chalk_1.default.white(' Next steps:'));
147
+ console.log(chalk_1.default.gray(' 1. Configure your LLM: funolio-agent configure'));
148
+ console.log(chalk_1.default.gray(' 2. Start your bot: funolio-agent start'));
149
+ console.log('');
150
+ }
151
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface LoginOptions {
2
+ token?: string;
3
+ }
4
+ export declare function loginCommand(options: LoginOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAWA,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE"}
@@ -0,0 +1,170 @@
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.loginCommand = loginCommand;
40
+ const http = __importStar(require("http"));
41
+ const crypto = __importStar(require("crypto"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const child_process_1 = require("child_process");
44
+ function openUrl(url) {
45
+ const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
46
+ (0, child_process_1.exec)(`${cmd} "${url}"`, () => { });
47
+ }
48
+ const config_1 = require("../config");
49
+ async function loginCommand(options) {
50
+ if (options.token) {
51
+ await loginWithToken(options.token);
52
+ return;
53
+ }
54
+ await loginWithBrowser();
55
+ }
56
+ async function loginWithToken(token) {
57
+ console.log(chalk_1.default.blue('Authenticating with token...'));
58
+ try {
59
+ const response = await fetch(`${config_1.FUNOLIO_API_URL}/api/v1/agent/auth/verify`, {
60
+ method: 'POST',
61
+ headers: {
62
+ 'Content-Type': 'application/json',
63
+ 'Authorization': `Bearer ${token}`,
64
+ },
65
+ });
66
+ if (!response.ok) {
67
+ throw new Error(`Authentication failed: ${response.status} ${response.statusText}`);
68
+ }
69
+ const data = await response.json();
70
+ const config = (0, config_1.loadConfig)();
71
+ config.auth = {
72
+ token,
73
+ userId: data.userId,
74
+ username: data.username,
75
+ mqttJwt: data.mqttJwt,
76
+ mqttJwtExpiresAt: data.mqttJwtExpiresAt,
77
+ expiresAt: data.expiresAt,
78
+ };
79
+ (0, config_1.saveConfig)(config);
80
+ console.log(chalk_1.default.green(`✓ Logged in as ${data.username}`));
81
+ }
82
+ catch (error) {
83
+ console.error(chalk_1.default.red(`✗ Login failed: ${error.message}`));
84
+ process.exit(1);
85
+ }
86
+ }
87
+ async function loginWithBrowser() {
88
+ const state = crypto.randomBytes(16).toString('hex');
89
+ const port = await findFreePort();
90
+ return new Promise((resolve, reject) => {
91
+ const server = http.createServer(async (req, res) => {
92
+ const url = new URL(req.url || '/', `http://localhost:${port}`);
93
+ if (url.pathname === '/callback') {
94
+ const code = url.searchParams.get('code');
95
+ const returnedState = url.searchParams.get('state');
96
+ if (returnedState !== state) {
97
+ res.writeHead(400, { 'Content-Type': 'text/html' });
98
+ res.end('<h1>Invalid state parameter</h1>');
99
+ server.close();
100
+ reject(new Error('Invalid state'));
101
+ return;
102
+ }
103
+ try {
104
+ const tokenResponse = await fetch(`${config_1.FUNOLIO_API_URL}/api/v1/agent/auth/token`, {
105
+ method: 'POST',
106
+ headers: { 'Content-Type': 'application/json' },
107
+ body: JSON.stringify({ code, redirectUri: `http://localhost:${port}/callback` }),
108
+ });
109
+ if (!tokenResponse.ok) {
110
+ throw new Error(`Token exchange failed: ${tokenResponse.status}`);
111
+ }
112
+ const data = await tokenResponse.json();
113
+ const config = (0, config_1.loadConfig)();
114
+ config.auth = {
115
+ token: data.token,
116
+ userId: data.userId,
117
+ username: data.username,
118
+ mqttJwt: data.mqttJwt,
119
+ mqttJwtExpiresAt: data.mqttJwtExpiresAt,
120
+ expiresAt: data.expiresAt,
121
+ };
122
+ (0, config_1.saveConfig)(config);
123
+ res.writeHead(200, { 'Content-Type': 'text/html' });
124
+ res.end(`
125
+ <html><body style="font-family:system-ui;text-align:center;padding:60px">
126
+ <h1>✓ Logged in as ${data.username}</h1>
127
+ <p>You can close this window and return to the terminal.</p>
128
+ </body></html>
129
+ `);
130
+ console.log(chalk_1.default.green(`✓ Logged in as ${data.username}`));
131
+ server.close();
132
+ resolve();
133
+ }
134
+ catch (error) {
135
+ res.writeHead(500, { 'Content-Type': 'text/html' });
136
+ res.end('<h1>Authentication failed</h1>');
137
+ server.close();
138
+ reject(error);
139
+ }
140
+ }
141
+ });
142
+ server.listen(port, () => {
143
+ const authUrl = `${config_1.FUNOLIO_API_URL}/auth/agent?state=${state}&redirect_uri=http://localhost:${port}/callback`;
144
+ console.log(chalk_1.default.blue('Opening browser for authentication...'));
145
+ console.log(chalk_1.default.gray(`If browser doesn't open, visit: ${authUrl}`));
146
+ openUrl(authUrl);
147
+ });
148
+ // Timeout after 5 minutes
149
+ setTimeout(() => {
150
+ server.close();
151
+ reject(new Error('Login timed out'));
152
+ }, 5 * 60 * 1000);
153
+ });
154
+ }
155
+ function findFreePort() {
156
+ return new Promise((resolve, reject) => {
157
+ const server = http.createServer();
158
+ server.listen(0, () => {
159
+ const addr = server.address();
160
+ if (addr && typeof addr === 'object') {
161
+ const port = addr.port;
162
+ server.close(() => resolve(port));
163
+ }
164
+ else {
165
+ server.close(() => reject(new Error('Failed to find free port')));
166
+ }
167
+ });
168
+ });
169
+ }
170
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface StartOptions {
2
+ provider?: string;
3
+ model?: string;
4
+ apiKey?: string;
5
+ }
6
+ export declare function startCommand(projectDir: string, options: StartOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAOA,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4H3F"}
@@ -0,0 +1,179 @@
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.startCommand = startCommand;
40
+ const path = __importStar(require("path"));
41
+ const fs = __importStar(require("fs"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const config_1 = require("../config");
44
+ const mqtt_client_1 = require("../mqtt-client");
45
+ const message_loop_1 = require("../message-loop");
46
+ async function startCommand(projectDir, options) {
47
+ const config = (0, config_1.migrateConfig)((0, config_1.loadConfig)());
48
+ // Validate auth
49
+ if (!config.auth) {
50
+ console.error(chalk_1.default.red('✗ Not logged in. Run `funolio-agent login` first.'));
51
+ process.exit(1);
52
+ }
53
+ if (config.auth.expiresAt < Date.now()) {
54
+ console.error(chalk_1.default.red('✗ Token expired. Run `funolio-agent login` to re-authenticate.'));
55
+ process.exit(1);
56
+ }
57
+ // Resolve project directory
58
+ const resolvedDir = path.resolve(projectDir);
59
+ if (!fs.existsSync(resolvedDir)) {
60
+ console.error(chalk_1.default.red(`✗ Directory not found: ${resolvedDir}`));
61
+ process.exit(1);
62
+ }
63
+ // List configured providers
64
+ if (config.providers && config.providers.length > 0) {
65
+ console.log(chalk_1.default.blue('Configured providers:'));
66
+ for (const p of config.providers) {
67
+ const isDefault = p.id === config.defaultProvider ? chalk_1.default.green(' (default)') : '';
68
+ const label = p.label ? ` — ${p.label}` : '';
69
+ console.log(chalk_1.default.gray(` • ${p.id} / ${p.defaultModel}${label}${isDefault}`));
70
+ }
71
+ console.log('');
72
+ }
73
+ // Resolve active provider
74
+ const activeProvider = (0, config_1.getProvider)(config, options.provider);
75
+ // Determine provider/model/apiKey from either providers[] or CLI flags/env
76
+ let provider;
77
+ let model;
78
+ let apiKey;
79
+ if (activeProvider) {
80
+ provider = activeProvider.id;
81
+ model = options.model || activeProvider.defaultModel;
82
+ apiKey = options.apiKey || activeProvider.apiKey || getEnvApiKey(provider);
83
+ }
84
+ else {
85
+ // Fallback to CLI args / env detection (no providers configured)
86
+ provider = options.provider || detectProvider();
87
+ model = options.model || defaultModel(provider);
88
+ apiKey = options.apiKey || getEnvApiKey(provider);
89
+ }
90
+ if (!apiKey) {
91
+ console.error(chalk_1.default.red(`✗ No API key found for ${provider}.`));
92
+ console.error(chalk_1.default.gray(' Set via --api-key, `funolio-agent configure`, or environment variable'));
93
+ console.error(chalk_1.default.gray(' (ANTHROPIC_API_KEY, OPENAI_API_KEY, GOOGLE_API_KEY)'));
94
+ process.exit(1);
95
+ }
96
+ console.log(chalk_1.default.blue('Funolio Agent'));
97
+ console.log(chalk_1.default.gray(` User: ${config.auth.username}`));
98
+ console.log(chalk_1.default.gray(` Project: ${resolvedDir}`));
99
+ console.log(chalk_1.default.gray(` Provider: ${provider} / ${model}`));
100
+ console.log('');
101
+ const userId = config.auth.userId;
102
+ const mqttJwt = config.auth.mqttJwt;
103
+ const brokerUrl = config.broker?.url || config_1.MQTT_BROKER_URL;
104
+ // Create MQTT client
105
+ const mqttClient = new mqtt_client_1.AgentMqttClient({
106
+ brokerUrl,
107
+ userId,
108
+ mqttJwt,
109
+ heartbeatIntervalMs: config_1.HEARTBEAT_INTERVAL_MS,
110
+ });
111
+ // Create message loop
112
+ const messageLoop = new message_loop_1.MessageLoop({
113
+ provider,
114
+ model,
115
+ apiKey,
116
+ projectDir: resolvedDir,
117
+ userId,
118
+ mqttClient,
119
+ });
120
+ // Handle shutdown
121
+ const shutdown = async () => {
122
+ console.log(chalk_1.default.yellow('\nShutting down...'));
123
+ await mqttClient.disconnect();
124
+ process.exit(0);
125
+ };
126
+ process.on('SIGINT', shutdown);
127
+ process.on('SIGTERM', shutdown);
128
+ // Connect
129
+ try {
130
+ await mqttClient.connect();
131
+ console.log(chalk_1.default.green('✓ Connected to Funolio'));
132
+ // Publish available providers to MQTT so web UI can show provider picker
133
+ if (config.providers && config.providers.length > 0) {
134
+ mqttClient.publishProviders(config.providers.map((p) => ({
135
+ id: p.id,
136
+ model: p.defaultModel,
137
+ label: p.label,
138
+ })));
139
+ }
140
+ console.log('');
141
+ console.log(chalk_1.default.green.bold(' ✅ Your bot is online! Head back to funolio.com/chat to start chatting.'));
142
+ console.log(chalk_1.default.gray(' This terminal can stay open or run in background.\n'));
143
+ console.log(chalk_1.default.gray(' Waiting for commands...\n'));
144
+ // Start listening for commands
145
+ mqttClient.onCommand((message) => {
146
+ messageLoop.handleCommand(message);
147
+ });
148
+ }
149
+ catch (error) {
150
+ console.error(chalk_1.default.red(`✗ Connection failed: ${error.message}`));
151
+ process.exit(1);
152
+ }
153
+ }
154
+ function detectProvider() {
155
+ if (process.env.ANTHROPIC_API_KEY)
156
+ return 'anthropic';
157
+ if (process.env.OPENAI_API_KEY)
158
+ return 'openai';
159
+ if (process.env.GOOGLE_API_KEY)
160
+ return 'google';
161
+ return 'anthropic';
162
+ }
163
+ function defaultModel(provider) {
164
+ switch (provider) {
165
+ case 'anthropic': return 'claude-sonnet-4-20250514';
166
+ case 'openai': return 'gpt-4o';
167
+ case 'google': return 'gemini-2.0-flash';
168
+ default: return 'claude-sonnet-4-20250514';
169
+ }
170
+ }
171
+ function getEnvApiKey(provider) {
172
+ switch (provider) {
173
+ case 'anthropic': return process.env.ANTHROPIC_API_KEY;
174
+ case 'openai': return process.env.OPENAI_API_KEY;
175
+ case 'google': return process.env.GOOGLE_API_KEY;
176
+ default: return undefined;
177
+ }
178
+ }
179
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA2CnD"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.statusCommand = statusCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const config_1 = require("../config");
9
+ async function statusCommand() {
10
+ const config = (0, config_1.loadConfig)();
11
+ console.log(chalk_1.default.bold('\nFunolio Agent Status\n'));
12
+ // Auth status
13
+ if (config.auth) {
14
+ const expired = config.auth.expiresAt < Date.now();
15
+ if (expired) {
16
+ console.log(chalk_1.default.yellow(` Auth: Token expired (was ${config.auth.username})`));
17
+ console.log(chalk_1.default.gray(' Run `funolio-agent login` to re-authenticate'));
18
+ }
19
+ else {
20
+ console.log(chalk_1.default.green(` Auth: Logged in as ${config.auth.username}`));
21
+ console.log(chalk_1.default.gray(` User ID: ${config.auth.userId}`));
22
+ const expiresIn = Math.round((config.auth.expiresAt - Date.now()) / 1000 / 60 / 60);
23
+ console.log(chalk_1.default.gray(` Token expires in ${expiresIn}h`));
24
+ }
25
+ }
26
+ else {
27
+ console.log(chalk_1.default.red(' Auth: Not logged in'));
28
+ console.log(chalk_1.default.gray(' Run `funolio-agent login` to authenticate'));
29
+ }
30
+ // LLM config
31
+ if (config.llm) {
32
+ console.log(chalk_1.default.green(` LLM: ${config.llm.provider} / ${config.llm.model}`));
33
+ console.log(chalk_1.default.gray(` Key: ${config.llm.apiKey.slice(0, 8)}...`));
34
+ }
35
+ else {
36
+ const envKeys = [];
37
+ if (process.env.ANTHROPIC_API_KEY)
38
+ envKeys.push('anthropic');
39
+ if (process.env.OPENAI_API_KEY)
40
+ envKeys.push('openai');
41
+ if (process.env.GOOGLE_API_KEY)
42
+ envKeys.push('google');
43
+ if (envKeys.length > 0) {
44
+ console.log(chalk_1.default.green(` LLM: Keys found in env: ${envKeys.join(', ')}`));
45
+ }
46
+ else {
47
+ console.log(chalk_1.default.yellow(' LLM: No API keys configured'));
48
+ console.log(chalk_1.default.gray(' Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GOOGLE_API_KEY'));
49
+ }
50
+ }
51
+ // Config file
52
+ console.log(chalk_1.default.gray(`\n Config: ${(0, config_1.getConfigPath)()}`));
53
+ console.log('');
54
+ }
55
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}