igniter 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -3
- data/README.md +162 -624
- data/bin/igniter-stack +94 -0
- data/docs/README.md +62 -0
- data/examples/README.md +74 -349
- data/examples/agent_orchestration.rb +76 -0
- data/examples/agents.rb +2 -1
- data/examples/catalog.rb +412 -0
- data/examples/consensus.rb +13 -11
- data/examples/dataflow.rb +3 -2
- data/examples/distributed_workflow.rb +1 -1
- data/examples/effects.rb +10 -9
- data/examples/incremental.rb +4 -3
- data/examples/introspection.rb +49 -0
- data/examples/invariants.rb +4 -3
- data/examples/llm_tools.rb +18 -18
- data/examples/mesh.rb +16 -14
- data/examples/mesh_discovery.rb +41 -21
- data/examples/mesh_gossip.rb +19 -17
- data/examples/reactive_auditing.rb +50 -0
- data/examples/run.rb +163 -0
- data/lib/igniter/monorepo_packages.rb +17 -0
- data/lib/igniter/stack.rb +5 -0
- data/lib/igniter.rb +33 -17
- data/packages/igniter-agents/README.md +22 -0
- data/{lib → packages/igniter-agents/lib}/igniter/agent/ref.rb +1 -0
- data/{lib → packages/igniter-agents/lib}/igniter/agent/runner.rb +12 -0
- data/{lib → packages/igniter-agents/lib}/igniter/agent.rb +6 -0
- data/{lib → packages/igniter-agents/lib}/igniter/agents/proactive_agent.rb +1 -1
- data/packages/igniter-agents/lib/igniter/agents.rb +23 -0
- data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/chain_agent.rb +4 -2
- data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/critic_agent.rb +4 -2
- data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/evaluator_agent.rb +4 -2
- data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/evolution_agent.rb +4 -2
- data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/observer_agent.rb +4 -2
- data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/planner_agent.rb +4 -2
- data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/router_agent.rb +4 -2
- data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/self_reflection_agent.rb +4 -2
- data/packages/igniter-agents/lib/igniter/ai/agents.rb +25 -0
- data/{lib → packages/igniter-agents/lib}/igniter/registry.rb +2 -0
- data/packages/igniter-agents/lib/igniter/runtime/registry_agent_adapter.rb +102 -0
- data/{lib → packages/igniter-agents/lib}/igniter/supervisor.rb +3 -0
- data/packages/igniter-agents/lib/igniter-agents.rb +7 -0
- data/packages/igniter-ai/README.md +20 -0
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/config.rb +1 -1
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/context.rb +2 -2
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/executor.rb +14 -14
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/anthropic.rb +5 -5
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/base.rb +1 -1
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/ollama.rb +4 -4
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/openai.rb +5 -5
- data/{lib/igniter → packages/igniter-ai/lib/igniter/ai}/skill/feedback.rb +4 -4
- data/{lib/igniter → packages/igniter-ai/lib/igniter/ai}/skill/output_schema.rb +6 -6
- data/packages/igniter-ai/lib/igniter/ai/skill/runtime_contract.rb +87 -0
- data/packages/igniter-ai/lib/igniter/ai/skill.rb +107 -0
- data/packages/igniter-ai/lib/igniter/ai/tool_registry.rb +79 -0
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/providers/assemblyai.rb +8 -8
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/providers/base.rb +3 -3
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/providers/deepgram.rb +3 -3
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/providers/openai.rb +3 -3
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/transcriber.rb +6 -6
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/transcript_result.rb +1 -1
- data/{lib/igniter/integrations/llm.rb → packages/igniter-ai/lib/igniter/ai.rb} +18 -15
- data/packages/igniter-ai/lib/igniter-ai.rb +3 -0
- data/packages/igniter-app/README.md +19 -0
- data/packages/igniter-app/lib/igniter/app/app_config.rb +43 -0
- data/packages/igniter-app/lib/igniter/app/app_host.rb +56 -0
- data/packages/igniter-app/lib/igniter/app/app_host_config.rb +27 -0
- data/packages/igniter-app/lib/igniter/app/app_host_pack.rb +13 -0
- data/{lib/igniter/application → packages/igniter-app/lib/igniter/app}/autoloader.rb +2 -2
- data/packages/igniter-app/lib/igniter/app/cluster_app_host.rb +95 -0
- data/packages/igniter-app/lib/igniter/app/cluster_app_host_config.rb +78 -0
- data/packages/igniter-app/lib/igniter/app/credentials/config_loader.rb +152 -0
- data/packages/igniter-app/lib/igniter/app/credentials/credential.rb +48 -0
- data/packages/igniter-app/lib/igniter/app/credentials/credential_policy.rb +38 -0
- data/packages/igniter-app/lib/igniter/app/credentials/events/credential_event.rb +179 -0
- data/packages/igniter-app/lib/igniter/app/credentials/events.rb +12 -0
- data/packages/igniter-app/lib/igniter/app/credentials/lease_request.rb +153 -0
- data/packages/igniter-app/lib/igniter/app/credentials/policies/ephemeral_lease_policy.rb +35 -0
- data/packages/igniter-app/lib/igniter/app/credentials/policies/local_only_policy.rb +33 -0
- data/packages/igniter-app/lib/igniter/app/credentials/policies.rb +13 -0
- data/packages/igniter-app/lib/igniter/app/credentials/store.rb +21 -0
- data/packages/igniter-app/lib/igniter/app/credentials/stores/file_store.rb +114 -0
- data/packages/igniter-app/lib/igniter/app/credentials/trail.rb +254 -0
- data/packages/igniter-app/lib/igniter/app/credentials.rb +20 -0
- data/packages/igniter-app/lib/igniter/app/dev_output_sync.rb +4 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/app_host_contributor.rb +71 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/cluster_app_host_contributor.rb +97 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/credential_contributor.rb +66 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/evolution_contributor.rb +74 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/ignite_contributor.rb +121 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/loader_contributor.rb +68 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/orchestration_contributor.rb +200 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/runtime_contributor.rb +68 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/scheduler_contributor.rb +72 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/sdk_contributor.rb +284 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics.rb +62 -0
- data/packages/igniter-app/lib/igniter/app/evolution/approval_decision.rb +115 -0
- data/packages/igniter-app/lib/igniter/app/evolution/approval_request.rb +36 -0
- data/packages/igniter-app/lib/igniter/app/evolution/plan.rb +72 -0
- data/packages/igniter-app/lib/igniter/app/evolution/planner.rb +85 -0
- data/packages/igniter-app/lib/igniter/app/evolution/result.rb +45 -0
- data/packages/igniter-app/lib/igniter/app/evolution/runner.rb +102 -0
- data/packages/igniter-app/lib/igniter/app/evolution/store.rb +21 -0
- data/packages/igniter-app/lib/igniter/app/evolution/stores/file_store.rb +241 -0
- data/packages/igniter-app/lib/igniter/app/evolution/trail.rb +108 -0
- data/packages/igniter-app/lib/igniter/app/evolution.rb +11 -0
- data/packages/igniter-app/lib/igniter/app/filesystem_loader_adapter.rb +21 -0
- data/packages/igniter-app/lib/igniter/app/generator.rb +636 -0
- data/packages/igniter-app/lib/igniter/app/generators/cluster.rb +1367 -0
- data/packages/igniter-app/lib/igniter/app/generators/dashboard.rb +152 -0
- data/packages/igniter-app/lib/igniter/app/generators/playground.rb +1227 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/README.md.erb +37 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/app.rb.erb +19 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/contexts/home_context.rb.erb +54 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/frontend/application.js.erb +3 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/spec/dashboard_app_spec.rb.erb +79 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/support/stack_overview.rb.erb +23 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/handlers/home_handler.rb.erb +27 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.arb.erb +44 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.rb.erb +56 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/layout.arb.erb +17 -0
- data/packages/igniter-app/lib/igniter/app/host_adapter.rb +26 -0
- data/packages/igniter-app/lib/igniter/app/host_config.rb +40 -0
- data/packages/igniter-app/lib/igniter/app/host_registry.rb +43 -0
- data/packages/igniter-app/lib/igniter/app/loader_adapter.rb +15 -0
- data/packages/igniter-app/lib/igniter/app/loader_pack.rb +8 -0
- data/packages/igniter-app/lib/igniter/app/loader_registry.rb +39 -0
- data/packages/igniter-app/lib/igniter/app/observability/operator_action_handler.rb +147 -0
- data/packages/igniter-app/lib/igniter/app/observability/operator_console_handler.rb +747 -0
- data/packages/igniter-app/lib/igniter/app/observability/operator_overview_handler.rb +350 -0
- data/packages/igniter-app/lib/igniter/app/observability.rb +5 -0
- data/packages/igniter-app/lib/igniter/app/observability_pack.rb +71 -0
- data/packages/igniter-app/lib/igniter/app/operator/dispatcher.rb +40 -0
- data/packages/igniter-app/lib/igniter/app/operator/handler_registry.rb +40 -0
- data/packages/igniter-app/lib/igniter/app/operator/handler_result.rb +67 -0
- data/packages/igniter-app/lib/igniter/app/operator/handlers/base.rb +79 -0
- data/packages/igniter-app/lib/igniter/app/operator/handlers/ignite_handler.rb +108 -0
- data/packages/igniter-app/lib/igniter/app/operator/handlers/orchestration_handler.rb +33 -0
- data/packages/igniter-app/lib/igniter/app/operator/handlers.rb +5 -0
- data/packages/igniter-app/lib/igniter/app/operator/lifecycle_contract.rb +55 -0
- data/packages/igniter-app/lib/igniter/app/operator/policy.rb +157 -0
- data/packages/igniter-app/lib/igniter/app/operator.rb +17 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/action_result_builder.rb +65 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/followup_request.rb +36 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/handler_registry.rb +58 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/handlers.rb +106 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/inbox.rb +283 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/inbox_query.rb +293 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/lane_registry.rb +100 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/operator_query.rb +449 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/plan.rb +68 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/planner.rb +89 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/policies.rb +125 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/policy_registry.rb +63 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/result.rb +43 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/routing_registry.rb +43 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runner.rb +50 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runtime_event_query.rb +205 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runtime_overview_builder.rb +286 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runtime_query_overview_builder.rb +20 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runtime_result_builder.rb +23 -0
- data/packages/igniter-app/lib/igniter/app/orchestration.rb +113 -0
- data/packages/igniter-app/lib/igniter/app/runtime.rb +4 -0
- data/packages/igniter-app/lib/igniter/app/runtime_context.rb +101 -0
- data/packages/igniter-app/lib/igniter/app/runtime_pack.rb +16 -0
- data/packages/igniter-app/lib/igniter/app/scaffold_pack.rb +6 -0
- data/{lib/igniter/application → packages/igniter-app/lib/igniter/app}/scheduler.rb +2 -2
- data/packages/igniter-app/lib/igniter/app/scheduler_adapter.rb +17 -0
- data/packages/igniter-app/lib/igniter/app/scheduler_pack.rb +8 -0
- data/packages/igniter-app/lib/igniter/app/scheduler_registry.rb +39 -0
- data/packages/igniter-app/lib/igniter/app/stack.rb +1726 -0
- data/packages/igniter-app/lib/igniter/app/stack_pack.rb +3 -0
- data/packages/igniter-app/lib/igniter/app/threaded_scheduler_adapter.rb +35 -0
- data/packages/igniter-app/lib/igniter/app/yml_loader.rb +43 -0
- data/packages/igniter-app/lib/igniter/app.rb +2367 -0
- data/packages/igniter-app/lib/igniter/ignite/bootstrap_agent.rb +334 -0
- data/packages/igniter-app/lib/igniter/ignite/bootstrap_target.rb +79 -0
- data/packages/igniter-app/lib/igniter/ignite/deployment_intent.rb +82 -0
- data/packages/igniter-app/lib/igniter/ignite/ignition_agent.rb +1011 -0
- data/packages/igniter-app/lib/igniter/ignite/ignition_plan.rb +83 -0
- data/packages/igniter-app/lib/igniter/ignite/ignition_report.rb +144 -0
- data/packages/igniter-app/lib/igniter/ignite/store.rb +19 -0
- data/packages/igniter-app/lib/igniter/ignite/stores/file_store.rb +112 -0
- data/packages/igniter-app/lib/igniter/ignite/trail.rb +215 -0
- data/packages/igniter-app/lib/igniter/ignite.rb +11 -0
- data/packages/igniter-app/lib/igniter-app.rb +5 -0
- data/packages/igniter-cluster/README.md +9 -0
- data/packages/igniter-cluster/lib/igniter/cluster/agent_route_resolver.rb +58 -0
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/cluster.rb +8 -4
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/errors.rb +3 -1
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/executors.rb +3 -1
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/node.rb +3 -1
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/read_query.rb +5 -3
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/state_machine.rb +4 -2
- data/packages/igniter-cluster/lib/igniter/cluster/consensus.rb +18 -0
- data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/governance_contributor.rb +90 -0
- data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/identity_contributor.rb +98 -0
- data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/routing_contributor.rb +674 -0
- data/packages/igniter-cluster/lib/igniter/cluster/diagnostics.rb +24 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/envelope.rb +136 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/hook_support.rb +33 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/log.rb +102 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/projection_feed.rb +98 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/read_model_projector.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events.rb +131 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_decision.rb +41 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_policy.rb +66 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_queue.rb +88 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_request.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_workflow.rb +214 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/checkpoint.rb +141 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/compaction_record.rb +33 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/checkpoint_store.rb +89 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/file_store.rb +249 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/trail.rb +164 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance.rb +12 -0
- data/packages/igniter-cluster/lib/igniter/cluster/identity/capability_attestation.rb +114 -0
- data/packages/igniter-cluster/lib/igniter/cluster/identity/manifest.rb +139 -0
- data/packages/igniter-cluster/lib/igniter/cluster/identity/node_identity.rb +106 -0
- data/packages/igniter-cluster/lib/igniter/cluster/identity.rb +5 -0
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/announcer.rb +37 -4
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/checkpoint_gossip.rb +60 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/config.rb +146 -0
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/discovery.rb +7 -2
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/errors.rb +10 -5
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/gossip.rb +19 -4
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/mesh_ql.rb +470 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/node_observation.rb +281 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/observation_query.rb +284 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer.rb +51 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_capacity_report.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_identity_envelope.rb +158 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_metadata.rb +122 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_registry.rb +81 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_decision.rb +64 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_planner.rb +154 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_policy.rb +103 -0
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/poller.rb +19 -4
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_plan.rb +66 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_planner.rb +153 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/repair_loop.rb +169 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/router.rb +306 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_signal.rb +46 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_tracker.rb +215 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh.rb +452 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/claim.rb +69 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/errors.rb +19 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/owner_client.rb +76 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/registry.rb +98 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/resolver.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership.rb +81 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_store.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/chunk.rb +49 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/fanout_retriever.rb +93 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/knowledge_shard.rb +140 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/net_http_adapter.rb +85 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/ranker.rb +46 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_query.rb +30 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_result.rb +77 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag.rb +38 -0
- data/packages/igniter-cluster/lib/igniter/cluster/remote_adapter.rb +101 -0
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/bootstrapper.rb +3 -1
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/bootstrappers/gem.rb +11 -4
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/bootstrappers/git.rb +9 -2
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/bootstrappers/tarball.rb +8 -2
- data/packages/igniter-cluster/lib/igniter/cluster/replication/capability_query.rb +675 -0
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/expansion_plan.rb +5 -3
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/expansion_planner.rb +41 -29
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/manifest.rb +3 -1
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/network_topology.rb +44 -17
- data/packages/igniter-cluster/lib/igniter/cluster/replication/node_profile.rb +134 -0
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/reflective_replication_agent.rb +50 -29
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/replication_agent.rb +4 -2
- data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/ssh_session.rb +3 -1
- data/packages/igniter-cluster/lib/igniter/cluster/replication.rb +38 -0
- data/packages/igniter-cluster/lib/igniter/cluster/routed_agent_adapter.rb +79 -0
- data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_executor.rb +427 -0
- data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_result.rb +38 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_plan.rb +34 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_planner.rb +76 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_result.rb +34 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_runner.rb +125 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_assessment.rb +37 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_store.rb +58 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/verifier.rb +80 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust.rb +9 -0
- data/packages/igniter-cluster/lib/igniter/cluster.rb +71 -0
- data/packages/igniter-cluster/lib/igniter-cluster.rb +3 -0
- data/packages/igniter-core/README.md +21 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/capabilities.rb +3 -1
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/compiled_graph.rb +40 -2
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validation_pipeline.rb +1 -0
- data/packages/igniter-core/lib/igniter/core/compiler/validators/agent_validator.rb +142 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/dependencies_validator.rb +40 -1
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler.rb +1 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/contract.rb +76 -6
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow.rb +7 -7
- data/packages/igniter-core/lib/igniter/core/diagnostics/agent_contributor.rb +241 -0
- data/packages/igniter-core/lib/igniter/core/diagnostics/capability_contributor.rb +162 -0
- data/packages/igniter-core/lib/igniter/core/diagnostics/orchestration_contributor.rb +75 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/report.rb +81 -6
- data/packages/igniter-core/lib/igniter/core/diagnostics.rb +58 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl/contract_builder.rb +163 -6
- data/packages/igniter-core/lib/igniter/core/dto/record.rb +189 -0
- data/packages/igniter-core/lib/igniter/core/dto.rb +8 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/effect.rb +4 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/errors.rb +26 -3
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection/graph_formatter.rb +32 -1
- data/packages/igniter-core/lib/igniter/core/extensions/introspection/plan_formatter.rb +85 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection/runtime_formatter.rb +26 -0
- data/packages/igniter-core/lib/igniter/core/extensions/invariants.rb +70 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental.rb +4 -4
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/memorable.rb +1 -1
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/stores/sqlite.rb +5 -3
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory.rb +11 -11
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/metrics/prometheus_exporter.rb +1 -1
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/metrics.rb +8 -8
- data/packages/igniter-core/lib/igniter/core/model/agent_interaction_contract.rb +172 -0
- data/packages/igniter-core/lib/igniter/core/model/agent_node.rb +86 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/branch_node.rb +37 -1
- data/packages/igniter-core/lib/igniter/core/model/remote_node.rb +91 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model.rb +2 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/node_cache.rb +1 -1
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing.rb +8 -8
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/builder.rb +30 -1
- data/packages/igniter-core/lib/igniter/core/runtime/agent_adapter.rb +41 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_result_contract.rb +91 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_route.rb +60 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_route_resolver.rb +26 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_session.rb +922 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_session_query.rb +379 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_transport.rb +30 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/cache.rb +6 -3
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/deferred_result.rb +27 -1
- data/packages/igniter-core/lib/igniter/core/runtime/execution.rb +913 -0
- data/packages/igniter-core/lib/igniter/core/runtime/job_worker.rb +39 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/node_state.rb +4 -2
- data/packages/igniter-core/lib/igniter/core/runtime/orchestration_overview.rb +213 -0
- data/packages/igniter-core/lib/igniter/core/runtime/orchestration_runtime_state.rb +176 -0
- data/packages/igniter-core/lib/igniter/core/runtime/orchestration_transition_query.rb +208 -0
- data/packages/igniter-core/lib/igniter/core/runtime/planner.rb +301 -0
- data/packages/igniter-core/lib/igniter/core/runtime/proxy_agent_adapter.rb +124 -0
- data/packages/igniter-core/lib/igniter/core/runtime/remote_adapter.rb +26 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/resolver.rb +250 -57
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/result.rb +2 -0
- data/packages/igniter-core/lib/igniter/core/runtime/stores/sqlite_store.rb +155 -0
- data/packages/igniter-core/lib/igniter/core/runtime/stream_result.rb +171 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime.rb +15 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/temporal.rb +1 -1
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/tool/discoverable.rb +3 -3
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/tool.rb +6 -2
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/version.rb +1 -1
- data/packages/igniter-core/lib/igniter/core.rb +23 -0
- data/packages/igniter-core/lib/igniter-core.rb +3 -0
- data/packages/igniter-extensions/README.md +21 -0
- data/packages/igniter-extensions/lib/igniter/extensions/auditing.rb +3 -0
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/capabilities.rb +1 -1
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/content_addressing.rb +1 -1
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/dataflow.rb +1 -1
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/differential.rb +1 -1
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/execution_report.rb +1 -1
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/incremental.rb +1 -1
- data/packages/igniter-extensions/lib/igniter/extensions/introspection.rb +3 -0
- data/packages/igniter-extensions/lib/igniter/extensions/invariants.rb +3 -0
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/provenance.rb +1 -1
- data/packages/igniter-extensions/lib/igniter/extensions/reactive.rb +3 -0
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/saga.rb +1 -1
- data/packages/igniter-extensions/lib/igniter/extensions.rb +8 -0
- data/packages/igniter-extensions/lib/igniter-extensions.rb +3 -0
- data/packages/igniter-frontend/README.md +224 -0
- data/packages/igniter-frontend/lib/igniter/frontend/app.rb +90 -0
- data/packages/igniter-frontend/lib/igniter/frontend/app_access.rb +36 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/component.rb +120 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/action_group.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/badge.rb +91 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/boolean.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/breadcrumbs.rb +71 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/card.rb +114 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/conversation_panel.rb +61 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/datetime.rb +42 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/display_value_support.rb +38 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/empty_state.rb +39 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/event_list.rb +44 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/filters.rb +183 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/indicator.rb +59 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/json_panel.rb +36 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/key_value_list.rb +40 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/loading_state.rb +43 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/metric_grid.rb +37 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/number.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/page_header.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/pagination.rb +143 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/panel.rb +67 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/percentage.rb +79 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/resource_list.rb +38 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/scenario_card.rb +48 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/shell_columns.rb +67 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/sidebar_shell.rb +106 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/table_with.rb +203 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/tabs.rb +147 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/viz.rb +185 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/page.rb +74 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/raw_text_node.rb +40 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/template_page.rb +243 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre.rb +48 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre_page.rb +7 -0
- data/packages/igniter-frontend/lib/igniter/frontend/assets.rb +101 -0
- data/packages/igniter-frontend/lib/igniter/frontend/builder.rb +124 -0
- data/packages/igniter-frontend/lib/igniter/frontend/component.rb +24 -0
- data/packages/igniter-frontend/lib/igniter/frontend/components.rb +7 -0
- data/packages/igniter-frontend/lib/igniter/frontend/context.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/form_builder.rb +63 -0
- data/packages/igniter-frontend/lib/igniter/frontend/handler.rb +92 -0
- data/packages/igniter-frontend/lib/igniter/frontend/javascript.rb +353 -0
- data/packages/igniter-frontend/lib/igniter/frontend/page.rb +24 -0
- data/packages/igniter-frontend/lib/igniter/frontend/request.rb +61 -0
- data/packages/igniter-frontend/lib/igniter/frontend/response.rb +67 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/adapters.rb +226 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/presets.rb +147 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime.rb +259 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/surfaces.rb +1074 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/ui.rb +1438 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind.rb +180 -0
- data/packages/igniter-frontend/lib/igniter/frontend/version.rb +9 -0
- data/packages/igniter-frontend/lib/igniter/frontend.rb +35 -0
- data/packages/igniter-frontend/lib/igniter-frontend.rb +3 -0
- data/packages/igniter-rails/README.md +96 -0
- data/packages/igniter-rails/lib/igniter/plugins/rails/generators/contract/templates/contract.rb.tt +22 -0
- data/packages/igniter-rails/lib/igniter/plugins/rails/generators/install/templates/igniter.rb.tt +16 -0
- data/packages/igniter-rails/lib/igniter-rails.rb +3 -0
- data/packages/igniter-schema-rendering/README.md +27 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/page.rb +35 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/patcher.rb +47 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/renderer.rb +268 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/schema.rb +172 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/store.rb +53 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_normalizer.rb +117 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_processor.rb +91 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_validator.rb +62 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/version.rb +9 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering.rb +20 -0
- data/packages/igniter-schema-rendering/lib/igniter-schema-rendering.rb +3 -0
- data/packages/igniter-sdk/README.md +25 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/base.rb +84 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/delivery_result.rb +61 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/message.rb +101 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/telegram.rb +161 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/webhook.rb +213 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels.rb +17 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data/store.rb +31 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data/stores/file.rb +113 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data/stores/in_memory.rb +63 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data/stores/sqlite.rb +144 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data.rb +34 -0
- data/packages/igniter-sdk/lib/igniter/sdk/tools/agent_bootstrap_tool.rb +151 -0
- data/packages/igniter-sdk/lib/igniter/sdk/tools/local_workflow_selector_tool.rb +269 -0
- data/packages/igniter-sdk/lib/igniter/sdk/tools/system_discovery_tool.rb +198 -0
- data/packages/igniter-sdk/lib/igniter/sdk/tools.rb +9 -0
- data/packages/igniter-sdk/lib/igniter/sdk.rb +86 -0
- data/packages/igniter-sdk/lib/igniter-sdk.rb +3 -0
- data/packages/igniter-server/README.md +9 -0
- data/packages/igniter-server/lib/igniter/server/agent_session_store.rb +98 -0
- data/packages/igniter-server/lib/igniter/server/agent_transport.rb +95 -0
- data/packages/igniter-server/lib/igniter/server/app_host.rb +3 -0
- data/{lib → packages/igniter-server/lib}/igniter/server/client.rb +96 -6
- data/packages/igniter-server/lib/igniter/server/config.rb +70 -0
- data/packages/igniter-server/lib/igniter/server/handlers/agent_message_handler.rb +107 -0
- data/packages/igniter-server/lib/igniter/server/handlers/agent_session_handler.rb +125 -0
- data/packages/igniter-server/lib/igniter/server/handlers/manifest_handler.rb +77 -0
- data/{lib → packages/igniter-server/lib}/igniter/server/handlers/metrics_handler.rb +1 -1
- data/{lib → packages/igniter-server/lib}/igniter/server/handlers/peers_handler.rb +38 -17
- data/{lib → packages/igniter-server/lib}/igniter/server/http_server.rb +91 -15
- data/{lib → packages/igniter-server/lib}/igniter/server/rack_app.rb +27 -2
- data/packages/igniter-server/lib/igniter/server/remote_adapter.rb +27 -0
- data/packages/igniter-server/lib/igniter/server/router.rb +291 -0
- data/{lib → packages/igniter-server/lib}/igniter/server/server_logger.rb +3 -1
- data/{lib → packages/igniter-server/lib}/igniter/server.rb +58 -1
- data/packages/igniter-server/lib/igniter-server.rb +3 -0
- metadata +631 -282
- data/docs/API_V2.md +0 -537
- data/docs/APPLICATION_V1.md +0 -253
- data/docs/ARCHITECTURE_V2.md +0 -317
- data/docs/BACKLOG.md +0 -166
- data/docs/BRANCHES_V1.md +0 -213
- data/docs/CAPABILITIES_V1.md +0 -207
- data/docs/COLLECTIONS_V1.md +0 -303
- data/docs/CONSENSUS_V1.md +0 -477
- data/docs/CONTENT_ADDRESSING_V1.md +0 -221
- data/docs/DATAFLOW_V1.md +0 -274
- data/docs/DISTRIBUTED_CONTRACTS_V1.md +0 -493
- data/docs/EXECUTION_MODEL_V2.md +0 -324
- data/docs/IGNITER_CONCEPTS.md +0 -81
- data/docs/LLM_V1.md +0 -335
- data/docs/MESH_V1.md +0 -732
- data/docs/NODE_CACHE_V1.md +0 -324
- data/docs/PATTERNS.md +0 -411
- data/docs/PROACTIVE_AGENTS_V1.md +0 -293
- data/docs/SERVER_V1.md +0 -512
- data/docs/SKILLS_V1.md +0 -213
- data/docs/STORE_ADAPTERS.md +0 -154
- data/docs/TEMPORAL_V1.md +0 -174
- data/docs/TOOLS_V1.md +0 -347
- data/docs/TRANSCRIPTION_V1.md +0 -403
- data/lib/igniter/agents.rb +0 -56
- data/lib/igniter/application/app_config.rb +0 -32
- data/lib/igniter/application/generator.rb +0 -157
- data/lib/igniter/application/yml_loader.rb +0 -39
- data/lib/igniter/application.rb +0 -174
- data/lib/igniter/consensus.rb +0 -58
- data/lib/igniter/diagnostics.rb +0 -8
- data/lib/igniter/extensions/introspection/plan_formatter.rb +0 -55
- data/lib/igniter/extensions/invariants.rb +0 -116
- data/lib/igniter/extensions/mesh.rb +0 -31
- data/lib/igniter/integrations/agents.rb +0 -18
- data/lib/igniter/mesh/config.rb +0 -45
- data/lib/igniter/mesh/peer.rb +0 -21
- data/lib/igniter/mesh/peer_registry.rb +0 -51
- data/lib/igniter/mesh/router.rb +0 -109
- data/lib/igniter/mesh.rb +0 -85
- data/lib/igniter/model/remote_node.rb +0 -42
- data/lib/igniter/replication/node_role.rb +0 -42
- data/lib/igniter/replication/role_registry.rb +0 -73
- data/lib/igniter/replication.rb +0 -54
- data/lib/igniter/runtime/execution.rb +0 -416
- data/lib/igniter/runtime/job_worker.rb +0 -18
- data/lib/igniter/runtime/planner.rb +0 -126
- data/lib/igniter/server/config.rb +0 -34
- data/lib/igniter/server/handlers/manifest_handler.rb +0 -34
- data/lib/igniter/server/router.rb +0 -108
- data/lib/igniter/skill.rb +0 -218
- data/lib/igniter/tool_registry.rb +0 -144
- /data/{lib → packages/igniter-agents/lib}/igniter/agent/mailbox.rb +0 -0
- /data/{lib → packages/igniter-agents/lib}/igniter/agent/message.rb +0 -0
- /data/{lib → packages/igniter-agents/lib}/igniter/agent/state_holder.rb +0 -0
- /data/{lib → packages/igniter-agents/lib}/igniter/agents/observability/metrics_agent.rb +0 -0
- /data/{lib → packages/igniter-agents/lib}/igniter/agents/pipeline/batch_processor_agent.rb +0 -0
- /data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/agents/proactive}/alert_agent.rb +0 -0
- /data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/agents/proactive}/health_check_agent.rb +0 -0
- /data/{lib → packages/igniter-agents/lib}/igniter/agents/reliability/retry_agent.rb +0 -0
- /data/{lib → packages/igniter-agents/lib}/igniter/agents/scheduling/cron_agent.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/graph_compiler.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/type_resolver.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validation_context.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/await_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/callable_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/outputs_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/remote_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/type_compatibility_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/uniqueness_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/content_addressing.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/aggregate_operators.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/aggregate_state.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/diff.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/diff_state.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/incremental_collection_result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/window_filter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/auditing/report/console_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/auditing/report/markdown_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/introspection/formatters/mermaid_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/introspection/formatters/text_tree_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/divergence.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/report.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl/schema_builder.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/effect_registry.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events/bus.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events/event.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/builder.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/node_entry.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/report.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/executor.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/executor_registry.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/auditing/timeline.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/auditing.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/engine.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/matcher.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/reaction.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/fingerprint.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/tracker.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/invariant.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/agent_memory.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/episode.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/fact.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/reflection_cycle.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/reflection_record.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/store.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/stores/in_memory.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/metrics/collector.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/metrics/snapshot.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/aggregate_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/await_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/collection_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/composition_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/compute_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/effect_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/graph.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/input_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/output_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/generators.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/run.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/lineage.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/node_trace.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/text_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/collection_result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/input_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/invalidator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runner_factory.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/inline_runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/store_runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/thread_pool_runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/active_record_store.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/file_store.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/memory_store.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/redis_store.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/compensation.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/compensation_record.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/executor.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/stream_loop.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/type_system.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/cable_adapter.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/contract_job.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/generators/contract/contract_generator.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/generators/install/install_generator.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/railtie.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/webhook_concern.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/base.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/contracts_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/event_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/execute_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/health_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/liveness_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/readiness_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/status_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/registry.rb +0 -0
data/lib/igniter/application.rb
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "igniter/server"
|
|
4
|
-
require_relative "application/app_config"
|
|
5
|
-
require_relative "application/yml_loader"
|
|
6
|
-
require_relative "application/autoloader"
|
|
7
|
-
require_relative "application/scheduler"
|
|
8
|
-
require_relative "application/generator"
|
|
9
|
-
|
|
10
|
-
module Igniter
|
|
11
|
-
# Base class for Igniter applications.
|
|
12
|
-
#
|
|
13
|
-
# Provides a unified DSL for configuration, contract registration,
|
|
14
|
-
# scheduled jobs, and server startup — replacing the raw
|
|
15
|
-
# Igniter::Server.configure boilerplate.
|
|
16
|
-
#
|
|
17
|
-
# == Minimal example
|
|
18
|
-
#
|
|
19
|
-
# require "igniter/application"
|
|
20
|
-
#
|
|
21
|
-
# class MyApp < Igniter::Application
|
|
22
|
-
# config_file "application.yml" # optional YAML base config
|
|
23
|
-
#
|
|
24
|
-
# configure do |c|
|
|
25
|
-
# c.port = 4567
|
|
26
|
-
# c.store = Igniter::Runtime::Stores::MemoryStore.new
|
|
27
|
-
# end
|
|
28
|
-
#
|
|
29
|
-
# register "OrderContract", OrderContract
|
|
30
|
-
#
|
|
31
|
-
# schedule :cleanup, every: "1h" do
|
|
32
|
-
# puts "running cleanup..."
|
|
33
|
-
# end
|
|
34
|
-
# end
|
|
35
|
-
#
|
|
36
|
-
# MyApp.start # blocking built-in HTTP server
|
|
37
|
-
# MyApp.rack_app # Rack-compatible app (Puma / Unicorn)
|
|
38
|
-
#
|
|
39
|
-
# == YAML config (application.yml)
|
|
40
|
-
#
|
|
41
|
-
# server:
|
|
42
|
-
# port: 4567
|
|
43
|
-
# host: "0.0.0.0"
|
|
44
|
-
# log_format: json # text (default) or json
|
|
45
|
-
# drain_timeout: 30
|
|
46
|
-
#
|
|
47
|
-
# Values from the YAML file are applied first; the Ruby `configure` block
|
|
48
|
-
# runs afterwards and always wins.
|
|
49
|
-
class Application
|
|
50
|
-
class << self
|
|
51
|
-
# ─── DSL ─────────────────────────────────────────────────────────────────
|
|
52
|
-
|
|
53
|
-
# Path to an optional YAML configuration file.
|
|
54
|
-
# Loaded before the configure block — configure values override YAML.
|
|
55
|
-
def config_file(path)
|
|
56
|
-
@yml_path = path
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Configure the application. Block receives an AppConfig instance.
|
|
60
|
-
# May be called multiple times; blocks are applied in order.
|
|
61
|
-
def configure(&block)
|
|
62
|
-
@configure_blocks << block
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Declare a directory whose .rb files are eagerly required at startup
|
|
66
|
-
# (before contracts are registered).
|
|
67
|
-
def executors_path(path)
|
|
68
|
-
@executors_paths << path
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Declare a directory whose .rb files are eagerly required at startup.
|
|
72
|
-
def contracts_path(path)
|
|
73
|
-
@contracts_paths << path
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Declare a directory whose .rb files are eagerly required at startup
|
|
77
|
-
# (agents, supervisors, and other actor-system components).
|
|
78
|
-
def agents_path(path)
|
|
79
|
-
@agents_paths << path
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Register a contract class under a name for HTTP dispatch.
|
|
83
|
-
def register(name, contract_class)
|
|
84
|
-
@registered[name.to_s] = contract_class
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Define a recurring background job.
|
|
88
|
-
#
|
|
89
|
-
# schedule :report, every: "1d", at: "09:00" do
|
|
90
|
-
# DailyReportContract.new.resolve_all(...)
|
|
91
|
-
# end
|
|
92
|
-
#
|
|
93
|
-
# Interval formats: Integer (seconds), "30s", "5m", "2h", "1d",
|
|
94
|
-
# or Hash { hours: 1, minutes: 30 }.
|
|
95
|
-
def schedule(name, every:, at: nil, &block)
|
|
96
|
-
@scheduled_jobs << { name: name, every: every, at: at, block: block }
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# ─── Lifecycle ───────────────────────────────────────────────────────────
|
|
100
|
-
|
|
101
|
-
# Start the built-in HTTP server (blocking).
|
|
102
|
-
# Schedules background jobs and registers an at_exit cleanup.
|
|
103
|
-
def start
|
|
104
|
-
sc = build!
|
|
105
|
-
sched = build_scheduler(sc)
|
|
106
|
-
sched&.start
|
|
107
|
-
at_exit { sched&.stop }
|
|
108
|
-
Igniter::Server::HttpServer.new(sc).start
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# Return a Rack-compatible application (for Puma / Unicorn / etc.).
|
|
112
|
-
def rack_app
|
|
113
|
-
sc = build!
|
|
114
|
-
build_scheduler(sc)&.start
|
|
115
|
-
Igniter::Server::RackApp.new(sc)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
# Expose the AppConfig (populated after the first build!).
|
|
119
|
-
def config = @app_config
|
|
120
|
-
|
|
121
|
-
# ─── Inheritance isolation ────────────────────────────────────────────────
|
|
122
|
-
|
|
123
|
-
def inherited(subclass)
|
|
124
|
-
super
|
|
125
|
-
subclass.instance_variable_set(:@yml_path, nil)
|
|
126
|
-
subclass.instance_variable_set(:@configure_blocks, [])
|
|
127
|
-
subclass.instance_variable_set(:@executors_paths, [])
|
|
128
|
-
subclass.instance_variable_set(:@contracts_paths, [])
|
|
129
|
-
subclass.instance_variable_set(:@agents_paths, [])
|
|
130
|
-
subclass.instance_variable_set(:@registered, {})
|
|
131
|
-
subclass.instance_variable_set(:@scheduled_jobs, [])
|
|
132
|
-
subclass.instance_variable_set(:@app_config, AppConfig.new)
|
|
133
|
-
subclass.instance_variable_set(:@build_scheduler, nil)
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
private
|
|
137
|
-
|
|
138
|
-
# Build and return a ready Server::Config.
|
|
139
|
-
def build!
|
|
140
|
-
cfg = @app_config
|
|
141
|
-
apply_yml!(cfg)
|
|
142
|
-
autoload_paths!
|
|
143
|
-
@configure_blocks.each { |b| b.call(cfg) }
|
|
144
|
-
sc = cfg.to_server_config
|
|
145
|
-
@registered.each { |name, klass| sc.register(name, klass) }
|
|
146
|
-
sc
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def apply_yml!(cfg)
|
|
150
|
-
return unless @yml_path
|
|
151
|
-
|
|
152
|
-
yml = YmlLoader.load(@yml_path)
|
|
153
|
-
YmlLoader.apply(cfg, yml)
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def autoload_paths!
|
|
157
|
-
loader = Autoloader.new(base_dir: Dir.pwd)
|
|
158
|
-
@executors_paths.each { |p| loader.load_path(p) }
|
|
159
|
-
@contracts_paths.each { |p| loader.load_path(p) }
|
|
160
|
-
@agents_paths.each { |p| loader.load_path(p) }
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
def build_scheduler(server_config)
|
|
164
|
-
return nil if @scheduled_jobs.empty?
|
|
165
|
-
|
|
166
|
-
@build_scheduler ||= begin
|
|
167
|
-
sched = Scheduler.new(logger: server_config.logger)
|
|
168
|
-
@scheduled_jobs.each { |j| sched.add(j[:name], every: j[:every], at: j[:at], &j[:block]) }
|
|
169
|
-
sched
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
end
|
data/lib/igniter/consensus.rb
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "igniter"
|
|
4
|
-
require "igniter/integrations/agents"
|
|
5
|
-
require_relative "consensus/errors"
|
|
6
|
-
require_relative "consensus/state_machine"
|
|
7
|
-
require_relative "consensus/node"
|
|
8
|
-
require_relative "consensus/cluster"
|
|
9
|
-
require_relative "consensus/executors"
|
|
10
|
-
require_relative "consensus/read_query"
|
|
11
|
-
|
|
12
|
-
module Igniter
|
|
13
|
-
# Consensus protocol primitives built on Igniter::Agent and Igniter::Contract.
|
|
14
|
-
#
|
|
15
|
-
# Provides a Raft-inspired cluster where:
|
|
16
|
-
# - +Igniter::Consensus::Node+ encapsulates the full Raft protocol as an Agent
|
|
17
|
-
# - +Igniter::Consensus::Cluster+ manages node lifecycle + high-level read/write
|
|
18
|
-
# - +Igniter::Consensus::StateMachine+ lets users define custom command reducers
|
|
19
|
-
# - +Igniter::Consensus::ReadQuery+ is a ready-made Contract for cluster reads
|
|
20
|
-
#
|
|
21
|
-
# == Minimal example
|
|
22
|
-
#
|
|
23
|
-
# require "igniter/consensus"
|
|
24
|
-
#
|
|
25
|
-
# cluster = Igniter::Consensus::Cluster.start(nodes: %i[n1 n2 n3 n4 n5])
|
|
26
|
-
# cluster.wait_for_leader
|
|
27
|
-
#
|
|
28
|
-
# cluster.write(key: :price, value: 99) # default KV protocol
|
|
29
|
-
# cluster.read(:price) # => 99
|
|
30
|
-
#
|
|
31
|
-
# cluster.stop!
|
|
32
|
-
#
|
|
33
|
-
# == Custom state machine
|
|
34
|
-
#
|
|
35
|
-
# class PriceStore < Igniter::Consensus::StateMachine
|
|
36
|
-
# apply :set do |state, cmd| state.merge(cmd[:key] => cmd[:value]) end
|
|
37
|
-
# apply :delete do |state, cmd| state.reject { |k, _| k == cmd[:key] } end
|
|
38
|
-
# end
|
|
39
|
-
#
|
|
40
|
-
# cluster = Igniter::Consensus::Cluster.start(
|
|
41
|
-
# nodes: %i[n1 n2 n3 n4 n5],
|
|
42
|
-
# state_machine: PriceStore,
|
|
43
|
-
# )
|
|
44
|
-
# cluster.write(type: :set, key: :price, value: 99)
|
|
45
|
-
#
|
|
46
|
-
# == Contract integration
|
|
47
|
-
#
|
|
48
|
-
# class PriceCheck < Igniter::Contract
|
|
49
|
-
# define do
|
|
50
|
-
# input :cluster
|
|
51
|
-
# compute :leader, with: :cluster, call: Igniter::Consensus::FindLeader
|
|
52
|
-
# compute :price, with: [:leader], call: MyPriceReader
|
|
53
|
-
# output :price
|
|
54
|
-
# end
|
|
55
|
-
# end
|
|
56
|
-
module Consensus
|
|
57
|
-
end
|
|
58
|
-
end
|
data/lib/igniter/diagnostics.rb
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Extensions
|
|
5
|
-
module Introspection
|
|
6
|
-
class PlanFormatter
|
|
7
|
-
def self.to_text(execution, output_names = nil)
|
|
8
|
-
new(execution, output_names).to_text
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def initialize(execution, output_names = nil)
|
|
12
|
-
@execution = execution
|
|
13
|
-
@plan = execution.plan(output_names)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def to_text
|
|
17
|
-
lines = []
|
|
18
|
-
lines << "Plan #{@execution.compiled_graph.name}"
|
|
19
|
-
lines << "Targets: #{format_list(@plan[:targets])}"
|
|
20
|
-
lines << "Ready: #{format_list(@plan[:ready])}"
|
|
21
|
-
lines << "Blocked: #{format_list(@plan[:blocked])}"
|
|
22
|
-
lines << "Nodes:"
|
|
23
|
-
|
|
24
|
-
@plan[:nodes].each_value do |entry|
|
|
25
|
-
lines << format_node(entry)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
lines.join("\n")
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
def format_node(entry)
|
|
34
|
-
line = "- #{entry[:kind]} #{entry[:path]} status=#{entry[:status]}"
|
|
35
|
-
line += " ready=true" if entry[:ready]
|
|
36
|
-
line += " blocked=true" if entry[:blocked]
|
|
37
|
-
line += " waiting_on=#{format_list(entry[:waiting_on])}" if entry[:waiting_on].any?
|
|
38
|
-
|
|
39
|
-
dependency_summary = entry[:dependencies].map do |dependency|
|
|
40
|
-
"#{dependency[:name]}(#{dependency[:status]})"
|
|
41
|
-
end
|
|
42
|
-
line += " deps=#{dependency_summary.join(',')}" if dependency_summary.any?
|
|
43
|
-
line
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def format_list(values)
|
|
47
|
-
array = Array(values)
|
|
48
|
-
return "none" if array.empty?
|
|
49
|
-
|
|
50
|
-
array.join(",")
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "igniter"
|
|
4
|
-
require "igniter/invariant"
|
|
5
|
-
|
|
6
|
-
module Igniter
|
|
7
|
-
module Extensions
|
|
8
|
-
# Patches Igniter::Contract with:
|
|
9
|
-
# - Class method: invariant(name) { |output:, **| condition }
|
|
10
|
-
# - Instance method: check_invariants → Array<InvariantViolation>
|
|
11
|
-
# - Automatic post-execution check in resolve_all (raises InvariantError)
|
|
12
|
-
#
|
|
13
|
-
# Invariant blocks receive ONLY the contract's declared output values as
|
|
14
|
-
# keyword args — the stable public interface, independent of internal nodes.
|
|
15
|
-
# Use ** to absorb outputs you don't need.
|
|
16
|
-
#
|
|
17
|
-
# @example
|
|
18
|
-
# class PricingContract < Igniter::Contract
|
|
19
|
-
# define do
|
|
20
|
-
# input :price
|
|
21
|
-
# input :quantity
|
|
22
|
-
# compute :total, depends_on: %i[price quantity] do |price:, quantity:|
|
|
23
|
-
# price * quantity
|
|
24
|
-
# end
|
|
25
|
-
# output :total
|
|
26
|
-
# end
|
|
27
|
-
#
|
|
28
|
-
# invariant(:total_non_negative) { |total:, **| total >= 0 }
|
|
29
|
-
# end
|
|
30
|
-
#
|
|
31
|
-
# This module is applied globally via:
|
|
32
|
-
# Igniter::Contract.include(Igniter::Extensions::Invariants)
|
|
33
|
-
#
|
|
34
|
-
module Invariants
|
|
35
|
-
def self.included(base)
|
|
36
|
-
base.extend(ClassMethods)
|
|
37
|
-
base.prepend(InstanceMethods)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# ── Class-level DSL ──────────────────────────────────────────────────────
|
|
41
|
-
|
|
42
|
-
module ClassMethods
|
|
43
|
-
# Declare a condition that must always hold after successful execution.
|
|
44
|
-
#
|
|
45
|
-
# The block receives the contract's declared output values as keyword
|
|
46
|
-
# arguments; use ** to absorb outputs you don't care about. Return a
|
|
47
|
-
# truthy value to indicate the invariant holds, falsy to indicate
|
|
48
|
-
# a violation.
|
|
49
|
-
#
|
|
50
|
-
# @example
|
|
51
|
-
# invariant(:positive_total) { |total:, **| total >= 0 }
|
|
52
|
-
#
|
|
53
|
-
# @param name [Symbol]
|
|
54
|
-
def invariant(name, &block)
|
|
55
|
-
@_invariants ||= {}
|
|
56
|
-
@_invariants[name.to_sym] = Igniter::Invariant.new(name, &block)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# @return [Hash{Symbol => Igniter::Invariant}]
|
|
60
|
-
def invariants
|
|
61
|
-
@_invariants || {}
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# ── Instance override + new public method ───────────────────────────────
|
|
66
|
-
|
|
67
|
-
module InstanceMethods
|
|
68
|
-
# Intercepts resolve_all to run invariant checks after execution.
|
|
69
|
-
# Uses a thread-local flag so that property testing can disable the
|
|
70
|
-
# automatic raise and collect violations as data instead.
|
|
71
|
-
def resolve_all(...)
|
|
72
|
-
result = super
|
|
73
|
-
validate_invariants! unless Thread.current[:igniter_skip_invariants]
|
|
74
|
-
result
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# Run all invariants without raising. Returns violations as data.
|
|
78
|
-
# Safe to call at any time after execution.
|
|
79
|
-
#
|
|
80
|
-
# @return [Array<Igniter::InvariantViolation>]
|
|
81
|
-
def check_invariants
|
|
82
|
-
return [] if self.class.invariants.empty?
|
|
83
|
-
|
|
84
|
-
resolved = collect_output_values
|
|
85
|
-
self.class.invariants.values.filter_map { |inv| inv.check(resolved) }
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
private
|
|
89
|
-
|
|
90
|
-
def validate_invariants!
|
|
91
|
-
violations = check_invariants
|
|
92
|
-
return if violations.empty?
|
|
93
|
-
|
|
94
|
-
names = violations.map { |v| ":#{v.name}" }.join(", ")
|
|
95
|
-
raise Igniter::InvariantError.new(
|
|
96
|
-
"#{violations.size} invariant(s) violated: #{names}",
|
|
97
|
-
violations: violations,
|
|
98
|
-
context: { contract: self.class.name }
|
|
99
|
-
)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Collect all declared output values from the resolved cache.
|
|
103
|
-
# Keyed by output name (not source node name).
|
|
104
|
-
def collect_output_values
|
|
105
|
-
cache = execution.cache
|
|
106
|
-
execution.compiled_graph.outputs.each_with_object({}) do |output_node, acc|
|
|
107
|
-
state = cache.fetch(output_node.source_root)
|
|
108
|
-
acc[output_node.name] = state.value if state&.succeeded?
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
Igniter::Contract.include(Igniter::Extensions::Invariants)
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# Igniter Mesh — Phase 1 (Static) + Phase 2 (Dynamic Discovery)
|
|
4
|
-
#
|
|
5
|
-
# Extends the remote: DSL with capability-based and pinned routing modes, and
|
|
6
|
-
# enables dynamic peer discovery so that the peer topology can be maintained
|
|
7
|
-
# without static add_peer declarations.
|
|
8
|
-
#
|
|
9
|
-
# Usage:
|
|
10
|
-
# require "igniter/extensions/mesh"
|
|
11
|
-
#
|
|
12
|
-
# # Phase 1 — static topology (still works):
|
|
13
|
-
# Igniter::Mesh.configure do |c|
|
|
14
|
-
# c.add_peer "orders-node",
|
|
15
|
-
# url: "http://orders.internal:4567",
|
|
16
|
-
# capabilities: [:orders, :inventory]
|
|
17
|
-
# end
|
|
18
|
-
#
|
|
19
|
-
# # Phase 2 — dynamic discovery:
|
|
20
|
-
# Igniter::Mesh.configure do |c|
|
|
21
|
-
# c.peer_name = "api-node"
|
|
22
|
-
# c.local_url = "http://api.internal:4567"
|
|
23
|
-
# c.local_capabilities = [:api]
|
|
24
|
-
# c.seeds = %w[http://orders.internal:4567 http://audit.internal:4567]
|
|
25
|
-
# c.discovery_interval = 30
|
|
26
|
-
# end
|
|
27
|
-
# Igniter::Mesh.start_discovery!
|
|
28
|
-
#
|
|
29
|
-
require "igniter"
|
|
30
|
-
require "igniter/server"
|
|
31
|
-
require "igniter/mesh"
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# Actor system for Igniter — stateful message-driven agents with supervision.
|
|
4
|
-
#
|
|
5
|
-
# Usage:
|
|
6
|
-
# require "igniter/integrations/agents"
|
|
7
|
-
#
|
|
8
|
-
# Provides:
|
|
9
|
-
# Igniter::Agent — base class for stateful actors
|
|
10
|
-
# Igniter::Supervisor — supervises and restarts child agents
|
|
11
|
-
# Igniter::Registry — thread-safe name → Ref lookup
|
|
12
|
-
# Igniter::StreamLoop — continuous contract-in-a-tick-loop
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
require_relative "../agent"
|
|
16
|
-
require_relative "../supervisor"
|
|
17
|
-
require_relative "../registry"
|
|
18
|
-
require_relative "../stream_loop"
|
data/lib/igniter/mesh/config.rb
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Mesh
|
|
5
|
-
# Configuration for the local mesh node: registered peers and local identity.
|
|
6
|
-
class Config
|
|
7
|
-
attr_accessor :peer_name, :local_capabilities, :seeds, :discovery_interval,
|
|
8
|
-
:auto_announce, :local_url, :gossip_fanout
|
|
9
|
-
attr_reader :peers, :peer_registry
|
|
10
|
-
|
|
11
|
-
def initialize
|
|
12
|
-
@peer_name = nil
|
|
13
|
-
@local_capabilities = []
|
|
14
|
-
@peers = []
|
|
15
|
-
@peer_registry = PeerRegistry.new
|
|
16
|
-
@seeds = []
|
|
17
|
-
@discovery_interval = 30
|
|
18
|
-
@auto_announce = true
|
|
19
|
-
@local_url = nil
|
|
20
|
-
@gossip_fanout = 3
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Register a remote peer by name.
|
|
24
|
-
#
|
|
25
|
-
# Igniter::Mesh.configure do |c|
|
|
26
|
-
# c.add_peer "orders-node", url: "http://orders.internal:4567",
|
|
27
|
-
# capabilities: [:orders, :inventory]
|
|
28
|
-
# end
|
|
29
|
-
def add_peer(name, url:, capabilities: [])
|
|
30
|
-
@peers << Peer.new(name: name, url: url, capabilities: capabilities)
|
|
31
|
-
self
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# All static peers that advertise a given capability.
|
|
35
|
-
def peers_with_capability(capability)
|
|
36
|
-
@peers.select { |p| p.capable?(capability) }
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# Find a static peer by its registered name. Returns nil if not found.
|
|
40
|
-
def peer_named(name)
|
|
41
|
-
@peers.find { |p| p.name == name.to_s }
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
data/lib/igniter/mesh/peer.rb
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Mesh
|
|
5
|
-
# Immutable value object representing a peer in the static mesh.
|
|
6
|
-
class Peer
|
|
7
|
-
attr_reader :name, :url, :capabilities
|
|
8
|
-
|
|
9
|
-
def initialize(name:, url:, capabilities: [])
|
|
10
|
-
@name = name.to_s.freeze
|
|
11
|
-
@url = url.to_s.chomp("/").freeze
|
|
12
|
-
@capabilities = Array(capabilities).map(&:to_sym).freeze
|
|
13
|
-
freeze
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def capable?(capability)
|
|
17
|
-
@capabilities.include?(capability.to_sym)
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Mesh
|
|
5
|
-
# Thread-safe registry for dynamically discovered peers.
|
|
6
|
-
#
|
|
7
|
-
# Stores peers indexed by name so that registering the same peer twice
|
|
8
|
-
# (e.g. from two different seeds) is idempotent and the latest wins.
|
|
9
|
-
class PeerRegistry
|
|
10
|
-
def initialize
|
|
11
|
-
@peers = {}
|
|
12
|
-
@mutex = Mutex.new
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Register (or update) a peer. Thread-safe.
|
|
16
|
-
def register(peer)
|
|
17
|
-
@mutex.synchronize { @peers[peer.name] = peer }
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Remove a peer by name. No-op if not registered.
|
|
21
|
-
def unregister(name)
|
|
22
|
-
@mutex.synchronize { @peers.delete(name.to_s) }
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# All currently registered peers (snapshot).
|
|
26
|
-
def all
|
|
27
|
-
@mutex.synchronize { @peers.values.dup }
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# Peers that advertise a given capability.
|
|
31
|
-
def peers_with_capability(capability)
|
|
32
|
-
all.select { |p| p.capable?(capability) }
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Find a peer by name. Returns nil if not found.
|
|
36
|
-
def peer_named(name)
|
|
37
|
-
@mutex.synchronize { @peers[name.to_s] }
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Remove all registered peers. Useful in tests.
|
|
41
|
-
def clear
|
|
42
|
-
@mutex.synchronize { @peers.clear }
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Number of registered peers.
|
|
46
|
-
def size
|
|
47
|
-
@mutex.synchronize { @peers.size }
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
data/lib/igniter/mesh/router.rb
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Mesh
|
|
5
|
-
# Thread-safe capability router with a short-lived health cache.
|
|
6
|
-
#
|
|
7
|
-
# Resolves the URL to call for a given routing mode:
|
|
8
|
-
# - :capability → round-robin among alive peers that advertise the capability;
|
|
9
|
-
# raises DeferredCapabilityError when no alive peer is found.
|
|
10
|
-
# - :pinned → asserts the named peer is alive and returns its URL;
|
|
11
|
-
# raises IncidentError when the peer is unknown or unreachable.
|
|
12
|
-
#
|
|
13
|
-
# Peer pool = static peers (Config#peers) + dynamic peers (Config#peer_registry).
|
|
14
|
-
# Static peers take precedence when a name appears in both sets.
|
|
15
|
-
class Router
|
|
16
|
-
HEALTH_CACHE_TTL = 5 # seconds
|
|
17
|
-
|
|
18
|
-
def initialize(config)
|
|
19
|
-
@config = config
|
|
20
|
-
@health_cache = {}
|
|
21
|
-
@mutex = Mutex.new
|
|
22
|
-
@round_robin = Hash.new(0)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Find an alive peer advertising +capability+.
|
|
26
|
-
# Returns the peer URL. Raises DeferredCapabilityError when none are alive.
|
|
27
|
-
def find_peer_for(capability, deferred_result)
|
|
28
|
-
candidates = all_capable_peers(capability).select { |p| alive?(p) }
|
|
29
|
-
|
|
30
|
-
raise DeferredCapabilityError.new(capability, deferred_result) if candidates.empty?
|
|
31
|
-
|
|
32
|
-
url_for_round_robin(capability, candidates)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Resolve the URL of a pinned peer by name.
|
|
36
|
-
# Raises IncidentError if the peer is unknown or unreachable.
|
|
37
|
-
def resolve_pinned(peer_name)
|
|
38
|
-
peer = find_named_peer(peer_name)
|
|
39
|
-
|
|
40
|
-
unless peer
|
|
41
|
-
raise IncidentError.new(
|
|
42
|
-
peer_name,
|
|
43
|
-
"Pinned peer '#{peer_name}' is not registered in Igniter::Mesh"
|
|
44
|
-
)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
raise IncidentError, peer_name unless alive?(peer)
|
|
48
|
-
|
|
49
|
-
peer.url
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Expire a peer's cached health status (e.g., after a successful or failed request).
|
|
53
|
-
def invalidate_health!(url)
|
|
54
|
-
@mutex.synchronize { @health_cache.delete(url) }
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
private
|
|
58
|
-
|
|
59
|
-
# Combined static + dynamic peer pool for capability lookup.
|
|
60
|
-
# Static peers take precedence over same-named dynamic peers.
|
|
61
|
-
def all_capable_peers(capability)
|
|
62
|
-
merge_peers(
|
|
63
|
-
@config.peers_with_capability(capability),
|
|
64
|
-
@config.peer_registry.peers_with_capability(capability)
|
|
65
|
-
)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Lookup peer by name across static and dynamic pools.
|
|
69
|
-
def find_named_peer(name)
|
|
70
|
-
@config.peer_named(name) || @config.peer_registry.peer_named(name)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Merge static and dynamic peer lists; static names win on collision.
|
|
74
|
-
def merge_peers(static, dynamic)
|
|
75
|
-
seen = static.each_with_object({}) { |p, h| h[p.name] = true }
|
|
76
|
-
static + dynamic.reject { |p| seen[p.name] }
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def url_for_round_robin(capability, candidates)
|
|
80
|
-
idx = @mutex.synchronize do
|
|
81
|
-
i = @round_robin[capability] % candidates.size
|
|
82
|
-
@round_robin[capability] = i + 1
|
|
83
|
-
i
|
|
84
|
-
end
|
|
85
|
-
candidates[idx].url
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def alive?(peer) # rubocop:disable Metrics/MethodLength
|
|
89
|
-
@mutex.synchronize do
|
|
90
|
-
entry = @health_cache[peer.url]
|
|
91
|
-
return entry[:alive] if entry && (Time.now.utc - entry[:checked_at]) < HEALTH_CACHE_TTL
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
alive = begin
|
|
95
|
-
Igniter::Server::Client.new(peer.url, timeout: 3).health
|
|
96
|
-
true
|
|
97
|
-
rescue Igniter::Server::Client::ConnectionError
|
|
98
|
-
false
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
@mutex.synchronize do
|
|
102
|
-
@health_cache[peer.url] = { alive: alive, checked_at: Time.now.utc }
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
alive
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|