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,227 @@
1
+ "use strict";
2
+ /**
3
+ * Tool installer — pulls user's tool selections from the server
4
+ * and auto-installs matching CLI tools / packages.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.TOOL_REGISTRY = void 0;
44
+ exports.fetchToolSelections = fetchToolSelections;
45
+ exports.installTools = installTools;
46
+ exports.generateMcpConfig = generateMcpConfig;
47
+ const child_process_1 = require("child_process");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const os = __importStar(require("os"));
51
+ const chalk_1 = __importDefault(require("chalk"));
52
+ const config_1 = require("../config");
53
+ exports.TOOL_REGISTRY = [
54
+ {
55
+ intent: 'web_browsing',
56
+ displayName: 'Web Browsing',
57
+ heavy: true,
58
+ tools: [
59
+ {
60
+ name: 'playwright',
61
+ checkCmd: 'npx playwright --version',
62
+ installCmd: 'npm install -g playwright && npx playwright install chromium',
63
+ mcpConfig: {
64
+ command: 'npx',
65
+ args: ['@playwright/mcp@latest'],
66
+ },
67
+ },
68
+ ],
69
+ },
70
+ {
71
+ intent: 'github',
72
+ displayName: 'GitHub',
73
+ tools: [
74
+ {
75
+ name: 'gh',
76
+ checkCmd: 'gh --version',
77
+ installCmd: process.platform === 'linux'
78
+ ? 'type -p curl >/dev/null && (curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null && sudo apt update && sudo apt install gh -y) || echo "Please install gh CLI manually: https://cli.github.com"'
79
+ : process.platform === 'darwin'
80
+ ? 'brew install gh'
81
+ : 'echo "Please install gh CLI manually: https://cli.github.com"',
82
+ mcpConfig: {
83
+ command: 'gh',
84
+ args: ['copilot', 'mcp'],
85
+ },
86
+ },
87
+ ],
88
+ },
89
+ {
90
+ intent: 'data_processing',
91
+ displayName: 'Data Processing',
92
+ tools: [
93
+ {
94
+ name: 'jq',
95
+ checkCmd: 'jq --version',
96
+ installCmd: process.platform === 'linux'
97
+ ? 'sudo apt-get install -y jq'
98
+ : process.platform === 'darwin'
99
+ ? 'brew install jq'
100
+ : 'echo "Please install jq manually: https://jqlang.github.io/jq/"',
101
+ },
102
+ {
103
+ name: 'python3',
104
+ checkCmd: 'python3 --version',
105
+ installCmd: 'echo "Python3 not found. Please install from https://python.org"',
106
+ },
107
+ ],
108
+ },
109
+ {
110
+ intent: 'file_management',
111
+ displayName: 'File Management',
112
+ tools: [
113
+ {
114
+ name: 'ripgrep',
115
+ checkCmd: 'rg --version',
116
+ installCmd: process.platform === 'linux'
117
+ ? 'sudo apt-get install -y ripgrep'
118
+ : process.platform === 'darwin'
119
+ ? 'brew install ripgrep'
120
+ : 'echo "Please install ripgrep manually"',
121
+ },
122
+ ],
123
+ },
124
+ {
125
+ intent: 'docker',
126
+ displayName: 'Docker / Containers',
127
+ heavy: true,
128
+ tools: [
129
+ {
130
+ name: 'docker',
131
+ checkCmd: 'docker --version',
132
+ installCmd: 'echo "Docker not found. Please install from https://docs.docker.com/get-docker/"',
133
+ },
134
+ ],
135
+ },
136
+ ];
137
+ function isInstalled(checkCmd) {
138
+ try {
139
+ (0, child_process_1.execSync)(checkCmd, { stdio: 'pipe', timeout: 10_000 });
140
+ return true;
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ /**
147
+ * Fetch user's tool selections from the server.
148
+ */
149
+ async function fetchToolSelections(token) {
150
+ try {
151
+ const res = await fetch(`${config_1.FUNOLIO_API_URL}/api/v1/agent/tools/selections`, {
152
+ headers: { Authorization: `Bearer ${token}` },
153
+ });
154
+ if (!res.ok) {
155
+ // Server might not have this endpoint yet — return empty
156
+ return [];
157
+ }
158
+ const data = await res.json();
159
+ return data.intents || [];
160
+ }
161
+ catch {
162
+ return [];
163
+ }
164
+ }
165
+ /**
166
+ * Install tools for the given intents. Returns results per tool.
167
+ */
168
+ function installTools(intents, lite) {
169
+ const results = [];
170
+ for (const intent of intents) {
171
+ const mapping = exports.TOOL_REGISTRY.find((t) => t.intent === intent);
172
+ if (!mapping)
173
+ continue;
174
+ if (lite && mapping.heavy) {
175
+ for (const tool of mapping.tools) {
176
+ results.push({ tool: tool.name, status: 'skipped_lite' });
177
+ }
178
+ console.log(chalk_1.default.gray(` ⊘ ${mapping.displayName} — skipped (lite mode)`));
179
+ continue;
180
+ }
181
+ for (const tool of mapping.tools) {
182
+ if (isInstalled(tool.checkCmd)) {
183
+ results.push({ tool: tool.name, status: 'already_installed' });
184
+ console.log(chalk_1.default.gray(` ✓ ${tool.name} — already installed`));
185
+ continue;
186
+ }
187
+ console.log(chalk_1.default.blue(` ↓ Installing ${tool.name}...`));
188
+ try {
189
+ (0, child_process_1.execSync)(tool.installCmd, { stdio: 'pipe', timeout: 300_000 });
190
+ results.push({ tool: tool.name, status: 'installed' });
191
+ console.log(chalk_1.default.green(` ✓ ${tool.name} — installed`));
192
+ }
193
+ catch (err) {
194
+ results.push({ tool: tool.name, status: 'failed', error: err.message });
195
+ console.log(chalk_1.default.yellow(` ⚠ ${tool.name} — failed to install (non-critical)`));
196
+ }
197
+ }
198
+ }
199
+ return results;
200
+ }
201
+ /**
202
+ * Generate ~/.funolio/mcp.json based on installed tools.
203
+ */
204
+ function generateMcpConfig(intents, lite) {
205
+ const mcpServers = {};
206
+ for (const intent of intents) {
207
+ const mapping = exports.TOOL_REGISTRY.find((t) => t.intent === intent);
208
+ if (!mapping)
209
+ continue;
210
+ if (lite && mapping.heavy)
211
+ continue;
212
+ for (const tool of mapping.tools) {
213
+ if (tool.mcpConfig && isInstalled(tool.checkCmd)) {
214
+ mcpServers[tool.name] = tool.mcpConfig;
215
+ }
216
+ }
217
+ }
218
+ const configDir = path.join(os.homedir(), '.funolio');
219
+ if (!fs.existsSync(configDir)) {
220
+ fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
221
+ }
222
+ const mcpPath = path.join(configDir, 'mcp.json');
223
+ const mcpConfig = { mcpServers };
224
+ fs.writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2), { mode: 0o600 });
225
+ console.log(chalk_1.default.gray(` MCP config written to ${mcpPath}`));
226
+ }
227
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/tools/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from '../types';
2
+ export declare const listDirectoryTool: ToolDefinition;
3
+ //# sourceMappingURL=list-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-directory.d.ts","sourceRoot":"","sources":["../../src/tools/list-directory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAA2B,MAAM,UAAU,CAAC;AAGnE,eAAO,MAAM,iBAAiB,EAAE,cAyC/B,CAAC"}
@@ -0,0 +1,107 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.listDirectoryTool = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const sandbox_1 = require("./sandbox");
40
+ exports.listDirectoryTool = {
41
+ name: 'list_directory',
42
+ description: 'List files and directories at a given path within the project.',
43
+ parameters: {
44
+ type: 'object',
45
+ properties: {
46
+ path: { type: 'string', description: 'Directory path relative to project root (default: ".")' },
47
+ recursive: { type: 'boolean', description: 'List recursively (default: false, max depth 3)' },
48
+ },
49
+ required: [],
50
+ },
51
+ async execute(args, ctx) {
52
+ const dirPath = args.path || '.';
53
+ const recursive = args.recursive || false;
54
+ try {
55
+ const resolved = (0, sandbox_1.resolveSandboxed)(ctx.projectDir, dirPath);
56
+ const entries = await listDir(resolved, ctx.projectDir, recursive ? 3 : 1, 0);
57
+ return {
58
+ tool_call_id: '',
59
+ name: 'list_directory',
60
+ success: true,
61
+ output: entries.join('\n'),
62
+ verified: true,
63
+ verification_details: `Listed ${entries.length} entries in ${dirPath}`,
64
+ };
65
+ }
66
+ catch (err) {
67
+ const msg = err instanceof Error ? err.message : String(err);
68
+ return {
69
+ tool_call_id: '',
70
+ name: 'list_directory',
71
+ success: false,
72
+ output: '',
73
+ error: msg,
74
+ verified: true,
75
+ verification_details: `List failed: ${msg}`,
76
+ };
77
+ }
78
+ },
79
+ };
80
+ async function listDir(dir, projectDir, maxDepth, currentDepth) {
81
+ if (currentDepth >= maxDepth)
82
+ return [];
83
+ const entries = await fs.promises.readdir(dir, { withFileTypes: true });
84
+ const results = [];
85
+ const indent = ' '.repeat(currentDepth);
86
+ for (const entry of entries) {
87
+ // Skip common noise
88
+ if (entry.name === 'node_modules' || entry.name === '.git') {
89
+ results.push(`${indent}${entry.name}/ (skipped)`);
90
+ continue;
91
+ }
92
+ const fullPath = path.join(dir, entry.name);
93
+ const relPath = path.relative(projectDir, fullPath);
94
+ if (entry.isDirectory()) {
95
+ results.push(`${indent}${relPath}/`);
96
+ if (currentDepth < maxDepth - 1) {
97
+ const children = await listDir(fullPath, projectDir, maxDepth, currentDepth + 1);
98
+ results.push(...children);
99
+ }
100
+ }
101
+ else {
102
+ results.push(`${indent}${relPath}`);
103
+ }
104
+ }
105
+ return results;
106
+ }
107
+ //# sourceMappingURL=list-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-directory.js","sourceRoot":"","sources":["../../src/tools/list-directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from '../types';
2
+ export declare const readFileTool: ToolDefinition;
3
+ //# sourceMappingURL=read-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA2B,MAAM,UAAU,CAAC;AAGnE,eAAO,MAAM,YAAY,EAAE,cAqD1B,CAAC"}
@@ -0,0 +1,89 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.readFileTool = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const sandbox_1 = require("./sandbox");
39
+ exports.readFileTool = {
40
+ name: 'read_file',
41
+ description: 'Read the contents of a file within the project directory.',
42
+ parameters: {
43
+ type: 'object',
44
+ properties: {
45
+ path: { type: 'string', description: 'File path relative to project root' },
46
+ offset: { type: 'number', description: 'Line number to start reading from (1-indexed)' },
47
+ limit: { type: 'number', description: 'Maximum number of lines to read' },
48
+ },
49
+ required: ['path'],
50
+ },
51
+ async execute(args, ctx) {
52
+ const filePath = args.path;
53
+ const offset = args.offset || 1;
54
+ const limit = args.limit;
55
+ try {
56
+ const resolved = (0, sandbox_1.resolveSandboxed)(ctx.projectDir, filePath);
57
+ await (0, sandbox_1.checkFileSize)(resolved, ctx.maxFileSize);
58
+ const content = await fs.promises.readFile(resolved, 'utf-8');
59
+ const lines = content.split('\n');
60
+ const startIdx = Math.max(0, offset - 1);
61
+ const endIdx = limit ? startIdx + limit : lines.length;
62
+ const selected = lines.slice(startIdx, endIdx);
63
+ const output = selected.join('\n');
64
+ const totalLines = lines.length;
65
+ const info = `Lines ${startIdx + 1}-${Math.min(endIdx, totalLines)} of ${totalLines}`;
66
+ return {
67
+ tool_call_id: '',
68
+ name: 'read_file',
69
+ success: true,
70
+ output: `${info}\n${output}`,
71
+ verified: true,
72
+ verification_details: `File read successfully: ${filePath} (${totalLines} lines)`,
73
+ };
74
+ }
75
+ catch (err) {
76
+ const msg = err instanceof Error ? err.message : String(err);
77
+ return {
78
+ tool_call_id: '',
79
+ name: 'read_file',
80
+ success: false,
81
+ output: '',
82
+ error: msg,
83
+ verified: true,
84
+ verification_details: `Read failed: ${msg}`,
85
+ };
86
+ }
87
+ },
88
+ };
89
+ //# sourceMappingURL=read-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AAEzB,uCAA4D;AAE/C,QAAA,YAAY,GAAmB;IAC1C,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,2DAA2D;IACxE,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;YAC3E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;YACxF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;SAC1E;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;IACD,KAAK,CAAC,OAAO,CAAC,IAA6B,EAAE,GAAgB;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAc,CAAC;QACrC,MAAM,MAAM,GAAI,IAAI,CAAC,MAAiB,IAAI,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAA2B,CAAC;QAE/C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAA,0BAAgB,EAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC5D,MAAM,IAAA,uBAAa,EAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YAE/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE/C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;YAChC,MAAM,IAAI,GAAG,SAAS,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,EAAE,CAAC;YAEtF,OAAO;gBACL,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,GAAG,IAAI,KAAK,MAAM,EAAE;gBAC5B,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,2BAA2B,QAAQ,KAAK,UAAU,SAAS;aAClF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACL,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,GAAG;gBACV,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,gBAAgB,GAAG,EAAE;aAC5C,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from '../types';
2
+ export declare const runCommandTool: ToolDefinition;
3
+ //# sourceMappingURL=run-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-command.d.ts","sourceRoot":"","sources":["../../src/tools/run-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA2B,MAAM,UAAU,CAAC;AAGnE,eAAO,MAAM,cAAc,EAAE,cA0F5B,CAAC"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runCommandTool = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const sandbox_1 = require("./sandbox");
6
+ exports.runCommandTool = {
7
+ name: 'run_command',
8
+ description: 'Execute a shell command within the project directory. Timeout enforced.',
9
+ parameters: {
10
+ type: 'object',
11
+ properties: {
12
+ command: { type: 'string', description: 'Shell command to execute' },
13
+ timeout: { type: 'number', description: 'Timeout in seconds (default: 60, max: 300)' },
14
+ cwd: { type: 'string', description: 'Working directory relative to project root (default: project root)' },
15
+ },
16
+ required: ['command'],
17
+ },
18
+ async execute(args, ctx) {
19
+ const command = args.command;
20
+ const requestedTimeout = args.timeout;
21
+ const cwd = args.cwd;
22
+ const timeout = Math.min(requestedTimeout || ctx.commandTimeout, ctx.maxCommandTimeout);
23
+ try {
24
+ const workDir = cwd ? (0, sandbox_1.resolveSandboxed)(ctx.projectDir, cwd) : ctx.projectDir;
25
+ const startTime = Date.now();
26
+ const result = await new Promise((resolve) => {
27
+ const proc = (0, child_process_1.execFile)('/bin/bash', ['-c', command], {
28
+ cwd: workDir,
29
+ timeout: timeout * 1000,
30
+ maxBuffer: 1024 * 1024, // 1MB
31
+ env: {
32
+ ...process.env,
33
+ // Prevent interactive prompts
34
+ GIT_TERMINAL_PROMPT: '0',
35
+ DEBIAN_FRONTEND: 'noninteractive',
36
+ },
37
+ }, (error, stdout, stderr) => {
38
+ const exitCode = error && 'code' in error ? error.code ?? 1 : 0;
39
+ resolve({
40
+ stdout: stdout || '',
41
+ stderr: stderr || '',
42
+ exitCode: error?.killed ? 124 : exitCode, // 124 = timeout (like GNU timeout)
43
+ });
44
+ });
45
+ // Safety: ensure process is killed on timeout
46
+ proc.on('error', () => { });
47
+ });
48
+ const durationMs = Date.now() - startTime;
49
+ const wasTimeout = result.exitCode === 124;
50
+ let output = '';
51
+ if (result.stdout)
52
+ output += result.stdout;
53
+ if (result.stderr)
54
+ output += (output ? '\n--- stderr ---\n' : '') + result.stderr;
55
+ if (wasTimeout)
56
+ output += `\n[TIMEOUT: command killed after ${timeout}s]`;
57
+ output += `\n[exit code: ${result.exitCode}, duration: ${durationMs}ms]`;
58
+ return {
59
+ tool_call_id: '',
60
+ name: 'run_command',
61
+ success: result.exitCode === 0,
62
+ output: output.trim(),
63
+ exit_code: result.exitCode,
64
+ stderr: result.stderr,
65
+ error: result.exitCode !== 0 ? `Command exited with code ${result.exitCode}` : undefined,
66
+ verified: true,
67
+ verification_details: wasTimeout
68
+ ? `Command timed out after ${timeout}s`
69
+ : `Command completed with exit code ${result.exitCode} in ${durationMs}ms`,
70
+ };
71
+ }
72
+ catch (err) {
73
+ const msg = err instanceof Error ? err.message : String(err);
74
+ return {
75
+ tool_call_id: '',
76
+ name: 'run_command',
77
+ success: false,
78
+ output: '',
79
+ error: msg,
80
+ verified: true,
81
+ verification_details: `Command execution failed: ${msg}`,
82
+ };
83
+ }
84
+ },
85
+ };
86
+ //# sourceMappingURL=run-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/tools/run-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Sandbox utilities: path validation, ensuring operations stay within project directory.
3
+ */
4
+ /**
5
+ * Resolve a path relative to the project directory and ensure it doesn't escape.
6
+ * Throws if the resolved path is outside the sandbox.
7
+ */
8
+ export declare function resolveSandboxed(projectDir: string, filePath: string): string;
9
+ /**
10
+ * Check if a file exists within the sandbox.
11
+ */
12
+ export declare function existsInSandbox(projectDir: string, filePath: string): Promise<boolean>;
13
+ /**
14
+ * Validate file size is within limits.
15
+ */
16
+ export declare function checkFileSize(absolutePath: string, maxSize: number): Promise<void>;
17
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW7E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5F;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxF"}