llmemory 0.2.4 → 0.2.5
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.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/lib/generators/llmemory/install/templates/create_llmemory_tables.rb +5 -0
- data/lib/llmemory/crypto/cipher.rb +12 -0
- data/lib/llmemory/crypto/field_helpers.rb +25 -0
- data/lib/llmemory/long_term/episodic/storages/active_record_storage.rb +25 -7
- data/lib/llmemory/long_term/episodic/storages/database_storage.rb +28 -11
- data/lib/llmemory/long_term/file_based/storages/active_record_storage.rb +28 -34
- data/lib/llmemory/long_term/file_based/storages/base.rb +24 -0
- data/lib/llmemory/long_term/file_based/storages/database_storage.rb +50 -34
- data/lib/llmemory/long_term/file_based/storages/file_storage.rb +10 -2
- data/lib/llmemory/long_term/file_based/storages/memory_storage.rb +2 -28
- data/lib/llmemory/long_term/graph_based/storage.rb +3 -1
- data/lib/llmemory/long_term/procedural/storages/active_record_storage.rb +40 -9
- data/lib/llmemory/long_term/procedural/storages/database_storage.rb +57 -17
- data/lib/llmemory/maintenance/search_tokens_backfill.rb +339 -0
- data/lib/llmemory/maintenance.rb +1 -0
- data/lib/llmemory/mcp/tools/memory_retrieve.rb +2 -0
- data/lib/llmemory/mcp/tools/memory_timeline.rb +48 -14
- data/lib/llmemory/mcp/tools/memory_timeline_context.rb +15 -5
- data/lib/llmemory/vector_store/memory_store.rb +7 -3
- data/lib/llmemory/version.rb +1 -1
- data/lib/tasks/llmemory.rake +37 -0
- metadata +4 -2
|
@@ -30,7 +30,11 @@ module Llmemory
|
|
|
30
30
|
elsif meta[:text] && @cipher.enabled?
|
|
31
31
|
meta[:text] = @cipher.encrypt(meta[:text].to_s)
|
|
32
32
|
end
|
|
33
|
-
@entries[key] = {
|
|
33
|
+
@entries[key] = {
|
|
34
|
+
source_id: id.to_s,
|
|
35
|
+
embedding: embedding.to_a.map(&:to_f),
|
|
36
|
+
metadata: meta.merge("user_id" => user_id)
|
|
37
|
+
}
|
|
34
38
|
id
|
|
35
39
|
end
|
|
36
40
|
|
|
@@ -38,9 +42,9 @@ module Llmemory
|
|
|
38
42
|
query = query_embedding.to_a.map(&:to_f)
|
|
39
43
|
return [] if query.empty?
|
|
40
44
|
entries = user_id ? @entries.select { |k, _| k.to_s.start_with?("#{user_id}:") } : @entries
|
|
41
|
-
scores = entries.map do |
|
|
45
|
+
scores = entries.map do |_key, data|
|
|
42
46
|
sim = cosine_similarity(query, data[:embedding])
|
|
43
|
-
{ id:
|
|
47
|
+
{ id: data[:source_id], score: sim, metadata: decrypt_metadata(data[:metadata]) }
|
|
44
48
|
end
|
|
45
49
|
scores.sort_by { |s| -s[:score] }.first(top_k)
|
|
46
50
|
end
|
data/lib/llmemory/version.rb
CHANGED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
namespace :llmemory do
|
|
4
|
+
desc "Backfill search_tokens blind index (and name_det on skills) for encrypted keyword search. " \
|
|
5
|
+
"Env: FORCE=1 (re-backfill all rows), DRY_RUN=1 (count only), STORE=active_record|postgres"
|
|
6
|
+
task :backfill_search_tokens, [:user_id] do |_t, args|
|
|
7
|
+
require "llmemory"
|
|
8
|
+
require_relative "../llmemory/maintenance/search_tokens_backfill"
|
|
9
|
+
|
|
10
|
+
dry_run = ENV["DRY_RUN"].to_s == "1"
|
|
11
|
+
force = ENV["FORCE"].to_s == "1"
|
|
12
|
+
store = ENV["STORE"]&.to_sym
|
|
13
|
+
|
|
14
|
+
if store.nil? && !Llmemory.configuration.encryption_enabled
|
|
15
|
+
warn "Note: encryption_enabled is false; backfill still aligns schema but keyword search uses plaintext LIKE."
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
backfill = Llmemory::Maintenance::SearchTokensBackfill.new(
|
|
19
|
+
dry_run: dry_run,
|
|
20
|
+
force: force,
|
|
21
|
+
store: store
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
user_id = args[:user_id].presence
|
|
25
|
+
puts "Backfilling search_tokens#{user_id ? " for user_id=#{user_id}" : " (all users)"} " \
|
|
26
|
+
"[store=#{store || Llmemory.configuration.long_term_store}]" \
|
|
27
|
+
"#{dry_run ? " [DRY RUN]" : ""}#{force ? " [FORCE]" : ""}"
|
|
28
|
+
|
|
29
|
+
result = backfill.run(user_id: user_id)
|
|
30
|
+
summary = result.to_h
|
|
31
|
+
|
|
32
|
+
puts "Updated: items=#{summary[:items]} resources=#{summary[:resources]} " \
|
|
33
|
+
"episodes=#{summary[:episodes]} skills=#{summary[:skills]} " \
|
|
34
|
+
"(total=#{summary[:total]})"
|
|
35
|
+
puts "Dry run — no rows written." if dry_run
|
|
36
|
+
end
|
|
37
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: llmemory
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- llmemory
|
|
@@ -230,6 +230,7 @@ files:
|
|
|
230
230
|
- lib/llmemory/maintenance/consolidator.rb
|
|
231
231
|
- lib/llmemory/maintenance/reindexer.rb
|
|
232
232
|
- lib/llmemory/maintenance/runner.rb
|
|
233
|
+
- lib/llmemory/maintenance/search_tokens_backfill.rb
|
|
233
234
|
- lib/llmemory/maintenance/summarizer.rb
|
|
234
235
|
- lib/llmemory/maintenance/ttl_expiry.rb
|
|
235
236
|
- lib/llmemory/mcp.rb
|
|
@@ -288,6 +289,7 @@ files:
|
|
|
288
289
|
- lib/llmemory/vector_store/openai_embeddings.rb
|
|
289
290
|
- lib/llmemory/version.rb
|
|
290
291
|
- lib/llmemory/working_memory.rb
|
|
292
|
+
- lib/tasks/llmemory.rake
|
|
291
293
|
- lib/tasks/release.rake
|
|
292
294
|
homepage: https://github.com/entaina/llmemory
|
|
293
295
|
licenses:
|
|
@@ -309,7 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
309
311
|
- !ruby/object:Gem::Version
|
|
310
312
|
version: '0'
|
|
311
313
|
requirements: []
|
|
312
|
-
rubygems_version: 4.0.
|
|
314
|
+
rubygems_version: 4.0.16
|
|
313
315
|
specification_version: 4
|
|
314
316
|
summary: Persistent memory system for LLM agents
|
|
315
317
|
test_files: []
|