igniter 0.5.0 → 0.5.2
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 +150 -658
- data/docs/README.md +59 -0
- data/docs/assets/README.md +8 -0
- data/docs/concepts/README.md +18 -0
- data/docs/concepts/igniter.md +119 -0
- data/docs/dev/README.md +48 -0
- data/docs/dev/agent-orchestra-dna.md +271 -0
- data/docs/dev/ai-agents-target-plan.md +178 -0
- data/docs/dev/application-target-plan.md +45 -0
- data/docs/dev/application-web-integration.md +59 -0
- data/docs/dev/application-web-poc-pattern-guide.md +167 -0
- data/docs/dev/architect-supervisor-bootstrap.md +322 -0
- data/docs/dev/architecture.md +20 -0
- data/docs/dev/cluster-target-plan.md +43 -0
- data/docs/dev/contract-persistence-target-plan.md +426 -0
- data/docs/dev/current-runtime-snapshot.md +73 -0
- data/docs/dev/data-ownership.md +29 -0
- data/docs/dev/document-rotation.md +51 -0
- data/docs/dev/embed-target-plan.md +51 -0
- data/docs/dev/igniter-web-dsl-sketch.md +151 -0
- data/docs/dev/igniter-web-target-plan.md +56 -0
- data/docs/dev/mcp-adapter-package-spec.md +81 -0
- data/docs/dev/module-system.md +46 -0
- data/docs/dev/package-map.md +112 -0
- data/docs/guide/README.md +77 -0
- data/docs/guide/ai-and-tools.md +33 -0
- data/docs/guide/api-and-runtime.md +38 -0
- data/docs/guide/app.md +45 -0
- data/docs/guide/application-capsules.md +139 -0
- data/docs/guide/application-showcase-portfolio.md +181 -0
- data/docs/guide/cli.md +70 -0
- data/docs/guide/cluster.md +55 -0
- data/docs/guide/configuration.md +31 -0
- data/docs/guide/contract-class-dsl.md +154 -0
- data/docs/guide/core-runtime-features.md +34 -0
- data/docs/guide/core.md +43 -0
- data/docs/guide/credentials.md +51 -0
- data/docs/guide/deployment-modes.md +63 -0
- data/docs/guide/distributed-workflows.md +21 -0
- data/docs/guide/getting-started.md +49 -0
- data/docs/guide/how-tos.md +33 -0
- data/docs/guide/igniter-lang-foundation.md +133 -0
- data/docs/guide/integrations.md +47 -0
- data/docs/guide/interactive-app-structure.md +91 -0
- data/docs/guide/store-adapters.md +183 -0
- data/docs/research/README.md +131 -0
- data/docs/research/contract-persistence-landing-zone.md +126 -0
- data/docs/research/contract-persistence-organic-model.md +279 -0
- data/docs/research/contract-persistence-organic-model.ru.md +277 -0
- data/docs/research/horizon-protocol.md +180 -0
- data/docs/research/igniter-lang-convergence-report.md +338 -0
- data/docs/research/project-status-horizon-report.md +363 -0
- data/docs/research/vision-handoff-protocol.md +141 -0
- data/docs/research/wizard-type-spec-architecture.md +293 -0
- data/docs/research/wizard-type-spec-research-request.md +134 -0
- data/docs/store/README.md +7 -0
- data/docs/store/convergence-audit.md +901 -0
- data/examples/README.md +152 -344
- data/examples/catalog.rb +1486 -0
- data/examples/cluster/incident_workflow.rb +70 -0
- data/examples/cluster/incidents.rb +63 -0
- data/examples/cluster/mesh_diagnostics.rb +89 -0
- data/examples/cluster/remediation.rb +63 -0
- data/examples/cluster/routing.rb +65 -0
- data/examples/contracts/aggregates.rb +39 -0
- data/examples/contracts/auditing.rb +35 -0
- data/examples/contracts/basic_pricing.rb +31 -0
- data/examples/contracts/branching.rb +36 -0
- data/examples/contracts/build_effect_executor_pack.rb +88 -0
- data/examples/contracts/build_your_own_pack.rb +82 -0
- data/examples/contracts/capabilities.rb +34 -0
- data/examples/contracts/class_callable.rb +45 -0
- data/examples/contracts/class_pricing.rb +32 -0
- data/examples/contracts/collection.rb +44 -0
- data/examples/contracts/commerce.rb +44 -0
- data/examples/contracts/compose_your_own_packs.rb +110 -0
- data/examples/contracts/composition.rb +61 -0
- data/examples/contracts/content_addressing.rb +33 -0
- data/examples/contracts/contractable_service.rb +43 -0
- data/examples/contracts/contractable_shadow.rb +69 -0
- data/examples/contracts/create_pack.rb +105 -0
- data/examples/contracts/dataflow.rb +57 -0
- data/examples/contracts/debug.rb +32 -0
- data/examples/contracts/debug_pack_authoring.rb +31 -0
- data/examples/contracts/diagnostics.rb +33 -0
- data/examples/contracts/differential.rb +97 -0
- data/examples/contracts/effects.rb +34 -0
- data/examples/contracts/embed_class_registration.rb +40 -0
- data/examples/contracts/embed_human_sugar.rb +106 -0
- data/examples/contracts/formula.rb +32 -0
- data/examples/contracts/incremental.rb +44 -0
- data/examples/contracts/introspection.rb +48 -0
- data/examples/contracts/invariants.rb +54 -0
- data/examples/contracts/journal.rb +37 -0
- data/examples/contracts/lang_foundation.rb +37 -0
- data/examples/contracts/mcp.rb +62 -0
- data/examples/contracts/mcp_host.rb +55 -0
- data/examples/contracts/mcp_server.rb +25 -0
- data/examples/contracts/piecewise.rb +30 -0
- data/examples/contracts/provenance.rb +55 -0
- data/examples/contracts/reactive.rb +62 -0
- data/examples/contracts/saga.rb +56 -0
- data/examples/contracts/scale.rb +30 -0
- data/examples/contracts/step_result.rb +58 -0
- data/examples/run.rb +163 -0
- data/lib/igniter/cluster.rb +3 -0
- data/lib/igniter/contract.rb +1 -326
- data/lib/igniter/monorepo_packages.rb +16 -0
- data/lib/igniter/version.rb +1 -1
- data/lib/igniter/web.rb +3 -0
- data/lib/igniter.rb +51 -43
- data/packages/igniter-agents/README.md +44 -0
- data/packages/igniter-agents/lib/igniter/agents/agent_definition.rb +26 -0
- data/packages/igniter-agents/lib/igniter/agents/agent_run.rb +47 -0
- data/packages/igniter-agents/lib/igniter/agents/agent_turn.rb +34 -0
- data/packages/igniter-agents/lib/igniter/agents/runner.rb +56 -0
- data/packages/igniter-agents/lib/igniter/agents/tool_call.rb +26 -0
- data/packages/igniter-agents/lib/igniter/agents/trace_event.rb +24 -0
- data/packages/igniter-agents/lib/igniter/agents.rb +33 -0
- data/packages/igniter-agents/lib/igniter-agents.rb +3 -0
- data/packages/igniter-ai/README.md +42 -0
- data/packages/igniter-ai/lib/igniter/ai/client.rb +18 -0
- data/packages/igniter-ai/lib/igniter/ai/error.rb +14 -0
- data/packages/igniter-ai/lib/igniter/ai/model_request.rb +28 -0
- data/packages/igniter-ai/lib/igniter/ai/model_response.rb +31 -0
- data/packages/igniter-ai/lib/igniter/ai/providers/fake.rb +24 -0
- data/packages/igniter-ai/lib/igniter/ai/providers/openai_responses.rb +100 -0
- data/packages/igniter-ai/lib/igniter/ai/providers/recorded.rb +40 -0
- data/packages/igniter-ai/lib/igniter/ai/usage.rb +32 -0
- data/packages/igniter-ai/lib/igniter/ai.rb +28 -0
- data/packages/igniter-ai/lib/igniter-ai.rb +3 -0
- data/packages/igniter-application/README.md +194 -0
- data/packages/igniter-application/lib/igniter/application/agent_definition.rb +38 -0
- data/packages/igniter-application/lib/igniter/application/agent_registry.rb +33 -0
- data/packages/igniter-application/lib/igniter/application/agent_runtime.rb +29 -0
- data/packages/igniter-application/lib/igniter/application/agents_builder.rb +26 -0
- data/packages/igniter-application/lib/igniter/application/ai_builder.rb +26 -0
- data/packages/igniter-application/lib/igniter/application/ai_provider_definition.rb +59 -0
- data/packages/igniter-application/lib/igniter/application/ai_registry.rb +34 -0
- data/packages/igniter-application/lib/igniter/application/application_assembly_plan.rb +67 -0
- data/packages/igniter-application/lib/igniter/application/application_blueprint.rb +227 -0
- data/packages/igniter-application/lib/igniter/application/application_capsule_report.rb +61 -0
- data/packages/igniter-application/lib/igniter/application/application_composition_report.rb +161 -0
- data/packages/igniter-application/lib/igniter/application/application_handoff_manifest.rb +100 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_commit_readiness.rb +182 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_dry_run_result.rb +190 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_ledger_commit.rb +285 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_ledger_verification.rb +301 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_operation_digest.rb +68 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_plan.rb +200 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_plan_verification.rb +140 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_readiness.rb +226 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_receipt.rb +151 -0
- data/packages/igniter-application/lib/igniter/application/application_layout.rb +91 -0
- data/packages/igniter-application/lib/igniter/application/application_load_path.rb +38 -0
- data/packages/igniter-application/lib/igniter/application/application_load_report.rb +74 -0
- data/packages/igniter-application/lib/igniter/application/application_manifest.rb +65 -0
- data/packages/igniter-application/lib/igniter/application/application_structure_entry.rb +58 -0
- data/packages/igniter-application/lib/igniter/application/application_structure_plan.rb +128 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_applied_verification.rb +301 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_apply_plan.rb +167 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_apply_result.rb +321 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_artifact.rb +160 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_plan.rb +125 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_verification.rb +154 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_intake_plan.rb +195 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_inventory.rb +153 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_readiness.rb +260 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_receipt.rb +179 -0
- data/packages/igniter-application/lib/igniter/application/artifact_reference.rb +39 -0
- data/packages/igniter-application/lib/igniter/application/boot_phase.rb +27 -0
- data/packages/igniter-application/lib/igniter/application/boot_plan.rb +55 -0
- data/packages/igniter-application/lib/igniter/application/boot_report.rb +70 -0
- data/packages/igniter-application/lib/igniter/application/capsule_builder.rb +396 -0
- data/packages/igniter-application/lib/igniter/application/capsule_export.rb +26 -0
- data/packages/igniter-application/lib/igniter/application/capsule_import.rb +38 -0
- data/packages/igniter-application/lib/igniter/application/collection_invoker.rb +54 -0
- data/packages/igniter-application/lib/igniter/application/collection_transport_adapter.rb +37 -0
- data/packages/igniter-application/lib/igniter/application/compose_invoker.rb +51 -0
- data/packages/igniter-application/lib/igniter/application/compose_transport_adapter.rb +34 -0
- data/packages/igniter-application/lib/igniter/application/config.rb +86 -0
- data/packages/igniter-application/lib/igniter/application/config_builder.rb +69 -0
- data/packages/igniter-application/lib/igniter/application/contract_registry.rb +30 -0
- data/packages/igniter-application/lib/igniter/application/credential_definition.rb +65 -0
- data/packages/igniter-application/lib/igniter/application/credential_store.rb +68 -0
- data/packages/igniter-application/lib/igniter/application/embedded_host.rb +23 -0
- data/packages/igniter-application/lib/igniter/application/environment.rb +1071 -0
- data/packages/igniter-application/lib/igniter/application/feature_slice.rb +61 -0
- data/packages/igniter-application/lib/igniter/application/feature_slice_report.rb +43 -0
- data/packages/igniter-application/lib/igniter/application/file_backed_host_activation_ledger_adapter.rb +138 -0
- data/packages/igniter-application/lib/igniter/application/file_backed_installed_capsule_registry.rb +132 -0
- data/packages/igniter-application/lib/igniter/application/flow_declaration.rb +62 -0
- data/packages/igniter-application/lib/igniter/application/flow_event.rb +50 -0
- data/packages/igniter-application/lib/igniter/application/flow_session_snapshot.rb +98 -0
- data/packages/igniter-application/lib/igniter/application/installed_capsule_entry.rb +47 -0
- data/packages/igniter-application/lib/igniter/application/interface.rb +11 -0
- data/packages/igniter-application/lib/igniter/application/kernel.rb +385 -0
- data/packages/igniter-application/lib/igniter/application/lifecycle_plan_step.rb +38 -0
- data/packages/igniter-application/lib/igniter/application/manual_loader.rb +18 -0
- data/packages/igniter-application/lib/igniter/application/manual_scheduler.rb +15 -0
- data/packages/igniter-application/lib/igniter/application/memory_session_store.rb +33 -0
- data/packages/igniter-application/lib/igniter/application/missing_credential_error.rb +23 -0
- data/packages/igniter-application/lib/igniter/application/mount_intent.rb +48 -0
- data/packages/igniter-application/lib/igniter/application/mount_registration.rb +49 -0
- data/packages/igniter-application/lib/igniter/application/pending_action.rb +39 -0
- data/packages/igniter-application/lib/igniter/application/pending_input.rb +45 -0
- data/packages/igniter-application/lib/igniter/application/plan_executor.rb +93 -0
- data/packages/igniter-application/lib/igniter/application/profile.rb +178 -0
- data/packages/igniter-application/lib/igniter/application/provider.rb +19 -0
- data/packages/igniter-application/lib/igniter/application/provider_lifecycle_report.rb +72 -0
- data/packages/igniter-application/lib/igniter/application/provider_lifecycle_result.rb +54 -0
- data/packages/igniter-application/lib/igniter/application/provider_registration.rb +19 -0
- data/packages/igniter-application/lib/igniter/application/rack_host.rb +311 -0
- data/packages/igniter-application/lib/igniter/application/seam_lifecycle_result.rb +62 -0
- data/packages/igniter-application/lib/igniter/application/service_definition.rb +25 -0
- data/packages/igniter-application/lib/igniter/application/service_registry.rb +58 -0
- data/packages/igniter-application/lib/igniter/application/session_entry.rb +46 -0
- data/packages/igniter-application/lib/igniter/application/shutdown_plan.rb +45 -0
- data/packages/igniter-application/lib/igniter/application/shutdown_report.rb +54 -0
- data/packages/igniter-application/lib/igniter/application/snapshot.rb +35 -0
- data/packages/igniter-application/lib/igniter/application/transport_request.rb +40 -0
- data/packages/igniter-application/lib/igniter/application/transport_response.rb +22 -0
- data/packages/igniter-application/lib/igniter/application.rb +354 -0
- data/packages/igniter-application/lib/igniter-application.rb +3 -0
- data/packages/igniter-cluster/README.md +116 -0
- data/packages/igniter-cluster/lib/igniter/cluster/active_incident_set.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/admission_policy.rb +158 -0
- data/packages/igniter-cluster/lib/igniter/cluster/admission_result.rb +47 -0
- data/packages/igniter-cluster/lib/igniter/cluster/capability_catalog.rb +66 -0
- data/packages/igniter-cluster/lib/igniter/cluster/capability_definition.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/capability_query.rb +162 -0
- data/packages/igniter-cluster/lib/igniter/cluster/capability_router.rb +11 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_diagnostics_executor.rb +184 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_diagnostics_report.rb +49 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_event.rb +34 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_event_log.rb +27 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_incident.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/decision_explanation.rb +31 -0
- data/packages/igniter-cluster/lib/igniter/cluster/direct_placement.rb +11 -0
- data/packages/igniter-cluster/lib/igniter/cluster/discovery_feed.rb +22 -0
- data/packages/igniter-cluster/lib/igniter/cluster/environment.rb +380 -0
- data/packages/igniter-cluster/lib/igniter/cluster/errors.rb +9 -0
- data/packages/igniter-cluster/lib/igniter/cluster/failover_plan.rb +45 -0
- data/packages/igniter-cluster/lib/igniter/cluster/failover_step.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/health_policy.rb +124 -0
- data/packages/igniter-cluster/lib/igniter/cluster/incident_action.rb +49 -0
- data/packages/igniter-cluster/lib/igniter/cluster/incident_entry.rb +98 -0
- data/packages/igniter-cluster/lib/igniter/cluster/incident_executor.rb +145 -0
- data/packages/igniter-cluster/lib/igniter/cluster/incident_workflow.rb +64 -0
- data/packages/igniter-cluster/lib/igniter/cluster/kernel.rb +75 -0
- data/packages/igniter-cluster/lib/igniter/cluster/kernel_seams.rb +249 -0
- data/packages/igniter-cluster/lib/igniter/cluster/lease_grant.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/lease_plan.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/lease_policy.rb +96 -0
- data/packages/igniter-cluster/lib/igniter/cluster/membership_delta.rb +36 -0
- data/packages/igniter-cluster/lib/igniter/cluster/membership_feed.rb +24 -0
- data/packages/igniter-cluster/lib/igniter/cluster/membership_projection.rb +45 -0
- data/packages/igniter-cluster/lib/igniter/cluster/membership_snapshot.rb +64 -0
- data/packages/igniter-cluster/lib/igniter/cluster/memory_incident_registry.rb +169 -0
- data/packages/igniter-cluster/lib/igniter/cluster/memory_peer_registry.rb +24 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_admission.rb +24 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_admission_result.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_attempt.rb +51 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_request.rb +71 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_response.rb +28 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_trace.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_executor.rb +497 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership.rb +89 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership_event.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership_source.rb +49 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_retry_policy.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_trust_policy.rb +131 -0
- data/packages/igniter-cluster/lib/igniter/cluster/operator_timeline.rb +33 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership_claim.rb +30 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership_plan.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership_policy.rb +100 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer.rb +86 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_discovery.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_health.rb +55 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_profile.rb +102 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_topology.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_view.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/permissive_admission.rb +11 -0
- data/packages/igniter-cluster/lib/igniter/cluster/placement_decision.rb +38 -0
- data/packages/igniter-cluster/lib/igniter/cluster/placement_policy.rb +131 -0
- data/packages/igniter-cluster/lib/igniter/cluster/plan_action_result.rb +72 -0
- data/packages/igniter-cluster/lib/igniter/cluster/plan_execution_report.rb +57 -0
- data/packages/igniter-cluster/lib/igniter/cluster/plan_executor.rb +314 -0
- data/packages/igniter-cluster/lib/igniter/cluster/policy_admission.rb +18 -0
- data/packages/igniter-cluster/lib/igniter/cluster/policy_placement.rb +69 -0
- data/packages/igniter-cluster/lib/igniter/cluster/policy_router.rb +70 -0
- data/packages/igniter-cluster/lib/igniter/cluster/profile.rb +97 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_executor.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_policy.rb +107 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_report.rb +35 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_stage.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rebalance_move.rb +30 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rebalance_plan.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/recovery_timeline.rb +33 -0
- data/packages/igniter-cluster/lib/igniter/cluster/registry_membership_source.rb +97 -0
- data/packages/igniter-cluster/lib/igniter/cluster/remediation_plan.rb +45 -0
- data/packages/igniter-cluster/lib/igniter/cluster/remediation_policy.rb +119 -0
- data/packages/igniter-cluster/lib/igniter/cluster/remediation_step.rb +44 -0
- data/packages/igniter-cluster/lib/igniter/cluster/route.rb +34 -0
- data/packages/igniter-cluster/lib/igniter/cluster/route_policy.rb +104 -0
- data/packages/igniter-cluster/lib/igniter/cluster/route_request.rb +61 -0
- data/packages/igniter-cluster/lib/igniter/cluster/topology_policy.rb +154 -0
- data/packages/igniter-cluster/lib/igniter/cluster/transport_adapter.rb +53 -0
- data/packages/igniter-cluster/lib/igniter/cluster.rb +108 -0
- data/packages/igniter-cluster/lib/igniter-cluster.rb +3 -0
- data/packages/igniter-contracts/README.md +239 -0
- data/packages/igniter-contracts/lib/igniter/contracts/api.rb +92 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/baseline_pack.rb +141 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/const_pack.rb +29 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/dsl_keyword.rb +21 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_result_policies.rb +47 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_spec.rb +73 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_specs.rb +74 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/kernel.rb +220 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/node_type.rb +26 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/ordered_registry.rb +55 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/pack.rb +13 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/pack_manifest.rb +131 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/path_access.rb +76 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/profile.rb +133 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/project_pack.rb +42 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/registry.rb +57 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/step_result_pack.rb +42 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly.rb +18 -0
- data/packages/igniter-contracts/lib/igniter/contracts/contract.rb +135 -0
- data/packages/igniter-contracts/lib/igniter/contracts/contractable.rb +288 -0
- data/packages/igniter-contracts/lib/igniter/contracts/environment.rb +51 -0
- data/packages/igniter-contracts/lib/igniter/contracts/errors.rb +47 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_normalizers.rb +23 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_runtime.rb +55 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_validators.rb +113 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/builder.rb +43 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/compilation_report.rb +46 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/compiled_graph.rb +21 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/compiler.rb +66 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/const_runtime.rb +15 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics.rb +24 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics_report.rb +40 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics_section.rb +37 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/effect_invocation.rb +26 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/execution_request.rb +28 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/execution_result.rb +32 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/inline_executor.rb +19 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/mutable_named_values.rb +52 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/named_values.rb +48 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/operation.rb +42 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/runtime.rb +43 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result.rb +51 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_diagnostics.rb +35 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_runtime.rb +51 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_validators.rb +44 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/structured_dump.rb +49 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/validation_finding.rb +28 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/validation_report.rb +46 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution.rb +28 -0
- data/packages/igniter-contracts/lib/igniter/contracts.rb +54 -0
- data/packages/igniter-contracts/lib/igniter/lang/backend.rb +19 -0
- data/packages/igniter-contracts/lib/igniter/lang/backends/ruby.rb +42 -0
- data/packages/igniter-contracts/lib/igniter/lang/diagnostic_payload.rb +174 -0
- data/packages/igniter-contracts/lib/igniter/lang/metadata_carrier_manifest.rb +112 -0
- data/packages/igniter-contracts/lib/igniter/lang/metadata_manifest.rb +128 -0
- data/packages/igniter-contracts/lib/igniter/lang/receipt_payload.rb +152 -0
- data/packages/igniter-contracts/lib/igniter/lang/schema_compatibility_diagnostic.rb +300 -0
- data/packages/igniter-contracts/lib/igniter/lang/types.rb +84 -0
- data/packages/igniter-contracts/lib/igniter/lang/verification_report.rb +226 -0
- data/packages/igniter-contracts/lib/igniter/lang.rb +27 -0
- data/packages/igniter-contracts/lib/igniter-contracts.rb +3 -0
- data/packages/igniter-embed/README.md +360 -0
- data/packages/igniter-embed/lib/igniter/embed/config.rb +155 -0
- data/packages/igniter-embed/lib/igniter/embed/container.rb +165 -0
- data/packages/igniter-embed/lib/igniter/embed/contract_handle.rb +23 -0
- data/packages/igniter-embed/lib/igniter/embed/contract_naming.rb +38 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/acceptance.rb +52 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/adapters.rb +33 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/config.rb +234 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/runner.rb +393 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/sugar_builder.rb +145 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable.rb +29 -0
- data/packages/igniter-embed/lib/igniter/embed/contracts_builder.rb +54 -0
- data/packages/igniter-embed/lib/igniter/embed/errors.rb +14 -0
- data/packages/igniter-embed/lib/igniter/embed/execution_envelope.rb +50 -0
- data/packages/igniter-embed/lib/igniter/embed/host_builder.rb +39 -0
- data/packages/igniter-embed/lib/igniter/embed/rails.rb +21 -0
- data/packages/igniter-embed/lib/igniter/embed/registry.rb +78 -0
- data/packages/igniter-embed/lib/igniter/embed/sugar_expansion.rb +152 -0
- data/packages/igniter-embed/lib/igniter/embed.rb +38 -0
- data/packages/igniter-embed/lib/igniter-embed.rb +3 -0
- data/packages/igniter-extensions/README.md +381 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/aggregate_pack.rb +103 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/builder.rb +132 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/event.rb +34 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/snapshot.rb +44 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit_pack.rb +60 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/branch_pack.rb +199 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/declaration.rb +31 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/error.rb +35 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/policy.rb +20 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/report.rb +47 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/violation.rb +30 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities_pack.rb +146 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/collection_pack.rb +212 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/commerce_pack.rb +91 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/compose_pack.rb +213 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/cache.rb +59 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/content_key.rb +63 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/declaration.rb +47 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing_pack.rb +90 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/profile.rb +196 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/report.rb +85 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/scaffold.rb +461 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/scope.rb +79 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/wizard.rb +269 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/workflow.rb +189 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/workflow_step.rb +51 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/write_result.rb +48 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/write_step.rb +63 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/writer.rb +131 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator_pack.rb +128 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/aggregate_operators.rb +119 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/aggregate_state.rb +60 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/builder.rb +66 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/collection_result.rb +70 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/diff.rb +37 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/item_result.rb +44 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/result.rb +58 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/session.rb +173 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/window_filter.rb +49 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow_pack.rb +66 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/pack_audit.rb +181 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/pack_snapshot.rb +46 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/profile_snapshot.rb +50 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/report.rb +50 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug_pack.rb +115 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/divergence.rb +37 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/formatter.rb +85 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/report.rb +83 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/runner.rb +136 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential_pack.rb +61 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/execution_report_pack.rb +38 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/formatter.rb +60 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/node_state.rb +30 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/result.rb +65 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/session.rb +146 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental_pack.rb +40 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/builder.rb +27 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/cases_report.rb +47 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/error.rb +34 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/invariant.rb +30 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/report.rb +45 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/suite.rb +36 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/violation.rb +39 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants_pack.rb +88 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/journal_pack.rb +55 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/formula_pack.rb +185 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/piecewise_pack.rb +166 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/scale_pack.rb +147 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/lookup_pack.rb +50 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/creator_session.rb +105 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_argument.rb +35 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_definition.rb +33 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_result.rb +28 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp_pack.rb +335 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/builder.rb +80 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/lineage.rb +59 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/node_trace.rb +53 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/text_formatter.rb +62 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance_pack.rb +52 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/builder.rb +43 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/dispatch_result.rb +59 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/engine.rb +79 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/event.rb +36 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/matcher.rb +20 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/plan.rb +58 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/subscription.rb +29 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive_pack.rb +169 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation.rb +25 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation_record.rb +28 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation_set.rb +47 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/formatter.rb +39 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/result.rb +56 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/runner.rb +124 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga_pack.rb +56 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts.rb +445 -0
- data/packages/igniter-extensions/lib/igniter/extensions.rb +6 -0
- data/packages/igniter-extensions/lib/igniter-extensions.rb +3 -0
- data/packages/igniter-hub/README.md +25 -0
- data/packages/igniter-hub/lib/igniter/hub/catalog_entry.rb +35 -0
- data/packages/igniter-hub/lib/igniter/hub/local_catalog.rb +51 -0
- data/packages/igniter-hub/lib/igniter/hub.rb +16 -0
- data/packages/igniter-hub/lib/igniter-hub.rb +3 -0
- data/packages/igniter-mcp-adapter/README.md +65 -0
- data/packages/igniter-mcp-adapter/exe/igniter-mcp-adapter +6 -0
- data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter/host.rb +226 -0
- data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter/server.rb +148 -0
- data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter.rb +40 -0
- data/packages/igniter-mcp-adapter/lib/igniter-mcp-adapter.rb +5 -0
- data/packages/igniter-web/README.md +539 -0
- data/packages/igniter-web/lib/igniter/web/api.rb +49 -0
- data/packages/igniter-web/lib/igniter/web/application.rb +99 -0
- data/packages/igniter-web/lib/igniter/web/application_web_mount.rb +162 -0
- data/packages/igniter-web/lib/igniter/web/arbre.rb +41 -0
- data/packages/igniter-web/lib/igniter/web/component.rb +103 -0
- data/packages/igniter-web/lib/igniter/web/components/view_action_node.rb +38 -0
- data/packages/igniter-web/lib/igniter/web/components/view_ask_node.rb +52 -0
- data/packages/igniter-web/lib/igniter/web/components/view_chat_node.rb +34 -0
- data/packages/igniter-web/lib/igniter/web/components/view_compare_node.rb +41 -0
- data/packages/igniter-web/lib/igniter/web/components/view_node.rb +30 -0
- data/packages/igniter-web/lib/igniter/web/components/view_screen.rb +34 -0
- data/packages/igniter-web/lib/igniter/web/components/view_stream_node.rb +32 -0
- data/packages/igniter-web/lib/igniter/web/components/view_zone.rb +26 -0
- data/packages/igniter-web/lib/igniter/web/components.rb +10 -0
- data/packages/igniter-web/lib/igniter/web/composer.rb +84 -0
- data/packages/igniter-web/lib/igniter/web/composition_finding.rb +16 -0
- data/packages/igniter-web/lib/igniter/web/composition_policy.rb +88 -0
- data/packages/igniter-web/lib/igniter/web/composition_preset.rb +131 -0
- data/packages/igniter-web/lib/igniter/web/composition_result.rb +27 -0
- data/packages/igniter-web/lib/igniter/web/flow_interaction_adapter.rb +104 -0
- data/packages/igniter-web/lib/igniter/web/flow_surface_projection.rb +121 -0
- data/packages/igniter-web/lib/igniter/web/interaction_target.rb +50 -0
- data/packages/igniter-web/lib/igniter/web/mount_context.rb +80 -0
- data/packages/igniter-web/lib/igniter/web/page.rb +110 -0
- data/packages/igniter-web/lib/igniter/web/record.rb +54 -0
- data/packages/igniter-web/lib/igniter/web/screen_spec.rb +109 -0
- data/packages/igniter-web/lib/igniter/web/surface_manifest.rb +370 -0
- data/packages/igniter-web/lib/igniter/web/surface_structure.rb +57 -0
- data/packages/igniter-web/lib/igniter/web/view_graph.rb +25 -0
- data/packages/igniter-web/lib/igniter/web/view_graph_renderer.rb +63 -0
- data/packages/igniter-web/lib/igniter/web/view_node.rb +37 -0
- data/packages/igniter-web/lib/igniter/web.rb +107 -0
- data/packages/igniter-web/lib/igniter-web.rb +3 -0
- metadata +547 -308
- 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/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/examples/agents.rb +0 -150
- data/examples/async_store.rb +0 -47
- data/examples/basic_pricing.rb +0 -27
- data/examples/collection.rb +0 -43
- data/examples/collection_partial_failure.rb +0 -50
- data/examples/composition.rb +0 -39
- data/examples/consensus.rb +0 -239
- data/examples/dataflow.rb +0 -308
- data/examples/diagnostics.rb +0 -28
- data/examples/differential.rb +0 -161
- data/examples/distributed_server.rb +0 -94
- data/examples/distributed_workflow.rb +0 -52
- data/examples/effects.rb +0 -184
- data/examples/elocal_webhook.rb +0 -1
- data/examples/incremental.rb +0 -142
- data/examples/invariants.rb +0 -179
- data/examples/llm_tools.rb +0 -237
- data/examples/marketing_ergonomics.rb +0 -57
- data/examples/mesh.rb +0 -239
- data/examples/mesh_discovery.rb +0 -267
- data/examples/mesh_gossip.rb +0 -162
- data/examples/order_pipeline.rb +0 -163
- data/examples/provenance.rb +0 -122
- data/examples/ringcentral_routing.rb +0 -269
- data/examples/saga.rb +0 -110
- data/lib/igniter/agent/mailbox.rb +0 -96
- data/lib/igniter/agent/message.rb +0 -21
- data/lib/igniter/agent/ref.rb +0 -86
- data/lib/igniter/agent/runner.rb +0 -129
- data/lib/igniter/agent/state_holder.rb +0 -23
- data/lib/igniter/agent.rb +0 -155
- data/lib/igniter/agents/ai/alert_agent.rb +0 -111
- data/lib/igniter/agents/ai/chain_agent.rb +0 -127
- data/lib/igniter/agents/ai/critic_agent.rb +0 -163
- data/lib/igniter/agents/ai/evaluator_agent.rb +0 -193
- data/lib/igniter/agents/ai/evolution_agent.rb +0 -286
- data/lib/igniter/agents/ai/health_check_agent.rb +0 -122
- data/lib/igniter/agents/ai/observer_agent.rb +0 -184
- data/lib/igniter/agents/ai/planner_agent.rb +0 -210
- data/lib/igniter/agents/ai/router_agent.rb +0 -131
- data/lib/igniter/agents/ai/self_reflection_agent.rb +0 -175
- data/lib/igniter/agents/observability/metrics_agent.rb +0 -130
- data/lib/igniter/agents/pipeline/batch_processor_agent.rb +0 -131
- data/lib/igniter/agents/proactive_agent.rb +0 -208
- data/lib/igniter/agents/reliability/retry_agent.rb +0 -99
- data/lib/igniter/agents/scheduling/cron_agent.rb +0 -110
- data/lib/igniter/agents.rb +0 -56
- data/lib/igniter/application/app_config.rb +0 -32
- data/lib/igniter/application/autoloader.rb +0 -18
- data/lib/igniter/application/generator.rb +0 -157
- data/lib/igniter/application/scheduler.rb +0 -109
- data/lib/igniter/application/yml_loader.rb +0 -39
- data/lib/igniter/application.rb +0 -174
- data/lib/igniter/capabilities.rb +0 -68
- data/lib/igniter/compiler/compiled_graph.rb +0 -180
- data/lib/igniter/compiler/graph_compiler.rb +0 -70
- data/lib/igniter/compiler/type_resolver.rb +0 -54
- data/lib/igniter/compiler/validation_context.rb +0 -61
- data/lib/igniter/compiler/validation_pipeline.rb +0 -32
- data/lib/igniter/compiler/validator.rb +0 -19
- data/lib/igniter/compiler/validators/await_validator.rb +0 -53
- data/lib/igniter/compiler/validators/callable_validator.rb +0 -125
- data/lib/igniter/compiler/validators/dependencies_validator.rb +0 -241
- data/lib/igniter/compiler/validators/outputs_validator.rb +0 -66
- data/lib/igniter/compiler/validators/remote_validator.rb +0 -60
- data/lib/igniter/compiler/validators/type_compatibility_validator.rb +0 -84
- data/lib/igniter/compiler/validators/uniqueness_validator.rb +0 -60
- data/lib/igniter/compiler.rb +0 -20
- data/lib/igniter/consensus/cluster.rb +0 -183
- data/lib/igniter/consensus/errors.rb +0 -14
- data/lib/igniter/consensus/executors.rb +0 -43
- data/lib/igniter/consensus/node.rb +0 -320
- data/lib/igniter/consensus/read_query.rb +0 -30
- data/lib/igniter/consensus/state_machine.rb +0 -58
- data/lib/igniter/consensus.rb +0 -58
- data/lib/igniter/content_addressing.rb +0 -133
- data/lib/igniter/dataflow/aggregate_operators.rb +0 -147
- data/lib/igniter/dataflow/aggregate_state.rb +0 -77
- data/lib/igniter/dataflow/diff.rb +0 -37
- data/lib/igniter/dataflow/diff_state.rb +0 -81
- data/lib/igniter/dataflow/incremental_collection_result.rb +0 -39
- data/lib/igniter/dataflow/window_filter.rb +0 -48
- data/lib/igniter/dataflow.rb +0 -65
- data/lib/igniter/diagnostics/auditing/report/console_formatter.rb +0 -80
- data/lib/igniter/diagnostics/auditing/report/markdown_formatter.rb +0 -22
- data/lib/igniter/diagnostics/introspection/formatters/mermaid_formatter.rb +0 -58
- data/lib/igniter/diagnostics/introspection/formatters/text_tree_formatter.rb +0 -44
- data/lib/igniter/diagnostics/report.rb +0 -349
- data/lib/igniter/diagnostics.rb +0 -8
- data/lib/igniter/differential/divergence.rb +0 -29
- data/lib/igniter/differential/formatter.rb +0 -96
- data/lib/igniter/differential/report.rb +0 -86
- data/lib/igniter/differential/runner.rb +0 -130
- data/lib/igniter/differential.rb +0 -51
- data/lib/igniter/dsl/contract_builder.rb +0 -495
- data/lib/igniter/dsl/schema_builder.rb +0 -73
- data/lib/igniter/dsl.rb +0 -9
- data/lib/igniter/effect.rb +0 -91
- data/lib/igniter/effect_registry.rb +0 -78
- data/lib/igniter/errors.rb +0 -79
- data/lib/igniter/events/bus.rb +0 -44
- data/lib/igniter/events/event.rb +0 -82
- data/lib/igniter/events.rb +0 -9
- data/lib/igniter/execution_report/builder.rb +0 -54
- data/lib/igniter/execution_report/formatter.rb +0 -50
- data/lib/igniter/execution_report/node_entry.rb +0 -24
- data/lib/igniter/execution_report/report.rb +0 -65
- data/lib/igniter/execution_report.rb +0 -32
- data/lib/igniter/executor.rb +0 -134
- data/lib/igniter/executor_registry.rb +0 -44
- data/lib/igniter/extensions/auditing/timeline.rb +0 -103
- data/lib/igniter/extensions/auditing.rb +0 -10
- data/lib/igniter/extensions/capabilities.rb +0 -39
- data/lib/igniter/extensions/content_addressing.rb +0 -5
- data/lib/igniter/extensions/dataflow.rb +0 -117
- data/lib/igniter/extensions/differential.rb +0 -114
- data/lib/igniter/extensions/execution_report.rb +0 -27
- data/lib/igniter/extensions/incremental.rb +0 -50
- data/lib/igniter/extensions/introspection/graph_formatter.rb +0 -103
- data/lib/igniter/extensions/introspection/plan_formatter.rb +0 -55
- data/lib/igniter/extensions/introspection/runtime_formatter.rb +0 -117
- data/lib/igniter/extensions/introspection.rb +0 -12
- data/lib/igniter/extensions/invariants.rb +0 -116
- data/lib/igniter/extensions/mesh.rb +0 -31
- data/lib/igniter/extensions/provenance.rb +0 -45
- data/lib/igniter/extensions/reactive/engine.rb +0 -83
- data/lib/igniter/extensions/reactive/matcher.rb +0 -21
- data/lib/igniter/extensions/reactive/reaction.rb +0 -18
- data/lib/igniter/extensions/reactive.rb +0 -12
- data/lib/igniter/extensions/saga.rb +0 -74
- data/lib/igniter/extensions.rb +0 -10
- data/lib/igniter/fingerprint.rb +0 -43
- data/lib/igniter/incremental/formatter.rb +0 -81
- data/lib/igniter/incremental/result.rb +0 -69
- data/lib/igniter/incremental/tracker.rb +0 -108
- data/lib/igniter/incremental.rb +0 -50
- data/lib/igniter/integrations/agents.rb +0 -18
- data/lib/igniter/integrations/llm/config.rb +0 -113
- data/lib/igniter/integrations/llm/context.rb +0 -74
- data/lib/igniter/integrations/llm/executor.rb +0 -352
- data/lib/igniter/integrations/llm/providers/anthropic.rb +0 -181
- data/lib/igniter/integrations/llm/providers/base.rb +0 -33
- data/lib/igniter/integrations/llm/providers/ollama.rb +0 -137
- data/lib/igniter/integrations/llm/providers/openai.rb +0 -182
- data/lib/igniter/integrations/llm/transcription/providers/assemblyai.rb +0 -200
- data/lib/igniter/integrations/llm/transcription/providers/base.rb +0 -122
- data/lib/igniter/integrations/llm/transcription/providers/deepgram.rb +0 -162
- data/lib/igniter/integrations/llm/transcription/providers/openai.rb +0 -102
- data/lib/igniter/integrations/llm/transcription/transcriber.rb +0 -145
- data/lib/igniter/integrations/llm/transcription/transcript_result.rb +0 -29
- data/lib/igniter/integrations/llm.rb +0 -95
- data/lib/igniter/integrations/rails/cable_adapter.rb +0 -49
- data/lib/igniter/integrations/rails/contract_job.rb +0 -76
- data/lib/igniter/integrations/rails/generators/contract/contract_generator.rb +0 -22
- data/lib/igniter/integrations/rails/generators/install/install_generator.rb +0 -33
- data/lib/igniter/integrations/rails/railtie.rb +0 -25
- data/lib/igniter/integrations/rails/webhook_concern.rb +0 -49
- data/lib/igniter/integrations/rails.rb +0 -12
- data/lib/igniter/invariant.rb +0 -50
- data/lib/igniter/memory/agent_memory.rb +0 -104
- data/lib/igniter/memory/episode.rb +0 -29
- data/lib/igniter/memory/fact.rb +0 -27
- data/lib/igniter/memory/memorable.rb +0 -90
- data/lib/igniter/memory/reflection_cycle.rb +0 -96
- data/lib/igniter/memory/reflection_record.rb +0 -28
- data/lib/igniter/memory/store.rb +0 -115
- data/lib/igniter/memory/stores/in_memory.rb +0 -136
- data/lib/igniter/memory/stores/sqlite.rb +0 -284
- data/lib/igniter/memory.rb +0 -80
- data/lib/igniter/mesh/announcer.rb +0 -55
- data/lib/igniter/mesh/config.rb +0 -45
- data/lib/igniter/mesh/discovery.rb +0 -39
- data/lib/igniter/mesh/errors.rb +0 -31
- data/lib/igniter/mesh/gossip.rb +0 -47
- data/lib/igniter/mesh/peer.rb +0 -21
- data/lib/igniter/mesh/peer_registry.rb +0 -51
- data/lib/igniter/mesh/poller.rb +0 -77
- data/lib/igniter/mesh/router.rb +0 -109
- data/lib/igniter/mesh.rb +0 -85
- data/lib/igniter/metrics/collector.rb +0 -131
- data/lib/igniter/metrics/prometheus_exporter.rb +0 -104
- data/lib/igniter/metrics/snapshot.rb +0 -8
- data/lib/igniter/metrics.rb +0 -37
- data/lib/igniter/model/aggregate_node.rb +0 -34
- data/lib/igniter/model/await_node.rb +0 -21
- data/lib/igniter/model/branch_node.rb +0 -46
- data/lib/igniter/model/collection_node.rb +0 -32
- data/lib/igniter/model/composition_node.rb +0 -22
- data/lib/igniter/model/compute_node.rb +0 -90
- data/lib/igniter/model/effect_node.rb +0 -37
- data/lib/igniter/model/graph.rb +0 -15
- data/lib/igniter/model/input_node.rb +0 -27
- data/lib/igniter/model/node.rb +0 -22
- data/lib/igniter/model/output_node.rb +0 -41
- data/lib/igniter/model/remote_node.rb +0 -42
- data/lib/igniter/model.rb +0 -18
- data/lib/igniter/node_cache.rb +0 -231
- data/lib/igniter/property_testing/formatter.rb +0 -66
- data/lib/igniter/property_testing/generators.rb +0 -115
- data/lib/igniter/property_testing/result.rb +0 -45
- data/lib/igniter/property_testing/run.rb +0 -43
- data/lib/igniter/property_testing/runner.rb +0 -47
- data/lib/igniter/property_testing.rb +0 -64
- data/lib/igniter/provenance/builder.rb +0 -97
- data/lib/igniter/provenance/lineage.rb +0 -82
- data/lib/igniter/provenance/node_trace.rb +0 -65
- data/lib/igniter/provenance/text_formatter.rb +0 -70
- data/lib/igniter/provenance.rb +0 -29
- data/lib/igniter/registry.rb +0 -67
- data/lib/igniter/replication/bootstrapper.rb +0 -61
- data/lib/igniter/replication/bootstrappers/gem.rb +0 -32
- data/lib/igniter/replication/bootstrappers/git.rb +0 -39
- data/lib/igniter/replication/bootstrappers/tarball.rb +0 -56
- data/lib/igniter/replication/expansion_plan.rb +0 -38
- data/lib/igniter/replication/expansion_planner.rb +0 -142
- data/lib/igniter/replication/manifest.rb +0 -45
- data/lib/igniter/replication/network_topology.rb +0 -123
- data/lib/igniter/replication/node_role.rb +0 -42
- data/lib/igniter/replication/reflective_replication_agent.rb +0 -238
- data/lib/igniter/replication/replication_agent.rb +0 -87
- data/lib/igniter/replication/role_registry.rb +0 -73
- data/lib/igniter/replication/ssh_session.rb +0 -77
- data/lib/igniter/replication.rb +0 -54
- data/lib/igniter/runtime/cache.rb +0 -126
- data/lib/igniter/runtime/collection_result.rb +0 -111
- data/lib/igniter/runtime/deferred_result.rb +0 -40
- data/lib/igniter/runtime/execution.rb +0 -416
- data/lib/igniter/runtime/input_validator.rb +0 -129
- data/lib/igniter/runtime/invalidator.rb +0 -52
- data/lib/igniter/runtime/job_worker.rb +0 -18
- data/lib/igniter/runtime/node_state.rb +0 -56
- data/lib/igniter/runtime/planner.rb +0 -126
- data/lib/igniter/runtime/resolver.rb +0 -758
- data/lib/igniter/runtime/result.rb +0 -117
- data/lib/igniter/runtime/runner_factory.rb +0 -20
- data/lib/igniter/runtime/runners/inline_runner.rb +0 -21
- data/lib/igniter/runtime/runners/store_runner.rb +0 -29
- data/lib/igniter/runtime/runners/thread_pool_runner.rb +0 -37
- data/lib/igniter/runtime/stores/active_record_store.rb +0 -53
- data/lib/igniter/runtime/stores/file_store.rb +0 -91
- data/lib/igniter/runtime/stores/memory_store.rb +0 -93
- data/lib/igniter/runtime/stores/redis_store.rb +0 -93
- data/lib/igniter/runtime.rb +0 -26
- data/lib/igniter/saga/compensation.rb +0 -31
- data/lib/igniter/saga/compensation_record.rb +0 -20
- data/lib/igniter/saga/executor.rb +0 -85
- data/lib/igniter/saga/formatter.rb +0 -49
- data/lib/igniter/saga/result.rb +0 -47
- data/lib/igniter/saga.rb +0 -56
- data/lib/igniter/server/client.rb +0 -166
- data/lib/igniter/server/config.rb +0 -34
- data/lib/igniter/server/handlers/base.rb +0 -105
- data/lib/igniter/server/handlers/contracts_handler.rb +0 -15
- data/lib/igniter/server/handlers/event_handler.rb +0 -32
- data/lib/igniter/server/handlers/execute_handler.rb +0 -43
- data/lib/igniter/server/handlers/health_handler.rb +0 -32
- data/lib/igniter/server/handlers/liveness_handler.rb +0 -20
- data/lib/igniter/server/handlers/manifest_handler.rb +0 -34
- data/lib/igniter/server/handlers/metrics_handler.rb +0 -51
- data/lib/igniter/server/handlers/peers_handler.rb +0 -115
- data/lib/igniter/server/handlers/readiness_handler.rb +0 -47
- data/lib/igniter/server/handlers/status_handler.rb +0 -27
- data/lib/igniter/server/http_server.rb +0 -146
- data/lib/igniter/server/rack_app.rb +0 -35
- data/lib/igniter/server/registry.rb +0 -56
- data/lib/igniter/server/router.rb +0 -108
- data/lib/igniter/server/server_logger.rb +0 -52
- data/lib/igniter/server.rb +0 -73
- data/lib/igniter/skill/feedback.rb +0 -116
- data/lib/igniter/skill/output_schema.rb +0 -110
- data/lib/igniter/skill.rb +0 -218
- data/lib/igniter/stream_loop.rb +0 -80
- data/lib/igniter/supervisor.rb +0 -167
- data/lib/igniter/temporal.rb +0 -84
- data/lib/igniter/tool/discoverable.rb +0 -151
- data/lib/igniter/tool.rb +0 -52
- data/lib/igniter/tool_registry.rb +0 -144
- data/lib/igniter/type_system.rb +0 -44
- /data/docs/{EXECUTION_MODEL_V2.md → dev/execution-model.md} +0 -0
data/lib/igniter/invariant.rb
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
# Represents a named condition that must always hold for a contract's outputs.
|
|
5
|
-
#
|
|
6
|
-
# An Invariant wraps a block that receives the contract's declared output values
|
|
7
|
-
# as keyword arguments and returns a truthy value when the condition holds.
|
|
8
|
-
#
|
|
9
|
-
# @example
|
|
10
|
-
# inv = Igniter::Invariant.new(:total_non_negative) { |total:, **| total >= 0 }
|
|
11
|
-
# inv.check(total: 42) # => nil (passed)
|
|
12
|
-
# inv.check(total: -1) # => InvariantViolation
|
|
13
|
-
class Invariant
|
|
14
|
-
attr_reader :name, :block
|
|
15
|
-
|
|
16
|
-
def initialize(name, &block)
|
|
17
|
-
raise ArgumentError, "invariant :#{name} requires a block" unless block
|
|
18
|
-
|
|
19
|
-
@name = name.to_sym
|
|
20
|
-
@block = block
|
|
21
|
-
freeze
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Evaluate invariant against the resolved output values.
|
|
25
|
-
#
|
|
26
|
-
# @param resolved_values [Hash] output_name => value for all declared outputs
|
|
27
|
-
# @return [InvariantViolation, nil] nil when the invariant holds
|
|
28
|
-
def check(resolved_values)
|
|
29
|
-
passed = block.call(**resolved_values)
|
|
30
|
-
passed ? nil : InvariantViolation.new(name: name, passed: false)
|
|
31
|
-
rescue StandardError => e
|
|
32
|
-
InvariantViolation.new(name: name, passed: false, error: e)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# Records a single invariant check outcome.
|
|
37
|
-
class InvariantViolation
|
|
38
|
-
attr_reader :name, :error
|
|
39
|
-
|
|
40
|
-
def initialize(name:, passed:, error: nil)
|
|
41
|
-
@name = name.to_sym
|
|
42
|
-
@passed = passed
|
|
43
|
-
@error = error
|
|
44
|
-
freeze
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def passed? = @passed
|
|
48
|
-
def failed? = !@passed
|
|
49
|
-
end
|
|
50
|
-
end
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Memory
|
|
5
|
-
# Facade that pre-fills +agent_id+ on all Store operations.
|
|
6
|
-
#
|
|
7
|
-
# Callers interact with AgentMemory instead of the raw Store so they never
|
|
8
|
-
# have to pass +agent_id:+ explicitly. An optional +session_id+ groups
|
|
9
|
-
# episodes within a single interaction session.
|
|
10
|
-
#
|
|
11
|
-
# @example
|
|
12
|
-
# store = Igniter::Memory::Stores::InMemory.new
|
|
13
|
-
# memory = Igniter::Memory::AgentMemory.new(store: store, agent_id: "MyAgent:1")
|
|
14
|
-
#
|
|
15
|
-
# memory.record(type: :tool_call, content: "searched web for Ruby docs")
|
|
16
|
-
# memory.recall(query: "Ruby") # => [Episode, ...]
|
|
17
|
-
# memory.remember(:user_tz, "UTC")
|
|
18
|
-
# memory.facts # => { "user_tz" => Fact }
|
|
19
|
-
class AgentMemory
|
|
20
|
-
# @param store [Store] backing store implementation
|
|
21
|
-
# @param agent_id [String] identifier for this agent
|
|
22
|
-
# @param session_id [String, nil] optional session grouping key
|
|
23
|
-
def initialize(store:, agent_id:, session_id: nil)
|
|
24
|
-
@store = store
|
|
25
|
-
@agent_id = agent_id
|
|
26
|
-
@session_id = session_id
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Record a new episode.
|
|
30
|
-
#
|
|
31
|
-
# @param type [String, Symbol] category tag
|
|
32
|
-
# @param content [String] textual description of the event
|
|
33
|
-
# @param outcome [String, nil] result label, e.g. "success"/"failure"
|
|
34
|
-
# @param importance [Float] relevance weight 0.0–1.0
|
|
35
|
-
# @return [Episode]
|
|
36
|
-
def record(type:, content:, outcome: nil, importance: 0.5)
|
|
37
|
-
@store.record(
|
|
38
|
-
agent_id: @agent_id,
|
|
39
|
-
type: type,
|
|
40
|
-
content: content,
|
|
41
|
-
session_id: @session_id,
|
|
42
|
-
outcome: outcome,
|
|
43
|
-
importance: importance
|
|
44
|
-
)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# Keyword-search episodes for this agent.
|
|
48
|
-
#
|
|
49
|
-
# @param query [String, nil] search term; nil returns most recent
|
|
50
|
-
# @param limit [Integer] maximum results (default 10)
|
|
51
|
-
# @param type [String, Symbol, nil] optional type filter
|
|
52
|
-
# @return [Array<Episode>]
|
|
53
|
-
def recall(query: nil, limit: 10, type: nil)
|
|
54
|
-
@store.retrieve(agent_id: @agent_id, query: query, limit: limit, type: type)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Store or update a named fact.
|
|
58
|
-
#
|
|
59
|
-
# @param key [String, Symbol] fact name
|
|
60
|
-
# @param value [Object] fact value
|
|
61
|
-
# @param confidence [Float] confidence score 0.0–1.0
|
|
62
|
-
# @return [Fact]
|
|
63
|
-
def remember(key, value, confidence: 1.0)
|
|
64
|
-
@store.store_fact(agent_id: @agent_id, key: key, value: value, confidence: confidence)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# Returns all stored facts for this agent.
|
|
68
|
-
#
|
|
69
|
-
# @return [Hash{String => Fact}]
|
|
70
|
-
def facts
|
|
71
|
-
@store.facts(agent_id: @agent_id)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Returns recent episodes.
|
|
75
|
-
#
|
|
76
|
-
# @param last [Integer] maximum episodes to return
|
|
77
|
-
# @param type [String, Symbol, nil] optional type filter
|
|
78
|
-
# @return [Array<Episode>]
|
|
79
|
-
def recent(last: 20, type: nil)
|
|
80
|
-
@store.episodes(agent_id: @agent_id, last: last, type: type)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Run a reflection cycle and record the result.
|
|
84
|
-
#
|
|
85
|
-
# @param current_system_prompt [String, nil] current prompt to compare against
|
|
86
|
-
# @return [ReflectionRecord]
|
|
87
|
-
def reflect(current_system_prompt: nil)
|
|
88
|
-
ReflectionCycle.new(store: @store).reflect(
|
|
89
|
-
agent_id: @agent_id,
|
|
90
|
-
current_system_prompt: current_system_prompt
|
|
91
|
-
)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# Check whether the agent should run a reflection cycle.
|
|
95
|
-
#
|
|
96
|
-
# Returns true when the recent failure rate exceeds the threshold.
|
|
97
|
-
#
|
|
98
|
-
# @return [Boolean]
|
|
99
|
-
def should_reflect?
|
|
100
|
-
ReflectionCycle.new(store: @store).should_reflect?(agent_id: @agent_id)
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Memory
|
|
5
|
-
# Immutable value object representing a single recorded event in agent history.
|
|
6
|
-
#
|
|
7
|
-
# @!attribute [r] id
|
|
8
|
-
# @return [Integer] unique identifier within the store
|
|
9
|
-
# @!attribute [r] agent_id
|
|
10
|
-
# @return [String] identifier of the agent that recorded this episode
|
|
11
|
-
# @!attribute [r] session_id
|
|
12
|
-
# @return [String, nil] optional session grouping identifier
|
|
13
|
-
# @!attribute [r] ts
|
|
14
|
-
# @return [Integer] Unix timestamp of when the episode was recorded
|
|
15
|
-
# @!attribute [r] type
|
|
16
|
-
# @return [String, Symbol] category of the episode (e.g. :tool_call, :response)
|
|
17
|
-
# @!attribute [r] content
|
|
18
|
-
# @return [String] textual description of what happened
|
|
19
|
-
# @!attribute [r] outcome
|
|
20
|
-
# @return [String, nil] result descriptor, e.g. "success" or "failure"
|
|
21
|
-
# @!attribute [r] importance
|
|
22
|
-
# @return [Float] relevance weight in [0.0, 1.0], default 0.5
|
|
23
|
-
Episode = Struct.new(
|
|
24
|
-
:id, :agent_id, :session_id, :ts,
|
|
25
|
-
:type, :content, :outcome, :importance,
|
|
26
|
-
keyword_init: true
|
|
27
|
-
)
|
|
28
|
-
end
|
|
29
|
-
end
|
data/lib/igniter/memory/fact.rb
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Memory
|
|
5
|
-
# Immutable value object representing a persisted learned fact for an agent.
|
|
6
|
-
#
|
|
7
|
-
# Facts represent stable knowledge extracted from experience, keyed by a
|
|
8
|
-
# string name and associated with a confidence score.
|
|
9
|
-
#
|
|
10
|
-
# @!attribute [r] id
|
|
11
|
-
# @return [Integer] unique identifier within the store
|
|
12
|
-
# @!attribute [r] agent_id
|
|
13
|
-
# @return [String] identifier of the agent that owns this fact
|
|
14
|
-
# @!attribute [r] key
|
|
15
|
-
# @return [String] fact name (e.g. "user_timezone", "preferred_format")
|
|
16
|
-
# @!attribute [r] value
|
|
17
|
-
# @return [Object] the fact's value
|
|
18
|
-
# @!attribute [r] confidence
|
|
19
|
-
# @return [Float] confidence score in [0.0, 1.0], default 1.0
|
|
20
|
-
# @!attribute [r] updated_at
|
|
21
|
-
# @return [Integer] Unix timestamp of last upsert
|
|
22
|
-
Fact = Struct.new(
|
|
23
|
-
:id, :agent_id, :key, :value, :confidence, :updated_at,
|
|
24
|
-
keyword_init: true
|
|
25
|
-
)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Memory
|
|
5
|
-
# Mixin that adds episodic memory capabilities to Igniter::Agent and
|
|
6
|
-
# Igniter::LLM::Executor subclasses (or any class that includes it).
|
|
7
|
-
#
|
|
8
|
-
# Including +Memorable+ adds:
|
|
9
|
-
# * A class-level +enable_memory+ DSL method for opt-in activation
|
|
10
|
-
# * A +memory+ instance accessor returning a bound AgentMemory facade
|
|
11
|
-
# * Automatic agent_id derived from the class name and object_id
|
|
12
|
-
#
|
|
13
|
-
# Memory is NOT enabled by default — call +enable_memory+ in the class body.
|
|
14
|
-
#
|
|
15
|
-
# == Example
|
|
16
|
-
#
|
|
17
|
-
# class MyAgent < Igniter::Agent
|
|
18
|
-
# include Igniter::Memory::Memorable
|
|
19
|
-
#
|
|
20
|
-
# enable_memory store: Igniter::Memory::Stores::InMemory.new
|
|
21
|
-
#
|
|
22
|
-
# on :task do |state:, payload:, **|
|
|
23
|
-
# memory.record(type: :task, content: payload[:description])
|
|
24
|
-
# # ... handle task
|
|
25
|
-
# state
|
|
26
|
-
# end
|
|
27
|
-
# end
|
|
28
|
-
#
|
|
29
|
-
# == Inheritance
|
|
30
|
-
#
|
|
31
|
-
# Subclasses inherit +memory_enabled?+ and +memory_store+ from their parent.
|
|
32
|
-
# Each subclass can override them independently.
|
|
33
|
-
module Memorable
|
|
34
|
-
def self.included(base)
|
|
35
|
-
base.extend(ClassMethods)
|
|
36
|
-
base.instance_variable_set(:@memory_store, nil)
|
|
37
|
-
base.instance_variable_set(:@memory_enabled, false)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
module ClassMethods
|
|
41
|
-
# Enable episodic memory for this class.
|
|
42
|
-
#
|
|
43
|
-
# @param store [Store, nil] backing store; falls back to Igniter::Memory.default_store
|
|
44
|
-
# @return [void]
|
|
45
|
-
def enable_memory(store: nil)
|
|
46
|
-
@memory_enabled = true
|
|
47
|
-
@memory_store = store || Igniter::Memory.default_store
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Returns the configured memory store, walking up the inheritance chain
|
|
51
|
-
# if none is set on this class.
|
|
52
|
-
#
|
|
53
|
-
# @return [Store]
|
|
54
|
-
def memory_store
|
|
55
|
-
@memory_store ||
|
|
56
|
-
(superclass.respond_to?(:memory_store) ? superclass.memory_store : Igniter::Memory.default_store)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Returns whether memory has been enabled for this class or any ancestor.
|
|
60
|
-
#
|
|
61
|
-
# @return [Boolean]
|
|
62
|
-
def memory_enabled?
|
|
63
|
-
@memory_enabled ||
|
|
64
|
-
(superclass.respond_to?(:memory_enabled?) && superclass.memory_enabled?)
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Returns the AgentMemory facade bound to this instance.
|
|
69
|
-
#
|
|
70
|
-
# Lazily initialised on first access. The agent_id incorporates the class
|
|
71
|
-
# name and object_id to keep instances isolated.
|
|
72
|
-
#
|
|
73
|
-
# @return [AgentMemory]
|
|
74
|
-
def memory
|
|
75
|
-
@memory ||= AgentMemory.new(
|
|
76
|
-
store: self.class.memory_store,
|
|
77
|
-
agent_id: memory_agent_id,
|
|
78
|
-
session_id: respond_to?(:session_id, true) ? session_id : nil
|
|
79
|
-
)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
private
|
|
83
|
-
|
|
84
|
-
def memory_agent_id
|
|
85
|
-
cls_name = self.class.name || "anonymous"
|
|
86
|
-
"#{cls_name}:#{object_id}"
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Memory
|
|
5
|
-
# Evaluates recent episodes and produces a ReflectionRecord.
|
|
6
|
-
#
|
|
7
|
-
# ReflectionCycle can operate in two modes:
|
|
8
|
-
#
|
|
9
|
-
# * **Rule-based** (default) — analyses failure rates using simple heuristics,
|
|
10
|
-
# requiring no LLM. Always available.
|
|
11
|
-
# * **LLM-assisted** — delegates to an LLM executor for a richer summary and
|
|
12
|
-
# an optional system-prompt patch. Enabled by passing an +llm:+ object.
|
|
13
|
-
#
|
|
14
|
-
# @example Rule-based reflection
|
|
15
|
-
# cycle = Igniter::Memory::ReflectionCycle.new(store: store)
|
|
16
|
-
# rec = cycle.reflect(agent_id: "MyAgent:1")
|
|
17
|
-
# # => ReflectionRecord (summary describes failure breakdown)
|
|
18
|
-
#
|
|
19
|
-
# @example With failure threshold check
|
|
20
|
-
# cycle.should_reflect?(agent_id: "MyAgent:1")
|
|
21
|
-
# # => true when recent failures >= DEFAULT_FAILURE_THRESHOLD
|
|
22
|
-
class ReflectionCycle
|
|
23
|
-
DEFAULT_FAILURE_THRESHOLD = 5
|
|
24
|
-
DEFAULT_WINDOW = 50
|
|
25
|
-
|
|
26
|
-
# @param store [Store] backing episode store
|
|
27
|
-
# @param failure_threshold [Integer] minimum failures to trigger reflection
|
|
28
|
-
# @param window [Integer] how many recent episodes to inspect
|
|
29
|
-
# @param llm [#call, nil] optional LLM executor for smart reflection
|
|
30
|
-
def initialize(store:, failure_threshold: DEFAULT_FAILURE_THRESHOLD,
|
|
31
|
-
window: DEFAULT_WINDOW, llm: nil)
|
|
32
|
-
@store = store
|
|
33
|
-
@failure_threshold = failure_threshold
|
|
34
|
-
@window = window
|
|
35
|
-
@llm = llm
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Check whether a reflection cycle should be triggered.
|
|
39
|
-
#
|
|
40
|
-
# Returns true when the number of recent "failure" outcomes meets or
|
|
41
|
-
# exceeds the configured +failure_threshold+.
|
|
42
|
-
#
|
|
43
|
-
# @param agent_id [String]
|
|
44
|
-
# @return [Boolean]
|
|
45
|
-
def should_reflect?(agent_id:)
|
|
46
|
-
recent = @store.episodes(agent_id: agent_id, last: @window)
|
|
47
|
-
failures = recent.count { |e| e.outcome == "failure" }
|
|
48
|
-
failures >= @failure_threshold
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Run a reflection cycle and persist the result.
|
|
52
|
-
#
|
|
53
|
-
# Analyses the most recent +window+ episodes and produces a
|
|
54
|
-
# ReflectionRecord with a summary (and optional system-prompt patch when
|
|
55
|
-
# an LLM is configured).
|
|
56
|
-
#
|
|
57
|
-
# @param agent_id [String]
|
|
58
|
-
# @param current_system_prompt [String, nil] passed to the LLM if available
|
|
59
|
-
# @return [ReflectionRecord]
|
|
60
|
-
def reflect(agent_id:, current_system_prompt: nil) # rubocop:disable Metrics/MethodLength
|
|
61
|
-
recent = @store.episodes(agent_id: agent_id, last: @window)
|
|
62
|
-
summary, patch = if @llm
|
|
63
|
-
smart_reflect(recent, current_system_prompt)
|
|
64
|
-
else
|
|
65
|
-
rule_based_reflect(recent)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
@store.record_reflection(
|
|
69
|
-
agent_id: agent_id,
|
|
70
|
-
summary: summary,
|
|
71
|
-
system_patch: patch
|
|
72
|
-
)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
private
|
|
76
|
-
|
|
77
|
-
def rule_based_reflect(episodes) # rubocop:disable Metrics/CyclomaticComplexity
|
|
78
|
-
failures = episodes.select { |e| e.outcome == "failure" }
|
|
79
|
-
failure_types = failures.group_by(&:type).transform_values(&:count)
|
|
80
|
-
top = failure_types.max_by { |_, v| v }
|
|
81
|
-
|
|
82
|
-
summary = "#{failures.size}/#{episodes.size} failures. " \
|
|
83
|
-
"Top failure type: #{top&.first || "none"} (#{top&.last || 0}\xc3\x97)"
|
|
84
|
-
[summary, nil]
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def smart_reflect(episodes, current_system_prompt)
|
|
88
|
-
result = @llm.call(
|
|
89
|
-
episodes: episodes.map { |e| { type: e.type, content: e.content, outcome: e.outcome } },
|
|
90
|
-
current_system_prompt: current_system_prompt
|
|
91
|
-
)
|
|
92
|
-
[result[:summary], result[:system_patch]]
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Memory
|
|
5
|
-
# Immutable value object representing the output of a reflection cycle.
|
|
6
|
-
#
|
|
7
|
-
# A ReflectionRecord captures the summary and optional system-prompt patch
|
|
8
|
-
# produced by a ReflectionCycle run. It can be applied to update an agent's
|
|
9
|
-
# system prompt or used as an audit trail.
|
|
10
|
-
#
|
|
11
|
-
# @!attribute [r] id
|
|
12
|
-
# @return [Integer] unique identifier within the store
|
|
13
|
-
# @!attribute [r] agent_id
|
|
14
|
-
# @return [String] identifier of the agent this reflection belongs to
|
|
15
|
-
# @!attribute [r] ts
|
|
16
|
-
# @return [Integer] Unix timestamp when the reflection was recorded
|
|
17
|
-
# @!attribute [r] summary
|
|
18
|
-
# @return [String] human-readable summary of findings
|
|
19
|
-
# @!attribute [r] system_patch
|
|
20
|
-
# @return [String, nil] optional suggested replacement/patch for system prompt
|
|
21
|
-
# @!attribute [r] applied
|
|
22
|
-
# @return [Boolean] whether this reflection has been applied to the agent
|
|
23
|
-
ReflectionRecord = Struct.new(
|
|
24
|
-
:id, :agent_id, :ts, :summary, :system_patch, :applied,
|
|
25
|
-
keyword_init: true
|
|
26
|
-
)
|
|
27
|
-
end
|
|
28
|
-
end
|
data/lib/igniter/memory/store.rb
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Memory
|
|
5
|
-
# Abstract base class defining the Store interface for episodic memory.
|
|
6
|
-
#
|
|
7
|
-
# Concrete adapters must subclass Store and implement all public methods.
|
|
8
|
-
# All methods raise +NotImplementedError+ by default.
|
|
9
|
-
#
|
|
10
|
-
# == Interface
|
|
11
|
-
#
|
|
12
|
-
# store.record(agent_id:, type:, content:) # => Episode
|
|
13
|
-
# store.episodes(agent_id:, last: 50) # => Array<Episode>
|
|
14
|
-
# store.retrieve(agent_id:, query: "keyword") # => Array<Episode>
|
|
15
|
-
# store.store_fact(agent_id:, key:, value:)
|
|
16
|
-
# store.facts(agent_id:) # => Hash{key => Fact}
|
|
17
|
-
# store.record_reflection(agent_id:, summary:) # => ReflectionRecord
|
|
18
|
-
# store.reflections(agent_id:) # => Array<ReflectionRecord>
|
|
19
|
-
# store.apply_reflection(id:) # => true/false
|
|
20
|
-
# store.clear(agent_id:)
|
|
21
|
-
class Store
|
|
22
|
-
# Record an episode. Returns the persisted Episode.
|
|
23
|
-
#
|
|
24
|
-
# @param agent_id [String] identifier of the owning agent
|
|
25
|
-
# @param type [String, Symbol] category tag for the episode
|
|
26
|
-
# @param content [String] textual description of the event
|
|
27
|
-
# @param session_id [String, nil] optional session grouping key
|
|
28
|
-
# @param outcome [String, nil] result label, e.g. "success"/"failure"
|
|
29
|
-
# @param importance [Float] relevance weight 0.0-1.0 (default 0.5)
|
|
30
|
-
# @return [Episode]
|
|
31
|
-
def record(agent_id:, type:, content:, session_id: nil, outcome: nil, importance: 0.5) # rubocop:disable Metrics/ParameterLists
|
|
32
|
-
raise NotImplementedError, "#{self.class}#record not implemented"
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Return episodes for an agent, newest last.
|
|
36
|
-
#
|
|
37
|
-
# @param agent_id [String] identifier of the agent
|
|
38
|
-
# @param last [Integer] maximum number of episodes to return
|
|
39
|
-
# @param type [String, Symbol, nil] optional type filter
|
|
40
|
-
# @return [Array<Episode>]
|
|
41
|
-
def episodes(agent_id:, last: 50, type: nil)
|
|
42
|
-
raise NotImplementedError, "#{self.class}#episodes not implemented"
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Keyword-search episodes. Returns Array<Episode>.
|
|
46
|
-
#
|
|
47
|
-
# When +query+ is nil, returns the last +limit+ episodes.
|
|
48
|
-
# When +query+ is provided, filters by case-insensitive substring or FTS match.
|
|
49
|
-
#
|
|
50
|
-
# @param agent_id [String]
|
|
51
|
-
# @param query [String, nil] search term
|
|
52
|
-
# @param limit [Integer] maximum results (default 10)
|
|
53
|
-
# @param type [String, Symbol, nil] optional type filter
|
|
54
|
-
# @return [Array<Episode>]
|
|
55
|
-
def retrieve(agent_id:, query: nil, limit: 10, type: nil)
|
|
56
|
-
raise NotImplementedError, "#{self.class}#retrieve not implemented"
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Upsert a fact for an agent.
|
|
60
|
-
#
|
|
61
|
-
# @param agent_id [String] identifier of the owning agent
|
|
62
|
-
# @param key [String] fact name
|
|
63
|
-
# @param value [Object] fact value
|
|
64
|
-
# @param confidence [Float] confidence score 0.0-1.0 (default 1.0)
|
|
65
|
-
# @return [Fact]
|
|
66
|
-
def store_fact(agent_id:, key:, value:, confidence: 1.0)
|
|
67
|
-
raise NotImplementedError, "#{self.class}#store_fact not implemented"
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Returns all facts for an agent as a Hash keyed by string key.
|
|
71
|
-
#
|
|
72
|
-
# @param agent_id [String]
|
|
73
|
-
# @return [Hash{String => Fact}]
|
|
74
|
-
def facts(agent_id:)
|
|
75
|
-
raise NotImplementedError, "#{self.class}#facts not implemented"
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Store a reflection record. Returns the persisted ReflectionRecord.
|
|
79
|
-
#
|
|
80
|
-
# @param agent_id [String] owning agent identifier
|
|
81
|
-
# @param summary [String] human-readable reflection summary
|
|
82
|
-
# @param system_patch [String, nil] optional suggested system prompt patch
|
|
83
|
-
# @param applied [Boolean] whether already applied (default false)
|
|
84
|
-
# @return [ReflectionRecord]
|
|
85
|
-
def record_reflection(agent_id:, summary:, system_patch: nil, applied: false)
|
|
86
|
-
raise NotImplementedError, "#{self.class}#record_reflection not implemented"
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# Returns reflection records for an agent.
|
|
90
|
-
#
|
|
91
|
-
# @param agent_id [String]
|
|
92
|
-
# @param applied [Boolean, nil] nil returns all; true/false filters by applied flag
|
|
93
|
-
# @return [Array<ReflectionRecord>]
|
|
94
|
-
def reflections(agent_id:, applied: nil)
|
|
95
|
-
raise NotImplementedError, "#{self.class}#reflections not implemented"
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# Mark a reflection as applied.
|
|
99
|
-
#
|
|
100
|
-
# @param id [Integer] reflection identifier
|
|
101
|
-
# @return [Boolean] true if found and updated, false if not found
|
|
102
|
-
def apply_reflection(id:)
|
|
103
|
-
raise NotImplementedError, "#{self.class}#apply_reflection not implemented"
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
# Clear all stored data for an agent.
|
|
107
|
-
#
|
|
108
|
-
# @param agent_id [String]
|
|
109
|
-
# @return [void]
|
|
110
|
-
def clear(agent_id:)
|
|
111
|
-
raise NotImplementedError, "#{self.class}#clear not implemented"
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Igniter
|
|
4
|
-
module Memory
|
|
5
|
-
module Stores
|
|
6
|
-
# Thread-safe in-memory implementation of the Store interface.
|
|
7
|
-
#
|
|
8
|
-
# Stores all data in process memory. Suitable for testing and
|
|
9
|
-
# single-process applications where persistence is not required.
|
|
10
|
-
# All operations are protected by a single Mutex for thread safety.
|
|
11
|
-
#
|
|
12
|
-
# @example
|
|
13
|
-
# store = Igniter::Memory::Stores::InMemory.new
|
|
14
|
-
# ep = store.record(agent_id: "bot:1", type: :tool_call, content: "searched web")
|
|
15
|
-
# store.episodes(agent_id: "bot:1") # => [ep]
|
|
16
|
-
class InMemory < Store
|
|
17
|
-
def initialize # rubocop:disable Lint/MissingSuper
|
|
18
|
-
@episodes = []
|
|
19
|
-
@facts = {}
|
|
20
|
-
@reflections = []
|
|
21
|
-
@seq = 0
|
|
22
|
-
@mutex = Mutex.new
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# @see Store#record
|
|
26
|
-
def record(agent_id:, type:, content:, session_id: nil, outcome: nil, importance: 0.5) # rubocop:disable Metrics/ParameterLists, Metrics/MethodLength
|
|
27
|
-
@mutex.synchronize do
|
|
28
|
-
ep = Episode.new(
|
|
29
|
-
id: next_id,
|
|
30
|
-
agent_id: agent_id,
|
|
31
|
-
session_id: session_id,
|
|
32
|
-
ts: Time.now.to_i,
|
|
33
|
-
type: type,
|
|
34
|
-
content: content,
|
|
35
|
-
outcome: outcome,
|
|
36
|
-
importance: importance
|
|
37
|
-
)
|
|
38
|
-
@episodes << ep
|
|
39
|
-
ep
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# @see Store#episodes
|
|
44
|
-
def episodes(agent_id:, last: 50, type: nil)
|
|
45
|
-
@mutex.synchronize do
|
|
46
|
-
result = @episodes.select { |e| e.agent_id == agent_id }
|
|
47
|
-
result = result.select { |e| e.type == type } if type
|
|
48
|
-
result.last(last)
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# @see Store#retrieve
|
|
53
|
-
def retrieve(agent_id:, query: nil, limit: 10, type: nil)
|
|
54
|
-
eps = episodes(agent_id: agent_id, last: 1000, type: type)
|
|
55
|
-
return eps.last(limit) unless query
|
|
56
|
-
|
|
57
|
-
q = query.to_s.downcase
|
|
58
|
-
eps.select { |e| e.content.to_s.downcase.include?(q) }.last(limit)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# @see Store#store_fact
|
|
62
|
-
def store_fact(agent_id:, key:, value:, confidence: 1.0) # rubocop:disable Metrics/MethodLength
|
|
63
|
-
@mutex.synchronize do
|
|
64
|
-
@facts[agent_id] ||= {}
|
|
65
|
-
fact = Fact.new(
|
|
66
|
-
id: next_id,
|
|
67
|
-
agent_id: agent_id,
|
|
68
|
-
key: key.to_s,
|
|
69
|
-
value: value,
|
|
70
|
-
confidence: confidence,
|
|
71
|
-
updated_at: Time.now.to_i
|
|
72
|
-
)
|
|
73
|
-
@facts[agent_id][key.to_s] = fact
|
|
74
|
-
fact
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# @see Store#facts
|
|
79
|
-
def facts(agent_id:)
|
|
80
|
-
@mutex.synchronize { (@facts[agent_id] || {}).dup }
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# @see Store#record_reflection
|
|
84
|
-
def record_reflection(agent_id:, summary:, system_patch: nil, applied: false) # rubocop:disable Metrics/MethodLength
|
|
85
|
-
@mutex.synchronize do
|
|
86
|
-
rec = ReflectionRecord.new(
|
|
87
|
-
id: next_id,
|
|
88
|
-
agent_id: agent_id,
|
|
89
|
-
ts: Time.now.to_i,
|
|
90
|
-
summary: summary,
|
|
91
|
-
system_patch: system_patch,
|
|
92
|
-
applied: applied
|
|
93
|
-
)
|
|
94
|
-
@reflections << rec
|
|
95
|
-
rec
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# @see Store#reflections
|
|
100
|
-
def reflections(agent_id:, applied: nil)
|
|
101
|
-
@mutex.synchronize do
|
|
102
|
-
result = @reflections.select { |r| r.agent_id == agent_id }
|
|
103
|
-
applied.nil? ? result : result.select { |r| r.applied == applied }
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# @see Store#apply_reflection
|
|
108
|
-
def apply_reflection(id:)
|
|
109
|
-
@mutex.synchronize do
|
|
110
|
-
rec = @reflections.find { |r| r.id == id }
|
|
111
|
-
return false unless rec
|
|
112
|
-
|
|
113
|
-
idx = @reflections.index(rec)
|
|
114
|
-
@reflections[idx] = ReflectionRecord.new(**rec.to_h.merge(applied: true))
|
|
115
|
-
true
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# @see Store#clear
|
|
120
|
-
def clear(agent_id:)
|
|
121
|
-
@mutex.synchronize do
|
|
122
|
-
@episodes.reject! { |e| e.agent_id == agent_id }
|
|
123
|
-
@facts.delete(agent_id)
|
|
124
|
-
@reflections.reject! { |r| r.agent_id == agent_id }
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
private
|
|
129
|
-
|
|
130
|
-
def next_id
|
|
131
|
-
@seq += 1
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
end
|