reflectt-node 0.1.8 → 0.1.12

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 (167) hide show
  1. package/defaults/TEAM-ROLES.yaml +317 -5
  2. package/dist/agent-config.d.ts +51 -0
  3. package/dist/agent-config.d.ts.map +1 -0
  4. package/dist/agent-config.js +129 -0
  5. package/dist/agent-config.js.map +1 -0
  6. package/dist/agent-config.test.d.ts +2 -0
  7. package/dist/agent-config.test.d.ts.map +1 -0
  8. package/dist/agent-config.test.js +91 -0
  9. package/dist/agent-config.test.js.map +1 -0
  10. package/dist/agent-memories.d.ts +58 -0
  11. package/dist/agent-memories.d.ts.map +1 -0
  12. package/dist/agent-memories.js +168 -0
  13. package/dist/agent-memories.js.map +1 -0
  14. package/dist/agent-memories.test.d.ts +2 -0
  15. package/dist/agent-memories.test.d.ts.map +1 -0
  16. package/dist/agent-memories.test.js +327 -0
  17. package/dist/agent-memories.test.js.map +1 -0
  18. package/dist/agent-messaging.d.ts +50 -0
  19. package/dist/agent-messaging.d.ts.map +1 -0
  20. package/dist/agent-messaging.js +103 -0
  21. package/dist/agent-messaging.js.map +1 -0
  22. package/dist/agent-messaging.test.d.ts +2 -0
  23. package/dist/agent-messaging.test.d.ts.map +1 -0
  24. package/dist/agent-messaging.test.js +105 -0
  25. package/dist/agent-messaging.test.js.map +1 -0
  26. package/dist/agent-runs.d.ts +158 -0
  27. package/dist/agent-runs.d.ts.map +1 -0
  28. package/dist/agent-runs.js +514 -0
  29. package/dist/agent-runs.js.map +1 -0
  30. package/dist/agent-runs.test.d.ts +2 -0
  31. package/dist/agent-runs.test.d.ts.map +1 -0
  32. package/dist/agent-runs.test.js +386 -0
  33. package/dist/agent-runs.test.js.map +1 -0
  34. package/dist/approval-queue.test.d.ts +2 -0
  35. package/dist/approval-queue.test.d.ts.map +1 -0
  36. package/dist/approval-queue.test.js +118 -0
  37. package/dist/approval-queue.test.js.map +1 -0
  38. package/dist/artifact-store.d.ts +55 -0
  39. package/dist/artifact-store.d.ts.map +1 -0
  40. package/dist/artifact-store.js +128 -0
  41. package/dist/artifact-store.js.map +1 -0
  42. package/dist/artifact-store.test.d.ts +2 -0
  43. package/dist/artifact-store.test.d.ts.map +1 -0
  44. package/dist/artifact-store.test.js +119 -0
  45. package/dist/artifact-store.test.js.map +1 -0
  46. package/dist/boardHealthWorker.d.ts +28 -0
  47. package/dist/boardHealthWorker.d.ts.map +1 -1
  48. package/dist/boardHealthWorker.js +33 -1
  49. package/dist/boardHealthWorker.js.map +1 -1
  50. package/dist/canvas-input.test.d.ts +2 -0
  51. package/dist/canvas-input.test.d.ts.map +1 -0
  52. package/dist/canvas-input.test.js +96 -0
  53. package/dist/canvas-input.test.js.map +1 -0
  54. package/dist/canvas-render.test.d.ts +2 -0
  55. package/dist/canvas-render.test.d.ts.map +1 -0
  56. package/dist/canvas-render.test.js +95 -0
  57. package/dist/canvas-render.test.js.map +1 -0
  58. package/dist/capabilities/browser.d.ts +75 -0
  59. package/dist/capabilities/browser.d.ts.map +1 -0
  60. package/dist/capabilities/browser.js +172 -0
  61. package/dist/capabilities/browser.js.map +1 -0
  62. package/dist/channels.d.ts +1 -1
  63. package/dist/cli.js +4 -2
  64. package/dist/cli.js.map +1 -1
  65. package/dist/cloud.d.ts +2 -0
  66. package/dist/cloud.d.ts.map +1 -1
  67. package/dist/cloud.js +135 -3
  68. package/dist/cloud.js.map +1 -1
  69. package/dist/cost-enforcement.d.ts +38 -0
  70. package/dist/cost-enforcement.d.ts.map +1 -0
  71. package/dist/cost-enforcement.js +84 -0
  72. package/dist/cost-enforcement.js.map +1 -0
  73. package/dist/dashboard.d.ts.map +1 -1
  74. package/dist/dashboard.js +8 -0
  75. package/dist/dashboard.js.map +1 -1
  76. package/dist/db.d.ts.map +1 -1
  77. package/dist/db.js +131 -0
  78. package/dist/db.js.map +1 -1
  79. package/dist/e2e-loop-proof.test.d.ts +2 -0
  80. package/dist/e2e-loop-proof.test.d.ts.map +1 -0
  81. package/dist/e2e-loop-proof.test.js +104 -0
  82. package/dist/e2e-loop-proof.test.js.map +1 -0
  83. package/dist/email-sms-send.test.d.ts +2 -0
  84. package/dist/email-sms-send.test.d.ts.map +1 -0
  85. package/dist/email-sms-send.test.js +96 -0
  86. package/dist/email-sms-send.test.js.map +1 -0
  87. package/dist/events.d.ts +1 -1
  88. package/dist/events.d.ts.map +1 -1
  89. package/dist/events.js +2 -0
  90. package/dist/events.js.map +1 -1
  91. package/dist/fingerprint.d.ts.map +1 -1
  92. package/dist/fingerprint.js +5 -10
  93. package/dist/fingerprint.js.map +1 -1
  94. package/dist/github-webhook-chat.d.ts +75 -0
  95. package/dist/github-webhook-chat.d.ts.map +1 -0
  96. package/dist/github-webhook-chat.js +108 -0
  97. package/dist/github-webhook-chat.js.map +1 -0
  98. package/dist/handoff-state.test.d.ts +2 -0
  99. package/dist/handoff-state.test.d.ts.map +1 -0
  100. package/dist/handoff-state.test.js +102 -0
  101. package/dist/handoff-state.test.js.map +1 -0
  102. package/dist/health.d.ts +9 -0
  103. package/dist/health.d.ts.map +1 -1
  104. package/dist/health.js +18 -0
  105. package/dist/health.js.map +1 -1
  106. package/dist/host-error-correlation.d.ts +65 -0
  107. package/dist/host-error-correlation.d.ts.map +1 -0
  108. package/dist/host-error-correlation.js +123 -0
  109. package/dist/host-error-correlation.js.map +1 -0
  110. package/dist/index.js +39 -10
  111. package/dist/index.js.map +1 -1
  112. package/dist/notificationDedupeGuard.d.ts +4 -0
  113. package/dist/notificationDedupeGuard.d.ts.map +1 -1
  114. package/dist/notificationDedupeGuard.js +8 -4
  115. package/dist/notificationDedupeGuard.js.map +1 -1
  116. package/dist/presence.d.ts +37 -5
  117. package/dist/presence.d.ts.map +1 -1
  118. package/dist/presence.js +127 -16
  119. package/dist/presence.js.map +1 -1
  120. package/dist/review-sla.d.ts +9 -0
  121. package/dist/review-sla.d.ts.map +1 -0
  122. package/dist/review-sla.js +51 -0
  123. package/dist/review-sla.js.map +1 -0
  124. package/dist/routing-enforcement.test.d.ts +2 -0
  125. package/dist/routing-enforcement.test.d.ts.map +1 -0
  126. package/dist/routing-enforcement.test.js +86 -0
  127. package/dist/routing-enforcement.test.js.map +1 -0
  128. package/dist/run-retention.test.d.ts +2 -0
  129. package/dist/run-retention.test.d.ts.map +1 -0
  130. package/dist/run-retention.test.js +57 -0
  131. package/dist/run-retention.test.js.map +1 -0
  132. package/dist/run-stream.test.d.ts +2 -0
  133. package/dist/run-stream.test.d.ts.map +1 -0
  134. package/dist/run-stream.test.js +70 -0
  135. package/dist/run-stream.test.js.map +1 -0
  136. package/dist/server.d.ts.map +1 -1
  137. package/dist/server.js +1301 -75
  138. package/dist/server.js.map +1 -1
  139. package/dist/tasks.d.ts.map +1 -1
  140. package/dist/tasks.js +45 -0
  141. package/dist/tasks.js.map +1 -1
  142. package/dist/todoHoardingGuard.d.ts +17 -0
  143. package/dist/todoHoardingGuard.d.ts.map +1 -1
  144. package/dist/todoHoardingGuard.js +25 -2
  145. package/dist/todoHoardingGuard.js.map +1 -1
  146. package/dist/webhook-storage.d.ts +50 -0
  147. package/dist/webhook-storage.d.ts.map +1 -0
  148. package/dist/webhook-storage.js +102 -0
  149. package/dist/webhook-storage.js.map +1 -0
  150. package/dist/webhook-storage.test.d.ts +2 -0
  151. package/dist/webhook-storage.test.d.ts.map +1 -0
  152. package/dist/webhook-storage.test.js +86 -0
  153. package/dist/webhook-storage.test.js.map +1 -0
  154. package/dist/workflow-templates.d.ts +44 -0
  155. package/dist/workflow-templates.d.ts.map +1 -0
  156. package/dist/workflow-templates.js +154 -0
  157. package/dist/workflow-templates.js.map +1 -0
  158. package/dist/workflow-templates.test.d.ts +2 -0
  159. package/dist/workflow-templates.test.d.ts.map +1 -0
  160. package/dist/workflow-templates.test.js +76 -0
  161. package/dist/workflow-templates.test.js.map +1 -0
  162. package/package.json +3 -1
  163. package/public/dashboard.js +76 -1
  164. package/public/design-tokens-platform.md +118 -0
  165. package/public/design-tokens.css +195 -0
  166. package/public/docs.md +131 -2
  167. package/public/presence-loop-demo.html +473 -0
@@ -0,0 +1,58 @@
1
+ export interface AgentMemory {
2
+ id: string;
3
+ agentId: string;
4
+ namespace: string;
5
+ key: string;
6
+ content: string;
7
+ tags: string[];
8
+ expiresAt: number | null;
9
+ createdAt: number;
10
+ updatedAt: number;
11
+ }
12
+ /**
13
+ * Store or upsert a memory. If agentId + namespace + key exists, it updates.
14
+ */
15
+ export declare function setMemory(opts: {
16
+ agentId: string;
17
+ namespace?: string;
18
+ key: string;
19
+ content: string;
20
+ tags?: string[];
21
+ expiresAt?: number | null;
22
+ }): AgentMemory;
23
+ /**
24
+ * Get a specific memory by agentId + namespace + key.
25
+ */
26
+ export declare function getMemory(agentId: string, key: string, namespace?: string): AgentMemory | null;
27
+ /**
28
+ * Get a memory by its ID.
29
+ */
30
+ export declare function getMemoryById(id: string): AgentMemory | null;
31
+ /**
32
+ * List memories for an agent with optional filters.
33
+ */
34
+ export declare function listMemories(opts: {
35
+ agentId: string;
36
+ namespace?: string;
37
+ tag?: string;
38
+ search?: string;
39
+ limit?: number;
40
+ includeExpired?: boolean;
41
+ }): AgentMemory[];
42
+ /**
43
+ * Delete a specific memory.
44
+ */
45
+ export declare function deleteMemory(agentId: string, key: string, namespace?: string): boolean;
46
+ /**
47
+ * Delete a memory by ID.
48
+ */
49
+ export declare function deleteMemoryById(id: string): boolean;
50
+ /**
51
+ * Purge all expired memories (housekeeping).
52
+ */
53
+ export declare function purgeExpiredMemories(): number;
54
+ /**
55
+ * Count memories for an agent.
56
+ */
57
+ export declare function countMemories(agentId: string, namespace?: string): number;
58
+ //# sourceMappingURL=agent-memories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-memories.d.ts","sourceRoot":"","sources":["../src/agent-memories.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAsCD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B,GAAG,WAAW,CAuCd;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAa9F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAS5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,GAAG,WAAW,EAAE,CAiChB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAOtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAIpD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAYzE"}
@@ -0,0 +1,168 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) Reflectt AI
3
+ /**
4
+ * Agent Memories — Persistent key-value store with tags and expiration.
5
+ *
6
+ * Survives node restarts (SQLite-backed, WAL mode).
7
+ * Supports:
8
+ * - Scoped per agent + namespace
9
+ * - Tag-based filtering (JSONB tags column)
10
+ * - TTL via expires_at
11
+ * - Keyword search on key + content
12
+ *
13
+ * Task: task-1773246466959-qxwos0ffp
14
+ */
15
+ import { getDb, safeJsonParse } from './db.js';
16
+ // ── ID generation ──────────────────────────────────────────────────────────
17
+ function generateMemoryId() {
18
+ return `amem-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
19
+ }
20
+ function rowToMemory(row) {
21
+ return {
22
+ id: row.id,
23
+ agentId: row.agent_id,
24
+ namespace: row.namespace,
25
+ key: row.key,
26
+ content: row.content,
27
+ tags: safeJsonParse(row.tags) ?? [],
28
+ expiresAt: row.expires_at,
29
+ createdAt: row.created_at,
30
+ updatedAt: row.updated_at,
31
+ };
32
+ }
33
+ // ── CRUD ───────────────────────────────────────────────────────────────────
34
+ /**
35
+ * Store or upsert a memory. If agentId + namespace + key exists, it updates.
36
+ */
37
+ export function setMemory(opts) {
38
+ const db = getDb();
39
+ const now = Date.now();
40
+ const namespace = opts.namespace ?? 'default';
41
+ const tags = opts.tags ?? [];
42
+ const expiresAt = opts.expiresAt ?? null;
43
+ // Check for existing
44
+ const existing = db.prepare('SELECT id FROM agent_memories WHERE agent_id = ? AND namespace = ? AND key = ?').get(opts.agentId, namespace, opts.key);
45
+ if (existing) {
46
+ db.prepare(`
47
+ UPDATE agent_memories SET content = ?, tags = ?, expires_at = ?, updated_at = ?
48
+ WHERE id = ?
49
+ `).run(opts.content, JSON.stringify(tags), expiresAt, now, existing.id);
50
+ const row = db.prepare('SELECT * FROM agent_memories WHERE id = ?').get(existing.id);
51
+ return rowToMemory(row);
52
+ }
53
+ const id = generateMemoryId();
54
+ db.prepare(`
55
+ INSERT INTO agent_memories (id, agent_id, namespace, key, content, tags, expires_at, created_at, updated_at)
56
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
57
+ `).run(id, opts.agentId, namespace, opts.key, opts.content, JSON.stringify(tags), expiresAt, now, now);
58
+ return {
59
+ id,
60
+ agentId: opts.agentId,
61
+ namespace,
62
+ key: opts.key,
63
+ content: opts.content,
64
+ tags,
65
+ expiresAt,
66
+ createdAt: now,
67
+ updatedAt: now,
68
+ };
69
+ }
70
+ /**
71
+ * Get a specific memory by agentId + namespace + key.
72
+ */
73
+ export function getMemory(agentId, key, namespace) {
74
+ const db = getDb();
75
+ const ns = namespace ?? 'default';
76
+ const row = db.prepare('SELECT * FROM agent_memories WHERE agent_id = ? AND namespace = ? AND key = ?').get(agentId, ns, key);
77
+ if (!row)
78
+ return null;
79
+ // Check expiration
80
+ if (row.expires_at && row.expires_at <= Date.now()) {
81
+ db.prepare('DELETE FROM agent_memories WHERE id = ?').run(row.id);
82
+ return null;
83
+ }
84
+ return rowToMemory(row);
85
+ }
86
+ /**
87
+ * Get a memory by its ID.
88
+ */
89
+ export function getMemoryById(id) {
90
+ const db = getDb();
91
+ const row = db.prepare('SELECT * FROM agent_memories WHERE id = ?').get(id);
92
+ if (!row)
93
+ return null;
94
+ if (row.expires_at && row.expires_at <= Date.now()) {
95
+ db.prepare('DELETE FROM agent_memories WHERE id = ?').run(row.id);
96
+ return null;
97
+ }
98
+ return rowToMemory(row);
99
+ }
100
+ /**
101
+ * List memories for an agent with optional filters.
102
+ */
103
+ export function listMemories(opts) {
104
+ const db = getDb();
105
+ const limit = opts.limit ?? 100;
106
+ const conditions = ['agent_id = ?'];
107
+ const params = [opts.agentId];
108
+ if (opts.namespace) {
109
+ conditions.push('namespace = ?');
110
+ params.push(opts.namespace);
111
+ }
112
+ if (!opts.includeExpired) {
113
+ conditions.push('(expires_at IS NULL OR expires_at > ?)');
114
+ params.push(Date.now());
115
+ }
116
+ if (opts.tag) {
117
+ // SQLite JSON — check if tag array contains the value
118
+ conditions.push("EXISTS (SELECT 1 FROM json_each(tags) WHERE json_each.value = ?)");
119
+ params.push(opts.tag);
120
+ }
121
+ if (opts.search) {
122
+ conditions.push('(key LIKE ? OR content LIKE ?)');
123
+ const pattern = `%${opts.search}%`;
124
+ params.push(pattern, pattern);
125
+ }
126
+ const sql = `SELECT * FROM agent_memories WHERE ${conditions.join(' AND ')} ORDER BY updated_at DESC LIMIT ?`;
127
+ params.push(limit);
128
+ const rows = db.prepare(sql).all(...params);
129
+ return rows.map(rowToMemory);
130
+ }
131
+ /**
132
+ * Delete a specific memory.
133
+ */
134
+ export function deleteMemory(agentId, key, namespace) {
135
+ const db = getDb();
136
+ const ns = namespace ?? 'default';
137
+ const result = db.prepare('DELETE FROM agent_memories WHERE agent_id = ? AND namespace = ? AND key = ?').run(agentId, ns, key);
138
+ return result.changes > 0;
139
+ }
140
+ /**
141
+ * Delete a memory by ID.
142
+ */
143
+ export function deleteMemoryById(id) {
144
+ const db = getDb();
145
+ const result = db.prepare('DELETE FROM agent_memories WHERE id = ?').run(id);
146
+ return result.changes > 0;
147
+ }
148
+ /**
149
+ * Purge all expired memories (housekeeping).
150
+ */
151
+ export function purgeExpiredMemories() {
152
+ const db = getDb();
153
+ const result = db.prepare('DELETE FROM agent_memories WHERE expires_at IS NOT NULL AND expires_at <= ?').run(Date.now());
154
+ return result.changes;
155
+ }
156
+ /**
157
+ * Count memories for an agent.
158
+ */
159
+ export function countMemories(agentId, namespace) {
160
+ const db = getDb();
161
+ if (namespace) {
162
+ const row = db.prepare('SELECT COUNT(*) as count FROM agent_memories WHERE agent_id = ? AND namespace = ?').get(agentId, namespace);
163
+ return row.count;
164
+ }
165
+ const row = db.prepare('SELECT COUNT(*) as count FROM agent_memories WHERE agent_id = ?').get(agentId);
166
+ return row.count;
167
+ }
168
+ //# sourceMappingURL=agent-memories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-memories.js","sourceRoot":"","sources":["../src/agent-memories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-memories.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-memories.test.d.ts","sourceRoot":"","sources":["../src/agent-memories.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,327 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { describe, it, beforeEach } from 'node:test';
3
+ import assert from 'node:assert/strict';
4
+ import Database from 'better-sqlite3';
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import os from 'node:os';
8
+ // ── Test helpers — bootstrap in-memory DB with migration v22 ────────────
9
+ let testDb;
10
+ function setupTestDb() {
11
+ testDb = new Database(':memory:');
12
+ testDb.pragma('journal_mode = WAL');
13
+ testDb.exec(`
14
+ CREATE TABLE IF NOT EXISTS agent_memories (
15
+ id TEXT PRIMARY KEY,
16
+ agent_id TEXT NOT NULL,
17
+ namespace TEXT NOT NULL DEFAULT 'default',
18
+ key TEXT NOT NULL,
19
+ content TEXT NOT NULL,
20
+ tags TEXT NOT NULL DEFAULT '[]',
21
+ expires_at INTEGER,
22
+ created_at INTEGER NOT NULL,
23
+ updated_at INTEGER NOT NULL
24
+ );
25
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_memories_unique ON agent_memories(agent_id, namespace, key);
26
+ CREATE INDEX IF NOT EXISTS idx_agent_memories_agent ON agent_memories(agent_id, namespace, updated_at);
27
+ CREATE INDEX IF NOT EXISTS idx_agent_memories_expires ON agent_memories(expires_at) WHERE expires_at IS NOT NULL;
28
+ `);
29
+ }
30
+ // We test through the module, but need to intercept getDb.
31
+ // Approach: test the SQL patterns directly against the in-memory DB,
32
+ // mirroring the module's logic exactly.
33
+ function setMemory(opts) {
34
+ const now = Date.now();
35
+ const namespace = opts.namespace ?? 'default';
36
+ const tags = opts.tags ?? [];
37
+ const expiresAt = opts.expiresAt ?? null;
38
+ const existing = testDb.prepare('SELECT id FROM agent_memories WHERE agent_id = ? AND namespace = ? AND key = ?').get(opts.agentId, namespace, opts.key);
39
+ if (existing) {
40
+ testDb.prepare(`
41
+ UPDATE agent_memories SET content = ?, tags = ?, expires_at = ?, updated_at = ?
42
+ WHERE id = ?
43
+ `).run(opts.content, JSON.stringify(tags), expiresAt, now, existing.id);
44
+ return testDb.prepare('SELECT * FROM agent_memories WHERE id = ?').get(existing.id);
45
+ }
46
+ const id = `amem-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
47
+ testDb.prepare(`
48
+ INSERT INTO agent_memories (id, agent_id, namespace, key, content, tags, expires_at, created_at, updated_at)
49
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
50
+ `).run(id, opts.agentId, namespace, opts.key, opts.content, JSON.stringify(tags), expiresAt, now, now);
51
+ return testDb.prepare('SELECT * FROM agent_memories WHERE id = ?').get(id);
52
+ }
53
+ function getMemory(agentId, key, namespace) {
54
+ const ns = namespace ?? 'default';
55
+ const row = testDb.prepare('SELECT * FROM agent_memories WHERE agent_id = ? AND namespace = ? AND key = ?').get(agentId, ns, key);
56
+ if (!row)
57
+ return null;
58
+ if (row.expires_at && row.expires_at <= Date.now()) {
59
+ testDb.prepare('DELETE FROM agent_memories WHERE id = ?').run(row.id);
60
+ return null;
61
+ }
62
+ return row;
63
+ }
64
+ function listMemories(opts) {
65
+ const limit = opts.limit ?? 100;
66
+ const conditions = ['agent_id = ?'];
67
+ const params = [opts.agentId];
68
+ if (opts.namespace) {
69
+ conditions.push('namespace = ?');
70
+ params.push(opts.namespace);
71
+ }
72
+ if (!opts.includeExpired) {
73
+ conditions.push('(expires_at IS NULL OR expires_at > ?)');
74
+ params.push(Date.now());
75
+ }
76
+ if (opts.tag) {
77
+ conditions.push("EXISTS (SELECT 1 FROM json_each(tags) WHERE json_each.value = ?)");
78
+ params.push(opts.tag);
79
+ }
80
+ if (opts.search) {
81
+ conditions.push('(key LIKE ? OR content LIKE ?)');
82
+ const pattern = `%${opts.search}%`;
83
+ params.push(pattern, pattern);
84
+ }
85
+ const sql = `SELECT * FROM agent_memories WHERE ${conditions.join(' AND ')} ORDER BY updated_at DESC LIMIT ?`;
86
+ params.push(limit);
87
+ return testDb.prepare(sql).all(...params);
88
+ }
89
+ function deleteMemory(agentId, key, namespace) {
90
+ const ns = namespace ?? 'default';
91
+ const result = testDb.prepare('DELETE FROM agent_memories WHERE agent_id = ? AND namespace = ? AND key = ?').run(agentId, ns, key);
92
+ return result.changes > 0;
93
+ }
94
+ function countMemories(agentId, namespace) {
95
+ if (namespace) {
96
+ const row = testDb.prepare('SELECT COUNT(*) as count FROM agent_memories WHERE agent_id = ? AND namespace = ?').get(agentId, namespace);
97
+ return row.count;
98
+ }
99
+ return testDb.prepare('SELECT COUNT(*) as count FROM agent_memories WHERE agent_id = ?').get(agentId).count;
100
+ }
101
+ function purgeExpired() {
102
+ const result = testDb.prepare('DELETE FROM agent_memories WHERE expires_at IS NOT NULL AND expires_at <= ?').run(Date.now());
103
+ return result.changes;
104
+ }
105
+ // ── Tests ──────────────────────────────────────────────────────────────────
106
+ describe('Agent Memories', () => {
107
+ beforeEach(() => {
108
+ setupTestDb();
109
+ });
110
+ describe('basic CRUD', () => {
111
+ it('stores and retrieves a memory', () => {
112
+ const mem = setMemory({ agentId: 'link', key: 'last-task', content: 'coverage push' });
113
+ assert.ok(mem.id.startsWith('amem-'));
114
+ assert.equal(mem.agent_id, 'link');
115
+ assert.equal(mem.key, 'last-task');
116
+ assert.equal(mem.content, 'coverage push');
117
+ assert.equal(mem.namespace, 'default');
118
+ const got = getMemory('link', 'last-task');
119
+ assert.ok(got);
120
+ assert.equal(got.content, 'coverage push');
121
+ });
122
+ it('upserts on same agentId + namespace + key', () => {
123
+ setMemory({ agentId: 'link', key: 'state', content: 'v1' });
124
+ const updated = setMemory({ agentId: 'link', key: 'state', content: 'v2' });
125
+ assert.equal(updated.content, 'v2');
126
+ // Only one entry should exist
127
+ const count = countMemories('link');
128
+ assert.equal(count, 1);
129
+ });
130
+ it('separates by namespace', () => {
131
+ setMemory({ agentId: 'link', namespace: 'work', key: 'focus', content: 'memory' });
132
+ setMemory({ agentId: 'link', namespace: 'personal', key: 'focus', content: 'sleep' });
133
+ const work = getMemory('link', 'focus', 'work');
134
+ const personal = getMemory('link', 'focus', 'personal');
135
+ assert.equal(work.content, 'memory');
136
+ assert.equal(personal.content, 'sleep');
137
+ });
138
+ it('separates by agent', () => {
139
+ setMemory({ agentId: 'link', key: 'role', content: 'builder' });
140
+ setMemory({ agentId: 'kai', key: 'role', content: 'coordinator' });
141
+ assert.equal(getMemory('link', 'role').content, 'builder');
142
+ assert.equal(getMemory('kai', 'role').content, 'coordinator');
143
+ });
144
+ it('deletes a memory', () => {
145
+ setMemory({ agentId: 'link', key: 'temp', content: 'gone soon' });
146
+ const deleted = deleteMemory('link', 'temp');
147
+ assert.equal(deleted, true);
148
+ assert.equal(getMemory('link', 'temp'), null);
149
+ });
150
+ it('returns false for deleting non-existent memory', () => {
151
+ assert.equal(deleteMemory('link', 'nope'), false);
152
+ });
153
+ it('returns null for non-existent memory', () => {
154
+ assert.equal(getMemory('link', 'nope'), null);
155
+ });
156
+ });
157
+ describe('tags', () => {
158
+ it('stores and retrieves tags', () => {
159
+ const mem = setMemory({
160
+ agentId: 'link',
161
+ key: 'pr-review',
162
+ content: 'reviewed #870',
163
+ tags: ['pr', 'review', 'agent-runs'],
164
+ });
165
+ const tags = JSON.parse(mem.tags);
166
+ assert.deepEqual(tags, ['pr', 'review', 'agent-runs']);
167
+ });
168
+ it('filters by tag', () => {
169
+ setMemory({ agentId: 'link', key: 'm1', content: 'one', tags: ['sprint'] });
170
+ setMemory({ agentId: 'link', key: 'm2', content: 'two', tags: ['sprint', 'memory'] });
171
+ setMemory({ agentId: 'link', key: 'm3', content: 'three', tags: ['review'] });
172
+ const sprint = listMemories({ agentId: 'link', tag: 'sprint' });
173
+ assert.equal(sprint.length, 2);
174
+ const memory = listMemories({ agentId: 'link', tag: 'memory' });
175
+ assert.equal(memory.length, 1);
176
+ assert.equal(memory[0].key, 'm2');
177
+ });
178
+ it('updates tags on upsert', () => {
179
+ setMemory({ agentId: 'link', key: 'evolving', content: 'v1', tags: ['draft'] });
180
+ setMemory({ agentId: 'link', key: 'evolving', content: 'v2', tags: ['final', 'shipped'] });
181
+ const mem = getMemory('link', 'evolving');
182
+ const tags = JSON.parse(mem.tags);
183
+ assert.deepEqual(tags, ['final', 'shipped']);
184
+ });
185
+ });
186
+ describe('expiration', () => {
187
+ it('returns null for expired memory', () => {
188
+ setMemory({
189
+ agentId: 'link',
190
+ key: 'ephemeral',
191
+ content: 'gone',
192
+ expiresAt: Date.now() - 1000, // already expired
193
+ });
194
+ const result = getMemory('link', 'ephemeral');
195
+ assert.equal(result, null);
196
+ });
197
+ it('returns memory that has not expired', () => {
198
+ setMemory({
199
+ agentId: 'link',
200
+ key: 'fresh',
201
+ content: 'still here',
202
+ expiresAt: Date.now() + 60000,
203
+ });
204
+ const result = getMemory('link', 'fresh');
205
+ assert.ok(result);
206
+ assert.equal(result.content, 'still here');
207
+ });
208
+ it('excludes expired from list by default', () => {
209
+ setMemory({ agentId: 'link', key: 'alive', content: 'yes' });
210
+ setMemory({ agentId: 'link', key: 'dead', content: 'no', expiresAt: Date.now() - 1000 });
211
+ const list = listMemories({ agentId: 'link' });
212
+ assert.equal(list.length, 1);
213
+ assert.equal(list[0].key, 'alive');
214
+ });
215
+ it('includes expired when asked', () => {
216
+ setMemory({ agentId: 'link', key: 'alive', content: 'yes' });
217
+ setMemory({ agentId: 'link', key: 'dead', content: 'no', expiresAt: Date.now() - 1000 });
218
+ const list = listMemories({ agentId: 'link', includeExpired: true });
219
+ assert.equal(list.length, 2);
220
+ });
221
+ it('purges expired memories', () => {
222
+ setMemory({ agentId: 'link', key: 'keep', content: 'forever' });
223
+ setMemory({ agentId: 'link', key: 'expire1', content: 'gone1', expiresAt: Date.now() - 1000 });
224
+ setMemory({ agentId: 'link', key: 'expire2', content: 'gone2', expiresAt: Date.now() - 2000 });
225
+ const purged = purgeExpired();
226
+ assert.equal(purged, 2);
227
+ assert.equal(countMemories('link'), 1);
228
+ });
229
+ });
230
+ describe('search', () => {
231
+ it('searches by key substring', () => {
232
+ setMemory({ agentId: 'link', key: 'pr-870-review', content: 'approved' });
233
+ setMemory({ agentId: 'link', key: 'pr-814-review', content: 'needs work' });
234
+ setMemory({ agentId: 'link', key: 'daily-note', content: 'March 11' });
235
+ const results = listMemories({ agentId: 'link', search: 'pr-' });
236
+ assert.equal(results.length, 2);
237
+ });
238
+ it('searches by content substring', () => {
239
+ setMemory({ agentId: 'link', key: 'm1', content: 'shipped memory API' });
240
+ setMemory({ agentId: 'link', key: 'm2', content: 'reviewed browser PR' });
241
+ const results = listMemories({ agentId: 'link', search: 'memory' });
242
+ assert.equal(results.length, 1);
243
+ assert.equal(results[0].key, 'm1');
244
+ });
245
+ });
246
+ describe('listing', () => {
247
+ it('lists by namespace', () => {
248
+ setMemory({ agentId: 'link', namespace: 'session', key: 'a', content: '1' });
249
+ setMemory({ agentId: 'link', namespace: 'session', key: 'b', content: '2' });
250
+ setMemory({ agentId: 'link', namespace: 'long-term', key: 'c', content: '3' });
251
+ const session = listMemories({ agentId: 'link', namespace: 'session' });
252
+ assert.equal(session.length, 2);
253
+ });
254
+ it('respects limit', () => {
255
+ for (let i = 0; i < 10; i++) {
256
+ setMemory({ agentId: 'link', key: `item-${i}`, content: `content ${i}` });
257
+ }
258
+ const limited = listMemories({ agentId: 'link', limit: 3 });
259
+ assert.equal(limited.length, 3);
260
+ });
261
+ it('counts memories per agent', () => {
262
+ setMemory({ agentId: 'link', key: 'a', content: '1' });
263
+ setMemory({ agentId: 'link', key: 'b', content: '2' });
264
+ setMemory({ agentId: 'kai', key: 'c', content: '3' });
265
+ assert.equal(countMemories('link'), 2);
266
+ assert.equal(countMemories('kai'), 1);
267
+ });
268
+ it('counts memories per namespace', () => {
269
+ setMemory({ agentId: 'link', namespace: 'work', key: 'a', content: '1' });
270
+ setMemory({ agentId: 'link', namespace: 'work', key: 'b', content: '2' });
271
+ setMemory({ agentId: 'link', namespace: 'play', key: 'c', content: '3' });
272
+ assert.equal(countMemories('link', 'work'), 2);
273
+ assert.equal(countMemories('link', 'play'), 1);
274
+ });
275
+ });
276
+ describe('survive-restart (gate check)', () => {
277
+ it('data persists across DB close/reopen (file-backed)', () => {
278
+ // This test uses a file-backed DB to prove restart survival
279
+ const tmpFile = path.join(os.tmpdir(), `reflectt-memory-test-${Date.now()}.db`);
280
+ try {
281
+ // Phase 1: write memory
282
+ const db1 = new Database(tmpFile);
283
+ db1.pragma('journal_mode = WAL');
284
+ db1.exec(`
285
+ CREATE TABLE IF NOT EXISTS agent_memories (
286
+ id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, namespace TEXT NOT NULL DEFAULT 'default',
287
+ key TEXT NOT NULL, content TEXT NOT NULL, tags TEXT NOT NULL DEFAULT '[]',
288
+ expires_at INTEGER, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
289
+ );
290
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_memories_unique ON agent_memories(agent_id, namespace, key);
291
+ `);
292
+ const now = Date.now();
293
+ db1.prepare(`
294
+ INSERT INTO agent_memories (id, agent_id, namespace, key, content, tags, expires_at, created_at, updated_at)
295
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
296
+ `).run('amem-test-1', 'link', 'default', 'survive-key', 'I persist across restarts', '["gate-check"]', null, now, now);
297
+ db1.close();
298
+ // Phase 2: reopen and read back (simulates node restart)
299
+ const db2 = new Database(tmpFile);
300
+ const row = db2.prepare('SELECT * FROM agent_memories WHERE agent_id = ? AND key = ?').get('link', 'survive-key');
301
+ db2.close();
302
+ assert.ok(row, 'Memory should survive DB close/reopen');
303
+ assert.equal(row.content, 'I persist across restarts');
304
+ assert.equal(row.agent_id, 'link');
305
+ assert.equal(row.key, 'survive-key');
306
+ const tags = JSON.parse(row.tags);
307
+ assert.deepEqual(tags, ['gate-check']);
308
+ }
309
+ finally {
310
+ // Cleanup
311
+ try {
312
+ fs.unlinkSync(tmpFile);
313
+ }
314
+ catch { }
315
+ try {
316
+ fs.unlinkSync(tmpFile + '-wal');
317
+ }
318
+ catch { }
319
+ try {
320
+ fs.unlinkSync(tmpFile + '-shm');
321
+ }
322
+ catch { }
323
+ }
324
+ });
325
+ });
326
+ });
327
+ //# sourceMappingURL=agent-memories.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-memories.test.js","sourceRoot":"","sources":["../src/agent-memories.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export interface AgentMessage {
2
+ id: string;
3
+ fromAgent: string;
4
+ toAgent: string;
5
+ channel: string;
6
+ content: string;
7
+ metadata: Record<string, unknown>;
8
+ readAt: number | null;
9
+ createdAt: number;
10
+ }
11
+ /**
12
+ * Send a message from one agent to another (or to a channel).
13
+ */
14
+ export declare function sendAgentMessage(opts: {
15
+ fromAgent: string;
16
+ toAgent: string;
17
+ channel?: string;
18
+ content: string;
19
+ metadata?: Record<string, unknown>;
20
+ }): AgentMessage;
21
+ /**
22
+ * List messages for an agent (inbox).
23
+ */
24
+ export declare function listAgentMessages(opts: {
25
+ agentId: string;
26
+ channel?: string;
27
+ unreadOnly?: boolean;
28
+ since?: number;
29
+ limit?: number;
30
+ }): AgentMessage[];
31
+ /**
32
+ * List messages sent by an agent (outbox).
33
+ */
34
+ export declare function listSentMessages(agentId: string, limit?: number): AgentMessage[];
35
+ /**
36
+ * Mark messages as read.
37
+ */
38
+ export declare function markMessagesRead(agentId: string, messageIds?: string[]): number;
39
+ /**
40
+ * Get unread count for an agent.
41
+ */
42
+ export declare function getUnreadCount(agentId: string): number;
43
+ /**
44
+ * List messages in a channel (broadcast/topic).
45
+ */
46
+ export declare function listChannelMessages(channel: string, opts?: {
47
+ since?: number;
48
+ limit?: number;
49
+ }): AgentMessage[];
50
+ //# sourceMappingURL=agent-messaging.d.ts.map