@timmeck/marketing-brain 0.4.0 → 0.5.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 +20 -5
- package/dist/cli/colors.d.ts +1 -0
- package/dist/cli/colors.js +1 -0
- package/dist/cli/colors.js.map +1 -1
- package/dist/cli/commands/status.js +9 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/db/migrations/006_memory_schema.d.ts +2 -0
- package/dist/db/migrations/006_memory_schema.js +44 -0
- package/dist/db/migrations/006_memory_schema.js.map +1 -0
- package/dist/db/migrations/007_memory_fts.d.ts +2 -0
- package/dist/db/migrations/007_memory_fts.js +54 -0
- package/dist/db/migrations/007_memory_fts.js.map +1 -0
- package/dist/db/migrations/index.js +4 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/repositories/memory.repository.d.ts +26 -0
- package/dist/db/repositories/memory.repository.js +124 -0
- package/dist/db/repositories/memory.repository.js.map +1 -0
- package/dist/db/repositories/session.repository.d.ts +18 -0
- package/dist/db/repositories/session.repository.js +80 -0
- package/dist/db/repositories/session.repository.js.map +1 -0
- package/dist/ipc/router.d.ts +2 -0
- package/dist/ipc/router.js +13 -1
- package/dist/ipc/router.js.map +1 -1
- package/dist/marketing-core.js +8 -1
- package/dist/marketing-core.js.map +1 -1
- package/dist/mcp/tools.js +55 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/services/analytics.service.d.ts +15 -1
- package/dist/services/analytics.service.js +10 -1
- package/dist/services/analytics.service.js.map +1 -1
- package/dist/services/memory.service.d.ts +35 -0
- package/dist/services/memory.service.js +141 -0
- package/dist/services/memory.service.js.map +1 -0
- package/dist/types/memory.types.d.ts +1 -0
- package/dist/types/memory.types.js +2 -0
- package/dist/types/memory.types.js.map +1 -0
- package/dist/types/synapse.types.d.ts +2 -2
- package/dist/utils/events.d.ts +15 -0
- package/dist/utils/events.js.map +1 -1
- package/package.json +16 -5
- package/smithery.yaml +10 -0
package/README.md
CHANGED
|
@@ -54,12 +54,21 @@ Without Marketing Brain, your marketing knowledge lives in your head. With it:
|
|
|
54
54
|
- **Research Insights** — Tabbed view: Trends, Gaps, Synergies, Templates, Optimizations
|
|
55
55
|
- **Real-Time Updates** — SSE-powered live stats refresh every 30 seconds
|
|
56
56
|
|
|
57
|
-
###
|
|
57
|
+
### Never Forget — Memory & Sessions
|
|
58
|
+
- **Persistent Memory** — Store preferences, decisions, context, facts, goals, and lessons learned
|
|
59
|
+
- **Key-Based Upsert** — Update existing memories by unique key, auto-superseding old values
|
|
60
|
+
- **Full-Text Search** — Natural language recall with FTS5-powered search
|
|
61
|
+
- **Session Tracking** — Track conversation goals, summaries, and outcomes
|
|
62
|
+
- **Importance Scoring** — 1–10 importance scale with category-based organization
|
|
63
|
+
- **Synapse-Wired** — Memories and sessions connect to the Hebbian network via 'remembers' edges
|
|
64
|
+
|
|
65
|
+
### MCP Tools (22 tools for Claude Code)
|
|
58
66
|
- **Draft Checking** — Check a post against learned rules before publishing
|
|
59
67
|
- **Post Reporting** — Track published posts with one command
|
|
60
68
|
- **Engagement Updates** — Feed in likes, shares, impressions as they come
|
|
61
69
|
- **Strategy Memory** — Report what worked, get suggestions for what's next
|
|
62
70
|
- **Template Library** — Find and reuse high-performing post structures
|
|
71
|
+
- **Memory & Sessions** — Store and recall memories, track session goals and outcomes
|
|
63
72
|
- **Analytics** — Full dashboard data accessible from Claude Code
|
|
64
73
|
|
|
65
74
|
## Quick Start
|
|
@@ -198,6 +207,11 @@ These tools are available to Claude Code when Marketing Brain is configured:
|
|
|
198
207
|
| `marketing_analytics_best` | Top performing posts and strategies |
|
|
199
208
|
| `marketing_ecosystem_status` | Get status of all brains in the ecosystem |
|
|
200
209
|
| `marketing_query_peer` | Query another brain in the ecosystem (method + params) |
|
|
210
|
+
| `marketing_remember` | Store a memory (preference, decision, context, fact, goal, lesson) |
|
|
211
|
+
| `marketing_recall` | Search memories by natural language query |
|
|
212
|
+
| `marketing_session_start` | Start a session with optional goals |
|
|
213
|
+
| `marketing_session_end` | End a session with summary and outcome |
|
|
214
|
+
| `marketing_session_history` | List past sessions with summaries |
|
|
201
215
|
| `marketing_cross_promote` | Pull Brain insights as content ideas for cross-promotion |
|
|
202
216
|
| `marketing_trading_performance` | Pull Trading Brain stats for performance-related posts |
|
|
203
217
|
|
|
@@ -292,6 +306,7 @@ rule → post (prevents / recommends)
|
|
|
292
306
|
template → post (generated_from)
|
|
293
307
|
campaign → campaign (cross_promotes)
|
|
294
308
|
insight → campaign (informs)
|
|
309
|
+
session → memory (remembers)
|
|
295
310
|
```
|
|
296
311
|
|
|
297
312
|
## How It Learns
|
|
@@ -353,10 +368,10 @@ Marketing Brain is part of the **Brain Ecosystem** — a family of standalone MC
|
|
|
353
368
|
|
|
354
369
|
| Brain | Purpose | Ports |
|
|
355
370
|
|-------|---------|-------|
|
|
356
|
-
| [Brain](https://github.com/timmeck/brain) | Error memory
|
|
357
|
-
| [Trading Brain](https://github.com/timmeck/trading-brain) | Adaptive trading intelligence | 7779 / 7780 |
|
|
358
|
-
| **Marketing Brain** | Content strategy & engagement | **7781** / 7782 / 7783 |
|
|
359
|
-
| [Brain Core](https://github.com/timmeck/brain-core) v1.6.0 | Shared infrastructure (IPC, MCP, REST, CLI, math, synapses) | — |
|
|
371
|
+
| [Brain](https://github.com/timmeck/brain) v2.2.0 | Error memory, code intelligence & persistent context | 7777 / 7778 |
|
|
372
|
+
| [Trading Brain](https://github.com/timmeck/trading-brain) v1.3.0 | Adaptive trading intelligence with memory & sessions | 7779 / 7780 |
|
|
373
|
+
| **Marketing Brain** v0.5.0 | Content strategy & engagement with memory & sessions | **7781** / 7782 / 7783 |
|
|
374
|
+
| [Brain Core](https://github.com/timmeck/brain-core) v1.6.0 | Shared infrastructure (IPC, MCP, REST, CLI, math, synapses, memory) | — |
|
|
360
375
|
| [Brain Hub](https://timmeck.github.io/brain-hub/) | Ecosystem landing page | — |
|
|
361
376
|
|
|
362
377
|
Each brain is **fully standalone** — [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.
|
package/dist/cli/colors.d.ts
CHANGED
package/dist/cli/colors.js
CHANGED
package/dist/cli/colors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,SAAS;IACZ,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,SAAS;IACZ,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,IAAI;CACZ,CAAC"}
|
|
@@ -56,6 +56,15 @@ export function statusCommand() {
|
|
|
56
56
|
console.log();
|
|
57
57
|
console.log(` ${icons.insight} ${c.orange.bold('Research')}`);
|
|
58
58
|
console.log(` ${c.label('Insights:')} ${c.value(summary.insights?.active ?? 0)} active`);
|
|
59
|
+
console.log();
|
|
60
|
+
console.log(` ${icons.brain} ${c.purple.bold('Memory')}`);
|
|
61
|
+
console.log(` ${c.label('Memories:')} ${c.value(summary.memory?.active ?? 0)} active`);
|
|
62
|
+
console.log(` ${c.label('Sessions:')} ${c.value(summary.memory?.sessions ?? 0)}`);
|
|
63
|
+
const cats = summary.memory?.byCategory;
|
|
64
|
+
if (cats && Object.keys(cats).length > 0) {
|
|
65
|
+
const catStr = Object.entries(cats).map(([k, v]) => `${k}: ${v}`).join(', ');
|
|
66
|
+
console.log(` ${c.label('Categories:')} ${c.dim(catStr)}`);
|
|
67
|
+
}
|
|
59
68
|
console.log(`\n${divider()}`);
|
|
60
69
|
});
|
|
61
70
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function up(db) {
|
|
2
|
+
db.exec(`
|
|
3
|
+
-- Sessions: Conversation lifecycle tracking
|
|
4
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
5
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
6
|
+
session_id TEXT NOT NULL UNIQUE,
|
|
7
|
+
started_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
8
|
+
ended_at TEXT,
|
|
9
|
+
summary TEXT,
|
|
10
|
+
goals TEXT,
|
|
11
|
+
outcome TEXT,
|
|
12
|
+
metadata TEXT
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
-- Memories: Universal remember-anything store
|
|
16
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
17
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
18
|
+
session_id INTEGER,
|
|
19
|
+
category TEXT NOT NULL,
|
|
20
|
+
key TEXT,
|
|
21
|
+
content TEXT NOT NULL,
|
|
22
|
+
importance INTEGER NOT NULL DEFAULT 5,
|
|
23
|
+
source TEXT NOT NULL DEFAULT 'explicit',
|
|
24
|
+
tags TEXT,
|
|
25
|
+
expires_at TEXT,
|
|
26
|
+
superseded_by INTEGER,
|
|
27
|
+
active INTEGER NOT NULL DEFAULT 1,
|
|
28
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
29
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
30
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE SET NULL,
|
|
31
|
+
FOREIGN KEY (superseded_by) REFERENCES memories(id) ON DELETE SET NULL
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
-- Indexes
|
|
35
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_memories_key
|
|
36
|
+
ON memories(key) WHERE key IS NOT NULL AND active = 1;
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_memories_category ON memories(category);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_memories_session ON memories(session_id);
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(active);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_memories_importance ON memories(importance DESC);
|
|
42
|
+
`);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=006_memory_schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"006_memory_schema.js","sourceRoot":"","sources":["../../../src/db/migrations/006_memory_schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function up(db) {
|
|
2
|
+
db.exec(`
|
|
3
|
+
-- Full-text search for memories
|
|
4
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
5
|
+
category, key, content, tags,
|
|
6
|
+
content='memories',
|
|
7
|
+
content_rowid='id'
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
-- Sync triggers for memories_fts
|
|
11
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
12
|
+
INSERT INTO memories_fts(rowid, category, key, content, tags)
|
|
13
|
+
VALUES (new.id, new.category, new.key, new.content, new.tags);
|
|
14
|
+
END;
|
|
15
|
+
|
|
16
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
17
|
+
INSERT INTO memories_fts(memories_fts, rowid, category, key, content, tags)
|
|
18
|
+
VALUES ('delete', old.id, old.category, old.key, old.content, old.tags);
|
|
19
|
+
END;
|
|
20
|
+
|
|
21
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
22
|
+
INSERT INTO memories_fts(memories_fts, rowid, category, key, content, tags)
|
|
23
|
+
VALUES ('delete', old.id, old.category, old.key, old.content, old.tags);
|
|
24
|
+
INSERT INTO memories_fts(rowid, category, key, content, tags)
|
|
25
|
+
VALUES (new.id, new.category, new.key, new.content, new.tags);
|
|
26
|
+
END;
|
|
27
|
+
|
|
28
|
+
-- Full-text search for sessions
|
|
29
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS sessions_fts USING fts5(
|
|
30
|
+
summary, goals,
|
|
31
|
+
content='sessions',
|
|
32
|
+
content_rowid='id'
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
-- Sync triggers for sessions_fts
|
|
36
|
+
CREATE TRIGGER IF NOT EXISTS sessions_ai AFTER INSERT ON sessions BEGIN
|
|
37
|
+
INSERT INTO sessions_fts(rowid, summary, goals)
|
|
38
|
+
VALUES (new.id, new.summary, new.goals);
|
|
39
|
+
END;
|
|
40
|
+
|
|
41
|
+
CREATE TRIGGER IF NOT EXISTS sessions_ad AFTER DELETE ON sessions BEGIN
|
|
42
|
+
INSERT INTO sessions_fts(sessions_fts, rowid, summary, goals)
|
|
43
|
+
VALUES ('delete', old.id, old.summary, old.goals);
|
|
44
|
+
END;
|
|
45
|
+
|
|
46
|
+
CREATE TRIGGER IF NOT EXISTS sessions_au AFTER UPDATE ON sessions BEGIN
|
|
47
|
+
INSERT INTO sessions_fts(sessions_fts, rowid, summary, goals)
|
|
48
|
+
VALUES ('delete', old.id, old.summary, old.goals);
|
|
49
|
+
INSERT INTO sessions_fts(rowid, summary, goals)
|
|
50
|
+
VALUES (new.id, new.summary, new.goals);
|
|
51
|
+
END;
|
|
52
|
+
`);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=007_memory_fts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"007_memory_fts.js","sourceRoot":"","sources":["../../../src/db/migrations/007_memory_fts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -4,12 +4,16 @@ import { up as learningSchema } from './002_learning_schema.js';
|
|
|
4
4
|
import { up as synapseSchema } from './003_synapse_schema.js';
|
|
5
5
|
import { up as insightsSchema } from './004_insights_schema.js';
|
|
6
6
|
import { up as ftsIndexes } from './005_fts_indexes.js';
|
|
7
|
+
import { up as memorySchema } from './006_memory_schema.js';
|
|
8
|
+
import { up as memoryFts } from './007_memory_fts.js';
|
|
7
9
|
const migrations = [
|
|
8
10
|
{ version: 1, name: '001_core_schema', up: coreSchema },
|
|
9
11
|
{ version: 2, name: '002_learning_schema', up: learningSchema },
|
|
10
12
|
{ version: 3, name: '003_synapse_schema', up: synapseSchema },
|
|
11
13
|
{ version: 4, name: '004_insights_schema', up: insightsSchema },
|
|
12
14
|
{ version: 5, name: '005_fts_indexes', up: ftsIndexes },
|
|
15
|
+
{ version: 6, name: '006_memory_schema', up: memorySchema },
|
|
16
|
+
{ version: 7, name: '007_memory_fts', up: memoryFts },
|
|
13
17
|
];
|
|
14
18
|
function ensureMigrationsTable(db) {
|
|
15
19
|
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { MemoryRecord, MemoryCategory, MemoryRepoInterface } from '../../types/memory.types.js';
|
|
3
|
+
type CreateMemoryData = Omit<MemoryRecord, 'id' | 'created_at' | 'updated_at' | 'project_id' | 'embedding'>;
|
|
4
|
+
export declare class MemoryRepository implements MemoryRepoInterface {
|
|
5
|
+
private db;
|
|
6
|
+
private stmts;
|
|
7
|
+
constructor(db: Database.Database);
|
|
8
|
+
create(data: CreateMemoryData): number;
|
|
9
|
+
getById(id: number): MemoryRecord | undefined;
|
|
10
|
+
findByKey(_projectId: number | null, key: string): MemoryRecord | undefined;
|
|
11
|
+
findByCategory(category: MemoryCategory, _projectId?: number, limit?: number): MemoryRecord[];
|
|
12
|
+
findActive(_projectId?: number, limit?: number): MemoryRecord[];
|
|
13
|
+
search(query: string, limit?: number): MemoryRecord[];
|
|
14
|
+
supersede(oldId: number, newId: number): void;
|
|
15
|
+
deactivate(id: number): void;
|
|
16
|
+
expireOld(): number;
|
|
17
|
+
update(id: number, data: Partial<MemoryRecord>): void;
|
|
18
|
+
findBySession(sessionId: number): MemoryRecord[];
|
|
19
|
+
upsertByKey(key: string, content: string, category: MemoryCategory, importance?: number, source?: string, tags?: string[]): {
|
|
20
|
+
memoryId: number;
|
|
21
|
+
superseded?: number;
|
|
22
|
+
};
|
|
23
|
+
countActive(): number;
|
|
24
|
+
countByCategory(): Record<string, number>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export class MemoryRepository {
|
|
2
|
+
db;
|
|
3
|
+
stmts;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.stmts = {
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO memories (session_id, category, key, content, importance, source, tags, expires_at, superseded_by, active)
|
|
9
|
+
VALUES (@session_id, @category, @key, @content, @importance, @source, @tags, @expires_at, @superseded_by, @active)
|
|
10
|
+
`),
|
|
11
|
+
getById: this.db.prepare('SELECT * FROM memories WHERE id = ?'),
|
|
12
|
+
findByKey: this.db.prepare('SELECT * FROM memories WHERE key = ? AND active = 1'),
|
|
13
|
+
findByCategoryAll: this.db.prepare('SELECT * FROM memories WHERE category = ? AND active = 1 ORDER BY importance DESC LIMIT ?'),
|
|
14
|
+
findActiveAll: this.db.prepare('SELECT * FROM memories WHERE active = 1 ORDER BY updated_at DESC LIMIT ?'),
|
|
15
|
+
search: this.db.prepare(`
|
|
16
|
+
SELECT m.* FROM memories m
|
|
17
|
+
JOIN memories_fts ON m.id = memories_fts.rowid
|
|
18
|
+
WHERE memories_fts MATCH ? AND m.active = 1
|
|
19
|
+
ORDER BY rank
|
|
20
|
+
LIMIT ?
|
|
21
|
+
`),
|
|
22
|
+
supersede: this.db.prepare("UPDATE memories SET superseded_by = ?, active = 0, updated_at = datetime('now') WHERE id = ?"),
|
|
23
|
+
deactivate: this.db.prepare("UPDATE memories SET active = 0, updated_at = datetime('now') WHERE id = ?"),
|
|
24
|
+
expireOld: this.db.prepare("UPDATE memories SET active = 0 WHERE expires_at IS NOT NULL AND expires_at < datetime('now') AND active = 1"),
|
|
25
|
+
update: this.db.prepare(`
|
|
26
|
+
UPDATE memories
|
|
27
|
+
SET content = COALESCE(@content, content),
|
|
28
|
+
importance = COALESCE(@importance, importance),
|
|
29
|
+
tags = COALESCE(@tags, tags),
|
|
30
|
+
expires_at = COALESCE(@expires_at, expires_at),
|
|
31
|
+
updated_at = datetime('now')
|
|
32
|
+
WHERE id = @id
|
|
33
|
+
`),
|
|
34
|
+
findBySession: this.db.prepare('SELECT * FROM memories WHERE session_id = ? AND active = 1 ORDER BY created_at'),
|
|
35
|
+
countActive: this.db.prepare('SELECT COUNT(*) as count FROM memories WHERE active = 1'),
|
|
36
|
+
countByCategory: this.db.prepare('SELECT category, COUNT(*) as count FROM memories WHERE active = 1 GROUP BY category'),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
create(data) {
|
|
40
|
+
const result = this.stmts.create.run({
|
|
41
|
+
session_id: data.session_id ?? null,
|
|
42
|
+
category: data.category,
|
|
43
|
+
key: data.key ?? null,
|
|
44
|
+
content: data.content,
|
|
45
|
+
importance: data.importance ?? 5,
|
|
46
|
+
source: data.source ?? 'explicit',
|
|
47
|
+
tags: data.tags ?? null,
|
|
48
|
+
expires_at: data.expires_at ?? null,
|
|
49
|
+
superseded_by: data.superseded_by ?? null,
|
|
50
|
+
active: data.active ?? 1,
|
|
51
|
+
});
|
|
52
|
+
return result.lastInsertRowid;
|
|
53
|
+
}
|
|
54
|
+
getById(id) {
|
|
55
|
+
return this.stmts.getById.get(id);
|
|
56
|
+
}
|
|
57
|
+
findByKey(_projectId, key) {
|
|
58
|
+
return this.stmts.findByKey.get(key);
|
|
59
|
+
}
|
|
60
|
+
findByCategory(category, _projectId, limit = 50) {
|
|
61
|
+
return this.stmts.findByCategoryAll.all(category, limit);
|
|
62
|
+
}
|
|
63
|
+
findActive(_projectId, limit = 50) {
|
|
64
|
+
return this.stmts.findActiveAll.all(limit);
|
|
65
|
+
}
|
|
66
|
+
search(query, limit = 20) {
|
|
67
|
+
return this.stmts.search.all(query, limit);
|
|
68
|
+
}
|
|
69
|
+
supersede(oldId, newId) {
|
|
70
|
+
this.stmts.supersede.run(newId, oldId);
|
|
71
|
+
}
|
|
72
|
+
deactivate(id) {
|
|
73
|
+
this.stmts.deactivate.run(id);
|
|
74
|
+
}
|
|
75
|
+
expireOld() {
|
|
76
|
+
const result = this.stmts.expireOld.run();
|
|
77
|
+
return result.changes;
|
|
78
|
+
}
|
|
79
|
+
update(id, data) {
|
|
80
|
+
this.stmts.update.run({
|
|
81
|
+
id,
|
|
82
|
+
content: data.content ?? null,
|
|
83
|
+
importance: data.importance ?? null,
|
|
84
|
+
tags: data.tags ?? null,
|
|
85
|
+
expires_at: data.expires_at ?? null,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
findBySession(sessionId) {
|
|
89
|
+
return this.stmts.findBySession.all(sessionId);
|
|
90
|
+
}
|
|
91
|
+
upsertByKey(key, content, category, importance = 5, source = 'explicit', tags) {
|
|
92
|
+
const existing = this.findByKey(null, key);
|
|
93
|
+
const newId = this.create({
|
|
94
|
+
session_id: null,
|
|
95
|
+
category,
|
|
96
|
+
key,
|
|
97
|
+
content,
|
|
98
|
+
importance,
|
|
99
|
+
source: source,
|
|
100
|
+
tags: tags ? JSON.stringify(tags) : null,
|
|
101
|
+
expires_at: null,
|
|
102
|
+
superseded_by: null,
|
|
103
|
+
active: 1,
|
|
104
|
+
});
|
|
105
|
+
if (existing) {
|
|
106
|
+
this.supersede(existing.id, newId);
|
|
107
|
+
return { memoryId: newId, superseded: existing.id };
|
|
108
|
+
}
|
|
109
|
+
return { memoryId: newId };
|
|
110
|
+
}
|
|
111
|
+
countActive() {
|
|
112
|
+
const row = this.stmts.countActive.get();
|
|
113
|
+
return row.count;
|
|
114
|
+
}
|
|
115
|
+
countByCategory() {
|
|
116
|
+
const rows = this.stmts.countByCategory.all();
|
|
117
|
+
const result = {};
|
|
118
|
+
for (const row of rows) {
|
|
119
|
+
result[row.category] = row.count;
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=memory.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/memory.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { SessionRecord, SessionRepoInterface } from '../../types/memory.types.js';
|
|
3
|
+
type CreateSessionData = Omit<SessionRecord, 'id' | 'project_id' | 'embedding'>;
|
|
4
|
+
export declare class SessionRepository implements SessionRepoInterface {
|
|
5
|
+
private db;
|
|
6
|
+
private stmts;
|
|
7
|
+
constructor(db: Database.Database);
|
|
8
|
+
create(data: CreateSessionData): number;
|
|
9
|
+
getById(id: number): SessionRecord | undefined;
|
|
10
|
+
findBySessionId(sessionId: string): SessionRecord | undefined;
|
|
11
|
+
findByProject(_projectId: number, limit?: number): SessionRecord[];
|
|
12
|
+
findRecent(limit?: number): SessionRecord[];
|
|
13
|
+
update(id: number, data: Partial<SessionRecord>): void;
|
|
14
|
+
search(query: string, limit?: number): SessionRecord[];
|
|
15
|
+
countAll(): number;
|
|
16
|
+
findLast(): SessionRecord | undefined;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export class SessionRepository {
|
|
2
|
+
db;
|
|
3
|
+
stmts;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.stmts = {
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO sessions (session_id, started_at, ended_at, summary, goals, outcome, metadata)
|
|
9
|
+
VALUES (@session_id, @started_at, @ended_at, @summary, @goals, @outcome, @metadata)
|
|
10
|
+
`),
|
|
11
|
+
getById: this.db.prepare('SELECT * FROM sessions WHERE id = ?'),
|
|
12
|
+
findBySessionId: this.db.prepare('SELECT * FROM sessions WHERE session_id = ?'),
|
|
13
|
+
findRecent: this.db.prepare('SELECT * FROM sessions ORDER BY started_at DESC LIMIT ?'),
|
|
14
|
+
update: this.db.prepare(`
|
|
15
|
+
UPDATE sessions
|
|
16
|
+
SET summary = COALESCE(@summary, summary),
|
|
17
|
+
ended_at = COALESCE(@ended_at, ended_at),
|
|
18
|
+
outcome = COALESCE(@outcome, outcome),
|
|
19
|
+
goals = COALESCE(@goals, goals),
|
|
20
|
+
metadata = COALESCE(@metadata, metadata)
|
|
21
|
+
WHERE id = @id
|
|
22
|
+
`),
|
|
23
|
+
search: this.db.prepare(`
|
|
24
|
+
SELECT s.* FROM sessions s
|
|
25
|
+
JOIN sessions_fts ON s.id = sessions_fts.rowid
|
|
26
|
+
WHERE sessions_fts MATCH ?
|
|
27
|
+
ORDER BY rank
|
|
28
|
+
LIMIT ?
|
|
29
|
+
`),
|
|
30
|
+
countAll: this.db.prepare('SELECT COUNT(*) as count FROM sessions'),
|
|
31
|
+
findLast: this.db.prepare('SELECT * FROM sessions ORDER BY started_at DESC LIMIT 1'),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
create(data) {
|
|
35
|
+
const result = this.stmts.create.run({
|
|
36
|
+
session_id: data.session_id,
|
|
37
|
+
started_at: data.started_at ?? new Date().toISOString(),
|
|
38
|
+
ended_at: data.ended_at ?? null,
|
|
39
|
+
summary: data.summary ?? null,
|
|
40
|
+
goals: data.goals ?? null,
|
|
41
|
+
outcome: data.outcome ?? null,
|
|
42
|
+
metadata: data.metadata ?? null,
|
|
43
|
+
});
|
|
44
|
+
return result.lastInsertRowid;
|
|
45
|
+
}
|
|
46
|
+
getById(id) {
|
|
47
|
+
return this.stmts.getById.get(id);
|
|
48
|
+
}
|
|
49
|
+
findBySessionId(sessionId) {
|
|
50
|
+
return this.stmts.findBySessionId.get(sessionId);
|
|
51
|
+
}
|
|
52
|
+
findByProject(_projectId, limit = 20) {
|
|
53
|
+
// No project_id in marketing-brain — return all recent
|
|
54
|
+
return this.stmts.findRecent.all(limit);
|
|
55
|
+
}
|
|
56
|
+
findRecent(limit = 20) {
|
|
57
|
+
return this.stmts.findRecent.all(limit);
|
|
58
|
+
}
|
|
59
|
+
update(id, data) {
|
|
60
|
+
this.stmts.update.run({
|
|
61
|
+
id,
|
|
62
|
+
summary: data.summary ?? null,
|
|
63
|
+
ended_at: data.ended_at ?? null,
|
|
64
|
+
outcome: data.outcome ?? null,
|
|
65
|
+
goals: data.goals ?? null,
|
|
66
|
+
metadata: data.metadata ?? null,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
search(query, limit = 20) {
|
|
70
|
+
return this.stmts.search.all(query, limit);
|
|
71
|
+
}
|
|
72
|
+
countAll() {
|
|
73
|
+
const row = this.stmts.countAll.get();
|
|
74
|
+
return row.count;
|
|
75
|
+
}
|
|
76
|
+
findLast() {
|
|
77
|
+
return this.stmts.findLast.get();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=session.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/session.repository.ts"],"names":[],"mappings":"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"}
|
package/dist/ipc/router.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type { AudienceService } from '../services/audience.service.js';
|
|
|
7
7
|
import type { SynapseService } from '../services/synapse.service.js';
|
|
8
8
|
import type { AnalyticsService } from '../services/analytics.service.js';
|
|
9
9
|
import type { InsightService } from '../services/insight.service.js';
|
|
10
|
+
import type { MemoryService } from '../services/memory.service.js';
|
|
10
11
|
import type { LearningEngine } from '../learning/learning-engine.js';
|
|
11
12
|
import type { CrossBrainClient } from '@timmeck/brain-core';
|
|
12
13
|
export interface Services {
|
|
@@ -19,6 +20,7 @@ export interface Services {
|
|
|
19
20
|
synapse: SynapseService;
|
|
20
21
|
analytics: AnalyticsService;
|
|
21
22
|
insight: InsightService;
|
|
23
|
+
memory: MemoryService;
|
|
22
24
|
learning?: LearningEngine;
|
|
23
25
|
crossBrain?: CrossBrainClient;
|
|
24
26
|
}
|
package/dist/ipc/router.js
CHANGED
|
@@ -72,6 +72,18 @@ export class IpcRouter {
|
|
|
72
72
|
['synapse.related', (params) => s.synapse.getRelated(p(params))],
|
|
73
73
|
['synapse.stats', () => s.synapse.getNetworkStats()],
|
|
74
74
|
['synapse.strongest', (params) => s.synapse.getStrongest(p(params)?.limit)],
|
|
75
|
+
// Memory
|
|
76
|
+
['memory.remember', (params) => s.memory.remember(p(params))],
|
|
77
|
+
['memory.recall', (params) => s.memory.recall(p(params))],
|
|
78
|
+
['memory.forget', (params) => s.memory.forget(p(params).memoryId ?? p(params).memory_id)],
|
|
79
|
+
['memory.preferences', () => s.memory.getPreferences()],
|
|
80
|
+
['memory.decisions', () => s.memory.getDecisions()],
|
|
81
|
+
['memory.goals', () => s.memory.getGoals()],
|
|
82
|
+
['memory.lessons', () => s.memory.getLessons()],
|
|
83
|
+
['memory.stats', () => s.memory.getStats()],
|
|
84
|
+
['session.start', (params) => s.memory.startSession(p(params))],
|
|
85
|
+
['session.end', (params) => s.memory.endSession(p(params))],
|
|
86
|
+
['session.history', (params) => s.memory.getSessionHistory(p(params).limit)],
|
|
75
87
|
// Analytics
|
|
76
88
|
['analytics.summary', () => s.analytics.getSummary()],
|
|
77
89
|
['analytics.top', (params) => s.analytics.getTopPerformers(p(params)?.limit)],
|
|
@@ -107,7 +119,7 @@ export class IpcRouter {
|
|
|
107
119
|
// Status (cross-brain)
|
|
108
120
|
['status', () => ({
|
|
109
121
|
name: 'marketing-brain',
|
|
110
|
-
version: '0.
|
|
122
|
+
version: '0.5.0',
|
|
111
123
|
uptime: Math.floor(process.uptime()),
|
|
112
124
|
pid: process.pid,
|
|
113
125
|
methods: this.listMethods().length,
|
package/dist/ipc/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/ipc/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/ipc/router.ts"],"names":[],"mappings":"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"}
|