@timmeck/brain-core 2.7.0 → 2.9.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.
Files changed (38) hide show
  1. package/README.md +26 -9
  2. package/dist/dream/consolidator.d.ts +24 -0
  3. package/dist/dream/consolidator.js +242 -0
  4. package/dist/dream/consolidator.js.map +1 -0
  5. package/dist/dream/dream-engine.d.ts +42 -0
  6. package/dist/dream/dream-engine.js +267 -0
  7. package/dist/dream/dream-engine.js.map +1 -0
  8. package/dist/dream/index.d.ts +3 -0
  9. package/dist/dream/index.js +3 -0
  10. package/dist/dream/index.js.map +1 -0
  11. package/dist/dream/types.d.ts +99 -0
  12. package/dist/dream/types.js +3 -0
  13. package/dist/dream/types.js.map +1 -0
  14. package/dist/index.d.ts +6 -0
  15. package/dist/index.js +6 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/mcp/server.d.ts +2 -0
  18. package/dist/mcp/server.js +16 -0
  19. package/dist/mcp/server.js.map +1 -1
  20. package/dist/research/adapters/brain-adapter.d.ts +14 -0
  21. package/dist/research/adapters/brain-adapter.js +161 -0
  22. package/dist/research/adapters/brain-adapter.js.map +1 -0
  23. package/dist/research/adapters/index.d.ts +3 -0
  24. package/dist/research/adapters/index.js +4 -0
  25. package/dist/research/adapters/index.js.map +1 -0
  26. package/dist/research/adapters/marketing-adapter.d.ts +15 -0
  27. package/dist/research/adapters/marketing-adapter.js +196 -0
  28. package/dist/research/adapters/marketing-adapter.js.map +1 -0
  29. package/dist/research/adapters/trading-adapter.d.ts +15 -0
  30. package/dist/research/adapters/trading-adapter.js +165 -0
  31. package/dist/research/adapters/trading-adapter.js.map +1 -0
  32. package/dist/research/data-miner.d.ts +84 -0
  33. package/dist/research/data-miner.js +174 -0
  34. package/dist/research/data-miner.js.map +1 -0
  35. package/dist/research/research-orchestrator.d.ts +8 -0
  36. package/dist/research/research-orchestrator.js +25 -0
  37. package/dist/research/research-orchestrator.js.map +1 -1
  38. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ export { DreamEngine, runDreamMigration } from './dream-engine.js';
2
+ export { DreamConsolidator } from './consolidator.js';
3
+ export type { DreamEngineConfig, DreamCycleReport, DreamStatus, DreamHistoryEntry, DreamTrigger, MemoryReplayResult, SynapsePruneResult, MemoryCompressionResult, MemoryCluster, ImportanceDecayResult, } from './types.js';
@@ -0,0 +1,3 @@
1
+ export { DreamEngine, runDreamMigration } from './dream-engine.js';
2
+ export { DreamConsolidator } from './consolidator.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dream/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,99 @@
1
+ export interface DreamEngineConfig {
2
+ brainName: string;
3
+ /** Interval between dream cycles in ms. Default: 1_800_000 (30 min) */
4
+ intervalMs?: number;
5
+ /** Brain must be idle this long before dreaming. Default: 300_000 (5 min) */
6
+ idleThresholdMs?: number;
7
+ /** How many top-importance memories to replay per cycle. Default: 20 */
8
+ replayBatchSize?: number;
9
+ /** Cosine similarity threshold for clustering. Default: 0.75 */
10
+ clusterSimilarityThreshold?: number;
11
+ /** Minimum cluster size to trigger compression. Default: 3 */
12
+ minClusterSize?: number;
13
+ /** Importance decay multiplier for old memories. Default: 0.5 */
14
+ importanceDecayRate?: number;
15
+ /** Days since last access before importance decay applies. Default: 30 */
16
+ importanceDecayAfterDays?: number;
17
+ /** Archive threshold — memories at or below this importance get archived. Default: 1 */
18
+ archiveImportanceThreshold?: number;
19
+ /** Synapse weight threshold for dream pruning (more aggressive than normal). Default: 0.15 */
20
+ dreamPruneThreshold?: number;
21
+ /** Learning rate for strengthening activated synapses during replay. Default: 0.15 */
22
+ dreamLearningRate?: number;
23
+ /** Max memory clusters to consolidate per cycle. Default: 5 */
24
+ maxConsolidationsPerCycle?: number;
25
+ }
26
+ export type DreamTrigger = 'auto' | 'manual' | 'idle';
27
+ export interface DreamCycleReport {
28
+ cycleId: string;
29
+ timestamp: number;
30
+ duration: number;
31
+ trigger: DreamTrigger;
32
+ replay: MemoryReplayResult;
33
+ pruning: SynapsePruneResult;
34
+ compression: MemoryCompressionResult;
35
+ decay: ImportanceDecayResult;
36
+ principlesDiscovered: number;
37
+ journalEntryId: number | null;
38
+ }
39
+ export interface DreamStatus {
40
+ running: boolean;
41
+ totalCycles: number;
42
+ lastDreamAt: number | null;
43
+ totals: {
44
+ memoriesConsolidated: number;
45
+ synapsesPruned: number;
46
+ memoriesArchived: number;
47
+ };
48
+ }
49
+ export interface DreamHistoryEntry {
50
+ id: number;
51
+ cycle_id: string;
52
+ timestamp: number;
53
+ duration: number;
54
+ trigger: DreamTrigger;
55
+ memories_replayed: number;
56
+ synapses_strengthened: number;
57
+ synapses_pruned: number;
58
+ synapses_decayed: number;
59
+ memories_consolidated: number;
60
+ memories_superseded: number;
61
+ memories_archived: number;
62
+ importance_decayed: number;
63
+ principles_discovered: number;
64
+ compression_ratio: number;
65
+ journal_entry_id: number | null;
66
+ created_at: string;
67
+ }
68
+ export interface MemoryReplayResult {
69
+ memoriesReplayed: number;
70
+ synapsesStrengthened: number;
71
+ synapsesDecayed: number;
72
+ topActivations: Array<{
73
+ memoryId: string;
74
+ importance: number;
75
+ activatedNodes: number;
76
+ }>;
77
+ }
78
+ export interface SynapsePruneResult {
79
+ synapsesPruned: number;
80
+ threshold: number;
81
+ }
82
+ export interface MemoryCompressionResult {
83
+ clustersFound: number;
84
+ memoriesConsolidated: number;
85
+ memoriesSuperseded: number;
86
+ compressionRatio: number;
87
+ clusters: MemoryCluster[];
88
+ }
89
+ export interface MemoryCluster {
90
+ centroidId: string;
91
+ memberIds: string[];
92
+ avgSimilarity: number;
93
+ consolidatedTitle: string;
94
+ }
95
+ export interface ImportanceDecayResult {
96
+ memoriesDecayed: number;
97
+ memoriesArchived: number;
98
+ avgDecay: number;
99
+ }
@@ -0,0 +1,3 @@
1
+ // ── Dream Mode Types ───────────────────────────────────
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/dream/types.ts"],"names":[],"mappings":"AAAA,0DAA0D"}
package/dist/index.d.ts CHANGED
@@ -89,3 +89,9 @@ export { ResearchJournal, runJournalMigration } from './research/journal.js';
89
89
  export type { JournalEntry, JournalEntryType, Significance, JournalSummary, JournalConfig } from './research/journal.js';
90
90
  export { ResearchOrchestrator } from './research/research-orchestrator.js';
91
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';
95
+ export { DreamEngine, runDreamMigration } from './dream/index.js';
96
+ export { DreamConsolidator } from './dream/index.js';
97
+ export type { DreamEngineConfig, DreamCycleReport, DreamStatus, DreamHistoryEntry, DreamTrigger, MemoryReplayResult, SynapsePruneResult, MemoryCompressionResult, MemoryCluster, ImportanceDecayResult } from './dream/index.js';
package/dist/index.js CHANGED
@@ -80,4 +80,10 @@ export { AnomalyDetective, runAnomalyDetectiveMigration } from './research/anoma
80
80
  export { ResearchJournal, runJournalMigration } from './research/journal.js';
81
81
  // ── Research Orchestrator ─────────────────────────────
82
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';
86
+ // ── Dream Mode ──────────────────────────────────────
87
+ export { DreamEngine, runDreamMigration } from './dream/index.js';
88
+ export { DreamConsolidator } from './dream/index.js';
83
89
  //# 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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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>;
@@ -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();
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
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,3 @@
1
+ export { BrainDataMinerAdapter } from './brain-adapter.js';
2
+ export { TradingDataMinerAdapter } from './trading-adapter.js';
3
+ export { MarketingDataMinerAdapter } from './marketing-adapter.js';
@@ -0,0 +1,4 @@
1
+ export { BrainDataMinerAdapter } from './brain-adapter.js';
2
+ export { TradingDataMinerAdapter } from './trading-adapter.js';
3
+ export { MarketingDataMinerAdapter } from './marketing-adapter.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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