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.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +16 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +45 -0
- data/CHANGELOG.md +101 -0
- data/CLAUDE.md +151 -0
- data/Gemfile +261 -0
- data/LICENSE +190 -0
- data/README.md +167 -0
- data/legion-gaia.gemspec +276 -0
- data/lib/legion/gaia/actors/heartbeat.rb +39 -0
- data/lib/legion/gaia/channel_adapter.rb +43 -0
- data/lib/legion/gaia/channel_aware_renderer.rb +89 -0
- data/lib/legion/gaia/channel_registry.rb +60 -0
- data/lib/legion/gaia/channels/cli_adapter.rb +52 -0
- data/lib/legion/gaia/channels/slack/signing_verifier.rb +36 -0
- data/lib/legion/gaia/channels/slack_adapter.rb +102 -0
- data/lib/legion/gaia/channels/teams/bot_framework_auth.rb +101 -0
- data/lib/legion/gaia/channels/teams/conversation_store.rb +67 -0
- data/lib/legion/gaia/channels/teams/webhook_handler.rb +91 -0
- data/lib/legion/gaia/channels/teams_adapter.rb +153 -0
- data/lib/legion/gaia/input_frame.rb +58 -0
- data/lib/legion/gaia/notification_gate/behavioral_evaluator.rb +56 -0
- data/lib/legion/gaia/notification_gate/delay_queue.rb +55 -0
- data/lib/legion/gaia/notification_gate/presence_evaluator.rb +53 -0
- data/lib/legion/gaia/notification_gate/schedule_evaluator.rb +75 -0
- data/lib/legion/gaia/notification_gate.rb +86 -0
- data/lib/legion/gaia/offline_handler.rb +83 -0
- data/lib/legion/gaia/output_frame.rb +45 -0
- data/lib/legion/gaia/output_router.rb +58 -0
- data/lib/legion/gaia/phase_wiring.rb +143 -0
- data/lib/legion/gaia/proactive.rb +41 -0
- data/lib/legion/gaia/registry.rb +99 -0
- data/lib/legion/gaia/router/agent_bridge.rb +97 -0
- data/lib/legion/gaia/router/router_bridge.rb +119 -0
- data/lib/legion/gaia/router/transport/exchanges/gaia.rb +17 -0
- data/lib/legion/gaia/router/transport/messages/input_frame_message.rb +44 -0
- data/lib/legion/gaia/router/transport/messages/output_frame_message.rb +42 -0
- data/lib/legion/gaia/router/transport/queues/inbound.rb +26 -0
- data/lib/legion/gaia/router/transport/queues/outbound.rb +17 -0
- data/lib/legion/gaia/router/worker_routing.rb +67 -0
- data/lib/legion/gaia/router.rb +25 -0
- data/lib/legion/gaia/runner_host.rb +20 -0
- data/lib/legion/gaia/sensory_buffer.rb +47 -0
- data/lib/legion/gaia/session_store.rb +90 -0
- data/lib/legion/gaia/settings.rb +40 -0
- data/lib/legion/gaia/version.rb +7 -0
- data/lib/legion/gaia.rb +266 -0
- 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
data/.rspec
ADDED
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
|