claude-memory-layer 1.0.15 → 1.0.17
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.
- package/README.md +3 -0
- package/dist/cli/index.js +105 -74
- package/dist/cli/index.js.map +2 -2
- package/dist/core/index.js +53 -40
- package/dist/core/index.js.map +2 -2
- package/dist/hooks/post-tool-use.js +53 -40
- package/dist/hooks/post-tool-use.js.map +2 -2
- package/dist/hooks/session-end.js +53 -40
- package/dist/hooks/session-end.js.map +2 -2
- package/dist/hooks/session-start.js +53 -40
- package/dist/hooks/session-start.js.map +2 -2
- package/dist/hooks/stop.js +53 -40
- package/dist/hooks/stop.js.map +2 -2
- package/dist/hooks/user-prompt-submit.js +72 -43
- package/dist/hooks/user-prompt-submit.js.map +2 -2
- package/dist/server/api/index.js +53 -40
- package/dist/server/api/index.js.map +2 -2
- package/dist/server/index.js +53 -40
- package/dist/server/index.js.map +2 -2
- package/dist/services/memory-service.js +53 -40
- package/dist/services/memory-service.js.map +2 -2
- package/memory/_index.md +3 -0
- package/memory/agent_response/uncategorized/2026-02-26.md +26 -0
- package/memory/tool_observation/uncategorized/2026-02-26.md +201 -0
- package/memory/user_prompt/uncategorized/2026-02-26.md +16 -0
- package/package.json +1 -1
- package/src/cli/index.ts +55 -33
- package/src/core/sqlite-event-store.ts +52 -40
- package/src/hooks/user-prompt-submit.ts +22 -3
|
@@ -2035,49 +2035,62 @@ var SQLiteEventStore = class {
|
|
|
2035
2035
|
}
|
|
2036
2036
|
async getRecentRetrievalTraces(limit = 50) {
|
|
2037
2037
|
await this.initialize();
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
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
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
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
|
|
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
|
|
7005
|
+
const minScore = getDynamicMinScore(input.prompt);
|
|
7006
|
+
let results = await memoryService.keywordSearch(input.prompt, {
|
|
6984
7007
|
topK: MAX_MEMORIES,
|
|
6985
|
-
minScore
|
|
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);
|