specmem-hardwicksoftware 3.6.0 → 3.6.1
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.
|
@@ -52,7 +52,7 @@ CREATE TABLE IF NOT EXISTS team_member_conversations (
|
|
|
52
52
|
);
|
|
53
53
|
|
|
54
54
|
CREATE INDEX IF NOT EXISTS idx_team_member_conversations_memory ON team_member_conversations(memory_id);
|
|
55
|
-
CREATE INDEX IF NOT EXISTS
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_team_member_conversations_team_member ON team_member_conversations(team_member_id);
|
|
56
56
|
CREATE INDEX IF NOT EXISTS idx_team_member_conversations_time ON team_member_conversations(timestamp);
|
|
57
57
|
|
|
58
58
|
-- HELPER FUNCTIONS
|
|
@@ -266,6 +266,27 @@ INSERT INTO team_channels (name, channel_type, created_by, project_path)
|
|
|
266
266
|
SELECT 'team-broadcast', 'broadcast', 'system', '/'
|
|
267
267
|
WHERE NOT EXISTS (SELECT 1 FROM team_channels WHERE name = 'team-broadcast' AND channel_type = 'broadcast');
|
|
268
268
|
|
|
269
|
+
-- ============================================================================
|
|
270
|
+
-- TEAM MEMBER CONVERSATIONS TABLE
|
|
271
|
+
-- Stores the conversation context that spawned a memory
|
|
272
|
+
-- Required by MemoryDrilldown.js for getMemoryFull / drill_down
|
|
273
|
+
-- ============================================================================
|
|
274
|
+
CREATE TABLE IF NOT EXISTS team_member_conversations (
|
|
275
|
+
id BIGSERIAL PRIMARY KEY,
|
|
276
|
+
memory_id UUID NOT NULL,
|
|
277
|
+
team_member_id VARCHAR(255) NOT NULL,
|
|
278
|
+
team_member_name VARCHAR(255),
|
|
279
|
+
timestamp TIMESTAMPTZ DEFAULT NOW(),
|
|
280
|
+
summary TEXT,
|
|
281
|
+
full_transcript TEXT,
|
|
282
|
+
message_count INTEGER,
|
|
283
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
CREATE INDEX IF NOT EXISTS idx_team_member_conversations_memory ON team_member_conversations(memory_id);
|
|
287
|
+
CREATE INDEX IF NOT EXISTS idx_team_member_conversations_team_member ON team_member_conversations(team_member_id);
|
|
288
|
+
CREATE INDEX IF NOT EXISTS idx_team_member_conversations_time ON team_member_conversations(timestamp);
|
|
289
|
+
|
|
269
290
|
-- ============================================================================
|
|
270
291
|
-- END - Core data uses PUBLIC schema with project_path filtering
|
|
271
292
|
-- ============================================================================
|
|
@@ -93,7 +93,7 @@ export class MemoryDrilldown {
|
|
|
93
93
|
m.metadata,
|
|
94
94
|
m.embedding,
|
|
95
95
|
EXISTS(SELECT 1 FROM codebase_pointers WHERE memory_id = m.id) as has_code,
|
|
96
|
-
EXISTS(SELECT 1 FROM team_member_conversations WHERE memory_id = m.id) as has_conversation,
|
|
96
|
+
EXISTS(SELECT 1 FROM team_member_conversations tmc WHERE tmc.memory_id = m.id) as has_conversation,
|
|
97
97
|
1 - (m.embedding <=> $1::vector) as relevance
|
|
98
98
|
FROM memories m
|
|
99
99
|
WHERE m.content ILIKE $2
|
|
@@ -218,7 +218,8 @@ export class MemoryDrilldown {
|
|
|
218
218
|
* Fetch the conversation that spawned this memory
|
|
219
219
|
*/
|
|
220
220
|
async getConversation(memoryId) {
|
|
221
|
-
|
|
221
|
+
try {
|
|
222
|
+
const result = await this.db.query(`
|
|
222
223
|
SELECT
|
|
223
224
|
team_member_id,
|
|
224
225
|
team_member_name,
|
|
@@ -230,17 +231,23 @@ export class MemoryDrilldown {
|
|
|
230
231
|
ORDER BY timestamp DESC
|
|
231
232
|
LIMIT 1
|
|
232
233
|
`, [memoryId]);
|
|
233
|
-
|
|
234
|
+
if (result.rows.length === 0) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
const row = result.rows[0];
|
|
238
|
+
return {
|
|
239
|
+
team_member_id: row.team_member_id,
|
|
240
|
+
team_member_name: row.team_member_name,
|
|
241
|
+
timestamp: row.timestamp,
|
|
242
|
+
summary: row.summary,
|
|
243
|
+
full_transcript: row.full_transcript
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
// Table may not exist yet - gracefully return null
|
|
248
|
+
logger.warn({ err: err?.message, memoryId }, 'getConversation failed (table may not exist)');
|
|
234
249
|
return null;
|
|
235
250
|
}
|
|
236
|
-
const row = result.rows[0];
|
|
237
|
-
return {
|
|
238
|
-
team_member_id: row.team_member_id,
|
|
239
|
-
team_member_name: row.team_member_name,
|
|
240
|
-
timestamp: row.timestamp,
|
|
241
|
-
summary: row.summary,
|
|
242
|
-
full_transcript: row.full_transcript
|
|
243
|
-
};
|
|
244
251
|
}
|
|
245
252
|
/**
|
|
246
253
|
* GET RELATED MEMORIES
|
|
@@ -256,7 +263,7 @@ export class MemoryDrilldown {
|
|
|
256
263
|
m.tags,
|
|
257
264
|
m.metadata,
|
|
258
265
|
EXISTS(SELECT 1 FROM codebase_pointers WHERE memory_id = m.id) as has_code,
|
|
259
|
-
EXISTS(SELECT 1 FROM team_member_conversations WHERE memory_id = m.id) as has_conversation,
|
|
266
|
+
EXISTS(SELECT 1 FROM team_member_conversations tmc WHERE tmc.memory_id = m.id) as has_conversation,
|
|
260
267
|
1 - (m.embedding <=> $1::vector) as relevance
|
|
261
268
|
FROM memories m
|
|
262
269
|
WHERE m.id != $2
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specmem-hardwicksoftware",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Persistent memory system for coding sessions - semantic search with pgvector, token compression, team coordination, file watching. Needs root: installs system-wide hooks, manages docker/PostgreSQL, writes global configs, handles screen sessions. justcalljon.pro",
|
|
6
6
|
"main": "dist/index.js",
|