Module: SolidLoop

Defined in:
lib/solid_loop.rb,
lib/solid_loop/mcp.rb,
lib/solid_loop/engine.rb,
lib/solid_loop/reaper.rb,
lib/solid_loop/version.rb,
lib/solid_loop/pipeline.rb,
lib/solid_loop/mcp/result.rb,
lib/solid_loop/mcp/server.rb,
lib/solid_loop/mcp_client.rb,
app/models/solid_loop/base.rb,
app/models/solid_loop/loop.rb,
lib/solid_loop/llm_metrics.rb,
lib/solid_loop/mcp/toolset.rb,
app/models/solid_loop/event.rb,
lib/solid_loop/configuration.rb,
lib/solid_loop/lease_renewer.rb,
lib/solid_loop/mcp/principal.rb,
lib/solid_loop/mcp/transport.rb,
app/models/solid_loop/message.rb,
app/jobs/solid_loop/reaper_job.rb,
app/models/solid_loop/mcp_tool.rb,
lib/solid_loop/lease_heartbeat.rb,
app/models/solid_loop/tool_call.rb,
lib/solid_loop/mcp/call_context.rb,
lib/solid_loop/pipeline/builder.rb,
lib/solid_loop/pipeline/context.rb,
app/models/solid_loop/mcp_session.rb,
lib/solid_loop/mcp/client_factory.rb,
lib/solid_loop/mcp/http_transport.rb,
lib/solid_loop/mcp/stdio_transport.rb,
app/jobs/solid_loop/application_job.rb,
lib/solid_loop/pipeline/tool_context.rb,
app/jobs/solid_loop/llm_completion_job.rb,
app/jobs/solid_loop/tool_execution_job.rb,
app/queries/solid_loop/admin/base_query.rb,
app/services/solid_loop/adapters/native.rb,
app/services/solid_loop/dialects/gemini.rb,
app/models/solid_loop/application_record.rb,
app/queries/solid_loop/admin/loops_query.rb,
app/services/solid_loop/dialects/open_ai.rb,
app/services/solid_loop/llm_usage_parser.rb,
app/helpers/solid_loop/application_helper.rb,
app/jobs/solid_loop/observe_broadcast_job.rb,
app/models/solid_loop/mcp_inbound_session.rb,
app/queries/solid_loop/admin/events_query.rb,
app/services/solid_loop/dialects/anthropic.rb,
app/controllers/solid_loop/loops_controller.rb,
app/queries/solid_loop/admin/messages_query.rb,
app/controllers/solid_loop/events_controller.rb,
app/queries/solid_loop/admin/mcp_tools_query.rb,
app/queries/solid_loop/admin/tool_calls_query.rb,
app/services/solid_loop/sse_stream_aggregator.rb,
app/controllers/solid_loop/messages_controller.rb,
app/services/solid_loop/llm_usage_parser/llama.rb,
app/controllers/solid_loop/dashboard_controller.rb,
app/controllers/solid_loop/mcp_tools_controller.rb,
app/queries/solid_loop/admin/mcp_sessions_query.rb,
app/services/solid_loop/llm_usage_parser/gemini.rb,
app/services/solid_loop/llm_usage_parser/openai.rb,
app/services/solid_loop/mcp_session_initializer.rb,
app/services/solid_loop/tool_failure_reconciler.rb,
app/controllers/solid_loop/tool_calls_controller.rb,
app/controllers/solid_loop/application_controller.rb,
app/services/solid_loop/dialects/reasoning_packer.rb,
app/services/solid_loop/middlewares/event_logging.rb,
app/controllers/solid_loop/mcp_sessions_controller.rb,
app/services/solid_loop/llm_usage_parser/anthropic.rb,
app/services/solid_loop/mcp_tool_execution_service.rb,
app/services/solid_loop/middlewares/error_handling.rb,
app/services/solid_loop/middlewares/network_calling.rb,
app/services/solid_loop/middlewares/message_building.rb,
app/services/solid_loop/middlewares/response_parsing.rb,
app/services/solid_loop/tool_middlewares/event_logging.rb,
app/queries/solid_loop/admin/mcp_inbound_sessions_query.rb,
app/services/solid_loop/tool_middlewares/error_handling.rb,
app/services/solid_loop/tool_middlewares/tool_execution.rb,
app/services/solid_loop/middlewares/agent_initialization.rb,
app/services/solid_loop/middlewares/tool_call_xml_parser.rb,
app/controllers/solid_loop/mcp_inbound_sessions_controller.rb,
app/services/solid_loop/tool_middlewares/response_creation.rb,
app/services/solid_loop/tool_middlewares/agent_initialization.rb

Defined Under Namespace

Modules: Adapters, Admin, ApplicationHelper, Dialects, Mcp, Middlewares, ToolFailureReconciler, ToolMiddlewares Classes: ApplicationController, ApplicationJob, ApplicationRecord, Base, CancellationError, Configuration, DashboardController, Engine, EnqueueError, Event, EventsController, LeaseHeartbeat, LeaseRenewer, LimitExceededError, LlmCompletionJob, LlmMetrics, LlmUsageParser, Loop, LoopsController, LostLease, McpClient, McpError, McpInboundSession, McpInboundSessionsController, McpSession, McpSessionInitializer, McpSessionInvalidError, McpSessionsController, McpTool, McpToolError, McpToolExecutionService, McpToolsController, Message, MessagesController, ObserveBroadcastJob, Pipeline, Reaper, ReaperJob, SseStreamAggregator, SteeringError, ToolCall, ToolCallsController, ToolExecutionJob

Constant Summary collapse

VERSION =
"0.0.4"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.last_reaped_atObject

Timestamp of the last successful reap! — a liveness health signal for hosts to alert on ("has the reaper run recently?"). nil until the first reap completes. Process-local (each worker tracks its own last run).



67
68
69
# File 'lib/solid_loop.rb', line 67

def last_reaped_at
  @last_reaped_at
end

.subject_resolverObject

Optional host-app hook for the admin dashboard to deep-link a loop's polymorphic subject (which the engine can't route to on its own). A callable taking the loop and returning a URL string, or a Hash { url:, label: }. Left nil by default — the admin degrades to plain text.



49
50
51
# File 'lib/solid_loop.rb', line 49

def subject_resolver
  @subject_resolver
end

Class Method Details

.configObject

Durable-lease + reaper configuration (see docs/decisions/durable_attempt_lease.md).



52
53
54
# File 'lib/solid_loop.rb', line 52

def config
  @config ||= Configuration.new
end

.configure {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:

  • _self (SolidLoop)

    the object that the method was called on



90
91
92
# File 'lib/solid_loop.rb', line 90

def configure
  yield self
end

.enqueue!(job_class, *args) ⇒ Object

Enqueue a successor job, raising unless ActiveJob confirms it was actually enqueued. perform_later returns false when an enqueue callback aborts; left unchecked, callers would commit state (a queued loop, a persisted tool-call row) with no job to advance it. Returns the enqueued job.



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/solid_loop.rb', line 33

def enqueue!(job_class, *args)
  job = job_class.perform_later(*args)

  unless job.is_a?(ActiveJob::Base) && job.successfully_enqueued?
    raise EnqueueError,
      "Failed to enqueue #{job_class.name}(#{args.map(&:inspect).join(', ')}): " \
      "perform_later returned #{job.inspect} (enqueue aborted?)"
  end

  job
end

.llm_middlewaresObject



69
70
71
72
73
74
75
76
77
78
# File 'lib/solid_loop.rb', line 69

def llm_middlewares
  @llm_middlewares ||= Pipeline::Builder.new([
    Middlewares::ErrorHandling,
    Middlewares::AgentInitialization,
    Middlewares::MessageBuilding,
    Middlewares::EventLogging,
    Middlewares::NetworkCalling,
    Middlewares::ResponseParsing
  ])
end

.reap!(now: Time.current) ⇒ Object

Reap dead/lost LLM turns and repair lost queue rows. Idempotent; safe to run concurrently (each case re-checks its condition under a row lock). Returns the SolidLoop::Reaper::Result. Host installs the recurrence via SolidLoop::ReaperJob — the gem does NOT own a scheduler.



60
61
62
# File 'lib/solid_loop.rb', line 60

def reap!(now: Time.current)
  Reaper.new(now: now).call
end

.tool_middlewaresObject



80
81
82
83
84
85
86
87
88
# File 'lib/solid_loop.rb', line 80

def tool_middlewares
  @tool_middlewares ||= Pipeline::Builder.new([
    ToolMiddlewares::ErrorHandling,
    ToolMiddlewares::AgentInitialization,
    ToolMiddlewares::EventLogging,
    ToolMiddlewares::ToolExecution,
    ToolMiddlewares::ResponseCreation
  ])
end