@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.
- package/dist/agent.d.ts +36 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +211 -0
- package/dist/agent.js.map +1 -0
- package/dist/auth.d.ts +43 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +108 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +240 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +15 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +128 -0
- package/dist/context.js.map +1 -0
- package/dist/memory.d.ts +25 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +75 -0
- package/dist/memory.js.map +1 -0
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +63 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/browser.d.ts +2 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +116 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/computer.d.ts +2 -0
- package/dist/tools/computer.d.ts.map +1 -0
- package/dist/tools/computer.js +176 -0
- package/dist/tools/computer.js.map +1 -0
- package/dist/tools/files.d.ts +2 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +147 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/git.d.ts +2 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +102 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/index.d.ts +37 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +57 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.d.ts +2 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +46 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/ui.d.ts +44 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +242 -0
- package/dist/ui.js.map +1 -0
- package/install.sh +76 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -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"}
|
package/dist/context.js
ADDED
|
@@ -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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"}
|
package/dist/memory.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"AAmCA,wBAAgB,oBAAoB,IAAI,IAAI,CAwF3C"}
|