@timmeck/marketing-brain 0.5.2 → 1.1.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 (50) hide show
  1. package/README.md +8 -4
  2. package/dist/cli/commands/doctor.js +1 -1
  3. package/dist/cli/commands/setup.js +92 -7
  4. package/dist/cli/commands/setup.js.map +1 -1
  5. package/dist/cli/ipc-helper.d.ts +1 -1
  6. package/dist/cli/ipc-helper.js +1 -1
  7. package/dist/cli/ipc-helper.js.map +1 -1
  8. package/dist/dashboard/server.d.ts +6 -12
  9. package/dist/dashboard/server.js +14 -119
  10. package/dist/dashboard/server.js.map +1 -1
  11. package/dist/db/migrations/008_ab_tests.d.ts +2 -0
  12. package/dist/db/migrations/008_ab_tests.js +36 -0
  13. package/dist/db/migrations/008_ab_tests.js.map +1 -0
  14. package/dist/db/migrations/index.js +2 -0
  15. package/dist/db/migrations/index.js.map +1 -1
  16. package/dist/db/repositories/ab-test.repository.d.ts +45 -0
  17. package/dist/db/repositories/ab-test.repository.js +94 -0
  18. package/dist/db/repositories/ab-test.repository.js.map +1 -0
  19. package/dist/db/repositories/post.repository.js +1 -1
  20. package/dist/embeddings/engine.d.ts +35 -0
  21. package/dist/embeddings/engine.js +162 -0
  22. package/dist/embeddings/engine.js.map +1 -0
  23. package/dist/hooks/post-tool-use.js +1 -1
  24. package/dist/hooks/post-tool-use.js.map +1 -1
  25. package/dist/ipc/router.d.ts +14 -1
  26. package/dist/ipc/router.js +72 -0
  27. package/dist/ipc/router.js.map +1 -1
  28. package/dist/learning/confidence-scorer.d.ts +0 -1
  29. package/dist/learning/confidence-scorer.js +0 -2
  30. package/dist/learning/confidence-scorer.js.map +1 -1
  31. package/dist/learning/learning-engine.js +2 -2
  32. package/dist/learning/learning-engine.js.map +1 -1
  33. package/dist/learning/pattern-extractor.d.ts +27 -0
  34. package/dist/learning/pattern-extractor.js +346 -0
  35. package/dist/learning/pattern-extractor.js.map +1 -0
  36. package/dist/marketing-core.d.ts +2 -0
  37. package/dist/marketing-core.js +36 -6
  38. package/dist/marketing-core.js.map +1 -1
  39. package/dist/mcp/tools.d.ts +1 -1
  40. package/dist/mcp/tools.js +34 -0
  41. package/dist/mcp/tools.js.map +1 -1
  42. package/dist/services/ab-test.service.d.ts +29 -0
  43. package/dist/services/ab-test.service.js +143 -0
  44. package/dist/services/ab-test.service.js.map +1 -0
  45. package/dist/services/calendar.service.d.ts +28 -0
  46. package/dist/services/calendar.service.js +211 -0
  47. package/dist/services/calendar.service.js.map +1 -0
  48. package/dist/services/post.service.js +1 -1
  49. package/dist/services/post.service.js.map +1 -1
  50. package/package.json +1 -1
package/README.md CHANGED
@@ -225,6 +225,10 @@ These tools are available to Claude Code when Marketing Brain is configured:
225
225
  | `marketing_insight_list` | Get active insights (trends, gaps, synergies) |
226
226
  | `marketing_analytics_summary` | Full analytics overview |
227
227
  | `marketing_analytics_best` | Top performing posts and strategies |
228
+ | `marketing_extract_patterns` | Extract timing, format, platform & content patterns (new in v1.1) |
229
+ | `marketing_track_ab_test` | Create A/B test with statistical significance tracking (new in v1.1) |
230
+ | `marketing_ab_test_result` | Record data point for A/B test variant (new in v1.1) |
231
+ | `marketing_content_calendar` | Get optimal posting schedule from learned patterns (new in v1.1) |
228
232
  | `marketing_ecosystem_status` | Get status of all brains in the ecosystem |
229
233
  | `marketing_query_peer` | Query another brain in the ecosystem (method + params) |
230
234
  | `marketing_remember` | Store a memory (preference, decision, context, fact, goal, lesson) |
@@ -388,10 +392,10 @@ Marketing Brain is part of the **[Brain Ecosystem](https://github.com/timmeck/br
388
392
 
389
393
  | Brain | Purpose | Ports |
390
394
  |-------|---------|-------|
391
- | [Brain](https://github.com/timmeck/brain-ecosystem/tree/main/packages/brain) v2.2.1 | Error memory, code intelligence & persistent context | 7777 / 7778 |
392
- | [Trading Brain](https://github.com/timmeck/brain-ecosystem/tree/main/packages/trading-brain) v1.3.2 | Adaptive trading intelligence with memory & sessions | 7779 / 7780 |
393
- | **Marketing Brain** v0.5.2 | Content strategy & engagement with memory & sessions | **7781** / 7782 / 7783 |
394
- | [Brain Core](https://github.com/timmeck/brain-ecosystem/tree/main/packages/brain-core) v1.6.1 | Shared infrastructure (IPC, MCP, REST, CLI, math, synapses, memory) | — |
395
+ | [Brain](https://github.com/timmeck/brain-ecosystem/tree/main/packages/brain) v3.0.0 | Error memory, code intelligence & persistent context | 7777 / 7778 |
396
+ | [Trading Brain](https://github.com/timmeck/brain-ecosystem/tree/main/packages/trading-brain) v2.0.0 | Adaptive trading intelligence with memory & sessions | 7779 / 7780 |
397
+ | **Marketing Brain** v1.1.0 | Content strategy & engagement with memory & sessions | **7781** / 7782 / 7783 |
398
+ | [Brain Core](https://github.com/timmeck/brain-ecosystem/tree/main/packages/brain-core) v2.0.0 | Shared infrastructure (IPC, MCP, REST, CLI, math, synapses, memory) | — |
395
399
  | [Brain Hub](https://timmeck.github.io/brain-hub/) | Ecosystem landing page | — |
396
400
 
397
401
  All packages live in the [brain-ecosystem](https://github.com/timmeck/brain-ecosystem) monorepo with npm workspaces. [Brain Core](https://www.npmjs.com/package/@timmeck/brain-core) provides shared infrastructure (IPC, MCP, REST API, CLI, math, synapse algorithms) used by all brains, eliminating ~2,800 lines of duplicated code.
@@ -3,7 +3,7 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import os from 'node:os';
5
5
  import { getDataDir, getPipeName } from '../../utils/paths.js';
6
- import { IpcClient } from '../../ipc/client.js';
6
+ import { IpcClient } from '@timmeck/brain-core';
7
7
  import { c, icons, header, divider } from '../colors.js';
8
8
  function pass(label, detail) {
9
9
  const extra = detail ? ` ${c.dim(detail)}` : '';
@@ -2,6 +2,7 @@ import { Command } from 'commander';
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import os from 'node:os';
5
+ import { execSync } from 'node:child_process';
5
6
  import { getDataDir } from '../../utils/paths.js';
6
7
  import { c, icons, header, divider } from '../colors.js';
7
8
  function pass(label, detail) {
@@ -17,7 +18,25 @@ function skip(label, detail) {
17
18
  console.log(` ${c.dim(icons.arrow)} ${label}${extra}`);
18
19
  }
19
20
  function step(n, label) {
20
- console.log(`\n ${c.cyan(`[${n}/5]`)} ${c.value(label)}`);
21
+ console.log(`\n ${c.cyan(`[${n}/6]`)} ${c.value(label)}`);
22
+ }
23
+ function resolveHookPath() {
24
+ const platform = process.platform;
25
+ try {
26
+ const prefix = execSync('npm prefix -g', { encoding: 'utf8' }).trim();
27
+ const hookRelative = 'node_modules/@timmeck/marketing-brain/dist/hooks/post-tool-use.js';
28
+ if (platform === 'win32') {
29
+ return path.join(prefix, hookRelative);
30
+ }
31
+ return path.join(prefix, 'lib', hookRelative);
32
+ }
33
+ catch {
34
+ return path.resolve(import.meta.dirname, '../../hooks/post-tool-use.js');
35
+ }
36
+ }
37
+ function buildHookCommand(hookPath) {
38
+ const normalized = hookPath.replace(/\\/g, '\\\\');
39
+ return `node ${normalized}`;
21
40
  }
22
41
  function readSettings(settingsPath) {
23
42
  try {
@@ -37,6 +56,7 @@ export function setupCommand() {
37
56
  return new Command('setup')
38
57
  .description('One-command setup: configures MCP and starts the daemon')
39
58
  .option('--no-daemon', 'Skip starting the daemon')
59
+ .option('--no-hooks', 'Skip hook configuration')
40
60
  .option('--dry-run', 'Show what would be done without making changes')
41
61
  .action(async (opts) => {
42
62
  console.log(header('Marketing Brain Setup', icons.megaphone));
@@ -83,8 +103,73 @@ export function setupCommand() {
83
103
  settingsChanged = true;
84
104
  pass('Added MCP server entry', '"marketing-brain" -> marketing mcp-server');
85
105
  }
86
- // -- Step 3: Save Configuration --
87
- step(3, 'Save Configuration');
106
+ // -- Step 3: PostToolUse Hook --
107
+ const hookPath = resolveHookPath();
108
+ const hookCommand = buildHookCommand(hookPath);
109
+ step(3, 'Auto-Detect Hook');
110
+ if (opts.hooks === false) {
111
+ skip('Skipped hook configuration', '--no-hooks');
112
+ }
113
+ else {
114
+ let resolvedHookPath = hookPath;
115
+ const hookFileExists = fs.existsSync(hookPath);
116
+ if (!hookFileExists) {
117
+ const fallbackPath = path.resolve(import.meta.dirname, '../../hooks/post-tool-use.js');
118
+ if (fs.existsSync(fallbackPath)) {
119
+ resolvedHookPath = fallbackPath;
120
+ pass('Hook file found', fallbackPath);
121
+ }
122
+ else {
123
+ fail('Hook file not found', `Expected at: ${hookPath}`);
124
+ console.log(` ${c.dim('Make sure @timmeck/marketing-brain is installed globally: npm install -g @timmeck/marketing-brain')}`);
125
+ allGood = false;
126
+ }
127
+ }
128
+ else {
129
+ pass('Hook file found', hookPath);
130
+ }
131
+ // Dry-run: verify hook is executable
132
+ if (fs.existsSync(resolvedHookPath)) {
133
+ try {
134
+ execSync(`node "${resolvedHookPath}" --dry-run`, { timeout: 5000, stdio: 'pipe' });
135
+ pass('Hook dry-run passed', 'hook is executable');
136
+ }
137
+ catch {
138
+ fail('Hook dry-run failed', `"node ${resolvedHookPath} --dry-run" returned an error`);
139
+ console.log(` ${c.dim('The hook file exists but could not be executed. Check Node.js compatibility.')}`);
140
+ allGood = false;
141
+ }
142
+ }
143
+ if (!settings.hooks) {
144
+ settings.hooks = {};
145
+ }
146
+ const hooks = settings.hooks;
147
+ if (!hooks.PostToolUse) {
148
+ hooks.PostToolUse = [];
149
+ }
150
+ const postToolUse = hooks.PostToolUse;
151
+ const hasMarketingHook = postToolUse.some((h) => {
152
+ if (h.command?.includes('marketing') || h.command?.includes('post-tool-use'))
153
+ return true;
154
+ return h.hooks?.some((inner) => inner.command?.includes('marketing') || inner.command?.includes('post-tool-use'));
155
+ });
156
+ if (hasMarketingHook) {
157
+ pass('Auto-detect hook already configured');
158
+ }
159
+ else if (opts.dryRun) {
160
+ skip('Would add PostToolUse hook', hookCommand);
161
+ }
162
+ else {
163
+ postToolUse.push({
164
+ matcher: { tool_name: 'Bash' },
165
+ hooks: [{ command: hookCommand }],
166
+ });
167
+ settingsChanged = true;
168
+ pass('Added PostToolUse hook', 'auto-detects marketing events from Bash commands');
169
+ }
170
+ }
171
+ // -- Step 4: Save Configuration --
172
+ step(4, 'Save Configuration');
88
173
  if (settingsChanged && !opts.dryRun) {
89
174
  try {
90
175
  fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf8');
@@ -101,8 +186,8 @@ export function setupCommand() {
101
186
  else {
102
187
  pass('No changes needed', 'settings.json already up to date');
103
188
  }
104
- // -- Step 4: Start Daemon --
105
- step(4, 'Start Daemon');
189
+ // -- Step 5: Start Daemon --
190
+ step(5, 'Start Daemon');
106
191
  if (opts.daemon === false) {
107
192
  skip('Skipped daemon start', '--no-daemon');
108
193
  }
@@ -147,8 +232,8 @@ export function setupCommand() {
147
232
  }
148
233
  }
149
234
  }
150
- // -- Step 5: Health Check --
151
- step(5, 'Health Check');
235
+ // -- Step 6: Health Check --
236
+ step(6, 'Health Check');
152
237
  if (opts.dryRun) {
153
238
  skip('Would run health checks');
154
239
  }
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { IpcClient } from '../ipc/client.js';
1
+ import { IpcClient } from '@timmeck/brain-core';
2
2
  export declare function withIpc<T>(fn: (client: IpcClient) => Promise<T>): Promise<T>;
@@ -1,4 +1,4 @@
1
- import { IpcClient } from '../ipc/client.js';
1
+ import { IpcClient } from '@timmeck/brain-core';
2
2
  import { getPipeName } from '../utils/paths.js';
3
3
  import { c, icons } from './colors.js';
4
4
  export async function withIpc(fn) {
@@ -1 +1 @@
1
- {"version":3,"file":"ipc-helper.js","sourceRoot":"","sources":["../../src/cli/ipc-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,EAAqC;IACpE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,wCAAwC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACpI,CAAC;aAAM,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACxE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,2CAA2C,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;QAC/I,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"ipc-helper.js","sourceRoot":"","sources":["../../src/cli/ipc-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,EAAqC;IACpE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,wCAAwC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACpI,CAAC;aAAM,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACxE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,2CAA2C,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;QAC/I,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -1,15 +1,9 @@
1
- export interface DashboardServerOptions {
1
+ import { DashboardServer } from '@timmeck/brain-core';
2
+ export { DashboardServer };
3
+ export type { DashboardServerOptions } from '@timmeck/brain-core';
4
+ export declare const MARKETING_EVENT_NAMES: readonly ["post:created", "post:published", "engagement:updated", "strategy:reported", "rule:learned", "rule:triggered", "template:created", "campaign:created", "insight:created", "synapse:created", "synapse:strengthened"];
5
+ export declare function createMarketingDashboardServer(options: {
2
6
  port: number;
3
7
  getDashboardHtml: () => string;
4
8
  getStats: () => unknown;
5
- }
6
- export declare class DashboardServer {
7
- private options;
8
- private server;
9
- private clients;
10
- private logger;
11
- constructor(options: DashboardServerOptions);
12
- start(): void;
13
- stop(): void;
14
- private broadcast;
15
- }
9
+ }): DashboardServer;
@@ -1,122 +1,17 @@
1
- import http from 'node:http';
1
+ import { DashboardServer } from '@timmeck/brain-core';
2
2
  import { getEventBus } from '../utils/events.js';
3
- import { getLogger } from '../utils/logger.js';
4
- export class DashboardServer {
5
- options;
6
- server = null;
7
- clients = new Set();
8
- logger = getLogger();
9
- constructor(options) {
10
- this.options = options;
11
- }
12
- start() {
13
- const { port, getDashboardHtml, getStats } = this.options;
14
- const bus = getEventBus();
15
- this.server = http.createServer((req, res) => {
16
- const url = new URL(req.url ?? '/', `http://localhost:${port}`);
17
- // CORS
18
- res.setHeader('Access-Control-Allow-Origin', '*');
19
- res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
20
- if (req.method === 'OPTIONS') {
21
- res.writeHead(204);
22
- res.end();
23
- return;
24
- }
25
- if (url.pathname === '/events') {
26
- // SSE endpoint
27
- res.writeHead(200, {
28
- 'Content-Type': 'text/event-stream',
29
- 'Cache-Control': 'no-cache',
30
- 'Connection': 'keep-alive',
31
- });
32
- res.write('data: {"type":"connected"}\n\n');
33
- this.clients.add(res);
34
- req.on('close', () => this.clients.delete(res));
35
- return;
36
- }
37
- if (url.pathname === '/api/stats') {
38
- const stats = getStats();
39
- res.writeHead(200, { 'Content-Type': 'application/json' });
40
- res.end(JSON.stringify(stats));
41
- return;
42
- }
43
- if (url.pathname === '/' || url.pathname === '/dashboard') {
44
- const html = getDashboardHtml();
45
- // Inject SSE script into the dashboard
46
- const sseScript = `
47
- <script>
48
- (function(){
49
- const evtSource = new EventSource('/events');
50
- evtSource.onmessage = function(e) {
51
- try {
52
- const data = JSON.parse(e.data);
53
- if (data.type === 'stats_update') {
54
- document.querySelectorAll('.stat-number').forEach(el => {
55
- const key = el.parentElement?.querySelector('.stat-label')?.textContent?.toLowerCase();
56
- if (key && data.stats[key] !== undefined) {
57
- el.textContent = Number(data.stats[key]).toLocaleString();
58
- }
59
- });
60
- }
61
- if (data.type === 'event') {
62
- const dot = document.querySelector('.activity-dot');
63
- if (dot) { dot.style.background = '#ff5577'; setTimeout(() => dot.style.background = '', 500); }
64
- }
65
- } catch {}
66
- };
67
- evtSource.onerror = function() { setTimeout(() => location.reload(), 5000); };
68
- })();
69
- </script>`;
70
- const liveHtml = html.replace('</body>', sseScript + '</body>');
71
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
72
- res.end(liveHtml);
73
- return;
74
- }
75
- res.writeHead(404, { 'Content-Type': 'text/plain' });
76
- res.end('Not Found');
77
- });
78
- // Forward Marketing Brain events to SSE clients
79
- const eventNames = [
80
- 'post:created', 'post:published', 'engagement:updated',
81
- 'strategy:reported', 'rule:learned', 'rule:triggered',
82
- 'template:created', 'campaign:created',
83
- 'insight:created', 'synapse:created', 'synapse:strengthened',
84
- ];
85
- for (const eventName of eventNames) {
86
- bus.on(eventName, (data) => {
87
- this.broadcast({ type: 'event', event: eventName, data });
88
- });
89
- }
90
- // Periodic stats broadcast (every 30s)
91
- setInterval(() => {
92
- if (this.clients.size > 0) {
93
- const stats = getStats();
94
- this.broadcast({ type: 'stats_update', stats });
95
- }
96
- }, 30_000);
97
- this.server.listen(port, () => {
98
- this.logger.info(`Dashboard server started on http://localhost:${port}`);
99
- });
100
- }
101
- stop() {
102
- for (const client of this.clients) {
103
- client.end();
104
- }
105
- this.clients.clear();
106
- this.server?.close();
107
- this.server = null;
108
- this.logger.info('Dashboard server stopped');
109
- }
110
- broadcast(data) {
111
- const msg = `data: ${JSON.stringify(data)}\n\n`;
112
- for (const client of this.clients) {
113
- try {
114
- client.write(msg);
115
- }
116
- catch {
117
- this.clients.delete(client);
118
- }
119
- }
120
- }
3
+ export { DashboardServer };
4
+ export const MARKETING_EVENT_NAMES = [
5
+ 'post:created', 'post:published', 'engagement:updated',
6
+ 'strategy:reported', 'rule:learned', 'rule:triggered',
7
+ 'template:created', 'campaign:created',
8
+ 'insight:created', 'synapse:created', 'synapse:strengthened',
9
+ ];
10
+ export function createMarketingDashboardServer(options) {
11
+ return new DashboardServer({
12
+ ...options,
13
+ eventNames: MARKETING_EVENT_NAMES,
14
+ getEventBus: () => getEventBus(),
15
+ });
121
16
  }
122
17
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,CAAC;AAG3B,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,cAAc,EAAE,gBAAgB,EAAE,oBAAoB;IACtD,mBAAmB,EAAE,cAAc,EAAE,gBAAgB;IACrD,kBAAkB,EAAE,kBAAkB;IACtC,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB;CACpD,CAAC;AAEX,MAAM,UAAU,8BAA8B,CAAC,OAI9C;IACC,OAAO,IAAI,eAAe,CAAC;QACzB,GAAG,OAAO;QACV,UAAU,EAAE,qBAAqB;QACjC,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,EAAmE;KAClG,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type Database from 'better-sqlite3';
2
+ export declare function up(db: Database.Database): void;
@@ -0,0 +1,36 @@
1
+ export function up(db) {
2
+ db.exec(`
3
+ -- A/B Tests: Track content variant experiments
4
+ CREATE TABLE IF NOT EXISTS ab_tests (
5
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
6
+ name TEXT NOT NULL,
7
+ variant_a TEXT NOT NULL,
8
+ variant_b TEXT NOT NULL,
9
+ metric TEXT NOT NULL DEFAULT 'engagement',
10
+ status TEXT NOT NULL DEFAULT 'running',
11
+ winner TEXT,
12
+ a_samples INTEGER NOT NULL DEFAULT 0,
13
+ b_samples INTEGER NOT NULL DEFAULT 0,
14
+ a_metric_sum REAL NOT NULL DEFAULT 0,
15
+ b_metric_sum REAL NOT NULL DEFAULT 0,
16
+ significance REAL NOT NULL DEFAULT 0,
17
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
18
+ completed_at TEXT
19
+ );
20
+
21
+ -- A/B Test Data Points: Individual observations
22
+ CREATE TABLE IF NOT EXISTS ab_test_data (
23
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
24
+ test_id INTEGER NOT NULL,
25
+ variant TEXT NOT NULL,
26
+ metric_value REAL NOT NULL,
27
+ recorded_at TEXT NOT NULL DEFAULT (datetime('now')),
28
+ FOREIGN KEY (test_id) REFERENCES ab_tests(id) ON DELETE CASCADE
29
+ );
30
+
31
+ CREATE INDEX IF NOT EXISTS idx_ab_tests_status ON ab_tests(status);
32
+ CREATE INDEX IF NOT EXISTS idx_ab_test_data_test ON ab_test_data(test_id);
33
+ CREATE INDEX IF NOT EXISTS idx_ab_test_data_variant ON ab_test_data(test_id, variant);
34
+ `);
35
+ }
36
+ //# sourceMappingURL=008_ab_tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"008_ab_tests.js","sourceRoot":"","sources":["../../../src/db/migrations/008_ab_tests.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCP,CAAC,CAAC;AACL,CAAC"}
@@ -6,6 +6,7 @@ import { up as insightsSchema } from './004_insights_schema.js';
6
6
  import { up as ftsIndexes } from './005_fts_indexes.js';
7
7
  import { up as memorySchema } from './006_memory_schema.js';
8
8
  import { up as memoryFts } from './007_memory_fts.js';
9
+ import { up as abTestsSchema } from './008_ab_tests.js';
9
10
  const migrations = [
10
11
  { version: 1, name: '001_core_schema', up: coreSchema },
11
12
  { version: 2, name: '002_learning_schema', up: learningSchema },
@@ -14,6 +15,7 @@ const migrations = [
14
15
  { version: 5, name: '005_fts_indexes', up: ftsIndexes },
15
16
  { version: 6, name: '006_memory_schema', up: memorySchema },
16
17
  { version: 7, name: '007_memory_fts', up: memoryFts },
18
+ { version: 8, name: '008_ab_tests', up: abTestsSchema },
17
19
  ];
18
20
  function ensureMigrationsTable(db) {
19
21
  db.exec(`
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface ABTest {
3
+ id: number;
4
+ name: string;
5
+ variant_a: string;
6
+ variant_b: string;
7
+ metric: string;
8
+ status: 'running' | 'completed' | 'cancelled';
9
+ winner: 'a' | 'b' | 'tie' | null;
10
+ a_samples: number;
11
+ b_samples: number;
12
+ a_metric_sum: number;
13
+ b_metric_sum: number;
14
+ significance: number;
15
+ created_at: string;
16
+ completed_at: string | null;
17
+ }
18
+ export interface ABTestCreate {
19
+ name: string;
20
+ variant_a: string;
21
+ variant_b: string;
22
+ metric?: string;
23
+ }
24
+ export interface ABTestDataPoint {
25
+ id: number;
26
+ test_id: number;
27
+ variant: 'a' | 'b';
28
+ metric_value: number;
29
+ recorded_at: string;
30
+ }
31
+ export declare class ABTestRepository {
32
+ private db;
33
+ private stmts;
34
+ constructor(db: Database.Database);
35
+ create(data: ABTestCreate): number;
36
+ getById(id: number): ABTest | undefined;
37
+ listAll(limit?: number): ABTest[];
38
+ listByStatus(status: string, limit?: number): ABTest[];
39
+ recordDataPoint(testId: number, variant: 'a' | 'b', metricValue: number): number;
40
+ getDataPoints(testId: number): ABTestDataPoint[];
41
+ getDataByVariant(testId: number, variant: 'a' | 'b'): ABTestDataPoint[];
42
+ update(id: number, data: Partial<ABTest>): boolean;
43
+ countAll(): number;
44
+ delete(id: number): boolean;
45
+ }
@@ -0,0 +1,94 @@
1
+ export class ABTestRepository {
2
+ db;
3
+ stmts;
4
+ constructor(db) {
5
+ this.db = db;
6
+ this.stmts = {
7
+ create: db.prepare(`
8
+ INSERT INTO ab_tests (name, variant_a, variant_b, metric)
9
+ VALUES (@name, @variant_a, @variant_b, @metric)
10
+ `),
11
+ getById: db.prepare('SELECT * FROM ab_tests WHERE id = ?'),
12
+ listAll: db.prepare('SELECT * FROM ab_tests ORDER BY created_at DESC LIMIT ?'),
13
+ listByStatus: db.prepare('SELECT * FROM ab_tests WHERE status = ? ORDER BY created_at DESC LIMIT ?'),
14
+ recordData: db.prepare(`
15
+ INSERT INTO ab_test_data (test_id, variant, metric_value)
16
+ VALUES (@test_id, @variant, @metric_value)
17
+ `),
18
+ getDataPoints: db.prepare('SELECT * FROM ab_test_data WHERE test_id = ? ORDER BY recorded_at DESC'),
19
+ getDataByVariant: db.prepare('SELECT * FROM ab_test_data WHERE test_id = ? AND variant = ? ORDER BY recorded_at DESC'),
20
+ updateTest: db.prepare(`
21
+ UPDATE ab_tests SET
22
+ a_samples = @a_samples,
23
+ b_samples = @b_samples,
24
+ a_metric_sum = @a_metric_sum,
25
+ b_metric_sum = @b_metric_sum,
26
+ significance = @significance,
27
+ winner = @winner,
28
+ status = @status,
29
+ completed_at = @completed_at
30
+ WHERE id = @id
31
+ `),
32
+ countAll: db.prepare('SELECT COUNT(*) as count FROM ab_tests'),
33
+ delete: db.prepare('DELETE FROM ab_tests WHERE id = ?'),
34
+ };
35
+ }
36
+ create(data) {
37
+ const result = this.stmts.create.run({
38
+ name: data.name,
39
+ variant_a: data.variant_a,
40
+ variant_b: data.variant_b,
41
+ metric: data.metric ?? 'engagement',
42
+ });
43
+ return result.lastInsertRowid;
44
+ }
45
+ getById(id) {
46
+ return this.stmts.getById.get(id);
47
+ }
48
+ listAll(limit = 50) {
49
+ return this.stmts.listAll.all(limit);
50
+ }
51
+ listByStatus(status, limit = 50) {
52
+ return this.stmts.listByStatus.all(status, limit);
53
+ }
54
+ recordDataPoint(testId, variant, metricValue) {
55
+ const result = this.stmts.recordData.run({
56
+ test_id: testId,
57
+ variant,
58
+ metric_value: metricValue,
59
+ });
60
+ return result.lastInsertRowid;
61
+ }
62
+ getDataPoints(testId) {
63
+ return this.stmts.getDataPoints.all(testId);
64
+ }
65
+ getDataByVariant(testId, variant) {
66
+ return this.stmts.getDataByVariant.all(testId, variant);
67
+ }
68
+ update(id, data) {
69
+ const current = this.getById(id);
70
+ if (!current)
71
+ return false;
72
+ const result = this.stmts.updateTest.run({
73
+ id,
74
+ a_samples: data.a_samples ?? current.a_samples,
75
+ b_samples: data.b_samples ?? current.b_samples,
76
+ a_metric_sum: data.a_metric_sum ?? current.a_metric_sum,
77
+ b_metric_sum: data.b_metric_sum ?? current.b_metric_sum,
78
+ significance: data.significance ?? current.significance,
79
+ winner: data.winner ?? current.winner,
80
+ status: data.status ?? current.status,
81
+ completed_at: data.completed_at ?? current.completed_at,
82
+ });
83
+ return result.changes > 0;
84
+ }
85
+ countAll() {
86
+ const row = this.stmts.countAll.get();
87
+ return row.count;
88
+ }
89
+ delete(id) {
90
+ const result = this.stmts.delete.run(id);
91
+ return result.changes > 0;
92
+ }
93
+ }
94
+ //# sourceMappingURL=ab-test.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ab-test.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/ab-test.repository.ts"],"names":[],"mappings":"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"}