revert: roll back v12.3.3 (Issue Blowout 2026)
SessionStart context injection regressed in v12.3.3 — no memory context is being delivered to new sessions. Rolling back to the v12.3.2 tree state while the regression is investigated. Reverts #2080. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -36,7 +36,7 @@ export class SessionSearch {
|
||||
// Cache FTS5 availability once at construction (avoids DDL probe on every query)
|
||||
this._fts5Available = this.isFts5Available();
|
||||
|
||||
// Ensure FTS tables exist — may downgrade _fts5Available if creation fails
|
||||
// Ensure FTS tables exist
|
||||
this.ensureFTSTables();
|
||||
}
|
||||
|
||||
@@ -84,7 +84,6 @@ export class SessionSearch {
|
||||
logger.info('DB', 'FTS5 tables created successfully');
|
||||
} catch (error) {
|
||||
// FTS5 creation failed at runtime despite probe succeeding — degrade gracefully
|
||||
this._fts5Available = false;
|
||||
logger.warn('DB', 'FTS5 table creation failed — search will use ChromaDB and LIKE queries', {}, error instanceof Error ? error : undefined);
|
||||
}
|
||||
}
|
||||
@@ -328,17 +327,14 @@ export class SessionSearch {
|
||||
LIMIT ? OFFSET ?
|
||||
`;
|
||||
|
||||
// Escape FTS5 special characters: wrap in quotes to treat as literal phrase
|
||||
const escapedQuery = '"' + query.replace(/"/g, '""') + '"';
|
||||
params.unshift(escapedQuery);
|
||||
params.unshift(query);
|
||||
params.push(limit, offset);
|
||||
|
||||
try {
|
||||
return this.db.prepare(sql).all(...params) as ObservationSearchResult[];
|
||||
} catch (error) {
|
||||
// Re-throw so callers can distinguish FTS failure from "no results"
|
||||
logger.warn('DB', 'FTS5 observation search failed', {}, error instanceof Error ? error : undefined);
|
||||
throw error;
|
||||
logger.warn('DB', 'FTS5 observation search failed, returning empty', {}, error instanceof Error ? error : undefined);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -387,9 +383,7 @@ export class SessionSearch {
|
||||
|
||||
const orderClause = orderBy === 'date_asc'
|
||||
? 'ORDER BY s.created_at_epoch ASC'
|
||||
: orderBy === 'date_desc'
|
||||
? 'ORDER BY s.created_at_epoch DESC'
|
||||
: 'ORDER BY session_summaries_fts.rank ASC';
|
||||
: 'ORDER BY session_summaries_fts.rank ASC';
|
||||
|
||||
const sql = `
|
||||
SELECT s.*, s.discovery_tokens
|
||||
@@ -401,17 +395,14 @@ export class SessionSearch {
|
||||
LIMIT ? OFFSET ?
|
||||
`;
|
||||
|
||||
// Escape FTS5 special characters: wrap in quotes to treat as literal phrase
|
||||
const escapedQuery = '"' + query.replace(/"/g, '""') + '"';
|
||||
params.unshift(escapedQuery);
|
||||
params.unshift(query);
|
||||
params.push(limit, offset);
|
||||
|
||||
try {
|
||||
return this.db.prepare(sql).all(...params) as SessionSummarySearchResult[];
|
||||
} catch (error) {
|
||||
// Re-throw so callers can distinguish FTS failure from "no results"
|
||||
logger.warn('DB', 'FTS5 session search failed', {}, error instanceof Error ? error : undefined);
|
||||
throw error;
|
||||
logger.warn('DB', 'FTS5 session search failed, returning empty', {}, error instanceof Error ? error : undefined);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -654,10 +645,8 @@ export class SessionSearch {
|
||||
}
|
||||
|
||||
// LIKE fallback for user prompts text search (no FTS table for this entity)
|
||||
// Escape LIKE metacharacters so %, _, and \ in user input are treated as literals
|
||||
const escapedQuery = query.replace(/[\\%_]/g, '\\$&');
|
||||
baseConditions.push("up.prompt_text LIKE ? ESCAPE '\\'");
|
||||
params.push(`%${escapedQuery}%`);
|
||||
baseConditions.push('up.prompt_text LIKE ?');
|
||||
params.push(`%${query}%`);
|
||||
|
||||
const whereClause = `WHERE ${baseConditions.join(' AND ')}`;
|
||||
const orderClause = orderBy === 'date_asc'
|
||||
|
||||
Reference in New Issue
Block a user