@kernel.chat/kbot 1.0.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 (54) hide show
  1. package/dist/agent.d.ts +36 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +211 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/auth.d.ts +43 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +108 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/cli.d.ts +3 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +240 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/context.d.ts +15 -0
  14. package/dist/context.d.ts.map +1 -0
  15. package/dist/context.js +128 -0
  16. package/dist/context.js.map +1 -0
  17. package/dist/memory.d.ts +25 -0
  18. package/dist/memory.d.ts.map +1 -0
  19. package/dist/memory.js +75 -0
  20. package/dist/memory.js.map +1 -0
  21. package/dist/tools/bash.d.ts +2 -0
  22. package/dist/tools/bash.d.ts.map +1 -0
  23. package/dist/tools/bash.js +63 -0
  24. package/dist/tools/bash.js.map +1 -0
  25. package/dist/tools/browser.d.ts +2 -0
  26. package/dist/tools/browser.d.ts.map +1 -0
  27. package/dist/tools/browser.js +116 -0
  28. package/dist/tools/browser.js.map +1 -0
  29. package/dist/tools/computer.d.ts +2 -0
  30. package/dist/tools/computer.d.ts.map +1 -0
  31. package/dist/tools/computer.js +176 -0
  32. package/dist/tools/computer.js.map +1 -0
  33. package/dist/tools/files.d.ts +2 -0
  34. package/dist/tools/files.d.ts.map +1 -0
  35. package/dist/tools/files.js +147 -0
  36. package/dist/tools/files.js.map +1 -0
  37. package/dist/tools/git.d.ts +2 -0
  38. package/dist/tools/git.d.ts.map +1 -0
  39. package/dist/tools/git.js +102 -0
  40. package/dist/tools/git.js.map +1 -0
  41. package/dist/tools/index.d.ts +37 -0
  42. package/dist/tools/index.d.ts.map +1 -0
  43. package/dist/tools/index.js +57 -0
  44. package/dist/tools/index.js.map +1 -0
  45. package/dist/tools/search.d.ts +2 -0
  46. package/dist/tools/search.d.ts.map +1 -0
  47. package/dist/tools/search.js +46 -0
  48. package/dist/tools/search.js.map +1 -0
  49. package/dist/ui.d.ts +44 -0
  50. package/dist/ui.d.ts.map +1 -0
  51. package/dist/ui.js +242 -0
  52. package/dist/ui.js.map +1 -0
  53. package/install.sh +76 -0
  54. package/package.json +38 -0
package/dist/cli.js ADDED
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env node
2
+ // K:BOT CLI — Terminal entry point
3
+ //
4
+ // Usage:
5
+ // $ kbot # Interactive REPL
6
+ // $ kbot "fix the auth bug" # One-shot with inline prompt
7
+ // $ kbot --agent researcher # Force specific agent
8
+ // $ kbot --model sonnet # Override model
9
+ // $ kbot auth # Configure API key
10
+ // $ kbot usage # Show usage stats
11
+ import { createInterface } from 'node:readline';
12
+ import { Command } from 'commander';
13
+ import { getApiKey, setupAuth, getUsageStats, loadConfig, verifyApiKey } from './auth.js';
14
+ import { runAndPrint, runAgent } from './agent.js';
15
+ import { gatherContext } from './context.js';
16
+ import { registerAllTools } from './tools/index.js';
17
+ import { clearHistory, clearMemory } from './memory.js';
18
+ import { banner, bannerCompact, bannerAuth, matrixConnect, prompt as kbotPrompt, printUsage, printError, printSuccess, printInfo, printResponse, printHelp, printGoodbye, } from './ui.js';
19
+ const VERSION = '1.0.0';
20
+ async function main() {
21
+ const program = new Command();
22
+ program
23
+ .name('kbot')
24
+ .description('K:BOT — Kernel Matrix Terminal Agent')
25
+ .version(VERSION)
26
+ .option('-a, --agent <agent>', 'Force a specific agent (kernel, researcher, coder, writer, analyst)')
27
+ .option('-m, --model <model>', 'Override AI model (auto, sonnet, haiku)')
28
+ .option('-s, --stream', 'Stream the response')
29
+ .option('--computer-use', 'Enable computer use tools (Enterprise only)')
30
+ .argument('[prompt...]', 'One-shot prompt');
31
+ // Sub-commands
32
+ program
33
+ .command('auth')
34
+ .description('Configure API key')
35
+ .action(async () => {
36
+ await authFlow();
37
+ });
38
+ program
39
+ .command('usage')
40
+ .description('Show usage statistics')
41
+ .action(async () => {
42
+ const stats = await getUsageStats();
43
+ if (!stats) {
44
+ printError('Could not fetch usage. Is your API key valid?');
45
+ process.exit(1);
46
+ }
47
+ printUsage(stats);
48
+ });
49
+ program.parse(process.argv);
50
+ const opts = program.opts();
51
+ const promptArgs = program.args;
52
+ // If a sub-command was run, we're done
53
+ if (program.args[0] === 'auth' || program.args[0] === 'usage')
54
+ return;
55
+ // Check for API key
56
+ const apiKey = getApiKey();
57
+ if (!apiKey) {
58
+ console.log(banner());
59
+ printInfo('No API key found. Let\'s connect you to the Matrix.');
60
+ console.log();
61
+ await authFlow();
62
+ return;
63
+ }
64
+ // Register tools
65
+ await registerAllTools();
66
+ // Gather project context (once at startup)
67
+ const context = gatherContext();
68
+ const config = loadConfig();
69
+ const tier = config?.tier || 'starter';
70
+ const agentOpts = {
71
+ agent: opts.agent || 'auto',
72
+ model: opts.model,
73
+ stream: opts.stream,
74
+ context,
75
+ tier,
76
+ };
77
+ // One-shot mode: kbot "fix the bug"
78
+ if (promptArgs.length > 0 && promptArgs[0] !== 'auth' && promptArgs[0] !== 'usage') {
79
+ console.log(bannerCompact());
80
+ const message = promptArgs.join(' ');
81
+ await runAndPrint(message, agentOpts);
82
+ return;
83
+ }
84
+ // Interactive REPL mode
85
+ await startRepl(agentOpts, context, tier);
86
+ }
87
+ async function authFlow() {
88
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
89
+ console.log(bannerAuth());
90
+ printInfo('Enter your API key (get one at kernel.chat/#/api-docs):');
91
+ console.log();
92
+ const key = await new Promise((resolve) => {
93
+ rl.question(' kn_live_', (answer) => {
94
+ resolve('kn_live_' + answer.trim());
95
+ rl.close();
96
+ });
97
+ });
98
+ if (!key.startsWith('kn_live_') || key.length < 12) {
99
+ printError('Invalid key format. Keys start with kn_live_');
100
+ process.exit(1);
101
+ }
102
+ printInfo('Connecting to Kernel Matrix...');
103
+ const result = await verifyApiKey(key);
104
+ if (!result.valid) {
105
+ printError(`Connection failed: ${result.error}`);
106
+ process.exit(1);
107
+ }
108
+ const ok = await setupAuth(key);
109
+ if (!ok) {
110
+ printError('Key verification failed. Check your key and try again.');
111
+ process.exit(1);
112
+ }
113
+ console.log();
114
+ console.log(matrixConnect(result.tier || 'starter', result.agents?.length || 5));
115
+ printSuccess('Ready. Run `kbot` to start.');
116
+ }
117
+ async function startRepl(agentOpts, context, tier) {
118
+ console.log(banner());
119
+ // Show connection info
120
+ const agentCount = tier === 'growth' || tier === 'enterprise' ? 17 : 5;
121
+ console.log(matrixConnect(tier, agentCount));
122
+ if (context.isGitRepo) {
123
+ printInfo(`Project: ${context.repoRoot?.split('/').pop() || 'unknown'} (${context.language || 'unknown'})`);
124
+ printInfo(`Branch: ${context.branch || 'unknown'}`);
125
+ console.log();
126
+ }
127
+ printInfo('Type a message, or /help for commands.');
128
+ console.log();
129
+ const rl = createInterface({
130
+ input: process.stdin,
131
+ output: process.stdout,
132
+ prompt: kbotPrompt(),
133
+ });
134
+ rl.prompt();
135
+ rl.on('line', async (line) => {
136
+ const input = line.trim();
137
+ if (!input) {
138
+ rl.prompt();
139
+ return;
140
+ }
141
+ // Slash commands
142
+ if (input.startsWith('/')) {
143
+ await handleSlashCommand(input, agentOpts, rl);
144
+ rl.prompt();
145
+ return;
146
+ }
147
+ // Run agent
148
+ try {
149
+ const response = await runAgent(input, agentOpts);
150
+ printResponse(response.agent, response.content);
151
+ if (response.usage) {
152
+ const { input_tokens, output_tokens, cost_usd } = response.usage;
153
+ printInfo(`${response.agent} · ${response.model} · ${input_tokens + output_tokens} tokens · $${cost_usd.toFixed(4)}${response.toolCalls > 0 ? ` · ${response.toolCalls} tool calls` : ''}`);
154
+ }
155
+ else if (response.agent === 'local') {
156
+ // Local execution — no tokens used, already printed by agent.ts
157
+ }
158
+ }
159
+ catch (err) {
160
+ printError(err instanceof Error ? err.message : String(err));
161
+ }
162
+ console.log();
163
+ rl.prompt();
164
+ });
165
+ rl.on('close', () => {
166
+ printGoodbye();
167
+ process.exit(0);
168
+ });
169
+ }
170
+ async function handleSlashCommand(input, opts, rl) {
171
+ const [cmd, ...args] = input.slice(1).split(' ');
172
+ switch (cmd) {
173
+ case 'help':
174
+ printHelp();
175
+ break;
176
+ case 'agent':
177
+ if (args[0]) {
178
+ opts.agent = args[0];
179
+ printSuccess(`Agent set to: ${args[0]}`);
180
+ }
181
+ else {
182
+ printInfo(`Current agent: ${opts.agent || 'auto'}`);
183
+ printInfo('Available: kernel, researcher, coder, writer, analyst (+ more with Growth tier)');
184
+ }
185
+ break;
186
+ case 'model':
187
+ if (args[0]) {
188
+ opts.model = args[0];
189
+ printSuccess(`Model set to: ${args[0]}`);
190
+ }
191
+ else {
192
+ printInfo(`Current model: ${opts.model || 'auto'}`);
193
+ }
194
+ break;
195
+ case 'usage': {
196
+ const stats = await getUsageStats();
197
+ if (stats)
198
+ printUsage(stats);
199
+ else
200
+ printError('Could not fetch usage stats');
201
+ break;
202
+ }
203
+ case 'clear':
204
+ clearHistory();
205
+ printSuccess('Conversation history cleared');
206
+ break;
207
+ case 'context':
208
+ if (opts.context) {
209
+ const { formatContextForPrompt } = await import('./context.js');
210
+ printInfo(formatContextForPrompt(opts.context));
211
+ }
212
+ else {
213
+ printInfo('No project context available');
214
+ }
215
+ break;
216
+ case 'memory':
217
+ if (args[0] === 'clear') {
218
+ clearMemory();
219
+ printSuccess('Persistent memory cleared');
220
+ }
221
+ else {
222
+ const { loadMemory } = await import('./memory.js');
223
+ const mem = loadMemory();
224
+ printInfo(mem || 'No memory entries yet');
225
+ }
226
+ break;
227
+ case 'quit':
228
+ case 'exit':
229
+ rl.close();
230
+ break;
231
+ default:
232
+ printError(`Unknown command: /${cmd}. Type /help for available commands.`);
233
+ }
234
+ }
235
+ // Run
236
+ main().catch((err) => {
237
+ console.error('Fatal error:', err);
238
+ process.exit(1);
239
+ });
240
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ProjectContext {
2
+ isGitRepo: boolean;
3
+ repoRoot?: string;
4
+ branch?: string;
5
+ language?: string;
6
+ framework?: string;
7
+ packageManager?: string;
8
+ fileTree: string;
9
+ recentChanges?: string;
10
+ }
11
+ /** Gather full project context. Called once at startup and cached. */
12
+ export declare function gatherContext(): ProjectContext;
13
+ /** Format context as a system prompt snippet */
14
+ export declare function formatContextForPrompt(ctx: ProjectContext): string;
15
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAiFD,sEAAsE;AACtE,wBAAgB,aAAa,IAAI,cAAc,CAgB9C;AAED,gDAAgD;AAChD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAwBlE"}
@@ -0,0 +1,128 @@
1
+ // K:BOT Context — Codebase awareness for smarter responses
2
+ // Gathers local project context to send with API requests.
3
+ // This reduces token waste: the agent knows your project structure upfront.
4
+ import { execSync } from 'node:child_process';
5
+ import { existsSync, readFileSync } from 'node:fs';
6
+ import { join, basename } from 'node:path';
7
+ /** Detect if we're in a git repository */
8
+ function getGitInfo() {
9
+ try {
10
+ const root = execSync('git rev-parse --show-toplevel', { encoding: 'utf-8', timeout: 5000 }).trim();
11
+ const branch = execSync('git branch --show-current', { encoding: 'utf-8', timeout: 5000 }).trim();
12
+ return { isGitRepo: true, root, branch };
13
+ }
14
+ catch {
15
+ return { isGitRepo: false };
16
+ }
17
+ }
18
+ /** Get a compact file tree (max depth 3) */
19
+ function getFileTree(root) {
20
+ try {
21
+ return execSync(`find ${root} -maxdepth 3 -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -not -path '*/.next/*' -not -path '*/build/*' -type f | head -100`, { encoding: 'utf-8', timeout: 10000 }).trim();
22
+ }
23
+ catch {
24
+ return '';
25
+ }
26
+ }
27
+ /** Detect project language and framework from package.json or other config files */
28
+ function detectStack(root) {
29
+ const result = {};
30
+ // Check for Node.js project
31
+ const pkgPath = join(root, 'package.json');
32
+ if (existsSync(pkgPath)) {
33
+ try {
34
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
35
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
36
+ result.language = deps.typescript ? 'TypeScript' : 'JavaScript';
37
+ if (deps.react || deps['react-dom'])
38
+ result.framework = 'React';
39
+ else if (deps.next)
40
+ result.framework = 'Next.js';
41
+ else if (deps.vue)
42
+ result.framework = 'Vue';
43
+ else if (deps.svelte)
44
+ result.framework = 'Svelte';
45
+ else if (deps.express)
46
+ result.framework = 'Express';
47
+ else if (deps.fastify)
48
+ result.framework = 'Fastify';
49
+ // Package manager
50
+ if (existsSync(join(root, 'bun.lockb')))
51
+ result.packageManager = 'bun';
52
+ else if (existsSync(join(root, 'pnpm-lock.yaml')))
53
+ result.packageManager = 'pnpm';
54
+ else if (existsSync(join(root, 'yarn.lock')))
55
+ result.packageManager = 'yarn';
56
+ else
57
+ result.packageManager = 'npm';
58
+ }
59
+ catch { /* ignore */ }
60
+ }
61
+ // Python
62
+ if (existsSync(join(root, 'pyproject.toml')) || existsSync(join(root, 'setup.py'))) {
63
+ result.language = result.language || 'Python';
64
+ }
65
+ // Rust
66
+ if (existsSync(join(root, 'Cargo.toml'))) {
67
+ result.language = 'Rust';
68
+ }
69
+ // Go
70
+ if (existsSync(join(root, 'go.mod'))) {
71
+ result.language = 'Go';
72
+ }
73
+ return result;
74
+ }
75
+ /** Get recent git changes for context */
76
+ function getRecentChanges() {
77
+ try {
78
+ return execSync('git diff --stat HEAD~3 2>/dev/null || echo "No recent changes"', {
79
+ encoding: 'utf-8', timeout: 5000,
80
+ }).trim();
81
+ }
82
+ catch {
83
+ return '';
84
+ }
85
+ }
86
+ /** Gather full project context. Called once at startup and cached. */
87
+ export function gatherContext() {
88
+ const git = getGitInfo();
89
+ const root = git.root || process.cwd();
90
+ const stack = detectStack(root);
91
+ const fileTree = getFileTree(root);
92
+ return {
93
+ isGitRepo: git.isGitRepo,
94
+ repoRoot: git.root,
95
+ branch: git.branch,
96
+ language: stack.language,
97
+ framework: stack.framework,
98
+ packageManager: stack.packageManager,
99
+ fileTree,
100
+ recentChanges: git.isGitRepo ? getRecentChanges() : undefined,
101
+ };
102
+ }
103
+ /** Format context as a system prompt snippet */
104
+ export function formatContextForPrompt(ctx) {
105
+ const parts = ['[Project Context]'];
106
+ if (ctx.isGitRepo) {
107
+ parts.push(`Repository: ${basename(ctx.repoRoot || process.cwd())}`);
108
+ parts.push(`Branch: ${ctx.branch || 'unknown'}`);
109
+ }
110
+ if (ctx.language)
111
+ parts.push(`Language: ${ctx.language}`);
112
+ if (ctx.framework)
113
+ parts.push(`Framework: ${ctx.framework}`);
114
+ if (ctx.packageManager)
115
+ parts.push(`Package Manager: ${ctx.packageManager}`);
116
+ if (ctx.fileTree) {
117
+ const files = ctx.fileTree.split('\n').slice(0, 30);
118
+ parts.push(`\nKey files:\n${files.join('\n')}`);
119
+ if (ctx.fileTree.split('\n').length > 30) {
120
+ parts.push(`... and ${ctx.fileTree.split('\n').length - 30} more files`);
121
+ }
122
+ }
123
+ if (ctx.recentChanges) {
124
+ parts.push(`\nRecent changes:\n${ctx.recentChanges}`);
125
+ }
126
+ return parts.join('\n');
127
+ }
128
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** Load memory context. Returns empty string if none exists. */
2
+ export declare function loadMemory(): string;
3
+ /** Append a memory entry. Used by the agent to remember things. */
4
+ export declare function appendMemory(entry: string): void;
5
+ /** Clear all memory */
6
+ export declare function clearMemory(): void;
7
+ /** Get memory for inclusion in system prompt */
8
+ export declare function getMemoryPrompt(): string;
9
+ /** Conversation history for current session */
10
+ export interface ConversationTurn {
11
+ role: 'user' | 'assistant';
12
+ content: string;
13
+ }
14
+ /** Add a turn to session history */
15
+ export declare function addTurn(turn: ConversationTurn): void;
16
+ /** Get session history */
17
+ export declare function getHistory(): ConversationTurn[];
18
+ /** Clear session history */
19
+ export declare function clearHistory(): void;
20
+ /** Get the previous_messages array for the API */
21
+ export declare function getPreviousMessages(): Array<{
22
+ role: string;
23
+ content: string;
24
+ }>;
25
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAkBA,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,MAAM,CAgBnC;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,uBAAuB;AACvB,wBAAgB,WAAW,IAAI,IAAI,CAGlC;AAED,gDAAgD;AAChD,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;CAChB;AAID,oCAAoC;AACpC,wBAAgB,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAMpD;AAED,0BAA0B;AAC1B,wBAAgB,UAAU,IAAI,gBAAgB,EAAE,CAE/C;AAED,4BAA4B;AAC5B,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAG9E"}
package/dist/memory.js ADDED
@@ -0,0 +1,75 @@
1
+ // K:BOT Memory — Persistent local memory across sessions
2
+ // Stored in ~/.kbot/memory/context.md
3
+ // Keeps track of accumulated knowledge about the user's projects
4
+ import { homedir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'node:fs';
7
+ const MEMORY_DIR = join(homedir(), '.kbot', 'memory');
8
+ const CONTEXT_FILE = join(MEMORY_DIR, 'context.md');
9
+ const MAX_MEMORY_SIZE = 50_000; // 50KB max — keeps token usage reasonable
10
+ function ensureMemoryDir() {
11
+ if (!existsSync(MEMORY_DIR)) {
12
+ mkdirSync(MEMORY_DIR, { recursive: true });
13
+ }
14
+ }
15
+ /** Load memory context. Returns empty string if none exists. */
16
+ export function loadMemory() {
17
+ ensureMemoryDir();
18
+ if (!existsSync(CONTEXT_FILE))
19
+ return '';
20
+ try {
21
+ const content = readFileSync(CONTEXT_FILE, 'utf-8');
22
+ // Truncate if too large (keep the most recent entries)
23
+ if (content.length > MAX_MEMORY_SIZE) {
24
+ const lines = content.split('\n');
25
+ const truncated = lines.slice(-500).join('\n');
26
+ writeFileSync(CONTEXT_FILE, truncated);
27
+ return truncated;
28
+ }
29
+ return content;
30
+ }
31
+ catch {
32
+ return '';
33
+ }
34
+ }
35
+ /** Append a memory entry. Used by the agent to remember things. */
36
+ export function appendMemory(entry) {
37
+ ensureMemoryDir();
38
+ const timestamp = new Date().toISOString().split('T')[0];
39
+ appendFileSync(CONTEXT_FILE, `\n## ${timestamp}\n${entry}\n`);
40
+ }
41
+ /** Clear all memory */
42
+ export function clearMemory() {
43
+ ensureMemoryDir();
44
+ writeFileSync(CONTEXT_FILE, '# K:BOT Memory\n\nPersistent knowledge across sessions.\n');
45
+ }
46
+ /** Get memory for inclusion in system prompt */
47
+ export function getMemoryPrompt() {
48
+ const memory = loadMemory();
49
+ if (!memory.trim())
50
+ return '';
51
+ return `\n[Persistent Memory]\n${memory}\n`;
52
+ }
53
+ let sessionHistory = [];
54
+ /** Add a turn to session history */
55
+ export function addTurn(turn) {
56
+ sessionHistory.push(turn);
57
+ // Keep last 20 turns to control context size
58
+ if (sessionHistory.length > 20) {
59
+ sessionHistory = sessionHistory.slice(-20);
60
+ }
61
+ }
62
+ /** Get session history */
63
+ export function getHistory() {
64
+ return sessionHistory;
65
+ }
66
+ /** Clear session history */
67
+ export function clearHistory() {
68
+ sessionHistory = [];
69
+ }
70
+ /** Get the previous_messages array for the API */
71
+ export function getPreviousMessages() {
72
+ // Send last 6 turns to keep token usage efficient
73
+ return sessionHistory.slice(-6).map(t => ({ role: t.role, content: t.content }));
74
+ }
75
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerBashTools(): void;
2
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAgCA,wBAAgB,iBAAiB,IAAI,IAAI,CAuCxC"}
@@ -0,0 +1,63 @@
1
+ // K:BOT Bash Tool — Execute shell commands with safety checks
2
+ // All execution is local — zero API calls.
3
+ import { execSync } from 'node:child_process';
4
+ import { registerTool } from './index.js';
5
+ /** Dangerous command patterns that are blocked by default */
6
+ const BLOCKED_PATTERNS = [
7
+ /^rm\s+-rf\s+\/\s*$/, // rm -rf /
8
+ /^rm\s+-rf\s+~\s*$/, // rm -rf ~
9
+ /^sudo\s+rm/, // sudo rm
10
+ /^mkfs/, // format filesystem
11
+ /^dd\s+if=/, // raw disk write
12
+ /^:(){ :\|:& };:/, // fork bomb
13
+ />\s*\/dev\/sd[a-z]/, // write to raw disk
14
+ /^shutdown/, // shutdown
15
+ /^reboot/, // reboot
16
+ /^halt/, // halt
17
+ ];
18
+ function isCommandSafe(command) {
19
+ const trimmed = command.trim();
20
+ for (const pattern of BLOCKED_PATTERNS) {
21
+ if (pattern.test(trimmed)) {
22
+ return { safe: false, reason: `Blocked: matches dangerous pattern ${pattern}` };
23
+ }
24
+ }
25
+ return { safe: true };
26
+ }
27
+ export function registerBashTools() {
28
+ registerTool({
29
+ name: 'bash',
30
+ description: 'Execute a shell command and return stdout/stderr. Use for system commands, builds, installs, and other terminal operations.',
31
+ parameters: {
32
+ command: { type: 'string', description: 'The shell command to execute', required: true },
33
+ timeout: { type: 'number', description: 'Timeout in milliseconds (default: 120000, max: 600000)' },
34
+ },
35
+ tier: 'starter',
36
+ async execute(args) {
37
+ const command = String(args.command);
38
+ const timeout = Math.min(typeof args.timeout === 'number' ? args.timeout : 120_000, 600_000);
39
+ // Safety check
40
+ const check = isCommandSafe(command);
41
+ if (!check.safe) {
42
+ return `Error: Command blocked for safety. ${check.reason}`;
43
+ }
44
+ try {
45
+ const result = execSync(command, {
46
+ encoding: 'utf-8',
47
+ timeout,
48
+ maxBuffer: 10 * 1024 * 1024, // 10MB
49
+ stdio: ['pipe', 'pipe', 'pipe'],
50
+ });
51
+ return result.trim() || '(no output)';
52
+ }
53
+ catch (err) {
54
+ const e = err;
55
+ const stderr = e.stderr?.trim() || '';
56
+ const stdout = e.stdout?.trim() || '';
57
+ const output = [stdout, stderr].filter(Boolean).join('\n');
58
+ return `Exit code ${e.status || 1}\n${output || e.message || 'Command failed'}`;
59
+ }
60
+ },
61
+ });
62
+ }
63
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerBrowserTools(): void;
2
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"AAmCA,wBAAgB,oBAAoB,IAAI,IAAI,CAwF3C"}