@timmeck/brain-core 2.36.57 → 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.
- package/README.md +6 -0
- package/command-center.html +133 -2
- 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__/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/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/index.d.ts +4 -0
- package/dist/action/handlers/index.js +3 -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 +128 -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 +186 -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/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 +159 -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 +2 -1
- 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 +255 -0
- package/dist/self-modification/__tests__/self-modification-engine.test.js.map +1 -0
- 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/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,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,165 @@
|
|
|
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 { createTradeHandler } from '../handlers/trade-handler.js';
|
|
7
|
+
import { ActionBridgeEngine } from '../action-bridge.js';
|
|
8
|
+
describe('TradeHandler', () => {
|
|
9
|
+
describe('createTradeHandler', () => {
|
|
10
|
+
it('creates a handler function', () => {
|
|
11
|
+
const handler = createTradeHandler({
|
|
12
|
+
runCycle: vi.fn().mockResolvedValue({ entries: 0, exits: 0 }),
|
|
13
|
+
});
|
|
14
|
+
expect(typeof handler).toBe('function');
|
|
15
|
+
});
|
|
16
|
+
it('calls runCycle on execution', async () => {
|
|
17
|
+
const runCycle = vi.fn().mockResolvedValue({ entries: 1, exits: 0 });
|
|
18
|
+
const handler = createTradeHandler({ runCycle });
|
|
19
|
+
const result = await handler({
|
|
20
|
+
symbol: 'BTC',
|
|
21
|
+
action: 'buy',
|
|
22
|
+
reason: 'BTC > 50000',
|
|
23
|
+
strategyId: 1,
|
|
24
|
+
confidence: 0.85,
|
|
25
|
+
});
|
|
26
|
+
expect(runCycle).toHaveBeenCalledOnce();
|
|
27
|
+
expect(result.triggered).toBe(true);
|
|
28
|
+
expect(result.action).toBe('buy');
|
|
29
|
+
expect(result.symbol).toBe('BTC');
|
|
30
|
+
expect(result.strategyId).toBe(1);
|
|
31
|
+
expect(result.cycleResult.entries).toBe(1);
|
|
32
|
+
});
|
|
33
|
+
it('returns sell action correctly', async () => {
|
|
34
|
+
const handler = createTradeHandler({
|
|
35
|
+
runCycle: vi.fn().mockResolvedValue({ entries: 0, exits: 1 }),
|
|
36
|
+
});
|
|
37
|
+
const result = await handler({
|
|
38
|
+
symbol: 'ETH',
|
|
39
|
+
action: 'sell',
|
|
40
|
+
reason: 'ETH < 3000',
|
|
41
|
+
strategyId: 2,
|
|
42
|
+
confidence: 0.9,
|
|
43
|
+
});
|
|
44
|
+
expect(result.action).toBe('sell');
|
|
45
|
+
expect(result.symbol).toBe('ETH');
|
|
46
|
+
expect(result.cycleResult.exits).toBe(1);
|
|
47
|
+
});
|
|
48
|
+
it('includes portfolio snapshot when getPortfolio provided', async () => {
|
|
49
|
+
const handler = createTradeHandler({
|
|
50
|
+
runCycle: vi.fn().mockResolvedValue({ entries: 1, exits: 0 }),
|
|
51
|
+
getPortfolio: () => ({
|
|
52
|
+
balance: 10000,
|
|
53
|
+
equity: 10500,
|
|
54
|
+
positions: [
|
|
55
|
+
{ symbol: 'BTC', side: 'long', pnlPct: 5 },
|
|
56
|
+
],
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
const result = await handler({ symbol: 'BTC', action: 'buy', strategyId: 1, confidence: 0.8 });
|
|
60
|
+
expect(result.portfolioSnapshot).toBeDefined();
|
|
61
|
+
expect(result.portfolioSnapshot.balance).toBe(10000);
|
|
62
|
+
expect(result.portfolioSnapshot.equity).toBe(10500);
|
|
63
|
+
expect(result.portfolioSnapshot.positionCount).toBe(1);
|
|
64
|
+
});
|
|
65
|
+
it('handles missing portfolio gracefully', async () => {
|
|
66
|
+
const handler = createTradeHandler({
|
|
67
|
+
runCycle: vi.fn().mockResolvedValue({ entries: 0, exits: 0 }),
|
|
68
|
+
});
|
|
69
|
+
const result = await handler({ symbol: 'BTC', action: 'buy', strategyId: 1, confidence: 0.5 });
|
|
70
|
+
expect(result.portfolioSnapshot).toBeUndefined();
|
|
71
|
+
});
|
|
72
|
+
it('handles portfolio error gracefully', async () => {
|
|
73
|
+
const handler = createTradeHandler({
|
|
74
|
+
runCycle: vi.fn().mockResolvedValue({ entries: 0, exits: 0 }),
|
|
75
|
+
getPortfolio: () => { throw new Error('DB error'); },
|
|
76
|
+
});
|
|
77
|
+
const result = await handler({ symbol: 'BTC', action: 'buy', strategyId: 1, confidence: 0.5 });
|
|
78
|
+
expect(result.portfolioSnapshot).toBeUndefined();
|
|
79
|
+
});
|
|
80
|
+
it('defaults missing payload fields', async () => {
|
|
81
|
+
const handler = createTradeHandler({
|
|
82
|
+
runCycle: vi.fn().mockResolvedValue({ entries: 0, exits: 0 }),
|
|
83
|
+
});
|
|
84
|
+
const result = await handler({});
|
|
85
|
+
expect(result.symbol).toBe('UNKNOWN');
|
|
86
|
+
expect(result.action).toBe('buy');
|
|
87
|
+
expect(result.strategyId).toBe(0);
|
|
88
|
+
});
|
|
89
|
+
it('propagates runCycle errors', async () => {
|
|
90
|
+
const handler = createTradeHandler({
|
|
91
|
+
runCycle: vi.fn().mockRejectedValue(new Error('No prices available')),
|
|
92
|
+
});
|
|
93
|
+
await expect(handler({ symbol: 'BTC', action: 'buy', strategyId: 1, confidence: 0.8 }))
|
|
94
|
+
.rejects.toThrow('No prices available');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('Integration with ActionBridgeEngine', () => {
|
|
98
|
+
let db;
|
|
99
|
+
beforeEach(() => { db = new Database(':memory:'); });
|
|
100
|
+
afterEach(() => { db.close(); });
|
|
101
|
+
it('registers and executes trade handler through ActionBridge', async () => {
|
|
102
|
+
const engine = new ActionBridgeEngine(db, { brainName: 'test' });
|
|
103
|
+
const runCycle = vi.fn().mockResolvedValue({ entries: 1, exits: 0 });
|
|
104
|
+
engine.registerHandler('execute_trade', createTradeHandler({ runCycle }));
|
|
105
|
+
const id = engine.propose({
|
|
106
|
+
source: 'research',
|
|
107
|
+
type: 'execute_trade',
|
|
108
|
+
title: 'Buy BTC',
|
|
109
|
+
confidence: 0.85,
|
|
110
|
+
payload: { symbol: 'BTC', action: 'buy', strategyId: 1, confidence: 0.85 },
|
|
111
|
+
});
|
|
112
|
+
const result = await engine.executeAction(id);
|
|
113
|
+
expect(result.success).toBe(true);
|
|
114
|
+
expect(runCycle).toHaveBeenCalledOnce();
|
|
115
|
+
});
|
|
116
|
+
it('auto-executes trade when confidence >= 0.8', async () => {
|
|
117
|
+
const engine = new ActionBridgeEngine(db, { brainName: 'test' });
|
|
118
|
+
const runCycle = vi.fn().mockResolvedValue({ entries: 0, exits: 1 });
|
|
119
|
+
engine.registerHandler('execute_trade', createTradeHandler({ runCycle }));
|
|
120
|
+
engine.propose({
|
|
121
|
+
source: 'research',
|
|
122
|
+
type: 'execute_trade',
|
|
123
|
+
title: 'Sell ETH',
|
|
124
|
+
confidence: 0.9,
|
|
125
|
+
payload: { symbol: 'ETH', action: 'sell', strategyId: 2, confidence: 0.9 },
|
|
126
|
+
});
|
|
127
|
+
const executed = await engine.processQueue();
|
|
128
|
+
expect(executed).toBe(1);
|
|
129
|
+
expect(runCycle).toHaveBeenCalledOnce();
|
|
130
|
+
});
|
|
131
|
+
it('does not auto-execute when confidence < 0.8', async () => {
|
|
132
|
+
const engine = new ActionBridgeEngine(db, { brainName: 'test' });
|
|
133
|
+
engine.registerHandler('execute_trade', createTradeHandler({
|
|
134
|
+
runCycle: vi.fn().mockResolvedValue({ entries: 0, exits: 0 }),
|
|
135
|
+
}));
|
|
136
|
+
engine.propose({
|
|
137
|
+
source: 'research',
|
|
138
|
+
type: 'execute_trade',
|
|
139
|
+
title: 'Low confidence trade',
|
|
140
|
+
confidence: 0.6,
|
|
141
|
+
payload: { symbol: 'BTC', action: 'buy', strategyId: 1, confidence: 0.6 },
|
|
142
|
+
});
|
|
143
|
+
const executed = await engine.processQueue();
|
|
144
|
+
expect(executed).toBe(0);
|
|
145
|
+
});
|
|
146
|
+
it('records failed trade execution', async () => {
|
|
147
|
+
const engine = new ActionBridgeEngine(db, { brainName: 'test' });
|
|
148
|
+
engine.registerHandler('execute_trade', createTradeHandler({
|
|
149
|
+
runCycle: vi.fn().mockRejectedValue(new Error('Market closed')),
|
|
150
|
+
}));
|
|
151
|
+
const id = engine.propose({
|
|
152
|
+
source: 'research',
|
|
153
|
+
type: 'execute_trade',
|
|
154
|
+
title: 'Failed trade',
|
|
155
|
+
confidence: 0.9,
|
|
156
|
+
payload: { symbol: 'BTC', action: 'buy', strategyId: 1, confidence: 0.9 },
|
|
157
|
+
});
|
|
158
|
+
const result = await engine.executeAction(id);
|
|
159
|
+
expect(result.success).toBe(false);
|
|
160
|
+
const action = engine.getAction(id);
|
|
161
|
+
expect(action?.status).toBe('failed');
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=trade-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade-handler.test.js","sourceRoot":"","sources":["../../../src/action/__tests__/trade-handler.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;CACpF,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEjD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,aAAa;gBACrB,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,YAAY;gBACpB,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC7D,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,KAAK;oBACb,SAAS,EAAE;wBACT,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE;qBAC3C;iBACF,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,iBAAkB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,iBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,iBAAkB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,aAAa,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC7D,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACrD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,aAAa,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;aACtE,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;iBACpF,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACnD,IAAI,EAAqB,CAAC;QAE1B,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjC,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAErE,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAE1E,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxB,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,SAAS;gBAChB,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;aAC3E,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAErE,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAE1E,MAAM,CAAC,OAAO,CAAC;gBACb,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,UAAU;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE;aAC3E,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,kBAAkB,CAAC;gBACzD,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAC,CAAC;YAEJ,MAAM,CAAC,OAAO,CAAC;gBACb,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,sBAAsB;gBAC7B,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE;aAC1E,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,kBAAkB,CAAC;gBACzD,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;aAChE,CAAC,CAAC,CAAC;YAEJ,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxB,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,cAAc;gBACrB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE;aAC1E,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type Database from 'better-sqlite3';
|
|
2
2
|
export interface ProposedAction {
|
|
3
3
|
id: number;
|
|
4
|
-
source: 'proactive' | 'creative' | 'mission' | 'selfmod' | 'codegen' | 'research';
|
|
5
|
-
type: 'publish_content' | 'apply_code' | 'execute_trade' | 'adjust_parameter' | 'create_goal' | 'start_mission';
|
|
4
|
+
source: 'proactive' | 'creative' | 'mission' | 'selfmod' | 'codegen' | 'research' | 'feedback-router';
|
|
5
|
+
type: 'publish_content' | 'apply_code' | 'execute_trade' | 'adjust_parameter' | 'create_goal' | 'start_mission' | 'creative_seed';
|
|
6
6
|
title: string;
|
|
7
7
|
description: string;
|
|
8
8
|
confidence: number;
|
|
@@ -7,6 +7,7 @@ const RISK_MAP = {
|
|
|
7
7
|
publish_content: { risk: 'medium', minConfidence: 0.8 },
|
|
8
8
|
execute_trade: { risk: 'medium', minConfidence: 0.8 },
|
|
9
9
|
apply_code: { risk: 'high', minConfidence: 1.1 }, // never auto (>1.0)
|
|
10
|
+
creative_seed: { risk: 'low', minConfidence: 0.5 },
|
|
10
11
|
};
|
|
11
12
|
// ── Migration ──────────────────────────────────────────────
|
|
12
13
|
export function runActionBridgeMigration(db) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-bridge.js","sourceRoot":"","sources":["../../src/action/action-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA4C/C,kDAAkD;AAClD,MAAM,QAAQ,GAAmE;IAC/E,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE;IACrD,WAAW,EAAO,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE;IACrD,aAAa,EAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE;IACrD,eAAe,EAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE;IACxD,aAAa,EAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE;IACxD,UAAU,EAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,oBAAoB;
|
|
1
|
+
{"version":3,"file":"action-bridge.js","sourceRoot":"","sources":["../../src/action/action-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ContentHandlerDeps {
|
|
2
|
+
publishNow: (pieceId: number) => Promise<{
|
|
3
|
+
success: boolean;
|
|
4
|
+
postId?: string;
|
|
5
|
+
}>;
|
|
6
|
+
getPiece: (id: number) => {
|
|
7
|
+
id: number;
|
|
8
|
+
title: string;
|
|
9
|
+
platform: string;
|
|
10
|
+
status: string;
|
|
11
|
+
} | null;
|
|
12
|
+
}
|
|
13
|
+
export interface ContentHandlerResult {
|
|
14
|
+
published: boolean;
|
|
15
|
+
pieceId: number;
|
|
16
|
+
postId?: string;
|
|
17
|
+
platform?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates an ActionBridge handler for `publish_content` actions.
|
|
21
|
+
* Translates publish proposals into ContentForge.publishNow() calls.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createContentHandler(deps: ContentHandlerDeps): (payload: Record<string, unknown>) => Promise<ContentHandlerResult>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { getLogger } from '../../utils/logger.js';
|
|
2
|
+
// ── Handler Factory ──────────────────────────────────────────
|
|
3
|
+
const log = getLogger();
|
|
4
|
+
/**
|
|
5
|
+
* Creates an ActionBridge handler for `publish_content` actions.
|
|
6
|
+
* Translates publish proposals into ContentForge.publishNow() calls.
|
|
7
|
+
*/
|
|
8
|
+
export function createContentHandler(deps) {
|
|
9
|
+
return async (payload) => {
|
|
10
|
+
const pieceId = payload.pieceId ?? 0;
|
|
11
|
+
const piece = deps.getPiece(pieceId);
|
|
12
|
+
if (!piece) {
|
|
13
|
+
log.warn(`[content-handler] Content piece #${pieceId} not found`);
|
|
14
|
+
throw new Error(`Content piece #${pieceId} not found`);
|
|
15
|
+
}
|
|
16
|
+
if (piece.status === 'published') {
|
|
17
|
+
log.info(`[content-handler] Content #${pieceId} already published`);
|
|
18
|
+
return { published: false, pieceId, platform: piece.platform };
|
|
19
|
+
}
|
|
20
|
+
log.info(`[content-handler] Publishing content #${pieceId}: ${piece.title} on ${piece.platform}`);
|
|
21
|
+
const result = await deps.publishNow(pieceId);
|
|
22
|
+
return {
|
|
23
|
+
published: result.success,
|
|
24
|
+
pieceId,
|
|
25
|
+
postId: result.postId,
|
|
26
|
+
platform: piece.platform,
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=content-handler.js.map
|