@timmeck/brain-core 2.6.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dashboard/research-server.d.ts +11 -0
- package/dist/dashboard/research-server.js +47 -0
- package/dist/dashboard/research-server.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +16 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/research/adapters/brain-adapter.d.ts +14 -0
- package/dist/research/adapters/brain-adapter.js +161 -0
- package/dist/research/adapters/brain-adapter.js.map +1 -0
- package/dist/research/adapters/index.d.ts +3 -0
- package/dist/research/adapters/index.js +4 -0
- package/dist/research/adapters/index.js.map +1 -0
- package/dist/research/adapters/marketing-adapter.d.ts +15 -0
- package/dist/research/adapters/marketing-adapter.js +196 -0
- package/dist/research/adapters/marketing-adapter.js.map +1 -0
- package/dist/research/adapters/trading-adapter.d.ts +15 -0
- package/dist/research/adapters/trading-adapter.js +165 -0
- package/dist/research/adapters/trading-adapter.js.map +1 -0
- package/dist/research/data-miner.d.ts +84 -0
- package/dist/research/data-miner.js +174 -0
- package/dist/research/data-miner.js.map +1 -0
- package/dist/research/research-orchestrator.d.ts +72 -0
- package/dist/research/research-orchestrator.js +243 -0
- package/dist/research/research-orchestrator.js.map +1 -0
- package/package.json +1 -1
- package/research-dashboard.html +735 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DashboardServer } from './server.js';
|
|
2
|
+
import type { ResearchOrchestrator } from '../research/research-orchestrator.js';
|
|
3
|
+
import type { AutonomousResearchScheduler } from '../research/autonomous-scheduler.js';
|
|
4
|
+
export interface ResearchDashboardOptions {
|
|
5
|
+
port: number;
|
|
6
|
+
brainName: string;
|
|
7
|
+
version: string;
|
|
8
|
+
orchestrator: ResearchOrchestrator;
|
|
9
|
+
scheduler: AutonomousResearchScheduler;
|
|
10
|
+
}
|
|
11
|
+
export declare function createResearchDashboard(options: ResearchDashboardOptions): DashboardServer;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DashboardServer } from './server.js';
|
|
4
|
+
export function createResearchDashboard(options) {
|
|
5
|
+
const { port, brainName, version, orchestrator, scheduler } = options;
|
|
6
|
+
const htmlPath = path.resolve(path.dirname(new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/, '$1')), '../../research-dashboard.html');
|
|
7
|
+
return new DashboardServer({
|
|
8
|
+
port,
|
|
9
|
+
getDashboardHtml: () => {
|
|
10
|
+
let template;
|
|
11
|
+
try {
|
|
12
|
+
template = fs.readFileSync(htmlPath, 'utf-8');
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return '<html><body><h1>Research Dashboard HTML not found</h1></body></html>';
|
|
16
|
+
}
|
|
17
|
+
const status = scheduler.getStatus();
|
|
18
|
+
const summary = orchestrator.getSummary();
|
|
19
|
+
const hypotheses = status.hypothesisSummary;
|
|
20
|
+
const hypothesesData = {
|
|
21
|
+
pending: hypotheses.pending ?? [],
|
|
22
|
+
confirmed: hypotheses.confirmed ?? [],
|
|
23
|
+
rejected: hypotheses.rejected ?? [],
|
|
24
|
+
};
|
|
25
|
+
return template
|
|
26
|
+
.replace(/\{\{BRAIN_NAME\}\}/g, brainName)
|
|
27
|
+
.replace(/\{\{VERSION\}\}/g, version)
|
|
28
|
+
.replace(/\{\{CYCLES\}\}/g, String(status.cyclesCompleted))
|
|
29
|
+
.replace(/\{\{DISCOVERIES\}\}/g, String(status.totalDiscoveries))
|
|
30
|
+
.replace(/\{\{CONFIRMATION_RATE\}\}/g, status.hypothesisSummary.total > 0
|
|
31
|
+
? `${Math.round((status.hypothesisSummary.confirmed / status.hypothesisSummary.total) * 100)}%`
|
|
32
|
+
: 'N/A')
|
|
33
|
+
.replace(/\{\{ANOMALIES\}\}/g, String(summary.anomalies.length))
|
|
34
|
+
.replace(/\{\{HYPOTHESES_JSON\}\}/g, JSON.stringify(hypothesesData))
|
|
35
|
+
.replace(/\{\{EXPERIMENTS_JSON\}\}/g, JSON.stringify(summary.experiments))
|
|
36
|
+
.replace(/\{\{ANOMALIES_JSON\}\}/g, JSON.stringify(summary.anomalies))
|
|
37
|
+
.replace(/\{\{PRINCIPLES_JSON\}\}/g, JSON.stringify(summary.knowledge.topPrinciples ?? []))
|
|
38
|
+
.replace(/\{\{ANTI_PATTERNS_JSON\}\}/g, JSON.stringify([]))
|
|
39
|
+
.replace(/\{\{JOURNAL_JSON\}\}/g, JSON.stringify(summary.journal.recent_highlights ?? []))
|
|
40
|
+
.replace(/\{\{INSIGHTS_JSON\}\}/g, JSON.stringify(summary.selfInsights))
|
|
41
|
+
.replace(/\{\{CORRELATIONS_JSON\}\}/g, JSON.stringify(summary.correlations))
|
|
42
|
+
.replace(/\{\{AGENDA_JSON\}\}/g, JSON.stringify(summary.agenda));
|
|
43
|
+
},
|
|
44
|
+
getStats: () => orchestrator.getSummary(),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=research-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-server.js","sourceRoot":"","sources":["../../src/dashboard/research-server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -43,6 +43,8 @@ export { DashboardServer } from './dashboard/server.js';
|
|
|
43
43
|
export type { DashboardServerOptions } from './dashboard/server.js';
|
|
44
44
|
export { createHubDashboard } from './dashboard/hub-server.js';
|
|
45
45
|
export type { HubDashboardOptions } from './dashboard/hub-server.js';
|
|
46
|
+
export { createResearchDashboard } from './dashboard/research-server.js';
|
|
47
|
+
export type { ResearchDashboardOptions } from './dashboard/research-server.js';
|
|
46
48
|
export { CrossBrainClient } from './cross-brain/client.js';
|
|
47
49
|
export type { BrainPeer } from './cross-brain/client.js';
|
|
48
50
|
export { CrossBrainNotifier } from './cross-brain/notifications.js';
|
|
@@ -85,3 +87,8 @@ export { AnomalyDetective, runAnomalyDetectiveMigration } from './research/anoma
|
|
|
85
87
|
export type { Anomaly, AnomalyType, AnomalySeverity, DriftReport, AnomalyDetectiveConfig } from './research/anomaly-detective.js';
|
|
86
88
|
export { ResearchJournal, runJournalMigration } from './research/journal.js';
|
|
87
89
|
export type { JournalEntry, JournalEntryType, Significance, JournalSummary, JournalConfig } from './research/journal.js';
|
|
90
|
+
export { ResearchOrchestrator } from './research/research-orchestrator.js';
|
|
91
|
+
export type { ResearchOrchestratorConfig } from './research/research-orchestrator.js';
|
|
92
|
+
export { DataMiner, runDataMinerMigration } from './research/data-miner.js';
|
|
93
|
+
export type { DataMinerAdapter, DataMinerEngines, DataMinerState, MineResult, MinedObservation, MinedCausalEvent, MinedMetric, MinedHypothesisObservation, MinedCrossDomainEvent } from './research/data-miner.js';
|
|
94
|
+
export { BrainDataMinerAdapter, TradingDataMinerAdapter, MarketingDataMinerAdapter } from './research/adapters/index.js';
|
package/dist/index.js
CHANGED
|
@@ -38,6 +38,7 @@ export { BaseMemoryEngine } from './memory/base-memory-engine.js';
|
|
|
38
38
|
// ── Dashboard ────────────────────────────────────────────
|
|
39
39
|
export { DashboardServer } from './dashboard/server.js';
|
|
40
40
|
export { createHubDashboard } from './dashboard/hub-server.js';
|
|
41
|
+
export { createResearchDashboard } from './dashboard/research-server.js';
|
|
41
42
|
// ── Cross-Brain ────────────────────────────────────────────
|
|
42
43
|
export { CrossBrainClient } from './cross-brain/client.js';
|
|
43
44
|
export { CrossBrainNotifier } from './cross-brain/notifications.js';
|
|
@@ -77,4 +78,9 @@ export { ResearchAgendaEngine, runAgendaMigration } from './research/agenda-engi
|
|
|
77
78
|
export { AnomalyDetective, runAnomalyDetectiveMigration } from './research/anomaly-detective.js';
|
|
78
79
|
// ── Research Journal ───────────────────────────────────
|
|
79
80
|
export { ResearchJournal, runJournalMigration } from './research/journal.js';
|
|
81
|
+
// ── Research Orchestrator ─────────────────────────────
|
|
82
|
+
export { ResearchOrchestrator } from './research/research-orchestrator.js';
|
|
83
|
+
// ── DataMiner ────────────────────────────────────────
|
|
84
|
+
export { DataMiner, runDataMinerMigration } from './research/data-miner.js';
|
|
85
|
+
export { BrainDataMinerAdapter, TradingDataMinerAdapter, MarketingDataMinerAdapter } from './research/adapters/index.js';
|
|
80
86
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,8DAA8D;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,8DAA8D;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,8DAA8D;AAC9D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAElH,8DAA8D;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,8DAA8D;AAC9D,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEtH,8DAA8D;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3F,8DAA8D;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,8DAA8D;AAC9D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQ/D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,6DAA6D;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,2DAA2D;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAU7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,4DAA4D;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -13,5 +13,7 @@ export interface McpServerOptions {
|
|
|
13
13
|
registerTools: (server: McpServer, ipc: IpcClient) => void;
|
|
14
14
|
/** Register MCP prompts on the server (optional) */
|
|
15
15
|
registerPrompts?: (server: McpServer, ipc: IpcClient) => void;
|
|
16
|
+
/** Callback when a tool is called — used for DataMiner/SelfObserver tracking */
|
|
17
|
+
onToolCall?: (toolName: string, durationMs: number, success: boolean) => void;
|
|
16
18
|
}
|
|
17
19
|
export declare function startMcpServer(opts: McpServerOptions): Promise<void>;
|
package/dist/mcp/server.js
CHANGED
|
@@ -51,6 +51,22 @@ export async function startMcpServer(opts) {
|
|
|
51
51
|
process.exit(1);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
// Wrap IPC client to track tool calls if onToolCall callback is provided
|
|
55
|
+
if (opts.onToolCall) {
|
|
56
|
+
const originalRequest = ipc.request.bind(ipc);
|
|
57
|
+
const onToolCall = opts.onToolCall;
|
|
58
|
+
ipc.request = (method, params) => {
|
|
59
|
+
const start = Date.now();
|
|
60
|
+
let success = true;
|
|
61
|
+
return originalRequest(method, params).then((result) => { try {
|
|
62
|
+
onToolCall(method, Date.now() - start, success);
|
|
63
|
+
}
|
|
64
|
+
catch { /* best effort */ } return result; }, (err) => { success = false; try {
|
|
65
|
+
onToolCall(method, Date.now() - start, success);
|
|
66
|
+
}
|
|
67
|
+
catch { /* best effort */ } throw err; });
|
|
68
|
+
};
|
|
69
|
+
}
|
|
54
70
|
opts.registerTools(server, ipc);
|
|
55
71
|
opts.registerPrompts?.(server, ipc);
|
|
56
72
|
const transport = new StdioServerTransport();
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { DataMinerAdapter, MinedObservation, MinedCausalEvent, MinedMetric, MinedHypothesisObservation, MinedCrossDomainEvent } from '../data-miner.js';
|
|
3
|
+
/**
|
|
4
|
+
* DataMiner adapter for the main Brain.
|
|
5
|
+
* Mines: errors, solutions, code_modules, synapses, insights, git_commits, decisions.
|
|
6
|
+
*/
|
|
7
|
+
export declare class BrainDataMinerAdapter implements DataMinerAdapter {
|
|
8
|
+
readonly name = "brain";
|
|
9
|
+
mineObservations(db: Database.Database, since: number): MinedObservation[];
|
|
10
|
+
mineCausalEvents(db: Database.Database, since: number): MinedCausalEvent[];
|
|
11
|
+
mineMetrics(db: Database.Database, since: number): MinedMetric[];
|
|
12
|
+
mineHypothesisObservations(db: Database.Database, since: number): MinedHypothesisObservation[];
|
|
13
|
+
mineCrossDomainEvents(db: Database.Database, since: number): MinedCrossDomainEvent[];
|
|
14
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataMiner adapter for the main Brain.
|
|
3
|
+
* Mines: errors, solutions, code_modules, synapses, insights, git_commits, decisions.
|
|
4
|
+
*/
|
|
5
|
+
export class BrainDataMinerAdapter {
|
|
6
|
+
name = 'brain';
|
|
7
|
+
mineObservations(db, since) {
|
|
8
|
+
const observations = [];
|
|
9
|
+
// Error type distribution
|
|
10
|
+
const errors = safeAll(db, `SELECT type, COUNT(*) as cnt, SUM(CASE WHEN resolved = 1 THEN 1 ELSE 0 END) as resolved
|
|
11
|
+
FROM errors WHERE last_seen > ? GROUP BY type`, [isoFromTs(since)]);
|
|
12
|
+
for (const e of errors) {
|
|
13
|
+
observations.push({
|
|
14
|
+
category: 'resolution_rate',
|
|
15
|
+
event_type: 'error:type_stats',
|
|
16
|
+
metrics: { type: e.type, count: e.cnt, resolved: e.resolved, resolution_rate: e.cnt > 0 ? e.resolved / e.cnt : 0 },
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
// Solution success rates
|
|
20
|
+
const solutions = safeAll(db, `SELECT id, description, success_count, fail_count FROM solutions WHERE updated_at > ?`, [isoFromTs(since)]);
|
|
21
|
+
for (const s of solutions) {
|
|
22
|
+
const total = s.success_count + s.fail_count;
|
|
23
|
+
observations.push({
|
|
24
|
+
category: 'resolution_rate',
|
|
25
|
+
event_type: 'solution:effectiveness',
|
|
26
|
+
metrics: { solution_id: s.id, success_count: s.success_count, fail_count: s.fail_count, success_rate: total > 0 ? s.success_count / total : 0 },
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Code module complexity
|
|
30
|
+
const modules = safeAll(db, `SELECT id, file_path, complexity, lines FROM code_modules WHERE updated_at > ?`, [isoFromTs(since)]);
|
|
31
|
+
for (const m of modules) {
|
|
32
|
+
observations.push({
|
|
33
|
+
category: 'tool_usage',
|
|
34
|
+
event_type: 'module:complexity',
|
|
35
|
+
metrics: { module_id: m.id, file_path: m.file_path, complexity: m.complexity ?? 0, lines: m.lines ?? 0 },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Synapse network stats
|
|
39
|
+
const synapseStats = safeAll(db, `SELECT relationship, COUNT(*) as cnt, AVG(weight) as avg_weight
|
|
40
|
+
FROM synapses WHERE updated_at > ? GROUP BY relationship`, [isoFromTs(since)]);
|
|
41
|
+
for (const s of synapseStats) {
|
|
42
|
+
observations.push({
|
|
43
|
+
category: 'tool_usage',
|
|
44
|
+
event_type: 'synapse:network_stats',
|
|
45
|
+
metrics: { relationship: s.relationship, count: s.cnt, avg_weight: s.avg_weight },
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Insight quality
|
|
49
|
+
const insights = safeAll(db, `SELECT id, type, confidence FROM insights WHERE created_at > ?`, [isoFromTs(since)]);
|
|
50
|
+
for (const i of insights) {
|
|
51
|
+
observations.push({
|
|
52
|
+
category: 'query_quality',
|
|
53
|
+
event_type: 'insight:quality',
|
|
54
|
+
metrics: { insight_id: i.id, type: i.type, confidence: i.confidence ?? 0 },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return observations;
|
|
58
|
+
}
|
|
59
|
+
mineCausalEvents(db, since) {
|
|
60
|
+
const events = [];
|
|
61
|
+
// Errors as causal events
|
|
62
|
+
const errors = safeAll(db, `SELECT id, type, fingerprint, resolved, project_id FROM errors WHERE last_seen > ?`, [isoFromTs(since)]);
|
|
63
|
+
for (const e of errors) {
|
|
64
|
+
events.push({ source: 'brain', type: 'error:occurred', data: { errorId: e.id, errorType: e.type, fingerprint: e.fingerprint, resolved: e.resolved === 1, projectId: e.project_id } });
|
|
65
|
+
}
|
|
66
|
+
// Decisions as causal events
|
|
67
|
+
const decisions = safeAll(db, `SELECT id, title, outcome, project_id FROM decisions WHERE created_at > ?`, [isoFromTs(since)]);
|
|
68
|
+
for (const d of decisions) {
|
|
69
|
+
events.push({ source: 'brain', type: 'decision:made', data: { decisionId: d.id, title: d.title, outcome: d.outcome, projectId: d.project_id } });
|
|
70
|
+
}
|
|
71
|
+
// Git commits as causal events
|
|
72
|
+
const commits = safeAll(db, `SELECT id, hash, project_id, files_changed FROM git_commits WHERE created_at > ?`, [isoFromTs(since)]);
|
|
73
|
+
for (const c of commits) {
|
|
74
|
+
events.push({ source: 'brain', type: 'commit:pushed', data: { commitId: c.id, hash: c.hash, projectId: c.project_id, filesChanged: c.files_changed ?? 0 } });
|
|
75
|
+
}
|
|
76
|
+
return events;
|
|
77
|
+
}
|
|
78
|
+
mineMetrics(db, since) {
|
|
79
|
+
const metrics = [];
|
|
80
|
+
// Error counts by type
|
|
81
|
+
const errorCounts = safeAll(db, `SELECT type, COUNT(*) as cnt FROM errors WHERE last_seen > ? GROUP BY type`, [isoFromTs(since)]);
|
|
82
|
+
for (const e of errorCounts) {
|
|
83
|
+
metrics.push({ name: `error_count:${e.type}`, value: e.cnt });
|
|
84
|
+
}
|
|
85
|
+
// Overall resolution rate
|
|
86
|
+
const resolution = safeGet(db, `SELECT COUNT(*) as total, SUM(CASE WHEN resolved = 1 THEN 1 ELSE 0 END) as resolved FROM errors WHERE last_seen > ?`, [isoFromTs(since)]);
|
|
87
|
+
if (resolution && resolution.total > 0) {
|
|
88
|
+
metrics.push({ name: 'resolution_rate', value: resolution.resolved / resolution.total });
|
|
89
|
+
}
|
|
90
|
+
// Average module complexity
|
|
91
|
+
const complexity = safeGet(db, `SELECT AVG(complexity) as avg_complexity FROM code_modules WHERE complexity IS NOT NULL AND updated_at > ?`, [isoFromTs(since)]);
|
|
92
|
+
if (complexity?.avg_complexity != null) {
|
|
93
|
+
metrics.push({ name: 'avg_module_complexity', value: complexity.avg_complexity });
|
|
94
|
+
}
|
|
95
|
+
// Synapse count
|
|
96
|
+
const synapseCount = safeGet(db, `SELECT COUNT(*) as cnt FROM synapses WHERE updated_at > ?`, [isoFromTs(since)]);
|
|
97
|
+
if (synapseCount) {
|
|
98
|
+
metrics.push({ name: 'synapse_count', value: synapseCount.cnt });
|
|
99
|
+
}
|
|
100
|
+
// Insight count
|
|
101
|
+
const insightCount = safeGet(db, `SELECT COUNT(*) as cnt FROM insights WHERE created_at > ?`, [isoFromTs(since)]);
|
|
102
|
+
if (insightCount) {
|
|
103
|
+
metrics.push({ name: 'insight_count', value: insightCount.cnt });
|
|
104
|
+
}
|
|
105
|
+
return metrics;
|
|
106
|
+
}
|
|
107
|
+
mineHypothesisObservations(db, since) {
|
|
108
|
+
const observations = [];
|
|
109
|
+
// Errors as hypothesis observations
|
|
110
|
+
const errors = safeAll(db, `SELECT type, COUNT(*) as cnt FROM errors WHERE last_seen > ? GROUP BY type`, [isoFromTs(since)]);
|
|
111
|
+
for (const e of errors) {
|
|
112
|
+
observations.push({ source: 'brain', type: 'error:reported', value: e.cnt, metadata: { errorType: e.type } });
|
|
113
|
+
}
|
|
114
|
+
// Solution applications
|
|
115
|
+
const solutions = safeAll(db, `SELECT success, COUNT(*) as cnt FROM error_solutions WHERE applied_at > ? GROUP BY success`, [isoFromTs(since)]);
|
|
116
|
+
for (const s of solutions) {
|
|
117
|
+
observations.push({ source: 'brain', type: s.success ? 'solution:success' : 'solution:failure', value: s.cnt });
|
|
118
|
+
}
|
|
119
|
+
// Insights by type
|
|
120
|
+
const insights = safeAll(db, `SELECT type, COUNT(*) as cnt FROM insights WHERE created_at > ? GROUP BY type`, [isoFromTs(since)]);
|
|
121
|
+
for (const i of insights) {
|
|
122
|
+
observations.push({ source: 'brain', type: 'insight:created', value: i.cnt, metadata: { insightType: i.type } });
|
|
123
|
+
}
|
|
124
|
+
return observations;
|
|
125
|
+
}
|
|
126
|
+
mineCrossDomainEvents(db, since) {
|
|
127
|
+
const events = [];
|
|
128
|
+
// Errors → cross-domain signal for error frequency
|
|
129
|
+
const errorCount = safeGet(db, `SELECT COUNT(*) as cnt FROM errors WHERE last_seen > ?`, [isoFromTs(since)]);
|
|
130
|
+
if (errorCount && errorCount.cnt > 0) {
|
|
131
|
+
events.push({ brain: 'brain', eventType: 'error:batch', data: { count: errorCount.cnt } });
|
|
132
|
+
}
|
|
133
|
+
// Insights → cross-domain signal
|
|
134
|
+
const insightCount = safeGet(db, `SELECT COUNT(*) as cnt FROM insights WHERE created_at > ?`, [isoFromTs(since)]);
|
|
135
|
+
if (insightCount && insightCount.cnt > 0) {
|
|
136
|
+
events.push({ brain: 'brain', eventType: 'insight:batch', data: { count: insightCount.cnt } });
|
|
137
|
+
}
|
|
138
|
+
return events;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// ── Helpers ─────────────────────────────────────────────
|
|
142
|
+
function isoFromTs(ts) {
|
|
143
|
+
return ts > 0 ? new Date(ts).toISOString() : '1970-01-01T00:00:00.000Z';
|
|
144
|
+
}
|
|
145
|
+
function safeAll(db, sql, params) {
|
|
146
|
+
try {
|
|
147
|
+
return db.prepare(sql).all(...params);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function safeGet(db, sql, params) {
|
|
154
|
+
try {
|
|
155
|
+
return db.prepare(sql).get(...params);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=brain-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-adapter.js","sourceRoot":"","sources":["../../../src/research/adapters/brain-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/research/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { DataMinerAdapter, MinedObservation, MinedCausalEvent, MinedMetric, MinedHypothesisObservation, MinedCrossDomainEvent } from '../data-miner.js';
|
|
3
|
+
/**
|
|
4
|
+
* DataMiner adapter for Marketing Brain.
|
|
5
|
+
* Mines: posts + engagement (platform/format performance), campaigns (goal achievement),
|
|
6
|
+
* content_templates (template effectiveness), competitor_posts (benchmarks).
|
|
7
|
+
*/
|
|
8
|
+
export declare class MarketingDataMinerAdapter implements DataMinerAdapter {
|
|
9
|
+
readonly name = "marketing-brain";
|
|
10
|
+
mineObservations(db: Database.Database, since: number): MinedObservation[];
|
|
11
|
+
mineCausalEvents(db: Database.Database, since: number): MinedCausalEvent[];
|
|
12
|
+
mineMetrics(db: Database.Database, since: number): MinedMetric[];
|
|
13
|
+
mineHypothesisObservations(db: Database.Database, since: number): MinedHypothesisObservation[];
|
|
14
|
+
mineCrossDomainEvents(db: Database.Database, since: number): MinedCrossDomainEvent[];
|
|
15
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataMiner adapter for Marketing Brain.
|
|
3
|
+
* Mines: posts + engagement (platform/format performance), campaigns (goal achievement),
|
|
4
|
+
* content_templates (template effectiveness), competitor_posts (benchmarks).
|
|
5
|
+
*/
|
|
6
|
+
export class MarketingDataMinerAdapter {
|
|
7
|
+
name = 'marketing-brain';
|
|
8
|
+
mineObservations(db, since) {
|
|
9
|
+
const observations = [];
|
|
10
|
+
// Post performance by platform
|
|
11
|
+
const platformStats = safeAll(db, `SELECT p.platform, COUNT(*) as cnt,
|
|
12
|
+
AVG(COALESCE(e.likes, 0)) as avg_likes,
|
|
13
|
+
AVG(COALESCE(e.shares, 0)) as avg_shares,
|
|
14
|
+
AVG(COALESCE(e.comments, 0)) as avg_comments
|
|
15
|
+
FROM posts p LEFT JOIN engagement e ON e.post_id = p.id
|
|
16
|
+
WHERE p.created_at > ? GROUP BY p.platform`, [isoFromTs(since)]);
|
|
17
|
+
for (const s of platformStats) {
|
|
18
|
+
observations.push({
|
|
19
|
+
category: 'tool_usage',
|
|
20
|
+
event_type: 'post:platform_stats',
|
|
21
|
+
metrics: { platform: s.platform, count: s.cnt, avg_likes: s.avg_likes, avg_shares: s.avg_shares, avg_comments: s.avg_comments },
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
// Post performance by format
|
|
25
|
+
const formatStats = safeAll(db, `SELECT p.format, COUNT(*) as cnt, AVG(COALESCE(e.likes, 0)) as avg_likes
|
|
26
|
+
FROM posts p LEFT JOIN engagement e ON e.post_id = p.id
|
|
27
|
+
WHERE p.format IS NOT NULL AND p.created_at > ? GROUP BY p.format`, [isoFromTs(since)]);
|
|
28
|
+
for (const f of formatStats) {
|
|
29
|
+
observations.push({
|
|
30
|
+
category: 'tool_usage',
|
|
31
|
+
event_type: 'post:format_stats',
|
|
32
|
+
metrics: { format: f.format, count: f.cnt, avg_likes: f.avg_likes },
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// Campaign goal achievement
|
|
36
|
+
const campaigns = safeAll(db, `SELECT id, name, status, COALESCE(goal_type, 'unknown') as goal_type,
|
|
37
|
+
COALESCE(goal_target, 0) as goal_target, COALESCE(goal_current, 0) as goal_current
|
|
38
|
+
FROM campaigns WHERE updated_at > ?`, [isoFromTs(since)]);
|
|
39
|
+
for (const c of campaigns) {
|
|
40
|
+
observations.push({
|
|
41
|
+
category: 'query_quality',
|
|
42
|
+
event_type: 'campaign:goal_progress',
|
|
43
|
+
metrics: {
|
|
44
|
+
campaign_id: c.id, name: c.name, status: c.status,
|
|
45
|
+
goal_type: c.goal_type, goal_target: c.goal_target, goal_current: c.goal_current,
|
|
46
|
+
achievement_rate: c.goal_target > 0 ? c.goal_current / c.goal_target : 0,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Template effectiveness
|
|
51
|
+
const templates = safeAll(db, `SELECT id, name, COALESCE(use_count, 0) as use_count, COALESCE(avg_engagement, 0) as avg_engagement
|
|
52
|
+
FROM content_templates WHERE updated_at > ?`, [isoFromTs(since)]);
|
|
53
|
+
for (const t of templates) {
|
|
54
|
+
observations.push({
|
|
55
|
+
category: 'tool_usage',
|
|
56
|
+
event_type: 'template:effectiveness',
|
|
57
|
+
metrics: { template_id: t.id, name: t.name, use_count: t.use_count, avg_engagement: t.avg_engagement },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// Competitor benchmarks
|
|
61
|
+
const competitors = safeAll(db, `SELECT competitor_name, COUNT(*) as cnt, AVG(COALESCE(likes, 0)) as avg_likes
|
|
62
|
+
FROM competitor_posts WHERE created_at > ? GROUP BY competitor_name`, [isoFromTs(since)]);
|
|
63
|
+
for (const c of competitors) {
|
|
64
|
+
observations.push({
|
|
65
|
+
category: 'cross_brain',
|
|
66
|
+
event_type: 'competitor:benchmark',
|
|
67
|
+
metrics: { competitor: c.competitor_name, post_count: c.cnt, avg_likes: c.avg_likes },
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return observations;
|
|
71
|
+
}
|
|
72
|
+
mineCausalEvents(db, since) {
|
|
73
|
+
const events = [];
|
|
74
|
+
// Post publications as causal events
|
|
75
|
+
const posts = safeAll(db, `SELECT id, platform, COALESCE(format, 'unknown') as format, campaign_id
|
|
76
|
+
FROM posts WHERE published_at IS NOT NULL AND created_at > ? ORDER BY created_at LIMIT 500`, [isoFromTs(since)]);
|
|
77
|
+
for (const p of posts) {
|
|
78
|
+
events.push({
|
|
79
|
+
source: 'marketing-brain',
|
|
80
|
+
type: 'post:published',
|
|
81
|
+
data: { postId: p.id, platform: p.platform, format: p.format, campaignId: p.campaign_id },
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// Campaign lifecycle events
|
|
85
|
+
const campaigns = safeAll(db, `SELECT id, name, status FROM campaigns WHERE created_at > ?`, [isoFromTs(since)]);
|
|
86
|
+
for (const c of campaigns) {
|
|
87
|
+
events.push({
|
|
88
|
+
source: 'marketing-brain',
|
|
89
|
+
type: `campaign:${c.status}`,
|
|
90
|
+
data: { campaignId: c.id, name: c.name },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return events;
|
|
94
|
+
}
|
|
95
|
+
mineMetrics(db, since) {
|
|
96
|
+
const metrics = [];
|
|
97
|
+
// Total post count
|
|
98
|
+
const postCount = safeGet(db, `SELECT COUNT(*) as cnt FROM posts WHERE created_at > ?`, [isoFromTs(since)]);
|
|
99
|
+
if (postCount) {
|
|
100
|
+
metrics.push({ name: 'post_count', value: postCount.cnt });
|
|
101
|
+
}
|
|
102
|
+
// Average engagement (likes + shares + comments)
|
|
103
|
+
const avgEng = safeGet(db, `SELECT AVG(COALESCE(likes, 0) + COALESCE(shares, 0) + COALESCE(comments, 0)) as avg_total
|
|
104
|
+
FROM engagement WHERE created_at > ?`, [isoFromTs(since)]);
|
|
105
|
+
if (avgEng?.avg_total != null) {
|
|
106
|
+
metrics.push({ name: 'avg_engagement', value: avgEng.avg_total });
|
|
107
|
+
}
|
|
108
|
+
// Active campaigns
|
|
109
|
+
const activeCampaigns = safeGet(db, `SELECT COUNT(*) as cnt FROM campaigns WHERE status = 'active'`, []);
|
|
110
|
+
if (activeCampaigns) {
|
|
111
|
+
metrics.push({ name: 'active_campaigns', value: activeCampaigns.cnt });
|
|
112
|
+
}
|
|
113
|
+
// Template count
|
|
114
|
+
const templateCount = safeGet(db, `SELECT COUNT(*) as cnt FROM content_templates WHERE updated_at > ?`, [isoFromTs(since)]);
|
|
115
|
+
if (templateCount) {
|
|
116
|
+
metrics.push({ name: 'template_count', value: templateCount.cnt });
|
|
117
|
+
}
|
|
118
|
+
// Competitor post count
|
|
119
|
+
const compCount = safeGet(db, `SELECT COUNT(*) as cnt FROM competitor_posts WHERE created_at > ?`, [isoFromTs(since)]);
|
|
120
|
+
if (compCount) {
|
|
121
|
+
metrics.push({ name: 'competitor_posts', value: compCount.cnt });
|
|
122
|
+
}
|
|
123
|
+
return metrics;
|
|
124
|
+
}
|
|
125
|
+
mineHypothesisObservations(db, since) {
|
|
126
|
+
const observations = [];
|
|
127
|
+
// Post publications by platform
|
|
128
|
+
const posts = safeAll(db, `SELECT platform, COUNT(*) as cnt FROM posts WHERE published_at IS NOT NULL AND created_at > ? GROUP BY platform`, [isoFromTs(since)]);
|
|
129
|
+
for (const p of posts) {
|
|
130
|
+
observations.push({
|
|
131
|
+
source: 'marketing-brain',
|
|
132
|
+
type: 'post:published',
|
|
133
|
+
value: p.cnt,
|
|
134
|
+
metadata: { platform: p.platform },
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Engagement by platform
|
|
138
|
+
const engagement = safeAll(db, `SELECT p.platform, AVG(COALESCE(e.likes, 0) + COALESCE(e.shares, 0) + COALESCE(e.comments, 0)) as avg_engagement
|
|
139
|
+
FROM posts p JOIN engagement e ON e.post_id = p.id
|
|
140
|
+
WHERE p.created_at > ? GROUP BY p.platform`, [isoFromTs(since)]);
|
|
141
|
+
for (const e of engagement) {
|
|
142
|
+
observations.push({
|
|
143
|
+
source: 'marketing-brain',
|
|
144
|
+
type: 'engagement:platform',
|
|
145
|
+
value: e.avg_engagement,
|
|
146
|
+
metadata: { platform: e.platform },
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return observations;
|
|
150
|
+
}
|
|
151
|
+
mineCrossDomainEvents(db, since) {
|
|
152
|
+
const events = [];
|
|
153
|
+
// Post batch summary
|
|
154
|
+
const summary = safeGet(db, `SELECT COUNT(*) as total, SUM(CASE WHEN published_at IS NOT NULL THEN 1 ELSE 0 END) as published
|
|
155
|
+
FROM posts WHERE created_at > ?`, [isoFromTs(since)]);
|
|
156
|
+
if (summary && summary.total > 0) {
|
|
157
|
+
events.push({
|
|
158
|
+
brain: 'marketing-brain',
|
|
159
|
+
eventType: 'post:batch',
|
|
160
|
+
data: { count: summary.total, published: summary.published },
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// Campaign summary
|
|
164
|
+
const campaignSummary = safeGet(db, `SELECT COUNT(*) as total, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active
|
|
165
|
+
FROM campaigns WHERE created_at > ?`, [isoFromTs(since)]);
|
|
166
|
+
if (campaignSummary && campaignSummary.total > 0) {
|
|
167
|
+
events.push({
|
|
168
|
+
brain: 'marketing-brain',
|
|
169
|
+
eventType: 'campaign:batch',
|
|
170
|
+
data: { count: campaignSummary.total, active: campaignSummary.active },
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return events;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// ── Helpers ─────────────────────────────────────────────
|
|
177
|
+
function isoFromTs(ts) {
|
|
178
|
+
return ts > 0 ? new Date(ts).toISOString() : '1970-01-01T00:00:00.000Z';
|
|
179
|
+
}
|
|
180
|
+
function safeAll(db, sql, params) {
|
|
181
|
+
try {
|
|
182
|
+
return db.prepare(sql).all(...params);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function safeGet(db, sql, params) {
|
|
189
|
+
try {
|
|
190
|
+
return db.prepare(sql).get(...params);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=marketing-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing-adapter.js","sourceRoot":"","sources":["../../../src/research/adapters/marketing-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { DataMinerAdapter, MinedObservation, MinedCausalEvent, MinedMetric, MinedHypothesisObservation, MinedCrossDomainEvent } from '../data-miner.js';
|
|
3
|
+
/**
|
|
4
|
+
* DataMiner adapter for Trading Brain.
|
|
5
|
+
* Mines: trades (win/loss, profit, regime, pair), rules (confidence, win-rate),
|
|
6
|
+
* chains (streak patterns), calibration.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TradingDataMinerAdapter implements DataMinerAdapter {
|
|
9
|
+
readonly name = "trading-brain";
|
|
10
|
+
mineObservations(db: Database.Database, since: number): MinedObservation[];
|
|
11
|
+
mineCausalEvents(db: Database.Database, since: number): MinedCausalEvent[];
|
|
12
|
+
mineMetrics(db: Database.Database, since: number): MinedMetric[];
|
|
13
|
+
mineHypothesisObservations(db: Database.Database, since: number): MinedHypothesisObservation[];
|
|
14
|
+
mineCrossDomainEvents(db: Database.Database, since: number): MinedCrossDomainEvent[];
|
|
15
|
+
}
|