igniter 0.4.5 → 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 +164 -409
- data/bin/igniter-stack +94 -0
- data/docs/README.md +62 -0
- data/examples/README.md +74 -312
- data/examples/agent_orchestration.rb +76 -0
- data/examples/agents.rb +2 -1
- data/examples/catalog.rb +412 -0
- data/examples/consensus.rb +241 -0
- data/examples/dataflow.rb +309 -0
- data/examples/distributed_workflow.rb +1 -1
- data/examples/effects.rb +10 -9
- data/examples/elocal_webhook.rb +1 -0
- data/examples/incremental.rb +4 -3
- data/examples/introspection.rb +49 -0
- data/examples/invariants.rb +4 -3
- data/examples/llm_tools.rb +237 -0
- data/examples/mesh.rb +241 -0
- data/examples/mesh_discovery.rb +287 -0
- data/examples/mesh_gossip.rb +164 -0
- data/examples/reactive_auditing.rb +50 -0
- data/examples/ringcentral_routing.rb +1 -1
- 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 +48 -15
- 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/packages/igniter-agents/lib/igniter/agents/observability/metrics_agent.rb +130 -0
- data/packages/igniter-agents/lib/igniter/agents/pipeline/batch_processor_agent.rb +131 -0
- data/packages/igniter-agents/lib/igniter/agents/proactive/alert_agent.rb +111 -0
- data/packages/igniter-agents/lib/igniter/agents/proactive/health_check_agent.rb +122 -0
- data/packages/igniter-agents/lib/igniter/agents/proactive_agent.rb +208 -0
- data/packages/igniter-agents/lib/igniter/agents/reliability/retry_agent.rb +99 -0
- data/packages/igniter-agents/lib/igniter/agents/scheduling/cron_agent.rb +110 -0
- data/packages/igniter-agents/lib/igniter/agents.rb +23 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/chain_agent.rb +129 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/critic_agent.rb +165 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/evaluator_agent.rb +195 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/evolution_agent.rb +288 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/observer_agent.rb +186 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/planner_agent.rb +212 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/router_agent.rb +133 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/self_reflection_agent.rb +177 -0
- 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/packages/igniter-ai/lib/igniter/ai/config.rb +113 -0
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/context.rb +2 -2
- data/packages/igniter-ai/lib/igniter/ai/executor.rb +352 -0
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/anthropic.rb +42 -9
- 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 +39 -10
- data/packages/igniter-ai/lib/igniter/ai/skill/feedback.rb +116 -0
- data/packages/igniter-ai/lib/igniter/ai/skill/output_schema.rb +110 -0
- 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/packages/igniter-ai/lib/igniter/ai/transcription/providers/assemblyai.rb +200 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/providers/base.rb +122 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/providers/deepgram.rb +162 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/providers/openai.rb +102 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/transcriber.rb +145 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/transcript_result.rb +29 -0
- data/packages/igniter-ai/lib/igniter/ai.rb +98 -0
- 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/packages/igniter-app/lib/igniter/app/autoloader.rb +18 -0
- 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/packages/igniter-app/lib/igniter/app/scheduler.rb +109 -0
- 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/packages/igniter-cluster/lib/igniter/cluster/consensus/cluster.rb +187 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/errors.rb +16 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/executors.rb +45 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/node.rb +322 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/read_query.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/state_machine.rb +60 -0
- 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/packages/igniter-cluster/lib/igniter/cluster/mesh/announcer.rb +88 -0
- 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/packages/igniter-cluster/lib/igniter/cluster/mesh/discovery.rb +44 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/errors.rb +36 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/gossip.rb +62 -0
- 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/packages/igniter-cluster/lib/igniter/cluster/mesh/poller.rb +92 -0
- 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/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrapper.rb +63 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/gem.rb +39 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/git.rb +46 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/tarball.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/capability_query.rb +675 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/expansion_plan.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/expansion_planner.rb +154 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/manifest.rb +47 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/network_topology.rb +150 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/node_profile.rb +134 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/reflective_replication_agent.rb +259 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/replication_agent.rb +89 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/ssh_session.rb +79 -0
- 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/packages/igniter-core/lib/igniter/core/capabilities.rb +70 -0
- 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 +90 -3
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/remote_validator.rb +2 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler.rb +1 -0
- data/packages/igniter-core/lib/igniter/core/content_addressing.rb +133 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/contract.rb +88 -6
- data/packages/igniter-core/lib/igniter/core/dataflow/aggregate_operators.rb +147 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/aggregate_state.rb +77 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/diff.rb +37 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/diff_state.rb +81 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/incremental_collection_result.rb +39 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/window_filter.rb +48 -0
- data/packages/igniter-core/lib/igniter/core/dataflow.rb +65 -0
- 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 +230 -9
- 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/packages/igniter-core/lib/igniter/core/executor.rb +134 -0
- 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/packages/igniter-core/lib/igniter/core/fingerprint.rb +43 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental.rb +4 -4
- data/packages/igniter-core/lib/igniter/core/memory/agent_memory.rb +104 -0
- data/packages/igniter-core/lib/igniter/core/memory/episode.rb +29 -0
- data/packages/igniter-core/lib/igniter/core/memory/fact.rb +27 -0
- data/packages/igniter-core/lib/igniter/core/memory/memorable.rb +90 -0
- data/packages/igniter-core/lib/igniter/core/memory/reflection_cycle.rb +96 -0
- data/packages/igniter-core/lib/igniter/core/memory/reflection_record.rb +28 -0
- data/packages/igniter-core/lib/igniter/core/memory/store.rb +115 -0
- data/packages/igniter-core/lib/igniter/core/memory/stores/in_memory.rb +136 -0
- data/packages/igniter-core/lib/igniter/core/memory/stores/sqlite.rb +286 -0
- data/packages/igniter-core/lib/igniter/core/memory.rb +80 -0
- data/packages/igniter-core/lib/igniter/core/metrics/collector.rb +131 -0
- data/packages/igniter-core/lib/igniter/core/metrics/prometheus_exporter.rb +104 -0
- data/packages/igniter-core/lib/igniter/core/metrics/snapshot.rb +8 -0
- data/packages/igniter-core/lib/igniter/core/metrics.rb +37 -0
- 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/packages/igniter-core/lib/igniter/core/model/aggregate_node.rb +34 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/branch_node.rb +37 -1
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/collection_node.rb +3 -2
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/compute_node.rb +13 -0
- 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/packages/igniter-core/lib/igniter/core/node_cache.rb +231 -0
- 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/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/input_validator.rb +6 -2
- 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/packages/igniter-core/lib/igniter/core/runtime/resolver.rb +951 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/result.rb +2 -0
- data/packages/igniter-core/lib/igniter/core/runtime/stores/redis_store.rb +93 -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/packages/igniter-core/lib/igniter/core/temporal.rb +84 -0
- data/packages/igniter-core/lib/igniter/core/tool/discoverable.rb +151 -0
- data/packages/igniter-core/lib/igniter/core/tool.rb +56 -0
- 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/packages/igniter-extensions/lib/igniter/extensions/capabilities.rb +39 -0
- data/packages/igniter-extensions/lib/igniter/extensions/content_addressing.rb +5 -0
- data/packages/igniter-extensions/lib/igniter/extensions/dataflow.rb +117 -0
- 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/packages/igniter-server/lib/igniter/server/client.rb +256 -0
- 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/{lib → packages/igniter-server/lib}/igniter/server/handlers/event_handler.rb +4 -0
- data/{lib → packages/igniter-server/lib}/igniter/server/handlers/execute_handler.rb +6 -0
- data/packages/igniter-server/lib/igniter/server/handlers/liveness_handler.rb +20 -0
- data/packages/igniter-server/lib/igniter/server/handlers/manifest_handler.rb +77 -0
- data/packages/igniter-server/lib/igniter/server/handlers/metrics_handler.rb +51 -0
- data/packages/igniter-server/lib/igniter/server/handlers/peers_handler.rb +136 -0
- data/packages/igniter-server/lib/igniter/server/handlers/readiness_handler.rb +47 -0
- data/packages/igniter-server/lib/igniter/server/http_server.rb +222 -0
- 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/packages/igniter-server/lib/igniter/server/server_logger.rb +54 -0
- data/packages/igniter-server/lib/igniter/server.rb +130 -0
- data/packages/igniter-server/lib/igniter-server.rb +3 -0
- metadata +638 -168
- data/docs/API_V2.md +0 -537
- data/docs/ARCHITECTURE_V2.md +0 -317
- data/docs/BACKLOG.md +0 -166
- data/docs/BRANCHES_V1.md +0 -213
- data/docs/COLLECTIONS_V1.md +0 -303
- 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/PATTERNS.md +0 -411
- data/docs/SERVER_V1.md +0 -313
- data/docs/STORE_ADAPTERS.md +0 -126
- data/lib/igniter/diagnostics.rb +0 -8
- data/lib/igniter/executor.rb +0 -74
- data/lib/igniter/extensions/introspection/plan_formatter.rb +0 -55
- data/lib/igniter/extensions/invariants.rb +0 -116
- data/lib/igniter/integrations/agents.rb +0 -18
- data/lib/igniter/integrations/llm/config.rb +0 -69
- data/lib/igniter/integrations/llm/executor.rb +0 -159
- data/lib/igniter/integrations/llm.rb +0 -59
- data/lib/igniter/model/remote_node.rb +0 -26
- data/lib/igniter/runtime/execution.rb +0 -398
- data/lib/igniter/runtime/job_worker.rb +0 -18
- data/lib/igniter/runtime/planner.rb +0 -126
- data/lib/igniter/runtime/resolver.rb +0 -520
- data/lib/igniter/runtime/stores/redis_store.rb +0 -56
- data/lib/igniter/server/client.rb +0 -123
- data/lib/igniter/server/config.rb +0 -27
- data/lib/igniter/server/http_server.rb +0 -109
- data/lib/igniter/server/router.rb +0 -75
- data/lib/igniter/server.rb +0 -67
- /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/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/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}/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_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}/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}/model/await_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/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/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}/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/health_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/README.md
CHANGED
|
@@ -1,87 +1,41 @@
|
|
|
1
1
|
# Igniter
|
|
2
2
|
|
|
3
|
-
Igniter is a Ruby
|
|
4
|
-
|
|
5
|
-
- lazy output resolution and selective cache invalidation
|
|
6
|
-
- typed input validation with defaults and required fields
|
|
7
|
-
- nested contract composition with isolated child executions
|
|
8
|
-
- declarative routing (`branch`) and fan-out (`collection`)
|
|
9
|
-
- distributed workflows: `await` events across process boundaries
|
|
10
|
-
- multi-node deployments via `igniter-server` and the `remote:` DSL
|
|
11
|
-
- LLM compute nodes with Ollama, Anthropic, and OpenAI providers
|
|
12
|
-
- Rails integration: ActiveJob, ActionCable, webhook handlers, generators
|
|
13
|
-
- runtime auditing, diagnostics reports, and reactive side effects
|
|
14
|
-
- graph and runtime introspection (text, Mermaid)
|
|
15
|
-
- ergonomic DSL helpers: `const`, `lookup`, `map`, `project`, `aggregate`, `guard`, `export`, `expose`, `effect`, `on_success`, `scope`, `namespace`
|
|
3
|
+
Igniter is a Ruby framework for building business logic as validated dependency graphs.
|
|
16
4
|
|
|
17
|
-
|
|
5
|
+
At the center is a small, strict idea:
|
|
18
6
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
- describe dependencies explicitly
|
|
8
|
+
- validate the graph before runtime
|
|
9
|
+
- resolve only what is needed
|
|
10
|
+
- keep the runtime observable
|
|
22
11
|
|
|
23
|
-
|
|
12
|
+
From there, Igniter scales by layers instead of by reinvention:
|
|
24
13
|
|
|
25
|
-
|
|
26
|
-
|
|
14
|
+
- **Core** for contracts, compilation, execution, diagnostics
|
|
15
|
+
- **App** for a single-node runtime/profile
|
|
16
|
+
- **Cluster** for capability-based distributed execution
|
|
17
|
+
- **SDK** for optional packs such as AI, channels, tools, and data
|
|
27
18
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
input :vat_rate, type: :numeric, default: 0.2
|
|
19
|
+
This README is an entrypoint, not the full reference. The reference now lives in
|
|
20
|
+
[`docs/`](./docs/README.md), organized into [`guide`](./docs/guide/README.md),
|
|
21
|
+
[`concepts`](./docs/concepts/README.md), [`current`](./docs/current/README.md),
|
|
22
|
+
and [`dev`](./docs/dev/README.md).
|
|
33
23
|
|
|
34
|
-
|
|
35
|
-
country == "UA" ? vat_rate : 0.0
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
compute :gross_total, depends_on: %i[order_total effective_vat_rate] do |order_total:, effective_vat_rate:|
|
|
39
|
-
order_total * (1 + effective_vat_rate)
|
|
40
|
-
end
|
|
24
|
+
## Why Igniter
|
|
41
25
|
|
|
42
|
-
|
|
43
|
-
end
|
|
44
|
-
end
|
|
26
|
+
Igniter is useful when your domain logic wants more structure than “service objects everywhere” but less ceremony than a full workflow engine.
|
|
45
27
|
|
|
46
|
-
|
|
47
|
-
contract.result.gross_total # => 120.0
|
|
28
|
+
You define a graph of inputs, computations, branches, collections, compositions, and outputs. Igniter compiles that graph, validates it, and gives you a runtime that is lazy, inspectable, and capable of growing from embedded usage to app hosting and then to a cluster.
|
|
48
29
|
|
|
49
|
-
|
|
50
|
-
contract.result.gross_total # => 180.0
|
|
51
|
-
|
|
52
|
-
contract.diagnostics_text # compact execution summary
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Features
|
|
56
|
-
|
|
57
|
-
- **Contracts**: declare inputs, compute nodes, outputs, and compositions in a validated graph.
|
|
58
|
-
- **Compiler**: validate dependency graphs, types, and cycles before runtime; errors are surfaced at load time.
|
|
59
|
-
- **Runtime**: cache resolved nodes and invalidate only affected downstream nodes on input change.
|
|
60
|
-
- **Typed inputs**: validate types, defaults, and required fields at execution boundaries.
|
|
61
|
-
- **Composition**: execute nested contracts with isolated child executions.
|
|
62
|
-
- **Branch**: declarative routing — select one child contract from ordered cases at runtime.
|
|
63
|
-
- **Collection**: declarative fan-out — run one child contract per item in an array.
|
|
64
|
-
- **Distributed workflows**: `await` external events; resume via `deliver_event`.
|
|
65
|
-
- **igniter-server**: host contracts as a TCP/Rack HTTP service; call remote contracts with the `remote:` DSL.
|
|
66
|
-
- **LLM integration**: compute nodes powered by Ollama, Anthropic, or OpenAI providers.
|
|
67
|
-
- **Rails integration**: Railtie, ActiveJob base class, ActionCable adapter, webhook controller mixin.
|
|
68
|
-
- **Auditing**: collect execution timelines and snapshots.
|
|
69
|
-
- **Diagnostics**: compact text, Markdown, or structured reports for triage.
|
|
70
|
-
- **Reactive**: subscribe declaratively to runtime events with `effect`, `on_success`, `on_failure`.
|
|
71
|
-
- **Introspection**: render graphs as text or Mermaid; inspect runtime state.
|
|
72
|
-
|
|
73
|
-
## Quick Start Recipes
|
|
74
|
-
|
|
75
|
-
Runnable examples live in [`examples/`](examples) and are smoke-tested by `spec/igniter/example_scripts_spec.rb`.
|
|
76
|
-
See [`examples/README.md`](examples/README.md) for a quick index and [`docs/PATTERNS.md`](docs/PATTERNS.md) for composable patterns.
|
|
77
|
-
|
|
78
|
-
### 1. Basic Pricing Contract
|
|
30
|
+
## A Tiny Example
|
|
79
31
|
|
|
80
32
|
```ruby
|
|
33
|
+
require "igniter"
|
|
34
|
+
|
|
81
35
|
class PriceContract < Igniter::Contract
|
|
82
36
|
define do
|
|
83
37
|
input :order_total, type: :numeric
|
|
84
|
-
input :country,
|
|
38
|
+
input :country, type: :string
|
|
85
39
|
|
|
86
40
|
compute :vat_rate, depends_on: [:country] do |country:|
|
|
87
41
|
country == "UA" ? 0.2 : 0.0
|
|
@@ -95,413 +49,214 @@ class PriceContract < Igniter::Contract
|
|
|
95
49
|
end
|
|
96
50
|
end
|
|
97
51
|
|
|
98
|
-
PriceContract.new(order_total: 100, country: "UA").result.gross_total
|
|
99
|
-
# => 120.0
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### 2. Nested Composition
|
|
103
|
-
|
|
104
|
-
```ruby
|
|
105
|
-
class CheckoutContract < Igniter::Contract
|
|
106
|
-
define do
|
|
107
|
-
input :order_total, type: :numeric
|
|
108
|
-
input :country, type: :string
|
|
109
|
-
|
|
110
|
-
compose :pricing, contract: PriceContract, inputs: {
|
|
111
|
-
order_total: :order_total,
|
|
112
|
-
country: :country
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
output :pricing
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
CheckoutContract.new(order_total: 100, country: "UA").result.pricing.gross_total
|
|
120
|
-
# => 120.0
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### 3. Diagnostics and Introspection
|
|
124
|
-
|
|
125
|
-
```ruby
|
|
126
52
|
contract = PriceContract.new(order_total: 100, country: "UA")
|
|
127
53
|
contract.result.gross_total
|
|
54
|
+
# => 120.0
|
|
55
|
+
```
|
|
128
56
|
|
|
129
|
-
|
|
130
|
-
contract.result.explain(:gross_total)
|
|
131
|
-
contract.diagnostics.to_h
|
|
132
|
-
contract.diagnostics_text
|
|
133
|
-
contract.diagnostics_markdown
|
|
134
|
-
contract.audit_snapshot
|
|
57
|
+
## One Real Example
|
|
135
58
|
|
|
136
|
-
|
|
137
|
-
PriceContract.graph.to_mermaid
|
|
138
|
-
```
|
|
59
|
+
Imagine a post-call analysis pipeline for a call center.
|
|
139
60
|
|
|
140
|
-
|
|
61
|
+
The business task is simple to describe:
|
|
141
62
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
```
|
|
63
|
+
- take a recording
|
|
64
|
+
- transcribe it
|
|
65
|
+
- extract structured facts
|
|
66
|
+
- score the call
|
|
67
|
+
- prepare CRM updates and supervisor follow-up
|
|
148
68
|
|
|
149
|
-
|
|
69
|
+
In Igniter, that stays one explicit graph:
|
|
150
70
|
|
|
151
71
|
```ruby
|
|
152
|
-
|
|
153
|
-
def call(order_total:)
|
|
154
|
-
defer(token: "quote-#{order_total}", payload: { kind: "pricing_quote" })
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
class AsyncPricingContract < Igniter::Contract
|
|
159
|
-
run_with runner: :store
|
|
72
|
+
require "igniter/cluster"
|
|
160
73
|
|
|
74
|
+
class PostCallAnalysisContract < Igniter::Contract
|
|
161
75
|
define do
|
|
162
|
-
input :
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
76
|
+
input :call_id, type: :string
|
|
77
|
+
input :audio_url, type: :string
|
|
78
|
+
input :recorded_at, type: :string
|
|
79
|
+
|
|
80
|
+
remote :transcript,
|
|
81
|
+
contract: "TranscribeCall",
|
|
82
|
+
query: { all_of: [:audio_transcription], tags: [:gpu] },
|
|
83
|
+
inputs: { audio_url: :audio_url }
|
|
84
|
+
|
|
85
|
+
remote :analysis,
|
|
86
|
+
contract: "AnalyzeCall",
|
|
87
|
+
query: { all_of: [:llm_inference] },
|
|
88
|
+
inputs: {
|
|
89
|
+
call_id: :call_id,
|
|
90
|
+
transcript: :transcript,
|
|
91
|
+
recorded_at: :recorded_at
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
compute :crm_patch, depends_on: [:analysis] do |analysis:|
|
|
95
|
+
{
|
|
96
|
+
disposition: analysis[:disposition],
|
|
97
|
+
sentiment: analysis[:sentiment],
|
|
98
|
+
next_action: analysis[:next_action],
|
|
99
|
+
escalation_required: analysis[:escalation_required]
|
|
100
|
+
}
|
|
166
101
|
end
|
|
167
|
-
|
|
102
|
+
|
|
103
|
+
output :analysis
|
|
104
|
+
output :crm_patch
|
|
168
105
|
end
|
|
169
106
|
end
|
|
170
|
-
|
|
171
|
-
contract = AsyncPricingContract.new(order_total: 100)
|
|
172
|
-
deferred = contract.result.gross_total
|
|
173
|
-
execution_id = contract.execution.events.execution_id
|
|
174
|
-
|
|
175
|
-
resumed = AsyncPricingContract.resume_from_store(
|
|
176
|
-
execution_id, token: deferred.token, value: 150
|
|
177
|
-
)
|
|
178
|
-
resumed.result.gross_total # => 180.0
|
|
179
107
|
```
|
|
180
108
|
|
|
181
|
-
|
|
109
|
+
Why this is interesting:
|
|
182
110
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
input :zip_code, type: :string
|
|
111
|
+
- the domain flow is still one contract, not a pile of queue handlers
|
|
112
|
+
- transcription and analysis can land on different nodes with different capabilities
|
|
113
|
+
- the cluster routes by capabilities, not by hard-coded machine roles
|
|
114
|
+
- if one matching node disappears, the network can select another suitable peer without changing the contract
|
|
188
115
|
|
|
189
|
-
|
|
116
|
+
That is the general Igniter idea: keep the business graph stable, let the runtime grow from local execution to a capability-driven cluster.
|
|
190
117
|
|
|
191
|
-
|
|
192
|
-
map :trade_name, from: :service do |service:|
|
|
193
|
-
%w[heating cooling ventilation].include?(service.downcase) ? "HVAC" : service
|
|
194
|
-
end
|
|
195
|
-
end
|
|
118
|
+
## The Levels
|
|
196
119
|
|
|
197
|
-
|
|
198
|
-
lookup :trade, with: :trade_name do |trade_name:|
|
|
199
|
-
{ name: trade_name, base_bid: 45.0 }
|
|
200
|
-
end
|
|
201
|
-
end
|
|
120
|
+
### 1. Core
|
|
202
121
|
|
|
203
|
-
|
|
204
|
-
guard :zip_supported, with: :zip_code, in: %w[60601 10001], message: "Unsupported zip"
|
|
205
|
-
end
|
|
122
|
+
Start here if you want the kernel:
|
|
206
123
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
124
|
+
- contract DSL
|
|
125
|
+
- compiler and graph validation
|
|
126
|
+
- lazy runtime and invalidation
|
|
127
|
+
- diagnostics, events, introspection
|
|
211
128
|
|
|
212
|
-
|
|
213
|
-
end
|
|
129
|
+
Read:
|
|
214
130
|
|
|
215
|
-
|
|
216
|
-
puts "Persist #{value.inspect}"
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
```
|
|
131
|
+
- [`docs/guide/core.md`](./docs/guide/core.md)
|
|
220
132
|
|
|
221
|
-
|
|
133
|
+
### 2. App
|
|
222
134
|
|
|
223
|
-
|
|
224
|
-
guard :usa_only, with: :country_code, eq: "USA", message: "Unsupported country"
|
|
225
|
-
guard :supported_country, with: :country_code, in: %w[USA CAN], message: "Unsupported country"
|
|
226
|
-
guard :valid_zip, with: :zip_code, matches: /\A\d{5}\z/, message: "Invalid zip"
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### 7. Declarative Branching
|
|
230
|
-
|
|
231
|
-
```ruby
|
|
232
|
-
class DeliveryContract < Igniter::Contract
|
|
233
|
-
define do
|
|
234
|
-
input :country
|
|
235
|
-
input :order_total
|
|
236
|
-
|
|
237
|
-
branch :delivery_strategy, with: :country, inputs: {
|
|
238
|
-
country: :country,
|
|
239
|
-
order_total: :order_total
|
|
240
|
-
} do
|
|
241
|
-
on "US", contract: USDeliveryContract
|
|
242
|
-
on "UA", contract: LocalDeliveryContract
|
|
243
|
-
default contract: DefaultDeliveryContract
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
export :price, :eta, from: :delivery_strategy
|
|
247
|
-
end
|
|
248
|
-
end
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
### 8. Declarative Collections
|
|
135
|
+
Use this when you want Igniter to be the runtime shape of an application:
|
|
252
136
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
137
|
+
- app profile
|
|
138
|
+
- host/loader/scheduler seams
|
|
139
|
+
- stack-style project layout
|
|
140
|
+
- app diagnostics and evolution/governance layers
|
|
257
141
|
|
|
258
|
-
|
|
259
|
-
with: :technician_inputs,
|
|
260
|
-
each: TechnicianContract,
|
|
261
|
-
key: :technician_id,
|
|
262
|
-
mode: :collect
|
|
263
|
-
|
|
264
|
-
output :technicians
|
|
265
|
-
end
|
|
266
|
-
end
|
|
267
|
-
```
|
|
142
|
+
Read:
|
|
268
143
|
|
|
269
|
-
|
|
144
|
+
- [`docs/guide/app.md`](./docs/guide/app.md)
|
|
270
145
|
|
|
271
|
-
|
|
272
|
-
- `result.items_summary` — compact per-item status hash
|
|
273
|
-
- `result.failed_items` — failed-item error details
|
|
274
|
-
- `result.successes` — hash of succeeded items only
|
|
146
|
+
### 3. Cluster
|
|
275
147
|
|
|
276
|
-
|
|
148
|
+
Use this when execution stops being single-node:
|
|
277
149
|
|
|
278
|
-
|
|
150
|
+
- mesh and gossip
|
|
151
|
+
- capability-based routing
|
|
152
|
+
- replication and distributed coordination
|
|
153
|
+
- resilience and decentralized runtime concerns
|
|
279
154
|
|
|
280
|
-
|
|
281
|
-
which execution should receive the event, so events can be delivered from any process:
|
|
155
|
+
Read:
|
|
282
156
|
|
|
283
|
-
|
|
284
|
-
class LeadWorkflow < Igniter::Contract
|
|
285
|
-
correlate_by :request_id
|
|
157
|
+
- [`docs/guide/cluster.md`](./docs/guide/cluster.md)
|
|
286
158
|
|
|
287
|
-
|
|
288
|
-
input :request_id
|
|
159
|
+
### 4. SDK
|
|
289
160
|
|
|
290
|
-
|
|
291
|
-
await :billing_data, event: :billing_received
|
|
161
|
+
Use SDK packs when the kernel needs optional capabilities:
|
|
292
162
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
163
|
+
- AI
|
|
164
|
+
- channels
|
|
165
|
+
- tools
|
|
166
|
+
- skills
|
|
167
|
+
- data and app-facing capability packs
|
|
296
168
|
|
|
297
|
-
|
|
298
|
-
end
|
|
169
|
+
Read:
|
|
299
170
|
|
|
300
|
-
|
|
301
|
-
puts "Report ready: #{value.inspect}"
|
|
302
|
-
end
|
|
303
|
-
end
|
|
171
|
+
- [`docs/guide/sdk.md`](./docs/guide/sdk.md)
|
|
304
172
|
|
|
305
|
-
|
|
173
|
+
## Suggested Reading Paths
|
|
306
174
|
|
|
307
|
-
|
|
308
|
-
execution = LeadWorkflow.start({ request_id: "r1" }, store: store)
|
|
309
|
-
execution.pending? # => true
|
|
175
|
+
If you are new to Igniter:
|
|
310
176
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
payload: { company: "Acme Corp", tier: "enterprise" },
|
|
315
|
-
store: store)
|
|
177
|
+
1. Read [`docs/guide/`](./docs/guide/README.md)
|
|
178
|
+
2. Read [`docs/concepts/`](./docs/concepts/README.md)
|
|
179
|
+
3. Run one or two scripts from [`examples/README.md`](./examples/README.md)
|
|
316
180
|
|
|
317
|
-
|
|
318
|
-
correlation: { request_id: "r1" },
|
|
319
|
-
payload: { mrr: 500 },
|
|
320
|
-
store: store)
|
|
321
|
-
# => prints "Report ready: { crm: ..., billing: ... }"
|
|
322
|
-
```
|
|
181
|
+
If you want to work on Igniter itself:
|
|
323
182
|
|
|
324
|
-
|
|
183
|
+
1. Read [`docs/dev/`](./docs/dev/README.md)
|
|
184
|
+
2. Read [`docs/dev/architecture-index.md`](./docs/dev/architecture-index.md)
|
|
185
|
+
3. Then move to the relevant package or layer index
|
|
325
186
|
|
|
326
|
-
|
|
187
|
+
If you want the standard app shape:
|
|
327
188
|
|
|
328
|
-
|
|
189
|
+
1. Read [`docs/guide/`](./docs/guide/README.md)
|
|
190
|
+
2. Read [`docs/guide/app.md`](./docs/guide/app.md)
|
|
191
|
+
3. Read [`docs/guide/cli.md`](./docs/guide/cli.md)
|
|
192
|
+
4. Explore [`examples/companion/README.md`](./examples/companion/README.md)
|
|
329
193
|
|
|
330
|
-
|
|
331
|
-
# --- Service node on port 4568 ---
|
|
332
|
-
require "igniter/server"
|
|
194
|
+
If you want distributed ideas:
|
|
333
195
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
compute :score, depends_on: :value, call: ->(value:) { value * 1.5 }
|
|
338
|
-
output :score
|
|
339
|
-
end
|
|
340
|
-
end
|
|
196
|
+
1. Read [`docs/guide/`](./docs/guide/README.md)
|
|
197
|
+
2. Read [`docs/guide/cluster.md`](./docs/guide/cluster.md)
|
|
198
|
+
3. Run cluster-oriented scripts from [`examples/README.md`](./examples/README.md)
|
|
341
199
|
|
|
342
|
-
|
|
343
|
-
Igniter::Server.start
|
|
200
|
+
If you are iterating on ideas locally:
|
|
344
201
|
|
|
345
|
-
|
|
346
|
-
|
|
202
|
+
- keep public learning material in [`examples/`](./examples/README.md)
|
|
203
|
+
- keep local-first experiments in [`playgrounds/`](./playgrounds/README.md)
|
|
347
204
|
|
|
348
|
-
|
|
349
|
-
define do
|
|
350
|
-
input :data
|
|
351
|
-
remote :scored,
|
|
352
|
-
contract: "ScoringContract",
|
|
353
|
-
node: "http://localhost:4568",
|
|
354
|
-
inputs: { value: :data }
|
|
355
|
-
output :scored
|
|
356
|
-
end
|
|
357
|
-
end
|
|
205
|
+
## Documentation Layout
|
|
358
206
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
207
|
+
- [`docs/guide/`](./docs/guide/README.md) — user-facing docs: getting started, API, how-tos, configuration
|
|
208
|
+
- [`docs/concepts/`](./docs/concepts/README.md) — durable mental models and patterns
|
|
209
|
+
- [`docs/current/`](./docs/current/README.md) — current-state notes and near-term direction
|
|
210
|
+
- [`docs/dev/`](./docs/dev/README.md) — internal docs: architecture, package boundaries, migration plans, backlog
|
|
211
|
+
- [`packages/*/README.md`](./packages/igniter-core/README.md) — package-local quick reference owned by each gem
|
|
212
|
+
- [`docs/`](./docs/README.md) — top-level docs portal that routes between sections
|
|
362
213
|
|
|
363
|
-
|
|
214
|
+
If you want to scaffold a new stack quickly:
|
|
364
215
|
|
|
365
216
|
```bash
|
|
366
|
-
igniter-
|
|
217
|
+
bin/igniter-stack new my_app
|
|
218
|
+
bin/igniter-stack new my_hub --profile dashboard
|
|
219
|
+
bin/igniter-stack new mesh_lab --profile cluster
|
|
220
|
+
bin/igniter-stack new playgrounds/home-lab --profile playground
|
|
367
221
|
```
|
|
368
222
|
|
|
369
|
-
|
|
223
|
+
## Installation
|
|
370
224
|
|
|
371
225
|
```ruby
|
|
372
|
-
|
|
373
|
-
require_relative "contracts"
|
|
374
|
-
Igniter::Server.configure { |c| c.register "ScoringContract", ScoringContract }
|
|
375
|
-
run Igniter::Server.rack_app
|
|
226
|
+
gem "igniter"
|
|
376
227
|
```
|
|
377
228
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
| Method | Path | Description |
|
|
381
|
-
|--------|------|-------------|
|
|
382
|
-
| `POST` | `/v1/contracts/:name/execute` | Execute a contract synchronously |
|
|
383
|
-
| `POST` | `/v1/contracts/:name/events` | Deliver an event to a distributed contract |
|
|
384
|
-
| `GET` | `/v1/executions/:id` | Poll execution status |
|
|
385
|
-
| `GET` | `/v1/health` | Health check with registered contracts list |
|
|
386
|
-
| `GET` | `/v1/contracts` | List contracts with inputs and outputs |
|
|
387
|
-
|
|
388
|
-
See [`docs/SERVER_V1.md`](docs/SERVER_V1.md) for the full API reference, deployment patterns, and security notes.
|
|
389
|
-
|
|
390
|
-
### 11. LLM Integration
|
|
391
|
-
|
|
392
|
-
Use language models as first-class compute nodes. Supported providers: Ollama (local, zero API cost),
|
|
393
|
-
Anthropic (Claude), OpenAI (and compatible APIs: Groq, Mistral, Azure OpenAI):
|
|
394
|
-
|
|
395
|
-
```ruby
|
|
396
|
-
require "igniter/integrations/llm"
|
|
397
|
-
|
|
398
|
-
Igniter::LLM.configure do |c|
|
|
399
|
-
c.default_provider = :anthropic
|
|
400
|
-
c.anthropic.api_key = ENV["ANTHROPIC_API_KEY"]
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
class ClassifyExecutor < Igniter::LLM::Executor
|
|
404
|
-
provider :anthropic
|
|
405
|
-
model "claude-haiku-4-5-20251001"
|
|
406
|
-
system_prompt "Classify feedback into: bug_report, feature_request, question."
|
|
407
|
-
|
|
408
|
-
def call(feedback:)
|
|
409
|
-
complete("Classify: #{feedback}")
|
|
410
|
-
end
|
|
411
|
-
end
|
|
412
|
-
|
|
413
|
-
class DraftResponseExecutor < Igniter::LLM::Executor
|
|
414
|
-
provider :anthropic
|
|
415
|
-
model "claude-haiku-4-5-20251001"
|
|
416
|
-
system_prompt "You are a customer success agent. Write one professional response sentence."
|
|
229
|
+
## Public Entry Points
|
|
417
230
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
compute :category, depends_on: :feedback, with: ClassifyExecutor
|
|
428
|
-
compute :response, depends_on: %i[feedback category], with: DraftResponseExecutor
|
|
429
|
-
|
|
430
|
-
output :category
|
|
431
|
-
output :response
|
|
432
|
-
end
|
|
433
|
-
end
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
Multi-step reasoning with conversation history:
|
|
231
|
+
| Need | Require |
|
|
232
|
+
|------|---------|
|
|
233
|
+
| Core contracts/runtime | `require "igniter"` |
|
|
234
|
+
| Contract/tool kernel | `require "igniter/core"` |
|
|
235
|
+
| Actor runtime and built-in agents | `require "igniter/agent"` or `require "igniter/agents"` |
|
|
236
|
+
| SDK registry | `require "igniter/sdk"` |
|
|
237
|
+
| App runtime/profile | `require "igniter/app"` |
|
|
238
|
+
| Cluster runtime | `require "igniter/cluster"` |
|
|
437
239
|
|
|
438
|
-
|
|
439
|
-
class MultiStepExecutor < Igniter::LLM::Executor
|
|
440
|
-
def call(text:, prior_analysis:)
|
|
441
|
-
ctx = Context.empty(system: self.class.system_prompt)
|
|
442
|
-
.append_user("Initial: #{text}")
|
|
443
|
-
.append_assistant(prior_analysis)
|
|
444
|
-
chat(context: ctx)
|
|
445
|
-
end
|
|
446
|
-
end
|
|
447
|
-
```
|
|
240
|
+
The fuller map lives in [`docs/guide/README.md`](./docs/guide/README.md).
|
|
448
241
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
## Examples
|
|
452
|
-
|
|
453
|
-
| Example | Run | Shows |
|
|
454
|
-
|---------|-----|-------|
|
|
455
|
-
| `basic_pricing.rb` | `ruby examples/basic_pricing.rb` | Basic contract, lazy resolution, input updates |
|
|
456
|
-
| `composition.rb` | `ruby examples/composition.rb` | Nested contracts and composed results |
|
|
457
|
-
| `diagnostics.rb` | `ruby examples/diagnostics.rb` | Diagnostics text and machine-readable output |
|
|
458
|
-
| `async_store.rb` | `ruby examples/async_store.rb` | Pending execution, file-backed store, worker-style resume |
|
|
459
|
-
| `marketing_ergonomics.rb` | `ruby examples/marketing_ergonomics.rb` | `const`, `lookup`, `map`, `guard`, `scope`, `namespace`, `expose`, `on_success`, `explain_plan` |
|
|
460
|
-
| `collection.rb` | `ruby examples/collection.rb` | Fan-out, stable item keys, `CollectionResult` |
|
|
461
|
-
| `collection_partial_failure.rb` | `ruby examples/collection_partial_failure.rb` | `:collect` mode, partial failure summary, collection diagnostics |
|
|
462
|
-
| `ringcentral_routing.rb` | `ruby examples/ringcentral_routing.rb` | `branch`, nested `collection`, `project`, `aggregate`, diagnostics |
|
|
463
|
-
| `order_pipeline.rb` | `ruby examples/order_pipeline.rb` | `guard` + `collection` + `branch` + `export` in one flow |
|
|
464
|
-
| `distributed_server.rb` | `ruby examples/distributed_server.rb` | `await`, `correlate_by`, `start`, `deliver_event`, `on_success` |
|
|
465
|
-
| `server/node1.rb` + `node2.rb` | run both, then curl | Two-node igniter-server with `remote:` DSL |
|
|
466
|
-
| `llm/research_agent.rb` | `ruby examples/llm/research_agent.rb` | Multi-step LLM pipeline with Ollama |
|
|
467
|
-
| `llm/tool_use.rb` | `ruby examples/llm/tool_use.rb` | LLM tool declarations, chained LLM nodes, `Context` |
|
|
468
|
-
|
|
469
|
-
## Design Docs
|
|
470
|
-
|
|
471
|
-
- [Architecture v2](docs/ARCHITECTURE_V2.md)
|
|
472
|
-
- [Execution Model v2](docs/EXECUTION_MODEL_V2.md)
|
|
473
|
-
- [API Draft v2](docs/API_V2.md)
|
|
474
|
-
- [Patterns](docs/PATTERNS.md)
|
|
475
|
-
- [Branches v1](docs/BRANCHES_V1.md)
|
|
476
|
-
- [Collections v1](docs/COLLECTIONS_V1.md)
|
|
477
|
-
- [Distributed Contracts v1](docs/DISTRIBUTED_CONTRACTS_V1.md)
|
|
478
|
-
- [Store Adapters](docs/STORE_ADAPTERS.md)
|
|
479
|
-
- [igniter-server v1](docs/SERVER_V1.md)
|
|
480
|
-
- [LLM Integration v1](docs/LLM_V1.md)
|
|
481
|
-
- [Concepts and Principles](docs/IGNITER_CONCEPTS.md)
|
|
482
|
-
|
|
483
|
-
## Development
|
|
242
|
+
## Repository Landmarks
|
|
484
243
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
244
|
+
- [`docs/`](./docs/README.md) — structured documentation portal
|
|
245
|
+
- [`docs/guide/`](./docs/guide/README.md) — user-facing docs
|
|
246
|
+
- [`docs/dev/`](./docs/dev/README.md) — contributor-facing docs
|
|
247
|
+
- [`examples/`](./examples/README.md) — public runnable examples
|
|
248
|
+
- [`examples/companion/`](./examples/companion/README.md) — canonical stack-style demo
|
|
249
|
+
- [`playgrounds/`](./playgrounds/README.md) — local-first experiments such as home-lab work
|
|
491
250
|
|
|
492
|
-
|
|
251
|
+
## Status
|
|
493
252
|
|
|
494
|
-
|
|
495
|
-
- pending / deferred node states with snapshot / restore
|
|
496
|
-
- store-backed resume flow (MemoryStore, FileStore)
|
|
497
|
-
- compile-time graph validation, typed inputs, cycle detection
|
|
498
|
-
- composition, branch, collection, guard, scope / namespace
|
|
499
|
-
- distributed workflows: `await`, `correlate_by`, `start`, `deliver_event`
|
|
500
|
-
- igniter-server: TCP server, Rack adapter, CLI, `remote:` DSL
|
|
501
|
-
- LLM compute nodes: Ollama, Anthropic, OpenAI providers
|
|
502
|
-
- Rails integration: Railtie, ActiveJob, ActionCable, webhook controller mixin
|
|
503
|
-
- auditing, diagnostics, reactive subscriptions, graph introspection
|
|
253
|
+
Igniter is intentionally being shaped as layered infrastructure:
|
|
504
254
|
|
|
505
|
-
|
|
255
|
+
- keep `core` small and strict
|
|
256
|
+
- let `app` and `cluster` grow above it
|
|
257
|
+
- move reusable optional capabilities into `sdk`
|
|
258
|
+
- keep user docs in `docs/guide/`
|
|
259
|
+
- keep internal architecture and planning docs in `docs/dev/`
|
|
260
|
+
- keep package-local quick reference next to each package README
|
|
506
261
|
|
|
507
|
-
|
|
262
|
+
For the full documentation map, start at [`docs/README.md`](./docs/README.md).
|