eagle-mem 3.0.1 → 3.0.2
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/hooks/post-tool-use.sh +11 -146
- package/hooks/pre-tool-use.sh +5 -25
- package/hooks/session-end.sh +1 -1
- package/hooks/session-start.sh +23 -29
- package/hooks/stop.sh +1 -1
- package/lib/common.sh +3 -0
- package/lib/db-backfill.sh +96 -0
- package/lib/db-core.sh +65 -0
- package/lib/db-features.sh +160 -0
- package/lib/db-mirrors.sh +264 -0
- package/lib/db-observations.sh +77 -0
- package/lib/db-sessions.sh +68 -0
- package/lib/db-summaries.sh +142 -0
- package/lib/db.sh +14 -737
- package/lib/hooks-posttool.sh +138 -0
- package/package.json +1 -1
- package/scripts/memories.sh +3 -3
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ═══════════════════════════════════════════════════════════
|
|
3
|
+
# Eagle Mem — Summary + overview helpers
|
|
4
|
+
# ═══════════════════════════════════════════════════════════
|
|
5
|
+
[ -n "${_EAGLE_DB_SUMMARIES_LOADED:-}" ] && return 0
|
|
6
|
+
_EAGLE_DB_SUMMARIES_LOADED=1
|
|
7
|
+
|
|
8
|
+
eagle_insert_summary() {
|
|
9
|
+
local session_id; session_id=$(eagle_sql_escape "$1")
|
|
10
|
+
local project; project=$(eagle_sql_escape "$2")
|
|
11
|
+
local request; request=$(eagle_sql_escape "$3")
|
|
12
|
+
local investigated; investigated=$(eagle_sql_escape "$4")
|
|
13
|
+
local learned; learned=$(eagle_sql_escape "$5")
|
|
14
|
+
local completed; completed=$(eagle_sql_escape "$6")
|
|
15
|
+
local next_steps; next_steps=$(eagle_sql_escape "$7")
|
|
16
|
+
local files_read; files_read=$(eagle_sql_escape "$8")
|
|
17
|
+
local files_modified; files_modified=$(eagle_sql_escape "$9")
|
|
18
|
+
local notes; notes=$(eagle_sql_escape "${10:-}")
|
|
19
|
+
local decisions; decisions=$(eagle_sql_escape "${11:-}")
|
|
20
|
+
local gotchas; gotchas=$(eagle_sql_escape "${12:-}")
|
|
21
|
+
local key_files; key_files=$(eagle_sql_escape "${13:-}")
|
|
22
|
+
|
|
23
|
+
eagle_db_pipe <<SQL
|
|
24
|
+
INSERT INTO summaries (session_id, project, request, investigated, learned, completed, next_steps, files_read, files_modified, notes, decisions, gotchas, key_files)
|
|
25
|
+
VALUES (
|
|
26
|
+
'$session_id',
|
|
27
|
+
'$project',
|
|
28
|
+
'$request',
|
|
29
|
+
'$investigated',
|
|
30
|
+
'$learned',
|
|
31
|
+
'$completed',
|
|
32
|
+
'$next_steps',
|
|
33
|
+
'$files_read',
|
|
34
|
+
'$files_modified',
|
|
35
|
+
'$notes',
|
|
36
|
+
'$decisions',
|
|
37
|
+
'$gotchas',
|
|
38
|
+
'$key_files'
|
|
39
|
+
)
|
|
40
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
41
|
+
project = excluded.project,
|
|
42
|
+
request = COALESCE(NULLIF(excluded.request, ''), summaries.request),
|
|
43
|
+
investigated = COALESCE(NULLIF(excluded.investigated, ''), summaries.investigated),
|
|
44
|
+
learned = COALESCE(NULLIF(excluded.learned, ''), summaries.learned),
|
|
45
|
+
completed = COALESCE(NULLIF(excluded.completed, ''), summaries.completed),
|
|
46
|
+
next_steps = COALESCE(NULLIF(excluded.next_steps, ''), summaries.next_steps),
|
|
47
|
+
files_read = COALESCE(NULLIF(excluded.files_read, '[]'), summaries.files_read),
|
|
48
|
+
files_modified = COALESCE(NULLIF(excluded.files_modified, '[]'), summaries.files_modified),
|
|
49
|
+
notes = COALESCE(NULLIF(excluded.notes, ''), summaries.notes),
|
|
50
|
+
decisions = COALESCE(NULLIF(excluded.decisions, ''), summaries.decisions),
|
|
51
|
+
gotchas = COALESCE(NULLIF(excluded.gotchas, ''), summaries.gotchas),
|
|
52
|
+
key_files = COALESCE(NULLIF(excluded.key_files, ''), summaries.key_files);
|
|
53
|
+
SQL
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
eagle_get_recent_summaries() {
|
|
57
|
+
local project; project=$(eagle_sql_escape "$1")
|
|
58
|
+
local limit; limit=$(eagle_sql_int "${2:-5}")
|
|
59
|
+
|
|
60
|
+
eagle_db "SELECT s.request, s.completed, s.learned, s.next_steps, s.created_at, s.decisions, s.gotchas, s.key_files
|
|
61
|
+
FROM summaries s
|
|
62
|
+
WHERE s.project = '$project'
|
|
63
|
+
AND s.request NOT LIKE '%<local-command-caveat>%'
|
|
64
|
+
ORDER BY s.created_at DESC
|
|
65
|
+
LIMIT $limit;"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
eagle_search_summaries() {
|
|
69
|
+
local query; query=$(eagle_fts_sanitize "$1")
|
|
70
|
+
query=$(eagle_sql_escape "$query")
|
|
71
|
+
local project="${2:-}"
|
|
72
|
+
local limit; limit=$(eagle_sql_int "${3:-10}")
|
|
73
|
+
|
|
74
|
+
local where_clause=""
|
|
75
|
+
if [ -n "$project" ]; then
|
|
76
|
+
project=$(eagle_sql_escape "$project")
|
|
77
|
+
where_clause="AND s.project = '$project'"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
eagle_db "SELECT s.request, s.completed, s.learned, s.next_steps, s.created_at, s.project, s.decisions, s.gotchas, s.key_files
|
|
81
|
+
FROM summaries s
|
|
82
|
+
JOIN summaries_fts f ON f.rowid = s.id
|
|
83
|
+
WHERE summaries_fts MATCH '$query'
|
|
84
|
+
$where_clause
|
|
85
|
+
ORDER BY rank
|
|
86
|
+
LIMIT $limit;"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
eagle_upsert_overview() {
|
|
90
|
+
local project; project=$(eagle_sql_escape "$1")
|
|
91
|
+
local raw_content="$2"
|
|
92
|
+
local ov_source; ov_source=$(eagle_sql_escape "${3:-manual}")
|
|
93
|
+
|
|
94
|
+
if [ ${#raw_content} -gt 16384 ]; then
|
|
95
|
+
raw_content="${raw_content:0:16384}"
|
|
96
|
+
eagle_log "WARN" "Overview for '$1' truncated to 16 KB (was ${#2} bytes)"
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
local content; content=$(eagle_sql_escape "$raw_content")
|
|
100
|
+
|
|
101
|
+
eagle_db "INSERT INTO overviews (project, content, source, updated_at)
|
|
102
|
+
VALUES ('$project', '$content', '$ov_source', strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
103
|
+
ON CONFLICT(project) DO UPDATE SET
|
|
104
|
+
content = excluded.content,
|
|
105
|
+
source = excluded.source,
|
|
106
|
+
updated_at = excluded.updated_at;"
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
eagle_get_overview_source() {
|
|
110
|
+
local project; project=$(eagle_sql_escape "$1")
|
|
111
|
+
eagle_db "SELECT source FROM overviews WHERE project = '$project';"
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
eagle_get_overview() {
|
|
115
|
+
local project; project=$(eagle_sql_escape "$1")
|
|
116
|
+
eagle_db "SELECT content FROM overviews WHERE project = '$project';"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
eagle_search_decisions_for_file() {
|
|
120
|
+
local project; project=$(eagle_sql_escape "$1")
|
|
121
|
+
local fts_query; fts_query=$(eagle_sql_escape "$2")
|
|
122
|
+
eagle_db "SELECT s.decisions
|
|
123
|
+
FROM summaries s
|
|
124
|
+
JOIN summaries_fts f ON f.rowid = s.id
|
|
125
|
+
WHERE summaries_fts MATCH '$fts_query'
|
|
126
|
+
AND s.project = '$project'
|
|
127
|
+
AND s.decisions IS NOT NULL
|
|
128
|
+
AND s.decisions != ''
|
|
129
|
+
ORDER BY s.created_at DESC
|
|
130
|
+
LIMIT 1;"
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
eagle_search_stale_memories() {
|
|
134
|
+
local project; project=$(eagle_sql_escape "$1")
|
|
135
|
+
local fts_query; fts_query=$(eagle_sql_escape "$2")
|
|
136
|
+
eagle_db "SELECT m.memory_name
|
|
137
|
+
FROM claude_memories m
|
|
138
|
+
JOIN claude_memories_fts f ON f.rowid = m.id
|
|
139
|
+
WHERE claude_memories_fts MATCH '$fts_query'
|
|
140
|
+
AND m.project = '$project'
|
|
141
|
+
LIMIT 1;"
|
|
142
|
+
}
|