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/README.md
CHANGED
|
@@ -1,95 +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`
|
|
16
|
-
- `Igniter::Application` — application scaffold with YAML config, autoloading, scheduler, and `igniter-server new` generator
|
|
17
|
-
- capability-based security: declare executor resource requirements, enforce `Policy` at runtime
|
|
18
|
-
- temporal contracts: reproducible historical execution via an explicit `as_of` time input
|
|
19
|
-
- content-addressed computation: `pure` executors cached by input fingerprint across executions and processes
|
|
3
|
+
Igniter is a Ruby framework for building business logic as validated dependency graphs.
|
|
20
4
|
|
|
21
|
-
|
|
5
|
+
At the center is a small, strict idea:
|
|
22
6
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
7
|
+
- describe dependencies explicitly
|
|
8
|
+
- validate the graph before runtime
|
|
9
|
+
- resolve only what is needed
|
|
10
|
+
- keep the runtime observable
|
|
26
11
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
```ruby
|
|
30
|
-
require "igniter"
|
|
31
|
-
|
|
32
|
-
class PriceContract < Igniter::Contract
|
|
33
|
-
define do
|
|
34
|
-
input :order_total, type: :numeric
|
|
35
|
-
input :country, type: :string
|
|
36
|
-
input :vat_rate, type: :numeric, default: 0.2
|
|
37
|
-
|
|
38
|
-
compute :effective_vat_rate, depends_on: %i[country vat_rate] do |country:, vat_rate:|
|
|
39
|
-
country == "UA" ? vat_rate : 0.0
|
|
40
|
-
end
|
|
12
|
+
From there, Igniter scales by layers instead of by reinvention:
|
|
41
13
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
45
18
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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).
|
|
49
23
|
|
|
50
|
-
|
|
51
|
-
contract.result.gross_total # => 120.0
|
|
24
|
+
## Why Igniter
|
|
52
25
|
|
|
53
|
-
|
|
54
|
-
contract.result.gross_total # => 180.0
|
|
26
|
+
Igniter is useful when your domain logic wants more structure than “service objects everywhere” but less ceremony than a full workflow engine.
|
|
55
27
|
|
|
56
|
-
|
|
57
|
-
```
|
|
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.
|
|
58
29
|
|
|
59
|
-
##
|
|
60
|
-
|
|
61
|
-
- **Contracts**: declare inputs, compute nodes, outputs, and compositions in a validated graph.
|
|
62
|
-
- **Compiler**: validate dependency graphs, types, and cycles before runtime; errors are surfaced at load time.
|
|
63
|
-
- **Runtime**: cache resolved nodes and invalidate only affected downstream nodes on input change.
|
|
64
|
-
- **Typed inputs**: validate types, defaults, and required fields at execution boundaries.
|
|
65
|
-
- **Composition**: execute nested contracts with isolated child executions.
|
|
66
|
-
- **Branch**: declarative routing — select one child contract from ordered cases at runtime.
|
|
67
|
-
- **Collection**: declarative fan-out — run one child contract per item in an array.
|
|
68
|
-
- **Distributed workflows**: `await` external events; resume via `deliver_event`.
|
|
69
|
-
- **igniter-server**: host contracts as a TCP/Rack HTTP service; call remote contracts with the `remote:` DSL.
|
|
70
|
-
- **LLM integration**: compute nodes powered by Ollama, Anthropic, or OpenAI providers.
|
|
71
|
-
- **Rails integration**: Railtie, ActiveJob base class, ActionCable adapter, webhook controller mixin.
|
|
72
|
-
- **Auditing**: collect execution timelines and snapshots.
|
|
73
|
-
- **Diagnostics**: compact text, Markdown, or structured reports for triage.
|
|
74
|
-
- **Reactive**: subscribe declaratively to runtime events with `effect`, `on_success`, `on_failure`.
|
|
75
|
-
- **Introspection**: render graphs as text or Mermaid; inspect runtime state.
|
|
76
|
-
- **Capabilities**: executors declare what resources they need (`:network`, `:database`, …); `Policy` denies them at runtime.
|
|
77
|
-
- **Temporal contracts**: inject `as_of` time input automatically; replay any historical computation with the original timestamp.
|
|
78
|
-
- **Content addressing**: `pure` executors get a universal cache key — identical inputs return a cached result across executions, processes, and deployments.
|
|
79
|
-
- **Incremental dataflow**: `mode: :incremental` on collection nodes — only added/changed items run, unchanged items reuse cached results, removed items are retracted. O(change) not O(total).
|
|
80
|
-
|
|
81
|
-
## Quick Start Recipes
|
|
82
|
-
|
|
83
|
-
Runnable examples live in [`examples/`](examples) and are smoke-tested by `spec/igniter/example_scripts_spec.rb`.
|
|
84
|
-
See [`examples/README.md`](examples/README.md) for a quick index and [`docs/PATTERNS.md`](docs/PATTERNS.md) for composable patterns.
|
|
85
|
-
|
|
86
|
-
### 1. Basic Pricing Contract
|
|
30
|
+
## A Tiny Example
|
|
87
31
|
|
|
88
32
|
```ruby
|
|
33
|
+
require "igniter"
|
|
34
|
+
|
|
89
35
|
class PriceContract < Igniter::Contract
|
|
90
36
|
define do
|
|
91
37
|
input :order_total, type: :numeric
|
|
92
|
-
input :country,
|
|
38
|
+
input :country, type: :string
|
|
93
39
|
|
|
94
40
|
compute :vat_rate, depends_on: [:country] do |country:|
|
|
95
41
|
country == "UA" ? 0.2 : 0.0
|
|
@@ -103,622 +49,214 @@ class PriceContract < Igniter::Contract
|
|
|
103
49
|
end
|
|
104
50
|
end
|
|
105
51
|
|
|
106
|
-
PriceContract.new(order_total: 100, country: "UA").result.gross_total
|
|
107
|
-
# => 120.0
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### 2. Nested Composition
|
|
111
|
-
|
|
112
|
-
```ruby
|
|
113
|
-
class CheckoutContract < Igniter::Contract
|
|
114
|
-
define do
|
|
115
|
-
input :order_total, type: :numeric
|
|
116
|
-
input :country, type: :string
|
|
117
|
-
|
|
118
|
-
compose :pricing, contract: PriceContract, inputs: {
|
|
119
|
-
order_total: :order_total,
|
|
120
|
-
country: :country
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
output :pricing
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
CheckoutContract.new(order_total: 100, country: "UA").result.pricing.gross_total
|
|
128
|
-
# => 120.0
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### 3. Diagnostics and Introspection
|
|
132
|
-
|
|
133
|
-
```ruby
|
|
134
52
|
contract = PriceContract.new(order_total: 100, country: "UA")
|
|
135
53
|
contract.result.gross_total
|
|
136
|
-
|
|
137
|
-
contract.result.states
|
|
138
|
-
contract.result.explain(:gross_total)
|
|
139
|
-
contract.diagnostics.to_h
|
|
140
|
-
contract.diagnostics_text
|
|
141
|
-
contract.diagnostics_markdown
|
|
142
|
-
contract.audit_snapshot
|
|
143
|
-
|
|
144
|
-
PriceContract.graph.to_text
|
|
145
|
-
PriceContract.graph.to_mermaid
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### 4. Machine-Readable Data
|
|
149
|
-
|
|
150
|
-
```ruby
|
|
151
|
-
contract.result.to_h # => { gross_total: 120.0 }
|
|
152
|
-
contract.result.as_json
|
|
153
|
-
contract.execution.as_json
|
|
154
|
-
contract.events.map(&:as_json)
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### 5. Async Store and Resume
|
|
158
|
-
|
|
159
|
-
```ruby
|
|
160
|
-
class AsyncQuoteExecutor < Igniter::Executor
|
|
161
|
-
def call(order_total:)
|
|
162
|
-
defer(token: "quote-#{order_total}", payload: { kind: "pricing_quote" })
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
class AsyncPricingContract < Igniter::Contract
|
|
167
|
-
run_with runner: :store
|
|
168
|
-
|
|
169
|
-
define do
|
|
170
|
-
input :order_total, type: :numeric
|
|
171
|
-
compute :quote_total, depends_on: [:order_total], call: AsyncQuoteExecutor
|
|
172
|
-
compute :gross_total, depends_on: [:quote_total] do |quote_total:|
|
|
173
|
-
quote_total * 1.2
|
|
174
|
-
end
|
|
175
|
-
output :gross_total
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
contract = AsyncPricingContract.new(order_total: 100)
|
|
180
|
-
deferred = contract.result.gross_total
|
|
181
|
-
execution_id = contract.execution.events.execution_id
|
|
182
|
-
|
|
183
|
-
resumed = AsyncPricingContract.resume_from_store(
|
|
184
|
-
execution_id, token: deferred.token, value: 150
|
|
185
|
-
)
|
|
186
|
-
resumed.result.gross_total # => 180.0
|
|
54
|
+
# => 120.0
|
|
187
55
|
```
|
|
188
56
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
```ruby
|
|
192
|
-
class MarketingQuoteContract < Igniter::Contract
|
|
193
|
-
define do
|
|
194
|
-
input :service, type: :string
|
|
195
|
-
input :zip_code, type: :string
|
|
196
|
-
|
|
197
|
-
const :vendor_id, "eLocal"
|
|
57
|
+
## One Real Example
|
|
198
58
|
|
|
199
|
-
|
|
200
|
-
map :trade_name, from: :service do |service:|
|
|
201
|
-
%w[heating cooling ventilation].include?(service.downcase) ? "HVAC" : service
|
|
202
|
-
end
|
|
203
|
-
end
|
|
59
|
+
Imagine a post-call analysis pipeline for a call center.
|
|
204
60
|
|
|
205
|
-
|
|
206
|
-
lookup :trade, with: :trade_name do |trade_name:|
|
|
207
|
-
{ name: trade_name, base_bid: 45.0 }
|
|
208
|
-
end
|
|
209
|
-
end
|
|
61
|
+
The business task is simple to describe:
|
|
210
62
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
63
|
+
- take a recording
|
|
64
|
+
- transcribe it
|
|
65
|
+
- extract structured facts
|
|
66
|
+
- score the call
|
|
67
|
+
- prepare CRM updates and supervisor follow-up
|
|
214
68
|
|
|
215
|
-
|
|
216
|
-
zip_supported
|
|
217
|
-
{ vendor_id: vendor_id, trade: trade[:name], zip_code: zip_code, bid: trade[:base_bid] }
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
expose :quote, as: :response
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
on_success :response do |value:, **|
|
|
224
|
-
puts "Persist #{value.inspect}"
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
Matcher-style guard shortcuts:
|
|
69
|
+
In Igniter, that stays one explicit graph:
|
|
230
70
|
|
|
231
71
|
```ruby
|
|
232
|
-
|
|
233
|
-
guard :supported_country, with: :country_code, in: %w[USA CAN], message: "Unsupported country"
|
|
234
|
-
guard :valid_zip, with: :zip_code, matches: /\A\d{5}\z/, message: "Invalid zip"
|
|
235
|
-
```
|
|
72
|
+
require "igniter/cluster"
|
|
236
73
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
```ruby
|
|
240
|
-
class DeliveryContract < Igniter::Contract
|
|
74
|
+
class PostCallAnalysisContract < Igniter::Contract
|
|
241
75
|
define do
|
|
242
|
-
input :
|
|
243
|
-
input :
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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
|
+
}
|
|
252
101
|
end
|
|
253
102
|
|
|
254
|
-
|
|
103
|
+
output :analysis
|
|
104
|
+
output :crm_patch
|
|
255
105
|
end
|
|
256
106
|
end
|
|
257
107
|
```
|
|
258
108
|
|
|
259
|
-
|
|
109
|
+
Why this is interesting:
|
|
260
110
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
|
265
115
|
|
|
266
|
-
|
|
267
|
-
with: :technician_inputs,
|
|
268
|
-
each: TechnicianContract,
|
|
269
|
-
key: :technician_id,
|
|
270
|
-
mode: :collect
|
|
116
|
+
That is the general Igniter idea: keep the business graph stable, let the runtime grow from local execution to a capability-driven cluster.
|
|
271
117
|
|
|
272
|
-
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
```
|
|
118
|
+
## The Levels
|
|
276
119
|
|
|
277
|
-
|
|
120
|
+
### 1. Core
|
|
278
121
|
|
|
279
|
-
|
|
280
|
-
- `result.items_summary` — compact per-item status hash
|
|
281
|
-
- `result.failed_items` — failed-item error details
|
|
282
|
-
- `result.successes` — hash of succeeded items only
|
|
122
|
+
Start here if you want the kernel:
|
|
283
123
|
|
|
284
|
-
|
|
124
|
+
- contract DSL
|
|
125
|
+
- compiler and graph validation
|
|
126
|
+
- lazy runtime and invalidation
|
|
127
|
+
- diagnostics, events, introspection
|
|
285
128
|
|
|
286
|
-
|
|
129
|
+
Read:
|
|
287
130
|
|
|
288
|
-
|
|
289
|
-
which execution should receive the event, so events can be delivered from any process:
|
|
131
|
+
- [`docs/guide/core.md`](./docs/guide/core.md)
|
|
290
132
|
|
|
291
|
-
|
|
292
|
-
class LeadWorkflow < Igniter::Contract
|
|
293
|
-
correlate_by :request_id
|
|
133
|
+
### 2. App
|
|
294
134
|
|
|
295
|
-
|
|
296
|
-
input :request_id
|
|
135
|
+
Use this when you want Igniter to be the runtime shape of an application:
|
|
297
136
|
|
|
298
|
-
|
|
299
|
-
|
|
137
|
+
- app profile
|
|
138
|
+
- host/loader/scheduler seams
|
|
139
|
+
- stack-style project layout
|
|
140
|
+
- app diagnostics and evolution/governance layers
|
|
300
141
|
|
|
301
|
-
|
|
302
|
-
{ crm: crm_data, billing: billing_data }
|
|
303
|
-
end
|
|
142
|
+
Read:
|
|
304
143
|
|
|
305
|
-
|
|
306
|
-
end
|
|
144
|
+
- [`docs/guide/app.md`](./docs/guide/app.md)
|
|
307
145
|
|
|
308
|
-
|
|
309
|
-
puts "Report ready: #{value.inspect}"
|
|
310
|
-
end
|
|
311
|
-
end
|
|
146
|
+
### 3. Cluster
|
|
312
147
|
|
|
313
|
-
|
|
148
|
+
Use this when execution stops being single-node:
|
|
314
149
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
150
|
+
- mesh and gossip
|
|
151
|
+
- capability-based routing
|
|
152
|
+
- replication and distributed coordination
|
|
153
|
+
- resilience and decentralized runtime concerns
|
|
318
154
|
|
|
319
|
-
|
|
320
|
-
LeadWorkflow.deliver_event(:crm_received,
|
|
321
|
-
correlation: { request_id: "r1" },
|
|
322
|
-
payload: { company: "Acme Corp", tier: "enterprise" },
|
|
323
|
-
store: store)
|
|
155
|
+
Read:
|
|
324
156
|
|
|
325
|
-
|
|
326
|
-
correlation: { request_id: "r1" },
|
|
327
|
-
payload: { mrr: 500 },
|
|
328
|
-
store: store)
|
|
329
|
-
# => prints "Report ready: { crm: ..., billing: ... }"
|
|
330
|
-
```
|
|
157
|
+
- [`docs/guide/cluster.md`](./docs/guide/cluster.md)
|
|
331
158
|
|
|
332
|
-
|
|
159
|
+
### 4. SDK
|
|
333
160
|
|
|
334
|
-
|
|
161
|
+
Use SDK packs when the kernel needs optional capabilities:
|
|
335
162
|
|
|
336
|
-
|
|
163
|
+
- AI
|
|
164
|
+
- channels
|
|
165
|
+
- tools
|
|
166
|
+
- skills
|
|
167
|
+
- data and app-facing capability packs
|
|
337
168
|
|
|
338
|
-
|
|
339
|
-
# --- Service node on port 4568 ---
|
|
340
|
-
require "igniter/server"
|
|
169
|
+
Read:
|
|
341
170
|
|
|
342
|
-
|
|
343
|
-
define do
|
|
344
|
-
input :value
|
|
345
|
-
compute :score, depends_on: :value, call: ->(value:) { value * 1.5 }
|
|
346
|
-
output :score
|
|
347
|
-
end
|
|
348
|
-
end
|
|
171
|
+
- [`docs/guide/sdk.md`](./docs/guide/sdk.md)
|
|
349
172
|
|
|
350
|
-
|
|
351
|
-
Igniter::Server.start
|
|
173
|
+
## Suggested Reading Paths
|
|
352
174
|
|
|
353
|
-
|
|
354
|
-
require "igniter/server"
|
|
175
|
+
If you are new to Igniter:
|
|
355
176
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
remote :scored,
|
|
360
|
-
contract: "ScoringContract",
|
|
361
|
-
node: "http://localhost:4568",
|
|
362
|
-
inputs: { value: :data }
|
|
363
|
-
output :scored
|
|
364
|
-
end
|
|
365
|
-
end
|
|
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)
|
|
366
180
|
|
|
367
|
-
|
|
368
|
-
Igniter::Server.start
|
|
369
|
-
```
|
|
181
|
+
If you want to work on Igniter itself:
|
|
370
182
|
|
|
371
|
-
|
|
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
|
|
372
186
|
|
|
373
|
-
|
|
374
|
-
# Generate a new application scaffold
|
|
375
|
-
igniter-server new my_app
|
|
187
|
+
If you want the standard app shape:
|
|
376
188
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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)
|
|
380
193
|
|
|
381
|
-
|
|
194
|
+
If you want distributed ideas:
|
|
382
195
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
Igniter::Server.configure { |c| c.register "ScoringContract", ScoringContract }
|
|
387
|
-
run Igniter::Server.rack_app
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
**REST API:**
|
|
391
|
-
|
|
392
|
-
| Method | Path | Description |
|
|
393
|
-
|--------|------|-------------|
|
|
394
|
-
| `POST` | `/v1/contracts/:name/execute` | Execute a contract synchronously |
|
|
395
|
-
| `POST` | `/v1/contracts/:name/events` | Deliver an event to a distributed contract |
|
|
396
|
-
| `GET` | `/v1/executions/:id` | Poll execution status |
|
|
397
|
-
| `GET` | `/v1/health` | Health check with registered contracts list |
|
|
398
|
-
| `GET` | `/v1/contracts` | List contracts with inputs and outputs |
|
|
399
|
-
|
|
400
|
-
See [`docs/SERVER_V1.md`](docs/SERVER_V1.md) for the full API reference, deployment patterns, and security notes.
|
|
401
|
-
|
|
402
|
-
### 11. LLM Integration
|
|
403
|
-
|
|
404
|
-
Use language models as first-class compute nodes. Supported providers: Ollama (local, zero API cost),
|
|
405
|
-
Anthropic (Claude), OpenAI (and compatible APIs: Groq, Mistral, Azure OpenAI):
|
|
406
|
-
|
|
407
|
-
```ruby
|
|
408
|
-
require "igniter/integrations/llm"
|
|
409
|
-
|
|
410
|
-
Igniter::LLM.configure do |c|
|
|
411
|
-
c.default_provider = :anthropic
|
|
412
|
-
c.anthropic.api_key = ENV["ANTHROPIC_API_KEY"]
|
|
413
|
-
end
|
|
414
|
-
|
|
415
|
-
class ClassifyExecutor < Igniter::LLM::Executor
|
|
416
|
-
provider :anthropic
|
|
417
|
-
model "claude-haiku-4-5-20251001"
|
|
418
|
-
system_prompt "Classify feedback into: bug_report, feature_request, question."
|
|
419
|
-
|
|
420
|
-
def call(feedback:)
|
|
421
|
-
complete("Classify: #{feedback}")
|
|
422
|
-
end
|
|
423
|
-
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)
|
|
424
199
|
|
|
425
|
-
|
|
426
|
-
provider :anthropic
|
|
427
|
-
model "claude-haiku-4-5-20251001"
|
|
428
|
-
system_prompt "You are a customer success agent. Write one professional response sentence."
|
|
200
|
+
If you are iterating on ideas locally:
|
|
429
201
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
end
|
|
433
|
-
end
|
|
202
|
+
- keep public learning material in [`examples/`](./examples/README.md)
|
|
203
|
+
- keep local-first experiments in [`playgrounds/`](./playgrounds/README.md)
|
|
434
204
|
|
|
435
|
-
|
|
436
|
-
define do
|
|
437
|
-
input :feedback
|
|
205
|
+
## Documentation Layout
|
|
438
206
|
|
|
439
|
-
|
|
440
|
-
|
|
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
|
|
441
213
|
|
|
442
|
-
|
|
443
|
-
output :response
|
|
444
|
-
end
|
|
445
|
-
end
|
|
446
|
-
```
|
|
447
|
-
|
|
448
|
-
Multi-step reasoning with conversation history:
|
|
449
|
-
|
|
450
|
-
```ruby
|
|
451
|
-
class MultiStepExecutor < Igniter::LLM::Executor
|
|
452
|
-
def call(text:, prior_analysis:)
|
|
453
|
-
ctx = Context.empty(system: self.class.system_prompt)
|
|
454
|
-
.append_user("Initial: #{text}")
|
|
455
|
-
.append_assistant(prior_analysis)
|
|
456
|
-
chat(context: ctx)
|
|
457
|
-
end
|
|
458
|
-
end
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
See [`examples/llm/research_agent.rb`](examples/llm/research_agent.rb), [`examples/llm/tool_use.rb`](examples/llm/tool_use.rb), and [`docs/LLM_V1.md`](docs/LLM_V1.md).
|
|
462
|
-
|
|
463
|
-
### 12. Igniter::Application
|
|
464
|
-
|
|
465
|
-
Package contracts, executors, scheduler, and server config into a single coherent entry point:
|
|
214
|
+
If you want to scaffold a new stack quickly:
|
|
466
215
|
|
|
467
216
|
```bash
|
|
468
|
-
|
|
469
|
-
igniter-
|
|
470
|
-
|
|
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
|
|
471
221
|
```
|
|
472
222
|
|
|
473
|
-
|
|
474
|
-
require "igniter/application"
|
|
475
|
-
|
|
476
|
-
class MyApp < Igniter::Application
|
|
477
|
-
config_file "application.yml" # optional YAML base config
|
|
478
|
-
|
|
479
|
-
configure do |c|
|
|
480
|
-
c.port = ENV.fetch("PORT", 4567).to_i
|
|
481
|
-
c.store = Igniter::Runtime::Stores::MemoryStore.new
|
|
482
|
-
end
|
|
483
|
-
|
|
484
|
-
executors_path "executors/" # eager-require all executors
|
|
485
|
-
contracts_path "contracts/" # eager-require all contracts
|
|
486
|
-
|
|
487
|
-
register "OrderContract", OrderContract
|
|
488
|
-
|
|
489
|
-
schedule :cleanup, every: "1h" do
|
|
490
|
-
puts "[cleanup] #{Time.now.strftime("%H:%M")}"
|
|
491
|
-
end
|
|
492
|
-
|
|
493
|
-
schedule :report, every: "1d", at: "09:00" do
|
|
494
|
-
DailyReportContract.new.resolve_all(date: Date.today)
|
|
495
|
-
end
|
|
496
|
-
end
|
|
497
|
-
|
|
498
|
-
MyApp.start # blocking built-in HTTP server
|
|
499
|
-
# or
|
|
500
|
-
MyApp.rack_app # Rack app for Puma / Unicorn
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
**`application.yml`** — base config loaded before the `configure` block (block always wins):
|
|
504
|
-
|
|
505
|
-
```yaml
|
|
506
|
-
server:
|
|
507
|
-
port: 4567
|
|
508
|
-
host: "0.0.0.0"
|
|
509
|
-
log_format: json # text (default) or json
|
|
510
|
-
drain_timeout: 30
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
**Scheduler interval formats:** `30` (seconds), `"30s"`, `"5m"`, `"2h"`, `"1d"`, `{ hours: 1, minutes: 30 }`
|
|
514
|
-
|
|
515
|
-
See [`docs/APPLICATION_V1.md`](docs/APPLICATION_V1.md) for the full reference and companion app example.
|
|
516
|
-
|
|
517
|
-
### 13. Capability-Based Security
|
|
518
|
-
|
|
519
|
-
Declare what external resources an executor needs, then deny specific capabilities at the
|
|
520
|
-
policy level — without touching the executors themselves:
|
|
521
|
-
|
|
522
|
-
```ruby
|
|
523
|
-
require "igniter/capabilities"
|
|
524
|
-
|
|
525
|
-
class DbLookup < Igniter::Executor
|
|
526
|
-
capabilities :database
|
|
527
|
-
|
|
528
|
-
def call(id:)
|
|
529
|
-
DB.find(id)
|
|
530
|
-
end
|
|
531
|
-
end
|
|
532
|
-
|
|
533
|
-
class PureCalc < Igniter::Executor
|
|
534
|
-
pure # shorthand for capabilities(:pure)
|
|
535
|
-
|
|
536
|
-
def call(x:, y:) = x + y
|
|
537
|
-
end
|
|
538
|
-
|
|
539
|
-
# Inspect the graph's surface area before deploying
|
|
540
|
-
MyContract.compiled_graph.required_capabilities
|
|
541
|
-
# => { fetch: [:database], total: [:pure] }
|
|
542
|
-
|
|
543
|
-
# Enforce policy at boot time
|
|
544
|
-
Igniter::Capabilities.policy = Igniter::Capabilities::Policy.new(denied: [:database])
|
|
545
|
-
|
|
546
|
-
MyContract.new(id: 1).resolve_all
|
|
547
|
-
# => CapabilityViolationError: Node 'fetch' uses denied capabilities: database
|
|
548
|
-
```
|
|
549
|
-
|
|
550
|
-
See [`docs/CAPABILITIES_V1.md`](docs/CAPABILITIES_V1.md).
|
|
551
|
-
|
|
552
|
-
### 14. Temporal Contracts
|
|
553
|
-
|
|
554
|
-
Make time an explicit input so every execution is fully reproducible:
|
|
555
|
-
|
|
556
|
-
```ruby
|
|
557
|
-
require "igniter/temporal"
|
|
558
|
-
|
|
559
|
-
class TaxRateContract < Igniter::Contract
|
|
560
|
-
include Igniter::Temporal
|
|
561
|
-
|
|
562
|
-
define do
|
|
563
|
-
input :country
|
|
564
|
-
# `as_of` is injected automatically (default: Time.now)
|
|
565
|
-
|
|
566
|
-
temporal_compute :rate, depends_on: :country do |country:, as_of:|
|
|
567
|
-
HISTORICAL_RATES.dig(country, as_of.year) || 0.0
|
|
568
|
-
end
|
|
569
|
-
|
|
570
|
-
output :rate
|
|
571
|
-
end
|
|
572
|
-
end
|
|
573
|
-
|
|
574
|
-
# Current rate
|
|
575
|
-
TaxRateContract.new(country: "UA").result.rate
|
|
576
|
-
# => 0.22
|
|
577
|
-
|
|
578
|
-
# Reproduce the exact 2024 result
|
|
579
|
-
TaxRateContract.new(country: "UA", as_of: Time.new(2024, 1, 1)).result.rate
|
|
580
|
-
# => 0.20
|
|
581
|
-
```
|
|
582
|
-
|
|
583
|
-
See [`docs/TEMPORAL_V1.md`](docs/TEMPORAL_V1.md).
|
|
584
|
-
|
|
585
|
-
### 15. Content-Addressed Computation
|
|
586
|
-
|
|
587
|
-
`pure` executors are cached by a fingerprint of their logic + inputs. Identical computation
|
|
588
|
-
is never repeated — within an execution, across executions, or across processes:
|
|
223
|
+
## Installation
|
|
589
224
|
|
|
590
225
|
```ruby
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
class TaxCalculator < Igniter::Executor
|
|
594
|
-
pure
|
|
595
|
-
fingerprint "tax_calc_v1" # bump to invalidate the cache when logic changes
|
|
596
|
-
|
|
597
|
-
def call(country:, amount:)
|
|
598
|
-
TAX_RATES[country] * amount
|
|
599
|
-
end
|
|
600
|
-
end
|
|
601
|
-
|
|
602
|
-
# First execution — computes and caches
|
|
603
|
-
InvoiceContract.new(country: "UA", amount: 1000).result.tax # computed
|
|
604
|
-
|
|
605
|
-
# Second execution — served from cache; TaxCalculator is never called
|
|
606
|
-
InvoiceContract.new(country: "UA", amount: 1000).result.tax # cache hit
|
|
607
|
-
|
|
608
|
-
# Distributed cache (Redis) — shared across all nodes
|
|
609
|
-
Igniter::ContentAddressing.cache = RedisContentCache.new(Redis.new)
|
|
226
|
+
gem "igniter"
|
|
610
227
|
```
|
|
611
228
|
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
### 16. Incremental Dataflow — O(change) Collection Processing
|
|
615
|
-
|
|
616
|
-
`mode: :incremental` on a collection node makes the runtime diff the input array on
|
|
617
|
-
every `resolve_all`. Only added/changed items have their child contract re-run;
|
|
618
|
-
unchanged items reuse the cached result; removed items are retracted automatically.
|
|
619
|
-
|
|
620
|
-
```ruby
|
|
621
|
-
require "igniter/extensions/dataflow"
|
|
622
|
-
|
|
623
|
-
class SensorPipeline < Igniter::Contract
|
|
624
|
-
define do
|
|
625
|
-
input :readings, type: :array
|
|
229
|
+
## Public Entry Points
|
|
626
230
|
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
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"` |
|
|
633
239
|
|
|
634
|
-
|
|
635
|
-
end
|
|
636
|
-
end
|
|
240
|
+
The fuller map lives in [`docs/guide/README.md`](./docs/guide/README.md).
|
|
637
241
|
|
|
638
|
-
|
|
639
|
-
pipeline.resolve_all # all N items run once
|
|
242
|
+
## Repository Landmarks
|
|
640
243
|
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
)
|
|
647
|
-
pipeline.resolve_all # only 2 child contracts run (new-1 + tmp-2)
|
|
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
|
|
648
250
|
|
|
649
|
-
|
|
650
|
-
diff.processed_count # => 2
|
|
651
|
-
diff.unchanged.size # => N - 2
|
|
652
|
-
```
|
|
251
|
+
## Status
|
|
653
252
|
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
## Examples
|
|
657
|
-
|
|
658
|
-
| Example | Run | Shows |
|
|
659
|
-
|---------|-----|-------|
|
|
660
|
-
| `basic_pricing.rb` | `ruby examples/basic_pricing.rb` | Basic contract, lazy resolution, input updates |
|
|
661
|
-
| `composition.rb` | `ruby examples/composition.rb` | Nested contracts and composed results |
|
|
662
|
-
| `diagnostics.rb` | `ruby examples/diagnostics.rb` | Diagnostics text and machine-readable output |
|
|
663
|
-
| `async_store.rb` | `ruby examples/async_store.rb` | Pending execution, file-backed store, worker-style resume |
|
|
664
|
-
| `marketing_ergonomics.rb` | `ruby examples/marketing_ergonomics.rb` | `const`, `lookup`, `map`, `guard`, `scope`, `namespace`, `expose`, `on_success`, `explain_plan` |
|
|
665
|
-
| `collection.rb` | `ruby examples/collection.rb` | Fan-out, stable item keys, `CollectionResult` |
|
|
666
|
-
| `collection_partial_failure.rb` | `ruby examples/collection_partial_failure.rb` | `:collect` mode, partial failure summary, collection diagnostics |
|
|
667
|
-
| `ringcentral_routing.rb` | `ruby examples/ringcentral_routing.rb` | `branch`, nested `collection`, `project`, `aggregate`, diagnostics |
|
|
668
|
-
| `order_pipeline.rb` | `ruby examples/order_pipeline.rb` | `guard` + `collection` + `branch` + `export` in one flow |
|
|
669
|
-
| `distributed_server.rb` | `ruby examples/distributed_server.rb` | `await`, `correlate_by`, `start`, `deliver_event`, `on_success` |
|
|
670
|
-
| `server/node1.rb` + `node2.rb` | run both, then curl | Two-node igniter-server with `remote:` DSL |
|
|
671
|
-
| `llm/research_agent.rb` | `ruby examples/llm/research_agent.rb` | Multi-step LLM pipeline with Ollama |
|
|
672
|
-
| `llm/tool_use.rb` | `ruby examples/llm/tool_use.rb` | LLM tool declarations, chained LLM nodes, `Context` |
|
|
673
|
-
| `companion/demo.rb` | `ruby examples/companion/demo.rb` | End-to-end voice AI pipeline using `Igniter::Application` |
|
|
674
|
-
| `dataflow.rb` | `ruby examples/dataflow.rb` | Incremental sensor pipeline: `mode: :incremental`, `feed_diff`, sliding window |
|
|
675
|
-
|
|
676
|
-
## Design Docs
|
|
677
|
-
|
|
678
|
-
- [Architecture v2](docs/ARCHITECTURE_V2.md)
|
|
679
|
-
- [Execution Model v2](docs/EXECUTION_MODEL_V2.md)
|
|
680
|
-
- [API Draft v2](docs/API_V2.md)
|
|
681
|
-
- [Patterns](docs/PATTERNS.md)
|
|
682
|
-
- [Branches v1](docs/BRANCHES_V1.md)
|
|
683
|
-
- [Collections v1](docs/COLLECTIONS_V1.md)
|
|
684
|
-
- [Distributed Contracts v1](docs/DISTRIBUTED_CONTRACTS_V1.md)
|
|
685
|
-
- [Store Adapters](docs/STORE_ADAPTERS.md)
|
|
686
|
-
- [igniter-server v1](docs/SERVER_V1.md)
|
|
687
|
-
- [LLM Integration v1](docs/LLM_V1.md)
|
|
688
|
-
- [Application scaffold v1](docs/APPLICATION_V1.md)
|
|
689
|
-
- [Capabilities v1](docs/CAPABILITIES_V1.md)
|
|
690
|
-
- [Temporal Contracts v1](docs/TEMPORAL_V1.md)
|
|
691
|
-
- [Content Addressing v1](docs/CONTENT_ADDRESSING_V1.md)
|
|
692
|
-
- [Incremental Dataflow v1](docs/DATAFLOW_V1.md)
|
|
693
|
-
- [Concepts and Principles](docs/IGNITER_CONCEPTS.md)
|
|
694
|
-
|
|
695
|
-
## Development
|
|
253
|
+
Igniter is intentionally being shaped as layered infrastructure:
|
|
696
254
|
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
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
|
|
703
261
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
- synchronous runtime + parallel thread-pool runner
|
|
707
|
-
- pending / deferred node states with snapshot / restore
|
|
708
|
-
- store-backed resume flow (MemoryStore, FileStore)
|
|
709
|
-
- compile-time graph validation, typed inputs, cycle detection
|
|
710
|
-
- composition, branch, collection, guard, scope / namespace
|
|
711
|
-
- distributed workflows: `await`, `correlate_by`, `start`, `deliver_event`
|
|
712
|
-
- igniter-server: TCP server, Rack adapter, CLI, `remote:` DSL
|
|
713
|
-
- LLM compute nodes: Ollama, Anthropic, OpenAI providers
|
|
714
|
-
- Rails integration: Railtie, ActiveJob, ActionCable, webhook controller mixin
|
|
715
|
-
- `Igniter::Application`: YAML config, autoloading, scheduler, generator (`igniter-server new`)
|
|
716
|
-
- auditing, diagnostics, reactive subscriptions, graph introspection
|
|
717
|
-
- capability-based security: `capabilities`, `pure`, `Policy`, `CapabilityViolationError`
|
|
718
|
-
- temporal contracts: `include Igniter::Temporal`, `temporal_compute`, `as_of` input, historical reproduction
|
|
719
|
-
- content-addressed computation: `pure`, `fingerprint`, universal `ContentKey`, pluggable `ContentCache`
|
|
720
|
-
- incremental dataflow: `mode: :incremental`, `window:`, `feed_diff`, `collection_diff`, `DiffState`, `IncrementalCollectionResult`
|
|
721
|
-
|
|
722
|
-
## License
|
|
723
|
-
|
|
724
|
-
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
262
|
+
For the full documentation map, start at [`docs/README.md`](./docs/README.md).
|