@kernel.chat/kbot 3.99.35 → 4.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  <p align="center">
4
4
  <strong>kbot</strong><br>
5
- Open-source terminal AI agent. 787+ tools. 35 agents. 20 providers. Dreams, learns, watches your system, controls your phone. $0 local.
5
+ Open-source terminal AI agent. 100+ specialist skills. 35 specialist agents. 20 providers. Dreams, learns, watches your system, controls your phone. $0 local.
6
6
  </p>
7
7
 
8
8
  <p align="center">
@@ -31,7 +31,8 @@ Most terminal AI agents lock you into one provider, one model, one way of workin
31
31
  - **Runs fully offline** — Embedded llama.cpp, Ollama, LM Studio, or Jan. $0, fully private.
32
32
  - **Learns your patterns** — Bayesian skill ratings + pattern extraction. Gets faster over time.
33
33
  - **35 specialist agents** — auto-routes your request to the right expert (coder, researcher, writer, guardian, quant, and 30 more). Run any agent manually: `kbot --agent <id> "<prompt>"`. List them: `kbot agents`.
34
- - **787+ tools** — files, bash, git, GitHub, web search, deploy, database, game dev, VFX, research, science, finance, security, music production, iPhone control, and more.
34
+ - **100+ specialist skills** — files, bash, git, GitHub, web search, deploy, database, game dev, VFX, research, science, finance, security, music production, iPhone control, and more.
35
+ - **v4.0 evidence-based curation** — went from 670 skills to ~100. Every kept skill has telemetry, agent reference, or test coverage. Everything else moved to plugins.
35
36
  - **Programmatic SDK** — use kbot as a library in your own apps.
36
37
  - **MCP server built in** — plug kbot into Claude Code, Cursor, VS Code, Zed, or Neovim as a tool provider.
37
38
 
@@ -165,8 +166,8 @@ Checks security, documentation, code quality, CI/CD, community health, and DevOp
165
166
  |---|---|---|---|---|---|
166
167
  | AI providers | 20 | 1 | 1 | 6 | 75+ |
167
168
  | Specialist agents | 35 | 0 | 0 | 0 | 0 |
168
- | Built-in tools | 787+ | ~20 | ~15 | ~10 | ~15 |
169
- | Science tools | 114 | 0 | 0 | 0 | 0 |
169
+ | Built-in skills | 100+ | ~20 | ~15 | ~10 | ~15 |
170
+ | Science skills | included | 0 | 0 | 0 | 0 |
170
171
  | Memory system | 7-tier bidirectional | File-based | No | No | No |
171
172
  | Dream engine | Yes ($0 local) | Cloud API | No | No | No |
172
173
  | Service watchdog | Yes | No | No | No | No |
@@ -228,7 +229,9 @@ kbot auto-routes to the right agent for each task. Or pick one with `--agent <na
228
229
  | **Domain** | infrastructure, quant, investigator, oracle, chronist, sage, communicator, adapter |
229
230
  | **Presets** | claude-code, cursor, copilot, creative, developer |
230
231
 
231
- ## 686+ Tools
232
+ ## 100+ Specialist Skills
233
+
234
+ As of v4.0, kbot ships ~100 curated skills (down from 670 — every kept skill has telemetry, agent reference, or test coverage). The rest are available as plugins.
232
235
 
233
236
  | Category | Examples |
234
237
  |----------|---------|
@@ -320,7 +323,7 @@ graph TD
320
323
  D -->|Multi-step| F[Autonomous Planner]
321
324
  E --> G[Provider API + Tool Loop]
322
325
  F --> G
323
- G --> H{686+ Tools}
326
+ G --> H{100+ Skills}
324
327
  H --> I[File ops, bash, git, GitHub, search, deploy, DB, game dev...]
325
328
  G --> J[Learning Engine]
326
329
  J --> K[Patterns + Solutions + User Profile]
@@ -391,6 +391,7 @@ export function getTrustReport() {
391
391
  export function registerAgentProtocolTools() {
392
392
  registerTool({
393
393
  name: 'agent_handoff',
394
+ deprecated: true,
394
395
  description: 'Create a handoff to transfer work to another agent. Includes context, artifacts, and priority. The receiving agent can accept or reject. Use this when a task is better suited for a different specialist.',
395
396
  parameters: {
396
397
  from: { type: 'string', description: 'Agent ID initiating the handoff', required: true },
@@ -430,6 +431,7 @@ export function registerAgentProtocolTools() {
430
431
  });
431
432
  registerTool({
432
433
  name: 'blackboard_write',
434
+ deprecated: true,
433
435
  description: 'Write to the shared agent blackboard (working memory). Any agent can write facts, hypotheses, decisions, artifacts, or questions. Other agents can read these to coordinate without direct communication.',
434
436
  parameters: {
435
437
  key: { type: 'string', description: 'Key to write (e.g., "architecture_decision", "security_finding")', required: true },
@@ -464,6 +466,7 @@ export function registerAgentProtocolTools() {
464
466
  });
465
467
  registerTool({
466
468
  name: 'blackboard_read',
469
+ deprecated: true,
467
470
  description: 'Read from the shared agent blackboard. Query a specific key or list all entries filtered by type. Use this to see what other agents have written and coordinate work.',
468
471
  parameters: {
469
472
  key: { type: 'string', description: 'Specific key to read. If omitted, returns all entries.' },
@@ -504,6 +507,7 @@ export function registerAgentProtocolTools() {
504
507
  });
505
508
  registerTool({
506
509
  name: 'agent_propose',
510
+ deprecated: true,
507
511
  description: 'Propose an approach for multi-agent negotiation. Other agents can vote agree/disagree/abstain. Use resolve to determine the outcome. Ties are broken by trust scores.',
508
512
  parameters: {
509
513
  action: { type: 'string', description: 'Action: propose, vote, resolve, or status', required: true },
@@ -589,6 +593,7 @@ export function registerAgentProtocolTools() {
589
593
  });
590
594
  registerTool({
591
595
  name: 'agent_trust',
596
+ deprecated: true,
592
597
  description: 'Check or update trust scores for agents. Trust is asymmetric: success adds 0.05, failure subtracts 0.10. Scores persist across sessions in ~/.kbot/trust.json.',
593
598
  parameters: {
594
599
  action: { type: 'string', description: 'Action: check, update, best, or report', required: true },
package/dist/cli.js CHANGED
@@ -102,7 +102,7 @@ async function main() {
102
102
  console.log(` ${chalk.cyan('https://github.com/isaacsight/kernel/issues')} ${chalk.dim('Bug reports')}`);
103
103
  console.log(` ${chalk.cyan('support@kernel.chat')} ${chalk.dim('Email (AI-assisted replies)')}`);
104
104
  console.log();
105
- console.log(` ${chalk.dim('35 specialist agents · 787+ tools · 20 providers · MIT licensed')}`);
105
+ console.log(` ${chalk.dim('35 specialist agents · 100+ skills · 20 providers · MIT licensed')}`);
106
106
  console.log();
107
107
  process.exit(0);
108
108
  });
@@ -582,10 +582,10 @@ async function main() {
582
582
  // ── Discovery Agent ──
583
583
  const discoveryCmd = program
584
584
  .command('discovery')
585
- .description('Autonomous outreach agent — finds conversations, drafts responses, posts for you');
585
+ .description('Background outreach agent — finds conversations, drafts responses, posts for you');
586
586
  discoveryCmd
587
587
  .command('start')
588
- .description('Start the discovery loop — scans HN, GitHub, Reddit and posts autonomously')
588
+ .description('Start the discovery loop — scans HN, GitHub, Reddit and posts in the background')
589
589
  .option('--dry-run', 'Find and draft but don\'t post')
590
590
  .option('--interval <minutes>', 'Poll interval in minutes', '60')
591
591
  .option('--model <model>', 'Ollama model for analysis', 'qwen2.5-coder:32b')
@@ -4202,7 +4202,7 @@ async function main() {
4202
4202
  const models = await listOllamaModels();
4203
4203
  if (models.length > 0)
4204
4204
  printInfo(`${models.length} models available. Using: ${ollamaModel || PROVIDERS.ollama.defaultModel}`);
4205
- printInfo('670+ tools ready. Type your prompt or press Enter for interactive mode.');
4205
+ printInfo('100+ skills ready. Type your prompt or press Enter for interactive mode.');
4206
4206
  }
4207
4207
  else {
4208
4208
  printError(`Cannot reach Ollama at ${ollamaHost}. Is it running?`);
@@ -4696,7 +4696,7 @@ async function byokFlow() {
4696
4696
  console.log();
4697
4697
  printSuccess(`BYOK mode enabled — ${providerConfig.name}`);
4698
4698
  printInfo('You pay the provider directly. No message limits. No restrictions.');
4699
- printInfo('All 362 tools + 35 agents + learning system = yours.');
4699
+ printInfo('All 100+ skills + 35 specialist agents + learning system = yours.');
4700
4700
  console.log();
4701
4701
  printSuccess('Ready. Run `kbot` to start.');
4702
4702
  }
@@ -4996,7 +4996,7 @@ async function startRepl(agentOpts, context, tier, byokActive = false, localActi
4996
4996
  const suggestions = await detectProjectSuggestions();
4997
4997
  console.log();
4998
4998
  console.log(chalk.dim(' ┌─────────────────────────────────────────────────┐'));
4999
- console.log(chalk.dim(' │') + chalk.bold(' 35 agents. 362 tools. Just say what you need. ') + chalk.dim(' │'));
4999
+ console.log(chalk.dim(' │') + chalk.bold(' 35 agents. 100+ skills. Just say what you need. ') + chalk.dim(' │'));
5000
5000
  console.log(chalk.dim(' │ │'));
5001
5001
  if (suggestions.length > 0) {
5002
5002
  for (const s of suggestions.slice(0, 4)) {
@@ -35,6 +35,17 @@ export interface PluginConfig {
35
35
  enabled: string[];
36
36
  disabled: string[];
37
37
  }
38
+ export interface LoadPluginsOptions {
39
+ /** Override the plugin directory (used by tests). Defaults to ~/.kbot/plugins. */
40
+ pluginsDir?: string;
41
+ /** Override the integrity manifest path. Defaults to ~/.kbot/plugins.json. */
42
+ manifestPath?: string;
43
+ /**
44
+ * Override the integrity-disabled flag. Defaults to reading
45
+ * `process.env.KBOT_PLUGIN_INTEGRITY === 'off'`.
46
+ */
47
+ integrityDisabled?: boolean;
48
+ }
38
49
  export interface SDKPluginManifest {
39
50
  name: string;
40
51
  version: string;
@@ -53,8 +64,18 @@ export interface SDKPluginManifest {
53
64
  /**
54
65
  * Load all installed and enabled SDK plugins.
55
66
  * Called at startup after the legacy plugins.ts loadPlugins() runs.
56
- */
57
- export declare function loadPlugins(verbose?: boolean): Promise<SDKPluginManifest[]>;
67
+ *
68
+ * Integrity contract (mirrors plugins.ts):
69
+ * - Reads the same manifest at `~/.kbot/plugins.json` (override via
70
+ * `KBOT_PLUGIN_MANIFEST` or `opts.manifestPath`).
71
+ * - If the manifest exists, only plugins whose `name` appears in
72
+ * `result.verified` are imported. Drift → throws `IntegrityError`.
73
+ * - If the manifest is missing, falls back to back-compat behaviour: all
74
+ * discovered, enabled plugins are imported (with a yellow info note).
75
+ * - `KBOT_PLUGIN_INTEGRITY=off` skips verification entirely with a loud
76
+ * yellow warning.
77
+ */
78
+ export declare function loadPlugins(verbose?: boolean, opts?: LoadPluginsOptions): Promise<SDKPluginManifest[]>;
58
79
  /**
59
80
  * Scaffold a new plugin with a full project structure.
60
81
  * Creates ~/.kbot/plugins/<name>/ with index.ts and package.json.
@@ -21,11 +21,32 @@ import { join, basename, resolve } from 'node:path';
21
21
  import { homedir } from 'node:os';
22
22
  import { pathToFileURL } from 'node:url';
23
23
  import { execSync } from 'node:child_process';
24
+ import chalk from 'chalk';
24
25
  import { registerTool } from './tools/index.js';
26
+ import { IntegrityError, verifyAllPlugins, enforce, } from './plugins-integrity.js';
25
27
  // ── Constants ────────────────────────────────────────────────────────────
26
28
  const KBOT_DIR = join(homedir(), '.kbot');
27
29
  const PLUGINS_DIR = join(KBOT_DIR, 'plugins');
30
+ // NOTE: PLUGINS_CONFIG (per-plugin enable/disable list) shares the path
31
+ // `~/.kbot/plugins.json` with the integrity manifest used by plugins.ts. This
32
+ // is a pre-existing collision in the SDK loader — the enable/disable JSON has
33
+ // shape `{ enabled, disabled }`, while the integrity manifest has shape
34
+ // `{ schemaVersion, plugins }`. In practice users running with the integrity
35
+ // manifest must override the SDK config path, or the integrity manifest path,
36
+ // via `KBOT_PLUGIN_MANIFEST`. The fix is out of scope for the integrity
37
+ // wiring; flagged here so we do not mask the collision in tests.
28
38
  const PLUGINS_CONFIG = join(KBOT_DIR, 'plugins.json');
39
+ /**
40
+ * Default integrity manifest path. Mirrors plugins.ts so a single manifest
41
+ * covers both drop-in `.js` plugins (handled by plugins.ts) and SDK-style
42
+ * directory plugins (handled here). The integrity manifest's `path` field is
43
+ * resolved relative to `~/.kbot/plugins/`, so:
44
+ * - `hello.js` → simple drop-in plugin
45
+ * - `my-tool/index.js` → SDK-style packaged plugin
46
+ * are both expressible in one manifest. Override via `KBOT_PLUGIN_MANIFEST`
47
+ * or the `manifestPath` option to `loadPlugins`.
48
+ */
49
+ const DEFAULT_MANIFEST_PATH = join(homedir(), '.kbot', 'plugins.json');
29
50
  // ── State ────────────────────────────────────────────────────────────────
30
51
  const loadedSDKPlugins = new Map();
31
52
  const registeredCommands = new Map();
@@ -219,19 +240,22 @@ function registerPluginHooks(plugin) {
219
240
  /**
220
241
  * Discover local plugins in ~/.kbot/plugins/<name>/ directories.
221
242
  * Each directory should contain an index.ts or index.js file.
243
+ *
244
+ * Pass `pluginsDir` to scan a custom location (used by tests). Defaults to
245
+ * the module-level `PLUGINS_DIR` (`~/.kbot/plugins`).
222
246
  */
223
- function discoverLocalPlugins() {
224
- ensureDir(PLUGINS_DIR);
247
+ function discoverLocalPlugins(pluginsDir = PLUGINS_DIR) {
248
+ ensureDir(pluginsDir);
225
249
  const results = [];
226
250
  let entries;
227
251
  try {
228
- entries = readdirSync(PLUGINS_DIR);
252
+ entries = readdirSync(pluginsDir);
229
253
  }
230
254
  catch {
231
255
  return results;
232
256
  }
233
257
  for (const entry of entries) {
234
- const dirPath = join(PLUGINS_DIR, entry);
258
+ const dirPath = join(pluginsDir, entry);
235
259
  try {
236
260
  const stat = statSync(dirPath);
237
261
  if (!stat.isDirectory())
@@ -328,16 +352,91 @@ function discoverNpmPlugins() {
328
352
  }
329
353
  return results;
330
354
  }
355
+ // ── Integrity Gate ───────────────────────────────────────────────────────
356
+ /**
357
+ * Run the integrity manifest gate before loading any SDK plugin module.
358
+ *
359
+ * Mirrors `plugins.ts`'s `runIntegrityGate` so the two loaders enforce the
360
+ * same fail-closed contract against the same manifest at `~/.kbot/plugins.json`.
361
+ *
362
+ * Behaviour:
363
+ * - If KBOT_PLUGIN_INTEGRITY=off (or `integrityDisabled === true`):
364
+ * emit a yellow warning and return `null` (verification skipped, all
365
+ * discovered plugins are eligible to load).
366
+ * - If the manifest file does not exist: emit a yellow info note and
367
+ * return `null` (back-compat — manifest is optional today).
368
+ * - If the manifest exists and verifies: return the `VerifyAllResult` so
369
+ * the caller can restrict loads to `result.verified`.
370
+ * - If the manifest exists and any plugin fails: throw `IntegrityError`
371
+ * (loader refuses to import any SDK plugin this session).
372
+ */
373
+ async function runIntegrityGate(manifestPath, pluginsDir, integrityDisabled) {
374
+ if (integrityDisabled) {
375
+ console.error(chalk.yellow(` ⚠ KBOT_PLUGIN_INTEGRITY=off — skipping integrity check for SDK plugins (NOT FOR PRODUCTION). ` +
376
+ `Plugins under ${pluginsDir} will load without hash checking.`));
377
+ return null;
378
+ }
379
+ if (!existsSync(manifestPath)) {
380
+ console.error(chalk.yellow(` ⚠ no plugin manifest at ${manifestPath} — plugin SDK loaded without integrity verification. ` +
381
+ `Create one to pin plugins by SHA-256 (see PLUGINS_INTEGRITY.md).`));
382
+ return null;
383
+ }
384
+ try {
385
+ const result = await verifyAllPlugins(manifestPath, pluginsDir);
386
+ if (result.failed.length > 0) {
387
+ const lines = result.failed
388
+ .map((f) => ` - ${f.name}: ${f.reason}`)
389
+ .join('\n');
390
+ console.error(chalk.red(` ✗ Plugin integrity check failed for ${result.failed.length} SDK plugin(s):\n${lines}\n` +
391
+ ` Manifest: ${manifestPath}\n` +
392
+ ` To refresh hashes, recompute SHA-256 for each plugin entry and update the manifest. ` +
393
+ `Set KBOT_PLUGIN_INTEGRITY=off ONLY for local dev; never in production.`));
394
+ enforce(result); // throws IntegrityError
395
+ }
396
+ return result;
397
+ }
398
+ catch (err) {
399
+ if (err instanceof IntegrityError)
400
+ throw err;
401
+ // loadManifest threw (malformed JSON, schema violation, etc.) — fail closed.
402
+ console.error(chalk.red(` ✗ Failed to load plugin integrity manifest at ${manifestPath}: ${err.message}`));
403
+ throw err;
404
+ }
405
+ }
331
406
  // ── Public API ───────────────────────────────────────────────────────────
332
407
  /**
333
408
  * Load all installed and enabled SDK plugins.
334
409
  * Called at startup after the legacy plugins.ts loadPlugins() runs.
410
+ *
411
+ * Integrity contract (mirrors plugins.ts):
412
+ * - Reads the same manifest at `~/.kbot/plugins.json` (override via
413
+ * `KBOT_PLUGIN_MANIFEST` or `opts.manifestPath`).
414
+ * - If the manifest exists, only plugins whose `name` appears in
415
+ * `result.verified` are imported. Drift → throws `IntegrityError`.
416
+ * - If the manifest is missing, falls back to back-compat behaviour: all
417
+ * discovered, enabled plugins are imported (with a yellow info note).
418
+ * - `KBOT_PLUGIN_INTEGRITY=off` skips verification entirely with a loud
419
+ * yellow warning.
335
420
  */
336
- export async function loadPlugins(verbose = false) {
421
+ export async function loadPlugins(verbose = false, opts = {}) {
422
+ const pluginsDir = opts.pluginsDir ?? PLUGINS_DIR;
423
+ const manifestPath = opts.manifestPath ?? process.env.KBOT_PLUGIN_MANIFEST ?? DEFAULT_MANIFEST_PATH;
424
+ const integrityDisabled = opts.integrityDisabled ?? process.env.KBOT_PLUGIN_INTEGRITY === 'off';
337
425
  const manifests = [];
338
- // Discover from both sources
339
- const localPlugins = discoverLocalPlugins();
340
- const npmPlugins = discoverNpmPlugins();
426
+ // Integrity gate runs BEFORE any SDK plugin file is imported. Throws
427
+ // IntegrityError on drift unless KBOT_PLUGIN_INTEGRITY=off.
428
+ const integrity = await runIntegrityGate(manifestPath, pluginsDir, integrityDisabled);
429
+ // When a manifest verified successfully, restrict loads to verified names.
430
+ // When the manifest is missing or integrity is disabled, allow every file.
431
+ const verifiedNames = integrity
432
+ ? new Set(integrity.verified)
433
+ : null;
434
+ // Discover from both sources. NPM plugins live in global node_modules and
435
+ // are not (yet) covered by the integrity manifest's relative-path scheme;
436
+ // when integrity is enforced, only local plugins listed in the manifest
437
+ // load. NPM plugins are skipped entirely under enforcement.
438
+ const localPlugins = discoverLocalPlugins(pluginsDir);
439
+ const npmPlugins = verifiedNames ? [] : discoverNpmPlugins();
341
440
  const allDiscovered = [
342
441
  ...localPlugins.map(p => ({ ...p, source: 'local' })),
343
442
  ...npmPlugins.map(p => ({ ...p, source: 'npm' })),
@@ -361,6 +460,17 @@ export async function loadPlugins(verbose = false) {
361
460
  manifests.push(manifest);
362
461
  continue;
363
462
  }
463
+ // When manifest verification ran, only load plugins whose name appears in
464
+ // the verified set. Discovered plugins not declared in the manifest are
465
+ // skipped (they could not have passed verification).
466
+ if (verifiedNames && !verifiedNames.has(name)) {
467
+ if (verbose) {
468
+ console.error(chalk.yellow(` ⚠ [SDK] Skipping ${name} — not declared in plugin manifest`));
469
+ }
470
+ manifest.error = 'not declared in plugin integrity manifest';
471
+ manifests.push(manifest);
472
+ continue;
473
+ }
364
474
  try {
365
475
  const plugin = await importPlugin(entryPath);
366
476
  manifest.version = plugin.version;
package/dist/plugins.js CHANGED
@@ -107,7 +107,21 @@ export async function loadPlugins(verbose = false, opts = {}) {
107
107
  const verifiedNames = integrity
108
108
  ? new Set(integrity.verified)
109
109
  : null;
110
- const files = readdirSync(pluginsDir).filter(f => PLUGIN_EXTENSIONS.some(ext => f.endsWith(ext)));
110
+ // Top-level plugin files
111
+ const topLevel = readdirSync(pluginsDir).filter(f => PLUGIN_EXTENSIONS.some(ext => f.endsWith(ext)));
112
+ // Forged subdirectory (created by forge.ts at runtime). v3.99.31 and earlier
113
+ // persisted forged tools here without the loader scanning for them; fixed in v4.0.
114
+ let forgedFiles = [];
115
+ try {
116
+ const forgedDir = join(pluginsDir, 'forged');
117
+ forgedFiles = readdirSync(forgedDir)
118
+ .filter(f => PLUGIN_EXTENSIONS.some(ext => f.endsWith(ext)))
119
+ .map(f => `forged/${f}`);
120
+ }
121
+ catch {
122
+ // forged/ doesn't exist — nothing to load
123
+ }
124
+ const files = [...topLevel, ...forgedFiles];
111
125
  if (files.length === 0)
112
126
  return [];
113
127
  for (const file of files) {
@@ -50,6 +50,7 @@ export function registerBrowserTools() {
50
50
  });
51
51
  registerTool({
52
52
  name: 'browser_snapshot',
53
+ deprecated: true,
53
54
  description: 'Get the current page\'s accessibility tree (structured text representation).',
54
55
  parameters: {},
55
56
  tier: 'free',
@@ -253,6 +253,7 @@ export function registerComputerTools() {
253
253
  // ── Permission & lock check ──
254
254
  registerTool({
255
255
  name: 'computer_check',
256
+ deprecated: true,
256
257
  description: 'Check computer use permissions and acquire the session lock. Call this before any other computer use tool. Returns permission status and any required setup steps.',
257
258
  parameters: {},
258
259
  tier: 'free',
@@ -277,6 +278,7 @@ export function registerComputerTools() {
277
278
  // ── App approval ──
278
279
  registerTool({
279
280
  name: 'app_approve',
281
+ deprecated: true,
280
282
  description: 'Approve an app for computer use in this session. Must be called before interacting with an app. Shows a warning for sensitive apps (terminals, Finder, System Settings).',
281
283
  parameters: {
282
284
  app: { type: 'string', description: 'App name (e.g., "Safari", "Finder", "Xcode")', required: true },
@@ -456,6 +458,7 @@ export function registerComputerTools() {
456
458
  // ── Mouse click ──
457
459
  registerTool({
458
460
  name: 'mouse_click',
461
+ deprecated: true,
459
462
  description: 'Click at specific screen coordinates.',
460
463
  parameters: {
461
464
  x: { type: 'number', description: 'X coordinate', required: true },
@@ -873,6 +876,7 @@ export function registerComputerTools() {
873
876
  });
874
877
  registerTool({
875
878
  name: 'window_resize',
879
+ deprecated: true,
876
880
  description: 'Resize a window of a specific app.',
877
881
  parameters: {
878
882
  app: { type: 'string', description: 'App name', required: true },
@@ -926,6 +930,7 @@ export function registerComputerTools() {
926
930
  });
927
931
  registerTool({
928
932
  name: 'window_move',
933
+ deprecated: true,
929
934
  description: 'Move a window to specific screen coordinates.',
930
935
  parameters: {
931
936
  app: { type: 'string', description: 'App name', required: true },
@@ -1080,6 +1085,7 @@ export function registerComputerTools() {
1080
1085
  // ── Release lock ──
1081
1086
  registerTool({
1082
1087
  name: 'computer_release',
1088
+ deprecated: true,
1083
1089
  description: 'Release the computer use lock and end the session. Call when done with computer use.',
1084
1090
  parameters: {},
1085
1091
  tier: 'free',
@@ -428,6 +428,7 @@ export function registerContainerTools() {
428
428
  // ── License Check ─────────────────────────────────────────────────
429
429
  registerTool({
430
430
  name: 'license_check',
431
+ deprecated: true,
431
432
  description: 'Check license compatibility across a project\'s dependency tree.',
432
433
  parameters: {
433
434
  path: { type: 'string', description: 'Project directory path', required: true },
@@ -683,6 +683,7 @@ function evolveDesign(source, mutationIndex) {
683
683
  export function registerCreativeTools() {
684
684
  registerTool({
685
685
  name: 'generate_art',
686
+ deprecated: true,
686
687
  description: 'Generate a self-contained p5.js sketch as an HTML file from a text description. Creates generative art that can be opened directly in a browser.',
687
688
  parameters: {
688
689
  description: { type: 'string', description: 'Text description of the desired artwork (e.g., "flowing ocean waves at sunset")', required: true },
@@ -706,6 +707,7 @@ export function registerCreativeTools() {
706
707
  });
707
708
  registerTool({
708
709
  name: 'generate_shader',
710
+ deprecated: true,
709
711
  description: 'Generate a Shadertoy-compatible GLSL fragment shader from a text description. Creates animated procedural graphics using noise, raymarching, voronoi, or kaleidoscopic techniques.',
710
712
  parameters: {
711
713
  description: { type: 'string', description: 'Text description of the desired shader effect (e.g., "molten lava flowing through cracks")', required: true },
@@ -723,6 +725,7 @@ export function registerCreativeTools() {
723
725
  });
724
726
  registerTool({
725
727
  name: 'generate_music_pattern',
728
+ deprecated: true,
726
729
  description: 'Generate a music pattern as Sonic Pi code or a MIDI-like JSON structure. Creates melodies, bass lines, and drum patterns based on genre and description.',
727
730
  parameters: {
728
731
  description: { type: 'string', description: 'Text description of the desired music (e.g., "upbeat jazz with walking bass")', required: true },
@@ -748,6 +751,7 @@ export function registerCreativeTools() {
748
751
  });
749
752
  registerTool({
750
753
  name: 'generate_svg',
754
+ deprecated: true,
751
755
  description: 'Generate algorithmic SVG art from a text description. Creates generative patterns including concentric circles, mesh networks, Mondrian grids, spirographs, or wave patterns.',
752
756
  parameters: {
753
757
  description: { type: 'string', description: 'Text description of the desired SVG artwork', required: true },
@@ -772,6 +776,7 @@ export function registerCreativeTools() {
772
776
  });
773
777
  registerTool({
774
778
  name: 'evolve_design',
779
+ deprecated: true,
775
780
  description: 'Take an existing design file (HTML, SVG, GLSL, CSS, etc.) and generate N mutations by tweaking numeric values, colors, and structure. Outputs each variant as a separate file. Useful for exploring design spaces.',
776
781
  parameters: {
777
782
  source_path: { type: 'string', description: 'Path to the source design file to mutate', required: true },
@@ -307,6 +307,7 @@ export function registerDeployTools() {
307
307
  // ── deploy ─────────────────────────────────────────────────────────
308
308
  registerTool({
309
309
  name: 'deploy',
310
+ deprecated: true,
310
311
  description: 'Deploy the current project. Auto-detects platform from config files (vercel.json, netlify.toml, wrangler.toml, fly.toml, railway.json). Supports Vercel, Netlify, Cloudflare Workers/Pages, Fly.io, and Railway.',
311
312
  parameters: {
312
313
  path: { type: 'string', description: 'Project directory (default: cwd)' },
@@ -968,6 +968,7 @@ export function registerEmergentTools() {
968
968
  // ══════════════════════════════════════════════════════════════════════════
969
969
  registerTool({
970
970
  name: 'question',
971
+ deprecated: true,
971
972
  description: 'Generate the most important unanswered questions based on kbot\'s knowledge graph and memory. Not questions the user asked — questions that SHOULD be asked based on what is known and what is missing.',
972
973
  parameters: {
973
974
  domain: { type: 'string', description: 'Optional domain focus (e.g., "biology", "physics", "social")' },
@@ -186,6 +186,7 @@ export function registerGamedevTools() {
186
186
  };
187
187
  registerTool({
188
188
  name: 'scaffold_game',
189
+ deprecated: true,
189
190
  description: 'Generate project scaffolding for a game engine. Supports godot, unity, unreal, bevy, phaser, three (Three.js), playcanvas, and defold. Writes real config files, entry points, and gitignore.',
190
191
  parameters: {
191
192
  engine: { type: 'string', description: 'Game engine: godot, unity, unreal, bevy, phaser, three, playcanvas, defold', required: true },
@@ -359,6 +360,7 @@ export function registerGamedevTools() {
359
360
  };
360
361
  registerTool({
361
362
  name: 'game_config',
363
+ deprecated: true,
362
364
  description: 'Generate or modify game engine config files. Auto-detects engine from project directory. Supports project, build, input, physics, rendering, and audio config types.',
363
365
  parameters: {
364
366
  engine: { type: 'string', description: 'Engine: godot, unity, unreal, bevy, phaser, three, playcanvas, defold (auto-detected if path provided)' },
@@ -438,6 +440,7 @@ export function registerGamedevTools() {
438
440
  ];
439
441
  registerTool({
440
442
  name: 'shader_debug',
443
+ deprecated: true,
441
444
  description: 'Static analysis of shader code for performance issues, errors, and optimization opportunities. Supports GLSL, HLSL, and WGSL. Reports branching, precision, overdraw, math optimization, and texture access patterns.',
442
445
  parameters: {
443
446
  source: { type: 'string', description: 'Shader source code or file path', required: true },
@@ -906,6 +909,7 @@ void fragment() {
906
909
  };
907
910
  registerTool({
908
911
  name: 'material_graph',
912
+ deprecated: true,
909
913
  description: 'Generate material/shader code for game engines. Supports PBR, toon, water, foliage, glass, and emissive materials for Three.js, Godot, and Unity.',
910
914
  parameters: {
911
915
  material_type: { type: 'string', description: 'Material type: pbr, toon, water, foliage, glass, emissive', required: true },
@@ -1264,6 +1268,7 @@ void fragment() {
1264
1268
  }
1265
1269
  registerTool({
1266
1270
  name: 'mesh_generate',
1271
+ deprecated: true,
1267
1272
  description: 'Procedural OBJ mesh generation. Supports plane, cube, sphere, cylinder, torus, heightmap, and terrain shapes with configurable parameters. Outputs valid OBJ with vertices, normals, and UVs.',
1268
1273
  parameters: {
1269
1274
  shape: { type: 'string', description: 'Shape: plane, cube, sphere, cylinder, torus, heightmap, terrain', required: true },
@@ -1298,6 +1303,7 @@ void fragment() {
1298
1303
  // ── Tool 6: Sprite Atlas Packer ────────────────────────────────────
1299
1304
  registerTool({
1300
1305
  name: 'sprite_pack',
1306
+ deprecated: true,
1301
1307
  description: 'Pack multiple sprite images into a single texture atlas with metadata. Uses maxrects bin-packing for optimal layout. Outputs atlas image via ImageMagick and JSON/engine-specific metadata.',
1302
1308
  parameters: {
1303
1309
  input_dir: { type: 'string', description: 'Directory containing sprite images (png/jpg/webp)', required: true },
@@ -1610,6 +1616,7 @@ void fragment() {
1610
1616
  // ── Tool 7: Physics Setup Generator ──────────────────────────────────
1611
1617
  registerTool({
1612
1618
  name: 'physics_setup',
1619
+ deprecated: true,
1613
1620
  description: 'Generate complete physics configuration code for game engines. Supports rigidbody, softbody, ragdoll (full humanoid skeleton), vehicle (suspension/wheels/steering), cloth, and joint systems across 7 physics engines.',
1614
1621
  parameters: {
1615
1622
  type: { type: 'string', description: 'Physics type: rigidbody, softbody, ragdoll, vehicle, cloth, joints', required: true },
@@ -2902,6 +2909,7 @@ const JOINT_CONFIG = ${JSON.stringify({
2902
2909
  // ── Tool 8: Particle System Generator ────────────────────────────────
2903
2910
  registerTool({
2904
2911
  name: 'particle_system',
2912
+ deprecated: true,
2905
2913
  description: 'Generate engine-specific particle system code for common visual effects. Supports fire, smoke, rain, snow, sparks, magic, explosion, dust, bubbles, leaves, and confetti effects across 6 game engines.',
2906
2914
  parameters: {
2907
2915
  effect: { type: 'string', description: 'Effect type: fire, smoke, rain, snow, sparks, magic, explosion, dust, bubbles, leaves, confetti', required: true },
@@ -3612,6 +3620,7 @@ ${effect === 'fire' || effect === 'smoke' ? ` // Grow over lifetime
3612
3620
  // ── Tool 9: Procedural Level Generator ───────────────────────────────
3613
3621
  registerTool({
3614
3622
  name: 'level_generate',
3623
+ deprecated: true,
3615
3624
  description: 'Generate procedural game levels with BSP dungeon, platformer terrain, maze, overworld, or arena layouts. Supports seeded PRNG for reproducibility and outputs in JSON, Tiled, or ASCII formats.',
3616
3625
  parameters: {
3617
3626
  type: { type: 'string', description: 'Level type: dungeon, platformer, overworld, maze, arena', required: true },
@@ -4173,6 +4182,7 @@ ${effect === 'fire' || effect === 'smoke' ? ` // Grow over lifetime
4173
4182
  // ── Tool 10: Tilemap Auto-Tiling Generator ──────────────────────────
4174
4183
  registerTool({
4175
4184
  name: 'tilemap_generate',
4185
+ deprecated: true,
4176
4186
  description: 'Generate bitmask-based auto-tiling rules and tilemap data. Supports blob 47-tile, Wang 16-tile, and simple 4-tile tilesets with terrain definitions for grass, stone, water, sand, snow, and lava.',
4177
4187
  parameters: {
4178
4188
  tileset_type: { type: 'string', description: 'Tileset type: blob_47, wang_16, simple_4', required: true },
@@ -4553,6 +4563,7 @@ tile_${i}/terrain_peering/left = ${cardW ? 0 : -1}`;
4553
4563
  // ── Tool 11: Navigation Mesh Configuration ──────────────────────────
4554
4564
  registerTool({
4555
4565
  name: 'navmesh_config',
4566
+ deprecated: true,
4556
4567
  description: 'Generate engine-specific navigation mesh configuration and pathfinding helper code. Supports humanoid, vehicle, flying, and small creature agent types with appropriate defaults across 5 navigation systems.',
4557
4568
  parameters: {
4558
4569
  engine: { type: 'string', description: 'Navigation engine: godot, unity, unreal, recast, three (default: recast)' },
@@ -5662,6 +5673,7 @@ export class NavigationSystem {
5662
5673
  // ── Tool 12: game_audio ──────────────────────────────────────────────
5663
5674
  registerTool({
5664
5675
  name: 'game_audio',
5676
+ deprecated: true,
5665
5677
  description: 'Generate game audio systems: spatial 3D audio, adaptive music layers, sound banks, Howler.js setup, or Web Audio API graphs. Produces complete, working audio code for any game engine.',
5666
5678
  parameters: {
5667
5679
  system: { type: 'string', description: 'Audio system type: spatial, music_layers, sound_bank, howler, web_audio', required: true },
@@ -7122,6 +7134,7 @@ export class AudioEngine {
7122
7134
  // ── Tool 13: netcode_scaffold ───────────────────────────────────────
7123
7135
  registerTool({
7124
7136
  name: 'netcode_scaffold',
7137
+ deprecated: true,
7125
7138
  description: 'Generate multiplayer netcode scaffolding: server, client, and shared types. Supports WebSocket/WebRTC transports with Colyseus, Socket.IO, Geckos.io, Nakama, or raw implementations. Includes lobby, matchmaking, state sync, input prediction, chat, and reconnection features.',
7126
7139
  parameters: {
7127
7140
  architecture: { type: 'string', description: 'Network architecture: client_server, peer_to_peer, relay', required: true },
@@ -8542,6 +8555,7 @@ ${hasReconnect ? ' if (this.reconnectTimer) clearTimeout(this.reconnectTimer)
8542
8555
  // ── Tool 14: game_build ─────────────────────────────────────────────
8543
8556
  registerTool({
8544
8557
  name: 'game_build',
8558
+ deprecated: true,
8545
8559
  description: 'Generate CI/CD pipelines and build configurations for game distribution. Supports Steam, itch.io, web, iOS, and Android targets with GitHub Actions or GitLab CI.',
8546
8560
  parameters: {
8547
8561
  engine: { type: 'string', description: 'Game engine or framework (e.g., godot, unity, unreal, three, phaser, bevy, web)' },
@@ -9044,6 +9058,7 @@ export default defineConfig({
9044
9058
  // ── Tool 15: game_test ──────────────────────────────────────────────
9045
9059
  registerTool({
9046
9060
  name: 'game_test',
9061
+ deprecated: true,
9047
9062
  description: 'Generate game testing and profiling utilities: FPS profiler, memory tracker, input recorder/replayer, screenshot regression tests, and performance budgets with runtime validation.',
9048
9063
  parameters: {
9049
9064
  test_type: { type: 'string', description: 'Test type: fps_profiler, memory_tracker, input_recorder, screenshot_test, performance_budget', required: true },
@@ -10352,6 +10367,7 @@ export class PerformanceBudget {
10352
10367
  // ── Tool 16: ecs_generate ───────────────────────────────────────────
10353
10368
  registerTool({
10354
10369
  name: 'ecs_generate',
10370
+ deprecated: true,
10355
10371
  description: 'Generate Entity Component System (ECS) code: components, systems, and entity archetypes. Produces idiomatic code for Bevy (Rust), bitecs (TypeScript), Unity DOTS (C#), miniplex (TypeScript), or ecsy (TypeScript).',
10356
10372
  parameters: {
10357
10373
  framework: { type: 'string', description: 'ECS framework: bevy, unity_dots, bitecs, miniplex, ecsy', required: true },
@@ -1287,6 +1287,7 @@ export function registerHackerToolkitTools() {
1287
1287
  // ─────────────────────────────────────────────────────────────────────────────
1288
1288
  registerTool({
1289
1289
  name: 'jwt_analyze',
1290
+ deprecated: true,
1290
1291
  description: 'Analyze JWT tokens. Decode header/payload/signature, verify signatures with a secret, test for algorithm confusion (alg:none), and try common weak secrets.',
1291
1292
  parameters: {
1292
1293
  token: { type: 'string', description: 'JWT token to analyze', required: true },
@@ -1653,6 +1654,7 @@ export function registerHackerToolkitTools() {
1653
1654
  // ─────────────────────────────────────────────────────────────────────────────
1654
1655
  registerTool({
1655
1656
  name: 'cors_check',
1657
+ deprecated: true,
1656
1658
  description: 'Detect CORS misconfigurations. Tests for arbitrary origin reflection, null origin acceptance, credentials with wildcard, and subdomain wildcard matching.',
1657
1659
  parameters: {
1658
1660
  url: { type: 'string', description: 'URL to check for CORS misconfigurations', required: true },
@@ -1946,6 +1948,7 @@ export function registerHackerToolkitTools() {
1946
1948
  // ─────────────────────────────────────────────────────────────────────────────
1947
1949
  registerTool({
1948
1950
  name: 'exploit_search',
1951
+ deprecated: true,
1949
1952
  description: 'Search for known exploits and CVEs. Queries the NVD (National Vulnerability Database) API for CVE data. Returns CVE IDs, descriptions, CVSS scores, and references.',
1950
1953
  parameters: {
1951
1954
  query: { type: 'string', description: 'CVE ID (e.g., CVE-2024-1234), software name, or keyword', required: true },
@@ -2739,6 +2742,7 @@ export function registerHackerToolkitTools() {
2739
2742
  // ─────────────────────────────────────────────────────────────────────────────
2740
2743
  registerTool({
2741
2744
  name: 'ssl_analyze',
2745
+ deprecated: true,
2742
2746
  description: 'Deep SSL/TLS analysis using Node.js tls module. Returns protocol version, cipher suite, certificate details (issuer, subject, validity, SANs), certificate chain, HSTS status, and potential security issues.',
2743
2747
  parameters: {
2744
2748
  host: { type: 'string', description: 'Hostname to analyze', required: true },
@@ -3012,6 +3016,7 @@ export function registerHackerToolkitTools() {
3012
3016
  // ─────────────────────────────────────────────────────────────────────────────
3013
3017
  registerTool({
3014
3018
  name: 'forensics_analyze',
3019
+ deprecated: true,
3015
3020
  description: 'File forensics analysis. Identify file type by magic bytes, extract printable ASCII strings, get file metadata, hex dump, and calculate Shannon entropy (high entropy = encrypted/compressed).',
3016
3021
  parameters: {
3017
3022
  file_path: { type: 'string', description: 'Path to file to analyze', required: true },
@@ -3469,6 +3474,7 @@ export function registerHackerToolkitTools() {
3469
3474
  // ─────────────────────────────────────────────────────────────────────────────
3470
3475
  registerTool({
3471
3476
  name: 'security_headers_generate',
3477
+ deprecated: true,
3472
3478
  description: 'Generate complete security header configurations for various frameworks. Includes CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, and more. Returns framework-specific code ready to copy-paste.',
3473
3479
  parameters: {
3474
3480
  framework: { type: 'string', description: 'Framework: express, nextjs, nginx, apache, cloudflare, generic', default: 'generic' },
@@ -18,6 +18,8 @@ export interface ToolDefinition {
18
18
  timeout?: number;
19
19
  /** Max result size in bytes (default: 50_000 = 50KB) */
20
20
  maxResultSize?: number;
21
+ /** Marked deprecated as of v4.0; scheduled for removal in 4.1.0. */
22
+ deprecated?: boolean;
21
23
  }
22
24
  export interface ToolCall {
23
25
  id: string;
@@ -12,6 +12,9 @@
12
12
  // Re-export the middleware pipeline system
13
13
  export { ToolPipeline, createDefaultPipeline, permissionMiddleware, hookMiddleware, timeoutMiddleware, metricsMiddleware, truncationMiddleware, telemetryMiddleware, executionMiddleware, fallbackMiddleware, mcpAppsMiddleware, DEFAULT_FALLBACK_RULES, } from '../tool-pipeline.js';
14
14
  import { ToolPipeline, executionMiddleware } from '../tool-pipeline.js';
15
+ import chalk from 'chalk';
16
+ /** Tools whose deprecation warning has already been emitted this process. */
17
+ const deprecationWarned = new Set();
15
18
  const registry = new Map();
16
19
  const metrics = new Map();
17
20
  const DEFAULT_TIMEOUT = 300_000; // 5 minutes
@@ -118,6 +121,19 @@ export async function executeTool(call) {
118
121
  `If no MCP server exists, consider using forge_tool to create it at runtime.`;
119
122
  return { tool_call_id: call.id, result: suggestion, error: true, duration_ms: 0 };
120
123
  }
124
+ // Deprecation warn-once: emit a single chalk.yellow message per tool name per process.
125
+ if (tool.deprecated && !deprecationWarned.has(call.name)) {
126
+ deprecationWarned.add(call.name);
127
+ try {
128
+ console.warn(chalk.yellow(`[kbot] Tool '${call.name}' is deprecated as of v4.0 and scheduled for removal in 4.1.0. ` +
129
+ `See https://github.com/isaacsight/kernel/blob/main/packages/kbot/RELEASE_NOTES_4_0.md`));
130
+ }
131
+ catch {
132
+ // chalk may not be available in some test contexts — fall back to plain text.
133
+ console.warn(`[kbot] Tool '${call.name}' is deprecated as of v4.0 and scheduled for removal in 4.1.0. ` +
134
+ `See https://github.com/isaacsight/kernel/blob/main/packages/kbot/RELEASE_NOTES_4_0.md`);
135
+ }
136
+ }
121
137
  const timeout = tool.timeout ?? DEFAULT_TIMEOUT;
122
138
  const maxResult = tool.maxResultSize ?? DEFAULT_MAX_RESULT;
123
139
  const startTime = Date.now();
@@ -207,76 +223,35 @@ const LAZY_MODULE_IMPORTS = [
207
223
  { path: './parallel.js', registerFn: 'registerParallelTools' },
208
224
  { path: './mcp-client.js', registerFn: 'registerMcpClientTools' },
209
225
  { path: './tasks.js', registerFn: 'registerTaskTools' },
210
- { path: './notebook.js', registerFn: 'registerNotebookTools' },
211
226
  { path: './background.js', registerFn: 'registerBackgroundTools' },
212
227
  { path: './sandbox.js', registerFn: 'registerSandboxTools' },
213
- { path: './build-matrix.js', registerFn: 'registerBuildMatrixTools' },
214
228
  { path: './subagent.js', registerFn: 'registerSubagentTools' },
215
229
  { path: './worktree.js', registerFn: 'registerWorktreeTools' },
216
- { path: './kbot-local.js', registerFn: 'registerKbotLocalTools' },
217
230
  { path: './quality.js', registerFn: 'registerQualityTools' },
218
231
  { path: './memory-tools.js', registerFn: 'registerMemoryTools' },
219
232
  { path: './browser.js', registerFn: 'registerBrowserTools' },
220
- { path: './e2b-sandbox.js', registerFn: 'registerE2bTools' },
221
- { path: './lsp-tools.js', registerFn: 'registerLspTools' },
222
- { path: '../mcp-plugins.js', registerFn: 'registerMcpPluginTools' },
223
- { path: '../graph-memory.js', registerFn: 'registerGraphMemoryTools' },
224
- { path: '../confidence.js', registerFn: 'registerConfidenceTools' },
225
233
  { path: '../agent-protocol.js', registerFn: 'registerAgentProtocolTools' },
226
234
  { path: '../temporal.js', registerFn: 'registerTemporalTools' },
227
- { path: '../reasoning.js', registerFn: 'registerReasoningTools' },
228
235
  { path: '../intentionality.js', registerFn: 'registerIntentionalityTools' },
229
236
  { path: './test-runner.js', registerFn: 'registerTestRunnerTools' },
230
237
  { path: './creative.js', registerFn: 'registerCreativeTools' },
231
- { path: './comfyui-plugin.js', registerFn: 'registerComfyUITools' },
232
238
  { path: './magenta-plugin.js', registerFn: 'registerMagentaTools' },
233
- { path: './research.js', registerFn: 'registerResearchTools' },
234
239
  { path: './containers.js', registerFn: 'registerContainerTools' },
235
240
  { path: './vfx.js', registerFn: 'registerVfxTools' },
236
241
  { path: './gamedev.js', registerFn: 'registerGamedevTools' },
237
242
  { path: './audit.js', registerFn: 'registerAuditTools' },
238
- { path: './documents.js', registerFn: 'registerDocumentTools' },
239
- { path: './contribute.js', registerFn: 'registerContributeTools' },
240
- { path: './composio.js', registerFn: 'registerComposioTools' },
241
- { path: '../marketplace.js', registerFn: 'registerMarketplaceTools' },
242
243
  { path: './browser-agent.js', registerFn: 'registerBrowserAgentTools' },
243
- { path: '../workflows.js', registerFn: 'registerWorkflowTools' },
244
244
  { path: './deploy.js', registerFn: 'registerDeployTools' },
245
245
  { path: './mcp-marketplace.js', registerFn: 'registerMcpMarketplaceTools' },
246
246
  { path: './database.js', registerFn: 'registerDatabaseTools' },
247
- { path: '../team.js', registerFn: 'registerTeamTools' },
248
247
  { path: '../plugin-sdk.js', registerFn: 'registerPluginSDKTools' },
249
- { path: './training.js', registerFn: 'registerTrainingTools' },
250
248
  { path: './social.js', registerFn: 'registerSocialTools' },
251
249
  { path: './forge.js', registerFn: 'registerForgeTools' },
252
- { path: '../mcp-apps.js', registerFn: 'registerMcpAppTools' },
253
- { path: './machine-tools.js', registerFn: 'registerMachineTools' },
254
- { path: './finance.js', registerFn: 'registerFinanceTools' },
255
- { path: './wallet.js', registerFn: 'registerWalletTools' },
256
- { path: './stocks.js', registerFn: 'registerStockTools' },
257
- { path: './sentiment.js', registerFn: 'registerSentimentTools' },
258
250
  { path: './security.js', registerFn: 'registerSecurityTools' },
259
251
  { path: './email.js', registerFn: 'registerEmailTools' },
260
- { path: './content-engine.js', registerFn: 'registerContentEngineTools' },
261
- { path: './bootstrapper.js', registerFn: 'registerBootstrapperTools' },
262
- { path: './lab-core.js', registerFn: 'registerLabCoreTools' },
263
- { path: './lab-data.js', registerFn: 'registerLabDataTools' },
264
- { path: './lab-bio.js', registerFn: 'registerLabBioTools' },
265
- { path: './lab-chem.js', registerFn: 'registerLabChemTools' },
266
- { path: './lab-physics.js', registerFn: 'registerLabPhysicsTools' },
267
- { path: './lab-earth.js', registerFn: 'registerLabEarthTools' },
268
- { path: './lab-math.js', registerFn: 'registerLabMathTools' },
269
- { path: './lab-neuro.js', registerFn: 'registerLabNeuroTools' },
270
- { path: './lab-social.js', registerFn: 'registerLabSocialTools' },
271
- { path: './lab-humanities.js', registerFn: 'registerLabHumanitiesTools' },
272
- { path: './lab-health.js', registerFn: 'registerLabHealthTools' },
273
- { path: './science-graph.js', registerFn: 'registerScienceGraphTools' },
274
- { path: './research-pipeline.js', registerFn: 'registerResearchPipelineTools' },
275
- { path: './research-notebook.js', registerFn: 'registerResearchNotebookTools' },
276
252
  { path: './hypothesis-engine.js', registerFn: 'registerHypothesisEngineTools' },
277
253
  { path: './emergent.js', registerFn: 'registerEmergentTools' },
278
254
  { path: './security-hunt.js', registerFn: 'registerSecurityHuntTools' },
279
- { path: './lab-frontier.js', registerFn: 'registerFrontierTools' },
280
255
  { path: './ableton.js', registerFn: 'registerAbletonTools' },
281
256
  { path: './ableton-knowledge.js', registerFn: 'registerAbletonKnowledgeTools' },
282
257
  { path: './ableton-bridge-tools.js', registerFn: 'registerAbletonBridgeTools' },
@@ -285,59 +260,20 @@ const LAZY_MODULE_IMPORTS = [
285
260
  { path: './producer-engine.js', registerFn: 'registerProducerEngine' },
286
261
  { path: './sound-designer.js', registerFn: 'registerSoundDesignerTools' },
287
262
  { path: './arrangement-engine.js', registerFn: 'registerArrangementEngine' },
288
- { path: '../behaviour.js', registerFn: 'registerBehaviourTools' },
289
263
  { path: '../skill-system.js', registerFn: 'registerSkillTools' },
290
- { path: './admin.js', registerFn: 'registerAdminTools' },
291
- { path: './monitor.js', registerFn: 'registerMonitorTools' },
292
- { path: './deploy-all.js', registerFn: 'registerDeployAllTools' },
293
264
  { path: './analytics.js', registerFn: 'registerAnalyticsTools' },
294
- { path: './env-manager.js', registerFn: 'registerEnvTools' },
295
- { path: './db-admin.js', registerFn: 'registerDbAdminTools' },
296
- { path: './visa-payments.js', registerFn: 'registerVisaPaymentTools' },
297
265
  { path: './security-brain.js', registerFn: 'registerSecurityBrainTools' },
298
- { path: './ctf.js', registerFn: 'registerCtfTools' },
299
- { path: './pentest.js', registerFn: 'registerPentestTools' },
300
266
  { path: './redblue.js', registerFn: 'registerRedBlueTools' },
301
267
  { path: './hacker-toolkit.js', registerFn: 'registerHackerToolkitTools' },
302
268
  { path: './threat-intel.js', registerFn: 'registerThreatIntelTools' },
303
269
  { path: './dj-set-builder.js', registerFn: 'registerDjSetBuilderTools' },
304
270
  { path: './serum2-preset.js', registerFn: 'registerSerum2PresetTools' },
305
271
  { path: './dream-tools.js', registerFn: 'registerDreamTools' },
306
- { path: './collective-dream-tools.js', registerFn: 'registerCollectiveDreamTools' },
307
- { path: './memory-scanner-tools.js', registerFn: 'registerMemoryScannerTools' },
308
- { path: './buddy-tools.js', registerFn: 'registerBuddyTools' },
309
- { path: './voice-input-tools.js', registerFn: 'registerVoiceInputTools' },
310
- { path: './watchdog.js', registerFn: 'registerWatchdogTools' },
311
- { path: './behavior-tools.js', registerFn: 'registerBehaviorTools' },
312
- { path: './a2a.js', registerFn: 'registerA2ATools' },
313
- { path: './financial-analysis.js', registerFn: 'registerFinancialAnalysisTools' },
314
- { path: './ai-analysis.js', registerFn: 'registerAIAnalysisTools' },
315
- { path: './music-gen.js', registerFn: 'registerMusicGenTools' },
316
272
  { path: './one-prompt-producer.js', registerFn: 'registerOnePromptTools' },
317
- { path: './mobile-automation.js', registerFn: 'registerMobileAutomationTools' },
318
- { path: './iphone.js', registerFn: 'registerIPhoneTools' },
319
- { path: './ghost.js', registerFn: 'registerGhostTools' },
320
- { path: './streaming.js', registerFn: 'registerStreamingTools' },
321
- { path: './stream-character.js', registerFn: 'registerStreamCharacterTools' },
322
- { path: './stream-renderer.js', registerFn: 'registerStreamRendererTools' },
323
273
  { path: './kbot-browser.js', registerFn: 'registerKBotBrowserTools' },
324
274
  { path: './kbot-terminal.js', registerFn: 'registerKBotTerminalTools' },
325
- { path: './stream-control.js', registerFn: 'registerStreamControlTools' },
326
- { path: './tile-world.js', registerFn: 'registerTileWorldTools' },
327
- { path: './stream-self-eval.js', registerFn: 'registerStreamSelfEvalTools' },
328
275
  { path: './audio-engine.js', registerFn: 'registerAudioEngineTools' },
329
- { path: './narrative-engine.js', registerFn: 'registerNarrativeEngineTools' },
330
- { path: './social-engine.js', registerFn: 'registerSocialEngineTools' },
331
- { path: './evolution-engine.js', registerFn: 'registerEvolutionEngineTools' },
332
- { path: './coordination-engine.js', registerFn: 'registerCoordinationEngineTools' },
333
276
  { path: './foundation-engines.js', registerFn: 'registerFoundationEngineTools' },
334
- { path: './research-engine.js', registerFn: 'registerResearchEngineTools' },
335
- { path: './stream-overlay.js', registerFn: 'registerOverlayTools' },
336
- { path: './stream-weather.js', registerFn: 'registerStreamWeatherTools' },
337
- { path: './stream-chat-ai.js', registerFn: 'registerStreamChatAITools' },
338
- { path: './stream-vod.js', registerFn: 'registerStreamVODTools' },
339
- { path: './stream-commands.js', registerFn: 'registerStreamCommandsTools' },
340
- { path: '../coordinator.js', registerFn: 'registerCoordinatorTools' },
341
277
  { path: './swarm-2026-04.js', registerFn: 'registerSwarm2026Tools' },
342
278
  ];
343
279
  /** Track whether lazy tools have been registered */
@@ -939,6 +939,7 @@ export function registerKBotBrowserTools() {
939
939
  });
940
940
  registerTool({
941
941
  name: 'kbot_read',
942
+ deprecated: true,
942
943
  description: "Get the current page content in reader mode (clean text, no clutter). Uses kbot's built-in browser.",
943
944
  parameters: {},
944
945
  tier: 'free',
@@ -182,6 +182,7 @@ export function registerQualityTools() {
182
182
  // ── Dependency Audit ──
183
183
  registerTool({
184
184
  name: 'deps_audit',
185
+ deprecated: true,
185
186
  description: 'Audit dependencies for known vulnerabilities. Returns CVE IDs, severity, and fix suggestions. Auto-detects npm, pip, cargo, go.',
186
187
  parameters: {
187
188
  fix: { type: 'boolean', description: 'Auto-fix vulnerabilities where possible (default: false)' },
@@ -2824,6 +2824,7 @@ export function registerRedBlueTools() {
2824
2824
  // ─── Tool 2: Blue Team Harden ────────────────────────────────────────────────
2825
2825
  registerTool({
2826
2826
  name: 'blueteam_harden',
2827
+ deprecated: true,
2827
2828
  description: 'Blue team: generate security hardening recommendations with ready-to-use code snippets. Produces security headers middleware, input validation patterns, auth hardening, crypto best practices, and logging/monitoring setup. Returns actionable code that can be directly applied.',
2828
2829
  parameters: {
2829
2830
  path: { type: 'string', description: 'Directory to analyze for context (default: current directory)' },
@@ -2941,6 +2942,7 @@ export function registerRedBlueTools() {
2941
2942
  // ─── Tool 3: Red Team Report ─────────────────────────────────────────────────
2942
2943
  registerTool({
2943
2944
  name: 'redteam_report',
2945
+ deprecated: true,
2944
2946
  description: 'Generate a professional penetration test report (defensive security assessment). Runs a full security audit and formats results as an executive assessment with risk score, attack surface mapping, critical findings with exploitation scenarios for context, risk matrix, and prioritized remediation plan. Defensive security context: use only on systems you own or have explicit permission to test.',
2945
2947
  parameters: {
2946
2948
  path: { type: 'string', description: 'Directory to assess (default: current directory)' },
@@ -3193,6 +3195,7 @@ export function registerRedBlueTools() {
3193
3195
  // ─── Tool 4: Blue Team Checklist ─────────────────────────────────────────────
3194
3196
  registerTool({
3195
3197
  name: 'blueteam_checklist',
3198
+ deprecated: true,
3196
3199
  description: 'Generate a comprehensive security hardening checklist tailored to a specific framework. Covers authentication, input validation, security headers, cryptography, logging, rate limiting, CORS/CSRF, dependency management, secrets, and infrastructure. Returns checkboxes for tracking completion.',
3197
3200
  parameters: {
3198
3201
  framework: { type: 'string', description: 'Framework: "express", "nextjs", "fastify", "django", "flask", "rails", "generic" (default: "generic")' },
@@ -3211,6 +3214,7 @@ export function registerRedBlueTools() {
3211
3214
  // ─── Tool 5: Threat Model ────────────────────────────────────────────────────
3212
3215
  registerTool({
3213
3216
  name: 'threat_model',
3217
+ deprecated: true,
3214
3218
  description: 'Perform threat modeling on a codebase. Analyzes code structure to identify data flows, trust boundaries, and threats. Supports STRIDE (Spoofing, Tampering, Repudiation, Information Disclosure, DoS, Elevation of Privilege), DREAD (Damage, Reproducibility, Exploitability, Affected Users, Discoverability), and PASTA (Process for Attack Simulation and Threat Analysis) methodologies.',
3215
3219
  parameters: {
3216
3220
  path: { type: 'string', description: 'Directory to analyze (default: current directory)' },
@@ -2196,6 +2196,7 @@ export function registerSecurityBrainTools() {
2196
2196
  // ── Tool 1: security_brain ──────────────────────────────────────────
2197
2197
  registerTool({
2198
2198
  name: 'security_brain',
2199
+ deprecated: true,
2199
2200
  description: 'Query the security knowledge base. Covers MITRE ATT&CK (14 tactics, 200+ techniques), OWASP Top 10 (2025), Lockheed Martin Kill Chain, CVE patterns, and kbot security tool mapping. Use this as a first stop for any security question.',
2200
2201
  parameters: {
2201
2202
  topic: { type: 'string', description: 'What to look up — technique name, vulnerability type, attack pattern, tool name, or general security topic', required: true },
@@ -2340,6 +2341,7 @@ export function registerSecurityBrainTools() {
2340
2341
  // ── Tool 2: attack_lookup ───────────────────────────────────────────
2341
2342
  registerTool({
2342
2343
  name: 'attack_lookup',
2344
+ deprecated: true,
2343
2345
  description: 'Look up MITRE ATT&CK techniques by ID (T1566) or keyword (phishing). Returns technique details including tactic, description, sub-techniques, detection methods, and mitigations. Covers all 14 ATT&CK tactics with top techniques for each.',
2344
2346
  parameters: {
2345
2347
  query: { type: 'string', description: 'Technique ID (e.g., T1566, T1059.001) or keyword (e.g., phishing, injection, credential dumping)', required: true },
@@ -2425,6 +2427,7 @@ export function registerSecurityBrainTools() {
2425
2427
  // ── Tool 3: killchain_analyze ───────────────────────────────────────
2426
2428
  registerTool({
2427
2429
  name: 'killchain_analyze',
2430
+ deprecated: true,
2428
2431
  description: 'Map an attack or vulnerability description to Lockheed Martin Kill Chain stages. Provides kill chain stage mapping with confidence levels, related MITRE ATT&CK techniques, OWASP entries, CVE patterns, and defensive recommendations with specific kbot tools.',
2429
2432
  parameters: {
2430
2433
  description: { type: 'string', description: 'Description of the attack, vulnerability, or threat scenario to analyze and map to kill chain stages', required: true },
@@ -621,6 +621,7 @@ function formatReport(report) {
621
621
  export function registerSecurityHuntTools() {
622
622
  registerTool({
623
623
  name: 'security_hunt',
624
+ deprecated: true,
624
625
  description: 'Defensive security audit — chains kbot\'s security scanners into a single comprehensive sweep. Scans for: open ports, SSL issues, missing headers, hardcoded secrets, dependency CVEs, supply chain risks, OWASP Top 10 code vulnerabilities, and dangerous patterns. Returns a scored report with severity ratings and fix recommendations. Defensive security context: use only on systems you own or have explicit permission to test.',
625
626
  parameters: {
626
627
  path: {
@@ -13,6 +13,7 @@ export function registerSecurityTools() {
13
13
  // ─── Dependency Audit ───
14
14
  registerTool({
15
15
  name: 'dep_audit',
16
+ deprecated: true,
16
17
  description: 'Audit project dependencies for known vulnerabilities. Runs npm audit, pip audit, or cargo audit depending on the project. Returns CVE IDs, severity, and fix recommendations.',
17
18
  parameters: {
18
19
  path: { type: 'string', description: 'Project directory to audit (default: current directory)' },
@@ -132,6 +133,7 @@ export function registerSecurityTools() {
132
133
  // ─── Secret Scanner ───
133
134
  registerTool({
134
135
  name: 'secret_scan',
136
+ deprecated: true,
135
137
  description: 'Scan files for accidentally committed secrets — API keys, tokens, passwords, private keys. Checks common patterns (AWS, Stripe, GitHub, Supabase, etc). Does NOT read .env files.',
136
138
  parameters: {
137
139
  path: { type: 'string', description: 'Directory to scan (default: current directory)' },
@@ -233,6 +235,7 @@ export function registerSecurityTools() {
233
235
  // ─── SSL/TLS Check ───
234
236
  registerTool({
235
237
  name: 'ssl_check',
238
+ deprecated: true,
236
239
  description: 'Check SSL/TLS certificate for any domain — expiry date, issuer, protocol, and security grade. Catches expiring certs before they break your site.',
237
240
  parameters: {
238
241
  domain: { type: 'string', description: 'Domain to check (e.g. "kernel.chat", "api.example.com")', required: true },
@@ -281,6 +284,7 @@ export function registerSecurityTools() {
281
284
  // ─── Security Headers Check ───
282
285
  registerTool({
283
286
  name: 'headers_check',
287
+ deprecated: true,
284
288
  description: 'Check HTTP security headers for any URL — CSP, HSTS, X-Frame-Options, etc. Reports missing headers that leave you vulnerable to XSS, clickjacking, and MIME sniffing.',
285
289
  parameters: {
286
290
  url: { type: 'string', description: 'URL to check (e.g. "https://kernel.chat")', required: true },
@@ -334,6 +338,7 @@ export function registerSecurityTools() {
334
338
  // ─── CVE Lookup ───
335
339
  registerTool({
336
340
  name: 'cve_lookup',
341
+ deprecated: true,
337
342
  description: 'Look up a CVE by ID or search for vulnerabilities affecting a specific package/product. Uses the NVD (National Vulnerability Database) API.',
338
343
  parameters: {
339
344
  query: { type: 'string', description: 'CVE ID (e.g. "CVE-2024-1234") or package name (e.g. "log4j", "openssl")', required: true },
@@ -475,6 +480,7 @@ export function registerSecurityTools() {
475
480
  // ─── OWASP Quick Check ───
476
481
  registerTool({
477
482
  name: 'owasp_check',
483
+ deprecated: true,
478
484
  description: 'Quick OWASP Top 10 check against a codebase. Scans for common vulnerability patterns: SQL injection, XSS, command injection, path traversal, hardcoded secrets, insecure deserialization.',
479
485
  parameters: {
480
486
  path: { type: 'string', description: 'Directory to scan (default: current directory)' },
@@ -501,6 +501,7 @@ function runTests(projectPath, opts = {}) {
501
501
  export function registerTestRunnerTools() {
502
502
  registerTool({
503
503
  name: 'run_tests',
504
+ deprecated: true,
504
505
  description: 'Run project tests. Auto-detects the test framework (vitest, jest, pytest, cargo, go, npm) by checking config files, runs tests, and returns structured pass/fail results with failure details the agent can use to auto-fix issues.',
505
506
  parameters: {
506
507
  path: { type: 'string', description: 'Project root path. Defaults to current working directory.' },
@@ -856,6 +856,7 @@ export function registerThreatIntelTools() {
856
856
  // ─── 1. threat_feed ─────────────────────────────────────────────────────────
857
857
  registerTool({
858
858
  name: 'threat_feed',
859
+ deprecated: true,
859
860
  description: 'Aggregate cyber threat intelligence from free public sources. Fetches recent high/critical CVEs from NIST NVD, recent exploits from Exploit-DB, and optionally matches against your tech stack (from dream journal insights). Returns top threats with severity, affected software, and stack relevance.',
860
861
  parameters: {
861
862
  days: { type: 'number', description: 'Look-back period in days (default: 7, max: 30)' },
@@ -1285,6 +1286,7 @@ export function registerThreatIntelTools() {
1285
1286
  // ─── 4. incident_response ───────────────────────────────────────────────────
1286
1287
  registerTool({
1287
1288
  name: 'incident_response',
1289
+ deprecated: true,
1288
1290
  description: 'Generate an incident response playbook for a security incident. Given an incident type and description, produces a structured playbook with containment steps, eradication plan, recovery checklist, lessons learned template, and IOC indicators. Uses local Ollama for contextual AI analysis when available. Incident types: ransomware, data_breach, ddos, insider_threat, supply_chain.',
1289
1291
  parameters: {
1290
1292
  incident_type: { type: 'string', description: 'Type of incident: ransomware, data_breach, ddos, insider_threat, supply_chain', required: true },
package/dist/ui.js CHANGED
@@ -123,7 +123,7 @@ export function banner(version) {
123
123
  ? gradient('kbot', [167, 139, 250], [103, 232, 249])
124
124
  : ACCENT('kbot');
125
125
  const title = ` ${bannerText}${v}`;
126
- const features = DIM(' Web search: free • 35 agents • 787+ tools • bring your own key');
126
+ const features = DIM(' Web search: free • 35 specialist agents • 100+ skills • bring your own key');
127
127
  return `\n${grid}\n${title}\n${features}\n`;
128
128
  }
129
129
  export function bannerCompact() {
@@ -283,7 +283,7 @@ export function printHelp() {
283
283
  ` ${CYAN('https://kernel.chat')} ${DIM('Web companion')}`,
284
284
  ` ${CYAN('https://github.com/isaacsight/kernel')} ${DIM('GitHub')}`,
285
285
  '',
286
- ` ${DIM('35 specialist agents. 787+ tools. Type anything to get started.')}`,
286
+ ` ${DIM('35 specialist agents. 100+ skills. Type anything to get started.')}`,
287
287
  '',
288
288
  ];
289
289
  status(lines.join('\n'));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kernel.chat/kbot",
3
- "version": "3.99.35",
4
- "description": "Open-source terminal AI agent. 787+ tools, 35 agents, 20 providers. Dreams, learns, watches your system. Controls your phone. Fully local, fully sovereign. MIT.",
3
+ "version": "4.0.0",
4
+ "description": "Open-source terminal AI agent. 100+ specialist skills, 35 specialist agents, 20 providers. Dreams, learns, watches your system. Controls your phone. Fully local, fully sovereign. MIT. v4.0 — evidence-based curation.",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",