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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f2eeb2cf5c59ddd76d509d628a809ebe903d9881f5dca8617f511331baaecf7
4
- data.tar.gz: 25d07e7d421013bef9ba175011461cbdab6d8370d81e54e8fc742429bbe5473d
3
+ metadata.gz: 55ad6219a4374a7aeb4688533bcf7a0a68ebb166de2d96d2e9953eb6814fe5c5
4
+ data.tar.gz: 89e4e0413d96f90dd30d4203fa4023331663b2818a5df89c0a60a6975fb8bcb9
5
5
  SHA512:
6
- metadata.gz: 36eab4ddb395657b6bac444f4347cdf783d130e4370c300da944c9636e87ac6ee310b3af98029e2aaffa318d7632a6ae5a89c7168e4a7ae8b247f4b640ba40da
7
- data.tar.gz: f2926d63179b15cc08706c4e5b29a4b5f5a8cf32015ad4d62e266eaff6049951d7afe238eb7b2340038dcee0c14f602ad37b9651b801b2c9a775997055df3851
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
- raise NotImplementedError
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
- raise NotImplementedError
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
- raise NotImplementedError
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
- raise NotImplementedError
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
- @store = {}
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ask
4
4
  module Agent
5
- VERSION = "0.6.0"
5
+ VERSION = "0.6.1"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ask-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaka Ruto