legion-gaia 0.8.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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +16 -0
  3. data/.gitignore +12 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +45 -0
  6. data/CHANGELOG.md +101 -0
  7. data/CLAUDE.md +151 -0
  8. data/Gemfile +261 -0
  9. data/LICENSE +190 -0
  10. data/README.md +167 -0
  11. data/legion-gaia.gemspec +276 -0
  12. data/lib/legion/gaia/actors/heartbeat.rb +39 -0
  13. data/lib/legion/gaia/channel_adapter.rb +43 -0
  14. data/lib/legion/gaia/channel_aware_renderer.rb +89 -0
  15. data/lib/legion/gaia/channel_registry.rb +60 -0
  16. data/lib/legion/gaia/channels/cli_adapter.rb +52 -0
  17. data/lib/legion/gaia/channels/slack/signing_verifier.rb +36 -0
  18. data/lib/legion/gaia/channels/slack_adapter.rb +102 -0
  19. data/lib/legion/gaia/channels/teams/bot_framework_auth.rb +101 -0
  20. data/lib/legion/gaia/channels/teams/conversation_store.rb +67 -0
  21. data/lib/legion/gaia/channels/teams/webhook_handler.rb +91 -0
  22. data/lib/legion/gaia/channels/teams_adapter.rb +153 -0
  23. data/lib/legion/gaia/input_frame.rb +58 -0
  24. data/lib/legion/gaia/notification_gate/behavioral_evaluator.rb +56 -0
  25. data/lib/legion/gaia/notification_gate/delay_queue.rb +55 -0
  26. data/lib/legion/gaia/notification_gate/presence_evaluator.rb +53 -0
  27. data/lib/legion/gaia/notification_gate/schedule_evaluator.rb +75 -0
  28. data/lib/legion/gaia/notification_gate.rb +86 -0
  29. data/lib/legion/gaia/offline_handler.rb +83 -0
  30. data/lib/legion/gaia/output_frame.rb +45 -0
  31. data/lib/legion/gaia/output_router.rb +58 -0
  32. data/lib/legion/gaia/phase_wiring.rb +143 -0
  33. data/lib/legion/gaia/proactive.rb +41 -0
  34. data/lib/legion/gaia/registry.rb +99 -0
  35. data/lib/legion/gaia/router/agent_bridge.rb +97 -0
  36. data/lib/legion/gaia/router/router_bridge.rb +119 -0
  37. data/lib/legion/gaia/router/transport/exchanges/gaia.rb +17 -0
  38. data/lib/legion/gaia/router/transport/messages/input_frame_message.rb +44 -0
  39. data/lib/legion/gaia/router/transport/messages/output_frame_message.rb +42 -0
  40. data/lib/legion/gaia/router/transport/queues/inbound.rb +26 -0
  41. data/lib/legion/gaia/router/transport/queues/outbound.rb +17 -0
  42. data/lib/legion/gaia/router/worker_routing.rb +67 -0
  43. data/lib/legion/gaia/router.rb +25 -0
  44. data/lib/legion/gaia/runner_host.rb +20 -0
  45. data/lib/legion/gaia/sensory_buffer.rb +47 -0
  46. data/lib/legion/gaia/session_store.rb +90 -0
  47. data/lib/legion/gaia/settings.rb +40 -0
  48. data/lib/legion/gaia/version.rb +7 -0
  49. data/lib/legion/gaia.rb +266 -0
  50. metadata +3530 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 368bb3400fb3055debfaa1fb47e7d4dcb14a9292a21c2ae4005c6cd0ff19284c
4
+ data.tar.gz: 972b67afa4ec86c7a302762355bcf72d961ee9b02dc046a83785d9c02cdb5f7d
5
+ SHA512:
6
+ metadata.gz: 81146ff1a14e9d7d41fd700affece75044b10391b36436f9aabd7fbde609d550f0d0414018e590a91025280c3f779022c0183c24413717b0dacf4e9c9e8fdae4
7
+ data.tar.gz: 70971edce8909bd182f6e4a0ead03e5490773f597157d349bae826accc66830368c56e74ad105f4cff56e35a3dd9eedcef8246bea1d8d4aedc53682e9aca6d26
@@ -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,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /.idea/
11
+ *.key
12
+ .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,45 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.4
3
+ NewCops: enable
4
+ SuggestExtensions: false
5
+
6
+ Style/FrozenStringLiteralComment:
7
+ Enabled: true
8
+ EnforcedStyle: always
9
+
10
+ Style/StringLiterals:
11
+ Enabled: true
12
+ EnforcedStyle: single_quotes
13
+
14
+ Layout/LineLength:
15
+ Max: 120
16
+
17
+ Metrics/MethodLength:
18
+ Max: 25
19
+
20
+ Metrics/AbcSize:
21
+ Max: 30
22
+
23
+ Metrics/CyclomaticComplexity:
24
+ Max: 10
25
+
26
+ Metrics/PerceivedComplexity:
27
+ Max: 10
28
+
29
+ Metrics/ClassLength:
30
+ Max: 200
31
+
32
+ Metrics/ModuleLength:
33
+ Max: 200
34
+
35
+ Metrics/ParameterLists:
36
+ Max: 10
37
+
38
+ Metrics/BlockLength:
39
+ Exclude:
40
+ - 'spec/**/*'
41
+ - '*.gemspec'
42
+ - 'Gemfile'
43
+
44
+ Style/Documentation:
45
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,101 @@
1
+ # Changelog
2
+
3
+ ## [0.8.0] - 2026-03-17
4
+
5
+ ### Added
6
+ - `Legion::Gaia::Proactive`: agent-initiated messaging to any channel via channel registry
7
+ - `Legion::Gaia::OfflineHandler`: message queuing and sender notification for offline agents
8
+ - Presence tracking with configurable offline threshold
9
+ - `drain_pending` and `pending_count` for offline message management
10
+ - 14 new specs (310 total)
11
+
12
+ ## [0.7.0] - 2026-03-15
13
+
14
+ ### Changed
15
+ - Added 242 agentic lex-* gems as runtime dependencies (full cognitive stack meta-package)
16
+ - Installing legion-gaia now pulls in all cognitive extensions
17
+
18
+ ## [0.6.0] - 2026-03-15
19
+
20
+ ### Added
21
+ - `Legion::Gaia::NotificationGate` three-layer notification gate between OutputRouter and channel delivery
22
+ - `Legion::Gaia::NotificationGate::ScheduleEvaluator` config-driven quiet hours with time window, day-of-week, and timezone support
23
+ - `Legion::Gaia::NotificationGate::PresenceEvaluator` Teams presence status gating (Available/Busy/Away/DoNotDisturb/Offline mapped to priority thresholds)
24
+ - `Legion::Gaia::NotificationGate::BehavioralEvaluator` learned signal scoring using arousal and idle time
25
+ - `Legion::Gaia::NotificationGate::DelayQueue` thread-safe delayed message queue with max size eviction and TTL expiration
26
+ - Priority override: critical and urgent messages bypass quiet hours
27
+ - OutputRouter integration: notification gate evaluates frames before delivery, delayed frames re-evaluated on heartbeat
28
+ - Notification settings in `Legion::Gaia::Settings` (enabled, quiet_hours, priority_override, delay_queue_max, max_delay)
29
+ - 63 new specs (296 total) with full coverage across all Phase 6 components
30
+
31
+ ## [0.5.0] - 2026-03-15
32
+
33
+ ### Added
34
+ - `Legion::Gaia::Channels::SlackAdapter` Slack channel adapter with webhook and signing secret support
35
+ - `Legion::Gaia::Channels::Slack::SigningVerifier` HMAC-SHA256 request verification for Slack Events API
36
+ - Slack adapter auto-registration when `channels.slack.enabled` is true in settings
37
+ - Bot mention stripping for Slack events (`<@UBOT>` tags)
38
+ - Thread-aware outbound delivery (preserves `thread_ts` for reply threading)
39
+ - Channel transition suggestions in `ChannelAwareRenderer` when content is truncated
40
+ - Transition suggestion messages point users to richer channels (e.g., "Full response available on cli")
41
+ - 19 new specs (233 total) with full coverage across all Phase 5 components
42
+
43
+ ## [0.4.0] - 2026-03-15
44
+
45
+ ### Added
46
+ - `Legion::Gaia::Router` central router module for hub-and-spoke deployment
47
+ - `Legion::Gaia::Router::RouterBridge` inbound/outbound message routing between channels and agents via RabbitMQ
48
+ - `Legion::Gaia::Router::AgentBridge` agent-side transport: subscribes to inbound queue, publishes OutputFrames
49
+ - `Legion::Gaia::Router::WorkerRouting` thread-safe identity-to-worker routing table with allowlist support
50
+ - `Legion::Gaia::Router::Transport::Exchanges::Gaia` topic exchange for InputFrame/OutputFrame routing
51
+ - `Legion::Gaia::Router::Transport::Queues::Inbound` per-worker inbound queue (router->agent)
52
+ - `Legion::Gaia::Router::Transport::Queues::Outbound` shared outbound queue (agent->router)
53
+ - `Legion::Gaia::Router::Transport::Messages::InputFrameMessage` publishes InputFrames to RabbitMQ
54
+ - `Legion::Gaia::Router::Transport::Messages::OutputFrameMessage` publishes OutputFrames to RabbitMQ
55
+ - Dual boot modes: `Legion::Gaia.boot(mode: :router)` for stateless router, default `:agent` for full GAIA
56
+ - Router mode skips brain (no SensoryBuffer, Registry, or cognitive extensions)
57
+ - Agent bridge auto-starts when `router.mode` and `router.worker_id` configured
58
+ - `Legion::Gaia.respond` publishes through agent bridge when available (agent->router->channel)
59
+ - 31 new specs (214 total) with full coverage across all Phase 4 components
60
+
61
+ ## [0.3.0] - 2026-03-15
62
+
63
+ ### Added
64
+ - `Legion::Gaia::Channels::TeamsAdapter` Teams channel adapter with Bot Framework activity translation
65
+ - `Legion::Gaia::Channels::Teams::BotFrameworkAuth` JWT token validation for Bot Framework and Emulator issuers
66
+ - `Legion::Gaia::Channels::Teams::ConversationStore` thread-safe conversation reference storage for reply delivery
67
+ - `Legion::Gaia::Channels::Teams::WebhookHandler` HTTP webhook handler routing Bot Framework activity types
68
+ - Bot @mention stripping from inbound messages
69
+ - Mobile/desktop device context detection from Teams clientInfo
70
+ - Adaptive card content type support in translate_outbound
71
+ - Teams adapter auto-registration when `channels.teams.enabled` is true in settings
72
+ - `base64` gem dependency (required for Ruby 3.4+ JWT decoding)
73
+ - 54 new specs (183 total) with full coverage across all Phase 3 components
74
+
75
+ ## [0.2.0] - 2026-03-15
76
+
77
+ ### Added
78
+ - `Legion::Gaia::InputFrame` immutable value object (Data.define) for channel-agnostic inbound messages
79
+ - `Legion::Gaia::OutputFrame` immutable value object (Data.define) for channel-agnostic outbound responses
80
+ - `Legion::Gaia::ChannelAdapter` base class defining the adapter contract (translate_inbound/outbound, deliver)
81
+ - `Legion::Gaia::ChannelRegistry` thread-safe registry for active channel adapters with deliver routing
82
+ - `Legion::Gaia::ChannelAwareRenderer` adapts output complexity to channel capabilities (truncation, switch suggestions)
83
+ - `Legion::Gaia::OutputRouter` chains renderer -> registry -> adapter for output delivery
84
+ - `Legion::Gaia::SessionStore` session continuity tracking keyed by human identity with TTL expiration
85
+ - `Legion::Gaia::Channels::CliAdapter` first concrete adapter for CLI input/output
86
+ - `Legion::Gaia.ingest(input_frame)` pushes signals to sensory buffer and manages session continuity
87
+ - `Legion::Gaia.respond(content:, channel_id:)` routes output through renderer and adapter
88
+ - Channel infrastructure auto-boots during `Legion::Gaia.boot` (CLI adapter registered by default)
89
+ - 129 specs with full coverage across all Phase 1 and Phase 2 components
90
+
91
+ ## [0.1.0] - 2026-03-15
92
+
93
+ ### Added
94
+ - `Legion::Gaia` entry point with boot/shutdown lifecycle, settings, heartbeat, and status
95
+ - `Legion::Gaia::Registry` for subordinate function discovery, capability mapping, and health tracking
96
+ - `Legion::Gaia::PhaseWiring` absorbs PHASE_MAP (19 phases: 12 active tick + 7 dream cycle) from lex-cortex
97
+ - `Legion::Gaia::RunnerHost` provides persistent instance state for runner modules via extend pattern
98
+ - `Legion::Gaia::SensoryBuffer` thread-safe signal buffer (renamed from cortex SignalBuffer)
99
+ - `Legion::Gaia::Actors::Heartbeat` drives the cognitive tick cycle at configurable interval (default 1s)
100
+ - `Legion::Gaia::Settings` default configuration for channels, router, sessions, and output
101
+ - 63 specs with full coverage across all components
data/CLAUDE.md ADDED
@@ -0,0 +1,151 @@
1
+ # legion-gaia
2
+
3
+ **Parent**: `/Users/miverso2/rubymine/legion/CLAUDE.md`
4
+
5
+ ## What is this?
6
+
7
+ Cognitive coordination layer for LegionIO. GAIA absorbs and replaces `lex-cortex`, elevating the cognitive wiring from an extension to a core library. It drives the tick cycle, discovers and wires agentic extensions, and provides channel abstraction for multi-interface communication (CLI, Teams, Slack).
8
+
9
+ ## Key Files
10
+
11
+ ```
12
+ lib/legion/gaia.rb # Entry point: boot, shutdown, heartbeat, ingest, respond, status
13
+ lib/legion/gaia/version.rb # VERSION constant
14
+ lib/legion/gaia/settings.rb # Default config hash (channels, router, session, output)
15
+ lib/legion/gaia/registry.rb # Extension discovery, runner wiring, phase handler management
16
+ lib/legion/gaia/phase_wiring.rb # PHASE_MAP (19 phases), PHASE_ARGS, resolve/build helpers
17
+ lib/legion/gaia/runner_host.rb # Wraps runner modules with isolated instance state via extend
18
+ lib/legion/gaia/sensory_buffer.rb # Thread-safe signal queue (max 1000, normalized)
19
+ lib/legion/gaia/actors/heartbeat.rb # Every-1s actor, drains buffer and drives tick
20
+ lib/legion/gaia/input_frame.rb # Data.define — immutable inbound message from any channel
21
+ lib/legion/gaia/output_frame.rb # Data.define — immutable outbound response to any channel
22
+ lib/legion/gaia/channel_adapter.rb # Base class for channel adapters (translate in/out, deliver)
23
+ lib/legion/gaia/channel_registry.rb # Registry of active channel adapters, thread-safe
24
+ lib/legion/gaia/channel_aware_renderer.rb # Adapts output complexity to channel capabilities + transition suggestions
25
+ lib/legion/gaia/output_router.rb # Routes OutputFrames through renderer to correct adapter
26
+ lib/legion/gaia/session_store.rb # Session continuity tracking, keyed by human identity
27
+ lib/legion/gaia/channels/cli_adapter.rb # First concrete adapter — wraps CLI input/output
28
+ lib/legion/gaia/channels/teams_adapter.rb # Teams adapter — Bot Framework activities to Frames
29
+ lib/legion/gaia/channels/teams/bot_framework_auth.rb # JWT validation for Bot Framework tokens
30
+ lib/legion/gaia/channels/teams/conversation_store.rb # Thread-safe conversation reference storage
31
+ lib/legion/gaia/channels/teams/webhook_handler.rb # HTTP webhook handler for Bot Framework activities
32
+ lib/legion/gaia/channels/slack_adapter.rb # Slack adapter — Events API to Frames
33
+ lib/legion/gaia/channels/slack/signing_verifier.rb # HMAC-SHA256 request verification for Slack Events API
34
+ lib/legion/gaia/router.rb # Router module entry point, conditional transport loading
35
+ lib/legion/gaia/router/worker_routing.rb # Identity-to-worker routing table with allowlist
36
+ lib/legion/gaia/router/router_bridge.rb # Central router: inbound routing + outbound delivery
37
+ lib/legion/gaia/router/agent_bridge.rb # Agent-side: subscribe inbound, publish outbound
38
+ lib/legion/gaia/router/transport/exchanges/gaia.rb # Topic exchange for GAIA frames
39
+ lib/legion/gaia/router/transport/queues/inbound.rb # Per-worker inbound queue (router->agent)
40
+ lib/legion/gaia/router/transport/queues/outbound.rb # Shared outbound queue (agent->router)
41
+ lib/legion/gaia/router/transport/messages/input_frame_message.rb # InputFrame -> RabbitMQ
42
+ lib/legion/gaia/router/transport/messages/output_frame_message.rb # OutputFrame -> RabbitMQ
43
+ lib/legion/gaia/notification_gate.rb # Three-layer gate between OutputRouter and delivery
44
+ lib/legion/gaia/notification_gate/schedule_evaluator.rb # Config-driven quiet hours (day/time/timezone windows)
45
+ lib/legion/gaia/notification_gate/presence_evaluator.rb # Teams presence status -> priority threshold mapping
46
+ lib/legion/gaia/notification_gate/behavioral_evaluator.rb # Learned signal scoring (arousal, idle time)
47
+ lib/legion/gaia/notification_gate/delay_queue.rb # Thread-safe delayed message queue (max size, TTL)
48
+ ```
49
+
50
+ ## Architecture
51
+
52
+ ### Phase 1: Cortex Absorption
53
+ - `Legion::Gaia.boot` creates SensoryBuffer, Registry, and ChannelRegistry, runs discovery
54
+ - `Registry#discover` walks `PHASE_MAP`, resolves runner classes via `Legion::Extensions`, wraps in `RunnerHost`
55
+ - `Legion::Gaia.heartbeat` drains buffer, calls `tick_host.execute_tick(signals:, phase_handlers:)`
56
+ - Heartbeat actor calls `heartbeat` every 1s (configurable via settings)
57
+ - Graceful degradation: if lex-tick not loaded, heartbeat returns `{ error: :no_tick_extension }` and retries next tick
58
+
59
+ ### Phase 2: Channel Abstraction
60
+ - `InputFrame` and `OutputFrame` are immutable `Data.define` value objects — the universal message format
61
+ - `ChannelAdapter` base class defines the contract: `translate_inbound`, `translate_outbound`, `deliver`
62
+ - `ChannelRegistry` manages active adapters, thread-safe register/unregister/deliver
63
+ - `ChannelAwareRenderer` pre-adapts content complexity (truncation, channel switch suggestions)
64
+ - `OutputRouter` chains renderer -> registry -> adapter for delivery
65
+ - `SessionStore` tracks session continuity across channels, keyed by human identity with TTL
66
+ - `CliAdapter` is the first concrete adapter — translates raw strings to InputFrames, buffers output
67
+ - `Legion::Gaia.ingest(input_frame)` pushes to sensory buffer and creates/touches session
68
+ - `Legion::Gaia.respond(content:, channel_id:)` routes output through renderer and adapter
69
+
70
+ ### Phase 3: Teams Channel Adapter
71
+ - `TeamsAdapter` translates Bot Framework activities to InputFrames and OutputFrames to Teams messages
72
+ - `BotFrameworkAuth` validates JWT tokens from Bot Framework and Emulator issuers (claims, expiry, audience)
73
+ - `ConversationStore` holds `service_url` + `conversation_id` references needed for reply delivery (thread-safe)
74
+ - `WebhookHandler` routes inbound activities by type: message, conversationUpdate, invoke, other
75
+ - Bot @mention stripping ensures clean text reaches the cognitive pipeline
76
+ - Mobile/desktop device detection from `channelData.clientInfo.platform`
77
+ - Delivery uses `lex-microsoft_teams` Bot runner (`send_text`/`send_card`) when available
78
+ - Teams adapter auto-registers during `boot_channels` when `channels.teams.enabled` is true
79
+
80
+ ### Phase 4: Central Router (Hub-and-Spoke)
81
+ - Dual boot modes: `Legion::Gaia.boot(mode: :router)` for stateless router, default `:agent` for full GAIA
82
+ - Router mode: boots channels only — no SensoryBuffer, Registry, or cognitive extensions
83
+ - `RouterBridge` handles inbound routing (identity -> worker_id -> RabbitMQ queue) and outbound delivery
84
+ - `AgentBridge` subscribes to per-worker inbound queue, pushes InputFrames into local GAIA SensoryBuffer
85
+ - `AgentBridge` publishes OutputFrames to outbound queue when `respond` is called
86
+ - `WorkerRouting` maps Entra OID / identity to worker_id with allowlist enforcement
87
+ - Transport layer follows standard legion-transport patterns (Exchange, Queue, Message base classes)
88
+ - Transport classes only loaded when `legion-transport` is available (conditional require)
89
+ - Router never sees cognitive state — only InputFrame/OutputFrame envelopes
90
+
91
+ ### Phase 5: Slack Adapter + Cross-Channel Polish
92
+ - `SlackAdapter` translates Slack Events API payloads to InputFrames and OutputFrames to Slack messages
93
+ - `SigningVerifier` validates inbound requests via HMAC-SHA256 (signing secret + timestamp + body)
94
+ - Bot `<@UBOT>` mention stripping for clean text input
95
+ - Thread-aware outbound delivery (preserves `thread_ts` for reply threading)
96
+ - Slack adapter auto-registers during `boot_channels` when `channels.slack.enabled` is true
97
+ - `ChannelAwareRenderer` adds transition suggestions when content is truncated (e.g., "Full response available on cli")
98
+ - Richness hierarchy: voice -> slack -> cli (richer channels suggested when content exceeds limits)
99
+
100
+ ### Phase 6: Notification Gate
101
+ - `NotificationGate` sits between OutputRouter and channel delivery, evaluating each frame
102
+ - Three evaluation layers in order: schedule (quiet hours) -> presence (Teams status) -> behavioral (learned signals)
103
+ - `ScheduleEvaluator` parses config-driven schedule arrays with day/time/timezone windows, handles overnight wraps
104
+ - `PresenceEvaluator` maps Teams availability states to minimum priority thresholds (Available->ambient, Busy/Away->urgent, DoNotDisturb/Offline->critical)
105
+ - `BehavioralEvaluator` uses arousal (0.0-1.0) and idle_seconds signals to compute notification score
106
+ - Priority override: critical/urgent messages bypass all layers
107
+ - `DelayQueue` is thread-safe with mutex, max_size eviction, TTL-based expiration, flush
108
+ - OutputRouter calls `notification_gate.evaluate(frame)` -> `:deliver` or `:delay`
109
+ - Delayed frames re-evaluated each heartbeat tick via `process_delayed` (drain expired, flush when quiet ends)
110
+
111
+ ### Data Flow
112
+ ```
113
+ Human Input -> ChannelAdapter#translate_inbound -> InputFrame -> Gaia.ingest -> SensoryBuffer
114
+ |
115
+ Heartbeat tick
116
+ |
117
+ Cognitive Output -> OutputFrame -> OutputRouter -> ChannelAwareRenderer -> ChannelAdapter#deliver
118
+ ```
119
+
120
+ ## Patterns
121
+
122
+ - `RunnerHost` uses `extend runner_module` on instances to give modules persistent `@ivar` state
123
+ - `Registry` tracks `@discovered` boolean to prevent re-discovery when results are empty
124
+ - `PhaseWiring::PHASE_ARGS` lambdas build kwargs from a context hash; `association_walk` is the most complex
125
+ - Settings fall through: `Legion::Settings[:gaia]` if available, else `Legion::Gaia::Settings.default`
126
+ - `InputFrame`/`OutputFrame` use `Data.define` for immutability — frozen by default, pattern-matchable
127
+ - Channel adapters are deliberately thin: translate format, not content. No business logic, no state
128
+ - `SessionStore` uses identity-indexed lookup with TTL-based expiration and channel history tracking
129
+
130
+ ## Architectural Constraints
131
+
132
+ 1. No channel-specific state — adapters store nothing, destroy and recreate without loss
133
+ 2. No channel-specific logic — adapters translate format, not content
134
+ 3. Authentication is non-negotiable — every channel validates identity before input reaches GAIA
135
+ 4. Private core protections are channel-independent
136
+ 5. Human controls channel availability — any channel can be disabled at any time
137
+
138
+ ## Dependencies
139
+
140
+ - `base64` (required, Ruby 3.4+ removed from default gems)
141
+ - `legion-logging` (optional, guarded by `const_defined?`)
142
+ - `legion-json` (optional)
143
+ - `legion-transport` (optional, for router mode — not a gem dependency)
144
+ - `lex-tick` (runtime, for tick orchestration — not a gem dependency)
145
+ - `lex-microsoft_teams` (runtime, for Teams delivery — not a gem dependency)
146
+ - All agentic LEXs are optional runtime dependencies discovered via `Legion::Extensions`
147
+
148
+ ## Future
149
+
150
+ - Voice adapter
151
+ - Proactive notification scheduling (agent-initiated messages at optimal delivery times)
data/Gemfile ADDED
@@ -0,0 +1,261 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'rake'
8
+ gem 'rspec'
9
+ gem 'rubocop'
10
+
11
+ group :test do
12
+ gem 'legion-json', path: '../legion-json' if Dir.exist?("#{__dir__}/../legion-json")
13
+ gem 'legion-logging', path: '../legion-logging' if Dir.exist?("#{__dir__}/../legion-logging")
14
+
15
+ # Agentic cognitive extensions (local path resolution when sibling repos exist)
16
+ agentic_dir = File.expand_path('../extensions-agentic', __dir__)
17
+ if Dir.exist?(agentic_dir)
18
+ gem 'lex-abductive-reasoning', path: '../extensions-agentic/lex-abductive-reasoning'
19
+ gem 'lex-affordance', path: '../extensions-agentic/lex-affordance'
20
+ gem 'lex-agency', path: '../extensions-agentic/lex-agency'
21
+ gem 'lex-analogical-reasoning', path: '../extensions-agentic/lex-analogical-reasoning'
22
+ gem 'lex-anchoring', path: '../extensions-agentic/lex-anchoring'
23
+ gem 'lex-anosognosia', path: '../extensions-agentic/lex-anosognosia'
24
+ gem 'lex-appraisal', path: '../extensions-agentic/lex-appraisal'
25
+ gem 'lex-argument-mapping', path: '../extensions-agentic/lex-argument-mapping'
26
+ gem 'lex-arousal', path: '../extensions-agentic/lex-arousal'
27
+ gem 'lex-attention', path: '../extensions-agentic/lex-attention'
28
+ gem 'lex-attentional-blink', path: '../extensions-agentic/lex-attentional-blink'
29
+ gem 'lex-attention-economy', path: '../extensions-agentic/lex-attention-economy'
30
+ gem 'lex-attention-regulation', path: '../extensions-agentic/lex-attention-regulation'
31
+ gem 'lex-attention-schema', path: '../extensions-agentic/lex-attention-schema'
32
+ gem 'lex-attention-spotlight', path: '../extensions-agentic/lex-attention-spotlight'
33
+ gem 'lex-attention-switching', path: '../extensions-agentic/lex-attention-switching'
34
+ gem 'lex-bayesian-belief', path: '../extensions-agentic/lex-bayesian-belief'
35
+ gem 'lex-belief-revision', path: '../extensions-agentic/lex-belief-revision'
36
+ gem 'lex-bias', path: '../extensions-agentic/lex-bias'
37
+ gem 'lex-causal-attribution', path: '../extensions-agentic/lex-causal-attribution'
38
+ gem 'lex-causal-reasoning', path: '../extensions-agentic/lex-causal-reasoning'
39
+ gem 'lex-cognitive-alchemy', path: '../extensions-agentic/lex-cognitive-alchemy'
40
+ gem 'lex-cognitive-anchor', path: '../extensions-agentic/lex-cognitive-anchor'
41
+ gem 'lex-cognitive-apprenticeship', path: '../extensions-agentic/lex-cognitive-apprenticeship'
42
+ gem 'lex-cognitive-archaeology', path: '../extensions-agentic/lex-cognitive-archaeology'
43
+ gem 'lex-cognitive-architecture', path: '../extensions-agentic/lex-cognitive-architecture'
44
+ gem 'lex-cognitive-aurora', path: '../extensions-agentic/lex-cognitive-aurora'
45
+ gem 'lex-cognitive-autopilot', path: '../extensions-agentic/lex-cognitive-autopilot'
46
+ gem 'lex-cognitive-avalanche', path: '../extensions-agentic/lex-cognitive-avalanche'
47
+ gem 'lex-cognitive-blindspot', path: '../extensions-agentic/lex-cognitive-blindspot'
48
+ gem 'lex-cognitive-boundary', path: '../extensions-agentic/lex-cognitive-boundary'
49
+ gem 'lex-cognitive-catalyst', path: '../extensions-agentic/lex-cognitive-catalyst'
50
+ gem 'lex-cognitive-chrysalis', path: '../extensions-agentic/lex-cognitive-chrysalis'
51
+ gem 'lex-cognitive-chunking', path: '../extensions-agentic/lex-cognitive-chunking'
52
+ gem 'lex-cognitive-cocoon', path: '../extensions-agentic/lex-cognitive-cocoon'
53
+ gem 'lex-cognitive-coherence', path: '../extensions-agentic/lex-cognitive-coherence'
54
+ gem 'lex-cognitive-compass', path: '../extensions-agentic/lex-cognitive-compass'
55
+ gem 'lex-cognitive-compression', path: '../extensions-agentic/lex-cognitive-compression'
56
+ gem 'lex-cognitive-constellation', path: '../extensions-agentic/lex-cognitive-constellation'
57
+ gem 'lex-cognitive-contagion', path: '../extensions-agentic/lex-cognitive-contagion'
58
+ gem 'lex-cognitive-control', path: '../extensions-agentic/lex-cognitive-control'
59
+ gem 'lex-cognitive-debt', path: '../extensions-agentic/lex-cognitive-debt'
60
+ gem 'lex-cognitive-debugging', path: '../extensions-agentic/lex-cognitive-debugging'
61
+ gem 'lex-cognitive-defusion', path: '../extensions-agentic/lex-cognitive-defusion'
62
+ gem 'lex-cognitive-disengagement', path: '../extensions-agentic/lex-cognitive-disengagement'
63
+ gem 'lex-cognitive-dissonance-resolution', path: '../extensions-agentic/lex-cognitive-dissonance-resolution'
64
+ gem 'lex-cognitive-dwell', path: '../extensions-agentic/lex-cognitive-dwell'
65
+ gem 'lex-cognitive-echo', path: '../extensions-agentic/lex-cognitive-echo'
66
+ gem 'lex-cognitive-echo-chamber', path: '../extensions-agentic/lex-cognitive-echo-chamber'
67
+ gem 'lex-cognitive-empathy', path: '../extensions-agentic/lex-cognitive-empathy'
68
+ gem 'lex-cognitive-entrainment', path: '../extensions-agentic/lex-cognitive-entrainment'
69
+ gem 'lex-cognitive-erosion', path: '../extensions-agentic/lex-cognitive-erosion'
70
+ gem 'lex-cognitive-fatigue-model', path: '../extensions-agentic/lex-cognitive-fatigue-model'
71
+ gem 'lex-cognitive-fermentation', path: '../extensions-agentic/lex-cognitive-fermentation'
72
+ gem 'lex-cognitive-fingerprint', path: '../extensions-agentic/lex-cognitive-fingerprint'
73
+ gem 'lex-cognitive-flexibility', path: '../extensions-agentic/lex-cognitive-flexibility'
74
+ gem 'lex-cognitive-flexibility-training', path: '../extensions-agentic/lex-cognitive-flexibility-training'
75
+ gem 'lex-cognitive-fossil-fuel', path: '../extensions-agentic/lex-cognitive-fossil-fuel'
76
+ gem 'lex-cognitive-friction', path: '../extensions-agentic/lex-cognitive-friction'
77
+ gem 'lex-cognitive-furnace', path: '../extensions-agentic/lex-cognitive-furnace'
78
+ gem 'lex-cognitive-garden', path: '../extensions-agentic/lex-cognitive-garden'
79
+ gem 'lex-cognitive-genesis', path: '../extensions-agentic/lex-cognitive-genesis'
80
+ gem 'lex-cognitive-grammar', path: '../extensions-agentic/lex-cognitive-grammar'
81
+ gem 'lex-cognitive-gravity', path: '../extensions-agentic/lex-cognitive-gravity'
82
+ gem 'lex-cognitive-greenhouse', path: '../extensions-agentic/lex-cognitive-greenhouse'
83
+ gem 'lex-cognitive-hologram', path: '../extensions-agentic/lex-cognitive-hologram'
84
+ gem 'lex-cognitive-homeostasis', path: '../extensions-agentic/lex-cognitive-homeostasis'
85
+ gem 'lex-cognitive-horizon', path: '../extensions-agentic/lex-cognitive-horizon'
86
+ gem 'lex-cognitive-hourglass', path: '../extensions-agentic/lex-cognitive-hourglass'
87
+ gem 'lex-cognitive-immune-memory', path: '../extensions-agentic/lex-cognitive-immune-memory'
88
+ gem 'lex-cognitive-immune-response', path: '../extensions-agentic/lex-cognitive-immune-response'
89
+ gem 'lex-cognitive-immunology', path: '../extensions-agentic/lex-cognitive-immunology'
90
+ gem 'lex-cognitive-inertia', path: '../extensions-agentic/lex-cognitive-inertia'
91
+ gem 'lex-cognitive-integration', path: '../extensions-agentic/lex-cognitive-integration'
92
+ gem 'lex-cognitive-kaleidoscope', path: '../extensions-agentic/lex-cognitive-kaleidoscope'
93
+ gem 'lex-cognitive-labyrinth', path: '../extensions-agentic/lex-cognitive-labyrinth'
94
+ gem 'lex-cognitive-lens', path: '../extensions-agentic/lex-cognitive-lens'
95
+ gem 'lex-cognitive-lighthouse', path: '../extensions-agentic/lex-cognitive-lighthouse'
96
+ gem 'lex-cognitive-liminal', path: '../extensions-agentic/lex-cognitive-liminal'
97
+ gem 'lex-cognitive-load', path: '../extensions-agentic/lex-cognitive-load'
98
+ gem 'lex-cognitive-load-balancing', path: '../extensions-agentic/lex-cognitive-load-balancing'
99
+ gem 'lex-cognitive-lucidity', path: '../extensions-agentic/lex-cognitive-lucidity'
100
+ gem 'lex-cognitive-magnet', path: '../extensions-agentic/lex-cognitive-magnet'
101
+ gem 'lex-cognitive-map', path: '../extensions-agentic/lex-cognitive-map'
102
+ gem 'lex-cognitive-metabolism', path: '../extensions-agentic/lex-cognitive-metabolism'
103
+ gem 'lex-cognitive-mirror', path: '../extensions-agentic/lex-cognitive-mirror'
104
+ gem 'lex-cognitive-momentum', path: '../extensions-agentic/lex-cognitive-momentum'
105
+ gem 'lex-cognitive-mosaic', path: '../extensions-agentic/lex-cognitive-mosaic'
106
+ gem 'lex-cognitive-mycelium', path: '../extensions-agentic/lex-cognitive-mycelium'
107
+ gem 'lex-cognitive-narrative-arc', path: '../extensions-agentic/lex-cognitive-narrative-arc'
108
+ gem 'lex-cognitive-nostalgia', path: '../extensions-agentic/lex-cognitive-nostalgia'
109
+ gem 'lex-cognitive-offloading', path: '../extensions-agentic/lex-cognitive-offloading'
110
+ gem 'lex-cognitive-origami', path: '../extensions-agentic/lex-cognitive-origami'
111
+ gem 'lex-cognitive-paleontology', path: '../extensions-agentic/lex-cognitive-paleontology'
112
+ gem 'lex-cognitive-palimpsest', path: '../extensions-agentic/lex-cognitive-palimpsest'
113
+ gem 'lex-cognitive-pendulum', path: '../extensions-agentic/lex-cognitive-pendulum'
114
+ gem 'lex-cognitive-phantom', path: '../extensions-agentic/lex-cognitive-phantom'
115
+ gem 'lex-cognitive-plasticity', path: '../extensions-agentic/lex-cognitive-plasticity'
116
+ gem 'lex-cognitive-prism', path: '../extensions-agentic/lex-cognitive-prism'
117
+ gem 'lex-cognitive-quicksand', path: '../extensions-agentic/lex-cognitive-quicksand'
118
+ gem 'lex-cognitive-quicksilver', path: '../extensions-agentic/lex-cognitive-quicksilver'
119
+ gem 'lex-cognitive-reappraisal', path: '../extensions-agentic/lex-cognitive-reappraisal'
120
+ gem 'lex-cognitive-reserve', path: '../extensions-agentic/lex-cognitive-reserve'
121
+ gem 'lex-cognitive-resonance', path: '../extensions-agentic/lex-cognitive-resonance'
122
+ gem 'lex-cognitive-rhythm', path: '../extensions-agentic/lex-cognitive-rhythm'
123
+ gem 'lex-cognitive-scaffolding', path: '../extensions-agentic/lex-cognitive-scaffolding'
124
+ gem 'lex-cognitive-surplus', path: '../extensions-agentic/lex-cognitive-surplus'
125
+ gem 'lex-cognitive-symbiosis', path: '../extensions-agentic/lex-cognitive-symbiosis'
126
+ gem 'lex-cognitive-synesthesia', path: '../extensions-agentic/lex-cognitive-synesthesia'
127
+ gem 'lex-cognitive-synthesis', path: '../extensions-agentic/lex-cognitive-synthesis'
128
+ gem 'lex-cognitive-tapestry', path: '../extensions-agentic/lex-cognitive-tapestry'
129
+ gem 'lex-cognitive-tectonics', path: '../extensions-agentic/lex-cognitive-tectonics'
130
+ gem 'lex-cognitive-telescope', path: '../extensions-agentic/lex-cognitive-telescope'
131
+ gem 'lex-cognitive-tempo', path: '../extensions-agentic/lex-cognitive-tempo'
132
+ gem 'lex-cognitive-tessellation', path: '../extensions-agentic/lex-cognitive-tessellation'
133
+ gem 'lex-cognitive-tide', path: '../extensions-agentic/lex-cognitive-tide'
134
+ gem 'lex-cognitive-triage', path: '../extensions-agentic/lex-cognitive-triage'
135
+ gem 'lex-cognitive-volcano', path: '../extensions-agentic/lex-cognitive-volcano'
136
+ gem 'lex-cognitive-weather', path: '../extensions-agentic/lex-cognitive-weather'
137
+ gem 'lex-cognitive-weathering', path: '../extensions-agentic/lex-cognitive-weathering'
138
+ gem 'lex-cognitive-whirlpool', path: '../extensions-agentic/lex-cognitive-whirlpool'
139
+ gem 'lex-cognitive-zeitgeist', path: '../extensions-agentic/lex-cognitive-zeitgeist'
140
+ gem 'lex-coldstart', path: '../extensions-agentic/lex-coldstart'
141
+ gem 'lex-conceptual-blending', path: '../extensions-agentic/lex-conceptual-blending'
142
+ gem 'lex-conceptual-metaphor', path: '../extensions-agentic/lex-conceptual-metaphor'
143
+ gem 'lex-confabulation', path: '../extensions-agentic/lex-confabulation'
144
+ gem 'lex-conflict', path: '../extensions-agentic/lex-conflict'
145
+ gem 'lex-conscience', path: '../extensions-agentic/lex-conscience'
146
+ gem 'lex-consent', path: '../extensions-agentic/lex-consent'
147
+ gem 'lex-context', path: '../extensions-agentic/lex-context'
148
+ gem 'lex-cortex', path: '../extensions-agentic/lex-cortex'
149
+ gem 'lex-counterfactual', path: '../extensions-agentic/lex-counterfactual'
150
+ gem 'lex-creativity', path: '../extensions-agentic/lex-creativity'
151
+ gem 'lex-curiosity', path: '../extensions-agentic/lex-curiosity'
152
+ gem 'lex-decision-fatigue', path: '../extensions-agentic/lex-decision-fatigue'
153
+ gem 'lex-default-mode-network', path: '../extensions-agentic/lex-default-mode-network'
154
+ gem 'lex-dissonance', path: '../extensions-agentic/lex-dissonance'
155
+ gem 'lex-distributed-cognition', path: '../extensions-agentic/lex-distributed-cognition'
156
+ gem 'lex-dream', path: '../extensions-agentic/lex-dream'
157
+ gem 'lex-dual-process', path: '../extensions-agentic/lex-dual-process'
158
+ gem 'lex-embodied-simulation', path: '../extensions-agentic/lex-embodied-simulation'
159
+ gem 'lex-emotion', path: '../extensions-agentic/lex-emotion'
160
+ gem 'lex-emotional-regulation', path: '../extensions-agentic/lex-emotional-regulation'
161
+ gem 'lex-empathy', path: '../extensions-agentic/lex-empathy'
162
+ gem 'lex-enactive-cognition', path: '../extensions-agentic/lex-enactive-cognition'
163
+ gem 'lex-episodic-buffer', path: '../extensions-agentic/lex-episodic-buffer'
164
+ gem 'lex-epistemic-curiosity', path: '../extensions-agentic/lex-epistemic-curiosity'
165
+ gem 'lex-epistemic-vigilance', path: '../extensions-agentic/lex-epistemic-vigilance'
166
+ gem 'lex-error-monitoring', path: '../extensions-agentic/lex-error-monitoring'
167
+ gem 'lex-executive-function', path: '../extensions-agentic/lex-executive-function'
168
+ gem 'lex-expectation-violation', path: '../extensions-agentic/lex-expectation-violation'
169
+ gem 'lex-extinction', path: '../extensions-agentic/lex-extinction'
170
+ gem 'lex-fatigue', path: '../extensions-agentic/lex-fatigue'
171
+ gem 'lex-feature-binding', path: '../extensions-agentic/lex-feature-binding'
172
+ gem 'lex-flow', path: '../extensions-agentic/lex-flow'
173
+ gem 'lex-frame-semantics', path: '../extensions-agentic/lex-frame-semantics'
174
+ gem 'lex-free-energy', path: '../extensions-agentic/lex-free-energy'
175
+ gem 'lex-gestalt', path: '../extensions-agentic/lex-gestalt'
176
+ gem 'lex-global-workspace', path: '../extensions-agentic/lex-global-workspace'
177
+ gem 'lex-goal-management', path: '../extensions-agentic/lex-goal-management'
178
+ gem 'lex-governance', path: '../extensions-agentic/lex-governance'
179
+ gem 'lex-habit', path: '../extensions-agentic/lex-habit'
180
+ gem 'lex-hebbian-assembly', path: '../extensions-agentic/lex-hebbian-assembly'
181
+ gem 'lex-homeostasis', path: '../extensions-agentic/lex-homeostasis'
182
+ gem 'lex-hypothesis-testing', path: '../extensions-agentic/lex-hypothesis-testing'
183
+ gem 'lex-identity', path: '../extensions-agentic/lex-identity'
184
+ gem 'lex-imagination', path: '../extensions-agentic/lex-imagination'
185
+ gem 'lex-inhibition', path: '../extensions-agentic/lex-inhibition'
186
+ gem 'lex-inner-speech', path: '../extensions-agentic/lex-inner-speech'
187
+ gem 'lex-interoception', path: '../extensions-agentic/lex-interoception'
188
+ gem 'lex-intuition', path: '../extensions-agentic/lex-intuition'
189
+ gem 'lex-joint-attention', path: '../extensions-agentic/lex-joint-attention'
190
+ gem 'lex-language', path: '../extensions-agentic/lex-language'
191
+ gem 'lex-latent-inhibition', path: '../extensions-agentic/lex-latent-inhibition'
192
+ gem 'lex-learning-rate', path: '../extensions-agentic/lex-learning-rate'
193
+ gem 'lex-memory', path: '../extensions-agentic/lex-memory'
194
+ gem 'lex-mentalizing', path: '../extensions-agentic/lex-mentalizing'
195
+ gem 'lex-mental-simulation', path: '../extensions-agentic/lex-mental-simulation'
196
+ gem 'lex-mental-time-travel', path: '../extensions-agentic/lex-mental-time-travel'
197
+ gem 'lex-mesh', path: '../extensions-agentic/lex-mesh'
198
+ gem 'lex-metacognition', path: '../extensions-agentic/lex-metacognition'
199
+ gem 'lex-metacognitive-monitoring', path: '../extensions-agentic/lex-metacognitive-monitoring'
200
+ gem 'lex-meta-learning', path: '../extensions-agentic/lex-meta-learning'
201
+ gem 'lex-mind-growth', path: '../extensions-agentic/lex-mind-growth'
202
+ gem 'lex-mirror', path: '../extensions-agentic/lex-mirror'
203
+ gem 'lex-mood', path: '../extensions-agentic/lex-mood'
204
+ gem 'lex-moral-reasoning', path: '../extensions-agentic/lex-moral-reasoning'
205
+ gem 'lex-motivation', path: '../extensions-agentic/lex-motivation'
206
+ gem 'lex-narrative-identity', path: '../extensions-agentic/lex-narrative-identity'
207
+ gem 'lex-narrative-reasoning', path: '../extensions-agentic/lex-narrative-reasoning'
208
+ gem 'lex-narrative-self', path: '../extensions-agentic/lex-narrative-self'
209
+ gem 'lex-narrator', path: '../extensions-agentic/lex-narrator'
210
+ gem 'lex-neural-oscillation', path: '../extensions-agentic/lex-neural-oscillation'
211
+ gem 'lex-neuromodulation', path: '../extensions-agentic/lex-neuromodulation'
212
+ gem 'lex-perceptual-inference', path: '../extensions-agentic/lex-perceptual-inference'
213
+ gem 'lex-personality', path: '../extensions-agentic/lex-personality'
214
+ gem 'lex-perspective-shifting', path: '../extensions-agentic/lex-perspective-shifting'
215
+ gem 'lex-phenomenal-binding', path: '../extensions-agentic/lex-phenomenal-binding'
216
+ gem 'lex-planning', path: '../extensions-agentic/lex-planning'
217
+ gem 'lex-pragmatic-inference', path: '../extensions-agentic/lex-pragmatic-inference'
218
+ gem 'lex-prediction', path: '../extensions-agentic/lex-prediction'
219
+ gem 'lex-predictive-coding', path: '../extensions-agentic/lex-predictive-coding'
220
+ gem 'lex-predictive-processing', path: '../extensions-agentic/lex-predictive-processing'
221
+ gem 'lex-preference-learning', path: '../extensions-agentic/lex-preference-learning'
222
+ gem 'lex-priming', path: '../extensions-agentic/lex-priming'
223
+ gem 'lex-privatecore', path: '../extensions-agentic/lex-privatecore'
224
+ gem 'lex-procedural-learning', path: '../extensions-agentic/lex-procedural-learning'
225
+ gem 'lex-prospection', path: '../extensions-agentic/lex-prospection'
226
+ gem 'lex-prospective-memory', path: '../extensions-agentic/lex-prospective-memory'
227
+ gem 'lex-qualia', path: '../extensions-agentic/lex-qualia'
228
+ gem 'lex-reality-testing', path: '../extensions-agentic/lex-reality-testing'
229
+ gem 'lex-reflection', path: '../extensions-agentic/lex-reflection'
230
+ gem 'lex-relevance-theory', path: '../extensions-agentic/lex-relevance-theory'
231
+ gem 'lex-resilience', path: '../extensions-agentic/lex-resilience'
232
+ gem 'lex-reward', path: '../extensions-agentic/lex-reward'
233
+ gem 'lex-salience', path: '../extensions-agentic/lex-salience'
234
+ gem 'lex-schema', path: '../extensions-agentic/lex-schema'
235
+ gem 'lex-self-model', path: '../extensions-agentic/lex-self-model'
236
+ gem 'lex-self-talk', path: '../extensions-agentic/lex-self-talk'
237
+ gem 'lex-semantic-memory', path: '../extensions-agentic/lex-semantic-memory'
238
+ gem 'lex-semantic-priming', path: '../extensions-agentic/lex-semantic-priming'
239
+ gem 'lex-semantic-satiation', path: '../extensions-agentic/lex-semantic-satiation'
240
+ gem 'lex-sensory-gating', path: '../extensions-agentic/lex-sensory-gating'
241
+ gem 'lex-signal-detection', path: '../extensions-agentic/lex-signal-detection'
242
+ gem 'lex-situation-model', path: '../extensions-agentic/lex-situation-model'
243
+ gem 'lex-social', path: '../extensions-agentic/lex-social'
244
+ gem 'lex-social-learning', path: '../extensions-agentic/lex-social-learning'
245
+ gem 'lex-somatic-marker', path: '../extensions-agentic/lex-somatic-marker'
246
+ gem 'lex-source-monitoring', path: '../extensions-agentic/lex-source-monitoring'
247
+ gem 'lex-subliminal', path: '../extensions-agentic/lex-subliminal'
248
+ gem 'lex-surprise', path: '../extensions-agentic/lex-surprise'
249
+ gem 'lex-swarm', path: '../extensions-agentic/lex-swarm'
250
+ gem 'lex-swarm-github', path: '../extensions-agentic/lex-swarm-github'
251
+ gem 'lex-temporal', path: '../extensions-agentic/lex-temporal'
252
+ gem 'lex-temporal-discounting', path: '../extensions-agentic/lex-temporal-discounting'
253
+ gem 'lex-theory-of-mind', path: '../extensions-agentic/lex-theory-of-mind'
254
+ gem 'lex-tick', path: '../extensions-agentic/lex-tick'
255
+ gem 'lex-transfer-learning', path: '../extensions-agentic/lex-transfer-learning'
256
+ gem 'lex-trust', path: '../extensions-agentic/lex-trust'
257
+ gem 'lex-uncertainty-tolerance', path: '../extensions-agentic/lex-uncertainty-tolerance'
258
+ gem 'lex-volition', path: '../extensions-agentic/lex-volition'
259
+ gem 'lex-working-memory', path: '../extensions-agentic/lex-working-memory'
260
+ end
261
+ end