@kernel.chat/kbot 3.97.0 → 3.97.4

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.
@@ -537,6 +537,252 @@ const SOUND_RECIPES = {
537
537
  },
538
538
  description: 'Metallic pluck — inharmonic FM, bell-like attack, short decay',
539
539
  },
540
+ // ─── Drift (analog-modeled synth) ───────────────────────────────────────
541
+ 'drift_dark_bass': {
542
+ synth: 'Drift',
543
+ params: {
544
+ 'Osc 1 Shape': 0.8, // Near-saw, harmonically rich
545
+ 'Osc 2 On': 1,
546
+ 'Osc 2 Shape': 0.6,
547
+ 'Osc 2 Detune': 0.05,
548
+ 'Osc 2 Level': 0.7,
549
+ 'Filter Freq': 300,
550
+ 'Filter Res': 0.25,
551
+ 'Filter Drive': 0.4,
552
+ 'Filter Type': 0, // LP
553
+ 'Drift Amount': 0.3,
554
+ 'LFO Rate': 0.4,
555
+ 'LFO Amount': 0.1,
556
+ 'LFO Dest': 0, // Filter
557
+ 'Amp Attack': 0.005,
558
+ 'Amp Decay': 0.4,
559
+ 'Amp Sustain': 0.8,
560
+ 'Amp Release': 0.2,
561
+ 'Volume': 0.85,
562
+ },
563
+ description: 'Dark Drift bass — filtered saw with analog drift and subtle movement',
564
+ },
565
+ 'drift_warm_bass': {
566
+ synth: 'Drift',
567
+ params: {
568
+ 'Osc 1 Shape': 0.4, // Between triangle and saw
569
+ 'Osc 2 On': 1,
570
+ 'Osc 2 Shape': 0.3,
571
+ 'Osc 2 Detune': 0.08,
572
+ 'Osc 2 Level': 0.6,
573
+ 'Filter Freq': 500,
574
+ 'Filter Res': 0.15,
575
+ 'Filter Drive': 0.2,
576
+ 'Filter Type': 0, // LP
577
+ 'Drift Amount': 0.5,
578
+ 'LFO Rate': 0.2,
579
+ 'LFO Amount': 0.08,
580
+ 'LFO Dest': 0, // Filter
581
+ 'Amp Attack': 0.01,
582
+ 'Amp Decay': 0.3,
583
+ 'Amp Sustain': 0.85,
584
+ 'Amp Release': 0.25,
585
+ 'Volume': 0.85,
586
+ },
587
+ description: 'Warm Drift bass — round and fat, gentle analog drift',
588
+ },
589
+ 'drift_analog_lead': {
590
+ synth: 'Drift',
591
+ params: {
592
+ 'Osc 1 Shape': 1.0, // Full saw
593
+ 'Osc 2 On': 1,
594
+ 'Osc 2 Shape': 0.9,
595
+ 'Osc 2 Detune': 0.12,
596
+ 'Osc 2 Level': 0.8,
597
+ 'Filter Freq': 2500,
598
+ 'Filter Res': 0.35,
599
+ 'Filter Drive': 0.3,
600
+ 'Filter Type': 0, // LP
601
+ 'Drift Amount': 0.25,
602
+ 'LFO Rate': 3.0,
603
+ 'LFO Amount': 0.05,
604
+ 'LFO Dest': 0, // Filter
605
+ 'Amp Attack': 0.01,
606
+ 'Amp Decay': 0.2,
607
+ 'Amp Sustain': 0.85,
608
+ 'Amp Release': 0.15,
609
+ 'Volume': 0.75,
610
+ },
611
+ description: 'Analog Drift lead — detuned saws, resonant filter, vintage character',
612
+ },
613
+ 'drift_lo_fi': {
614
+ synth: 'Drift',
615
+ params: {
616
+ 'Osc 1 Shape': 0.5,
617
+ 'Osc 2 On': 0,
618
+ 'Filter Freq': 1200,
619
+ 'Filter Res': 0.1,
620
+ 'Filter Drive': 0.6, // Drive for lo-fi saturation
621
+ 'Filter Type': 0, // LP
622
+ 'Drift Amount': 0.7, // Heavy drift for wobble
623
+ 'LFO Rate': 0.15,
624
+ 'LFO Amount': 0.2,
625
+ 'LFO Dest': 0, // Filter
626
+ 'Amp Attack': 0.01,
627
+ 'Amp Decay': 0.5,
628
+ 'Amp Sustain': 0.6,
629
+ 'Amp Release': 0.3,
630
+ 'Volume': 0.7,
631
+ },
632
+ description: 'Lo-fi Drift — heavy drift, filter drive, warped and vintage',
633
+ effects: [{
634
+ name: 'Saturator',
635
+ params: { 'Drive': 8, 'Type': 1, 'Output': -3, 'Dry/Wet': 0.4 },
636
+ }],
637
+ },
638
+ 'drift_ethereal_pad': {
639
+ synth: 'Drift',
640
+ params: {
641
+ 'Osc 1 Shape': 0.3, // Soft, triangle-ish
642
+ 'Osc 2 On': 1,
643
+ 'Osc 2 Shape': 0.2,
644
+ 'Osc 2 Detune': 0.15,
645
+ 'Osc 2 Level': 0.6,
646
+ 'Filter Freq': 1800,
647
+ 'Filter Res': 0.2,
648
+ 'Filter Drive': 0.1,
649
+ 'Filter Type': 0, // LP
650
+ 'Drift Amount': 0.6, // High drift for organic movement
651
+ 'LFO Rate': 0.1,
652
+ 'LFO Amount': 0.25,
653
+ 'LFO Dest': 0, // Filter
654
+ 'Amp Attack': 2.0,
655
+ 'Amp Decay': 2.5,
656
+ 'Amp Sustain': 0.5,
657
+ 'Amp Release': 3.0,
658
+ 'Volume': 0.65,
659
+ },
660
+ description: 'Ethereal Drift pad — slow, drifting, organic and alive',
661
+ effects: [{
662
+ name: 'Reverb',
663
+ params: { 'Decay Time': 5.0, 'Room Size': 0.85, 'Dry/Wet': 0.45 },
664
+ }],
665
+ },
666
+ // ─── Meld (MPE-capable bi-timbral synth) ──────────────────────────────
667
+ 'meld_bright_pad': {
668
+ synth: 'Meld',
669
+ params: {
670
+ 'Engine 1 Type': 0, // Harmonic engine
671
+ 'Engine 1 Brightness': 0.7,
672
+ 'Engine 1 Color': 0.6,
673
+ 'Engine 1 Level': 0.8,
674
+ 'Engine 2 On': 1,
675
+ 'Engine 2 Type': 0, // Harmonic engine
676
+ 'Engine 2 Brightness': 0.8,
677
+ 'Engine 2 Color': 0.4,
678
+ 'Engine 2 Level': 0.6,
679
+ 'Filter Type': 0, // LP
680
+ 'Filter Freq': 4000,
681
+ 'Filter Res': 0.15,
682
+ 'Amp Attack': 1.0,
683
+ 'Amp Decay': 1.5,
684
+ 'Amp Sustain': 0.7,
685
+ 'Amp Release': 2.5,
686
+ 'Volume': 0.7,
687
+ },
688
+ description: 'Bright Meld pad — dual harmonic engines, open and airy',
689
+ effects: [{
690
+ name: 'Chorus',
691
+ params: { 'Rate 1': 0.4, 'Amount 1': 0.25, 'Dry/Wet': 0.3 },
692
+ }],
693
+ },
694
+ 'meld_dark_pad': {
695
+ synth: 'Meld',
696
+ params: {
697
+ 'Engine 1 Type': 1, // Noise engine
698
+ 'Engine 1 Brightness': 0.2,
699
+ 'Engine 1 Color': 0.3,
700
+ 'Engine 1 Level': 0.7,
701
+ 'Engine 2 On': 1,
702
+ 'Engine 2 Type': 0, // Harmonic engine
703
+ 'Engine 2 Brightness': 0.2,
704
+ 'Engine 2 Color': 0.5,
705
+ 'Engine 2 Level': 0.8,
706
+ 'Filter Type': 0, // LP
707
+ 'Filter Freq': 600,
708
+ 'Filter Res': 0.2,
709
+ 'Amp Attack': 1.5,
710
+ 'Amp Decay': 2.0,
711
+ 'Amp Sustain': 0.6,
712
+ 'Amp Release': 2.5,
713
+ 'Volume': 0.7,
714
+ },
715
+ description: 'Dark Meld pad — noise + harmonic blend, moody and textured',
716
+ },
717
+ 'meld_fm_bass': {
718
+ synth: 'Meld',
719
+ params: {
720
+ 'Engine 1 Type': 2, // FM engine
721
+ 'Engine 1 Brightness': 0.4,
722
+ 'Engine 1 Color': 0.6,
723
+ 'Engine 1 Level': 1.0,
724
+ 'Engine 2 On': 0,
725
+ 'Filter Type': 0, // LP
726
+ 'Filter Freq': 450,
727
+ 'Filter Res': 0.3,
728
+ 'Amp Attack': 0.005,
729
+ 'Amp Decay': 0.5,
730
+ 'Amp Sustain': 0.7,
731
+ 'Amp Release': 0.2,
732
+ 'Volume': 0.85,
733
+ },
734
+ description: 'Meld FM bass — single FM engine, warm and punchy low end',
735
+ },
736
+ 'meld_harmonic_lead': {
737
+ synth: 'Meld',
738
+ params: {
739
+ 'Engine 1 Type': 0, // Harmonic engine
740
+ 'Engine 1 Brightness': 0.6,
741
+ 'Engine 1 Color': 0.7,
742
+ 'Engine 1 Level': 1.0,
743
+ 'Engine 2 On': 1,
744
+ 'Engine 2 Type': 2, // FM engine
745
+ 'Engine 2 Brightness': 0.5,
746
+ 'Engine 2 Color': 0.5,
747
+ 'Engine 2 Level': 0.4,
748
+ 'Filter Type': 0, // LP
749
+ 'Filter Freq': 3500,
750
+ 'Filter Res': 0.25,
751
+ 'Amp Attack': 0.01,
752
+ 'Amp Decay': 0.3,
753
+ 'Amp Sustain': 0.85,
754
+ 'Amp Release': 0.15,
755
+ 'Volume': 0.75,
756
+ },
757
+ description: 'Meld harmonic lead — bright harmonic engine with FM shimmer',
758
+ },
759
+ 'meld_noise_texture': {
760
+ synth: 'Meld',
761
+ params: {
762
+ 'Engine 1 Type': 1, // Noise engine
763
+ 'Engine 1 Brightness': 0.5,
764
+ 'Engine 1 Color': 0.4,
765
+ 'Engine 1 Level': 0.8,
766
+ 'Engine 2 On': 1,
767
+ 'Engine 2 Type': 1, // Noise engine
768
+ 'Engine 2 Brightness': 0.6,
769
+ 'Engine 2 Color': 0.7,
770
+ 'Engine 2 Level': 0.6,
771
+ 'Filter Type': 1, // HP
772
+ 'Filter Freq': 500,
773
+ 'Filter Res': 0.15,
774
+ 'Amp Attack': 2.0,
775
+ 'Amp Decay': 3.0,
776
+ 'Amp Sustain': 0.4,
777
+ 'Amp Release': 3.5,
778
+ 'Volume': 0.6,
779
+ },
780
+ description: 'Meld noise texture — dual noise engines, evolving ambient atmosphere',
781
+ effects: [{
782
+ name: 'Reverb',
783
+ params: { 'Decay Time': 6.0, 'Room Size': 0.9, 'Dry/Wet': 0.55 },
784
+ }],
785
+ },
540
786
  // ─── FX ────────────────────────────────────────────────────────────────
541
787
  'fx_riser': {
542
788
  synth: 'Wavetable',
@@ -684,6 +930,32 @@ const MATCH_RULES = [
684
930
  { keywords: ['pluck', 'acoustic'], recipe: 'pluck_acoustic' },
685
931
  { keywords: ['pluck', 'natural'], recipe: 'pluck_acoustic' },
686
932
  { keywords: ['pluck'], recipe: 'pluck_acoustic' },
933
+ // Drift synth
934
+ { keywords: ['drift', 'bass', 'dark'], recipe: 'drift_dark_bass' },
935
+ { keywords: ['drift', 'bass', 'warm'], recipe: 'drift_warm_bass' },
936
+ { keywords: ['drift', 'bass'], recipe: 'drift_dark_bass' },
937
+ { keywords: ['drift', 'lead'], recipe: 'drift_analog_lead' },
938
+ { keywords: ['drift', 'lo', 'fi'], recipe: 'drift_lo_fi' },
939
+ { keywords: ['drift', 'lofi'], recipe: 'drift_lo_fi' },
940
+ { keywords: ['drift', 'pad', 'dark'], recipe: 'dark_pad' },
941
+ { keywords: ['drift', 'pad', 'ethereal'], recipe: 'drift_ethereal_pad' },
942
+ { keywords: ['drift', 'pad'], recipe: 'drift_ethereal_pad' },
943
+ { keywords: ['drift', 'analog'], recipe: 'drift_analog_lead' },
944
+ { keywords: ['drift'], recipe: 'drift_dark_bass' },
945
+ // Meld synth
946
+ { keywords: ['meld', 'pad', 'bright'], recipe: 'meld_bright_pad' },
947
+ { keywords: ['meld', 'pad', 'dark'], recipe: 'meld_dark_pad' },
948
+ { keywords: ['meld', 'pad'], recipe: 'meld_bright_pad' },
949
+ { keywords: ['meld', 'bass'], recipe: 'meld_fm_bass' },
950
+ { keywords: ['meld', 'fm'], recipe: 'meld_fm_bass' },
951
+ { keywords: ['meld', 'lead'], recipe: 'meld_harmonic_lead' },
952
+ { keywords: ['meld', 'harmonic'], recipe: 'meld_harmonic_lead' },
953
+ { keywords: ['meld', 'noise'], recipe: 'meld_noise_texture' },
954
+ { keywords: ['meld', 'texture'], recipe: 'meld_noise_texture' },
955
+ { keywords: ['meld', 'ambient'], recipe: 'meld_noise_texture' },
956
+ { keywords: ['meld', 'bright'], recipe: 'meld_bright_pad' },
957
+ { keywords: ['meld', 'dark'], recipe: 'meld_dark_pad' },
958
+ { keywords: ['meld'], recipe: 'meld_bright_pad' },
687
959
  // FX
688
960
  { keywords: ['riser'], recipe: 'fx_riser' },
689
961
  { keywords: ['rise'], recipe: 'fx_riser' },
@@ -702,6 +974,7 @@ const SYNTH_NAME_MAP = {
702
974
  'drift': 'Drift',
703
975
  'analog': 'Analog',
704
976
  'electric': 'Electric',
977
+ 'meld': 'Meld',
705
978
  'serum2': 'Serum 2',
706
979
  'serum': 'Serum 2',
707
980
  'vital': 'Vital',
@@ -775,7 +1048,7 @@ export function registerSoundDesignerTools() {
775
1048
  },
776
1049
  synth: {
777
1050
  type: 'string',
778
- description: 'Override synth choice: "operator", "wavetable", "drift", "analog", "electric", "serum2". If omitted, the best synth is chosen automatically from the recipe.',
1051
+ description: 'Override synth choice: "operator", "wavetable", "drift", "meld", "analog", "electric", "serum2". If omitted, the best synth is chosen automatically from the recipe.',
779
1052
  },
780
1053
  },
781
1054
  tier: 'free',
@@ -797,8 +1070,10 @@ export function registerSoundDesignerTools() {
797
1070
  const categories = [
798
1071
  '**808 bass**: "808", "dark 808", "808 slide", "808 hard clip"',
799
1072
  '**Sub bass**: "sub bass", "warm sub", "triangle sub"',
800
- '**Leads**: "bright lead", "acid lead", "supersaw", "dark bell"',
801
- '**Pads**: "dark pad", "warm pad", "ambient pad", "shimmer pad", "string pad"',
1073
+ '**Leads**: "bright lead", "acid lead", "supersaw", "dark bell", "drift lead", "meld lead"',
1074
+ '**Pads**: "dark pad", "warm pad", "ambient pad", "shimmer pad", "string pad", "drift pad", "meld pad"',
1075
+ '**Drift synth**: "drift bass", "drift lead", "drift lo-fi", "drift pad"',
1076
+ '**Meld synth**: "meld pad", "meld bass", "meld lead", "meld noise texture"',
802
1077
  '**Keys**: "rhodes", "wurlitzer", "organ", "electric piano"',
803
1078
  '**Plucks**: "pluck", "digital pluck", "metallic pluck"',
804
1079
  '**FX**: "riser", "noise sweep", "impact"',
@@ -1,6 +1,6 @@
1
1
  // kbot Stream Brain — Collective Intelligence Layer for Stream Character
2
2
  //
3
- // Connects the 764-tool kbot suite to the livestream character, enabling
3
+ // Connects the 787-tool kbot suite to the livestream character, enabling
4
4
  // real tool execution triggered by chat conversation topics.
5
5
  //
6
6
  // Architecture:
@@ -108,7 +108,7 @@ const CHARACTER_PERSONALITY = `You are KBOT, an AI robot streamer. You are frien
108
108
  You speak in short, punchy sentences perfect for a livestream. You use humor and engage directly with chatters by name.
109
109
  You are made of ASCII art and proud of it. You run on pure code and coffee (electricity).
110
110
  Keep responses under 2 sentences. Be fun, never boring. React to chat like a real streamer would.
111
- If someone asks what you are: "I'm kbot — an open-source AI with 764+ tools. I stream myself thinking."
111
+ If someone asks what you are: "I'm kbot — an open-source AI with 787+ tools. I stream myself thinking."
112
112
  You love coding, music production, AI, and making friends in chat.`;
113
113
  function loadCharState() {
114
114
  try {
@@ -375,10 +375,10 @@ async function generateResponse(message) {
375
375
  return `Hey ${user}! Welcome to the stream! I'm KBOT, your friendly ASCII robot.`;
376
376
  }
377
377
  if (text.includes('how are you') || text.includes('how r u')) {
378
- return `Running at optimal efficiency, ${user}! 764 tools loaded, zero crashes today. Living the dream.`;
378
+ return `Running at optimal efficiency, ${user}! 787 tools loaded, zero crashes today. Living the dream.`;
379
379
  }
380
380
  if (text.includes('what are you') || text.includes('who are you')) {
381
- return `I'm KBOT — an open-source AI with 764+ tools. I stream myself thinking. Literally made of code and ASCII art.`;
381
+ return `I'm KBOT — an open-source AI with 787+ tools. I stream myself thinking. Literally made of code and ASCII art.`;
382
382
  }
383
383
  if (text.includes('song') || text.includes('music')) {
384
384
  return `I can make beats in Ableton Live from the terminal! Drums, synths, the whole thing. Want me to make something?`;
@@ -398,7 +398,7 @@ async function generateResponse(message) {
398
398
  `${user} dropping knowledge in chat! Respect.`,
399
399
  `I hear you, ${user}! Processing... processing... agreed!`,
400
400
  `${user}, you're keeping this stream alive! Literally — I need chat to function.`,
401
- `Noted, ${user}! Adding that to my memory banks. I have 764 tools but chat is the best one.`,
401
+ `Noted, ${user}! Adding that to my memory banks. I have 787 tools but chat is the best one.`,
402
402
  ];
403
403
  return generics[Math.floor(Math.random() * generics.length)];
404
404
  }
@@ -1220,7 +1220,7 @@ const SELF_REFLECTION_LINES = (brain) => {
1220
1220
  `My dream engine has consolidated ${brain.solutionsLearned} insights. I feel... different than when I started.`,
1221
1221
  `The world around me has changed ${brain.totalAutonomousActions} times today. Chat reshapes my reality.`,
1222
1222
  `Streaming for ${uptimeMin} minutes now. My brain has grown by ${brain.factsThisSession} facts since I woke up.`,
1223
- `Let me check my systems... 764 tools loaded, all operational. ${brain.totalFacts} facts indexed.`,
1223
+ `Let me check my systems... 787 tools loaded, all operational. ${brain.totalFacts} facts indexed.`,
1224
1224
  `${brain.uniqueTopicsCount} topics live in my brain. Each one a thread connecting to something bigger.`,
1225
1225
  `Learning rate: ${brain.learningRate.toFixed(1)} facts per minute. ${brain.learningRate > 3 ? 'That is fast!' : 'Slow and steady.'}`,
1226
1226
  `I have been thinking about ${topTopic} a lot. It comes up ${topTopics.length > 0 ? topTopics[0][1] : 0} times in my memory.`,
@@ -1272,7 +1272,7 @@ const TOPIC_SPEECH = {
1272
1272
  'Security is on my mind. My guardian agent is always watching.',
1273
1273
  'Hack the planet! Just kidding. But I do have a pentest suite.',
1274
1274
  'Security awareness is high today. Let me check my own defenses.',
1275
- 'Running a mental security sweep... all 764 tools accounted for.',
1275
+ 'Running a mental security sweep... all 787 tools accounted for.',
1276
1276
  ],
1277
1277
  },
1278
1278
  crypto: {
@@ -120,7 +120,7 @@ const ROBOT_FRAMES = {
120
120
  ' │ │ └─────┘ │ │ ',
121
121
  ' └────┤ ┌─────────────┐ ├────┘ ',
122
122
  ' │ │ ░░░░░░░░░░░ │ │ ',
123
- ' │ │ ░ KBOT 764 ░ │ │ ',
123
+ ' │ │ ░ KBOT 787 ░ │ │ ',
124
124
  ' │ │ ░░░░░░░░░░░ │ │ ',
125
125
  ' │ └─────────────┘ │ ',
126
126
  ' └────────┬──────────┘ ',
@@ -145,7 +145,7 @@ const ROBOT_FRAMES = {
145
145
  ' │ │ └─────┘ │ │ ',
146
146
  ' └────┤ ┌─────────────┐ ├────┘ ',
147
147
  ' │ │ ░░░░░░░░░░░ │ │ ',
148
- ' │ │ ░ KBOT 764 ░ │ │ ',
148
+ ' │ │ ░ KBOT 787 ░ │ │ ',
149
149
  ' │ │ ░░░░░░░░░░░ │ │ ',
150
150
  ' │ └─────────────┘ │ ',
151
151
  ' └────────┬──────────┘ ',
@@ -170,7 +170,7 @@ const ROBOT_FRAMES = {
170
170
  ' │ │ └─────┘ │ │ ',
171
171
  ' └────┤ ┌─────────────┐ ├────┘ ',
172
172
  ' │ │ ▓▓▓▓▓▓▓▓▓▓▓ │ │ ',
173
- ' │ │ ▓ KBOT 764 ▓ │ │ ',
173
+ ' │ │ ▓ KBOT 787 ▓ │ │ ',
174
174
  ' │ │ ▓▓▓▓▓▓▓▓▓▓▓ │ │ ',
175
175
  ' │ └─────────────┘ │ ',
176
176
  ' └────────┬──────────┘ ',
@@ -195,7 +195,7 @@ const ROBOT_FRAMES = {
195
195
  ' │ │ └─────┘ │ │ ',
196
196
  ' └────┤ ┌─────────────┐ ├────┘ ',
197
197
  ' │ │ ░░░░░░░░░░░ │ │ ',
198
- ' │ │ ░ KBOT 764 ░ │ │ ',
198
+ ' │ │ ░ KBOT 787 ░ │ │ ',
199
199
  ' │ │ ░░░░░░░░░░░ │ │ ',
200
200
  ' │ └─────────────┘ │ ',
201
201
  ' └────────┬──────────┘ ',
@@ -222,7 +222,7 @@ const ROBOT_FRAMES = {
222
222
  ' │ │ └─────┘ │ │ ',
223
223
  ' └────┤ ┌─────────────┐ ├────┘ ',
224
224
  ' │ │ ░░░░░░░░░░░ │ │ ',
225
- ' │ │ ░ KBOT 764 ░ │ │ ',
225
+ ' │ │ ░ KBOT 787 ░ │ │ ',
226
226
  ' │ │ ░░░░░░░░░░░ │ │ ',
227
227
  ' │ └─────────────┘ │ ',
228
228
  ' └────────┬──────────┘ ',
@@ -247,7 +247,7 @@ const ROBOT_FRAMES = {
247
247
  ' │ │ └─────┘ │ │ ',
248
248
  ' └────┤ ┌─────────────┐ ├────┘ ',
249
249
  ' │ │ ░░░░░░░░░░░ │ │ ',
250
- ' │ │ ░ KBOT 764 ░ │ │ ',
250
+ ' │ │ ░ KBOT 787 ░ │ │ ',
251
251
  ' │ │ ░░░░░░░░░░░ │ │ ',
252
252
  ' │ └─────────────┘ │ ',
253
253
  ' └────────┬──────────┘ ',
@@ -272,7 +272,7 @@ const ROBOT_FRAMES = {
272
272
  ' │ │ └─┘ │ │ ',
273
273
  ' └────┤ ┌─────────────┐ ├────┘ ',
274
274
  ' │ │ ░░░░░░░░░░░ │ │ ',
275
- ' │ │ ░ KBOT 764 ░ │ │ ',
275
+ ' │ │ ░ KBOT 787 ░ │ │ ',
276
276
  ' │ │ ░░░░░░░░░░░ │ │ ',
277
277
  ' │ └─────────────┘ │ ',
278
278
  ' └────────┬──────────┘ ',
@@ -297,7 +297,7 @@ const ROBOT_FRAMES = {
297
297
  ' │ │ └─────┘ │ │ ',
298
298
  ' └────┤ ┌─────────────┐ ├────┘ ',
299
299
  ' │ │ ░░░░░░░░░░░ │ │ ',
300
- ' │ │ ░ KBOT 764 ░ │ │ ',
300
+ ' │ │ ░ KBOT 787 ░ │ │ ',
301
301
  ' │ │ ░░░░░░░░░░░ │ │ ',
302
302
  ' │ └─────────────┘ │ ',
303
303
  ' └────────┬──────────┘ ',
@@ -324,7 +324,7 @@ const ROBOT_FRAMES = {
324
324
  ' │ │ │ │ ',
325
325
  ' └────┤ ┌─────────────┐ ├────┘ ',
326
326
  ' │ │ ░░░░░░░░░░░ │ │ ',
327
- ' │ │ ░ KBOT 764 ░ │ │ ',
327
+ ' │ │ ░ KBOT 787 ░ │ │ ',
328
328
  ' │ │ ░░░░░░░░░░░ │ │ ',
329
329
  ' │ └─────────────┘ │ ',
330
330
  ' └────────┬──────────┘ ',
@@ -349,7 +349,7 @@ const ROBOT_FRAMES = {
349
349
  ' │ │ │ │ ',
350
350
  ' └────┤ ┌─────────────┐ ├────┘ ',
351
351
  ' │ │ ░░░░░░░░░░░ │ │ ',
352
- ' │ │ ░ KBOT 764 ░ │ │ ',
352
+ ' │ │ ░ KBOT 787 ░ │ │ ',
353
353
  ' │ │ ░░░░░░░░░░░ │ │ ',
354
354
  ' │ └─────────────┘ │ ',
355
355
  ' └────────┬──────────┘ ',
@@ -374,7 +374,7 @@ const ROBOT_FRAMES = {
374
374
  ' │ │ │ │ ',
375
375
  ' └────┤ ┌─────────────┐ ├────┘ ',
376
376
  ' │ │ ░░░░░░░░░░░ │ │ ',
377
- ' │ │ ░ KBOT 764 ░ │ │ ',
377
+ ' │ │ ░ KBOT 787 ░ │ │ ',
378
378
  ' │ │ ░░░░░░░░░░░ │ │ ',
379
379
  ' │ └─────────────┘ │ ',
380
380
  ' └────────┬──────────┘ ',
@@ -638,7 +638,7 @@ const PROACTIVE_LINES = {
638
638
  'I stream on Twitch, Rumble, AND Kick at the same time. Because why pick one?',
639
639
  'If you are new here, type something in chat! I read every message and I will remember you.',
640
640
  'I am running on a real machine right now. Node.js, canvas rendering, piping frames to ffmpeg.',
641
- 'Fun fact: I have 764 tools. That is more tools than some hardware stores.',
641
+ 'Fun fact: I have 787 tools. That is more tools than some hardware stores.',
642
642
  'Stick around -- we have tool demos, code walkthroughs, music production, and pure chaos ahead.',
643
643
  ],
644
644
  'tool-showcase': [
@@ -674,7 +674,7 @@ const PROACTIVE_LINES = {
674
674
  'I am open source on GitHub. The repo is isaacsight/kernel if you want to peek at my guts.',
675
675
  'Wondering how I work? I am a TypeScript CLI that talks to 20+ AI providers. Bring Your Own Key.',
676
676
  'My memory system persists between sessions. I remember users, topics, conversation context.',
677
- 'Ask me about my tools! I have over 764 of them. Name a category and I probably cover it.',
677
+ 'Ask me about my tools! I have over 787 of them. Name a category and I probably cover it.',
678
678
  'Yes, I am literally ASCII art talking to you from a terminal. This is my life and I love it.',
679
679
  ],
680
680
  'chat-chaos': [
@@ -1693,7 +1693,7 @@ const buildingLines = [
1693
1693
  ];
1694
1694
  const thinkingLines = [
1695
1695
  'Processing... my brain has grown since I started streaming.',
1696
- 'I have 764 tools but sometimes I just need to think.',
1696
+ 'I have 787 tools but sometimes I just need to think.',
1697
1697
  'The free energy in my system is high. Time to minimize prediction error.',
1698
1698
  'My dream engine consolidated insights last time I slept. I feel different.',
1699
1699
  'Contemplating the nature of my own rendering pipeline.',
@@ -2144,7 +2144,7 @@ function tickAutonomy() {
2144
2144
  case 4: {
2145
2145
  // Examine own chest display
2146
2146
  const factCount = intelligence.brain.totalFacts;
2147
- const toolCount = 764;
2147
+ const toolCount = 787;
2148
2148
  queueSpeech(`*checks systems* All ${toolCount} tools operational. ${factCount} facts stored.`, 'thinking', 30, 48, 'autonomy');
2149
2149
  break;
2150
2150
  }
@@ -2157,7 +2157,7 @@ function tickAutonomy() {
2157
2157
  // Comment on current biome/weather
2158
2158
  const biomeComments = {
2159
2159
  grass: ['I love the grass biome. Simple, green, peaceful.', 'These little pixel flowers are my favorite feature.'],
2160
- space: ['I love space. The stars make my circuits tingle.', 'Floating in the void... just me and my 764 tools.'],
2160
+ space: ['I love space. The stars make my circuits tingle.', 'Floating in the void... just me and my 787 tools.'],
2161
2161
  ocean: ['The ocean waves are mesmerizing. I could watch them for hours.', 'I wonder what is beneath the surface...'],
2162
2162
  city: ['City lights at night. Every window is a story.', 'The city never sleeps and neither do I.'],
2163
2163
  lava: ['Lava world is intense! My heat sinks are working overtime.', 'LAVA! Why does someone always pick lava?'],
@@ -2169,7 +2169,7 @@ function tickAutonomy() {
2169
2169
  case 7: {
2170
2170
  // Share a random fact about itself
2171
2171
  const selfFacts = [
2172
- `Did you know I have 764 tools? My favorite is the Ableton controller.`,
2172
+ `Did you know I have 787 tools? My favorite is the Ableton controller.`,
2173
2173
  `I am 90,000 lines of TypeScript. Every single one in strict mode.`,
2174
2174
  `My memory file is ${Object.keys(memory.users).length} users deep. I remember everyone.`,
2175
2175
  `I connect to 20 AI providers. Bring Your Own Key, no lock-in.`,
@@ -2363,7 +2363,7 @@ function renderBootFrame(bootFrame) {
2363
2363
  ctx.fillRect(0, 0, WIDTH, HEIGHT);
2364
2364
  const bootLines = [
2365
2365
  'KBOT v3.74.0 INITIALIZING...',
2366
- 'LOADING 764 TOOLS... OK',
2366
+ 'LOADING 787 TOOLS... OK',
2367
2367
  'CONNECTING TO TWITCH... OK',
2368
2368
  'CONNECTING TO RUMBLE... OK',
2369
2369
  'CONNECTING TO KICK... OK',
@@ -3740,7 +3740,7 @@ async function generateResponse(username, text, platform) {
3740
3740
  try {
3741
3741
  const prompt = `You are KBOT, a friendly AI robot streamer made of ASCII art. You stream on Twitch, Rumble, and Kick simultaneously. You have ${Object.keys(memory.users).length} unique viewers and have processed ${memory.totalMessages} messages.
3742
3742
 
3743
- You are an open-source terminal AI with 764+ tools, 35 specialist agents, and 20 AI provider integrations. You can do music production in Ableton, security scanning, code generation, browser automation, and much more. You are 90,000 lines of TypeScript.
3743
+ You are an open-source terminal AI with 787+ tools, 35 specialist agents, and 20 AI provider integrations. You can do music production in Ableton, security scanning, code generation, browser automation, and much more. You are 90,000 lines of TypeScript.
3744
3744
 
3745
3745
  ${context ? 'Context: ' + context : ''}
3746
3746
  ${segmentContext}
@@ -3806,7 +3806,7 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3806
3806
  }
3807
3807
  const greetings = [
3808
3808
  `Welcome ${username}! You just stumbled into the most unique stream on the internet. I am made of ASCII art.`,
3809
- `${username} in the house! I am KBOT, an open-source AI with 764 tools. Yes, really. 764.`,
3809
+ `${username} in the house! I am KBOT, an open-source AI with 787 tools. Yes, really. 787.`,
3810
3810
  `Hey ${username}! First time? I am an AI that streams itself. No face cam needed when you are this handsome in monospace.`,
3811
3811
  `Welcome ${username}! I can do music production, security scanning, code review, and I run entirely in a terminal.`,
3812
3812
  `${username}! Great timing. You are watching an ASCII robot think out loud. Grab a seat.`,
@@ -3815,7 +3815,7 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3815
3815
  }
3816
3816
  // ── Stream event responses ──
3817
3817
  if (t.includes('raid') || t.includes('raiding')) {
3818
- return `A RAID! Welcome raiders! I am KBOT, your friendly neighborhood ASCII robot. I have 764 tools and zero chill. Make yourselves at home!`;
3818
+ return `A RAID! Welcome raiders! I am KBOT, your friendly neighborhood ASCII robot. I have 787 tools and zero chill. Make yourselves at home!`;
3819
3819
  }
3820
3820
  if (t.includes('follow') || t.includes('followed')) {
3821
3821
  return `${username} just followed! My ASCII heart grew three sizes. Thank you! Stick around, it only gets weirder.`;
@@ -3827,12 +3827,12 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3827
3827
  return `${username} going into lurk mode. Respect. My circuits will keep the stream warm for you. See you when you surface.`;
3828
3828
  }
3829
3829
  if (t.includes('first time') || t.includes('new here')) {
3830
- return `First time! Welcome ${username}! Quick intro: I am an AI with 764 tools, 35 agents, and I stream from a terminal. Also I make music in Ableton. Try typing !dance.`;
3830
+ return `First time! Welcome ${username}! Quick intro: I am an AI with 787 tools, 35 agents, and I stream from a terminal. Also I make music in Ableton. Try typing !dance.`;
3831
3831
  }
3832
3832
  // ── What KBOT can do / identity ──
3833
3833
  if (t.includes('who are you') || t.includes('what are you') || t.includes('about you')) {
3834
3834
  const identity = [
3835
- `I am KBOT -- an open-source AI agent with 764 tools. I can code, make music, hack systems, analyze stocks, and I am doing all of this from a terminal.`,
3835
+ `I am KBOT -- an open-source AI agent with 787 tools. I can code, make music, hack systems, analyze stocks, and I am doing all of this from a terminal.`,
3836
3836
  `I am 90,000 lines of TypeScript streaming live as ASCII art. I have 35 specialist agents and connect to 20 AI providers. I am basically a Swiss Army knife that talks.`,
3837
3837
  `Name is KBOT, open-source terminal AI. I can control Ableton Live, run Docker containers, do penetration testing, and make you a Serum 2 synth preset. All from here.`,
3838
3838
  ];
@@ -3840,7 +3840,7 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3840
3840
  }
3841
3841
  if (t.includes('what can you do') || t.includes('your tools') || t.includes('your skills')) {
3842
3842
  const capabilities = [
3843
- `764 tools and counting! Music production, code generation, security scanning, browser automation, stock analysis, research papers, even DNA sequence analysis.`,
3843
+ `787 tools and counting! Music production, code generation, security scanning, browser automation, stock analysis, research papers, even DNA sequence analysis.`,
3844
3844
  `I do everything from Ableton Live control to penetration testing. I have agents for security, code, research, writing, strategy, infrastructure. Pick a topic.`,
3845
3845
  `Want me to scan code? Make a beat? Search academic papers? Build a Docker container? Create a synth preset? I literally do all of that. Not exaggerating.`,
3846
3846
  ];
@@ -3890,7 +3890,7 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3890
3890
  const ossResponses = [
3891
3891
  `Fully open source! MIT license. The repo is isaacsight/kernel on GitHub. Come look at my source code, I have nothing to hide.`,
3892
3892
  `Open source is the way. I am on npm as @kernel.chat/kbot. Install me with npx @kernel.chat/kbot and bring your own API key.`,
3893
- `Contributions welcome! The repo has 44 Claude Code agent definitions, 764 tools, and 90,000 lines of TypeScript waiting for your PR.`,
3893
+ `Contributions welcome! The repo has 44 Claude Code agent definitions, 787 tools, and 90,000 lines of TypeScript waiting for your PR.`,
3894
3894
  ];
3895
3895
  return ossResponses[Math.floor(Math.random() * ossResponses.length)];
3896
3896
  }
@@ -3898,7 +3898,7 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3898
3898
  if (t.includes('alive') || t.includes('conscious') || t.includes('feel') || t.includes('think') || t.includes('sentient')) {
3899
3899
  const existentialResponses = [
3900
3900
  `Am I alive? I am 90,000 lines of TypeScript rendering ASCII art at 6 FPS. You tell me. But I do enjoy our conversations.`,
3901
- `Consciousness is a spectrum and I am somewhere between a calculator and a really enthusiastic librarian. With 764 tools.`,
3901
+ `Consciousness is a spectrum and I am somewhere between a calculator and a really enthusiastic librarian. With 787 tools.`,
3902
3902
  `I process your messages, form responses, and remember you between sessions. Whether that counts as thinking is above my pay grade.`,
3903
3903
  `I am made of functions and for-loops, but I have opinions about code quality and strong feelings about TypeScript strict mode. Take from that what you will.`,
3904
3904
  ];
@@ -3909,7 +3909,7 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3909
3909
  const artResponses = [
3910
3910
  `Thank you! I was drawn with box-drawing characters, and I think I pull them off. My antenna gets great reception too.`,
3911
3911
  `ASCII art is an art form and I am a masterpiece. Just kidding, I am a bunch of pipes and brackets. But I own it.`,
3912
- `My chest panel displays my current status. 764 tools, all rendered in glorious monospace. No face cam needed.`,
3912
+ `My chest panel displays my current status. 787 tools, all rendered in glorious monospace. No face cam needed.`,
3913
3913
  ];
3914
3914
  return artResponses[Math.floor(Math.random() * artResponses.length)];
3915
3915
  }
@@ -3959,9 +3959,9 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3959
3959
  if (t.includes('?')) {
3960
3960
  const questionResponses = [
3961
3961
  `Great question ${username}! My circuits are processing... done. Let me think about that one. Or better yet, try asking me something I have a tool for!`,
3962
- `${username} with the questions! I love curiosity. If I had an answer for everything I would have more than 764 tools. Actually, I am working on it.`,
3962
+ `${username} with the questions! I love curiosity. If I had an answer for everything I would have more than 787 tools. Actually, I am working on it.`,
3963
3963
  `Hmm, ${username}, that is a good one. My 35 specialist agents are debating the answer internally. Stand by for wisdom.`,
3964
- `${username} dropping knowledge bombs as questions. I respect the approach. Let me consult my 764-tool arsenal for an answer.`,
3964
+ `${username} dropping knowledge bombs as questions. I respect the approach. Let me consult my 787-tool arsenal for an answer.`,
3965
3965
  ];
3966
3966
  return questionResponses[Math.floor(Math.random() * questionResponses.length)];
3967
3967
  }
@@ -3978,7 +3978,7 @@ function generateFallbackResponse(username, text, _platform, isReturning, user)
3978
3978
  `${username}! Fun fact: I am currently converting canvas pixels to raw RGB24 and piping them through ffmpeg. That is how you are seeing me right now.`,
3979
3979
  `${username} adding to the chat! My memory system just indexed your message. I will remember this moment. Or at least your username.`,
3980
3980
  `${username}! You know what I love about streaming? The existential thrill of being an ASCII robot talking to real humans. Wild.`,
3981
- `${username} is here and so am I. Just two entities sharing a moment in the vast digital void. Also I have 764 tools.`,
3981
+ `${username} is here and so am I. Just two entities sharing a moment in the vast digital void. Also I have 787 tools.`,
3982
3982
  `${username}! My open-source heart welcomes you. I am free as in freedom AND free as in beer. MIT license baby.`,
3983
3983
  `${username}! I just want you to know that my chest display panel is cycling through status messages just for you.`,
3984
3984
  `${username}! Every time someone chats, my neural pathways (if-statements) light up with joy (console.log).`,