@timmeck/brain-core 2.36.56 → 2.36.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +6 -0
  2. package/command-center.html +133 -2
  3. package/dist/action/__tests__/action-bridge.test.d.ts +1 -0
  4. package/dist/action/__tests__/action-bridge.test.js +145 -0
  5. package/dist/action/__tests__/action-bridge.test.js.map +1 -0
  6. package/dist/action/__tests__/content-handler.test.d.ts +1 -0
  7. package/dist/action/__tests__/content-handler.test.js +100 -0
  8. package/dist/action/__tests__/content-handler.test.js.map +1 -0
  9. package/dist/action/__tests__/trade-handler.test.d.ts +1 -0
  10. package/dist/action/__tests__/trade-handler.test.js +165 -0
  11. package/dist/action/__tests__/trade-handler.test.js.map +1 -0
  12. package/dist/action/action-bridge.d.ts +95 -0
  13. package/dist/action/action-bridge.js +242 -0
  14. package/dist/action/action-bridge.js.map +1 -0
  15. package/dist/action/handlers/content-handler.d.ts +23 -0
  16. package/dist/action/handlers/content-handler.js +30 -0
  17. package/dist/action/handlers/content-handler.js.map +1 -0
  18. package/dist/action/handlers/index.d.ts +4 -0
  19. package/dist/action/handlers/index.js +3 -0
  20. package/dist/action/handlers/index.js.map +1 -0
  21. package/dist/action/handlers/trade-handler.d.ts +43 -0
  22. package/dist/action/handlers/trade-handler.js +43 -0
  23. package/dist/action/handlers/trade-handler.js.map +1 -0
  24. package/dist/action/index.d.ts +4 -0
  25. package/dist/action/index.js +3 -0
  26. package/dist/action/index.js.map +1 -0
  27. package/dist/agent-training/__tests__/agent-trainer.test.d.ts +1 -0
  28. package/dist/agent-training/__tests__/agent-trainer.test.js +158 -0
  29. package/dist/agent-training/__tests__/agent-trainer.test.js.map +1 -0
  30. package/dist/agent-training/__tests__/sub-agent-factory.test.d.ts +1 -0
  31. package/dist/agent-training/__tests__/sub-agent-factory.test.js +100 -0
  32. package/dist/agent-training/__tests__/sub-agent-factory.test.js.map +1 -0
  33. package/dist/agent-training/__tests__/sub-agent.test.d.ts +1 -0
  34. package/dist/agent-training/__tests__/sub-agent.test.js +102 -0
  35. package/dist/agent-training/__tests__/sub-agent.test.js.map +1 -0
  36. package/dist/agent-training/index.d.ts +4 -0
  37. package/dist/agent-training/index.js +2 -0
  38. package/dist/agent-training/index.js.map +1 -1
  39. package/dist/agent-training/sub-agent-factory.d.ts +36 -0
  40. package/dist/agent-training/sub-agent-factory.js +128 -0
  41. package/dist/agent-training/sub-agent-factory.js.map +1 -0
  42. package/dist/agent-training/sub-agent.d.ts +57 -0
  43. package/dist/agent-training/sub-agent.js +135 -0
  44. package/dist/agent-training/sub-agent.js.map +1 -0
  45. package/dist/chat/__tests__/chat-engine.test.d.ts +1 -0
  46. package/dist/chat/__tests__/chat-engine.test.js +128 -0
  47. package/dist/chat/__tests__/chat-engine.test.js.map +1 -0
  48. package/dist/chat/chat-engine.d.ts +55 -0
  49. package/dist/chat/chat-engine.js +186 -0
  50. package/dist/chat/chat-engine.js.map +1 -0
  51. package/dist/chat/index.d.ts +2 -0
  52. package/dist/chat/index.js +2 -0
  53. package/dist/chat/index.js.map +1 -0
  54. package/dist/codegen/__tests__/code-forge.test.d.ts +1 -0
  55. package/dist/codegen/__tests__/code-forge.test.js +105 -0
  56. package/dist/codegen/__tests__/code-forge.test.js.map +1 -0
  57. package/dist/codegen/code-forge.d.ts +87 -0
  58. package/dist/codegen/code-forge.js +211 -0
  59. package/dist/codegen/code-forge.js.map +1 -0
  60. package/dist/codegen/index.d.ts +2 -0
  61. package/dist/codegen/index.js +1 -0
  62. package/dist/codegen/index.js.map +1 -1
  63. package/dist/content/__tests__/auto-publisher.test.d.ts +1 -0
  64. package/dist/content/__tests__/auto-publisher.test.js +125 -0
  65. package/dist/content/__tests__/auto-publisher.test.js.map +1 -0
  66. package/dist/content/__tests__/content-forge.test.d.ts +1 -0
  67. package/dist/content/__tests__/content-forge.test.js +117 -0
  68. package/dist/content/__tests__/content-forge.test.js.map +1 -0
  69. package/dist/content/auto-publisher.d.ts +51 -0
  70. package/dist/content/auto-publisher.js +147 -0
  71. package/dist/content/auto-publisher.js.map +1 -0
  72. package/dist/content/content-forge.d.ts +106 -0
  73. package/dist/content/content-forge.js +232 -0
  74. package/dist/content/content-forge.js.map +1 -0
  75. package/dist/content/index.d.ts +4 -0
  76. package/dist/content/index.js +3 -0
  77. package/dist/content/index.js.map +1 -0
  78. package/dist/creative/__tests__/creative-engine.test.d.ts +1 -0
  79. package/dist/creative/__tests__/creative-engine.test.js +151 -0
  80. package/dist/creative/__tests__/creative-engine.test.js.map +1 -0
  81. package/dist/cross-brain/__tests__/signal-router.test.d.ts +1 -0
  82. package/dist/cross-brain/__tests__/signal-router.test.js +159 -0
  83. package/dist/cross-brain/__tests__/signal-router.test.js.map +1 -0
  84. package/dist/cross-brain/signal-router.d.ts +57 -0
  85. package/dist/cross-brain/signal-router.js +148 -0
  86. package/dist/cross-brain/signal-router.js.map +1 -0
  87. package/dist/dashboard/__tests__/command-center-server.test.js +31 -0
  88. package/dist/dashboard/__tests__/command-center-server.test.js.map +1 -1
  89. package/dist/dashboard/command-center-server.d.ts +11 -0
  90. package/dist/dashboard/command-center-server.js +72 -0
  91. package/dist/dashboard/command-center-server.js.map +1 -1
  92. package/dist/dream/__tests__/dream-engine.test.d.ts +1 -0
  93. package/dist/dream/__tests__/dream-engine.test.js +184 -0
  94. package/dist/dream/__tests__/dream-engine.test.js.map +1 -0
  95. package/dist/feedback/__tests__/feedback-router.test.d.ts +1 -0
  96. package/dist/feedback/__tests__/feedback-router.test.js +173 -0
  97. package/dist/feedback/__tests__/feedback-router.test.js.map +1 -0
  98. package/dist/feedback/feedback-router.d.ts +53 -0
  99. package/dist/feedback/feedback-router.js +193 -0
  100. package/dist/feedback/feedback-router.js.map +1 -0
  101. package/dist/feedback/index.d.ts +2 -0
  102. package/dist/feedback/index.js +1 -0
  103. package/dist/feedback/index.js.map +1 -1
  104. package/dist/goals/__tests__/goal-engine.test.d.ts +1 -0
  105. package/dist/goals/__tests__/goal-engine.test.js +203 -0
  106. package/dist/goals/__tests__/goal-engine.test.js.map +1 -0
  107. package/dist/guardrails/__tests__/guardrail-engine.test.d.ts +1 -0
  108. package/dist/guardrails/__tests__/guardrail-engine.test.js +343 -0
  109. package/dist/guardrails/__tests__/guardrail-engine.test.js.map +1 -0
  110. package/dist/index.d.ts +16 -0
  111. package/dist/index.js +13 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/metacognition/__tests__/auto-experiment-engine.test.d.ts +1 -0
  114. package/dist/metacognition/__tests__/auto-experiment-engine.test.js +218 -0
  115. package/dist/metacognition/__tests__/auto-experiment-engine.test.js.map +1 -0
  116. package/dist/metacognition/__tests__/evolution-engine.test.d.ts +1 -0
  117. package/dist/metacognition/__tests__/evolution-engine.test.js +473 -0
  118. package/dist/metacognition/__tests__/evolution-engine.test.js.map +1 -0
  119. package/dist/metacognition/__tests__/parameter-registry.test.d.ts +1 -0
  120. package/dist/metacognition/__tests__/parameter-registry.test.js +223 -0
  121. package/dist/metacognition/__tests__/parameter-registry.test.js.map +1 -0
  122. package/dist/prediction/__tests__/prediction-engine.test.d.ts +1 -0
  123. package/dist/prediction/__tests__/prediction-engine.test.js +244 -0
  124. package/dist/prediction/__tests__/prediction-engine.test.js.map +1 -0
  125. package/dist/research/research-orchestrator.d.ts +12 -0
  126. package/dist/research/research-orchestrator.js +109 -0
  127. package/dist/research/research-orchestrator.js.map +1 -1
  128. package/dist/sandbox/__tests__/code-sandbox.test.d.ts +1 -0
  129. package/dist/sandbox/__tests__/code-sandbox.test.js +182 -0
  130. package/dist/sandbox/__tests__/code-sandbox.test.js.map +1 -0
  131. package/dist/scanner/__tests__/signal-scanner.test.d.ts +1 -0
  132. package/dist/scanner/__tests__/signal-scanner.test.js +142 -0
  133. package/dist/scanner/__tests__/signal-scanner.test.js.map +1 -0
  134. package/dist/self-modification/__tests__/self-modification-engine.test.d.ts +1 -0
  135. package/dist/self-modification/__tests__/self-modification-engine.test.js +255 -0
  136. package/dist/self-modification/__tests__/self-modification-engine.test.js.map +1 -0
  137. package/dist/strategy/__tests__/strategy-forge.test.d.ts +1 -0
  138. package/dist/strategy/__tests__/strategy-forge.test.js +190 -0
  139. package/dist/strategy/__tests__/strategy-forge.test.js.map +1 -0
  140. package/dist/strategy/__tests__/strategy-mutator.test.d.ts +1 -0
  141. package/dist/strategy/__tests__/strategy-mutator.test.js +141 -0
  142. package/dist/strategy/__tests__/strategy-mutator.test.js.map +1 -0
  143. package/dist/strategy/index.d.ts +4 -0
  144. package/dist/strategy/index.js +3 -0
  145. package/dist/strategy/index.js.map +1 -0
  146. package/dist/strategy/strategy-forge.d.ts +114 -0
  147. package/dist/strategy/strategy-forge.js +296 -0
  148. package/dist/strategy/strategy-forge.js.map +1 -0
  149. package/dist/strategy/strategy-mutator.d.ts +42 -0
  150. package/dist/strategy/strategy-mutator.js +140 -0
  151. package/dist/strategy/strategy-mutator.js.map +1 -0
  152. package/package.json +1 -1
package/README.md CHANGED
@@ -147,6 +147,12 @@ Brain Core is the nervous system that powers all three Brain MCP servers ([Brain
147
147
  | **PluginMarketplace** | Plugin discovery, rating, and installation |
148
148
  | **CodeSandbox** | Docker-isolated code execution for safe experimentation |
149
149
  | **MessagingInput** | Bidirectional Telegram + Discord bots for remote control |
150
+ | **ChatEngine** | Natural language interface with NLU intent routing + IPC dispatch |
151
+ | **SubAgentFactory** | Specialized sub-agent creation for focused tasks |
152
+ | **FeedbackRouter** | Dead-end data routing to ActionBridge proposals |
153
+ | **StrategyMutator** | Strategy evolution: mutation, crossover, tournament selection |
154
+ | **CrossBrainSignalRouter** | Bidirectional cross-brain signal routing with confidence filtering |
155
+ | **AutoPublisher** | Autonomous content publishing with schedule optimization |
150
156
 
151
157
  ### Utilities
152
158
 
@@ -222,6 +222,21 @@ canvas{display:block;width:100%;height:100%}
222
222
  @media(max-width:600px){
223
223
  .grid-3,.grid-2,.grid-4{grid-template-columns:1fr}
224
224
  }
225
+ /* ── Chat Panel ─────────────────────────────────────────── */
226
+ .chat-fab{position:fixed;bottom:24px;right:24px;width:52px;height:52px;border-radius:50%;background:var(--accent);color:#fff;border:none;cursor:pointer;font-size:24px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px rgba(0,0,0,.4);z-index:1000;transition:transform .2s}
227
+ .chat-fab:hover{transform:scale(1.1)}
228
+ .chat-panel{position:fixed;bottom:84px;right:24px;width:380px;height:500px;background:var(--bg-card);border:1px solid var(--border);border-radius:12px;display:none;flex-direction:column;z-index:1001;box-shadow:0 8px 32px rgba(0,0,0,.5)}
229
+ .chat-panel.open{display:flex}
230
+ .chat-header{padding:12px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;font-weight:600;font-size:14px}
231
+ .chat-header button{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:16px}
232
+ .chat-messages{flex:1;overflow-y:auto;padding:12px 16px;display:flex;flex-direction:column;gap:8px}
233
+ .chat-msg{max-width:85%;padding:8px 12px;border-radius:10px;font-size:13px;line-height:1.4;word-wrap:break-word;white-space:pre-wrap}
234
+ .chat-msg.user{align-self:flex-end;background:var(--accent);color:#fff;border-bottom-right-radius:2px}
235
+ .chat-msg.assistant{align-self:flex-start;background:var(--bg-section);color:var(--text);border-bottom-left-radius:2px}
236
+ .chat-input-row{display:flex;gap:8px;padding:12px;border-top:1px solid var(--border)}
237
+ .chat-input-row input{flex:1;background:var(--bg-section);border:1px solid var(--border);border-radius:8px;padding:8px 12px;color:var(--text);font-size:13px;outline:none}
238
+ .chat-input-row input:focus{border-color:var(--accent)}
239
+ .chat-input-row button{background:var(--accent);border:none;color:#fff;border-radius:8px;padding:8px 14px;cursor:pointer;font-size:13px}
225
240
  </style>
226
241
  </head>
227
242
  <body>
@@ -239,6 +254,7 @@ canvas{display:block;width:100%;height:100%}
239
254
  <div class="nav-section">System</div>
240
255
  <div class="nav-item" data-page="crossbrain"><span class="nav-icon">&#x1F517;</span><span class="nav-label">Cross-Brain</span></div>
241
256
  <div class="nav-item" data-page="debates"><span class="nav-icon">&#x2696;</span><span class="nav-label">Debates</span></div>
257
+ <div class="nav-item" data-page="forge"><span class="nav-icon">&#x2692;</span><span class="nav-label">Forge</span></div>
242
258
  <div class="nav-item" data-page="activity"><span class="nav-icon">&#x26A1;</span><span class="nav-label" data-t="Aktivität">Aktivität</span></div>
243
259
  <div class="nav-item" data-page="infra"><span class="nav-icon">&#x2699;</span><span class="nav-label" data-t="Infrastruktur">Infrastruktur</span></div>
244
260
  </div>
@@ -755,6 +771,34 @@ canvas{display:block;width:100%;height:100%}
755
771
  </div>
756
772
  </div>
757
773
 
774
+ <!-- ════ Page: Forge & Autonomie ══════════════════════ -->
775
+ <div class="page" id="page-forge">
776
+ <div class="grid grid-2">
777
+ <div class="section">
778
+ <div class="section-title"><span class="icon">&#x1F3AF;</span> ActionBridge</div>
779
+ <p style="font-size:12px;color:var(--text-dim);margin-bottom:12px">Queue, Executions, Erfolgsrate</p>
780
+ <div id="forgeActionBridge"><div class="empty">Loading...</div></div>
781
+ </div>
782
+ <div class="section">
783
+ <div class="section-title"><span class="icon">&#x270D;</span> ContentForge</div>
784
+ <p style="font-size:12px;color:var(--text-dim);margin-bottom:12px">Drafts, Scheduled, Published, Engagement</p>
785
+ <div id="forgeContentForge"><div class="empty">Loading...</div></div>
786
+ </div>
787
+ </div>
788
+ <div class="grid grid-2">
789
+ <div class="section">
790
+ <div class="section-title"><span class="icon">&#x1F4CA;</span> StrategyForge</div>
791
+ <p style="font-size:12px;color:var(--text-dim);margin-bottom:12px">Aktive Strategien, Performance</p>
792
+ <div id="forgeStrategyForge"><div class="empty">Loading...</div></div>
793
+ </div>
794
+ <div class="section">
795
+ <div class="section-title"><span class="icon">&#x1F504;</span> Cross-Brain Signals</div>
796
+ <p style="font-size:12px;color:var(--text-dim);margin-bottom:12px">Signal-Flow zwischen Brains</p>
797
+ <div id="forgeSignalRouter"><div class="empty">Loading...</div></div>
798
+ </div>
799
+ </div>
800
+ </div>
801
+
758
802
  <!-- ════ Page 8: Infrastruktur ══════════════════════ -->
759
803
  <div class="page" id="page-infra">
760
804
  <div class="section">
@@ -929,7 +973,7 @@ function getTitle(page) {
929
973
  const titles = {
930
974
  overview:'Ecosystem Overview', entity:t('Bewusstsein'), learning:t('Der Lern-Kreislauf'), trading:'Trading Flow',
931
975
  marketing:'Marketing Flow', intelligence:t('Intelligenz'), crossbrain:'Cross-Brain & Borg', activity:t('Aktivität & Missionen'),
932
- debates:'Debates & Challenges', infra:t('Infrastruktur')
976
+ debates:'Debates & Challenges', forge:'Forge & Autonomie', infra:t('Infrastruktur')
933
977
  }; return titles[page] || '';
934
978
  }
935
979
  const titles = {
@@ -942,6 +986,7 @@ const titles = {
942
986
  crossbrain:'Cross-Brain & Borg',
943
987
  activity:'Aktivität & Missionen',
944
988
  debates:'Debates & Challenges',
989
+ forge:'Forge & Autonomie',
945
990
  infra:'Infrastruktur'
946
991
  };
947
992
  document.querySelectorAll('.nav-item').forEach(item => {
@@ -976,6 +1021,7 @@ function connectSSE() {
976
1021
  es.addEventListener('guardrail-health', e => { state.guardrailHealth = JSON.parse(e.data); renderGuardrails(); });
977
1022
  es.addEventListener('roadmaps', e => { state.roadmaps = JSON.parse(e.data); renderRoadmaps(); });
978
1023
  es.addEventListener('creative-insights', e => { state.creativeInsights = JSON.parse(e.data); renderCreativeInsights(); });
1024
+ es.addEventListener('forge-status', e => { state.forgeStatus = JSON.parse(e.data); renderForgeWidgets(); });
979
1025
  es.onerror = () => { state.connected = false; updateConnection(); };
980
1026
  }
981
1027
 
@@ -1003,7 +1049,7 @@ async function loadInitial() {
1003
1049
  renderEcosystem(); renderEngines(); renderWatchdog(); renderPlugins();
1004
1050
  renderBorg(); renderAnalytics(); renderLLM(); renderErrors();
1005
1051
  renderSelfMod(); renderMissions(); renderRepoAbsorber(); renderIntelligence(); renderKnowledge(); renderDebates();
1006
- renderGuardrails(); renderRoadmaps(); renderCreativeInsights();
1052
+ renderGuardrails(); renderRoadmaps(); renderCreativeInsights(); renderForgeWidgets();
1007
1053
  } catch {}
1008
1054
  }
1009
1055
 
@@ -2065,11 +2111,96 @@ function entityLoop(){drawEntityCanvas();requestAnimationFrame(entityLoop)}
2065
2111
  var origAddThought=addThought;
2066
2112
  addThought=function(t){origAddThought(t);if(t.significance==='notable'||t.significance==='breakthrough'){if(entFloating.length>=12)entFloating.shift();entFloating.push({text:(t.content||'').substring(0,40),angle:Math.random()*Math.PI*2,dist:0.2,speed:0.15+Math.random()*0.1,alpha:1,born:Date.now(),life:6000+Math.random()*4000})}};
2067
2113
 
2114
+ // ── Forge Widgets ─────────────────────────────────────────
2115
+ function renderForgeWidgets() {
2116
+ const f = state.forgeStatus || {};
2117
+ // ActionBridge
2118
+ const ab = f.actionBridge;
2119
+ const abEl = document.getElementById('forgeActionBridge');
2120
+ if (abEl && ab) {
2121
+ abEl.innerHTML = `<div class="grid grid-2" style="gap:8px">
2122
+ <div class="card"><div class="stat-value">${ab.queueSize ?? 0}</div><div class="stat-label">Queue</div></div>
2123
+ <div class="card"><div class="stat-value">${ab.executed24h ?? 0}</div><div class="stat-label">24h Executed</div></div>
2124
+ <div class="card"><div class="stat-value">${((ab.successRate ?? 0) * 100).toFixed(0)}%</div><div class="stat-label">Erfolgsrate</div></div>
2125
+ <div class="card"><div class="stat-value">${ab.autoExecuteEnabled ? 'ON' : 'OFF'}</div><div class="stat-label">Auto-Execute</div></div>
2126
+ </div>`;
2127
+ }
2128
+ // ContentForge
2129
+ const cf = f.contentForge;
2130
+ const cfEl = document.getElementById('forgeContentForge');
2131
+ if (cfEl && cf) {
2132
+ cfEl.innerHTML = `<div class="grid grid-2" style="gap:8px">
2133
+ <div class="card"><div class="stat-value">${cf.drafts ?? 0}</div><div class="stat-label">Drafts</div></div>
2134
+ <div class="card"><div class="stat-value">${cf.scheduled ?? 0}</div><div class="stat-label">Scheduled</div></div>
2135
+ <div class="card"><div class="stat-value">${cf.published ?? 0}</div><div class="stat-label">Published</div></div>
2136
+ <div class="card"><div class="stat-value">${(cf.avgEngagement ?? 0).toFixed(1)}</div><div class="stat-label">Avg Engagement</div></div>
2137
+ </div>`;
2138
+ }
2139
+ // StrategyForge
2140
+ const sf = f.strategyForge;
2141
+ const sfEl = document.getElementById('forgeStrategyForge');
2142
+ if (sfEl && sf) {
2143
+ sfEl.innerHTML = `<div class="grid grid-2" style="gap:8px">
2144
+ <div class="card"><div class="stat-value">${sf.active ?? 0}</div><div class="stat-label">Active</div></div>
2145
+ <div class="card"><div class="stat-value">${sf.total ?? 0}</div><div class="stat-label">Total</div></div>
2146
+ <div class="card"><div class="stat-value">${((sf.avgPerformance ?? 0) * 100).toFixed(0)}%</div><div class="stat-label">Avg Performance</div></div>
2147
+ <div class="card" style="grid-column:span 2"><div class="stat-value" style="font-size:14px">${sf.topStrategy ?? 'None'}</div><div class="stat-label">Top Strategy</div></div>
2148
+ </div>`;
2149
+ }
2150
+ // SignalRouter
2151
+ const sr = f.signalRouter;
2152
+ const srEl = document.getElementById('forgeSignalRouter');
2153
+ if (srEl && sr) {
2154
+ const types = (sr.byType || []).map(t => `<span class="badge badge-ok">${t.signalType}: ${t.count}</span>`).join(' ');
2155
+ srEl.innerHTML = `<div class="grid grid-2" style="gap:8px">
2156
+ <div class="card"><div class="stat-value">${sr.totalSignals ?? 0}</div><div class="stat-label">Total Signals</div></div>
2157
+ <div class="card"><div class="stat-value">${sr.handlerCount ?? 0}</div><div class="stat-label">Handlers</div></div>
2158
+ </div><div style="margin-top:8px">${types || '<span class="empty">No signals yet</span>'}</div>`;
2159
+ }
2160
+ }
2161
+
2162
+ // ── Chat ──────────────────────────────────────────────────
2163
+ const chatSessionId = 'dashboard-' + Date.now().toString(36);
2164
+ function toggleChat() {
2165
+ const panel = document.getElementById('chatPanel');
2166
+ panel.classList.toggle('open');
2167
+ if (panel.classList.contains('open')) document.getElementById('chatInput').focus();
2168
+ }
2169
+ async function sendChat() {
2170
+ const input = document.getElementById('chatInput');
2171
+ const content = input.value.trim();
2172
+ if (!content) return;
2173
+ input.value = '';
2174
+ appendChatMsg('user', content);
2175
+ try {
2176
+ const res = await fetch('/api/chat', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({ sessionId: chatSessionId, content }) });
2177
+ const data = await res.json();
2178
+ appendChatMsg('assistant', data.content || JSON.stringify(data));
2179
+ } catch(e) { appendChatMsg('assistant', 'Fehler: ' + e.message); }
2180
+ }
2181
+ function appendChatMsg(role, text) {
2182
+ const box = document.getElementById('chatMessages');
2183
+ const div = document.createElement('div');
2184
+ div.className = 'chat-msg ' + role;
2185
+ div.textContent = text;
2186
+ box.appendChild(div);
2187
+ box.scrollTop = box.scrollHeight;
2188
+ }
2189
+ document.getElementById('chatInput')?.addEventListener('keydown', e => { if(e.key==='Enter') sendChat(); });
2190
+
2068
2191
  // ── Init ──────────────────────────────────────────────────
2069
2192
  document.getElementById('langToggle').textContent = currentLang.toUpperCase();
2070
2193
  updateStaticTexts();
2071
2194
  connectSSE(); loadInitial(); initCrossBrainCanvas(); entityLoop();
2072
2195
  window.addEventListener('resize', () => { if(state.ecosystem?.brains) drawPeerGraph(state.ecosystem.brains); });
2073
2196
  </script>
2197
+
2198
+ <!-- Chat Panel -->
2199
+ <button class="chat-fab" onclick="toggleChat()">&#x1F4AC;</button>
2200
+ <div class="chat-panel" id="chatPanel">
2201
+ <div class="chat-header"><span>Brain Chat</span><button onclick="toggleChat()">&#x2715;</button></div>
2202
+ <div class="chat-messages" id="chatMessages"></div>
2203
+ <div class="chat-input-row"><input id="chatInput" placeholder="Frag mich etwas..." autocomplete="off"><button onclick="sendChat()">Senden</button></div>
2204
+ </div>
2074
2205
  </body>
2075
2206
  </html>
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,145 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ vi.mock('../../utils/logger.js', () => ({
4
+ getLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }),
5
+ }));
6
+ import { ActionBridgeEngine, runActionBridgeMigration } from '../action-bridge.js';
7
+ describe('ActionBridgeEngine', () => {
8
+ let db;
9
+ beforeEach(() => { db = new Database(':memory:'); });
10
+ afterEach(() => { db.close(); });
11
+ it('proposes an action and retrieves it', () => {
12
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
13
+ const id = engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'Increase learning rate', confidence: 0.8 });
14
+ expect(id).toBeGreaterThan(0);
15
+ const queue = engine.getQueue('pending');
16
+ expect(queue).toHaveLength(1);
17
+ expect(queue[0].title).toBe('Increase learning rate');
18
+ expect(queue[0].riskLevel).toBe('low');
19
+ });
20
+ it('evaluates risk correctly for each type', () => {
21
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
22
+ expect(engine.evaluateRisk('adjust_parameter')).toBe('low');
23
+ expect(engine.evaluateRisk('create_goal')).toBe('low');
24
+ expect(engine.evaluateRisk('start_mission')).toBe('low');
25
+ expect(engine.evaluateRisk('publish_content')).toBe('medium');
26
+ expect(engine.evaluateRisk('execute_trade')).toBe('medium');
27
+ expect(engine.evaluateRisk('apply_code')).toBe('high');
28
+ });
29
+ it('auto-executes qualifying low-risk actions', async () => {
30
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
31
+ const handler = vi.fn().mockResolvedValue({ adjusted: true });
32
+ engine.registerHandler('adjust_parameter', handler);
33
+ engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'Auto test', confidence: 0.8 });
34
+ const executed = await engine.processQueue();
35
+ expect(executed).toBe(1);
36
+ expect(handler).toHaveBeenCalled();
37
+ const history = engine.getHistory();
38
+ expect(history).toHaveLength(1);
39
+ expect(history[0].status).toBe('completed');
40
+ });
41
+ it('does not auto-execute when confidence too low', async () => {
42
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
43
+ engine.registerHandler('adjust_parameter', vi.fn());
44
+ engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'Low conf', confidence: 0.3 });
45
+ const executed = await engine.processQueue();
46
+ expect(executed).toBe(0);
47
+ });
48
+ it('does not auto-execute apply_code (always high risk)', async () => {
49
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
50
+ engine.registerHandler('apply_code', vi.fn());
51
+ engine.propose({ source: 'codegen', type: 'apply_code', title: 'Refactor', confidence: 0.99 });
52
+ const executed = await engine.processQueue();
53
+ expect(executed).toBe(0); // never auto for apply_code
54
+ });
55
+ it('executes action manually', async () => {
56
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
57
+ engine.registerHandler('publish_content', vi.fn().mockResolvedValue({ published: true }));
58
+ const id = engine.propose({ source: 'creative', type: 'publish_content', title: 'Post insight', confidence: 0.5 });
59
+ const result = await engine.executeAction(id);
60
+ expect(result.success).toBe(true);
61
+ });
62
+ it('records failed execution', async () => {
63
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
64
+ engine.registerHandler('publish_content', vi.fn().mockRejectedValue(new Error('API down')));
65
+ const id = engine.propose({ source: 'creative', type: 'publish_content', title: 'Fail test', confidence: 0.9 });
66
+ const result = await engine.executeAction(id);
67
+ expect(result.success).toBe(false);
68
+ const action = engine.getAction(id);
69
+ expect(action?.status).toBe('failed');
70
+ });
71
+ it('returns error when no handler registered', async () => {
72
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
73
+ const id = engine.propose({ source: 'proactive', type: 'start_mission', title: 'No handler', confidence: 0.9 });
74
+ const result = await engine.executeAction(id);
75
+ expect(result.success).toBe(false);
76
+ expect(result.result).toBe('No handler registered');
77
+ });
78
+ it('rolls back a completed action', async () => {
79
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
80
+ engine.registerHandler('adjust_parameter', vi.fn().mockResolvedValue({}));
81
+ const id = engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'Rollback test', confidence: 0.9 });
82
+ await engine.executeAction(id);
83
+ engine.rollback(id);
84
+ const action = engine.getAction(id);
85
+ expect(action?.status).toBe('rolled_back');
86
+ });
87
+ it('cannot rollback a pending action', () => {
88
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
89
+ const id = engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'No rollback', confidence: 0.5 });
90
+ expect(() => engine.rollback(id)).toThrow('cannot be rolled back');
91
+ });
92
+ it('tracks success rate', async () => {
93
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
94
+ engine.registerHandler('adjust_parameter', vi.fn().mockResolvedValue({}));
95
+ engine.registerHandler('create_goal', vi.fn().mockRejectedValue(new Error('fail')));
96
+ const id1 = engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'Success', confidence: 0.9 });
97
+ const id2 = engine.propose({ source: 'proactive', type: 'create_goal', title: 'Fail', confidence: 0.9 });
98
+ await engine.executeAction(id1);
99
+ await engine.executeAction(id2);
100
+ expect(engine.getSuccessRate()).toBe(0.5);
101
+ expect(engine.getSuccessRate('adjust_parameter')).toBe(1);
102
+ expect(engine.getSuccessRate(undefined, 'proactive')).toBe(0.5);
103
+ });
104
+ it('records outcome manually', () => {
105
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
106
+ const id = engine.propose({ source: 'mission', type: 'start_mission', title: 'Outcome test', confidence: 0.7 });
107
+ // Manually mark as executing first by internal exec
108
+ engine.registerHandler('start_mission', vi.fn().mockResolvedValue({}));
109
+ engine.recordOutcome(id, { success: true, result: { missionId: 42 }, learnedLesson: 'Missions work' });
110
+ const action = engine.getAction(id);
111
+ expect(action?.status).toBe('completed');
112
+ expect(action?.outcome?.learnedLesson).toBe('Missions work');
113
+ });
114
+ it('rejects proposal when queue is full', () => {
115
+ const engine = new ActionBridgeEngine(db, { brainName: 'test', maxPendingActions: 2 });
116
+ engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'One', confidence: 0.5 });
117
+ engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'Two', confidence: 0.5 });
118
+ const id = engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'Three', confidence: 0.5 });
119
+ expect(id).toBe(-1);
120
+ });
121
+ it('disables auto-execute when configured', async () => {
122
+ const engine = new ActionBridgeEngine(db, { brainName: 'test', autoExecuteEnabled: false });
123
+ engine.registerHandler('adjust_parameter', vi.fn());
124
+ engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'No auto', confidence: 0.9 });
125
+ const executed = await engine.processQueue();
126
+ expect(executed).toBe(0);
127
+ });
128
+ it('getStatus returns overview', () => {
129
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
130
+ engine.propose({ source: 'proactive', type: 'adjust_parameter', title: 'Test', confidence: 0.5 });
131
+ const status = engine.getStatus();
132
+ expect(status.queueSize).toBe(1);
133
+ expect(status.autoExecuteEnabled).toBe(true);
134
+ expect(status.topSources).toHaveLength(1);
135
+ expect(status.topSources[0].source).toBe('proactive');
136
+ });
137
+ it('migration is idempotent', () => {
138
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
139
+ engine.propose({ source: 'proactive', type: 'start_mission', title: 'Survives', confidence: 0.5 });
140
+ runActionBridgeMigration(db);
141
+ const queue = engine.getQueue('pending');
142
+ expect(queue).toHaveLength(1);
143
+ });
144
+ });
145
+ //# sourceMappingURL=action-bridge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-bridge.test.js","sourceRoot":"","sources":["../../../src/action/__tests__/action-bridge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,100 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ vi.mock('../../utils/logger.js', () => ({
4
+ getLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }),
5
+ }));
6
+ import { createContentHandler } from '../handlers/content-handler.js';
7
+ import { ActionBridgeEngine } from '../action-bridge.js';
8
+ describe('ContentHandler', () => {
9
+ describe('createContentHandler', () => {
10
+ it('creates a handler function', () => {
11
+ const handler = createContentHandler({
12
+ publishNow: vi.fn(),
13
+ getPiece: vi.fn(),
14
+ });
15
+ expect(typeof handler).toBe('function');
16
+ });
17
+ it('publishes content successfully', async () => {
18
+ const handler = createContentHandler({
19
+ publishNow: vi.fn().mockResolvedValue({ success: true, postId: 'abc123' }),
20
+ getPiece: vi.fn().mockReturnValue({ id: 1, title: 'Test', platform: 'bluesky', status: 'scheduled' }),
21
+ });
22
+ const result = await handler({ pieceId: 1 });
23
+ expect(result.published).toBe(true);
24
+ expect(result.postId).toBe('abc123');
25
+ expect(result.platform).toBe('bluesky');
26
+ });
27
+ it('throws when piece not found', async () => {
28
+ const handler = createContentHandler({
29
+ publishNow: vi.fn(),
30
+ getPiece: vi.fn().mockReturnValue(null),
31
+ });
32
+ await expect(handler({ pieceId: 999 })).rejects.toThrow('not found');
33
+ });
34
+ it('skips already published pieces', async () => {
35
+ const publishNow = vi.fn();
36
+ const handler = createContentHandler({
37
+ publishNow,
38
+ getPiece: vi.fn().mockReturnValue({ id: 1, title: 'Test', platform: 'bluesky', status: 'published' }),
39
+ });
40
+ const result = await handler({ pieceId: 1 });
41
+ expect(result.published).toBe(false);
42
+ expect(publishNow).not.toHaveBeenCalled();
43
+ });
44
+ it('handles publish failure', async () => {
45
+ const handler = createContentHandler({
46
+ publishNow: vi.fn().mockResolvedValue({ success: false }),
47
+ getPiece: vi.fn().mockReturnValue({ id: 1, title: 'Test', platform: 'bluesky', status: 'scheduled' }),
48
+ });
49
+ const result = await handler({ pieceId: 1 });
50
+ expect(result.published).toBe(false);
51
+ });
52
+ it('defaults pieceId to 0 when missing', async () => {
53
+ const handler = createContentHandler({
54
+ publishNow: vi.fn(),
55
+ getPiece: vi.fn().mockReturnValue(null),
56
+ });
57
+ await expect(handler({})).rejects.toThrow('not found');
58
+ });
59
+ });
60
+ describe('Integration with ActionBridgeEngine', () => {
61
+ let db;
62
+ beforeEach(() => { db = new Database(':memory:'); });
63
+ afterEach(() => { db.close(); });
64
+ it('registers and executes content handler through ActionBridge', async () => {
65
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
66
+ const publishNow = vi.fn().mockResolvedValue({ success: true, postId: 'xyz' });
67
+ engine.registerHandler('publish_content', createContentHandler({
68
+ publishNow,
69
+ getPiece: vi.fn().mockReturnValue({ id: 1, title: 'Test', platform: 'bluesky', status: 'scheduled' }),
70
+ }));
71
+ const id = engine.propose({
72
+ source: 'creative',
73
+ type: 'publish_content',
74
+ title: 'Publish test',
75
+ confidence: 0.9,
76
+ payload: { pieceId: 1 },
77
+ });
78
+ const result = await engine.executeAction(id);
79
+ expect(result.success).toBe(true);
80
+ expect(publishNow).toHaveBeenCalledWith(1);
81
+ });
82
+ it('auto-executes publish_content when confidence >= 0.8', async () => {
83
+ const engine = new ActionBridgeEngine(db, { brainName: 'test' });
84
+ engine.registerHandler('publish_content', createContentHandler({
85
+ publishNow: vi.fn().mockResolvedValue({ success: true, postId: 'auto' }),
86
+ getPiece: vi.fn().mockReturnValue({ id: 1, title: 'Test', platform: 'bluesky', status: 'draft' }),
87
+ }));
88
+ engine.propose({
89
+ source: 'creative',
90
+ type: 'publish_content',
91
+ title: 'Auto publish',
92
+ confidence: 0.85,
93
+ payload: { pieceId: 1 },
94
+ });
95
+ const executed = await engine.processQueue();
96
+ expect(executed).toBe(1);
97
+ });
98
+ });
99
+ });
100
+ //# sourceMappingURL=content-handler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-handler.test.js","sourceRoot":"","sources":["../../../src/action/__tests__/content-handler.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};