ask-agent 0.6.0 → 0.6.1
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/CHANGELOG.md +8 -0
- data/lib/ask/agent/persistence/base.rb +50 -4
- data/lib/ask/agent/persistence/in_memory.rb +3 -18
- data/lib/ask/agent/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 55ad6219a4374a7aeb4688533bcf7a0a68ebb166de2d96d2e9953eb6814fe5c5
|
|
4
|
+
data.tar.gz: 89e4e0413d96f90dd30d4203fa4023331663b2818a5df89c0a60a6975fb8bcb9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9557223b85bc04778cd6821a9b7807818e06ac85124d95f79469db613a7a23d8e8317db5e6454517adf5b67fd68806eafc4ec145f8c3ea08d01de93d4f939a91
|
|
7
|
+
data.tar.gz: 53d3a056d6c8004bdd32536f3781bae6a0bee21bd12f1af12bc3eefab02e3f229df6109c8f5f2c6802229177aa28c27a17804bb348e93c4898adce62289222d5
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## [0.6.1] — 2026-07-21
|
|
2
|
+
|
|
3
|
+
### Changed
|
|
4
|
+
|
|
5
|
+
- **`Persistence::Base` now wraps `Ask::State::Adapter`** (from ask-core 0.3.0). Session persistence is backed by the unified state interface instead of a standalone abstract class. `Persistence::InMemory` delegates to `Ask::State::Memory`. The public API is unchanged — `save`, `load`, `delete`, and `list` work identically.
|
|
6
|
+
- **`Persistence::Base.new` accepts `state_adapter:` keyword** for custom backends. Defaults to `Ask::State::Memory` (same behavior as before).
|
|
7
|
+
- **`Persistence::Base#list`** now returns a deduplicated list ordered by most-recently-saved.
|
|
8
|
+
|
|
1
9
|
## [0.6.0] — 2026-07-21
|
|
2
10
|
|
|
3
11
|
### Added
|
|
@@ -3,21 +3,67 @@
|
|
|
3
3
|
module Ask
|
|
4
4
|
module Agent
|
|
5
5
|
module Persistence
|
|
6
|
+
# Session persistence backed by a generic {Ask::State::Adapter}.
|
|
7
|
+
#
|
|
8
|
+
# This wraps session data under namespaced keys so multiple sessions
|
|
9
|
+
# can coexist in the same state backend alongside other data.
|
|
10
|
+
#
|
|
11
|
+
# @example With the default in-memory store
|
|
12
|
+
# store = Persistence::InMemory.new
|
|
13
|
+
# store.save("session-1", { messages: [...] })
|
|
14
|
+
# store.load("session-1")
|
|
15
|
+
#
|
|
16
|
+
# @example With a custom state adapter (e.g. Redis)
|
|
17
|
+
# store = Persistence::Base.new(
|
|
18
|
+
# state_adapter: MyRedisAdapter.new
|
|
19
|
+
# )
|
|
20
|
+
# store.save("session-1", data)
|
|
6
21
|
class Base
|
|
22
|
+
KEY_PREFIX = "ask:session:"
|
|
23
|
+
INDEX_KEY = "ask:session:index"
|
|
24
|
+
|
|
25
|
+
# @param state_adapter [Ask::State::Adapter] backend store (defaults to Memory)
|
|
26
|
+
def initialize(state_adapter: nil)
|
|
27
|
+
@state = state_adapter || Ask::State::Memory.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @return [Ask::State::Adapter] the underlying state adapter
|
|
31
|
+
attr_reader :state
|
|
32
|
+
|
|
33
|
+
# Persist a session.
|
|
34
|
+
# @param session_id [String] the session identifier
|
|
35
|
+
# @param data [Hash] the session data
|
|
7
36
|
def save(session_id, data)
|
|
8
|
-
|
|
37
|
+
@state.set(key(session_id), data)
|
|
38
|
+
# Keep the index list unique — remove existing entry first then append
|
|
39
|
+
@state.list_remove(INDEX_KEY, session_id)
|
|
40
|
+
@state.list_append(INDEX_KEY, session_id)
|
|
9
41
|
end
|
|
10
42
|
|
|
43
|
+
# Load a session.
|
|
44
|
+
# @param session_id [String] the session identifier
|
|
45
|
+
# @return [Hash, nil] the session data, or nil if not found
|
|
11
46
|
def load(session_id)
|
|
12
|
-
|
|
47
|
+
@state.get(key(session_id))
|
|
13
48
|
end
|
|
14
49
|
|
|
50
|
+
# Delete a session.
|
|
51
|
+
# @param session_id [String] the session identifier
|
|
15
52
|
def delete(session_id)
|
|
16
|
-
|
|
53
|
+
@state.delete(key(session_id))
|
|
54
|
+
@state.list_remove(INDEX_KEY, session_id)
|
|
17
55
|
end
|
|
18
56
|
|
|
57
|
+
# List all stored session IDs.
|
|
58
|
+
# @return [Array<String>] list of session IDs
|
|
19
59
|
def list
|
|
20
|
-
|
|
60
|
+
@state.list_range(INDEX_KEY, 0, -1)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
def key(session_id)
|
|
66
|
+
"#{KEY_PREFIX}#{session_id}"
|
|
21
67
|
end
|
|
22
68
|
end
|
|
23
69
|
end
|
|
@@ -3,26 +3,11 @@
|
|
|
3
3
|
module Ask
|
|
4
4
|
module Agent
|
|
5
5
|
module Persistence
|
|
6
|
+
# In-memory session persistence. Backed by {Ask::State::Memory}.
|
|
7
|
+
# Data is lost when the process exits.
|
|
6
8
|
class InMemory < Base
|
|
7
9
|
def initialize
|
|
8
|
-
|
|
9
|
-
@mutex = Mutex.new
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def save(session_id, data)
|
|
13
|
-
@mutex.synchronize { @store[session_id] = data }
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def load(session_id)
|
|
17
|
-
@mutex.synchronize { @store[session_id] }
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def delete(session_id)
|
|
21
|
-
@mutex.synchronize { @store.delete(session_id) }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def list
|
|
25
|
-
@mutex.synchronize { @store.keys }
|
|
10
|
+
super(state_adapter: Ask::State::Memory.new)
|
|
26
11
|
end
|
|
27
12
|
end
|
|
28
13
|
end
|
data/lib/ask/agent/version.rb
CHANGED