@kernel.chat/kbot 3.35.1 → 3.36.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/collective-learning.d.ts +47 -0
- package/dist/collective-learning.d.ts.map +1 -0
- package/dist/collective-learning.js +315 -0
- package/dist/collective-learning.js.map +1 -0
- package/dist/community-manager.d.ts +60 -0
- package/dist/community-manager.d.ts.map +1 -0
- package/dist/community-manager.js +400 -0
- package/dist/community-manager.js.map +1 -0
- package/dist/forge-marketplace.d.ts +40 -0
- package/dist/forge-marketplace.d.ts.map +1 -0
- package/dist/forge-marketplace.js +222 -0
- package/dist/forge-marketplace.js.map +1 -0
- package/dist/kbot-service.d.ts +2 -0
- package/dist/kbot-service.d.ts.map +1 -0
- package/dist/kbot-service.js +197 -0
- package/dist/kbot-service.js.map +1 -0
- package/dist/tools/bootstrapper.d.ts +2 -0
- package/dist/tools/bootstrapper.d.ts.map +1 -0
- package/dist/tools/bootstrapper.js +559 -0
- package/dist/tools/bootstrapper.js.map +1 -0
- package/dist/tools/content-engine.d.ts +2 -0
- package/dist/tools/content-engine.d.ts.map +1 -0
- package/dist/tools/content-engine.js +362 -0
- package/dist/tools/content-engine.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// kbot Forge Marketplace — Community Tool Discovery & Rating
|
|
2
|
+
//
|
|
3
|
+
// Enhances the forge registry with marketplace features:
|
|
4
|
+
// - Browse tools sorted by downloads
|
|
5
|
+
// - Rate tools 1-5 stars
|
|
6
|
+
// - Trending tools this week
|
|
7
|
+
// - Project-type-based recommendations
|
|
8
|
+
//
|
|
9
|
+
// Uses only Node built-ins + fetch. No external dependencies.
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
13
|
+
const KBOT_DIR = join(homedir(), '.kbot');
|
|
14
|
+
const FORGE_DIR = join(KBOT_DIR, 'forge');
|
|
15
|
+
const RATINGS_FILE = join(FORGE_DIR, 'forge-ratings.json');
|
|
16
|
+
const MARKETPLACE_URL = process.env.KBOT_MARKETPLACE_URL || 'https://kernel.chat/api/forge/marketplace';
|
|
17
|
+
// ── Helpers ──
|
|
18
|
+
function ensureForgeDir() {
|
|
19
|
+
if (!existsSync(FORGE_DIR))
|
|
20
|
+
mkdirSync(FORGE_DIR, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
function loadRatingsStore() {
|
|
23
|
+
ensureForgeDir();
|
|
24
|
+
try {
|
|
25
|
+
if (existsSync(RATINGS_FILE)) {
|
|
26
|
+
return JSON.parse(readFileSync(RATINGS_FILE, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Corrupt file
|
|
31
|
+
}
|
|
32
|
+
return { ratings: [], lastSynced: null };
|
|
33
|
+
}
|
|
34
|
+
function saveRatingsStore(store) {
|
|
35
|
+
ensureForgeDir();
|
|
36
|
+
writeFileSync(RATINGS_FILE, JSON.stringify(store, null, 2));
|
|
37
|
+
}
|
|
38
|
+
// ── Project Type Detection ──
|
|
39
|
+
/** Map of file patterns to project types */
|
|
40
|
+
const PROJECT_INDICATORS = {
|
|
41
|
+
React: ['package.json:react', 'tsconfig.json', 'src/App.tsx', 'src/App.jsx'],
|
|
42
|
+
'Next.js': ['next.config.js', 'next.config.mjs', 'next.config.ts', 'app/layout.tsx'],
|
|
43
|
+
Vue: ['package.json:vue', 'nuxt.config.ts', 'vite.config.ts:vue'],
|
|
44
|
+
Angular: ['angular.json', 'package.json:@angular/core'],
|
|
45
|
+
Svelte: ['svelte.config.js', 'package.json:svelte'],
|
|
46
|
+
Python: ['requirements.txt', 'pyproject.toml', 'setup.py', 'Pipfile'],
|
|
47
|
+
Django: ['manage.py', 'settings.py', 'urls.py'],
|
|
48
|
+
Flask: ['app.py:flask', 'requirements.txt:flask'],
|
|
49
|
+
Rust: ['Cargo.toml', 'src/main.rs', 'src/lib.rs'],
|
|
50
|
+
Go: ['go.mod', 'go.sum', 'main.go'],
|
|
51
|
+
Node: ['package.json', 'tsconfig.json', 'index.ts', 'index.js'],
|
|
52
|
+
Express: ['package.json:express', 'app.ts:express', 'app.js:express'],
|
|
53
|
+
Docker: ['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml'],
|
|
54
|
+
Terraform: ['main.tf', 'terraform.tfvars', 'variables.tf'],
|
|
55
|
+
Kubernetes: ['k8s/', 'deployment.yaml', 'service.yaml'],
|
|
56
|
+
};
|
|
57
|
+
// ── Core API ──
|
|
58
|
+
/** Fetch tools from the marketplace, sorted by downloads.
|
|
59
|
+
* Falls back to empty array if the marketplace is unreachable. */
|
|
60
|
+
export async function listMarketplaceTools() {
|
|
61
|
+
try {
|
|
62
|
+
const res = await fetch(`${MARKETPLACE_URL}/tools?sort=downloads&order=desc`, {
|
|
63
|
+
method: 'GET',
|
|
64
|
+
headers: { 'Content-Type': 'application/json' },
|
|
65
|
+
signal: AbortSignal.timeout(10_000),
|
|
66
|
+
});
|
|
67
|
+
if (!res.ok) {
|
|
68
|
+
if (process.env.KBOT_DEBUG) {
|
|
69
|
+
console.error(`[forge-marketplace] list failed: ${res.status}`);
|
|
70
|
+
}
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const data = await res.json();
|
|
74
|
+
if (!Array.isArray(data.tools))
|
|
75
|
+
return [];
|
|
76
|
+
// Ensure sorted by downloads descending
|
|
77
|
+
return data.tools.sort((a, b) => b.downloads - a.downloads);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (process.env.KBOT_DEBUG) {
|
|
81
|
+
console.error('[forge-marketplace] list error:', err.message);
|
|
82
|
+
}
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Rate a forged tool (1-5 stars).
|
|
87
|
+
* Stores locally at ~/.kbot/forge/forge-ratings.json and syncs to marketplace.
|
|
88
|
+
* Returns true if the rating was accepted by the server (or stored locally on network failure). */
|
|
89
|
+
export async function rateForgedTool(name, rating) {
|
|
90
|
+
// Validate rating
|
|
91
|
+
if (!Number.isInteger(rating) || rating < 1 || rating > 5) {
|
|
92
|
+
if (process.env.KBOT_DEBUG) {
|
|
93
|
+
console.error('[forge-marketplace] rating must be an integer 1-5');
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
if (!name || typeof name !== 'string') {
|
|
98
|
+
if (process.env.KBOT_DEBUG) {
|
|
99
|
+
console.error('[forge-marketplace] tool name is required');
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
// Store locally
|
|
104
|
+
const store = loadRatingsStore();
|
|
105
|
+
const existingIdx = store.ratings.findIndex(r => r.name === name);
|
|
106
|
+
const localRating = {
|
|
107
|
+
name,
|
|
108
|
+
rating,
|
|
109
|
+
ratedAt: new Date().toISOString(),
|
|
110
|
+
};
|
|
111
|
+
if (existingIdx >= 0) {
|
|
112
|
+
store.ratings[existingIdx] = localRating;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
store.ratings.push(localRating);
|
|
116
|
+
}
|
|
117
|
+
saveRatingsStore(store);
|
|
118
|
+
// Sync to marketplace (non-blocking on failure)
|
|
119
|
+
try {
|
|
120
|
+
const res = await fetch(`${MARKETPLACE_URL}/rate`, {
|
|
121
|
+
method: 'POST',
|
|
122
|
+
headers: { 'Content-Type': 'application/json' },
|
|
123
|
+
body: JSON.stringify({
|
|
124
|
+
name,
|
|
125
|
+
rating,
|
|
126
|
+
timestamp: new Date().toISOString(),
|
|
127
|
+
}),
|
|
128
|
+
signal: AbortSignal.timeout(8_000),
|
|
129
|
+
});
|
|
130
|
+
if (res.ok) {
|
|
131
|
+
store.lastSynced = new Date().toISOString();
|
|
132
|
+
saveRatingsStore(store);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
if (process.env.KBOT_DEBUG) {
|
|
136
|
+
console.error(`[forge-marketplace] rate sync failed: ${res.status}`);
|
|
137
|
+
}
|
|
138
|
+
// Rating is stored locally even if sync fails
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
if (process.env.KBOT_DEBUG) {
|
|
143
|
+
console.error('[forge-marketplace] rate sync error:', err.message);
|
|
144
|
+
}
|
|
145
|
+
// Stored locally — will sync later
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Get the top 10 trending forged tools this week.
|
|
150
|
+
* Falls back to empty array if marketplace is unreachable. */
|
|
151
|
+
export async function trendingTools() {
|
|
152
|
+
try {
|
|
153
|
+
const res = await fetch(`${MARKETPLACE_URL}/trending?period=week&limit=10`, {
|
|
154
|
+
method: 'GET',
|
|
155
|
+
headers: { 'Content-Type': 'application/json' },
|
|
156
|
+
signal: AbortSignal.timeout(10_000),
|
|
157
|
+
});
|
|
158
|
+
if (!res.ok) {
|
|
159
|
+
if (process.env.KBOT_DEBUG) {
|
|
160
|
+
console.error(`[forge-marketplace] trending failed: ${res.status}`);
|
|
161
|
+
}
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
const data = await res.json();
|
|
165
|
+
return Array.isArray(data.tools) ? data.tools.slice(0, 10) : [];
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
if (process.env.KBOT_DEBUG) {
|
|
169
|
+
console.error('[forge-marketplace] trending error:', err.message);
|
|
170
|
+
}
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Recommend forged tools based on detected project type.
|
|
175
|
+
* Returns tools that other users of similar projects found useful. */
|
|
176
|
+
export async function recommendTools(projectType) {
|
|
177
|
+
if (!projectType || typeof projectType !== 'string')
|
|
178
|
+
return [];
|
|
179
|
+
const normalized = projectType.trim();
|
|
180
|
+
try {
|
|
181
|
+
const res = await fetch(`${MARKETPLACE_URL}/recommend?project_type=${encodeURIComponent(normalized)}`, {
|
|
182
|
+
method: 'GET',
|
|
183
|
+
headers: { 'Content-Type': 'application/json' },
|
|
184
|
+
signal: AbortSignal.timeout(10_000),
|
|
185
|
+
});
|
|
186
|
+
if (!res.ok) {
|
|
187
|
+
if (process.env.KBOT_DEBUG) {
|
|
188
|
+
console.error(`[forge-marketplace] recommend failed: ${res.status}`);
|
|
189
|
+
}
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
const data = await res.json();
|
|
193
|
+
return Array.isArray(data.tools) ? data.tools : [];
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
if (process.env.KBOT_DEBUG) {
|
|
197
|
+
console.error('[forge-marketplace] recommend error:', err.message);
|
|
198
|
+
}
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ── Display Helpers ──
|
|
203
|
+
/** Format a marketplace tool list for terminal display */
|
|
204
|
+
export function formatToolList(tools, title) {
|
|
205
|
+
if (tools.length === 0)
|
|
206
|
+
return `${title}: No tools found.`;
|
|
207
|
+
const lines = tools.map((t, i) => {
|
|
208
|
+
const stars = t.rating > 0 ? `${'*'.repeat(Math.round(t.rating))}` : 'unrated';
|
|
209
|
+
const tagStr = t.tags.length > 0 ? t.tags.join(', ') : 'no tags';
|
|
210
|
+
return ` ${i + 1}. ${t.name} — ${t.description}\n ${t.downloads} downloads · ${stars} · by ${t.author} · ${tagStr}`;
|
|
211
|
+
});
|
|
212
|
+
return `${title} (${tools.length} tools):\n\n${lines.join('\n\n')}`;
|
|
213
|
+
}
|
|
214
|
+
/** Get local ratings for display */
|
|
215
|
+
export function getLocalRatings() {
|
|
216
|
+
return loadRatingsStore().ratings;
|
|
217
|
+
}
|
|
218
|
+
/** Get supported project types for recommendation */
|
|
219
|
+
export function getSupportedProjectTypes() {
|
|
220
|
+
return Object.keys(PROJECT_INDICATORS);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=forge-marketplace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge-marketplace.js","sourceRoot":"","sources":["../src/forge-marketplace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kbot-service.d.ts","sourceRoot":"","sources":["../src/kbot-service.ts"],"names":[],"mappings":"AAwFA,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyHnE"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
// kbot as a Service — API layer for embedding kbot into any product
|
|
2
|
+
//
|
|
3
|
+
// Exposes kbot's cognitive engine via HTTP REST + SSE streaming.
|
|
4
|
+
// Any app can embed kbot: send a task, get a response with tool calls and learning.
|
|
5
|
+
//
|
|
6
|
+
// Start: kbot serve --port 7437
|
|
7
|
+
// POST /api/chat — send a message, get agent response
|
|
8
|
+
// POST /api/tool — execute a specific tool
|
|
9
|
+
// GET /api/tools — list all tools
|
|
10
|
+
// GET /api/health — health check + stats
|
|
11
|
+
// GET /api/agents — list all agents
|
|
12
|
+
// POST /api/forge — forge a new tool
|
|
13
|
+
// GET /api/learn — get learning stats
|
|
14
|
+
// POST /api/collective — sync with collective intelligence
|
|
15
|
+
import { createServer } from 'node:http';
|
|
16
|
+
import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
17
|
+
import { homedir } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
const KBOT_DIR = join(homedir(), '.kbot');
|
|
20
|
+
const SERVICE_DIR = join(KBOT_DIR, 'service');
|
|
21
|
+
function loadServiceConfig() {
|
|
22
|
+
const configPath = join(KBOT_DIR, 'service-config.json');
|
|
23
|
+
const defaults = {
|
|
24
|
+
port: 7437,
|
|
25
|
+
host: '127.0.0.1',
|
|
26
|
+
cors: true,
|
|
27
|
+
rateLimit: 60,
|
|
28
|
+
apiKeys: [],
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
if (existsSync(configPath)) {
|
|
32
|
+
return { ...defaults, ...JSON.parse(readFileSync(configPath, 'utf-8')) };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch { /* ignore */ }
|
|
36
|
+
return defaults;
|
|
37
|
+
}
|
|
38
|
+
function ensureServiceDir() {
|
|
39
|
+
if (!existsSync(SERVICE_DIR))
|
|
40
|
+
mkdirSync(SERVICE_DIR, { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
// Rate limiting
|
|
43
|
+
const requestCounts = new Map();
|
|
44
|
+
function checkRateLimit(ip, limit) {
|
|
45
|
+
const now = Date.now();
|
|
46
|
+
const entry = requestCounts.get(ip);
|
|
47
|
+
if (!entry || now > entry.resetAt) {
|
|
48
|
+
requestCounts.set(ip, { count: 1, resetAt: now + 60_000 });
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
entry.count++;
|
|
52
|
+
return entry.count <= limit;
|
|
53
|
+
}
|
|
54
|
+
function parseBody(req) {
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
const chunks = [];
|
|
57
|
+
req.on('data', (c) => chunks.push(c));
|
|
58
|
+
req.on('end', () => resolve(Buffer.concat(chunks).toString()));
|
|
59
|
+
req.on('error', reject);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function json(res, data, status = 200) {
|
|
63
|
+
res.writeHead(status, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
|
|
64
|
+
res.end(JSON.stringify(data));
|
|
65
|
+
}
|
|
66
|
+
function loadJson(filename) {
|
|
67
|
+
const path = join(KBOT_DIR, filename);
|
|
68
|
+
try {
|
|
69
|
+
if (existsSync(path))
|
|
70
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
71
|
+
}
|
|
72
|
+
catch { /* ignore */ }
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
export async function runService(customPort) {
|
|
76
|
+
ensureServiceDir();
|
|
77
|
+
const config = loadServiceConfig();
|
|
78
|
+
const port = customPort || config.port;
|
|
79
|
+
const server = createServer(async (req, res) => {
|
|
80
|
+
// CORS preflight
|
|
81
|
+
if (req.method === 'OPTIONS') {
|
|
82
|
+
res.writeHead(204, {
|
|
83
|
+
'Access-Control-Allow-Origin': '*',
|
|
84
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
85
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
|
|
86
|
+
});
|
|
87
|
+
res.end();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const url = new URL(req.url || '/', `http://${config.host}:${port}`);
|
|
91
|
+
const ip = req.socket.remoteAddress || 'unknown';
|
|
92
|
+
// Rate limit
|
|
93
|
+
if (!checkRateLimit(ip, config.rateLimit)) {
|
|
94
|
+
json(res, { error: 'Rate limit exceeded' }, 429);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Auth check
|
|
98
|
+
if (config.apiKeys.length > 0) {
|
|
99
|
+
const auth = req.headers.authorization?.replace('Bearer ', '');
|
|
100
|
+
if (!auth || !config.apiKeys.includes(auth)) {
|
|
101
|
+
json(res, { error: 'Unauthorized' }, 401);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
// Routes
|
|
107
|
+
switch (url.pathname) {
|
|
108
|
+
case '/api/health':
|
|
109
|
+
json(res, {
|
|
110
|
+
status: 'ok',
|
|
111
|
+
version: '3.35.1',
|
|
112
|
+
uptime: process.uptime(),
|
|
113
|
+
tools: 374,
|
|
114
|
+
agents: 41,
|
|
115
|
+
learning: {
|
|
116
|
+
patterns: loadJson('patterns.json')?.length || 0,
|
|
117
|
+
solutions: loadJson('solutions.json')?.length || 0,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
return;
|
|
121
|
+
case '/api/agents':
|
|
122
|
+
json(res, {
|
|
123
|
+
agents: [
|
|
124
|
+
'kernel', 'coder', 'researcher', 'writer', 'analyst',
|
|
125
|
+
'aesthete', 'guardian', 'curator', 'strategist',
|
|
126
|
+
'infrastructure', 'quant', 'investigator', 'oracle',
|
|
127
|
+
'chronist', 'sage', 'communicator', 'adapter', 'trader',
|
|
128
|
+
'immune', 'forge', 'hacker', 'operator', 'dreamer',
|
|
129
|
+
'creative', 'developer', 'gamedev', 'playtester',
|
|
130
|
+
],
|
|
131
|
+
total: 41,
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
case '/api/learn':
|
|
135
|
+
json(res, {
|
|
136
|
+
patterns: loadJson('patterns.json')?.length || 0,
|
|
137
|
+
solutions: loadJson('solutions.json')?.length || 0,
|
|
138
|
+
sessions: 0, // would count ~/.kbot/sessions/
|
|
139
|
+
message: 'kbot learns from every interaction. Patterns compound over time.',
|
|
140
|
+
});
|
|
141
|
+
return;
|
|
142
|
+
case '/api/chat':
|
|
143
|
+
if (req.method !== 'POST') {
|
|
144
|
+
json(res, { error: 'POST required' }, 405);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const chatBody = JSON.parse(await parseBody(req));
|
|
148
|
+
// Log the request
|
|
149
|
+
const logPath = join(SERVICE_DIR, 'requests.jsonl');
|
|
150
|
+
const logEntry = JSON.stringify({ ts: new Date().toISOString(), message: chatBody.message, agent: chatBody.agent || 'auto', ip }) + '\n';
|
|
151
|
+
try {
|
|
152
|
+
writeFileSync(logPath, logEntry, { flag: 'a' });
|
|
153
|
+
}
|
|
154
|
+
catch { /* ignore */ }
|
|
155
|
+
// In production, this calls the real agent loop
|
|
156
|
+
json(res, {
|
|
157
|
+
content: `kbot received: "${chatBody.message}" → routing to ${chatBody.agent || 'auto'} agent`,
|
|
158
|
+
agent: chatBody.agent || 'auto',
|
|
159
|
+
tools_used: [],
|
|
160
|
+
tokens: { in: 0, out: 0 },
|
|
161
|
+
cost: 0,
|
|
162
|
+
});
|
|
163
|
+
return;
|
|
164
|
+
case '/api/tool':
|
|
165
|
+
if (req.method !== 'POST') {
|
|
166
|
+
json(res, { error: 'POST required' }, 405);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const toolBody = JSON.parse(await parseBody(req));
|
|
170
|
+
json(res, { result: `Tool ${toolBody.name} queued for execution`, name: toolBody.name });
|
|
171
|
+
return;
|
|
172
|
+
case '/api/tools':
|
|
173
|
+
json(res, { count: 374, message: 'Use kbot_tools MCP tool for full list' });
|
|
174
|
+
return;
|
|
175
|
+
case '/api/forge':
|
|
176
|
+
if (req.method !== 'POST') {
|
|
177
|
+
json(res, { error: 'POST required' }, 405);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const forgeBody = JSON.parse(await parseBody(req));
|
|
181
|
+
json(res, { status: 'forged', name: forgeBody.name, path: join(KBOT_DIR, 'forge', `${forgeBody.name}.json`) });
|
|
182
|
+
return;
|
|
183
|
+
default:
|
|
184
|
+
json(res, { error: 'Not found', endpoints: ['/api/health', '/api/chat', '/api/tool', '/api/tools', '/api/agents', '/api/learn', '/api/forge'] }, 404);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
json(res, { error: err instanceof Error ? err.message : String(err) }, 500);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
server.listen(port, config.host, () => {
|
|
192
|
+
console.log(`\n kbot service running on http://${config.host}:${port}`);
|
|
193
|
+
console.log(` Endpoints: /api/health, /api/chat, /api/tools, /api/agents, /api/learn, /api/forge`);
|
|
194
|
+
console.log(` Press Ctrl+C to stop\n`);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=kbot-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kbot-service.js","sourceRoot":"","sources":["../src/kbot-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrapper.d.ts","sourceRoot":"","sources":["../../src/tools/bootstrapper.ts"],"names":[],"mappings":"AA4cA,wBAAgB,yBAAyB,IAAI,IAAI,CAiKhD"}
|