@kernel.chat/kbot 1.3.1 → 2.3.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 (176) hide show
  1. package/README.md +94 -0
  2. package/dist/agent.d.ts +9 -0
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +576 -119
  5. package/dist/agent.js.map +1 -1
  6. package/dist/auth.d.ts +20 -35
  7. package/dist/auth.d.ts.map +1 -1
  8. package/dist/auth.js +224 -66
  9. package/dist/auth.js.map +1 -1
  10. package/dist/auth.test.d.ts +2 -0
  11. package/dist/auth.test.d.ts.map +1 -0
  12. package/dist/auth.test.js +89 -0
  13. package/dist/auth.test.js.map +1 -0
  14. package/dist/build-targets.d.ts +37 -0
  15. package/dist/build-targets.d.ts.map +1 -0
  16. package/dist/build-targets.js +507 -0
  17. package/dist/build-targets.js.map +1 -0
  18. package/dist/cli.js +1210 -130
  19. package/dist/cli.js.map +1 -1
  20. package/dist/context.d.ts +2 -0
  21. package/dist/context.d.ts.map +1 -1
  22. package/dist/context.js +72 -22
  23. package/dist/context.js.map +1 -1
  24. package/dist/hooks.d.ts +27 -0
  25. package/dist/hooks.d.ts.map +1 -0
  26. package/dist/hooks.js +145 -0
  27. package/dist/hooks.js.map +1 -0
  28. package/dist/ide/acp-server.d.ts +6 -0
  29. package/dist/ide/acp-server.d.ts.map +1 -0
  30. package/dist/ide/acp-server.js +319 -0
  31. package/dist/ide/acp-server.js.map +1 -0
  32. package/dist/ide/bridge.d.ts +128 -0
  33. package/dist/ide/bridge.d.ts.map +1 -0
  34. package/dist/ide/bridge.js +185 -0
  35. package/dist/ide/bridge.js.map +1 -0
  36. package/dist/ide/index.d.ts +5 -0
  37. package/dist/ide/index.d.ts.map +1 -0
  38. package/dist/ide/index.js +11 -0
  39. package/dist/ide/index.js.map +1 -0
  40. package/dist/ide/lsp-bridge.d.ts +27 -0
  41. package/dist/ide/lsp-bridge.d.ts.map +1 -0
  42. package/dist/ide/lsp-bridge.js +267 -0
  43. package/dist/ide/lsp-bridge.js.map +1 -0
  44. package/dist/ide/mcp-server.d.ts +7 -0
  45. package/dist/ide/mcp-server.d.ts.map +1 -0
  46. package/dist/ide/mcp-server.js +451 -0
  47. package/dist/ide/mcp-server.js.map +1 -0
  48. package/dist/learning.d.ts +179 -0
  49. package/dist/learning.d.ts.map +1 -0
  50. package/dist/learning.js +829 -0
  51. package/dist/learning.js.map +1 -0
  52. package/dist/learning.test.d.ts +2 -0
  53. package/dist/learning.test.d.ts.map +1 -0
  54. package/dist/learning.test.js +115 -0
  55. package/dist/learning.test.js.map +1 -0
  56. package/dist/matrix.d.ts +49 -0
  57. package/dist/matrix.d.ts.map +1 -0
  58. package/dist/matrix.js +302 -0
  59. package/dist/matrix.js.map +1 -0
  60. package/dist/memory.d.ts +11 -0
  61. package/dist/memory.d.ts.map +1 -1
  62. package/dist/memory.js +54 -2
  63. package/dist/memory.js.map +1 -1
  64. package/dist/multimodal.d.ts +57 -0
  65. package/dist/multimodal.d.ts.map +1 -0
  66. package/dist/multimodal.js +206 -0
  67. package/dist/multimodal.js.map +1 -0
  68. package/dist/permissions.d.ts +21 -0
  69. package/dist/permissions.d.ts.map +1 -0
  70. package/dist/permissions.js +122 -0
  71. package/dist/permissions.js.map +1 -0
  72. package/dist/planner.d.ts +54 -0
  73. package/dist/planner.d.ts.map +1 -0
  74. package/dist/planner.js +298 -0
  75. package/dist/planner.js.map +1 -0
  76. package/dist/plugins.d.ts +30 -0
  77. package/dist/plugins.d.ts.map +1 -0
  78. package/dist/plugins.js +135 -0
  79. package/dist/plugins.js.map +1 -0
  80. package/dist/sessions.d.ts +38 -0
  81. package/dist/sessions.d.ts.map +1 -0
  82. package/dist/sessions.js +177 -0
  83. package/dist/sessions.js.map +1 -0
  84. package/dist/streaming.d.ts +88 -0
  85. package/dist/streaming.d.ts.map +1 -0
  86. package/dist/streaming.js +317 -0
  87. package/dist/streaming.js.map +1 -0
  88. package/dist/tools/background.d.ts +2 -0
  89. package/dist/tools/background.d.ts.map +1 -0
  90. package/dist/tools/background.js +163 -0
  91. package/dist/tools/background.js.map +1 -0
  92. package/dist/tools/bash.d.ts.map +1 -1
  93. package/dist/tools/bash.js +26 -1
  94. package/dist/tools/bash.js.map +1 -1
  95. package/dist/tools/browser.js +7 -7
  96. package/dist/tools/browser.js.map +1 -1
  97. package/dist/tools/build-matrix.d.ts +2 -0
  98. package/dist/tools/build-matrix.d.ts.map +1 -0
  99. package/dist/tools/build-matrix.js +463 -0
  100. package/dist/tools/build-matrix.js.map +1 -0
  101. package/dist/tools/computer.js +5 -5
  102. package/dist/tools/computer.js.map +1 -1
  103. package/dist/tools/fetch.d.ts +2 -0
  104. package/dist/tools/fetch.d.ts.map +1 -0
  105. package/dist/tools/fetch.js +106 -0
  106. package/dist/tools/fetch.js.map +1 -0
  107. package/dist/tools/files.d.ts.map +1 -1
  108. package/dist/tools/files.js +112 -6
  109. package/dist/tools/files.js.map +1 -1
  110. package/dist/tools/git.js +3 -3
  111. package/dist/tools/git.js.map +1 -1
  112. package/dist/tools/github.d.ts +2 -0
  113. package/dist/tools/github.d.ts.map +1 -0
  114. package/dist/tools/github.js +196 -0
  115. package/dist/tools/github.js.map +1 -0
  116. package/dist/tools/index.d.ts +29 -5
  117. package/dist/tools/index.d.ts.map +1 -1
  118. package/dist/tools/index.js +136 -20
  119. package/dist/tools/index.js.map +1 -1
  120. package/dist/tools/index.test.d.ts +2 -0
  121. package/dist/tools/index.test.d.ts.map +1 -0
  122. package/dist/tools/index.test.js +162 -0
  123. package/dist/tools/index.test.js.map +1 -0
  124. package/dist/tools/matrix.d.ts +2 -0
  125. package/dist/tools/matrix.d.ts.map +1 -0
  126. package/dist/tools/matrix.js +79 -0
  127. package/dist/tools/matrix.js.map +1 -0
  128. package/dist/tools/mcp-client.d.ts +2 -0
  129. package/dist/tools/mcp-client.d.ts.map +1 -0
  130. package/dist/tools/mcp-client.js +295 -0
  131. package/dist/tools/mcp-client.js.map +1 -0
  132. package/dist/tools/notebook.d.ts +2 -0
  133. package/dist/tools/notebook.d.ts.map +1 -0
  134. package/dist/tools/notebook.js +207 -0
  135. package/dist/tools/notebook.js.map +1 -0
  136. package/dist/tools/openclaw.d.ts +2 -0
  137. package/dist/tools/openclaw.d.ts.map +1 -0
  138. package/dist/tools/openclaw.js +187 -0
  139. package/dist/tools/openclaw.js.map +1 -0
  140. package/dist/tools/parallel.d.ts +2 -0
  141. package/dist/tools/parallel.d.ts.map +1 -0
  142. package/dist/tools/parallel.js +60 -0
  143. package/dist/tools/parallel.js.map +1 -0
  144. package/dist/tools/sandbox.d.ts +2 -0
  145. package/dist/tools/sandbox.d.ts.map +1 -0
  146. package/dist/tools/sandbox.js +352 -0
  147. package/dist/tools/sandbox.js.map +1 -0
  148. package/dist/tools/search.d.ts.map +1 -1
  149. package/dist/tools/search.js +135 -28
  150. package/dist/tools/search.js.map +1 -1
  151. package/dist/tools/subagent.d.ts +4 -0
  152. package/dist/tools/subagent.d.ts.map +1 -0
  153. package/dist/tools/subagent.js +260 -0
  154. package/dist/tools/subagent.js.map +1 -0
  155. package/dist/tools/tasks.d.ts +14 -0
  156. package/dist/tools/tasks.d.ts.map +1 -0
  157. package/dist/tools/tasks.js +210 -0
  158. package/dist/tools/tasks.js.map +1 -0
  159. package/dist/tools/worktree.d.ts +2 -0
  160. package/dist/tools/worktree.d.ts.map +1 -0
  161. package/dist/tools/worktree.js +223 -0
  162. package/dist/tools/worktree.js.map +1 -0
  163. package/dist/tui.d.ts +73 -0
  164. package/dist/tui.d.ts.map +1 -0
  165. package/dist/tui.js +257 -0
  166. package/dist/tui.js.map +1 -0
  167. package/dist/ui.d.ts +11 -19
  168. package/dist/ui.d.ts.map +1 -1
  169. package/dist/ui.js +143 -171
  170. package/dist/ui.js.map +1 -1
  171. package/dist/updater.d.ts +3 -0
  172. package/dist/updater.d.ts.map +1 -0
  173. package/dist/updater.js +70 -0
  174. package/dist/updater.js.map +1 -0
  175. package/install.sh +5 -7
  176. package/package.json +8 -4
@@ -0,0 +1,187 @@
1
+ // K:BOT OpenClaw Local AI Tools
2
+ //
3
+ // Integrates OpenClaw's local AI capabilities as kbot tools.
4
+ // These run entirely on the user's machine — no cloud API needed.
5
+ //
6
+ // ENHANCEMENTS (v2.3):
7
+ // - Configurable gateway URL via OPENCLAW_URL env var
8
+ // - Health check with graceful degradation (tools skip if gateway offline)
9
+ // - Connection status caching (recheck every 60s)
10
+ import { registerTool } from './index.js';
11
+ const OPENCLAW_BASE = process.env.OPENCLAW_URL || 'http://127.0.0.1:18789';
12
+ /** Connection health state */
13
+ let _gatewayOnline = null; // null = unknown
14
+ let _lastHealthCheck = 0;
15
+ const HEALTH_CHECK_INTERVAL = 60_000; // 60 seconds
16
+ /** Check if OpenClaw gateway is reachable (cached) */
17
+ async function isGatewayOnline() {
18
+ const now = Date.now();
19
+ if (_gatewayOnline !== null && (now - _lastHealthCheck) < HEALTH_CHECK_INTERVAL) {
20
+ return _gatewayOnline;
21
+ }
22
+ try {
23
+ const res = await fetch(`${OPENCLAW_BASE}/health`, {
24
+ signal: AbortSignal.timeout(3000),
25
+ });
26
+ _gatewayOnline = res.ok;
27
+ }
28
+ catch {
29
+ _gatewayOnline = false;
30
+ }
31
+ _lastHealthCheck = now;
32
+ return _gatewayOnline;
33
+ }
34
+ /** Call an OpenClaw endpoint with graceful degradation */
35
+ async function callOpenClaw(endpoint, payload, timeout = 120_000) {
36
+ // Quick health check — skip if gateway known to be offline
37
+ const online = await isGatewayOnline();
38
+ if (!online) {
39
+ return `OpenClaw gateway is offline. Start it with: openclaw-cmd start\nOr set OPENCLAW_URL env var if running on a different port.`;
40
+ }
41
+ try {
42
+ const res = await fetch(`${OPENCLAW_BASE}/v1/${endpoint}`, {
43
+ method: 'POST',
44
+ headers: { 'Content-Type': 'application/json' },
45
+ body: JSON.stringify(payload),
46
+ signal: AbortSignal.timeout(timeout),
47
+ });
48
+ if (!res.ok) {
49
+ const err = await res.text().catch(() => `HTTP ${res.status}`);
50
+ return `Error: OpenClaw ${endpoint} failed — ${err}`;
51
+ }
52
+ const data = await res.json();
53
+ return data.result || data.output || data.text || JSON.stringify(data, null, 2);
54
+ }
55
+ catch (err) {
56
+ if (err instanceof Error && err.name === 'AbortError') {
57
+ return `Error: OpenClaw ${endpoint} timed out after ${timeout / 1000}s`;
58
+ }
59
+ // Mark gateway as offline for next check
60
+ _gatewayOnline = false;
61
+ _lastHealthCheck = Date.now();
62
+ return `Error: OpenClaw gateway not reachable at ${OPENCLAW_BASE}. Start it with: openclaw-cmd start`;
63
+ }
64
+ }
65
+ export function registerOpenClawTools() {
66
+ registerTool({
67
+ name: 'openclaw_explain',
68
+ description: '[Local AI] Explain code using a local model. No API costs.',
69
+ parameters: {
70
+ code: { type: 'string', description: 'The code to explain', required: true },
71
+ language: { type: 'string', description: 'Programming language (auto-detected if omitted)' },
72
+ },
73
+ tier: 'free',
74
+ async execute(args) {
75
+ return callOpenClaw('explain', { code: String(args.code), language: args.language });
76
+ },
77
+ });
78
+ registerTool({
79
+ name: 'openclaw_review',
80
+ description: '[Local AI] Review code for bugs, security issues, and style.',
81
+ parameters: {
82
+ code: { type: 'string', description: 'The code to review', required: true },
83
+ focus: { type: 'string', description: 'Review focus: bugs, security, performance, style' },
84
+ },
85
+ tier: 'free',
86
+ async execute(args) {
87
+ return callOpenClaw('review', { code: String(args.code), focus: args.focus || 'all' });
88
+ },
89
+ });
90
+ registerTool({
91
+ name: 'openclaw_refactor',
92
+ description: '[Local AI] Suggest code refactoring improvements.',
93
+ parameters: {
94
+ code: { type: 'string', description: 'The code to refactor', required: true },
95
+ goal: { type: 'string', description: 'Goal: readability, performance, DRY, testability' },
96
+ },
97
+ tier: 'free',
98
+ async execute(args) {
99
+ return callOpenClaw('refactor', { code: String(args.code), goal: args.goal || 'readability' });
100
+ },
101
+ });
102
+ registerTool({
103
+ name: 'openclaw_test_gen',
104
+ description: '[Local AI] Generate test cases for code.',
105
+ parameters: {
106
+ code: { type: 'string', description: 'The code to test', required: true },
107
+ framework: { type: 'string', description: 'Test framework: jest, vitest, pytest, go' },
108
+ },
109
+ tier: 'free',
110
+ async execute(args) {
111
+ return callOpenClaw('test_gen', { code: String(args.code), framework: args.framework });
112
+ },
113
+ });
114
+ registerTool({
115
+ name: 'openclaw_ask',
116
+ description: '[Local AI] Ask a question to local AI. No cloud API needed.',
117
+ parameters: {
118
+ question: { type: 'string', description: 'The question to ask', required: true },
119
+ context: { type: 'string', description: 'Additional context or code' },
120
+ },
121
+ tier: 'free',
122
+ async execute(args) {
123
+ return callOpenClaw('ask', { question: String(args.question), context: args.context });
124
+ },
125
+ });
126
+ registerTool({
127
+ name: 'openclaw_diagram',
128
+ description: '[Local AI] Generate Mermaid diagrams from description or code.',
129
+ parameters: {
130
+ input: { type: 'string', description: 'Description or code to diagram', required: true },
131
+ type: { type: 'string', description: 'Diagram type: flowchart, sequence, class, state, er' },
132
+ },
133
+ tier: 'free',
134
+ async execute(args) {
135
+ return callOpenClaw('diagram', { input: String(args.input), type: args.type || 'auto' });
136
+ },
137
+ });
138
+ registerTool({
139
+ name: 'openclaw_regex',
140
+ description: '[Local AI] Build or explain regex patterns.',
141
+ parameters: {
142
+ input: { type: 'string', description: 'Description OR regex to explain', required: true },
143
+ mode: { type: 'string', description: '"build" or "explain" (default: auto)' },
144
+ },
145
+ tier: 'free',
146
+ async execute(args) {
147
+ return callOpenClaw('regex', { input: String(args.input), mode: args.mode || 'auto' });
148
+ },
149
+ });
150
+ registerTool({
151
+ name: 'openclaw_sql',
152
+ description: '[Local AI] Write or explain SQL queries.',
153
+ parameters: {
154
+ input: { type: 'string', description: 'Natural language OR SQL to explain', required: true },
155
+ dialect: { type: 'string', description: 'SQL dialect: postgres, mysql, sqlite' },
156
+ },
157
+ tier: 'free',
158
+ async execute(args) {
159
+ return callOpenClaw('sql', { input: String(args.input), dialect: args.dialect || 'postgres' });
160
+ },
161
+ });
162
+ registerTool({
163
+ name: 'openclaw_shell',
164
+ description: '[Local AI] Explain shell commands or build them from description.',
165
+ parameters: {
166
+ input: { type: 'string', description: 'Command to explain OR description to build', required: true },
167
+ mode: { type: 'string', description: '"explain" or "build" (default: auto)' },
168
+ },
169
+ tier: 'free',
170
+ async execute(args) {
171
+ return callOpenClaw('shell_explain', { input: String(args.input), mode: args.mode || 'auto' });
172
+ },
173
+ });
174
+ registerTool({
175
+ name: 'openclaw_summarize',
176
+ description: '[Local AI] Summarize text or code.',
177
+ parameters: {
178
+ text: { type: 'string', description: 'Text or code to summarize', required: true },
179
+ length: { type: 'string', description: 'Length: short, medium, long' },
180
+ },
181
+ tier: 'free',
182
+ async execute(args) {
183
+ return callOpenClaw('summarize', { text: String(args.text), length: args.length || 'medium' });
184
+ },
185
+ });
186
+ }
187
+ //# sourceMappingURL=openclaw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/tools/openclaw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerParallelTools(): void;
2
+ //# sourceMappingURL=parallel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.d.ts","sourceRoot":"","sources":["../../src/tools/parallel.ts"],"names":[],"mappings":"AAUA,wBAAgB,qBAAqB,IAAI,IAAI,CA0D5C"}
@@ -0,0 +1,60 @@
1
+ // K:BOT Parallel Tool Execution
2
+ //
3
+ // Runs multiple tools concurrently via Promise.all.
4
+ // Claude Code's biggest speed advantage — multiple independent
5
+ // operations execute simultaneously instead of sequentially.
6
+ //
7
+ // Example: read 3 files + run git status = 1 round-trip instead of 4.
8
+ import { registerTool, executeTool, getTool } from './index.js';
9
+ export function registerParallelTools() {
10
+ registerTool({
11
+ name: 'parallel_execute',
12
+ description: 'Run multiple tools in parallel. Each item is { name, arguments }. All tools execute concurrently via Promise.all — much faster than sequential calls for independent operations.',
13
+ parameters: {
14
+ calls: {
15
+ type: 'array',
16
+ description: 'Array of tool calls: [{ name: "read_file", arguments: { path: "..." } }, ...]',
17
+ required: true,
18
+ },
19
+ },
20
+ tier: 'free',
21
+ async execute(args) {
22
+ const calls = args.calls;
23
+ if (!Array.isArray(calls) || calls.length === 0) {
24
+ return 'Error: calls must be a non-empty array of { name, arguments }';
25
+ }
26
+ if (calls.length > 20) {
27
+ return 'Error: maximum 20 parallel calls allowed';
28
+ }
29
+ // Validate all tools exist before executing any
30
+ for (const call of calls) {
31
+ if (!getTool(call.name)) {
32
+ return `Error: unknown tool "${call.name}". Fix the tool name and retry.`;
33
+ }
34
+ }
35
+ // Build ToolCall objects
36
+ const toolCalls = calls.map((call, i) => ({
37
+ id: `parallel_${Date.now()}_${i}`,
38
+ name: call.name,
39
+ arguments: call.arguments || {},
40
+ }));
41
+ // Execute all in parallel
42
+ const startTime = Date.now();
43
+ const results = await Promise.all(toolCalls.map(tc => executeTool(tc)));
44
+ const elapsed = Date.now() - startTime;
45
+ // Format results
46
+ const output = [];
47
+ for (let i = 0; i < results.length; i++) {
48
+ const call = calls[i];
49
+ const result = results[i];
50
+ const status = result.error ? 'ERROR' : 'OK';
51
+ output.push(`── ${call.name} [${status}] ──`);
52
+ output.push(result.result);
53
+ output.push('');
54
+ }
55
+ output.push(`⏱ ${calls.length} tools completed in ${elapsed}ms (parallel)`);
56
+ return output.join('\n');
57
+ },
58
+ });
59
+ }
60
+ //# sourceMappingURL=parallel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../src/tools/parallel.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,oDAAoD;AACpD,+DAA+D;AAC/D,6DAA6D;AAC7D,EAAE;AACF,sEAAsE;AAEtE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAkC,MAAM,YAAY,CAAA;AAE/F,MAAM,UAAU,qBAAqB;IACnC,YAAY,CAAC;QACX,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,kLAAkL;QAC/L,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,+EAA+E;gBAC5F,QAAQ,EAAE,IAAI;aACf;SACF;QACD,IAAI,EAAE,MAAM;QACZ,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAqE,CAAA;YACxF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChD,OAAO,+DAA+D,CAAA;YACxE,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACtB,OAAO,0CAA0C,CAAA;YACnD,CAAC;YAED,gDAAgD;YAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,OAAO,wBAAwB,IAAI,CAAC,IAAI,iCAAiC,CAAA;gBAC3E,CAAC;YACH,CAAC;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAe,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpD,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;gBACjC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;aAChC,CAAC,CAAC,CAAA;YAEH,0BAA0B;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC5B,MAAM,OAAO,GAAiB,MAAM,OAAO,CAAC,GAAG,CAC7C,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CACrC,CAAA;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YAEtC,iBAAiB;YACjB,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBACrB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;gBACzB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;gBAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,CAAA;gBAC7C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACjB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,uBAAuB,OAAO,eAAe,CAAC,CAAA;YAC3E,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function registerSandboxTools(): void;
2
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"AAqFA,wBAAgB,oBAAoB,IAAI,IAAI,CAwR3C"}
@@ -0,0 +1,352 @@
1
+ // K:BOT Sandbox Execution — Run untrusted code in isolated Docker containers
2
+ //
3
+ // Supports multiple languages. Auto-creates and cleans up containers.
4
+ // Falls back to local execution with warnings if Docker isn't available.
5
+ //
6
+ // Flow:
7
+ // sandbox_run — execute code in a fresh container
8
+ // sandbox_exec — execute a command in a running sandbox
9
+ // sandbox_stop — stop and remove a sandbox
10
+ import { execSync, spawn } from 'node:child_process';
11
+ import { writeFileSync, mkdirSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { tmpdir } from 'node:os';
14
+ import { registerTool } from './index.js';
15
+ const sandboxes = new Map();
16
+ let nextSandboxId = 1;
17
+ /** Language → Docker image + run command */
18
+ const LANGUAGE_CONFIGS = {
19
+ python: {
20
+ image: 'python:3.12-slim',
21
+ ext: '.py',
22
+ runCmd: (f) => `python ${f}`,
23
+ },
24
+ javascript: {
25
+ image: 'node:22-slim',
26
+ ext: '.js',
27
+ runCmd: (f) => `node ${f}`,
28
+ },
29
+ typescript: {
30
+ image: 'node:22-slim',
31
+ ext: '.ts',
32
+ runCmd: (f) => `npx -y tsx ${f}`,
33
+ },
34
+ ruby: {
35
+ image: 'ruby:3.3-slim',
36
+ ext: '.rb',
37
+ runCmd: (f) => `ruby ${f}`,
38
+ },
39
+ go: {
40
+ image: 'golang:1.22-alpine',
41
+ ext: '.go',
42
+ runCmd: (f) => `go run ${f}`,
43
+ },
44
+ rust: {
45
+ image: 'rust:1.77-slim',
46
+ ext: '.rs',
47
+ runCmd: (f) => `rustc ${f} -o /tmp/out && /tmp/out`,
48
+ },
49
+ bash: {
50
+ image: 'alpine:3.19',
51
+ ext: '.sh',
52
+ runCmd: (f) => `sh ${f}`,
53
+ },
54
+ c: {
55
+ image: 'gcc:14',
56
+ ext: '.c',
57
+ runCmd: (f) => `gcc ${f} -o /tmp/out && /tmp/out`,
58
+ },
59
+ cpp: {
60
+ image: 'gcc:14',
61
+ ext: '.cpp',
62
+ runCmd: (f) => `g++ ${f} -o /tmp/out && /tmp/out`,
63
+ },
64
+ };
65
+ /** Check if Docker is available */
66
+ function isDockerAvailable() {
67
+ try {
68
+ execSync('docker info', { stdio: 'ignore', timeout: 5000 });
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ export function registerSandboxTools() {
76
+ registerTool({
77
+ name: 'sandbox_run',
78
+ description: 'Execute code in an isolated Docker container. Supports: python, javascript, typescript, ruby, go, rust, bash, c, cpp. Auto-cleans up after execution. Safe for untrusted code.',
79
+ parameters: {
80
+ code: { type: 'string', description: 'Source code to execute', required: true },
81
+ language: { type: 'string', description: 'Programming language (python, javascript, typescript, ruby, go, rust, bash, c, cpp)', required: true },
82
+ timeout: { type: 'number', description: 'Timeout in seconds (default: 30, max: 300)' },
83
+ packages: { type: 'string', description: 'Space-separated packages to install before running (e.g., "numpy pandas" for Python)' },
84
+ stdin: { type: 'string', description: 'Input to pipe to stdin' },
85
+ },
86
+ tier: 'free',
87
+ async execute(args) {
88
+ const code = String(args.code);
89
+ const language = String(args.language).toLowerCase();
90
+ const timeout = Math.min(typeof args.timeout === 'number' ? args.timeout : 30, 300);
91
+ const packages = args.packages ? String(args.packages) : '';
92
+ const stdinInput = args.stdin ? String(args.stdin) : '';
93
+ const config = LANGUAGE_CONFIGS[language];
94
+ if (!config) {
95
+ return `Error: Unsupported language "${language}". Supported: ${Object.keys(LANGUAGE_CONFIGS).join(', ')}`;
96
+ }
97
+ if (!isDockerAvailable()) {
98
+ return 'Error: Docker is not available. Install Docker Desktop to use sandboxed execution.\n\nAlternative: use the `bash` tool for local execution (not sandboxed).';
99
+ }
100
+ // Write code to temp file
101
+ const tmpDir = join(tmpdir(), `kbot-sandbox-${Date.now()}`);
102
+ mkdirSync(tmpDir, { recursive: true });
103
+ const codeFile = join(tmpDir, `main${config.ext}`);
104
+ writeFileSync(codeFile, code);
105
+ // Build Docker command
106
+ const containerName = `kbot-sandbox-${Date.now()}`;
107
+ const dockerArgs = [
108
+ 'run',
109
+ '--rm',
110
+ '--name', containerName,
111
+ '--network', 'none', // No network access
112
+ '--memory', '512m', // Memory limit
113
+ '--cpus', '1', // CPU limit
114
+ '--pids-limit', '100', // Process limit
115
+ '--read-only', // Read-only filesystem
116
+ '--tmpfs', '/tmp:rw,size=100m', // Writable /tmp
117
+ '-v', `${tmpDir}:/workspace:ro`, // Mount code read-only
118
+ '-w', '/workspace',
119
+ ];
120
+ // Install packages if specified
121
+ let installCmd = '';
122
+ if (packages) {
123
+ switch (language) {
124
+ case 'python':
125
+ installCmd = `pip install --quiet ${packages} && `;
126
+ // Need writable for pip
127
+ dockerArgs.splice(dockerArgs.indexOf('--read-only'), 1);
128
+ break;
129
+ case 'javascript':
130
+ case 'typescript':
131
+ installCmd = `npm install --no-save ${packages} 2>/dev/null && `;
132
+ dockerArgs.splice(dockerArgs.indexOf('--read-only'), 1);
133
+ break;
134
+ case 'ruby':
135
+ installCmd = `gem install ${packages} --no-document && `;
136
+ dockerArgs.splice(dockerArgs.indexOf('--read-only'), 1);
137
+ break;
138
+ }
139
+ }
140
+ const runCmd = `${installCmd}${config.runCmd('/workspace/main' + config.ext)}`;
141
+ dockerArgs.push(config.image, 'sh', '-c', runCmd);
142
+ try {
143
+ const startTime = Date.now();
144
+ let result;
145
+ if (stdinInput) {
146
+ // Use spawn for stdin piping
147
+ result = await new Promise((resolve, reject) => {
148
+ const proc = spawn('docker', dockerArgs, { stdio: ['pipe', 'pipe', 'pipe'] });
149
+ let stdout = '';
150
+ let stderr = '';
151
+ proc.stdout.on('data', (d) => { stdout += d.toString(); });
152
+ proc.stderr.on('data', (d) => { stderr += d.toString(); });
153
+ proc.stdin.write(stdinInput);
154
+ proc.stdin.end();
155
+ const timer = setTimeout(() => {
156
+ proc.kill();
157
+ try {
158
+ execSync(`docker kill ${containerName}`, { stdio: 'ignore' });
159
+ }
160
+ catch { }
161
+ reject(new Error(`Timeout: execution exceeded ${timeout}s`));
162
+ }, timeout * 1000);
163
+ proc.on('close', (code) => {
164
+ clearTimeout(timer);
165
+ const output = [stdout, stderr].filter(Boolean).join('\n');
166
+ if (code !== 0) {
167
+ resolve(`Exit code ${code}\n${output}`);
168
+ }
169
+ else {
170
+ resolve(output || '(no output)');
171
+ }
172
+ });
173
+ proc.on('error', (err) => {
174
+ clearTimeout(timer);
175
+ reject(err);
176
+ });
177
+ });
178
+ }
179
+ else {
180
+ result = execSync(['docker', ...dockerArgs].map(a => a.includes(' ') ? `"${a}"` : a).join(' '), {
181
+ encoding: 'utf-8',
182
+ timeout: timeout * 1000,
183
+ maxBuffer: 5 * 1024 * 1024,
184
+ }).trim() || '(no output)';
185
+ }
186
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
187
+ // Clean up temp dir
188
+ try {
189
+ execSync(`rm -rf "${tmpDir}"`, { stdio: 'ignore' });
190
+ }
191
+ catch { }
192
+ return `${result}\n\n⏱ ${elapsed}s (sandboxed, ${language})`;
193
+ }
194
+ catch (err) {
195
+ // Clean up
196
+ try {
197
+ execSync(`docker kill ${containerName}`, { stdio: 'ignore' });
198
+ }
199
+ catch { }
200
+ try {
201
+ execSync(`rm -rf "${tmpDir}"`, { stdio: 'ignore' });
202
+ }
203
+ catch { }
204
+ const e = err;
205
+ const output = [e.stdout, e.stderr].filter(Boolean).join('\n').trim();
206
+ return `Sandbox error:\n${output || e.message || 'Unknown error'}`;
207
+ }
208
+ },
209
+ });
210
+ registerTool({
211
+ name: 'sandbox_start',
212
+ description: 'Start a persistent sandbox container that stays running. Useful for multi-step execution.',
213
+ parameters: {
214
+ language: { type: 'string', description: 'Language/runtime for the sandbox', required: true },
215
+ packages: { type: 'string', description: 'Packages to pre-install' },
216
+ },
217
+ tier: 'free',
218
+ async execute(args) {
219
+ const language = String(args.language).toLowerCase();
220
+ const packages = args.packages ? String(args.packages) : '';
221
+ const config = LANGUAGE_CONFIGS[language];
222
+ if (!config) {
223
+ return `Error: Unsupported language "${language}". Supported: ${Object.keys(LANGUAGE_CONFIGS).join(', ')}`;
224
+ }
225
+ if (!isDockerAvailable()) {
226
+ return 'Error: Docker is not available.';
227
+ }
228
+ const id = String(nextSandboxId++);
229
+ const containerName = `kbot-sandbox-persistent-${id}`;
230
+ // Start detached container
231
+ const dockerArgs = [
232
+ 'run', '-d',
233
+ '--name', containerName,
234
+ '--network', 'none',
235
+ '--memory', '512m',
236
+ '--cpus', '1',
237
+ '--pids-limit', '100',
238
+ config.image,
239
+ 'sleep', '3600', // Keep alive for 1 hour
240
+ ];
241
+ try {
242
+ const containerId = execSync(`docker ${dockerArgs.join(' ')}`, {
243
+ encoding: 'utf-8',
244
+ timeout: 60000,
245
+ }).trim();
246
+ // Install packages if specified
247
+ if (packages) {
248
+ let installCmd = '';
249
+ switch (language) {
250
+ case 'python':
251
+ installCmd = `pip install --quiet ${packages}`;
252
+ break;
253
+ case 'javascript':
254
+ case 'typescript':
255
+ installCmd = `npm install -g ${packages} 2>/dev/null`;
256
+ break;
257
+ case 'ruby':
258
+ installCmd = `gem install ${packages} --no-document`;
259
+ break;
260
+ }
261
+ if (installCmd) {
262
+ try {
263
+ execSync(`docker exec ${containerName} sh -c "${installCmd}"`, {
264
+ stdio: 'ignore', timeout: 120000,
265
+ });
266
+ }
267
+ catch { /* non-fatal */ }
268
+ }
269
+ }
270
+ sandboxes.set(id, {
271
+ id,
272
+ containerId: containerId.slice(0, 12),
273
+ language,
274
+ createdAt: new Date().toISOString(),
275
+ });
276
+ return `Sandbox #${id} started (${language}, container ${containerId.slice(0, 12)})`;
277
+ }
278
+ catch (err) {
279
+ return `Error starting sandbox: ${err instanceof Error ? err.message : String(err)}`;
280
+ }
281
+ },
282
+ });
283
+ registerTool({
284
+ name: 'sandbox_exec',
285
+ description: 'Execute a command in a running persistent sandbox.',
286
+ parameters: {
287
+ id: { type: 'string', description: 'Sandbox ID', required: true },
288
+ command: { type: 'string', description: 'Command to execute', required: true },
289
+ timeout: { type: 'number', description: 'Timeout in seconds (default: 30)' },
290
+ },
291
+ tier: 'free',
292
+ async execute(args) {
293
+ const id = String(args.id);
294
+ const command = String(args.command);
295
+ const timeout = Math.min(typeof args.timeout === 'number' ? args.timeout : 30, 300);
296
+ const sandbox = sandboxes.get(id);
297
+ if (!sandbox)
298
+ return `Error: Sandbox #${id} not found`;
299
+ const containerName = `kbot-sandbox-persistent-${id}`;
300
+ try {
301
+ const result = execSync(`docker exec ${containerName} sh -c ${JSON.stringify(command)}`, {
302
+ encoding: 'utf-8',
303
+ timeout: timeout * 1000,
304
+ maxBuffer: 5 * 1024 * 1024,
305
+ });
306
+ return result.trim() || '(no output)';
307
+ }
308
+ catch (err) {
309
+ const e = err;
310
+ const output = [e.stdout, e.stderr].filter(Boolean).join('\n').trim();
311
+ return `Exit code ${e.status || 1}\n${output || e.message || 'Command failed'}`;
312
+ }
313
+ },
314
+ });
315
+ registerTool({
316
+ name: 'sandbox_stop',
317
+ description: 'Stop and remove a persistent sandbox container.',
318
+ parameters: {
319
+ id: { type: 'string', description: 'Sandbox ID', required: true },
320
+ },
321
+ tier: 'free',
322
+ async execute(args) {
323
+ const id = String(args.id);
324
+ const sandbox = sandboxes.get(id);
325
+ if (!sandbox)
326
+ return `Error: Sandbox #${id} not found`;
327
+ const containerName = `kbot-sandbox-persistent-${id}`;
328
+ try {
329
+ execSync(`docker rm -f ${containerName}`, { stdio: 'ignore', timeout: 10000 });
330
+ }
331
+ catch { /* already gone */ }
332
+ sandboxes.delete(id);
333
+ return `Sandbox #${id} stopped and removed`;
334
+ },
335
+ });
336
+ registerTool({
337
+ name: 'sandbox_list',
338
+ description: 'List all active sandboxes.',
339
+ parameters: {},
340
+ tier: 'free',
341
+ async execute() {
342
+ if (sandboxes.size === 0)
343
+ return 'No active sandboxes.';
344
+ const lines = [];
345
+ for (const [id, sb] of sandboxes) {
346
+ lines.push(`#${id}: ${sb.language} (container ${sb.containerId}, started ${sb.createdAt})`);
347
+ }
348
+ return lines.join('\n');
349
+ },
350
+ });
351
+ }
352
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"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"}