engram 0.3.0 → 0.5.0

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +118 -0
  3. data/README.md +409 -39
  4. data/lib/engram/adapters/in_memory_processed_turns.rb +40 -8
  5. data/lib/engram/adapters/in_memory_store.rb +49 -11
  6. data/lib/engram/adapters/null_embedder.rb +9 -0
  7. data/lib/engram/adapters/pgvector_store.rb +67 -20
  8. data/lib/engram/adapters/ruby_llm_embedder.rb +45 -4
  9. data/lib/engram/configuration.rb +5 -1
  10. data/lib/engram/consolidators/heuristic_consolidator.rb +7 -1
  11. data/lib/engram/consolidators/llm_consolidator.rb +44 -12
  12. data/lib/engram/embedding_metadata.rb +135 -0
  13. data/lib/engram/extractors/llm_extractor.rb +16 -6
  14. data/lib/engram/instrumentation.rb +57 -0
  15. data/lib/engram/memory.rb +42 -17
  16. data/lib/engram/memory_kind.rb +19 -0
  17. data/lib/engram/persistence.rb +39 -0
  18. data/lib/engram/persistence_policy.rb +45 -0
  19. data/lib/engram/ports/memory_store.rb +16 -8
  20. data/lib/engram/ports/processed_turns.rb +16 -8
  21. data/lib/engram/provenance.rb +257 -0
  22. data/lib/engram/rails/cache_processed_turns.rb +51 -10
  23. data/lib/engram/rails/observe_job.rb +5 -0
  24. data/lib/engram/rails/tasks.rake +26 -0
  25. data/lib/engram/railtie.rb +4 -0
  26. data/lib/engram/record.rb +8 -3
  27. data/lib/engram/reserved_metadata.rb +52 -0
  28. data/lib/engram/use_cases/forget.rb +6 -2
  29. data/lib/engram/use_cases/inject.rb +17 -3
  30. data/lib/engram/use_cases/observe.rb +83 -19
  31. data/lib/engram/use_cases/rebuild_embeddings.rb +189 -0
  32. data/lib/engram/use_cases/recall.rb +28 -9
  33. data/lib/engram/version.rb +1 -1
  34. data/lib/engram.rb +11 -0
  35. data/lib/generators/engram/install_generator.rb +10 -0
  36. data/lib/generators/engram/templates/create_engram_memories.rb.tt +10 -3
  37. metadata +14 -4
data/lib/engram.rb CHANGED
@@ -3,9 +3,16 @@
3
3
  require_relative "engram/version"
4
4
  require_relative "engram/configuration"
5
5
  require_relative "engram/math"
6
+ require_relative "engram/reserved_metadata"
7
+ require_relative "engram/embedding_metadata"
8
+ require_relative "engram/provenance"
9
+ require_relative "engram/memory_kind"
6
10
  require_relative "engram/record"
7
11
  require_relative "engram/decision"
8
12
  require_relative "engram/turn_digest"
13
+ require_relative "engram/persistence_policy"
14
+ require_relative "engram/instrumentation"
15
+ require_relative "engram/persistence"
9
16
 
10
17
  # Ports (contracts)
11
18
  require_relative "engram/ports/memory_store"
@@ -20,6 +27,7 @@ require_relative "engram/use_cases/recall"
20
27
  require_relative "engram/use_cases/inject"
21
28
  require_relative "engram/use_cases/observe"
22
29
  require_relative "engram/use_cases/forget"
30
+ require_relative "engram/use_cases/rebuild_embeddings"
23
31
 
24
32
  # Built-in adapters (pure Ruby, no external deps)
25
33
  require_relative "engram/adapters/in_memory_store"
@@ -47,6 +55,9 @@ require_relative "engram/integrations/ruby_llm"
47
55
  module Engram
48
56
  class Error < StandardError; end
49
57
 
58
+ # Raised when a live claim suppresses an observation that has not completed.
59
+ class ObservationInProgressError < Error; end
60
+
50
61
  class << self
51
62
  def config
52
63
  @config ||= Configuration.new
@@ -17,6 +17,10 @@ module Engram
17
17
  class_option :dimensions, type: :numeric, default: DEFAULT_DIMENSIONS,
18
18
  desc: "Embedding dimensions (match your embedding model)"
19
19
 
20
+ def validate_dimensions
21
+ validate_dimensions!
22
+ end
23
+
20
24
  def create_migration_file
21
25
  migration_template "create_engram_memories.rb.tt",
22
26
  "db/migrate/create_engram_memories.rb"
@@ -40,6 +44,12 @@ module Engram
40
44
  options[:dimensions]
41
45
  end
42
46
 
47
+ def validate_dimensions!
48
+ return if dimensions.is_a?(Integer) && dimensions.positive?
49
+
50
+ raise ArgumentError, "dimensions must be a positive integer that matches your embedding model"
51
+ end
52
+
43
53
  def migration_version
44
54
  "#{::ActiveRecord::VERSION::MAJOR}.#{::ActiveRecord::VERSION::MINOR}"
45
55
  end
@@ -7,7 +7,7 @@ class CreateEngramMemories < ActiveRecord::Migration[<%= migration_version %>]
7
7
  create_table :engram_memories do |t|
8
8
  t.string :scope, null: false
9
9
  t.text :content, null: false
10
- t.string :kind, null: false, default: "semantic"
10
+ t.string :kind, null: false, default: "fact"
11
11
  t.float :importance, null: false, default: 1.0
12
12
  t.jsonb :metadata, null: false, default: {}
13
13
  t.vector :embedding, limit: <%= dimensions %>
@@ -18,7 +18,14 @@ class CreateEngramMemories < ActiveRecord::Migration[<%= migration_version %>]
18
18
 
19
19
  add_index :engram_memories, :scope
20
20
 
21
- # For larger datasets, add an approximate index (requires data present first):
22
- # add_index :engram_memories, :embedding, using: :hnsw, opclass: :vector_cosine_ops
21
+ # For larger datasets, choose one approximate vector index after backfilling data.
22
+ # HNSW is a strong default for read-heavy recall workloads with frequent inserts.
23
+ # IVFFlat can be smaller/faster to build, but should be created after enough representative data exists.
24
+ #
25
+ # HNSW:
26
+ # add_index :engram_memories, :embedding, using: :hnsw, opclass: :vector_cosine_ops
27
+ # IVFFlat:
28
+ # add_index :engram_memories, :embedding, using: :ivfflat, opclass: :vector_cosine_ops
29
+ # See the Engram README for production index guidance.
23
30
  end
24
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engram
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandr Kholodniak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-05-25 00:00:00.000000000 Z
11
+ date: 2026-07-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  Engram gives AI agents durable, long-term memory. It recalls relevant facts about a
@@ -36,25 +36,34 @@ files:
36
36
  - lib/engram/consolidators/heuristic_consolidator.rb
37
37
  - lib/engram/consolidators/llm_consolidator.rb
38
38
  - lib/engram/decision.rb
39
+ - lib/engram/embedding_metadata.rb
39
40
  - lib/engram/extractors/llm_extractor.rb
41
+ - lib/engram/instrumentation.rb
40
42
  - lib/engram/integrations/ruby_llm.rb
41
43
  - lib/engram/math.rb
42
44
  - lib/engram/memory.rb
45
+ - lib/engram/memory_kind.rb
46
+ - lib/engram/persistence.rb
47
+ - lib/engram/persistence_policy.rb
43
48
  - lib/engram/ports/completion.rb
44
49
  - lib/engram/ports/consolidator.rb
45
50
  - lib/engram/ports/embedder.rb
46
51
  - lib/engram/ports/extractor.rb
47
52
  - lib/engram/ports/memory_store.rb
48
53
  - lib/engram/ports/processed_turns.rb
54
+ - lib/engram/provenance.rb
49
55
  - lib/engram/rails/cache_processed_turns.rb
50
56
  - lib/engram/rails/has_memory.rb
51
57
  - lib/engram/rails/observe_job.rb
58
+ - lib/engram/rails/tasks.rake
52
59
  - lib/engram/railtie.rb
53
60
  - lib/engram/record.rb
61
+ - lib/engram/reserved_metadata.rb
54
62
  - lib/engram/turn_digest.rb
55
63
  - lib/engram/use_cases/forget.rb
56
64
  - lib/engram/use_cases/inject.rb
57
65
  - lib/engram/use_cases/observe.rb
66
+ - lib/engram/use_cases/rebuild_embeddings.rb
58
67
  - lib/engram/use_cases/recall.rb
59
68
  - lib/engram/version.rb
60
69
  - lib/generators/engram/install_generator.rb
@@ -66,8 +75,9 @@ licenses:
66
75
  - MIT
67
76
  metadata:
68
77
  homepage_uri: https://github.com/kholdrex/engram
69
- source_code_uri: https://github.com/kholdrex/engram
78
+ source_code_uri: https://github.com/kholdrex/engram/tree/main
70
79
  changelog_uri: https://github.com/kholdrex/engram/blob/main/CHANGELOG.md
80
+ bug_tracker_uri: https://github.com/kholdrex/engram/issues
71
81
  rubygems_mfa_required: 'true'
72
82
  post_install_message:
73
83
  rdoc_options: []
@@ -84,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
94
  - !ruby/object:Gem::Version
85
95
  version: '0'
86
96
  requirements: []
87
- rubygems_version: 3.5.9
97
+ rubygems_version: 3.5.22
88
98
  signing_key:
89
99
  specification_version: 4
90
100
  summary: Long-term memory for AI agents in Ruby — stored in your own Postgres.