claude-memory-layer 1.0.15 → 1.0.16

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.
@@ -2035,49 +2035,62 @@ var SQLiteEventStore = class {
2035
2035
  }
2036
2036
  async getRecentRetrievalTraces(limit = 50) {
2037
2037
  await this.initialize();
2038
- const rows = sqliteAll(
2039
- this.db,
2040
- `SELECT * FROM retrieval_traces ORDER BY created_at DESC LIMIT ?`,
2041
- [limit]
2042
- );
2043
- return rows.map((row) => ({
2044
- traceId: row.trace_id,
2045
- sessionId: row.session_id || void 0,
2046
- projectHash: row.project_hash || void 0,
2047
- queryText: row.query_text,
2048
- strategy: row.strategy || void 0,
2049
- candidateEventIds: row.candidate_event_ids ? JSON.parse(row.candidate_event_ids) : [],
2050
- selectedEventIds: row.selected_event_ids ? JSON.parse(row.selected_event_ids) : [],
2051
- candidateDetails: row.candidate_details_json ? JSON.parse(row.candidate_details_json) : [],
2052
- selectedDetails: row.selected_details_json ? JSON.parse(row.selected_details_json) : [],
2053
- candidateCount: Number(row.candidate_count || 0),
2054
- selectedCount: Number(row.selected_count || 0),
2055
- confidence: row.confidence || void 0,
2056
- fallbackTrace: row.fallback_trace ? JSON.parse(row.fallback_trace) : [],
2057
- createdAt: toDateFromSQLite(row.created_at)
2058
- }));
2038
+ try {
2039
+ const rows = sqliteAll(
2040
+ this.db,
2041
+ `SELECT * FROM retrieval_traces ORDER BY created_at DESC LIMIT ?`,
2042
+ [limit]
2043
+ );
2044
+ return rows.map((row) => ({
2045
+ traceId: row.trace_id,
2046
+ sessionId: row.session_id || void 0,
2047
+ projectHash: row.project_hash || void 0,
2048
+ queryText: row.query_text,
2049
+ strategy: row.strategy || void 0,
2050
+ candidateEventIds: row.candidate_event_ids ? JSON.parse(row.candidate_event_ids) : [],
2051
+ selectedEventIds: row.selected_event_ids ? JSON.parse(row.selected_event_ids) : [],
2052
+ candidateDetails: row.candidate_details_json ? JSON.parse(row.candidate_details_json) : [],
2053
+ selectedDetails: row.selected_details_json ? JSON.parse(row.selected_details_json) : [],
2054
+ candidateCount: Number(row.candidate_count || 0),
2055
+ selectedCount: Number(row.selected_count || 0),
2056
+ confidence: row.confidence || void 0,
2057
+ fallbackTrace: row.fallback_trace ? JSON.parse(row.fallback_trace) : [],
2058
+ createdAt: toDateFromSQLite(row.created_at)
2059
+ }));
2060
+ } catch (err) {
2061
+ if (err?.message?.includes("no such table"))
2062
+ return [];
2063
+ throw err;
2064
+ }
2059
2065
  }
2060
2066
  async getRetrievalTraceStats() {
2061
2067
  await this.initialize();
2062
- const row = sqliteGet(
2063
- this.db,
2064
- `SELECT
2065
- COUNT(*) as total_queries,
2066
- AVG(candidate_count) as avg_candidate_count,
2067
- AVG(selected_count) as avg_selected_count,
2068
- CASE
2069
- WHEN SUM(candidate_count) > 0 THEN (SUM(selected_count) * 1.0 / SUM(candidate_count))
2070
- ELSE 0
2071
- END as selection_rate
2072
- FROM retrieval_traces`,
2073
- []
2074
- );
2075
- return {
2076
- totalQueries: Number(row?.total_queries || 0),
2077
- avgCandidateCount: Number(row?.avg_candidate_count || 0),
2078
- avgSelectedCount: Number(row?.avg_selected_count || 0),
2079
- selectionRate: Number(row?.selection_rate || 0)
2080
- };
2068
+ try {
2069
+ const row = sqliteGet(
2070
+ this.db,
2071
+ `SELECT
2072
+ COUNT(*) as total_queries,
2073
+ AVG(candidate_count) as avg_candidate_count,
2074
+ AVG(selected_count) as avg_selected_count,
2075
+ CASE
2076
+ WHEN SUM(candidate_count) > 0 THEN (SUM(selected_count) * 1.0 / SUM(candidate_count))
2077
+ ELSE 0
2078
+ END as selection_rate
2079
+ FROM retrieval_traces`,
2080
+ []
2081
+ );
2082
+ return {
2083
+ totalQueries: Number(row?.total_queries || 0),
2084
+ avgCandidateCount: Number(row?.avg_candidate_count || 0),
2085
+ avgSelectedCount: Number(row?.avg_selected_count || 0),
2086
+ selectionRate: Number(row?.selection_rate || 0)
2087
+ };
2088
+ } catch (err) {
2089
+ if (err?.message?.includes("no such table")) {
2090
+ return { totalQueries: 0, avgCandidateCount: 0, avgSelectedCount: 0, selectionRate: 0 };
2091
+ }
2092
+ throw err;
2093
+ }
2081
2094
  }
2082
2095
  /**
2083
2096
  * Close database connection
@@ -6952,7 +6965,8 @@ function writeTurnState(sessionId, turnId) {
6952
6965
 
6953
6966
  // src/hooks/user-prompt-submit.ts
6954
6967
  var MAX_MEMORIES = parseInt(process.env.CLAUDE_MEMORY_MAX_COUNT || "5");
6955
- var MIN_SCORE = parseFloat(process.env.CLAUDE_MEMORY_MIN_SCORE || "0.3");
6968
+ var BASE_MIN_SCORE = parseFloat(process.env.CLAUDE_MEMORY_MIN_SCORE || "0.4");
6969
+ var FALLBACK_MIN_SCORE = parseFloat(process.env.CLAUDE_MEMORY_FALLBACK_MIN_SCORE || "0.3");
6956
6970
  var ENABLE_SEARCH = process.env.CLAUDE_MEMORY_SEARCH !== "false";
6957
6971
  function shouldStorePrompt(prompt) {
6958
6972
  const trimmed = prompt.trim();
@@ -6964,6 +6978,14 @@ function shouldStorePrompt(prompt) {
6964
6978
  return false;
6965
6979
  return true;
6966
6980
  }
6981
+ function getDynamicMinScore(prompt) {
6982
+ const len = prompt.trim().length;
6983
+ if (len <= 20)
6984
+ return Math.min(0.55, BASE_MIN_SCORE + 0.1);
6985
+ if (len >= 80)
6986
+ return Math.max(0.3, BASE_MIN_SCORE - 0.05);
6987
+ return BASE_MIN_SCORE;
6988
+ }
6967
6989
  async function main() {
6968
6990
  const inputData = await readStdin();
6969
6991
  const input = JSON.parse(inputData);
@@ -6980,10 +7002,17 @@ async function main() {
6980
7002
  }
6981
7003
  let context = "";
6982
7004
  if (ENABLE_SEARCH && input.prompt.length > 10) {
6983
- const results = await memoryService.keywordSearch(input.prompt, {
7005
+ const minScore = getDynamicMinScore(input.prompt);
7006
+ let results = await memoryService.keywordSearch(input.prompt, {
6984
7007
  topK: MAX_MEMORIES,
6985
- minScore: MIN_SCORE
7008
+ minScore
6986
7009
  });
7010
+ if (results.length === 0 && FALLBACK_MIN_SCORE < minScore) {
7011
+ results = await memoryService.keywordSearch(input.prompt, {
7012
+ topK: MAX_MEMORIES,
7013
+ minScore: FALLBACK_MIN_SCORE
7014
+ });
7015
+ }
6987
7016
  if (results.length > 0) {
6988
7017
  const eventIds = results.map((r) => r.event.id);
6989
7018
  await memoryService.incrementMemoryAccess(eventIds);