active_harness 0.2.23 → 0.2.24

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0bf8ac57d79582b07a2d82b29be4541fcaf10b3ee8492d362d6ac10f2843537d
4
- data.tar.gz: cabffcc74dd594c5222a8e0233aa9d5f7276d65cfa06848d3e2684e19efe393e
3
+ metadata.gz: d2fe80bd5361b92a9c034f2dae4d069f381620867140dd7242d3a6ba24f3a429
4
+ data.tar.gz: 6cb9aaa5d2a388f8f79fe5794623fe8f0e49f4e19bffb352089e1069e8a8a6b0
5
5
  SHA512:
6
- metadata.gz: '018677f5498399d22c2a1b497649e4676023eae7b2578b8b0c13962b1c443970f20e2af5e7ca15051f75d2903287ed9f12012407cf9a671ad1d5d688d8def153'
7
- data.tar.gz: 5219e6c2a208ff1a2215a71d924c24ade46b6abebc94e9a21c7a36d931d9e32919e7ddc5b054ff7bb616b46057761138aa1a01ce21e66ef6978bb5802304cabe
6
+ metadata.gz: 56050efdb3f23d189fbca002200699b6c98b7419eb5ec428b52ff5e9149065c4fa5d01822c448e632de23ce4bf291c5c50f80207ff46d6aa449bb0d01c5c1ba8
7
+ data.tar.gz: 0f3b7726fa25f362d2d660c9f5474255da6c45db0ad26b03a24245e7973f64d87cfe78793e7a75fb80014c6a109a0b3ac33df134e65dabde9863d037b6760a1b
@@ -0,0 +1,44 @@
1
+ module ActiveHarness
2
+ class Memory
3
+ # File-backed memory with a path-safe file_name interface.
4
+ #
5
+ # Differences from the base Memory class:
6
+ # - file_name: replaces session_id — may contain slashes to create
7
+ # subdirectories under storage_path, e.g. "users/42/chat"
8
+ # Final file is always <storage_path>/<file_name>.json
9
+ # - storage_path: replaces the adapter-level path: option
10
+ # - adapter: always :file — no other adapter can be passed
11
+ #
12
+ # Path traversal is rejected: segments equal to "." or ".." or containing
13
+ # null bytes raise ArgumentError before any file I/O happens.
14
+ # Missing directories are created automatically on the first write.
15
+ class JsonFile < Memory
16
+ DEFAULT_STORAGE_PATH = "storage/ai/memory"
17
+
18
+ def initialize(file_name:, storage_path: DEFAULT_STORAGE_PATH, **opts)
19
+ super(
20
+ session_id: sanitize!(file_name),
21
+ adapter: :file,
22
+ path: storage_path,
23
+ **opts
24
+ )
25
+ end
26
+
27
+ private
28
+
29
+ def sanitize!(raw)
30
+ parts = raw.to_s.split("/").map(&:strip).reject(&:empty?)
31
+ raise ArgumentError, "file_name must not be empty" if parts.empty?
32
+
33
+ parts.each do |part|
34
+ if part == ".." || part == "." || part.include?("\0")
35
+ raise ArgumentError, "Invalid file_name segment: #{part.inspect}"
36
+ end
37
+ end
38
+
39
+ parts.last.sub!(/\.json\z/i, "")
40
+ parts.join("/")
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,5 +1,6 @@
1
1
  require_relative "memory/adapter/base"
2
2
  require_relative "memory/adapter/file"
3
+ require_relative "memory/json_file"
3
4
 
4
5
  module ActiveHarness
5
6
  # Conversational memory for agents.
@@ -30,7 +30,7 @@ require_relative "active_harness/pipeline"
30
30
  require_relative "active_harness/railtie" if defined?(Rails::Railtie)
31
31
 
32
32
  module ActiveHarness
33
- VERSION = "0.2.23"
33
+ VERSION = "0.2.24"
34
34
 
35
35
  class << self
36
36
  # Configure ActiveHarness.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_harness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.23
4
+ version: 0.2.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - the-teacher
@@ -51,6 +51,7 @@ files:
51
51
  - lib/active_harness/memory.rb
52
52
  - lib/active_harness/memory/adapter/base.rb
53
53
  - lib/active_harness/memory/adapter/file.rb
54
+ - lib/active_harness/memory/json_file.rb
54
55
  - lib/active_harness/pipeline.rb
55
56
  - lib/active_harness/pipeline/hooks.rb
56
57
  - lib/active_harness/pipeline/step.rb