lex-synapse 0.2.2

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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +16 -0
  3. data/.gitignore +11 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +53 -0
  6. data/CHANGELOG.md +36 -0
  7. data/CLAUDE.md +98 -0
  8. data/Gemfile +16 -0
  9. data/README.md +156 -0
  10. data/Rakefile +7 -0
  11. data/lex-synapse.gemspec +31 -0
  12. data/lib/legion/extensions/synapse/actors/crystallize.rb +31 -0
  13. data/lib/legion/extensions/synapse/actors/decay.rb +31 -0
  14. data/lib/legion/extensions/synapse/actors/evaluate.rb +23 -0
  15. data/lib/legion/extensions/synapse/actors/homeostasis.rb +31 -0
  16. data/lib/legion/extensions/synapse/actors/pain.rb +23 -0
  17. data/lib/legion/extensions/synapse/client.rb +62 -0
  18. data/lib/legion/extensions/synapse/data/migrations/001_create_synapses.rb +26 -0
  19. data/lib/legion/extensions/synapse/data/migrations/002_create_synapse_mutations.rb +21 -0
  20. data/lib/legion/extensions/synapse/data/migrations/003_create_synapse_signals.rb +20 -0
  21. data/lib/legion/extensions/synapse/data/models/synapse.rb +16 -0
  22. data/lib/legion/extensions/synapse/data/models/synapse_mutation.rb +15 -0
  23. data/lib/legion/extensions/synapse/data/models/synapse_signal.rb +15 -0
  24. data/lib/legion/extensions/synapse/helpers/confidence.rb +75 -0
  25. data/lib/legion/extensions/synapse/helpers/homeostasis.rb +43 -0
  26. data/lib/legion/extensions/synapse/helpers/relationship_wrapper.rb +42 -0
  27. data/lib/legion/extensions/synapse/runners/crystallize.rb +45 -0
  28. data/lib/legion/extensions/synapse/runners/dream.rb +106 -0
  29. data/lib/legion/extensions/synapse/runners/evaluate.rb +101 -0
  30. data/lib/legion/extensions/synapse/runners/gaia_report.rb +68 -0
  31. data/lib/legion/extensions/synapse/runners/mutate.rb +67 -0
  32. data/lib/legion/extensions/synapse/runners/pain.rb +78 -0
  33. data/lib/legion/extensions/synapse/runners/promote.rb +79 -0
  34. data/lib/legion/extensions/synapse/runners/report.rb +50 -0
  35. data/lib/legion/extensions/synapse/runners/retrieve.rb +61 -0
  36. data/lib/legion/extensions/synapse/runners/revert.rb +58 -0
  37. data/lib/legion/extensions/synapse/transport/exchanges/synapse.rb +16 -0
  38. data/lib/legion/extensions/synapse/transport/messages/pain.rb +23 -0
  39. data/lib/legion/extensions/synapse/transport/messages/signal.rb +23 -0
  40. data/lib/legion/extensions/synapse/transport/queues/evaluate.rb +19 -0
  41. data/lib/legion/extensions/synapse/transport/queues/pain.rb +19 -0
  42. data/lib/legion/extensions/synapse/transport.rb +18 -0
  43. data/lib/legion/extensions/synapse/version.rb +9 -0
  44. data/lib/legion/extensions/synapse.rb +20 -0
  45. metadata +118 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c1961edd72029f290abdb673e1a4b23736cdc52b963d11243e4f47e4f38c65f1
4
+ data.tar.gz: 83be98e416e226e960e331fa24c197f99ff236cc419ea5afd26b050ee6e09fcd
5
+ SHA512:
6
+ metadata.gz: ef8000741910d6a3532cafb21a4c82924e17067359609524d41df993947677bc7fe6f505f3230cbdc94a89cca0c6a8e3db7a026a77aed2a4edb5f1a43030c227
7
+ data.tar.gz: 86fccd6c3ecb7f4a43c0a5030c21a82af341ea50fc7e0b4e334ef77718c637358018a5fca556361ab2a26c2870879db1d54eb91505a947b9fbf3779aa05f16a4
@@ -0,0 +1,16 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+
7
+ jobs:
8
+ ci:
9
+ uses: LegionIO/.github/.github/workflows/ci.yml@main
10
+
11
+ release:
12
+ needs: ci
13
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
14
+ uses: LegionIO/.github/.github/workflows/release.yml@main
15
+ secrets:
16
+ rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *.gem
10
+ Gemfile.lock
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,53 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.4
3
+ NewCops: enable
4
+ SuggestExtensions: false
5
+
6
+ Layout/LineLength:
7
+ Max: 160
8
+ Layout/SpaceAroundEqualsInParameterDefault:
9
+ EnforcedStyle: space
10
+ Layout/HashAlignment:
11
+ EnforcedHashRocketStyle: table
12
+ EnforcedColonStyle: table
13
+
14
+ Metrics/MethodLength:
15
+ Max: 50
16
+ Metrics/ClassLength:
17
+ Max: 1500
18
+ Metrics/ModuleLength:
19
+ Max: 1500
20
+ Metrics/BlockLength:
21
+ Max: 40
22
+ Exclude:
23
+ - 'spec/**/*'
24
+ Metrics/AbcSize:
25
+ Max: 60
26
+ Metrics/CyclomaticComplexity:
27
+ Max: 15
28
+ Metrics/PerceivedComplexity:
29
+ Max: 17
30
+ Metrics/ParameterLists:
31
+ Enabled: false
32
+
33
+ Style/Documentation:
34
+ Enabled: false
35
+ Style/SymbolArray:
36
+ Enabled: true
37
+ Style/FrozenStringLiteralComment:
38
+ Enabled: true
39
+ EnforcedStyle: always
40
+
41
+ Naming/FileName:
42
+ Enabled: false
43
+ Naming/PredicateMethod:
44
+ Enabled: false
45
+ Naming/PredicatePrefix:
46
+ Enabled: false
47
+
48
+ Gemspec/DevelopmentDependencies:
49
+ Enabled: false
50
+
51
+ Lint/EmptyClass:
52
+ Exclude:
53
+ - 'spec/**/*'
data/CHANGELOG.md ADDED
@@ -0,0 +1,36 @@
1
+ # Changelog
2
+
3
+ ## [0.2.2] - 2026-03-18
4
+
5
+ ### Fixed
6
+ - Remove local path references from Gemfile (lex-conditioner, lex-transformer)
7
+
8
+ ## [0.2.1] - 2026-03-18
9
+
10
+ ### Changed
11
+ - Extract VALID_STATUSES, EVALUABLE_STATUSES, VALID_ORIGINS, VALID_OUTCOMES constants into Confidence module
12
+ - Replace inline status array in Evaluate#evaluate with EVALUABLE_STATUSES constant reference
13
+
14
+ ## [0.2.0] - 2026-03-17
15
+
16
+ ### Added
17
+ - `Runners::GaiaReport` with `gaia_summary` (tick-consumable stats) and `gaia_reflection` (mutation tally + summary for post-tick)
18
+ - `Runners::Dream` with `dream_replay` (read-only mutation timeline) and `dream_simulate` (what-if without modifying state)
19
+ - `Runners::Promote` pushes high-confidence synapse patterns to Apollo (threshold: confidence >= 0.9, no reverts in 24h)
20
+ - `Runners::Retrieve` seeds new synapses from Apollo knowledge entries (threshold: entry confidence >= 0.7)
21
+ - Client includes all 4 new runner modules
22
+ - 92 new specs (303 total), 96% coverage
23
+
24
+ ## [0.1.0] - 2026-03-17
25
+
26
+ ### Added
27
+ - Cognitive routing layer for LegionIO task chains
28
+ - Data model: `synapses`, `synapse_mutations`, `synapse_signals` tables with Sequel migrations
29
+ - Confidence scoring: starting scores by origin (explicit=0.7, emergent=0.3, seeded=0.5), event-based adjustments, idle decay, autonomy ranges (OBSERVE/FILTER/TRANSFORM/AUTONOMOUS)
30
+ - Homeostasis: spike detection (>3x baseline for 60s), drought detection (0 throughput for 10x avg interval), exponential moving average baseline tracking
31
+ - 6 core runners: evaluate (attention+transform+route+record), pain (failure handling, auto-revert), crystallize (emergent synapse creation), mutate (versioned self-modification), revert (rollback to previous version), report (aggregated stats)
32
+ - 5 actors: evaluate (subscription), pain (subscription), crystallize (every 5min), homeostasis (every 30s), decay (every 1hr)
33
+ - Transport layer: synapse exchange, evaluate/pain queues, signal/pain messages
34
+ - Standalone `Client` class with injected conditioner/transformer clients
35
+ - `RelationshipWrapper` helper for wrapping Layer 1 relationships as synapses
36
+ - 211 specs, 94%+ coverage
data/CLAUDE.md ADDED
@@ -0,0 +1,98 @@
1
+ # lex-synapse: Cognitive Routing Layer for LegionIO
2
+
3
+ **Repository Level 3 Documentation**
4
+ - **Parent**: `/Users/miverso2/rubymine/legion/extensions-core/CLAUDE.md`
5
+ - **Grandparent**: `/Users/miverso2/rubymine/legion/CLAUDE.md`
6
+
7
+ ## Purpose
8
+
9
+ Cognitive routing layer that wraps task chain relationships with observation, learning, confidence scoring, pain signals, homeostasis, and self-governance. Sits between Layer 1 (explicit user-defined relationships in lex-tasker) and Layer 3 (GAIA cognitive coordination + Apollo shared knowledge).
10
+
11
+ **GitHub**: https://github.com/LegionIO/lex-synapse
12
+ **License**: MIT
13
+ **Version**: 0.2.2
14
+
15
+ ## Architecture
16
+
17
+ ```
18
+ Legion::Extensions::Synapse
19
+ ├── Actors/
20
+ │ ├── Evaluate # Subscription — main signal evaluation
21
+ │ ├── Pain # Subscription — task.failed handler
22
+ │ ├── Crystallize # Every 300s — emergent synapse detection
23
+ │ ├── Homeostasis # Every 30s — spike/drought monitoring
24
+ │ └── Decay # Every 3600s — idle confidence decay
25
+ ├── Runners/
26
+ │ ├── Evaluate # attention -> transform -> route -> record
27
+ │ ├── Pain # failure recording, confidence hit, auto-revert
28
+ │ ├── Crystallize # unrouted traffic analysis, emergent creation
29
+ │ ├── Mutate # versioned self-modification with snapshots
30
+ │ ├── Revert # rollback to previous mutation version
31
+ │ └── Report # aggregate stats for GAIA consumption
32
+ ├── Helpers/
33
+ │ ├── Confidence # scoring, adjustments, autonomy ranges, decay
34
+ │ ├── Homeostasis # spike/drought detection, baseline tracking
35
+ │ └── RelationshipWrapper # Layer 1 -> Layer 2 wrapping
36
+ ├── Data/
37
+ │ ├── Migrations/ # 001 synapses, 002 mutations, 003 signals
38
+ │ └── Models/ # Synapse, SynapseMutation, SynapseSignal
39
+ ├── Transport/
40
+ │ ├── Exchanges/Synapse
41
+ │ ├── Queues/Evaluate, Pain
42
+ │ └── Messages/Signal, Pain
43
+ └── Client # Standalone client including all runners
44
+ ```
45
+
46
+ ## Key Thresholds
47
+
48
+ | Parameter | Value |
49
+ |-----------|-------|
50
+ | Explicit starting confidence | 0.7 |
51
+ | Emergent starting confidence | 0.3 |
52
+ | Seeded starting confidence | 0.5 |
53
+ | Success adjustment | +0.02 |
54
+ | Failure adjustment | -0.05 |
55
+ | Validation failure adjustment | -0.03 |
56
+ | Consecutive success bonus (>50) | +0.05 |
57
+ | Idle decay rate | *0.998/hour |
58
+ | Auto-revert threshold | 3 consecutive failures |
59
+ | Spike multiplier | 3x baseline for 60s |
60
+ | Drought threshold | 0 throughput for 10x avg interval |
61
+ | Crystallize threshold | 20 unrouted signals |
62
+
63
+ ## Autonomy Ranges
64
+
65
+ | Confidence | Mode | Capabilities |
66
+ |------------|------|-------------|
67
+ | 0.0-0.3 | OBSERVE | Log, pass through unchanged |
68
+ | 0.3-0.6 | FILTER | Suppress signals |
69
+ | 0.6-0.8 | TRANSFORM | Filter + transform within schemas |
70
+ | 0.8-1.0 | AUTONOMOUS | Self-modify rules, infer transforms |
71
+
72
+ ## Data Model
73
+
74
+ - **synapses**: Core routing definition with confidence, status, version, baseline_throughput
75
+ - **synapse_mutations**: Versioned change history with before/after JSON snapshots
76
+ - **synapse_signals**: Per-signal outcome records (attention pass, transform success, latency, downstream outcome)
77
+
78
+ ## Dependencies
79
+
80
+ | Gem | Purpose |
81
+ |-----|---------|
82
+ | `lex-conditioner` >= 0.3.0 | Attention evaluation (condition rules) |
83
+ | `lex-transformer` >= 0.2.0 | Payload transformation (template engines) |
84
+ | `legion-data` | Required — database persistence via Sequel |
85
+
86
+ ## Testing
87
+
88
+ ```bash
89
+ bundle install
90
+ bundle exec rspec
91
+ bundle exec rubocop
92
+ ```
93
+
94
+ 308 specs, 96%+ coverage. Uses in-memory SQLite for model/runner tests.
95
+
96
+ ---
97
+
98
+ **Maintained By**: Matthew Iverson (@Esity)
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ group :test do
8
+ gem 'rake'
9
+ gem 'rspec', '~> 3.13'
10
+ gem 'rspec_junit_formatter'
11
+ gem 'rubocop', '~> 1.75'
12
+ gem 'rubocop-rspec'
13
+ gem 'sequel'
14
+ gem 'simplecov'
15
+ gem 'sqlite3'
16
+ end
data/README.md ADDED
@@ -0,0 +1,156 @@
1
+ # lex-synapse
2
+
3
+ Cognitive routing layer for [LegionIO](https://github.com/LegionIO/LegionIO) task chains. Wraps task relationships with observation, learning, confidence scoring, pain signals, and self-governance.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ gem install lex-synapse
9
+ ```
10
+
11
+ Or add to your Gemfile:
12
+
13
+ ```ruby
14
+ gem 'lex-synapse'
15
+ ```
16
+
17
+ ## Standalone Client
18
+
19
+ Use the synapse engine without the full LegionIO framework:
20
+
21
+ ```ruby
22
+ require 'legion/extensions/synapse/client'
23
+
24
+ # Optionally inject conditioner and transformer clients
25
+ conditioner = Legion::Extensions::Conditioner::Client.new
26
+ transformer = Legion::Extensions::Transformer::Client.new
27
+
28
+ client = Legion::Extensions::Synapse::Client.new(
29
+ conditioner_client: conditioner,
30
+ transformer_client: transformer
31
+ )
32
+
33
+ # Create a synapse
34
+ synapse = client.create(
35
+ source_function_id: 1,
36
+ target_function_id: 2,
37
+ attention: '{"all":[{"fact":"status","operator":"equal","value":"open"}]}',
38
+ transform: '{"template":"{\"message\":\"<%= title %>\"}","engine":"erb"}'
39
+ )
40
+
41
+ # Evaluate a signal through the synapse
42
+ result = client.evaluate(synapse_id: synapse.id, payload: { status: 'open', title: 'Bug fix' })
43
+ result[:success] # => true
44
+ result[:mode] # => :transform (based on confidence level)
45
+ result[:result] # => { message: "Bug fix" }
46
+
47
+ # Get synapse stats
48
+ report = client.report(synapse_id: synapse.id)
49
+ report[:confidence] # => 0.72
50
+ report[:signals_24h] # => 1
51
+ report[:success_rate] # => 1.0
52
+ ```
53
+
54
+ ## Architecture
55
+
56
+ ### Three-Layer Model
57
+
58
+ ```
59
+ Layer 1 (Bones) — Explicit relationships defined by users (lex-tasker)
60
+ Layer 2 (Nerves) — Synapses wrapping relationships with learning (lex-synapse)
61
+ Layer 3 (Mind) — GAIA cognitive coordination + Apollo shared knowledge (future)
62
+ ```
63
+
64
+ ### Confidence Scoring
65
+
66
+ Each synapse has a confidence score (0.0-1.0) that governs what it's allowed to do:
67
+
68
+ | Range | Mode | Permitted Actions |
69
+ |-------|------|-------------------|
70
+ | 0.0-0.3 | OBSERVE | Log what it would do, pass through unchanged |
71
+ | 0.3-0.6 | FILTER | Can suppress signals, cannot modify |
72
+ | 0.6-0.8 | TRANSFORM | Can filter + transform within defined schemas |
73
+ | 0.8-1.0 | AUTONOMOUS | Can self-modify rules, infer transforms, adjust routing |
74
+
75
+ **Starting scores**: explicit=0.7, emergent=0.3, seeded=0.5
76
+
77
+ **Adjustments**: success +0.02, failure -0.05, validation failure -0.03, 50+ consecutive successes +0.05 bonus
78
+
79
+ **Decay**: Unused synapses fade at 0.998x per hour (~15% per day of inactivity)
80
+
81
+ ### Pain Signals
82
+
83
+ Downstream task failures propagate backward through the chain:
84
+ - Each failure reduces confidence by 0.05
85
+ - 3+ consecutive failures trigger auto-revert to last known-good state
86
+ - Extreme failure rates trigger dampening (homeostasis)
87
+
88
+ ### Homeostasis
89
+
90
+ - **Spike detection**: Throughput >3x baseline for 60+ seconds triggers dampening
91
+ - **Drought detection**: Zero throughput for 10x average interval flags for review
92
+ - **Baseline tracking**: Exponential moving average of signals/minute
93
+
94
+ ## Runners
95
+
96
+ ### Evaluate
97
+ `evaluate(synapse_id:, payload:, conditioner_client:, transformer_client:)`
98
+
99
+ Main signal flow: load synapse, check autonomy, run attention (conditioner), run transform (transformer), record signal, adjust confidence.
100
+
101
+ ### Pain
102
+ `handle_pain(synapse_id:, task_id:)`
103
+
104
+ Downstream failure handler. Records failed signal, adjusts confidence, checks for auto-revert threshold, may dampen synapse.
105
+
106
+ ### Crystallize
107
+ `crystallize(signal_pairs:, threshold: 20)`
108
+
109
+ Bottom-up emergence. Given pairs of `{source_function_id, target_function_id, count}`, creates new synapses for pairs exceeding the threshold.
110
+
111
+ ### Mutate
112
+ `mutate(synapse_id:, mutation_type:, changes:, trigger:)`
113
+
114
+ Versioned self-modification. Records before/after state snapshots. Types: `attention_adjusted`, `transform_adjusted`, `route_changed`, `confidence_changed`. Triggers: `hebbian`, `pain`, `dream`, `gaia`, `manual`.
115
+
116
+ ### Revert
117
+ `revert(synapse_id:, to_version:, trigger:)`
118
+
119
+ Rolls back to a previous mutation version, restoring the before_state.
120
+
121
+ ### Report
122
+ `report(synapse_id:)`
123
+
124
+ Aggregates stats: confidence, status, 24h signal count, success rate, last mutation.
125
+
126
+ ## Relationship Wrapper
127
+
128
+ Wrap existing Layer 1 relationships as synapses (opt-in, zero breaking changes):
129
+
130
+ ```ruby
131
+ relationship = { id: 42, trigger_function_id: 1, function_id: 2,
132
+ conditions: '{"all":[...]}', transformation: '{"template":"..."}' }
133
+ synapse = Legion::Extensions::Synapse::Helpers::RelationshipWrapper.wrap(relationship)
134
+ ```
135
+
136
+ ## Transport
137
+
138
+ - **Exchange**: `synapse` (inherits from `Legion::Transport::Exchanges::Task`)
139
+ - **Queues**: `synapse.evaluate`, `synapse.pain`
140
+ - **Routing keys**: `synapse.evaluate`, `task.failed`
141
+
142
+ ## Data Model
143
+
144
+ Three tables: `synapses` (core routing definition + confidence + status), `synapse_mutations` (versioned change history), `synapse_signals` (per-signal outcome records).
145
+
146
+ ## Dependencies
147
+
148
+ - `lex-conditioner` >= 0.3.0
149
+ - `lex-transformer` >= 0.2.0
150
+ - Ruby >= 3.4
151
+ - [LegionIO](https://github.com/LegionIO/LegionIO) framework (for AMQP actor mode)
152
+ - Standalone Client works without the framework (requires Sequel + database)
153
+
154
+ ## License
155
+
156
+ MIT
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: :spec
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/legion/extensions/synapse/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'lex-synapse'
7
+ spec.version = Legion::Extensions::Synapse::VERSION
8
+ spec.authors = ['Esity']
9
+ spec.email = ['matthewdiverson@gmail.com']
10
+
11
+ spec.summary = 'Cognitive routing layer for LegionIO task chains'
12
+ spec.description = 'Attention, transformation, and routing with confidence scoring, pain signals, homeostasis, and self-governance'
13
+ spec.homepage = 'https://github.com/LegionIO/lex-synapse'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 3.4'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-synapse'
19
+ spec.metadata['documentation_uri'] = 'https://github.com/LegionIO/lex-synapse'
20
+ spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-synapse/blob/main/CHANGELOG.md'
21
+ spec.metadata['bug_tracker_uri'] = 'https://github.com/LegionIO/lex-synapse/issues'
22
+ spec.metadata['rubygems_mfa_required'] = 'true'
23
+
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ end
27
+ spec.require_paths = ['lib']
28
+
29
+ spec.add_dependency 'lex-conditioner', '>= 0.3.0'
30
+ spec.add_dependency 'lex-transformer', '>= 0.2.0'
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Synapse
6
+ module Actor
7
+ class Crystallize < Legion::Extensions::Actors::Every
8
+ def runner_function
9
+ 'crystallize'
10
+ end
11
+
12
+ def time
13
+ 300
14
+ end
15
+
16
+ def use_runner?
17
+ false
18
+ end
19
+
20
+ def check_subtask?
21
+ false
22
+ end
23
+
24
+ def generate_task?
25
+ false
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Synapse
6
+ module Actor
7
+ class Decay < Legion::Extensions::Actors::Every
8
+ def runner_function
9
+ 'apply_decay'
10
+ end
11
+
12
+ def time
13
+ 3600
14
+ end
15
+
16
+ def use_runner?
17
+ false
18
+ end
19
+
20
+ def check_subtask?
21
+ false
22
+ end
23
+
24
+ def generate_task?
25
+ false
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Synapse
6
+ module Actor
7
+ class Evaluate < Legion::Extensions::Actors::Subscription
8
+ def runner_function
9
+ 'evaluate'
10
+ end
11
+
12
+ def check_subtask?
13
+ false
14
+ end
15
+
16
+ def generate_task?
17
+ false
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Synapse
6
+ module Actor
7
+ class Homeostasis < Legion::Extensions::Actors::Every
8
+ def runner_function
9
+ 'check_homeostasis'
10
+ end
11
+
12
+ def time
13
+ 30
14
+ end
15
+
16
+ def use_runner?
17
+ false
18
+ end
19
+
20
+ def check_subtask?
21
+ false
22
+ end
23
+
24
+ def generate_task?
25
+ false
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Synapse
6
+ module Actor
7
+ class Pain < Legion::Extensions::Actors::Subscription
8
+ def runner_function
9
+ 'handle_pain'
10
+ end
11
+
12
+ def check_subtask?
13
+ false
14
+ end
15
+
16
+ def generate_task?
17
+ false
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'runners/evaluate'
4
+ require_relative 'runners/pain'
5
+ require_relative 'runners/crystallize'
6
+ require_relative 'runners/mutate'
7
+ require_relative 'runners/revert'
8
+ require_relative 'runners/report'
9
+ require_relative 'runners/gaia_report'
10
+ require_relative 'runners/dream'
11
+ require_relative 'runners/promote'
12
+ require_relative 'runners/retrieve'
13
+
14
+ module Legion
15
+ module Extensions
16
+ module Synapse
17
+ class Client
18
+ include Runners::Evaluate
19
+ include Runners::Pain
20
+ include Runners::Crystallize
21
+ include Runners::Mutate
22
+ include Runners::Revert
23
+ include Runners::Report
24
+ include Runners::GaiaReport
25
+ include Runners::Dream
26
+ include Runners::Promote
27
+ include Runners::Retrieve
28
+
29
+ attr_reader :conditioner_client, :transformer_client
30
+
31
+ def initialize(conditioner_client: nil, transformer_client: nil)
32
+ @conditioner_client = conditioner_client
33
+ @transformer_client = transformer_client
34
+ end
35
+
36
+ def evaluate(synapse_id:, payload: {})
37
+ super(
38
+ synapse_id: synapse_id,
39
+ payload: payload,
40
+ conditioner_client: @conditioner_client,
41
+ transformer_client: @transformer_client
42
+ )
43
+ end
44
+
45
+ def create(source_function_id:, target_function_id:, attention: nil, transform: nil,
46
+ routing_strategy: 'direct', origin: 'explicit', relationship_id: nil)
47
+ Data::Model::Synapse.create(
48
+ source_function_id: source_function_id,
49
+ target_function_id: target_function_id,
50
+ attention: attention,
51
+ transform: transform,
52
+ routing_strategy: routing_strategy,
53
+ origin: origin,
54
+ relationship_id: relationship_id,
55
+ confidence: Helpers::Confidence.starting_score(origin),
56
+ status: origin == 'emergent' ? 'observing' : 'active'
57
+ )
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ Sequel.migration do
4
+ up do
5
+ create_table(:synapses) do
6
+ primary_key :id
7
+ Integer :source_function_id, null: true, index: true
8
+ Integer :target_function_id, null: true, index: true
9
+ Integer :relationship_id, null: true, index: true
10
+ String :attention, text: true
11
+ String :transform, text: true
12
+ String :routing_strategy, null: false, default: 'direct', size: 50
13
+ Float :confidence, null: false, default: 0.5
14
+ Float :baseline_throughput, null: false, default: 0.0
15
+ String :origin, null: false, default: 'explicit', size: 50
16
+ String :status, null: false, default: 'active', size: 50
17
+ Integer :version, null: false, default: 1
18
+ DateTime :created_at, null: false, default: Sequel::CURRENT_TIMESTAMP
19
+ DateTime :updated_at
20
+ end
21
+ end
22
+
23
+ down do
24
+ drop_table :synapses
25
+ end
26
+ end