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 +4 -4
- data/lib/active_harness/memory/json_file.rb +44 -0
- data/lib/active_harness/memory.rb +1 -0
- data/lib/active_harness.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d2fe80bd5361b92a9c034f2dae4d069f381620867140dd7242d3a6ba24f3a429
|
|
4
|
+
data.tar.gz: 6cb9aaa5d2a388f8f79fe5794623fe8f0e49f4e19bffb352089e1069e8a8a6b0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
data/lib/active_harness.rb
CHANGED
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.
|
|
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
|