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/docs/PATTERNS.md
DELETED
|
@@ -1,411 +0,0 @@
|
|
|
1
|
-
# Igniter Patterns
|
|
2
|
-
|
|
3
|
-
This document collects recommended orchestration shapes that already have runnable examples in the repository.
|
|
4
|
-
|
|
5
|
-
The goal is not to introduce new primitives, but to show how the existing DSL composes into readable contracts.
|
|
6
|
-
|
|
7
|
-
## 1. Linear Derivation
|
|
8
|
-
|
|
9
|
-
Use this when the flow is a straight dependency chain with no routing or fan-out.
|
|
10
|
-
|
|
11
|
-
Example:
|
|
12
|
-
|
|
13
|
-
- [basic_pricing.rb](/Users/alex/dev/hotfix/igniter/examples/basic_pricing.rb)
|
|
14
|
-
|
|
15
|
-
Use:
|
|
16
|
-
|
|
17
|
-
- pricing
|
|
18
|
-
- totals
|
|
19
|
-
- normalization pipelines
|
|
20
|
-
- simple business formulas
|
|
21
|
-
|
|
22
|
-
Shape:
|
|
23
|
-
|
|
24
|
-
```ruby
|
|
25
|
-
input :order_total
|
|
26
|
-
input :country
|
|
27
|
-
|
|
28
|
-
compute :vat_rate, with: :country do |country:|
|
|
29
|
-
country == "UA" ? 0.2 : 0.0
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
compute :gross_total, with: %i[order_total vat_rate] do |order_total:, vat_rate:|
|
|
33
|
-
order_total * (1 + vat_rate)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
output :gross_total
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## 2. Stage Composition
|
|
40
|
-
|
|
41
|
-
Use this when one contract should orchestrate several bounded subgraphs.
|
|
42
|
-
|
|
43
|
-
Examples:
|
|
44
|
-
|
|
45
|
-
- [composition.rb](/Users/alex/dev/hotfix/igniter/examples/composition.rb)
|
|
46
|
-
- [ringcentral_routing.rb](/Users/alex/dev/hotfix/igniter/examples/ringcentral_routing.rb)
|
|
47
|
-
|
|
48
|
-
Use:
|
|
49
|
-
|
|
50
|
-
- reusable business stages
|
|
51
|
-
- transport shell + domain pipeline
|
|
52
|
-
- larger flows with clear internal boundaries
|
|
53
|
-
|
|
54
|
-
Guideline:
|
|
55
|
-
|
|
56
|
-
- keep the parent contract thin
|
|
57
|
-
- export child outputs explicitly
|
|
58
|
-
- read child diagnostics from the child execution, not from the parent by default
|
|
59
|
-
|
|
60
|
-
## 3. Scoped Domain Flow
|
|
61
|
-
|
|
62
|
-
Use this when the graph is still one contract, but a flat node list becomes hard to read.
|
|
63
|
-
|
|
64
|
-
Example:
|
|
65
|
-
|
|
66
|
-
- [marketing_ergonomics.rb](/Users/alex/dev/hotfix/igniter/examples/marketing_ergonomics.rb)
|
|
67
|
-
|
|
68
|
-
Use:
|
|
69
|
-
|
|
70
|
-
- routing
|
|
71
|
-
- validation
|
|
72
|
-
- pricing
|
|
73
|
-
- response shaping
|
|
74
|
-
|
|
75
|
-
Shape:
|
|
76
|
-
|
|
77
|
-
```ruby
|
|
78
|
-
scope :routing do
|
|
79
|
-
map :trade_name, from: :service do |service:|
|
|
80
|
-
...
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
namespace :validation do
|
|
85
|
-
guard :zip_supported, with: :zip_code, in: %w[60601 10001], message: "Unsupported zip"
|
|
86
|
-
end
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Guideline:
|
|
90
|
-
|
|
91
|
-
- use `scope` and `namespace` for readability first
|
|
92
|
-
- do not treat them as runtime boundaries
|
|
93
|
-
|
|
94
|
-
## 4. Declarative Routing
|
|
95
|
-
|
|
96
|
-
Use this when control flow depends on a selector value and should stay visible in the graph.
|
|
97
|
-
|
|
98
|
-
Examples:
|
|
99
|
-
|
|
100
|
-
- [ringcentral_routing.rb](/Users/alex/dev/hotfix/igniter/examples/ringcentral_routing.rb)
|
|
101
|
-
|
|
102
|
-
Use:
|
|
103
|
-
|
|
104
|
-
- vendor routing
|
|
105
|
-
- status routing
|
|
106
|
-
- country-specific flows
|
|
107
|
-
- mode-specific processing
|
|
108
|
-
|
|
109
|
-
Shape:
|
|
110
|
-
|
|
111
|
-
```ruby
|
|
112
|
-
branch :status_route, with: :telephony_status, inputs: {
|
|
113
|
-
extension_id: :extension_id,
|
|
114
|
-
telephony_status: :telephony_status,
|
|
115
|
-
active_calls: :active_calls
|
|
116
|
-
} do
|
|
117
|
-
on "CallConnected", contract: CallConnectedContract
|
|
118
|
-
on "NoCall", contract: NoCallContract
|
|
119
|
-
default contract: UnknownStatusContract
|
|
120
|
-
end
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Guideline:
|
|
124
|
-
|
|
125
|
-
- keep branch contracts on a shared input interface
|
|
126
|
-
- let compile-time validation force interface consistency
|
|
127
|
-
- use explicit `export` from the branch node
|
|
128
|
-
|
|
129
|
-
## 5. Fan-Out With Stable Identity
|
|
130
|
-
|
|
131
|
-
Use this when a node should run the same child contract for many item inputs.
|
|
132
|
-
|
|
133
|
-
Examples:
|
|
134
|
-
|
|
135
|
-
- [collection.rb](/Users/alex/dev/hotfix/igniter/examples/collection.rb)
|
|
136
|
-
- [collection_partial_failure.rb](/Users/alex/dev/hotfix/igniter/examples/collection_partial_failure.rb)
|
|
137
|
-
- [ringcentral_routing.rb](/Users/alex/dev/hotfix/igniter/examples/ringcentral_routing.rb)
|
|
138
|
-
|
|
139
|
-
Use:
|
|
140
|
-
|
|
141
|
-
- technicians
|
|
142
|
-
- calls
|
|
143
|
-
- locations
|
|
144
|
-
- vendors
|
|
145
|
-
- external records
|
|
146
|
-
|
|
147
|
-
Shape:
|
|
148
|
-
|
|
149
|
-
```ruby
|
|
150
|
-
collection :technicians,
|
|
151
|
-
with: :technician_inputs,
|
|
152
|
-
each: TechnicianContract,
|
|
153
|
-
key: :technician_id,
|
|
154
|
-
mode: :collect
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
Guideline:
|
|
158
|
-
|
|
159
|
-
- feed `collection` an array of item input hashes
|
|
160
|
-
- choose a stable `key:`
|
|
161
|
-
- keep item logic in the child contract, not in a giant parent `compute`
|
|
162
|
-
|
|
163
|
-
## 6. Partial Failure Without Failing The Whole Execution
|
|
164
|
-
|
|
165
|
-
Use `mode: :collect` when you want item-level failures surfaced, but not promoted to parent execution failure.
|
|
166
|
-
|
|
167
|
-
Example:
|
|
168
|
-
|
|
169
|
-
- [collection_partial_failure.rb](/Users/alex/dev/hotfix/igniter/examples/collection_partial_failure.rb)
|
|
170
|
-
|
|
171
|
-
What to read:
|
|
172
|
-
|
|
173
|
-
- `result.summary`
|
|
174
|
-
- `result.items_summary`
|
|
175
|
-
- `result.failed_items`
|
|
176
|
-
- `contract.diagnostics_text`
|
|
177
|
-
- `contract.diagnostics_markdown`
|
|
178
|
-
|
|
179
|
-
Guideline:
|
|
180
|
-
|
|
181
|
-
- parent execution can still be `succeeded`
|
|
182
|
-
- collection summary may be `:partial_failure`
|
|
183
|
-
- diagnostics should be read at collection level, not only at execution status level
|
|
184
|
-
|
|
185
|
-
## 7. Nested Branch + Collection
|
|
186
|
-
|
|
187
|
-
Use this when routing chooses a stage, and that stage performs fan-out or per-item routing.
|
|
188
|
-
|
|
189
|
-
Example:
|
|
190
|
-
|
|
191
|
-
- [ringcentral_routing.rb](/Users/alex/dev/hotfix/igniter/examples/ringcentral_routing.rb)
|
|
192
|
-
|
|
193
|
-
Observed semantics:
|
|
194
|
-
|
|
195
|
-
- parent execution records top-level `branch_selected`
|
|
196
|
-
- collection item events belong to the selected child execution
|
|
197
|
-
- child diagnostics is usually the best place to inspect collection status
|
|
198
|
-
|
|
199
|
-
Guideline:
|
|
200
|
-
|
|
201
|
-
- inspect parent audit for high-level routing
|
|
202
|
-
- inspect child audit for item-level fan-out behavior
|
|
203
|
-
|
|
204
|
-
## 8. Async Resume Flow
|
|
205
|
-
|
|
206
|
-
Use this when a node cannot complete immediately and should suspend the execution.
|
|
207
|
-
|
|
208
|
-
Example:
|
|
209
|
-
|
|
210
|
-
- [async_store.rb](/Users/alex/dev/hotfix/igniter/examples/async_store.rb)
|
|
211
|
-
|
|
212
|
-
Use:
|
|
213
|
-
|
|
214
|
-
- external jobs
|
|
215
|
-
- long-running enrichment
|
|
216
|
-
- async pricing or classification
|
|
217
|
-
|
|
218
|
-
Guideline:
|
|
219
|
-
|
|
220
|
-
- model the slow step as a deferred node
|
|
221
|
-
- resume with store-backed execution restore
|
|
222
|
-
- keep downstream graph pure and resumable
|
|
223
|
-
|
|
224
|
-
## 9. Distributed Event-Driven Contract
|
|
225
|
-
|
|
226
|
-
Use this when execution spans multiple external triggers (webhooks, background jobs, async callbacks) that arrive at different times.
|
|
227
|
-
|
|
228
|
-
Examples:
|
|
229
|
-
|
|
230
|
-
- [distributed_server.rb](../examples/distributed_server.rb)
|
|
231
|
-
|
|
232
|
-
Use:
|
|
233
|
-
|
|
234
|
-
- multi-step approval workflows
|
|
235
|
-
- job application pipelines
|
|
236
|
-
- order fulfilment with external vendor callbacks
|
|
237
|
-
- KYC / onboarding flows requiring background checks
|
|
238
|
-
|
|
239
|
-
Key DSL:
|
|
240
|
-
|
|
241
|
-
```ruby
|
|
242
|
-
class ApplicationReviewWorkflow < Igniter::Contract
|
|
243
|
-
correlate_by :application_id # uniquely identifies an in-flight execution
|
|
244
|
-
|
|
245
|
-
define do
|
|
246
|
-
input :application_id
|
|
247
|
-
input :applicant_name
|
|
248
|
-
|
|
249
|
-
# Execution suspends here until the named event is delivered
|
|
250
|
-
await :screening_result, event: :screening_completed
|
|
251
|
-
await :manager_review, event: :manager_reviewed
|
|
252
|
-
|
|
253
|
-
compute :decision, depends_on: %i[screening_result manager_review] do |screening_result:, manager_review:|
|
|
254
|
-
manager_review[:approved] && screening_result[:passed] ? :hired : :rejected
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
output :decision
|
|
258
|
-
end
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
store = Igniter::Runtime::Stores::MemoryStore.new
|
|
262
|
-
|
|
263
|
-
# Launch — suspends at the first await
|
|
264
|
-
exec = ApplicationReviewWorkflow.start({ application_id: "app-1", applicant_name: "Alice" }, store: store)
|
|
265
|
-
|
|
266
|
-
# Deliver events as they arrive (order does not matter)
|
|
267
|
-
ApplicationReviewWorkflow.deliver_event(:screening_completed,
|
|
268
|
-
correlation: { application_id: "app-1" },
|
|
269
|
-
payload: { passed: true, score: 92 },
|
|
270
|
-
store: store)
|
|
271
|
-
|
|
272
|
-
final = ApplicationReviewWorkflow.deliver_event(:manager_reviewed,
|
|
273
|
-
correlation: { application_id: "app-1" },
|
|
274
|
-
payload: { approved: true, note: "Strong candidate" },
|
|
275
|
-
store: store)
|
|
276
|
-
|
|
277
|
-
final.result.decision # => :hired
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
Guideline:
|
|
281
|
-
|
|
282
|
-
- choose correlation keys that uniquely identify the in-flight instance
|
|
283
|
-
- deliver events from any process; the store is the coordination layer
|
|
284
|
-
- keep `await` payloads as plain hashes — they become the node's resolved value
|
|
285
|
-
- `on_success` / `on_exit` callbacks fire when the final event resolves the graph
|
|
286
|
-
|
|
287
|
-
## 10. Remote Contract Composition
|
|
288
|
-
|
|
289
|
-
Use this when logic lives on a different service node and should be called over HTTP inside a graph.
|
|
290
|
-
|
|
291
|
-
Examples:
|
|
292
|
-
|
|
293
|
-
- [examples/server/](../examples/server/)
|
|
294
|
-
|
|
295
|
-
Key DSL:
|
|
296
|
-
|
|
297
|
-
```ruby
|
|
298
|
-
require "igniter/server"
|
|
299
|
-
|
|
300
|
-
# ── Service node (runs on port 4568) ─────────────────────────────────────────
|
|
301
|
-
|
|
302
|
-
class ScoringContract < Igniter::Contract
|
|
303
|
-
define do
|
|
304
|
-
input :value
|
|
305
|
-
compute :score, depends_on: :value do |value:|
|
|
306
|
-
value * 1.5
|
|
307
|
-
end
|
|
308
|
-
output :score
|
|
309
|
-
end
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
Igniter::Server.configure do |c|
|
|
313
|
-
c.port = 4568
|
|
314
|
-
c.register "ScoringContract", ScoringContract
|
|
315
|
-
end
|
|
316
|
-
Igniter::Server.start # blocking
|
|
317
|
-
|
|
318
|
-
# ── Orchestrator node (runs on port 4567) ─────────────────────────────────────
|
|
319
|
-
|
|
320
|
-
class PipelineContract < Igniter::Contract
|
|
321
|
-
define do
|
|
322
|
-
input :data
|
|
323
|
-
remote :scored,
|
|
324
|
-
contract: "ScoringContract",
|
|
325
|
-
node: "http://localhost:4568",
|
|
326
|
-
inputs: { value: :data }
|
|
327
|
-
output :scored
|
|
328
|
-
end
|
|
329
|
-
end
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
Guideline:
|
|
333
|
-
|
|
334
|
-
- validate the `node:` URL at compile time — the graph will reject bad URLs before runtime
|
|
335
|
-
- keep remote contracts on a shared input interface so they are easy to swap
|
|
336
|
-
- igniter-server is stateless over HTTP; use a shared store for distributed state
|
|
337
|
-
- start the service with `bin/igniter-server start --port 4568 --require ./contracts.rb`
|
|
338
|
-
|
|
339
|
-
## 11. LLM Compute Node
|
|
340
|
-
|
|
341
|
-
Use this when a step requires a language model — classification, summarisation, drafting, or multi-step agent chains.
|
|
342
|
-
|
|
343
|
-
Examples:
|
|
344
|
-
|
|
345
|
-
- [llm/tool_use.rb](../examples/llm/tool_use.rb)
|
|
346
|
-
|
|
347
|
-
Key DSL:
|
|
348
|
-
|
|
349
|
-
```ruby
|
|
350
|
-
require "igniter/integrations/llm"
|
|
351
|
-
|
|
352
|
-
Igniter::LLM.configure do |c|
|
|
353
|
-
c.default_provider = :anthropic
|
|
354
|
-
c.anthropic.api_key = ENV.fetch("ANTHROPIC_API_KEY")
|
|
355
|
-
end
|
|
356
|
-
|
|
357
|
-
class SummarizeExecutor < Igniter::LLM::Executor
|
|
358
|
-
provider :anthropic
|
|
359
|
-
model "claude-haiku-4-5-20251001"
|
|
360
|
-
system_prompt "Return a single concise sentence summary."
|
|
361
|
-
|
|
362
|
-
def call(text:)
|
|
363
|
-
complete("Summarize: #{text}")
|
|
364
|
-
end
|
|
365
|
-
end
|
|
366
|
-
|
|
367
|
-
class ArticleContract < Igniter::Contract
|
|
368
|
-
define do
|
|
369
|
-
input :text
|
|
370
|
-
compute :summary, depends_on: :text, call: SummarizeExecutor
|
|
371
|
-
output :summary
|
|
372
|
-
end
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
ArticleContract.new(text: "Long article...").result.summary
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
For multi-turn conversations, use `Igniter::LLM::Context`:
|
|
379
|
-
|
|
380
|
-
```ruby
|
|
381
|
-
def call(feedback:, category:)
|
|
382
|
-
ctx = Igniter::LLM::Context
|
|
383
|
-
.empty(system: self.class.system_prompt)
|
|
384
|
-
.append_user("Feedback: #{feedback}")
|
|
385
|
-
.append_user("Category: #{category}")
|
|
386
|
-
chat(context: ctx)
|
|
387
|
-
end
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
For tool use (Anthropic function calling), declare tools at the class level:
|
|
391
|
-
|
|
392
|
-
```ruby
|
|
393
|
-
class ClassifyExecutor < Igniter::LLM::Executor
|
|
394
|
-
tools({
|
|
395
|
-
name: "set_category",
|
|
396
|
-
description: "Record the detected category",
|
|
397
|
-
input_schema: { type: "object", properties: { category: { type: "string" } }, required: ["category"] }
|
|
398
|
-
})
|
|
399
|
-
|
|
400
|
-
def call(feedback:)
|
|
401
|
-
complete_with_tools("Classify: #{feedback}")
|
|
402
|
-
end
|
|
403
|
-
end
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
Guideline:
|
|
407
|
-
|
|
408
|
-
- keep prompts inside the executor class, not scattered in the graph
|
|
409
|
-
- use `Context` when a step needs multi-turn history rather than a single prompt
|
|
410
|
-
- chain LLM executors as normal `compute` nodes — the graph handles ordering and caching
|
|
411
|
-
- mock the provider in tests and CI; real API calls belong in integration tests only
|
data/docs/PROACTIVE_AGENTS_V1.md
DELETED
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
# Proactive Agents — V1
|
|
2
|
-
|
|
3
|
-
## Concept
|
|
4
|
-
|
|
5
|
-
Standard Igniter agents are **reactive** — they wait for messages and respond.
|
|
6
|
-
A **proactive** agent acts *without being asked*: it polls conditions on a
|
|
7
|
-
schedule, evaluates rules, and fires actions when conditions are met.
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
Reactive: external message → handler → new state
|
|
11
|
-
Proactive: timer tick → watchers → triggers → actions → new state
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
`ProactiveAgent` is an experimental base class that adds four DSL keywords and
|
|
15
|
-
a built-in scan lifecycle on top of the standard `Igniter::Agent` API.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Architecture
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
ProactiveAgent < Igniter::Agent
|
|
23
|
-
│
|
|
24
|
-
├── scan_interval — register a recurring :_scan timer
|
|
25
|
-
├── watch — register a named poll callable
|
|
26
|
-
├── trigger — register condition + action pair
|
|
27
|
-
└── proactive_initial_state
|
|
28
|
-
│
|
|
29
|
-
└── :_scan handler (auto-injected into every subclass)
|
|
30
|
-
1. Call each watcher → build context Hash
|
|
31
|
-
2. Evaluate each trigger condition(ctx)
|
|
32
|
-
3. Call action(state:, context:) for truthy conditions
|
|
33
|
-
4. Append FiredTrigger records, increment scan_count
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Execution model
|
|
37
|
-
|
|
38
|
-
Every `scan_interval` seconds the timer fires and posts a `:_scan` message.
|
|
39
|
-
The same `:_scan` handler is also callable programmatically — useful in specs
|
|
40
|
-
and for composing proactive agents with other agents.
|
|
41
|
-
|
|
42
|
-
When `active: false` (via `:pause`) the scan cycle is a no-op; timer still
|
|
43
|
-
fires but watchers are not called and triggers are not evaluated.
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## DSL Reference
|
|
48
|
-
|
|
49
|
-
### `ProactiveAgent`
|
|
50
|
-
|
|
51
|
-
| Keyword | Description |
|
|
52
|
-
|---|---|
|
|
53
|
-
| `intent "…"` | Human-readable mission string (metadata, shown in `:status`) |
|
|
54
|
-
| `scan_interval N` | Register a recurring timer every N seconds |
|
|
55
|
-
| `watch :name, poll: callable` | Named watcher; callable returns current reading |
|
|
56
|
-
| `trigger :name, condition:, action:` | Register a conditional action |
|
|
57
|
-
| `proactive_initial_state extra` | Set initial state (merges ProactiveAgent defaults) |
|
|
58
|
-
|
|
59
|
-
### Built-in handlers (injected into every subclass)
|
|
60
|
-
|
|
61
|
-
| Handler | Type | Description |
|
|
62
|
-
|---|---|---|
|
|
63
|
-
| `:_scan` | state-mutating | Run one scan cycle |
|
|
64
|
-
| `:pause` | state-mutating | Suspend trigger evaluation (active: false) |
|
|
65
|
-
| `:resume` | state-mutating | Resume trigger evaluation (active: true) |
|
|
66
|
-
| `:status` | sync query → `Status` | Counts, intent, watcher/trigger names |
|
|
67
|
-
| `:context` | sync query → Hash | Last context snapshot |
|
|
68
|
-
| `:trigger_history` | sync query → Array | Up to 100 most recent `FiredTrigger` records |
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## Quick start
|
|
73
|
-
|
|
74
|
-
```ruby
|
|
75
|
-
require "igniter/agents/proactive_agent"
|
|
76
|
-
|
|
77
|
-
class ServerTempMonitor < Igniter::Agents::ProactiveAgent
|
|
78
|
-
intent "Alert when server room temperature exceeds safe range"
|
|
79
|
-
|
|
80
|
-
scan_interval 10.0 # check every 10 seconds
|
|
81
|
-
|
|
82
|
-
watch :temp_c, poll: -> { SensorAPI.read_temp }
|
|
83
|
-
|
|
84
|
-
trigger :overheating,
|
|
85
|
-
condition: ->(ctx) { ctx[:temp_c].to_f > 30 },
|
|
86
|
-
action: ->(state:, context:) {
|
|
87
|
-
Notifier.alert("Server room temp: #{context[:temp_c]}°C")
|
|
88
|
-
state.merge(last_alert_at: Time.now)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
proactive_initial_state last_alert_at: nil
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
ref = ServerTempMonitor.start
|
|
95
|
-
status = ref.call(:status)
|
|
96
|
-
# => Status(active: true, scan_count: 0, intent: "Alert when …", …)
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## Subclasses — AlertAgent and HealthCheckAgent
|
|
102
|
-
|
|
103
|
-
Two production-ready proactive agents are included in the stdlib:
|
|
104
|
-
|
|
105
|
-
```
|
|
106
|
-
require "igniter/agents"
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### `AlertAgent`
|
|
110
|
-
|
|
111
|
-
Threshold-based numeric monitoring with a concise DSL:
|
|
112
|
-
|
|
113
|
-
```ruby
|
|
114
|
-
class ApiMonitor < Igniter::Agents::AlertAgent
|
|
115
|
-
intent "Watch error rate and latency"
|
|
116
|
-
scan_interval 15.0
|
|
117
|
-
|
|
118
|
-
monitor :error_rate, source: -> { Metrics.error_rate }
|
|
119
|
-
monitor :p99_ms, source: -> { Metrics.p99_latency }
|
|
120
|
-
|
|
121
|
-
threshold :error_rate, above: 0.05 # >5% errors
|
|
122
|
-
threshold :p99_ms, above: 800 # >800ms p99
|
|
123
|
-
threshold :p99_ms, below: 1 # ghost: no traffic at all
|
|
124
|
-
|
|
125
|
-
proactive_initial_state alerts: [], silenced: false
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
ref = ApiMonitor.start
|
|
129
|
-
ref.send(:silence) # suppress new alerts
|
|
130
|
-
alerts = ref.call(:alerts) # => Array<AlertRecord>
|
|
131
|
-
ref.send(:clear_alerts)
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
**AlertRecord fields**: `metric`, `value`, `kind` (`:above`/`:below`),
|
|
135
|
-
`threshold`, `fired_at`.
|
|
136
|
-
|
|
137
|
-
### `HealthCheckAgent`
|
|
138
|
-
|
|
139
|
-
Service liveness polling with automatic transition detection:
|
|
140
|
-
|
|
141
|
-
```ruby
|
|
142
|
-
class InfraHealth < Igniter::Agents::HealthCheckAgent
|
|
143
|
-
intent "Monitor database and cache"
|
|
144
|
-
scan_interval 30.0
|
|
145
|
-
|
|
146
|
-
# poll returns truthy = healthy, falsy / raises = unhealthy
|
|
147
|
-
check :database, poll: -> { DB.ping }
|
|
148
|
-
check :cache, poll: -> { Redis.current.ping == "PONG" }
|
|
149
|
-
|
|
150
|
-
proactive_initial_state health: {}, transitions: []
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
ref = InfraHealth.start
|
|
154
|
-
health = ref.call(:health) # => { database: :healthy, cache: :unhealthy }
|
|
155
|
-
all_ok = ref.call(:all_healthy) # => false
|
|
156
|
-
transitions = ref.call(:transitions) # => [Transition(cache: unknown→unhealthy)]
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
Transitions are only recorded when status **changes** — no duplicate events for
|
|
160
|
-
persistently unhealthy services.
|
|
161
|
-
|
|
162
|
-
**Transition fields**: `service`, `from`, `to`, `occurred_at`.
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Building your own ProactiveAgent subclass
|
|
167
|
-
|
|
168
|
-
### Pattern: layering reactive and proactive handlers
|
|
169
|
-
|
|
170
|
-
```ruby
|
|
171
|
-
class StockWatcher < Igniter::Agents::ProactiveAgent
|
|
172
|
-
intent "Monitor stock price and fire when it crosses buy/sell thresholds"
|
|
173
|
-
|
|
174
|
-
scan_interval 60.0
|
|
175
|
-
|
|
176
|
-
watch :price, poll: -> { FinanceAPI.last_price("AAPL") }
|
|
177
|
-
|
|
178
|
-
trigger :buy_signal,
|
|
179
|
-
condition: ->(ctx) { ctx[:price].to_f < 150 },
|
|
180
|
-
action: ->(state:, context:) {
|
|
181
|
-
state.merge(signals: state[:signals] + [{ type: :buy, price: context[:price], at: Time.now }])
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
proactive_initial_state signals: []
|
|
185
|
-
|
|
186
|
-
# Reactive handler for manual context override (e.g. in tests)
|
|
187
|
-
on :inject_price do |state:, payload:|
|
|
188
|
-
state.merge(context: state[:context].merge(price: payload[:price]))
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
on :signals do |state:, **|
|
|
192
|
-
state[:signals].dup
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
### Pattern: re-injecting handlers in a concrete subclass
|
|
198
|
-
|
|
199
|
-
Because `Agent.inherited` resets `@handlers`, any handlers defined in a
|
|
200
|
-
parent class (like `AlertAgent`) are NOT automatically present in
|
|
201
|
-
`Class.new(AlertAgent)` (used in tests or further subclasses).
|
|
202
|
-
|
|
203
|
-
Both `AlertAgent` and `HealthCheckAgent` override `inherited` and call
|
|
204
|
-
`inject_*_handlers!(subclass)` to ensure their handlers are always present.
|
|
205
|
-
Follow the same pattern when building your own concrete subclass:
|
|
206
|
-
|
|
207
|
-
```ruby
|
|
208
|
-
class MyAgent < Igniter::Agents::ProactiveAgent
|
|
209
|
-
def self.inherited(subclass)
|
|
210
|
-
super # ProactiveAgent.inherited injects :_scan etc.
|
|
211
|
-
inject_my_handlers!(subclass)
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
private_class_method def self.inject_my_handlers!(klass)
|
|
215
|
-
klass.on(:my_query) { |state:, **| state[:my_data].dup }
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
on :my_query do |state:, **|
|
|
219
|
-
state[:my_data].dup
|
|
220
|
-
end
|
|
221
|
-
end
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### Testing: drive scans without a real timer
|
|
225
|
-
|
|
226
|
-
```ruby
|
|
227
|
-
RSpec.describe MyAgent do
|
|
228
|
-
let(:h) { ->(type, state) { MyAgent.handlers[type].call(state: state, payload: {}) } }
|
|
229
|
-
|
|
230
|
-
def base_state(extra = {})
|
|
231
|
-
{ active: true, context: {}, scan_count: 0,
|
|
232
|
-
last_scan_at: nil, trigger_history: [] }.merge(extra)
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
it "fires trigger when condition is met" do
|
|
236
|
-
# Call :_scan directly — no timer, no threads
|
|
237
|
-
result = h.call(:_scan, base_state)
|
|
238
|
-
expect(result[:trigger_history]).not_to be_empty
|
|
239
|
-
end
|
|
240
|
-
end
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## Companion example
|
|
246
|
-
|
|
247
|
-
`examples/companion/proactive/` shows three proactive agents in the context of
|
|
248
|
-
the voice assistant companion application:
|
|
249
|
-
|
|
250
|
-
| File | Agent | Mission |
|
|
251
|
-
|---|---|---|
|
|
252
|
-
| `conversation_nudge_agent.rb` | `ConversationNudgeAgent` | Detect silence and topic stagnation; propose conversation nudges |
|
|
253
|
-
| `system_watch_agent.rb` | `SystemAlertAgent` / `DependencyHealthAgent` | Monitor API metrics and service liveness |
|
|
254
|
-
| `demo.rb` | All four agents | Self-contained, runnable demonstration |
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
ruby examples/companion/proactive/demo.rb
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## API quick reference
|
|
263
|
-
|
|
264
|
-
```ruby
|
|
265
|
-
# Base class DSL
|
|
266
|
-
class MyAgent < Igniter::Agents::ProactiveAgent
|
|
267
|
-
intent "…"
|
|
268
|
-
scan_interval 5.0
|
|
269
|
-
watch :metric, poll: -> { source }
|
|
270
|
-
trigger :name, condition: ->(ctx) { … }, action: ->(state:, context:) { … }
|
|
271
|
-
proactive_initial_state key: default_value
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
# Runtime
|
|
275
|
-
ref = MyAgent.start
|
|
276
|
-
ref.send(:pause) # suspend reactions
|
|
277
|
-
ref.send(:resume) # resume
|
|
278
|
-
ref.call(:status) # => Status struct
|
|
279
|
-
ref.call(:context) # => { metric: last_reading, … }
|
|
280
|
-
ref.call(:trigger_history) # => [FiredTrigger, …]
|
|
281
|
-
|
|
282
|
-
# AlertAgent
|
|
283
|
-
ref.send(:silence) # suppress new alerts
|
|
284
|
-
ref.send(:unsilence)
|
|
285
|
-
ref.call(:alerts) # => [AlertRecord, …]
|
|
286
|
-
ref.send(:clear_alerts)
|
|
287
|
-
|
|
288
|
-
# HealthCheckAgent
|
|
289
|
-
ref.call(:health) # => { service: :healthy/:unhealthy }
|
|
290
|
-
ref.call(:all_healthy) # => true | false
|
|
291
|
-
ref.call(:transitions) # => [Transition, …]
|
|
292
|
-
ref.send(:reset)
|
|
293
|
-
```
|