lex-cognitive-offloading 0.1.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.
@@ -0,0 +1,194 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/cognitive_offloading/client'
4
+
5
+ RSpec.describe Legion::Extensions::CognitiveOffloading::Runners::CognitiveOffloading do
6
+ let(:engine) { Legion::Extensions::CognitiveOffloading::Helpers::OffloadingEngine.new }
7
+ let(:client) { Legion::Extensions::CognitiveOffloading::Client.new(engine: engine) }
8
+
9
+ let(:store) do
10
+ client.register_store(name: 'test_store', store_type: :database)
11
+ engine.stores.values.first
12
+ end
13
+
14
+ before { store }
15
+
16
+ describe '#register_store' do
17
+ it 'returns success: true on valid registration' do
18
+ result = client.register_store(name: 'another_store', store_type: :file)
19
+ expect(result[:success]).to be true
20
+ end
21
+
22
+ it 'returns the store hash' do
23
+ result = client.register_store(name: 'notes', store_type: :notes)
24
+ expect(result[:store]).to include(:id, :name, :store_type, :trust)
25
+ end
26
+
27
+ it 'returns success: false when limit reached' do
28
+ stub_const('Legion::Extensions::CognitiveOffloading::Helpers::Constants::MAX_STORES', 1)
29
+ fresh = Legion::Extensions::CognitiveOffloading::Client.new
30
+ fresh.register_store(name: 'first', store_type: :file)
31
+ result = fresh.register_store(name: 'overflow', store_type: :file)
32
+ expect(result[:success]).to be false
33
+ expect(result[:reason]).to eq(:limit_reached)
34
+ end
35
+
36
+ it 'accepts an injected engine' do
37
+ injected = Legion::Extensions::CognitiveOffloading::Helpers::OffloadingEngine.new
38
+ result = client.register_store(name: 'injected', store_type: :agent, engine: injected)
39
+ expect(result[:success]).to be true
40
+ end
41
+ end
42
+
43
+ describe '#offload_item' do
44
+ it 'returns success: true on valid offload' do
45
+ result = client.offload_item(content: 'fact', item_type: :fact, importance: 0.7, store_id: store.id)
46
+ expect(result[:success]).to be true
47
+ end
48
+
49
+ it 'returns the item hash' do
50
+ result = client.offload_item(content: 'plan', item_type: :plan, importance: 0.8, store_id: store.id)
51
+ expect(result[:item]).to include(:id, :content, :item_type, :importance)
52
+ end
53
+
54
+ it 'returns success: false for unknown store_id' do
55
+ result = client.offload_item(content: 'x', item_type: :fact, importance: 0.5, store_id: 'bogus')
56
+ expect(result[:success]).to be false
57
+ expect(result[:reason]).to eq(:offload_failed)
58
+ end
59
+
60
+ it 'returns success: false when item limit reached' do
61
+ stub_const('Legion::Extensions::CognitiveOffloading::Helpers::Constants::MAX_ITEMS', 1)
62
+ client.offload_item(content: 'first', item_type: :fact, importance: 0.5, store_id: store.id)
63
+ result = client.offload_item(content: 'second', item_type: :fact, importance: 0.5, store_id: store.id)
64
+ expect(result[:success]).to be false
65
+ end
66
+ end
67
+
68
+ describe '#retrieve_item' do
69
+ let!(:offloaded) do
70
+ client.offload_item(content: 'my fact', item_type: :fact, importance: 0.6, store_id: store.id)[:item]
71
+ end
72
+
73
+ it 'returns success: true for known item' do
74
+ result = client.retrieve_item(item_id: offloaded[:id])
75
+ expect(result[:success]).to be true
76
+ end
77
+
78
+ it 'returns the item hash on success' do
79
+ result = client.retrieve_item(item_id: offloaded[:id])
80
+ expect(result[:item]).to include(:id, :retrieved_count)
81
+ end
82
+
83
+ it 'increments retrieved_count' do
84
+ client.retrieve_item(item_id: offloaded[:id])
85
+ result = client.retrieve_item(item_id: offloaded[:id])
86
+ expect(result[:item][:retrieved_count]).to eq(2)
87
+ end
88
+
89
+ it 'returns success: false for unknown item_id' do
90
+ result = client.retrieve_item(item_id: 'no-such-item')
91
+ expect(result[:success]).to be false
92
+ expect(result[:reason]).to eq(:not_found)
93
+ end
94
+ end
95
+
96
+ describe '#report_retrieval_failure' do
97
+ let!(:offloaded) do
98
+ client.offload_item(content: 'plan', item_type: :plan, importance: 0.5, store_id: store.id)[:item]
99
+ end
100
+
101
+ it 'returns success: true for known item' do
102
+ result = client.report_retrieval_failure(item_id: offloaded[:id])
103
+ expect(result[:success]).to be true
104
+ end
105
+
106
+ it 'returns current store_trust' do
107
+ result = client.report_retrieval_failure(item_id: offloaded[:id])
108
+ expect(result[:store_trust]).to be_a(Float)
109
+ end
110
+
111
+ it 'decays trust on the store' do
112
+ trust_before = store.trust
113
+ client.report_retrieval_failure(item_id: offloaded[:id])
114
+ expect(store.trust).to be < trust_before
115
+ end
116
+
117
+ it 'returns success: false for unknown item_id' do
118
+ result = client.report_retrieval_failure(item_id: 'ghost')
119
+ expect(result[:success]).to be false
120
+ expect(result[:reason]).to eq(:not_found)
121
+ end
122
+ end
123
+
124
+ describe '#items_in_store' do
125
+ it 'returns items belonging to the store' do
126
+ client.offload_item(content: 'a', item_type: :fact, importance: 0.5, store_id: store.id)
127
+ client.offload_item(content: 'b', item_type: :reminder, importance: 0.3, store_id: store.id)
128
+ result = client.items_in_store(store_id: store.id)
129
+ expect(result[:success]).to be true
130
+ expect(result[:count]).to eq(2)
131
+ end
132
+
133
+ it 'returns empty list for store with no items' do
134
+ result = client.items_in_store(store_id: store.id)
135
+ expect(result[:items]).to eq([])
136
+ end
137
+ end
138
+
139
+ describe '#items_by_type' do
140
+ before do
141
+ client.offload_item(content: 'a', item_type: :calculation, importance: 0.4, store_id: store.id)
142
+ client.offload_item(content: 'b', item_type: :calculation, importance: 0.6, store_id: store.id)
143
+ client.offload_item(content: 'c', item_type: :delegation, importance: 0.8, store_id: store.id)
144
+ end
145
+
146
+ it 'returns items of matching type' do
147
+ result = client.items_by_type(item_type: :calculation)
148
+ expect(result[:count]).to eq(2)
149
+ end
150
+
151
+ it 'returns 0 for unused type' do
152
+ result = client.items_by_type(item_type: :reference)
153
+ expect(result[:count]).to eq(0)
154
+ end
155
+ end
156
+
157
+ describe '#most_important_offloaded' do
158
+ before do
159
+ client.offload_item(content: 'low', item_type: :fact, importance: 0.2, store_id: store.id)
160
+ client.offload_item(content: 'high', item_type: :fact, importance: 0.95, store_id: store.id)
161
+ client.offload_item(content: 'mid', item_type: :fact, importance: 0.5, store_id: store.id)
162
+ end
163
+
164
+ it 'returns items in importance-descending order' do
165
+ result = client.most_important_offloaded(limit: 3)
166
+ importances = result[:items].map { |i| i[:importance] }
167
+ expect(importances).to eq(importances.sort.reverse)
168
+ end
169
+
170
+ it 'respects the limit parameter' do
171
+ result = client.most_important_offloaded(limit: 2)
172
+ expect(result[:count]).to eq(2)
173
+ end
174
+ end
175
+
176
+ describe '#offloading_status' do
177
+ it 'returns success: true' do
178
+ result = client.offloading_status
179
+ expect(result[:success]).to be true
180
+ end
181
+
182
+ it 'includes the offloading report' do
183
+ result = client.offloading_status
184
+ expect(result[:report]).to include(:total_items, :total_stores, :offloading_ratio,
185
+ :overall_store_trust, :stores_summary)
186
+ end
187
+
188
+ it 'reflects current item count' do
189
+ client.offload_item(content: 'x', item_type: :context, importance: 0.5, store_id: store.id)
190
+ result = client.offloading_status
191
+ expect(result[:report][:total_items]).to eq(1)
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ module Legion
6
+ module Logging
7
+ def self.debug(_msg); end
8
+ def self.info(_msg); end
9
+ def self.warn(_msg); end
10
+ def self.error(_msg); end
11
+ end
12
+ end
13
+
14
+ require 'legion/extensions/cognitive_offloading'
15
+
16
+ RSpec.configure do |config|
17
+ config.example_status_persistence_file_path = '.rspec_status'
18
+ config.disable_monkey_patching!
19
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
20
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-cognitive-offloading
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: legion-gaia
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ description: Strategic externalization of cognitive tasks — offloading decisions,
27
+ store trust, and retrieval tracking for brain-modeled agentic AI
28
+ email:
29
+ - matthewdiverson@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - Gemfile
35
+ - lex-cognitive-offloading.gemspec
36
+ - lib/legion/extensions/cognitive_offloading.rb
37
+ - lib/legion/extensions/cognitive_offloading/client.rb
38
+ - lib/legion/extensions/cognitive_offloading/helpers/constants.rb
39
+ - lib/legion/extensions/cognitive_offloading/helpers/external_store.rb
40
+ - lib/legion/extensions/cognitive_offloading/helpers/offloaded_item.rb
41
+ - lib/legion/extensions/cognitive_offloading/helpers/offloading_engine.rb
42
+ - lib/legion/extensions/cognitive_offloading/runners/cognitive_offloading.rb
43
+ - lib/legion/extensions/cognitive_offloading/version.rb
44
+ - spec/legion/extensions/cognitive_offloading/client_spec.rb
45
+ - spec/legion/extensions/cognitive_offloading/helpers/constants_spec.rb
46
+ - spec/legion/extensions/cognitive_offloading/helpers/external_store_spec.rb
47
+ - spec/legion/extensions/cognitive_offloading/helpers/offloaded_item_spec.rb
48
+ - spec/legion/extensions/cognitive_offloading/helpers/offloading_engine_spec.rb
49
+ - spec/legion/extensions/cognitive_offloading/runners/cognitive_offloading_spec.rb
50
+ - spec/spec_helper.rb
51
+ homepage: https://github.com/LegionIO/lex-cognitive-offloading
52
+ licenses:
53
+ - MIT
54
+ metadata:
55
+ homepage_uri: https://github.com/LegionIO/lex-cognitive-offloading
56
+ source_code_uri: https://github.com/LegionIO/lex-cognitive-offloading
57
+ documentation_uri: https://github.com/LegionIO/lex-cognitive-offloading
58
+ changelog_uri: https://github.com/LegionIO/lex-cognitive-offloading
59
+ bug_tracker_uri: https://github.com/LegionIO/lex-cognitive-offloading/issues
60
+ rubygems_mfa_required: 'true'
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubygems_version: 3.6.9
76
+ specification_version: 4
77
+ summary: LEX Cognitive Offloading
78
+ test_files: []