@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.
- package/README.md +8 -4
- package/dist/cli/commands/doctor.js +1 -1
- package/dist/cli/commands/setup.js +92 -7
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/ipc-helper.d.ts +1 -1
- package/dist/cli/ipc-helper.js +1 -1
- package/dist/cli/ipc-helper.js.map +1 -1
- package/dist/dashboard/server.d.ts +6 -12
- package/dist/dashboard/server.js +14 -119
- package/dist/dashboard/server.js.map +1 -1
- package/dist/db/migrations/008_ab_tests.d.ts +2 -0
- package/dist/db/migrations/008_ab_tests.js +36 -0
- package/dist/db/migrations/008_ab_tests.js.map +1 -0
- package/dist/db/migrations/index.js +2 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/repositories/ab-test.repository.d.ts +45 -0
- package/dist/db/repositories/ab-test.repository.js +94 -0
- package/dist/db/repositories/ab-test.repository.js.map +1 -0
- package/dist/db/repositories/post.repository.js +1 -1
- package/dist/embeddings/engine.d.ts +35 -0
- package/dist/embeddings/engine.js +162 -0
- package/dist/embeddings/engine.js.map +1 -0
- package/dist/hooks/post-tool-use.js +1 -1
- package/dist/hooks/post-tool-use.js.map +1 -1
- package/dist/ipc/router.d.ts +14 -1
- package/dist/ipc/router.js +72 -0
- package/dist/ipc/router.js.map +1 -1
- package/dist/learning/confidence-scorer.d.ts +0 -1
- package/dist/learning/confidence-scorer.js +0 -2
- package/dist/learning/confidence-scorer.js.map +1 -1
- package/dist/learning/learning-engine.js +2 -2
- package/dist/learning/learning-engine.js.map +1 -1
- package/dist/learning/pattern-extractor.d.ts +27 -0
- package/dist/learning/pattern-extractor.js +346 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/marketing-core.d.ts +2 -0
- package/dist/marketing-core.js +36 -6
- package/dist/marketing-core.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -1
- package/dist/mcp/tools.js +34 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/services/ab-test.service.d.ts +29 -0
- package/dist/services/ab-test.service.js +143 -0
- package/dist/services/ab-test.service.js.map +1 -0
- package/dist/services/calendar.service.d.ts +28 -0
- package/dist/services/calendar.service.js +211 -0
- package/dist/services/calendar.service.js.map +1 -0
- package/dist/services/post.service.js +1 -1
- package/dist/services/post.service.js.map +1 -1
- 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)
|
|
392
|
-
| [Trading Brain](https://github.com/timmeck/brain-ecosystem/tree/main/packages/trading-brain)
|
|
393
|
-
| **Marketing Brain**
|
|
394
|
-
| [Brain Core](https://github.com/timmeck/brain-ecosystem/tree/main/packages/brain-core)
|
|
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 '
|
|
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}/
|
|
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:
|
|
87
|
-
|
|
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
|
|
105
|
-
step(
|
|
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
|
|
151
|
-
step(
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,SAAS,IAAI,CAAC,KAAa,EAAE,MAAe;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,MAAe;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,MAAe;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,IAAI,CAAC,CAAS,EAAE,KAAa;IACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,YAAoB;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;SACjD,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,uBAAuB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE/J,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAE7B,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,+BAA+B;QAC/B,IAAI,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,SAAS,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAA4C,CAAC;QAEvF,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACzB,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAqC,CAAC;QAClE,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,4BAA4B,EAAE,2CAA2C,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,iBAAiB,CAAC,GAAG;gBAC9B,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE,CAAC,YAAY,CAAC;aACrB,CAAC;YACF,eAAe,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,wBAAwB,EAAE,2CAA2C,CAAC,CAAC;QAC9E,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC9B,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;gBACjF,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,8BAA8B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvF,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;YAC1C,IAAI,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mBAAmB,EAAE,kCAAkC,CAAC,CAAC;QAChE,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;YAC1D,IAAI,cAAc,GAAG,KAAK,CAAC;YAE3B,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACrB,cAAc,GAAG,IAAI,CAAC;oBACtB,IAAI,CAAC,wBAAwB,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;gBAC/C,CAAC;gBAAC,MAAM,CAAC;oBACP,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;oBACrD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;oBACvE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;wBAC5D,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,QAAQ;qBAChB,CAAC,CAAC;oBACH,KAAK,CAAC,KAAK,EAAE,CAAC;oBAEd,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;oBAE1D,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC3B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;wBACpD,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;oBACvC,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,wBAAwB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBACjF,OAAO,GAAG,KAAK,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;YACxD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU,EAAE,uCAAuC,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;YAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACrB,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,CAAC,sBAAsB,CAAC,CAAC;oBAC7B,OAAO,GAAG,KAAK,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;QAC5F,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,0BAA0B,CAAC,CAAC;YAChG,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;QAC9F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,yBAAyB,CAAC,CAAC;YACnG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,+BAA+B,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/ipc-helper.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { IpcClient } from '
|
|
1
|
+
import { IpcClient } from '@timmeck/brain-core';
|
|
2
2
|
export declare function withIpc<T>(fn: (client: IpcClient) => Promise<T>): Promise<T>;
|
package/dist/cli/ipc-helper.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc-helper.js","sourceRoot":"","sources":["../../src/cli/ipc-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
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
|
-
|
|
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;
|
package/dist/dashboard/server.js
CHANGED
|
@@ -1,122 +1,17 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { DashboardServer } from '@timmeck/brain-core';
|
|
2
2
|
import { getEventBus } from '../utils/events.js';
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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":"AAAA,OAAO,
|
|
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,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":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,EAAE,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
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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"}
|