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 idx_team_member_conversations_team member ON team_member_conversations(team_member_id);
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
- const result = await this.db.query(`
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
- if (result.rows.length === 0) {
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.0",
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",