@timmeck/brain-core 2.36.57 → 2.36.59
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 +6 -0
- package/command-center.html +133 -2
- package/dist/action/__tests__/adjust-parameter-handler.test.d.ts +1 -0
- package/dist/action/__tests__/adjust-parameter-handler.test.js +138 -0
- package/dist/action/__tests__/adjust-parameter-handler.test.js.map +1 -0
- package/dist/action/__tests__/content-handler.test.d.ts +1 -0
- package/dist/action/__tests__/content-handler.test.js +100 -0
- package/dist/action/__tests__/content-handler.test.js.map +1 -0
- package/dist/action/__tests__/creative-seed-handler.test.d.ts +1 -0
- package/dist/action/__tests__/creative-seed-handler.test.js +96 -0
- package/dist/action/__tests__/creative-seed-handler.test.js.map +1 -0
- package/dist/action/__tests__/trade-handler.test.d.ts +1 -0
- package/dist/action/__tests__/trade-handler.test.js +165 -0
- package/dist/action/__tests__/trade-handler.test.js.map +1 -0
- package/dist/action/action-bridge.d.ts +2 -2
- package/dist/action/action-bridge.js +1 -0
- package/dist/action/action-bridge.js.map +1 -1
- package/dist/action/handlers/adjust-parameter-handler.d.ts +28 -0
- package/dist/action/handlers/adjust-parameter-handler.js +44 -0
- package/dist/action/handlers/adjust-parameter-handler.js.map +1 -0
- package/dist/action/handlers/content-handler.d.ts +23 -0
- package/dist/action/handlers/content-handler.js +30 -0
- package/dist/action/handlers/content-handler.js.map +1 -0
- package/dist/action/handlers/creative-seed-handler.d.ts +24 -0
- package/dist/action/handlers/creative-seed-handler.js +34 -0
- package/dist/action/handlers/creative-seed-handler.js.map +1 -0
- package/dist/action/handlers/index.d.ts +8 -0
- package/dist/action/handlers/index.js +5 -0
- package/dist/action/handlers/index.js.map +1 -0
- package/dist/action/handlers/trade-handler.d.ts +43 -0
- package/dist/action/handlers/trade-handler.js +43 -0
- package/dist/action/handlers/trade-handler.js.map +1 -0
- package/dist/action/index.d.ts +2 -0
- package/dist/action/index.js +1 -0
- package/dist/action/index.js.map +1 -1
- package/dist/agent-training/__tests__/agent-trainer.test.d.ts +1 -0
- package/dist/agent-training/__tests__/agent-trainer.test.js +158 -0
- package/dist/agent-training/__tests__/agent-trainer.test.js.map +1 -0
- package/dist/agent-training/__tests__/sub-agent-factory.test.d.ts +1 -0
- package/dist/agent-training/__tests__/sub-agent-factory.test.js +100 -0
- package/dist/agent-training/__tests__/sub-agent-factory.test.js.map +1 -0
- package/dist/agent-training/__tests__/sub-agent.test.d.ts +1 -0
- package/dist/agent-training/__tests__/sub-agent.test.js +102 -0
- package/dist/agent-training/__tests__/sub-agent.test.js.map +1 -0
- package/dist/agent-training/index.d.ts +4 -0
- package/dist/agent-training/index.js +2 -0
- package/dist/agent-training/index.js.map +1 -1
- package/dist/agent-training/sub-agent-factory.d.ts +36 -0
- package/dist/agent-training/sub-agent-factory.js +128 -0
- package/dist/agent-training/sub-agent-factory.js.map +1 -0
- package/dist/agent-training/sub-agent.d.ts +57 -0
- package/dist/agent-training/sub-agent.js +135 -0
- package/dist/agent-training/sub-agent.js.map +1 -0
- package/dist/chat/__tests__/chat-engine.test.d.ts +1 -0
- package/dist/chat/__tests__/chat-engine.test.js +209 -0
- package/dist/chat/__tests__/chat-engine.test.js.map +1 -0
- package/dist/chat/chat-engine.d.ts +55 -0
- package/dist/chat/chat-engine.js +222 -0
- package/dist/chat/chat-engine.js.map +1 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +2 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/codegen/codegen-server.js +2 -2
- package/dist/codegen/codegen-server.js.map +1 -1
- package/dist/content/__tests__/auto-publisher.test.d.ts +1 -0
- package/dist/content/__tests__/auto-publisher.test.js +125 -0
- package/dist/content/__tests__/auto-publisher.test.js.map +1 -0
- package/dist/content/auto-publisher.d.ts +51 -0
- package/dist/content/auto-publisher.js +147 -0
- package/dist/content/auto-publisher.js.map +1 -0
- package/dist/content/content-forge.d.ts +2 -0
- package/dist/content/content-forge.js +19 -0
- package/dist/content/content-forge.js.map +1 -1
- package/dist/content/index.d.ts +2 -0
- package/dist/content/index.js +1 -0
- package/dist/content/index.js.map +1 -1
- package/dist/creative/__tests__/creative-engine.test.d.ts +1 -0
- package/dist/creative/__tests__/creative-engine.test.js +151 -0
- package/dist/creative/__tests__/creative-engine.test.js.map +1 -0
- package/dist/cross-brain/__tests__/signal-router.test.d.ts +1 -0
- package/dist/cross-brain/__tests__/signal-router.test.js +218 -0
- package/dist/cross-brain/__tests__/signal-router.test.js.map +1 -0
- package/dist/cross-brain/signal-router.d.ts +57 -0
- package/dist/cross-brain/signal-router.js +148 -0
- package/dist/cross-brain/signal-router.js.map +1 -0
- package/dist/dashboard/__tests__/command-center-server.test.js +31 -0
- package/dist/dashboard/__tests__/command-center-server.test.js.map +1 -1
- package/dist/dashboard/command-center-server.d.ts +11 -0
- package/dist/dashboard/command-center-server.js +72 -0
- package/dist/dashboard/command-center-server.js.map +1 -1
- package/dist/dream/__tests__/dream-engine.test.d.ts +1 -0
- package/dist/dream/__tests__/dream-engine.test.js +184 -0
- package/dist/dream/__tests__/dream-engine.test.js.map +1 -0
- package/dist/feedback/__tests__/feedback-router.test.d.ts +1 -0
- package/dist/feedback/__tests__/feedback-router.test.js +173 -0
- package/dist/feedback/__tests__/feedback-router.test.js.map +1 -0
- package/dist/feedback/feedback-router.d.ts +53 -0
- package/dist/feedback/feedback-router.js +193 -0
- package/dist/feedback/feedback-router.js.map +1 -0
- package/dist/feedback/index.d.ts +2 -0
- package/dist/feedback/index.js +1 -0
- package/dist/feedback/index.js.map +1 -1
- package/dist/goals/__tests__/goal-engine.test.d.ts +1 -0
- package/dist/goals/__tests__/goal-engine.test.js +203 -0
- package/dist/goals/__tests__/goal-engine.test.js.map +1 -0
- package/dist/guardrails/__tests__/guardrail-engine.test.d.ts +1 -0
- package/dist/guardrails/__tests__/guardrail-engine.test.js +343 -0
- package/dist/guardrails/__tests__/guardrail-engine.test.js.map +1 -0
- package/dist/index.d.ts +14 -6
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/metacognition/__tests__/auto-experiment-engine.test.d.ts +1 -0
- package/dist/metacognition/__tests__/auto-experiment-engine.test.js +218 -0
- package/dist/metacognition/__tests__/auto-experiment-engine.test.js.map +1 -0
- package/dist/metacognition/__tests__/evolution-engine.test.d.ts +1 -0
- package/dist/metacognition/__tests__/evolution-engine.test.js +473 -0
- package/dist/metacognition/__tests__/evolution-engine.test.js.map +1 -0
- package/dist/metacognition/__tests__/parameter-registry.test.d.ts +1 -0
- package/dist/metacognition/__tests__/parameter-registry.test.js +223 -0
- package/dist/metacognition/__tests__/parameter-registry.test.js.map +1 -0
- package/dist/prediction/__tests__/prediction-engine.test.d.ts +1 -0
- package/dist/prediction/__tests__/prediction-engine.test.js +244 -0
- package/dist/prediction/__tests__/prediction-engine.test.js.map +1 -0
- package/dist/research/research-orchestrator.js +3 -2
- package/dist/research/research-orchestrator.js.map +1 -1
- package/dist/sandbox/__tests__/code-sandbox.test.d.ts +1 -0
- package/dist/sandbox/__tests__/code-sandbox.test.js +182 -0
- package/dist/sandbox/__tests__/code-sandbox.test.js.map +1 -0
- package/dist/scanner/__tests__/signal-scanner.test.d.ts +1 -0
- package/dist/scanner/__tests__/signal-scanner.test.js +142 -0
- package/dist/scanner/__tests__/signal-scanner.test.js.map +1 -0
- package/dist/self-modification/__tests__/self-modification-engine.test.d.ts +1 -0
- package/dist/self-modification/__tests__/self-modification-engine.test.js +313 -0
- package/dist/self-modification/__tests__/self-modification-engine.test.js.map +1 -0
- package/dist/self-modification/self-modification-engine.d.ts +4 -1
- package/dist/self-modification/self-modification-engine.js +41 -3
- package/dist/self-modification/self-modification-engine.js.map +1 -1
- package/dist/strategy/__tests__/strategy-forge.test.js +69 -0
- package/dist/strategy/__tests__/strategy-forge.test.js.map +1 -1
- package/dist/strategy/__tests__/strategy-mutator.test.d.ts +1 -0
- package/dist/strategy/__tests__/strategy-mutator.test.js +141 -0
- package/dist/strategy/__tests__/strategy-mutator.test.js.map +1 -0
- package/dist/strategy/index.d.ts +2 -0
- package/dist/strategy/index.js +1 -0
- package/dist/strategy/index.js.map +1 -1
- package/dist/strategy/strategy-forge.d.ts +4 -1
- package/dist/strategy/strategy-forge.js +34 -2
- package/dist/strategy/strategy-forge.js.map +1 -1
- package/dist/strategy/strategy-mutator.d.ts +42 -0
- package/dist/strategy/strategy-mutator.js +140 -0
- package/dist/strategy/strategy-mutator.js.map +1 -0
- package/dist/unified/unified-server.js +2 -2
- package/dist/unified/unified-server.js.map +1 -1
- 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
|
|
package/command-center.html
CHANGED
|
@@ -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">🔗</span><span class="nav-label">Cross-Brain</span></div>
|
|
241
256
|
<div class="nav-item" data-page="debates"><span class="nav-icon">⚖</span><span class="nav-label">Debates</span></div>
|
|
257
|
+
<div class="nav-item" data-page="forge"><span class="nav-icon">⚒</span><span class="nav-label">Forge</span></div>
|
|
242
258
|
<div class="nav-item" data-page="activity"><span class="nav-icon">⚡</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">⚙</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">🎯</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">✍</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">📊</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">🔄</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()">💬</button>
|
|
2200
|
+
<div class="chat-panel" id="chatPanel">
|
|
2201
|
+
<div class="chat-header"><span>Brain Chat</span><button onclick="toggleChat()">✕</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,138 @@
|
|
|
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 { createAdjustParameterHandler } from '../handlers/adjust-parameter-handler.js';
|
|
7
|
+
import { ActionBridgeEngine } from '../action-bridge.js';
|
|
8
|
+
describe('AdjustParameterHandler', () => {
|
|
9
|
+
describe('createAdjustParameterHandler', () => {
|
|
10
|
+
it('creates a handler function', () => {
|
|
11
|
+
const handler = createAdjustParameterHandler({
|
|
12
|
+
getParameter: vi.fn(),
|
|
13
|
+
setParameter: vi.fn(),
|
|
14
|
+
});
|
|
15
|
+
expect(typeof handler).toBe('function');
|
|
16
|
+
});
|
|
17
|
+
it('adjusts parameter within bounds', async () => {
|
|
18
|
+
const setParameter = vi.fn();
|
|
19
|
+
const handler = createAdjustParameterHandler({
|
|
20
|
+
getParameter: vi.fn().mockReturnValue({ value: 0.5, min: 0.1, max: 0.9 }),
|
|
21
|
+
setParameter,
|
|
22
|
+
});
|
|
23
|
+
const result = await handler({
|
|
24
|
+
engine: 'dream',
|
|
25
|
+
parameter: 'prune_threshold',
|
|
26
|
+
suggestedValue: 0.7,
|
|
27
|
+
reason: 'improve consolidation',
|
|
28
|
+
});
|
|
29
|
+
expect(result.adjusted).toBe(true);
|
|
30
|
+
expect(result.oldValue).toBe(0.5);
|
|
31
|
+
expect(result.newValue).toBe(0.7);
|
|
32
|
+
expect(setParameter).toHaveBeenCalledWith('dream', 'prune_threshold', 0.7);
|
|
33
|
+
});
|
|
34
|
+
it('clamps value to max bound', async () => {
|
|
35
|
+
const setParameter = vi.fn();
|
|
36
|
+
const handler = createAdjustParameterHandler({
|
|
37
|
+
getParameter: vi.fn().mockReturnValue({ value: 0.5, min: 0.1, max: 0.9 }),
|
|
38
|
+
setParameter,
|
|
39
|
+
});
|
|
40
|
+
const result = await handler({
|
|
41
|
+
engine: 'dream',
|
|
42
|
+
parameter: 'prune_threshold',
|
|
43
|
+
suggestedValue: 1.5,
|
|
44
|
+
reason: 'too high',
|
|
45
|
+
});
|
|
46
|
+
expect(result.adjusted).toBe(true);
|
|
47
|
+
expect(result.newValue).toBe(0.9);
|
|
48
|
+
});
|
|
49
|
+
it('clamps value to min bound', async () => {
|
|
50
|
+
const setParameter = vi.fn();
|
|
51
|
+
const handler = createAdjustParameterHandler({
|
|
52
|
+
getParameter: vi.fn().mockReturnValue({ value: 0.5, min: 0.1, max: 0.9 }),
|
|
53
|
+
setParameter,
|
|
54
|
+
});
|
|
55
|
+
const result = await handler({
|
|
56
|
+
engine: 'dream',
|
|
57
|
+
parameter: 'prune_threshold',
|
|
58
|
+
suggestedValue: -0.5,
|
|
59
|
+
reason: 'too low',
|
|
60
|
+
});
|
|
61
|
+
expect(result.adjusted).toBe(true);
|
|
62
|
+
expect(result.newValue).toBe(0.1);
|
|
63
|
+
});
|
|
64
|
+
it('returns adjusted=false when parameter not found', async () => {
|
|
65
|
+
const handler = createAdjustParameterHandler({
|
|
66
|
+
getParameter: vi.fn().mockReturnValue(undefined),
|
|
67
|
+
setParameter: vi.fn(),
|
|
68
|
+
});
|
|
69
|
+
const result = await handler({
|
|
70
|
+
engine: 'unknown',
|
|
71
|
+
parameter: 'missing',
|
|
72
|
+
suggestedValue: 0.5,
|
|
73
|
+
});
|
|
74
|
+
expect(result.adjusted).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
it('returns adjusted=false when engine/parameter name missing', async () => {
|
|
77
|
+
const handler = createAdjustParameterHandler({
|
|
78
|
+
getParameter: vi.fn(),
|
|
79
|
+
setParameter: vi.fn(),
|
|
80
|
+
});
|
|
81
|
+
const result = await handler({ suggestedValue: 0.5 });
|
|
82
|
+
expect(result.adjusted).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
it('handles setParameter errors gracefully', async () => {
|
|
85
|
+
const handler = createAdjustParameterHandler({
|
|
86
|
+
getParameter: vi.fn().mockReturnValue({ value: 0.5, min: 0.1, max: 0.9 }),
|
|
87
|
+
setParameter: vi.fn().mockImplementation(() => { throw new Error('DB locked'); }),
|
|
88
|
+
});
|
|
89
|
+
const result = await handler({
|
|
90
|
+
engine: 'dream',
|
|
91
|
+
parameter: 'prune_threshold',
|
|
92
|
+
suggestedValue: 0.7,
|
|
93
|
+
reason: 'test',
|
|
94
|
+
});
|
|
95
|
+
expect(result.adjusted).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('Integration with ActionBridgeEngine', () => {
|
|
99
|
+
let db;
|
|
100
|
+
beforeEach(() => { db = new Database(':memory:'); });
|
|
101
|
+
afterEach(() => { db.close(); });
|
|
102
|
+
it('registers and executes adjust_parameter through ActionBridge', async () => {
|
|
103
|
+
const engine = new ActionBridgeEngine(db, { brainName: 'test' });
|
|
104
|
+
const setParameter = vi.fn();
|
|
105
|
+
engine.registerHandler('adjust_parameter', createAdjustParameterHandler({
|
|
106
|
+
getParameter: vi.fn().mockReturnValue({ value: 0.15, min: 0.01, max: 0.5 }),
|
|
107
|
+
setParameter,
|
|
108
|
+
}));
|
|
109
|
+
const id = engine.propose({
|
|
110
|
+
source: 'feedback-router',
|
|
111
|
+
type: 'adjust_parameter',
|
|
112
|
+
title: 'Adjust dream prune threshold',
|
|
113
|
+
confidence: 0.85,
|
|
114
|
+
payload: { engine: 'dream', parameter: 'prune_threshold', suggestedValue: 0.2, reason: 'test' },
|
|
115
|
+
});
|
|
116
|
+
const result = await engine.executeAction(id);
|
|
117
|
+
expect(result.success).toBe(true);
|
|
118
|
+
expect(setParameter).toHaveBeenCalledOnce();
|
|
119
|
+
});
|
|
120
|
+
it('auto-executes when confidence >= 0.8', async () => {
|
|
121
|
+
const engine = new ActionBridgeEngine(db, { brainName: 'test' });
|
|
122
|
+
engine.registerHandler('adjust_parameter', createAdjustParameterHandler({
|
|
123
|
+
getParameter: vi.fn().mockReturnValue({ value: 0.1, min: 0.01, max: 0.5 }),
|
|
124
|
+
setParameter: vi.fn(),
|
|
125
|
+
}));
|
|
126
|
+
engine.propose({
|
|
127
|
+
source: 'feedback-router',
|
|
128
|
+
type: 'adjust_parameter',
|
|
129
|
+
title: 'Auto-adjust',
|
|
130
|
+
confidence: 0.9,
|
|
131
|
+
payload: { engine: 'dream', parameter: 'prune_threshold', suggestedValue: 0.3, reason: 'auto' },
|
|
132
|
+
});
|
|
133
|
+
const executed = await engine.processQueue();
|
|
134
|
+
expect(executed).toBe(1);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=adjust-parameter-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adjust-parameter-handler.test.js","sourceRoot":"","sources":["../../../src/action/__tests__/adjust-parameter-handler.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 {};
|
|
@@ -0,0 +1,96 @@
|
|
|
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 { createCreativeSeedHandler } from '../handlers/creative-seed-handler.js';
|
|
7
|
+
import { ActionBridgeEngine } from '../action-bridge.js';
|
|
8
|
+
describe('CreativeSeedHandler', () => {
|
|
9
|
+
describe('createCreativeSeedHandler', () => {
|
|
10
|
+
it('creates a handler function', () => {
|
|
11
|
+
const handler = createCreativeSeedHandler({
|
|
12
|
+
pollinate: vi.fn().mockReturnValue({ ideas: [] }),
|
|
13
|
+
});
|
|
14
|
+
expect(typeof handler).toBe('function');
|
|
15
|
+
});
|
|
16
|
+
it('calls pollinate with topic and domains', async () => {
|
|
17
|
+
const pollinate = vi.fn().mockReturnValue({ ideas: [{ title: 'Idea 1', score: 0.8 }] });
|
|
18
|
+
const handler = createCreativeSeedHandler({ pollinate });
|
|
19
|
+
const result = await handler({
|
|
20
|
+
topic: 'crypto-marketing',
|
|
21
|
+
domains: ['trading', 'content'],
|
|
22
|
+
source: 'feedback-router',
|
|
23
|
+
confidence: 0.7,
|
|
24
|
+
});
|
|
25
|
+
expect(pollinate).toHaveBeenCalledWith('crypto-marketing', ['trading', 'content']);
|
|
26
|
+
expect(result.seeded).toBe(true);
|
|
27
|
+
expect(result.topic).toBe('crypto-marketing');
|
|
28
|
+
expect(result.ideasGenerated).toBe(1);
|
|
29
|
+
});
|
|
30
|
+
it('returns seeded=false when no ideas generated', async () => {
|
|
31
|
+
const handler = createCreativeSeedHandler({
|
|
32
|
+
pollinate: vi.fn().mockReturnValue({ ideas: [] }),
|
|
33
|
+
});
|
|
34
|
+
const result = await handler({ topic: 'empty-topic' });
|
|
35
|
+
expect(result.seeded).toBe(false);
|
|
36
|
+
expect(result.ideasGenerated).toBe(0);
|
|
37
|
+
});
|
|
38
|
+
it('defaults topic to "general" when missing', async () => {
|
|
39
|
+
const pollinate = vi.fn().mockReturnValue({ ideas: [] });
|
|
40
|
+
const handler = createCreativeSeedHandler({ pollinate });
|
|
41
|
+
const result = await handler({});
|
|
42
|
+
expect(result.topic).toBe('general');
|
|
43
|
+
expect(pollinate).toHaveBeenCalledWith('general', undefined);
|
|
44
|
+
});
|
|
45
|
+
it('handles pollinate errors gracefully', async () => {
|
|
46
|
+
const handler = createCreativeSeedHandler({
|
|
47
|
+
pollinate: vi.fn().mockImplementation(() => { throw new Error('LLM unavailable'); }),
|
|
48
|
+
});
|
|
49
|
+
const result = await handler({ topic: 'test' });
|
|
50
|
+
expect(result.seeded).toBe(false);
|
|
51
|
+
expect(result.ideasGenerated).toBe(0);
|
|
52
|
+
});
|
|
53
|
+
it('passes empty domains as undefined', async () => {
|
|
54
|
+
const pollinate = vi.fn().mockReturnValue({ ideas: [{ title: 'X', score: 0.5 }] });
|
|
55
|
+
const handler = createCreativeSeedHandler({ pollinate });
|
|
56
|
+
await handler({ topic: 'test', domains: [] });
|
|
57
|
+
expect(pollinate).toHaveBeenCalledWith('test', undefined);
|
|
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 creative_seed through ActionBridge', async () => {
|
|
65
|
+
const engine = new ActionBridgeEngine(db, { brainName: 'test' });
|
|
66
|
+
const pollinate = vi.fn().mockReturnValue({ ideas: [{ title: 'Idea', score: 0.9 }] });
|
|
67
|
+
engine.registerHandler('creative_seed', createCreativeSeedHandler({ pollinate }));
|
|
68
|
+
const id = engine.propose({
|
|
69
|
+
source: 'feedback-router',
|
|
70
|
+
type: 'creative_seed',
|
|
71
|
+
title: 'Seed creativity for crypto',
|
|
72
|
+
confidence: 0.85,
|
|
73
|
+
payload: { topic: 'crypto', domains: ['trading'] },
|
|
74
|
+
});
|
|
75
|
+
const result = await engine.executeAction(id);
|
|
76
|
+
expect(result.success).toBe(true);
|
|
77
|
+
expect(pollinate).toHaveBeenCalledOnce();
|
|
78
|
+
});
|
|
79
|
+
it('auto-executes when confidence >= 0.8', async () => {
|
|
80
|
+
const engine = new ActionBridgeEngine(db, { brainName: 'test' });
|
|
81
|
+
engine.registerHandler('creative_seed', createCreativeSeedHandler({
|
|
82
|
+
pollinate: vi.fn().mockReturnValue({ ideas: [{ title: 'X', score: 0.5 }] }),
|
|
83
|
+
}));
|
|
84
|
+
engine.propose({
|
|
85
|
+
source: 'feedback-router',
|
|
86
|
+
type: 'creative_seed',
|
|
87
|
+
title: 'Auto-seed',
|
|
88
|
+
confidence: 0.9,
|
|
89
|
+
payload: { topic: 'auto' },
|
|
90
|
+
});
|
|
91
|
+
const executed = await engine.processQueue();
|
|
92
|
+
expect(executed).toBe(1);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=creative-seed-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creative-seed-handler.test.js","sourceRoot":"","sources":["../../../src/action/__tests__/creative-seed-handler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|