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
package/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # funolio-agent
2
+
3
+ The official CLI for [Funolio](https://funolio.com) — run AI agent tasks locally using your own API keys.
4
+
5
+ Funolio Agent connects your machine to the Funolio platform, letting you execute AI-powered tasks with full control over your data, models, and tools.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm i -g funolio-agent
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```bash
16
+ # 1. Initialize — set up API key and test connection
17
+ funolio-agent init
18
+
19
+ # 2. Configure your LLM provider (OpenAI, Anthropic, etc.)
20
+ funolio-agent configure
21
+
22
+ # 3. Start the agent
23
+ funolio-agent start
24
+ ```
25
+
26
+ ## Commands
27
+
28
+ | Command | Description |
29
+ |---------|-------------|
30
+ | `funolio-agent init` | Set up the agent: API key, connection test, tool installation |
31
+ | `funolio-agent login` | Authenticate with funolio.com |
32
+ | `funolio-agent configure` | Configure LLM providers (API keys, models) |
33
+ | `funolio-agent start` | Start the agent and connect to Funolio |
34
+ | `funolio-agent status` | Show agent and connection status |
35
+
36
+ ### Options
37
+
38
+ - `init --lite` — Skip heavy tools (Playwright, Docker) for constrained environments
39
+ - `login --token <token>` — Use an API token directly instead of browser login
40
+ - `start <project-dir>` — Start in a specific project directory
41
+
42
+ ## Requirements
43
+
44
+ - **Node.js 18+**
45
+ - A [Funolio](https://funolio.com) account
46
+
47
+ ## Links
48
+
49
+ - [Funolio Platform](https://funolio.com)
50
+ - [GitHub](https://github.com/mpalmi3/Funolio)
51
+ - [Report Issues](https://github.com/mpalmi3/Funolio/issues)
52
+
53
+ ## License
54
+
55
+ MIT
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Phase 3F: Agent-Side Clerk (Memory Extraction)
3
+ *
4
+ * After each completed agentic loop:
5
+ * 1. Package conversation + tool results + file diffs
6
+ * 2. POST to Funolio /api/v1/bot/extract endpoint
7
+ * 3. Funolio server processes with GPT-4o-mini
8
+ * 4. Extracted facts/decisions stored in Funolio
9
+ *
10
+ * All extraction is async and non-blocking.
11
+ */
12
+ import { AgentConversationTurn, FileDiff, CommandLog, ToolResult } from '../types';
13
+ export interface ClerkConfig {
14
+ /** Funolio API base URL */
15
+ apiBaseUrl: string;
16
+ /** Funolio API key for authentication */
17
+ apiKey: string;
18
+ /** Project identifier */
19
+ projectId?: string;
20
+ /** Whether clerk is enabled (default: true) */
21
+ enabled?: boolean;
22
+ /** Callback for errors (non-blocking, so we log rather than throw) */
23
+ onError?: (error: Error) => void;
24
+ }
25
+ /**
26
+ * The Clerk collects data during an agentic loop and sends it for extraction.
27
+ */
28
+ export declare class AgentClerk {
29
+ private config;
30
+ private turns;
31
+ private fileDiffs;
32
+ private commandLogs;
33
+ private gitChanges;
34
+ constructor(config: ClerkConfig);
35
+ /**
36
+ * Record a conversation turn.
37
+ */
38
+ addTurn(turn: AgentConversationTurn): void;
39
+ /**
40
+ * Record a file diff from an edit/write operation.
41
+ */
42
+ addFileDiff(diff: FileDiff): void;
43
+ /**
44
+ * Record a command execution log.
45
+ */
46
+ addCommandLog(log: CommandLog): void;
47
+ /**
48
+ * Record a git change summary.
49
+ */
50
+ addGitChange(change: string): void;
51
+ /**
52
+ * Convenience: record a tool result, automatically categorizing it.
53
+ */
54
+ recordToolResult(result: ToolResult, args: Record<string, unknown>): void;
55
+ /**
56
+ * Send collected data to the extraction API.
57
+ * Non-blocking: fires and forgets. Errors are logged, not thrown.
58
+ */
59
+ flush(taskId?: string): Promise<void>;
60
+ private sendExtraction;
61
+ }
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clerk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAgB,qBAAqB,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEjG,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,UAAU,CAAgB;gBAEtB,MAAM,EAAE,WAAW;IAI/B;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAI1C;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAIjC;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAIpC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA0BzE;;;OAGG;IACG,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YA2B7B,cAAc;CA8B7B"}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 3F: Agent-Side Clerk (Memory Extraction)
4
+ *
5
+ * After each completed agentic loop:
6
+ * 1. Package conversation + tool results + file diffs
7
+ * 2. POST to Funolio /api/v1/bot/extract endpoint
8
+ * 3. Funolio server processes with GPT-4o-mini
9
+ * 4. Extracted facts/decisions stored in Funolio
10
+ *
11
+ * All extraction is async and non-blocking.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.AgentClerk = void 0;
15
+ /**
16
+ * The Clerk collects data during an agentic loop and sends it for extraction.
17
+ */
18
+ class AgentClerk {
19
+ config;
20
+ turns = [];
21
+ fileDiffs = [];
22
+ commandLogs = [];
23
+ gitChanges = [];
24
+ constructor(config) {
25
+ this.config = config;
26
+ }
27
+ /**
28
+ * Record a conversation turn.
29
+ */
30
+ addTurn(turn) {
31
+ this.turns.push(turn);
32
+ }
33
+ /**
34
+ * Record a file diff from an edit/write operation.
35
+ */
36
+ addFileDiff(diff) {
37
+ this.fileDiffs.push(diff);
38
+ }
39
+ /**
40
+ * Record a command execution log.
41
+ */
42
+ addCommandLog(log) {
43
+ this.commandLogs.push(log);
44
+ }
45
+ /**
46
+ * Record a git change summary.
47
+ */
48
+ addGitChange(change) {
49
+ this.gitChanges.push(change);
50
+ }
51
+ /**
52
+ * Convenience: record a tool result, automatically categorizing it.
53
+ */
54
+ recordToolResult(result, args) {
55
+ // Record file diffs
56
+ if (result.diff && (result.name === 'edit_file' || result.name === 'write_file')) {
57
+ this.addFileDiff({
58
+ path: args.path,
59
+ diff: result.diff,
60
+ });
61
+ }
62
+ // Record command logs
63
+ if (result.name === 'run_command') {
64
+ this.addCommandLog({
65
+ command: args.command,
66
+ exit_code: result.exit_code ?? -1,
67
+ stdout: result.output,
68
+ stderr: result.stderr || '',
69
+ duration_ms: 0, // Could be extracted from output if needed
70
+ });
71
+ }
72
+ // Record git changes
73
+ if (result.name === 'git_commit' && result.success) {
74
+ this.addGitChange(result.output);
75
+ }
76
+ }
77
+ /**
78
+ * Send collected data to the extraction API.
79
+ * Non-blocking: fires and forgets. Errors are logged, not thrown.
80
+ */
81
+ async flush(taskId) {
82
+ if (this.config.enabled === false)
83
+ return;
84
+ if (this.turns.length === 0)
85
+ return;
86
+ const payload = {
87
+ conversation: [...this.turns],
88
+ file_diffs: [...this.fileDiffs],
89
+ commands_executed: [...this.commandLogs],
90
+ git_changes: [...this.gitChanges],
91
+ task_id: taskId,
92
+ project_id: this.config.projectId,
93
+ };
94
+ // Clear state immediately (don't wait for request)
95
+ this.turns = [];
96
+ this.fileDiffs = [];
97
+ this.commandLogs = [];
98
+ this.gitChanges = [];
99
+ // Fire and forget
100
+ this.sendExtraction(payload).catch((err) => {
101
+ if (this.config.onError) {
102
+ this.config.onError(err instanceof Error ? err : new Error(String(err)));
103
+ }
104
+ });
105
+ }
106
+ async sendExtraction(payload) {
107
+ const url = `${this.config.apiBaseUrl}/api/v1/bot/extract`;
108
+ // Format conversation for extraction
109
+ const formattedContent = formatForExtraction(payload);
110
+ const response = await fetch(url, {
111
+ method: 'POST',
112
+ headers: {
113
+ 'Content-Type': 'application/json',
114
+ 'Authorization': `Bearer ${this.config.apiKey}`,
115
+ },
116
+ body: JSON.stringify({
117
+ content: formattedContent,
118
+ source: 'funolio-agent',
119
+ project_id: payload.project_id,
120
+ task_id: payload.task_id,
121
+ metadata: {
122
+ file_diffs_count: payload.file_diffs.length,
123
+ commands_count: payload.commands_executed.length,
124
+ git_changes_count: payload.git_changes.length,
125
+ },
126
+ }),
127
+ signal: AbortSignal.timeout(30000), // 30s timeout for extraction
128
+ });
129
+ if (!response.ok) {
130
+ throw new Error(`Extraction API returned ${response.status}: ${await response.text()}`);
131
+ }
132
+ }
133
+ }
134
+ exports.AgentClerk = AgentClerk;
135
+ /**
136
+ * Format the clerk payload into a readable string for the extraction LLM.
137
+ */
138
+ function formatForExtraction(payload) {
139
+ const parts = [];
140
+ // Conversation
141
+ parts.push('## Conversation');
142
+ for (const turn of payload.conversation) {
143
+ parts.push(`### ${turn.role}`);
144
+ parts.push(turn.content);
145
+ if (turn.tool_calls) {
146
+ for (const tc of turn.tool_calls) {
147
+ parts.push(`[Tool Call: ${tc.name}(${JSON.stringify(tc.arguments)})]`);
148
+ }
149
+ }
150
+ if (turn.tool_results) {
151
+ for (const tr of turn.tool_results) {
152
+ parts.push(`[Tool Result: ${tr.name} - ${tr.success ? 'success' : 'failed'}]`);
153
+ if (tr.output)
154
+ parts.push(tr.output.slice(0, 2000));
155
+ if (tr.error)
156
+ parts.push(`Error: ${tr.error}`);
157
+ }
158
+ }
159
+ }
160
+ // File diffs
161
+ if (payload.file_diffs.length > 0) {
162
+ parts.push('\n## File Changes');
163
+ for (const diff of payload.file_diffs) {
164
+ parts.push(`### ${diff.path}`);
165
+ parts.push(diff.diff.slice(0, 3000));
166
+ }
167
+ }
168
+ // Commands
169
+ if (payload.commands_executed.length > 0) {
170
+ parts.push('\n## Commands Executed');
171
+ for (const cmd of payload.commands_executed) {
172
+ parts.push(`$ ${cmd.command} → exit ${cmd.exit_code}`);
173
+ if (cmd.stderr)
174
+ parts.push(`stderr: ${cmd.stderr.slice(0, 500)}`);
175
+ }
176
+ }
177
+ // Git changes
178
+ if (payload.git_changes.length > 0) {
179
+ parts.push('\n## Git Changes');
180
+ for (const change of payload.git_changes) {
181
+ parts.push(change.slice(0, 1000));
182
+ }
183
+ }
184
+ return parts.join('\n');
185
+ }
186
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clerk/index.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const login_1 = require("./commands/login");
6
+ const init_1 = require("./commands/init");
7
+ const start_1 = require("./commands/start");
8
+ const status_1 = require("./commands/status");
9
+ const configure_1 = require("./commands/configure");
10
+ const program = new commander_1.Command();
11
+ program
12
+ .name('funolio-agent')
13
+ .description('Funolio AI agent - run AI tasks locally with your own API keys')
14
+ .version('0.1.0');
15
+ program
16
+ .command('init')
17
+ .description('Set up the agent: API key, connection test, tool installation')
18
+ .option('--lite', 'Skip heavy tools (Playwright, Docker) for constrained environments')
19
+ .action(init_1.initCommand);
20
+ program
21
+ .command('login')
22
+ .description('Authenticate with funolio.com')
23
+ .option('--token <token>', 'Use an API token directly instead of browser login')
24
+ .action(login_1.loginCommand);
25
+ program
26
+ .command('start')
27
+ .description('Start the agent and connect to Funolio')
28
+ .argument('[project-dir]', 'Project directory to work in', '.')
29
+ .option('--provider <provider>', 'LLM provider (anthropic, openai, google)')
30
+ .option('--model <model>', 'LLM model to use')
31
+ .option('--api-key <key>', 'LLM API key (or set via env: ANTHROPIC_API_KEY, OPENAI_API_KEY, GOOGLE_API_KEY)')
32
+ .action(start_1.startCommand);
33
+ program
34
+ .command('configure')
35
+ .description('Configure LLM providers (API keys, models)')
36
+ .action(configure_1.configureCommand);
37
+ program
38
+ .command('status')
39
+ .description('Show agent and connection status')
40
+ .action(status_1.statusCommand);
41
+ program.parse();
42
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,4CAAgD;AAChD,0CAA8C;AAC9C,4CAAgD;AAChD,8CAAkD;AAClD,oDAAwD;AAExD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,QAAQ,EAAE,oEAAoE,CAAC;KACtF,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,iBAAiB,EAAE,oDAAoD,CAAC;KAC/E,MAAM,CAAC,oBAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,QAAQ,CAAC,eAAe,EAAE,8BAA8B,EAAE,GAAG,CAAC;KAC9D,MAAM,CAAC,uBAAuB,EAAE,0CAA0C,CAAC;KAC3E,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;KAC7C,MAAM,CAAC,iBAAiB,EAAE,iFAAiF,CAAC;KAC5G,MAAM,CAAC,oBAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,4BAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,sBAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function configureCommand(): Promise<void>;
2
+ //# sourceMappingURL=configure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"AAqJA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8EtD"}
@@ -0,0 +1,252 @@
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.configureCommand = configureCommand;
40
+ const readline = __importStar(require("readline"));
41
+ const https = __importStar(require("https"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const config_1 = require("../config");
44
+ function createRl() {
45
+ return readline.createInterface({ input: process.stdin, output: process.stdout });
46
+ }
47
+ function ask(rl, question) {
48
+ return new Promise((resolve) => rl.question(question, (answer) => resolve(answer.trim())));
49
+ }
50
+ function askChoice(rl, question, choices) {
51
+ return new Promise((resolve) => {
52
+ const choiceList = choices.map((c, i) => ` ${i + 1}) ${c}`).join('\n');
53
+ rl.question(`${question}\n${choiceList}\n> `, (answer) => {
54
+ const idx = parseInt(answer.trim(), 10) - 1;
55
+ if (idx >= 0 && idx < choices.length) {
56
+ resolve(choices[idx]);
57
+ }
58
+ else if (choices.includes(answer.trim())) {
59
+ resolve(answer.trim());
60
+ }
61
+ else {
62
+ resolve(choices[0]);
63
+ }
64
+ });
65
+ });
66
+ }
67
+ async function validateFunolioToken(token) {
68
+ return new Promise((resolve) => {
69
+ const url = new URL('/api/v1/identity/me', config_1.FUNOLIO_API_URL);
70
+ const req = https.get(url, { headers: { Authorization: `Bearer ${token}` } }, (res) => {
71
+ resolve(res.statusCode === 200);
72
+ res.resume();
73
+ });
74
+ req.on('error', () => resolve(false));
75
+ req.setTimeout(5000, () => { req.destroy(); resolve(false); });
76
+ });
77
+ }
78
+ async function validateApiKey(providerId, apiKey) {
79
+ return new Promise((resolve) => {
80
+ let options;
81
+ switch (providerId) {
82
+ case 'anthropic':
83
+ options = {
84
+ hostname: 'api.anthropic.com',
85
+ path: '/v1/models',
86
+ headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },
87
+ };
88
+ break;
89
+ case 'openai':
90
+ options = {
91
+ hostname: 'api.openai.com',
92
+ path: '/v1/models?limit=1',
93
+ headers: { Authorization: `Bearer ${apiKey}` },
94
+ };
95
+ break;
96
+ case 'google':
97
+ options = {
98
+ hostname: 'generativelanguage.googleapis.com',
99
+ path: `/v1/models?key=${apiKey}&pageSize=1`,
100
+ headers: {},
101
+ };
102
+ break;
103
+ default:
104
+ // Can't validate unknown providers
105
+ resolve(true);
106
+ return;
107
+ }
108
+ const req = https.get({ ...options, port: 443 }, (res) => {
109
+ resolve(res.statusCode === 200);
110
+ res.resume();
111
+ });
112
+ req.on('error', () => resolve(false));
113
+ req.setTimeout(10000, () => { req.destroy(); resolve(false); });
114
+ });
115
+ }
116
+ async function addProvider(rl) {
117
+ const knownProviders = ['anthropic', 'openai', 'google', 'other'];
118
+ const providerChoice = await askChoice(rl, chalk_1.default.cyan('\nSelect provider:'), knownProviders);
119
+ let providerId;
120
+ if (providerChoice === 'other') {
121
+ providerId = await ask(rl, chalk_1.default.cyan('Enter provider ID: '));
122
+ if (!providerId)
123
+ return null;
124
+ }
125
+ else {
126
+ providerId = providerChoice;
127
+ }
128
+ const authChoice = await askChoice(rl, chalk_1.default.cyan('Authentication type:'), ['apiKey', 'oauth']);
129
+ let apiKey;
130
+ let oauthToken;
131
+ let oauthRefreshToken;
132
+ if (authChoice === 'apiKey') {
133
+ apiKey = await ask(rl, chalk_1.default.cyan(`Enter API key for ${providerId}: `));
134
+ if (!apiKey) {
135
+ console.log(chalk_1.default.red(' API key is required.'));
136
+ return null;
137
+ }
138
+ console.log(chalk_1.default.gray(' Validating API key...'));
139
+ const valid = await validateApiKey(providerId, apiKey);
140
+ if (!valid) {
141
+ console.log(chalk_1.default.red(' āœ— API key validation failed. Add anyway? (y/N)'));
142
+ const force = await ask(rl, '> ');
143
+ if (force.toLowerCase() !== 'y')
144
+ return null;
145
+ }
146
+ else {
147
+ console.log(chalk_1.default.green(' āœ“ API key validated'));
148
+ }
149
+ }
150
+ else {
151
+ oauthToken = await ask(rl, chalk_1.default.cyan('Enter OAuth token (or leave blank to set up later): '));
152
+ if (oauthToken) {
153
+ oauthRefreshToken = await ask(rl, chalk_1.default.cyan('Enter OAuth refresh token (optional): '));
154
+ }
155
+ }
156
+ const defaultModel = config_1.DEFAULT_MODELS[providerId] || '';
157
+ const modelInput = await ask(rl, chalk_1.default.cyan(`Default model [${defaultModel}]: `));
158
+ const model = modelInput || defaultModel;
159
+ if (!model) {
160
+ console.log(chalk_1.default.red(' Model is required.'));
161
+ return null;
162
+ }
163
+ const label = await ask(rl, chalk_1.default.cyan('Label (optional, e.g. "My Claude"): '));
164
+ const provider = {
165
+ id: providerId,
166
+ authType: authChoice,
167
+ defaultModel: model,
168
+ };
169
+ if (apiKey)
170
+ provider.apiKey = apiKey;
171
+ if (oauthToken)
172
+ provider.oauthToken = oauthToken;
173
+ if (oauthRefreshToken)
174
+ provider.oauthRefreshToken = oauthRefreshToken;
175
+ if (label)
176
+ provider.label = label;
177
+ return provider;
178
+ }
179
+ async function configureCommand() {
180
+ const rl = createRl();
181
+ let config = (0, config_1.migrateConfig)((0, config_1.loadConfig)());
182
+ console.log(chalk_1.default.blue('\nšŸ”§ Funolio Agent Configuration\n'));
183
+ // Step 1: Funolio auth
184
+ if (!config.auth?.token) {
185
+ console.log(chalk_1.default.yellow('No Funolio authentication found.'));
186
+ console.log(chalk_1.default.gray('Run `funolio-agent login` to authenticate first.\n'));
187
+ }
188
+ else {
189
+ console.log(chalk_1.default.green(`āœ“ Logged in as ${config.auth.username}\n`));
190
+ }
191
+ // Step 2: Show existing providers
192
+ if (config.providers && config.providers.length > 0) {
193
+ console.log(chalk_1.default.blue('Current providers:'));
194
+ for (const p of config.providers) {
195
+ const isDefault = p.id === config.defaultProvider ? chalk_1.default.green(' (default)') : '';
196
+ const label = p.label ? ` — ${p.label}` : '';
197
+ console.log(chalk_1.default.gray(` • ${p.id} / ${p.defaultModel}${label}${isDefault}`));
198
+ }
199
+ const action = await askChoice(rl, chalk_1.default.cyan('\nWhat would you like to do?'), [
200
+ 'Add another provider',
201
+ 'Replace all providers',
202
+ 'Keep existing and exit',
203
+ ]);
204
+ if (action === 'Keep existing and exit') {
205
+ rl.close();
206
+ return;
207
+ }
208
+ if (action === 'Replace all providers') {
209
+ config.providers = [];
210
+ config.defaultProvider = undefined;
211
+ }
212
+ }
213
+ else {
214
+ config.providers = [];
215
+ }
216
+ // Step 3: Add providers loop
217
+ let addMore = true;
218
+ while (addMore) {
219
+ const provider = await addProvider(rl);
220
+ if (provider) {
221
+ // Replace existing provider with same id, or add new
222
+ const existingIdx = config.providers.findIndex((p) => p.id === provider.id);
223
+ if (existingIdx >= 0) {
224
+ config.providers[existingIdx] = provider;
225
+ console.log(chalk_1.default.green(` āœ“ Updated provider: ${provider.id}`));
226
+ }
227
+ else {
228
+ config.providers.push(provider);
229
+ console.log(chalk_1.default.green(` āœ“ Added provider: ${provider.id}`));
230
+ }
231
+ }
232
+ const more = await ask(rl, chalk_1.default.cyan('\nAdd another provider? (y/N): '));
233
+ addMore = more.toLowerCase() === 'y';
234
+ }
235
+ // Step 4: Set default provider
236
+ if (config.providers.length > 0) {
237
+ if (config.providers.length === 1) {
238
+ config.defaultProvider = config.providers[0].id;
239
+ console.log(chalk_1.default.gray(`\nDefault provider: ${config.defaultProvider}`));
240
+ }
241
+ else {
242
+ const ids = config.providers.map((p) => p.id);
243
+ const defaultChoice = await askChoice(rl, chalk_1.default.cyan('\nSelect default provider:'), ids);
244
+ config.defaultProvider = defaultChoice;
245
+ }
246
+ }
247
+ // Save
248
+ (0, config_1.saveConfig)(config);
249
+ console.log(chalk_1.default.green('\nāœ“ Configuration saved to ~/.funolio/config.json\n'));
250
+ rl.close();
251
+ }
252
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface InitOptions {
2
+ lite?: boolean;
3
+ }
4
+ export declare function initCommand(options: InitOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAYD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+GrE"}