lex-agentic-affect 0.1.1 → 0.1.3
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 +6 -0
- data/README.md +46 -3
- data/lex-agentic-affect.gemspec +8 -0
- data/lib/legion/extensions/agentic/affect/emotion/runners/valence.rb +12 -0
- data/lib/legion/extensions/agentic/affect/version.rb +1 -1
- data/spec/legion/extensions/agentic/affect/emotion/runners/valence_spec.rb +35 -0
- data/spec/spec_helper.rb +26 -21
- metadata +99 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7faabfbdd7855f8e1abde4e78b84236bc283cdd9f8be4dd236b6e4489dbe8da4
|
|
4
|
+
data.tar.gz: 8e8f67e1429766e253ff090e5c9af4ea806811e91ac67187dd30902908a1e58d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 23d283a86cb3cc7e54181bf36f4c4eb0617b631eb99b27f5c48e7b9ad169e108bb527910d5c60892c5078219bc9ed5f5615697b170b0e11b8a816c2943b77a69
|
|
7
|
+
data.tar.gz: 3b11c7e233013c27d39e33d19e7d86593b293c106c167cf710b27f828893f7491402256c75a4b30fadb168a47d5ce4632b799d3af1b207e34cac14088b5a121f
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.1.3] - 2026-03-22
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Add 7 runtime sub-gem dependencies to gemspec (legion-cache, legion-crypt, legion-data, legion-json, legion-logging, legion-settings, legion-transport)
|
|
7
|
+
- Replace stubbed spec_helper with real sub-gem helpers and proper Helpers::Lex wiring
|
|
8
|
+
|
|
3
9
|
## [0.1.1] - 2026-03-18
|
|
4
10
|
|
|
5
11
|
### Fixed
|
data/README.md
CHANGED
|
@@ -1,13 +1,56 @@
|
|
|
1
1
|
# lex-agentic-affect
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Domain consolidation gem for emotion, affect, and motivational processing. Bundles 17 source extensions into one loadable unit under `Legion::Extensions::Agentic::Affect`.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Overview
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**Gem**: `lex-agentic-affect`
|
|
8
|
+
**Version**: 0.1.1
|
|
9
|
+
**Namespace**: `Legion::Extensions::Agentic::Affect`
|
|
10
|
+
|
|
11
|
+
## Sub-Modules
|
|
12
|
+
|
|
13
|
+
| Sub-Module | Source Gem | Purpose |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `Affect::Emotion` | `lex-emotion` | Four-dimensional emotional valence/arousal, EMA momentum, gut instinct |
|
|
16
|
+
| `Affect::Mood` | `lex-mood` | Background mood baseline distinct from discrete emotions |
|
|
17
|
+
| `Affect::Appraisal` | `lex-appraisal` | Lazarus appraisal theory — primary/secondary appraisal of events |
|
|
18
|
+
| `Affect::CognitiveEmpathy` | `lex-cognitive-empathy` | Cognitive empathy processing |
|
|
19
|
+
| `Affect::Empathy` | `lex-empathy` | Affective and cognitive empathy |
|
|
20
|
+
| `Affect::Reappraisal` | `lex-cognitive-reappraisal` | Gross process model — six emotion regulation strategies |
|
|
21
|
+
| `Affect::Regulation` | `lex-emotional-regulation` | Regulation strategy selection and effectiveness tracking |
|
|
22
|
+
| `Affect::Defusion` | `lex-cognitive-defusion` | ACT-style cognitive defusion from difficult thoughts |
|
|
23
|
+
| `Affect::Contagion` | `lex-cognitive-contagion` | Emotional contagion spread across agent interactions |
|
|
24
|
+
| `Affect::SomaticMarker` | `lex-somatic-marker` | Damasio somatic marker hypothesis — gut-feeling tagging |
|
|
25
|
+
| `Affect::Interoception` | `lex-interoception` | Internal body state signals (fatigue, tension, arousal) |
|
|
26
|
+
| `Affect::Flow` | `lex-flow` | Csikszentmihalyi flow state |
|
|
27
|
+
| `Affect::Fatigue` | `lex-fatigue` | Mental fatigue accumulation and recovery modeling |
|
|
28
|
+
| `Affect::Motivation` | `lex-motivation` | Drive states — homeostatic and intrinsic motivation |
|
|
29
|
+
| `Affect::Reward` | `lex-reward` | Reward signal computation and prediction error |
|
|
30
|
+
| `Affect::Resilience` | `lex-resilience` | Recovery capacity and stress inoculation |
|
|
31
|
+
| `Affect::Resonance` | `lex-cognitive-resonance` | Affective resonance patterns |
|
|
32
|
+
|
|
33
|
+
## Actors
|
|
34
|
+
|
|
35
|
+
- `Affect::Emotion::Actors::MomentumDecay` — runs every 60s, decays emotional momentum via `decay_momentum`
|
|
36
|
+
- `Affect::Interoception::Actors::Decay` — interval actor, decays interoceptive body state signals
|
|
37
|
+
- `Affect::Reappraisal::Actors::AutoRegulate` — runs every 300s, processes pending emotional events
|
|
38
|
+
- `Affect::SomaticMarker::Actors::Decay` — interval actor, decays somatic marker strength
|
|
8
39
|
|
|
9
40
|
## Installation
|
|
10
41
|
|
|
11
42
|
```ruby
|
|
12
43
|
gem 'lex-agentic-affect'
|
|
13
44
|
```
|
|
45
|
+
|
|
46
|
+
## Development
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
bundle install
|
|
50
|
+
bundle exec rspec # 1523 examples, 0 failures
|
|
51
|
+
bundle exec rubocop # 0 offenses
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## License
|
|
55
|
+
|
|
56
|
+
MIT
|
data/lex-agentic-affect.gemspec
CHANGED
|
@@ -24,6 +24,14 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
end
|
|
25
25
|
spec.require_paths = ['lib']
|
|
26
26
|
|
|
27
|
+
spec.add_dependency 'legion-cache', '>= 1.3.11'
|
|
28
|
+
spec.add_dependency 'legion-crypt', '>= 1.4.9'
|
|
29
|
+
spec.add_dependency 'legion-data', '>= 1.4.17'
|
|
30
|
+
spec.add_dependency 'legion-json', '>= 1.2.1'
|
|
31
|
+
spec.add_dependency 'legion-logging', '>= 1.3.2'
|
|
32
|
+
spec.add_dependency 'legion-settings', '>= 1.3.14'
|
|
33
|
+
spec.add_dependency 'legion-transport', '>= 1.3.9'
|
|
34
|
+
|
|
27
35
|
spec.add_development_dependency 'rspec', '~> 3.13'
|
|
28
36
|
spec.add_development_dependency 'rubocop', '~> 1.60'
|
|
29
37
|
spec.add_development_dependency 'rubocop-rspec', '~> 2.26'
|
|
@@ -72,6 +72,18 @@ module Legion
|
|
|
72
72
|
{ arousal: arousal }
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
+
def raise_urgency_for_knowledge_vulnerability(domains_at_risk:, severity: :warning, urgency_boost: 0.3, **)
|
|
76
|
+
boost = severity.to_sym == :critical ? [urgency_boost * 1.5, 1.0].min : urgency_boost.to_f
|
|
77
|
+
signal = { urgency_hint: boost, domain_weight: 0.6, impact_scope: 0.5,
|
|
78
|
+
outcome_severity: boost, novelty_score: 0.3 }
|
|
79
|
+
result = evaluate_valence(signal: signal, source_type: :mesh_priority)
|
|
80
|
+
|
|
81
|
+
Legion::Logging.info "[emotion] knowledge_vulnerability urgency raised: domains=#{Array(domains_at_risk).join(',')} " \
|
|
82
|
+
"severity=#{severity} boost=#{boost.round(2)} urgency=#{result[:valence][:urgency].round(2)}"
|
|
83
|
+
|
|
84
|
+
result.merge(event: :knowledge_vulnerability, domains_at_risk: Array(domains_at_risk), urgency_boost: boost)
|
|
85
|
+
end
|
|
86
|
+
|
|
75
87
|
private
|
|
76
88
|
|
|
77
89
|
def emotion_baseline
|
|
@@ -64,4 +64,39 @@ RSpec.describe Legion::Extensions::Agentic::Affect::Emotion::Runners::Valence do
|
|
|
64
64
|
expect(result[:arousal]).to be > 0.0
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
|
+
|
|
68
|
+
describe '#raise_urgency_for_knowledge_vulnerability' do
|
|
69
|
+
it 'returns a valence result with event tag' do
|
|
70
|
+
result = client.raise_urgency_for_knowledge_vulnerability(domains_at_risk: %w[pki vault])
|
|
71
|
+
expect(result[:event]).to eq(:knowledge_vulnerability)
|
|
72
|
+
expect(result[:domains_at_risk]).to eq(%w[pki vault])
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it 'includes urgency_boost in the result' do
|
|
76
|
+
result = client.raise_urgency_for_knowledge_vulnerability(domains_at_risk: ['pki'])
|
|
77
|
+
expect(result[:urgency_boost]).to be > 0.0
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it 'raises urgency higher for critical severity than warning' do
|
|
81
|
+
warning = client.raise_urgency_for_knowledge_vulnerability(
|
|
82
|
+
domains_at_risk: ['pki'], severity: :warning
|
|
83
|
+
)
|
|
84
|
+
critical = client.raise_urgency_for_knowledge_vulnerability(
|
|
85
|
+
domains_at_risk: ['pki'], severity: :critical
|
|
86
|
+
)
|
|
87
|
+
expect(critical[:urgency_boost]).to be > warning[:urgency_boost]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'returns a valence hash with all four dimensions' do
|
|
91
|
+
result = client.raise_urgency_for_knowledge_vulnerability(domains_at_risk: ['dns'])
|
|
92
|
+
expect(result[:valence].keys).to contain_exactly(:urgency, :importance, :novelty, :familiarity)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'accepts a custom urgency_boost' do
|
|
96
|
+
result = client.raise_urgency_for_knowledge_vulnerability(
|
|
97
|
+
domains_at_risk: ['ssh'], urgency_boost: 0.5
|
|
98
|
+
)
|
|
99
|
+
expect(result[:urgency_boost]).to be_within(0.01).of(0.5)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
67
102
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,41 +1,46 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'bundler/setup'
|
|
4
|
+
require 'legion/logging'
|
|
5
|
+
require 'legion/settings'
|
|
6
|
+
require 'legion/cache/helper'
|
|
7
|
+
require 'legion/crypt/helper'
|
|
8
|
+
require 'legion/data/helper'
|
|
9
|
+
require 'legion/json/helper'
|
|
10
|
+
require 'legion/transport'
|
|
4
11
|
|
|
5
12
|
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
|
-
def self.fatal(_msg); end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
13
|
module Extensions
|
|
15
|
-
module Core
|
|
16
|
-
def self.extended(_base); end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
14
|
module Helpers
|
|
20
15
|
module Lex
|
|
21
|
-
|
|
16
|
+
include Legion::Logging::Helper
|
|
17
|
+
include Legion::Settings::Helper
|
|
18
|
+
include Legion::Cache::Helper
|
|
19
|
+
include Legion::Crypt::Helper
|
|
20
|
+
include Legion::Data::Helper
|
|
21
|
+
include Legion::JSON::Helper
|
|
22
|
+
include Legion::Transport::Helper
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
25
|
|
|
27
|
-
# rubocop:disable Lint/EmptyClass, Style/OneClassPerFile
|
|
28
|
-
module Legion
|
|
29
|
-
module Extensions
|
|
30
26
|
module Actors
|
|
31
|
-
class Every
|
|
32
|
-
|
|
27
|
+
class Every
|
|
28
|
+
include Helpers::Lex
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Once
|
|
32
|
+
include Helpers::Lex
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class Subscription
|
|
36
|
+
include Helpers::Lex
|
|
37
|
+
end
|
|
33
38
|
end
|
|
34
39
|
end
|
|
35
40
|
end
|
|
41
|
+
|
|
36
42
|
$LOADED_FEATURES << 'legion/extensions/actors/every'
|
|
37
43
|
$LOADED_FEATURES << 'legion/extensions/actors/once'
|
|
38
|
-
# rubocop:enable Lint/EmptyClass, Style/OneClassPerFile
|
|
39
44
|
|
|
40
45
|
require 'legion/extensions/agentic/affect'
|
|
41
46
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-agentic-affect
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Esity
|
|
@@ -9,6 +9,104 @@ bindir: bin
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: legion-cache
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: 1.3.11
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: 1.3.11
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: legion-crypt
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 1.4.9
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: 1.4.9
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: legion-data
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 1.4.17
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 1.4.17
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: legion-json
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: 1.2.1
|
|
61
|
+
type: :runtime
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: 1.2.1
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: legion-logging
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: 1.3.2
|
|
75
|
+
type: :runtime
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: 1.3.2
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: legion-settings
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: 1.3.14
|
|
89
|
+
type: :runtime
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - ">="
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: 1.3.14
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: legion-transport
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - ">="
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: 1.3.9
|
|
103
|
+
type: :runtime
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: 1.3.9
|
|
12
110
|
- !ruby/object:Gem::Dependency
|
|
13
111
|
name: rspec
|
|
14
112
|
requirement: !ruby/object:Gem::Requirement
|