igniter 0.5.1 → 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.
Files changed (1132) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +169 -215
  3. data/docs/README.md +12 -15
  4. data/docs/assets/README.md +8 -0
  5. data/docs/concepts/README.md +18 -0
  6. data/docs/concepts/igniter.md +119 -0
  7. data/docs/dev/README.md +48 -0
  8. data/docs/dev/agent-orchestra-dna.md +271 -0
  9. data/docs/dev/ai-agents-target-plan.md +178 -0
  10. data/docs/dev/application-target-plan.md +45 -0
  11. data/docs/dev/application-web-integration.md +59 -0
  12. data/docs/dev/application-web-poc-pattern-guide.md +167 -0
  13. data/docs/dev/architect-supervisor-bootstrap.md +322 -0
  14. data/docs/dev/architecture.md +20 -0
  15. data/docs/dev/cluster-target-plan.md +43 -0
  16. data/docs/dev/contract-persistence-target-plan.md +426 -0
  17. data/docs/dev/current-runtime-snapshot.md +73 -0
  18. data/docs/dev/data-ownership.md +29 -0
  19. data/docs/dev/document-rotation.md +51 -0
  20. data/docs/dev/embed-target-plan.md +51 -0
  21. data/docs/dev/execution-model.md +324 -0
  22. data/docs/dev/igniter-web-dsl-sketch.md +151 -0
  23. data/docs/dev/igniter-web-target-plan.md +56 -0
  24. data/docs/dev/mcp-adapter-package-spec.md +81 -0
  25. data/docs/dev/module-system.md +46 -0
  26. data/docs/dev/package-map.md +112 -0
  27. data/docs/guide/README.md +77 -0
  28. data/docs/guide/ai-and-tools.md +33 -0
  29. data/docs/guide/api-and-runtime.md +38 -0
  30. data/docs/guide/app.md +45 -0
  31. data/docs/guide/application-capsules.md +139 -0
  32. data/docs/guide/application-showcase-portfolio.md +181 -0
  33. data/docs/guide/cli.md +70 -0
  34. data/docs/guide/cluster.md +55 -0
  35. data/docs/guide/configuration.md +31 -0
  36. data/docs/guide/contract-class-dsl.md +154 -0
  37. data/docs/guide/core-runtime-features.md +34 -0
  38. data/docs/guide/core.md +43 -0
  39. data/docs/guide/credentials.md +51 -0
  40. data/docs/guide/deployment-modes.md +63 -0
  41. data/docs/guide/distributed-workflows.md +21 -0
  42. data/docs/guide/getting-started.md +49 -0
  43. data/docs/guide/how-tos.md +33 -0
  44. data/docs/guide/igniter-lang-foundation.md +133 -0
  45. data/docs/guide/integrations.md +47 -0
  46. data/docs/guide/interactive-app-structure.md +91 -0
  47. data/docs/guide/store-adapters.md +183 -0
  48. data/docs/research/README.md +131 -0
  49. data/docs/research/contract-persistence-landing-zone.md +126 -0
  50. data/docs/research/contract-persistence-organic-model.md +279 -0
  51. data/docs/research/contract-persistence-organic-model.ru.md +277 -0
  52. data/docs/research/horizon-protocol.md +180 -0
  53. data/docs/research/igniter-lang-convergence-report.md +338 -0
  54. data/docs/research/project-status-horizon-report.md +363 -0
  55. data/docs/research/vision-handoff-protocol.md +141 -0
  56. data/docs/research/wizard-type-spec-architecture.md +293 -0
  57. data/docs/research/wizard-type-spec-research-request.md +134 -0
  58. data/docs/store/README.md +7 -0
  59. data/docs/store/convergence-audit.md +901 -0
  60. data/examples/README.md +148 -65
  61. data/examples/catalog.rb +1374 -300
  62. data/examples/cluster/incident_workflow.rb +70 -0
  63. data/examples/cluster/incidents.rb +63 -0
  64. data/examples/cluster/mesh_diagnostics.rb +89 -0
  65. data/examples/cluster/remediation.rb +63 -0
  66. data/examples/cluster/routing.rb +65 -0
  67. data/examples/contracts/aggregates.rb +39 -0
  68. data/examples/contracts/auditing.rb +35 -0
  69. data/examples/contracts/basic_pricing.rb +31 -0
  70. data/examples/contracts/branching.rb +36 -0
  71. data/examples/contracts/build_effect_executor_pack.rb +88 -0
  72. data/examples/contracts/build_your_own_pack.rb +82 -0
  73. data/examples/contracts/capabilities.rb +34 -0
  74. data/examples/contracts/class_callable.rb +45 -0
  75. data/examples/contracts/class_pricing.rb +32 -0
  76. data/examples/contracts/collection.rb +44 -0
  77. data/examples/contracts/commerce.rb +44 -0
  78. data/examples/contracts/compose_your_own_packs.rb +110 -0
  79. data/examples/contracts/composition.rb +61 -0
  80. data/examples/contracts/content_addressing.rb +33 -0
  81. data/examples/contracts/contractable_service.rb +43 -0
  82. data/examples/contracts/contractable_shadow.rb +69 -0
  83. data/examples/contracts/create_pack.rb +105 -0
  84. data/examples/contracts/dataflow.rb +57 -0
  85. data/examples/contracts/debug.rb +32 -0
  86. data/examples/contracts/debug_pack_authoring.rb +31 -0
  87. data/examples/contracts/diagnostics.rb +33 -0
  88. data/examples/contracts/differential.rb +97 -0
  89. data/examples/contracts/effects.rb +34 -0
  90. data/examples/contracts/embed_class_registration.rb +40 -0
  91. data/examples/contracts/embed_human_sugar.rb +106 -0
  92. data/examples/contracts/formula.rb +32 -0
  93. data/examples/contracts/incremental.rb +44 -0
  94. data/examples/contracts/introspection.rb +48 -0
  95. data/examples/contracts/invariants.rb +54 -0
  96. data/examples/contracts/journal.rb +37 -0
  97. data/examples/contracts/lang_foundation.rb +37 -0
  98. data/examples/contracts/mcp.rb +62 -0
  99. data/examples/contracts/mcp_host.rb +55 -0
  100. data/examples/contracts/mcp_server.rb +25 -0
  101. data/examples/contracts/piecewise.rb +30 -0
  102. data/examples/contracts/provenance.rb +55 -0
  103. data/examples/contracts/reactive.rb +62 -0
  104. data/examples/contracts/saga.rb +56 -0
  105. data/examples/contracts/scale.rb +30 -0
  106. data/examples/contracts/step_result.rb +58 -0
  107. data/examples/run.rb +9 -9
  108. data/lib/igniter/cluster.rb +3 -0
  109. data/lib/igniter/contract.rb +3 -0
  110. data/lib/igniter/monorepo_packages.rb +8 -9
  111. data/lib/igniter/version.rb +5 -0
  112. data/lib/igniter/web.rb +3 -0
  113. data/lib/igniter.rb +46 -54
  114. data/packages/igniter-agents/README.md +37 -15
  115. data/packages/igniter-agents/lib/igniter/agents/agent_definition.rb +26 -0
  116. data/packages/igniter-agents/lib/igniter/agents/agent_run.rb +47 -0
  117. data/packages/igniter-agents/lib/igniter/agents/agent_turn.rb +34 -0
  118. data/packages/igniter-agents/lib/igniter/agents/runner.rb +56 -0
  119. data/packages/igniter-agents/lib/igniter/agents/tool_call.rb +26 -0
  120. data/packages/igniter-agents/lib/igniter/agents/trace_event.rb +24 -0
  121. data/packages/igniter-agents/lib/igniter/agents.rb +25 -15
  122. data/packages/igniter-agents/lib/igniter-agents.rb +0 -4
  123. data/packages/igniter-ai/README.md +35 -13
  124. data/packages/igniter-ai/lib/igniter/ai/client.rb +18 -0
  125. data/packages/igniter-ai/lib/igniter/ai/error.rb +14 -0
  126. data/packages/igniter-ai/lib/igniter/ai/model_request.rb +28 -0
  127. data/packages/igniter-ai/lib/igniter/ai/model_response.rb +31 -0
  128. data/packages/igniter-ai/lib/igniter/ai/providers/fake.rb +24 -0
  129. data/packages/igniter-ai/lib/igniter/ai/providers/openai_responses.rb +100 -0
  130. data/packages/igniter-ai/lib/igniter/ai/providers/recorded.rb +40 -0
  131. data/packages/igniter-ai/lib/igniter/ai/usage.rb +32 -0
  132. data/packages/igniter-ai/lib/igniter/ai.rb +14 -84
  133. data/packages/igniter-application/README.md +194 -0
  134. data/packages/igniter-application/lib/igniter/application/agent_definition.rb +38 -0
  135. data/packages/igniter-application/lib/igniter/application/agent_registry.rb +33 -0
  136. data/packages/igniter-application/lib/igniter/application/agent_runtime.rb +29 -0
  137. data/packages/igniter-application/lib/igniter/application/agents_builder.rb +26 -0
  138. data/packages/igniter-application/lib/igniter/application/ai_builder.rb +26 -0
  139. data/packages/igniter-application/lib/igniter/application/ai_provider_definition.rb +59 -0
  140. data/packages/igniter-application/lib/igniter/application/ai_registry.rb +34 -0
  141. data/packages/igniter-application/lib/igniter/application/application_assembly_plan.rb +67 -0
  142. data/packages/igniter-application/lib/igniter/application/application_blueprint.rb +227 -0
  143. data/packages/igniter-application/lib/igniter/application/application_capsule_report.rb +61 -0
  144. data/packages/igniter-application/lib/igniter/application/application_composition_report.rb +161 -0
  145. data/packages/igniter-application/lib/igniter/application/application_handoff_manifest.rb +100 -0
  146. data/packages/igniter-application/lib/igniter/application/application_host_activation_commit_readiness.rb +182 -0
  147. data/packages/igniter-application/lib/igniter/application/application_host_activation_dry_run_result.rb +190 -0
  148. data/packages/igniter-application/lib/igniter/application/application_host_activation_ledger_commit.rb +285 -0
  149. data/packages/igniter-application/lib/igniter/application/application_host_activation_ledger_verification.rb +301 -0
  150. data/packages/igniter-application/lib/igniter/application/application_host_activation_operation_digest.rb +68 -0
  151. data/packages/igniter-application/lib/igniter/application/application_host_activation_plan.rb +200 -0
  152. data/packages/igniter-application/lib/igniter/application/application_host_activation_plan_verification.rb +140 -0
  153. data/packages/igniter-application/lib/igniter/application/application_host_activation_readiness.rb +226 -0
  154. data/packages/igniter-application/lib/igniter/application/application_host_activation_receipt.rb +151 -0
  155. data/packages/igniter-application/lib/igniter/application/application_layout.rb +91 -0
  156. data/packages/igniter-application/lib/igniter/application/application_load_path.rb +38 -0
  157. data/packages/igniter-application/lib/igniter/application/application_load_report.rb +74 -0
  158. data/packages/igniter-application/lib/igniter/application/application_manifest.rb +65 -0
  159. data/packages/igniter-application/lib/igniter/application/application_structure_entry.rb +58 -0
  160. data/packages/igniter-application/lib/igniter/application/application_structure_plan.rb +128 -0
  161. data/packages/igniter-application/lib/igniter/application/application_transfer_applied_verification.rb +301 -0
  162. data/packages/igniter-application/lib/igniter/application/application_transfer_apply_plan.rb +167 -0
  163. data/packages/igniter-application/lib/igniter/application/application_transfer_apply_result.rb +321 -0
  164. data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_artifact.rb +160 -0
  165. data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_plan.rb +125 -0
  166. data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_verification.rb +154 -0
  167. data/packages/igniter-application/lib/igniter/application/application_transfer_intake_plan.rb +195 -0
  168. data/packages/igniter-application/lib/igniter/application/application_transfer_inventory.rb +153 -0
  169. data/packages/igniter-application/lib/igniter/application/application_transfer_readiness.rb +260 -0
  170. data/packages/igniter-application/lib/igniter/application/application_transfer_receipt.rb +179 -0
  171. data/packages/igniter-application/lib/igniter/application/artifact_reference.rb +39 -0
  172. data/packages/igniter-application/lib/igniter/application/boot_phase.rb +27 -0
  173. data/packages/igniter-application/lib/igniter/application/boot_plan.rb +55 -0
  174. data/packages/igniter-application/lib/igniter/application/boot_report.rb +70 -0
  175. data/packages/igniter-application/lib/igniter/application/capsule_builder.rb +396 -0
  176. data/packages/igniter-application/lib/igniter/application/capsule_export.rb +26 -0
  177. data/packages/igniter-application/lib/igniter/application/capsule_import.rb +38 -0
  178. data/packages/igniter-application/lib/igniter/application/collection_invoker.rb +54 -0
  179. data/packages/igniter-application/lib/igniter/application/collection_transport_adapter.rb +37 -0
  180. data/packages/igniter-application/lib/igniter/application/compose_invoker.rb +51 -0
  181. data/packages/igniter-application/lib/igniter/application/compose_transport_adapter.rb +34 -0
  182. data/packages/igniter-application/lib/igniter/application/config.rb +86 -0
  183. data/packages/igniter-application/lib/igniter/application/config_builder.rb +69 -0
  184. data/packages/igniter-application/lib/igniter/application/contract_registry.rb +30 -0
  185. data/packages/igniter-application/lib/igniter/application/credential_definition.rb +65 -0
  186. data/packages/igniter-application/lib/igniter/application/credential_store.rb +68 -0
  187. data/packages/igniter-application/lib/igniter/application/embedded_host.rb +23 -0
  188. data/packages/igniter-application/lib/igniter/application/environment.rb +1071 -0
  189. data/packages/igniter-application/lib/igniter/application/feature_slice.rb +61 -0
  190. data/packages/igniter-application/lib/igniter/application/feature_slice_report.rb +43 -0
  191. data/packages/igniter-application/lib/igniter/application/file_backed_host_activation_ledger_adapter.rb +138 -0
  192. data/packages/igniter-application/lib/igniter/application/file_backed_installed_capsule_registry.rb +132 -0
  193. data/packages/igniter-application/lib/igniter/application/flow_declaration.rb +62 -0
  194. data/packages/igniter-application/lib/igniter/application/flow_event.rb +50 -0
  195. data/packages/igniter-application/lib/igniter/application/flow_session_snapshot.rb +98 -0
  196. data/packages/igniter-application/lib/igniter/application/installed_capsule_entry.rb +47 -0
  197. data/packages/igniter-application/lib/igniter/application/interface.rb +11 -0
  198. data/packages/igniter-application/lib/igniter/application/kernel.rb +385 -0
  199. data/packages/igniter-application/lib/igniter/application/lifecycle_plan_step.rb +38 -0
  200. data/packages/igniter-application/lib/igniter/application/manual_loader.rb +18 -0
  201. data/packages/igniter-application/lib/igniter/application/manual_scheduler.rb +15 -0
  202. data/packages/igniter-application/lib/igniter/application/memory_session_store.rb +33 -0
  203. data/packages/igniter-application/lib/igniter/application/missing_credential_error.rb +23 -0
  204. data/packages/igniter-application/lib/igniter/application/mount_intent.rb +48 -0
  205. data/packages/igniter-application/lib/igniter/application/mount_registration.rb +49 -0
  206. data/packages/igniter-application/lib/igniter/application/pending_action.rb +39 -0
  207. data/packages/igniter-application/lib/igniter/application/pending_input.rb +45 -0
  208. data/packages/igniter-application/lib/igniter/application/plan_executor.rb +93 -0
  209. data/packages/igniter-application/lib/igniter/application/profile.rb +178 -0
  210. data/packages/igniter-application/lib/igniter/application/provider.rb +19 -0
  211. data/packages/igniter-application/lib/igniter/application/provider_lifecycle_report.rb +72 -0
  212. data/packages/igniter-application/lib/igniter/application/provider_lifecycle_result.rb +54 -0
  213. data/packages/igniter-application/lib/igniter/application/provider_registration.rb +19 -0
  214. data/packages/igniter-application/lib/igniter/application/rack_host.rb +311 -0
  215. data/packages/igniter-application/lib/igniter/application/seam_lifecycle_result.rb +62 -0
  216. data/packages/igniter-application/lib/igniter/application/service_definition.rb +25 -0
  217. data/packages/igniter-application/lib/igniter/application/service_registry.rb +58 -0
  218. data/packages/igniter-application/lib/igniter/application/session_entry.rb +46 -0
  219. data/packages/igniter-application/lib/igniter/application/shutdown_plan.rb +45 -0
  220. data/packages/igniter-application/lib/igniter/application/shutdown_report.rb +54 -0
  221. data/packages/igniter-application/lib/igniter/application/snapshot.rb +35 -0
  222. data/packages/igniter-application/lib/igniter/application/transport_request.rb +40 -0
  223. data/packages/igniter-application/lib/igniter/application/transport_response.rb +22 -0
  224. data/packages/igniter-application/lib/igniter/application.rb +354 -0
  225. data/packages/igniter-application/lib/igniter-application.rb +3 -0
  226. data/packages/igniter-cluster/README.md +112 -5
  227. data/packages/igniter-cluster/lib/igniter/cluster/active_incident_set.rb +40 -0
  228. data/packages/igniter-cluster/lib/igniter/cluster/admission_policy.rb +158 -0
  229. data/packages/igniter-cluster/lib/igniter/cluster/admission_result.rb +47 -0
  230. data/packages/igniter-cluster/lib/igniter/cluster/capability_catalog.rb +66 -0
  231. data/packages/igniter-cluster/lib/igniter/cluster/capability_definition.rb +42 -0
  232. data/packages/igniter-cluster/lib/igniter/cluster/capability_query.rb +162 -0
  233. data/packages/igniter-cluster/lib/igniter/cluster/capability_router.rb +11 -0
  234. data/packages/igniter-cluster/lib/igniter/cluster/cluster_diagnostics_executor.rb +184 -0
  235. data/packages/igniter-cluster/lib/igniter/cluster/cluster_diagnostics_report.rb +49 -0
  236. data/packages/igniter-cluster/lib/igniter/cluster/cluster_event.rb +34 -0
  237. data/packages/igniter-cluster/lib/igniter/cluster/cluster_event_log.rb +27 -0
  238. data/packages/igniter-cluster/lib/igniter/cluster/cluster_incident.rb +42 -0
  239. data/packages/igniter-cluster/lib/igniter/cluster/decision_explanation.rb +31 -0
  240. data/packages/igniter-cluster/lib/igniter/cluster/direct_placement.rb +11 -0
  241. data/packages/igniter-cluster/lib/igniter/cluster/discovery_feed.rb +22 -0
  242. data/packages/igniter-cluster/lib/igniter/cluster/environment.rb +380 -0
  243. data/packages/igniter-cluster/lib/igniter/cluster/errors.rb +9 -0
  244. data/packages/igniter-cluster/lib/igniter/cluster/failover_plan.rb +45 -0
  245. data/packages/igniter-cluster/lib/igniter/cluster/failover_step.rb +32 -0
  246. data/packages/igniter-cluster/lib/igniter/cluster/health_policy.rb +124 -0
  247. data/packages/igniter-cluster/lib/igniter/cluster/incident_action.rb +49 -0
  248. data/packages/igniter-cluster/lib/igniter/cluster/incident_entry.rb +98 -0
  249. data/packages/igniter-cluster/lib/igniter/cluster/incident_executor.rb +145 -0
  250. data/packages/igniter-cluster/lib/igniter/cluster/incident_workflow.rb +64 -0
  251. data/packages/igniter-cluster/lib/igniter/cluster/kernel.rb +75 -0
  252. data/packages/igniter-cluster/lib/igniter/cluster/kernel_seams.rb +249 -0
  253. data/packages/igniter-cluster/lib/igniter/cluster/lease_grant.rb +40 -0
  254. data/packages/igniter-cluster/lib/igniter/cluster/lease_plan.rb +40 -0
  255. data/packages/igniter-cluster/lib/igniter/cluster/lease_policy.rb +96 -0
  256. data/packages/igniter-cluster/lib/igniter/cluster/membership_delta.rb +36 -0
  257. data/packages/igniter-cluster/lib/igniter/cluster/membership_feed.rb +24 -0
  258. data/packages/igniter-cluster/lib/igniter/cluster/membership_projection.rb +45 -0
  259. data/packages/igniter-cluster/lib/igniter/cluster/membership_snapshot.rb +64 -0
  260. data/packages/igniter-cluster/lib/igniter/cluster/memory_incident_registry.rb +169 -0
  261. data/packages/igniter-cluster/lib/igniter/cluster/memory_peer_registry.rb +24 -0
  262. data/packages/igniter-cluster/lib/igniter/cluster/mesh_admission.rb +24 -0
  263. data/packages/igniter-cluster/lib/igniter/cluster/mesh_admission_result.rb +40 -0
  264. data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_attempt.rb +51 -0
  265. data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_request.rb +71 -0
  266. data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_response.rb +28 -0
  267. data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_trace.rb +32 -0
  268. data/packages/igniter-cluster/lib/igniter/cluster/mesh_executor.rb +497 -0
  269. data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership.rb +89 -0
  270. data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership_event.rb +32 -0
  271. data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership_source.rb +49 -0
  272. data/packages/igniter-cluster/lib/igniter/cluster/mesh_retry_policy.rb +42 -0
  273. data/packages/igniter-cluster/lib/igniter/cluster/mesh_trust_policy.rb +131 -0
  274. data/packages/igniter-cluster/lib/igniter/cluster/operator_timeline.rb +33 -0
  275. data/packages/igniter-cluster/lib/igniter/cluster/ownership_claim.rb +30 -0
  276. data/packages/igniter-cluster/lib/igniter/cluster/ownership_plan.rb +40 -0
  277. data/packages/igniter-cluster/lib/igniter/cluster/ownership_policy.rb +100 -0
  278. data/packages/igniter-cluster/lib/igniter/cluster/peer.rb +86 -0
  279. data/packages/igniter-cluster/lib/igniter/cluster/peer_discovery.rb +62 -0
  280. data/packages/igniter-cluster/lib/igniter/cluster/peer_health.rb +55 -0
  281. data/packages/igniter-cluster/lib/igniter/cluster/peer_profile.rb +102 -0
  282. data/packages/igniter-cluster/lib/igniter/cluster/peer_topology.rb +62 -0
  283. data/packages/igniter-cluster/lib/igniter/cluster/peer_view.rb +42 -0
  284. data/packages/igniter-cluster/lib/igniter/cluster/permissive_admission.rb +11 -0
  285. data/packages/igniter-cluster/lib/igniter/cluster/placement_decision.rb +38 -0
  286. data/packages/igniter-cluster/lib/igniter/cluster/placement_policy.rb +131 -0
  287. data/packages/igniter-cluster/lib/igniter/cluster/plan_action_result.rb +72 -0
  288. data/packages/igniter-cluster/lib/igniter/cluster/plan_execution_report.rb +57 -0
  289. data/packages/igniter-cluster/lib/igniter/cluster/plan_executor.rb +314 -0
  290. data/packages/igniter-cluster/lib/igniter/cluster/policy_admission.rb +18 -0
  291. data/packages/igniter-cluster/lib/igniter/cluster/policy_placement.rb +69 -0
  292. data/packages/igniter-cluster/lib/igniter/cluster/policy_router.rb +70 -0
  293. data/packages/igniter-cluster/lib/igniter/cluster/profile.rb +97 -0
  294. data/packages/igniter-cluster/lib/igniter/cluster/projection_executor.rb +42 -0
  295. data/packages/igniter-cluster/lib/igniter/cluster/projection_policy.rb +107 -0
  296. data/packages/igniter-cluster/lib/igniter/cluster/projection_report.rb +35 -0
  297. data/packages/igniter-cluster/lib/igniter/cluster/projection_stage.rb +32 -0
  298. data/packages/igniter-cluster/lib/igniter/cluster/rebalance_move.rb +30 -0
  299. data/packages/igniter-cluster/lib/igniter/cluster/rebalance_plan.rb +40 -0
  300. data/packages/igniter-cluster/lib/igniter/cluster/recovery_timeline.rb +33 -0
  301. data/packages/igniter-cluster/lib/igniter/cluster/registry_membership_source.rb +97 -0
  302. data/packages/igniter-cluster/lib/igniter/cluster/remediation_plan.rb +45 -0
  303. data/packages/igniter-cluster/lib/igniter/cluster/remediation_policy.rb +119 -0
  304. data/packages/igniter-cluster/lib/igniter/cluster/remediation_step.rb +44 -0
  305. data/packages/igniter-cluster/lib/igniter/cluster/route.rb +34 -0
  306. data/packages/igniter-cluster/lib/igniter/cluster/route_policy.rb +104 -0
  307. data/packages/igniter-cluster/lib/igniter/cluster/route_request.rb +61 -0
  308. data/packages/igniter-cluster/lib/igniter/cluster/topology_policy.rb +154 -0
  309. data/packages/igniter-cluster/lib/igniter/cluster/transport_adapter.rb +53 -0
  310. data/packages/igniter-cluster/lib/igniter/cluster.rb +94 -57
  311. data/packages/igniter-contracts/README.md +239 -0
  312. data/packages/igniter-contracts/lib/igniter/contracts/api.rb +92 -0
  313. data/packages/igniter-contracts/lib/igniter/contracts/assembly/baseline_pack.rb +141 -0
  314. data/packages/igniter-contracts/lib/igniter/contracts/assembly/const_pack.rb +29 -0
  315. data/packages/igniter-contracts/lib/igniter/contracts/assembly/dsl_keyword.rb +21 -0
  316. data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_result_policies.rb +47 -0
  317. data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_spec.rb +73 -0
  318. data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_specs.rb +74 -0
  319. data/packages/igniter-contracts/lib/igniter/contracts/assembly/kernel.rb +220 -0
  320. data/packages/igniter-contracts/lib/igniter/contracts/assembly/node_type.rb +26 -0
  321. data/packages/igniter-contracts/lib/igniter/contracts/assembly/ordered_registry.rb +55 -0
  322. data/packages/igniter-contracts/lib/igniter/contracts/assembly/pack.rb +13 -0
  323. data/packages/igniter-contracts/lib/igniter/contracts/assembly/pack_manifest.rb +131 -0
  324. data/packages/igniter-contracts/lib/igniter/contracts/assembly/path_access.rb +76 -0
  325. data/packages/igniter-contracts/lib/igniter/contracts/assembly/profile.rb +133 -0
  326. data/packages/igniter-contracts/lib/igniter/contracts/assembly/project_pack.rb +42 -0
  327. data/packages/igniter-contracts/lib/igniter/contracts/assembly/registry.rb +57 -0
  328. data/packages/igniter-contracts/lib/igniter/contracts/assembly/step_result_pack.rb +42 -0
  329. data/packages/igniter-contracts/lib/igniter/contracts/assembly.rb +18 -0
  330. data/packages/igniter-contracts/lib/igniter/contracts/contract.rb +135 -0
  331. data/packages/igniter-contracts/lib/igniter/contracts/contractable.rb +288 -0
  332. data/packages/igniter-contracts/lib/igniter/contracts/environment.rb +51 -0
  333. data/packages/igniter-contracts/lib/igniter/contracts/errors.rb +47 -0
  334. data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_normalizers.rb +23 -0
  335. data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_runtime.rb +55 -0
  336. data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_validators.rb +113 -0
  337. data/packages/igniter-contracts/lib/igniter/contracts/execution/builder.rb +43 -0
  338. data/packages/igniter-contracts/lib/igniter/contracts/execution/compilation_report.rb +46 -0
  339. data/packages/igniter-contracts/lib/igniter/contracts/execution/compiled_graph.rb +21 -0
  340. data/packages/igniter-contracts/lib/igniter/contracts/execution/compiler.rb +66 -0
  341. data/packages/igniter-contracts/lib/igniter/contracts/execution/const_runtime.rb +15 -0
  342. data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics.rb +24 -0
  343. data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics_report.rb +40 -0
  344. data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics_section.rb +37 -0
  345. data/packages/igniter-contracts/lib/igniter/contracts/execution/effect_invocation.rb +26 -0
  346. data/packages/igniter-contracts/lib/igniter/contracts/execution/execution_request.rb +28 -0
  347. data/packages/igniter-contracts/lib/igniter/contracts/execution/execution_result.rb +32 -0
  348. data/packages/igniter-contracts/lib/igniter/contracts/execution/inline_executor.rb +19 -0
  349. data/packages/igniter-contracts/lib/igniter/contracts/execution/mutable_named_values.rb +52 -0
  350. data/packages/igniter-contracts/lib/igniter/contracts/execution/named_values.rb +48 -0
  351. data/packages/igniter-contracts/lib/igniter/contracts/execution/operation.rb +42 -0
  352. data/packages/igniter-contracts/lib/igniter/contracts/execution/runtime.rb +43 -0
  353. data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result.rb +51 -0
  354. data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_diagnostics.rb +35 -0
  355. data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_runtime.rb +51 -0
  356. data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_validators.rb +44 -0
  357. data/packages/igniter-contracts/lib/igniter/contracts/execution/structured_dump.rb +49 -0
  358. data/packages/igniter-contracts/lib/igniter/contracts/execution/validation_finding.rb +28 -0
  359. data/packages/igniter-contracts/lib/igniter/contracts/execution/validation_report.rb +46 -0
  360. data/packages/igniter-contracts/lib/igniter/contracts/execution.rb +28 -0
  361. data/packages/igniter-contracts/lib/igniter/contracts.rb +54 -0
  362. data/packages/igniter-contracts/lib/igniter/lang/backend.rb +19 -0
  363. data/packages/igniter-contracts/lib/igniter/lang/backends/ruby.rb +42 -0
  364. data/packages/igniter-contracts/lib/igniter/lang/diagnostic_payload.rb +174 -0
  365. data/packages/igniter-contracts/lib/igniter/lang/metadata_carrier_manifest.rb +112 -0
  366. data/packages/igniter-contracts/lib/igniter/lang/metadata_manifest.rb +128 -0
  367. data/packages/igniter-contracts/lib/igniter/lang/receipt_payload.rb +152 -0
  368. data/packages/igniter-contracts/lib/igniter/lang/schema_compatibility_diagnostic.rb +300 -0
  369. data/packages/igniter-contracts/lib/igniter/lang/types.rb +84 -0
  370. data/packages/igniter-contracts/lib/igniter/lang/verification_report.rb +226 -0
  371. data/packages/igniter-contracts/lib/igniter/lang.rb +27 -0
  372. data/packages/igniter-contracts/lib/igniter-contracts.rb +3 -0
  373. data/packages/igniter-embed/README.md +360 -0
  374. data/packages/igniter-embed/lib/igniter/embed/config.rb +155 -0
  375. data/packages/igniter-embed/lib/igniter/embed/container.rb +165 -0
  376. data/packages/igniter-embed/lib/igniter/embed/contract_handle.rb +23 -0
  377. data/packages/igniter-embed/lib/igniter/embed/contract_naming.rb +38 -0
  378. data/packages/igniter-embed/lib/igniter/embed/contractable/acceptance.rb +52 -0
  379. data/packages/igniter-embed/lib/igniter/embed/contractable/adapters.rb +33 -0
  380. data/packages/igniter-embed/lib/igniter/embed/contractable/config.rb +234 -0
  381. data/packages/igniter-embed/lib/igniter/embed/contractable/runner.rb +393 -0
  382. data/packages/igniter-embed/lib/igniter/embed/contractable/sugar_builder.rb +145 -0
  383. data/packages/igniter-embed/lib/igniter/embed/contractable.rb +29 -0
  384. data/packages/igniter-embed/lib/igniter/embed/contracts_builder.rb +54 -0
  385. data/packages/igniter-embed/lib/igniter/embed/errors.rb +14 -0
  386. data/packages/igniter-embed/lib/igniter/embed/execution_envelope.rb +50 -0
  387. data/packages/igniter-embed/lib/igniter/embed/host_builder.rb +39 -0
  388. data/packages/igniter-embed/lib/igniter/embed/rails.rb +21 -0
  389. data/packages/igniter-embed/lib/igniter/embed/registry.rb +78 -0
  390. data/packages/igniter-embed/lib/igniter/embed/sugar_expansion.rb +152 -0
  391. data/packages/igniter-embed/lib/igniter/embed.rb +38 -0
  392. data/packages/igniter-embed/lib/igniter-embed.rb +3 -0
  393. data/packages/igniter-extensions/README.md +364 -4
  394. data/packages/igniter-extensions/lib/igniter/extensions/contracts/aggregate_pack.rb +103 -0
  395. data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/builder.rb +132 -0
  396. data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/event.rb +34 -0
  397. data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/snapshot.rb +44 -0
  398. data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit_pack.rb +60 -0
  399. data/packages/igniter-extensions/lib/igniter/extensions/contracts/branch_pack.rb +199 -0
  400. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/declaration.rb +31 -0
  401. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/error.rb +35 -0
  402. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/policy.rb +20 -0
  403. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/report.rb +47 -0
  404. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/violation.rb +30 -0
  405. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities_pack.rb +146 -0
  406. data/packages/igniter-extensions/lib/igniter/extensions/contracts/collection_pack.rb +212 -0
  407. data/packages/igniter-extensions/lib/igniter/extensions/contracts/commerce_pack.rb +91 -0
  408. data/packages/igniter-extensions/lib/igniter/extensions/contracts/compose_pack.rb +213 -0
  409. data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/cache.rb +59 -0
  410. data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/content_key.rb +63 -0
  411. data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/declaration.rb +47 -0
  412. data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing_pack.rb +90 -0
  413. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/profile.rb +196 -0
  414. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/report.rb +85 -0
  415. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/scaffold.rb +461 -0
  416. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/scope.rb +79 -0
  417. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/wizard.rb +269 -0
  418. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/workflow.rb +189 -0
  419. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/workflow_step.rb +51 -0
  420. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/write_result.rb +48 -0
  421. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/write_step.rb +63 -0
  422. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/writer.rb +131 -0
  423. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator_pack.rb +128 -0
  424. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/aggregate_operators.rb +119 -0
  425. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/aggregate_state.rb +60 -0
  426. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/builder.rb +66 -0
  427. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/collection_result.rb +70 -0
  428. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/diff.rb +37 -0
  429. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/item_result.rb +44 -0
  430. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/result.rb +58 -0
  431. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/session.rb +173 -0
  432. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/window_filter.rb +49 -0
  433. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow_pack.rb +66 -0
  434. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/pack_audit.rb +181 -0
  435. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/pack_snapshot.rb +46 -0
  436. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/profile_snapshot.rb +50 -0
  437. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/report.rb +50 -0
  438. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug_pack.rb +115 -0
  439. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/divergence.rb +37 -0
  440. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/formatter.rb +85 -0
  441. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/report.rb +83 -0
  442. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/runner.rb +136 -0
  443. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential_pack.rb +61 -0
  444. data/packages/igniter-extensions/lib/igniter/extensions/contracts/execution_report_pack.rb +38 -0
  445. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/formatter.rb +60 -0
  446. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/node_state.rb +30 -0
  447. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/result.rb +65 -0
  448. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/session.rb +146 -0
  449. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental_pack.rb +40 -0
  450. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/builder.rb +27 -0
  451. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/cases_report.rb +47 -0
  452. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/error.rb +34 -0
  453. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/invariant.rb +30 -0
  454. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/report.rb +45 -0
  455. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/suite.rb +36 -0
  456. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/violation.rb +39 -0
  457. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants_pack.rb +88 -0
  458. data/packages/igniter-extensions/lib/igniter/extensions/contracts/journal_pack.rb +55 -0
  459. data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/formula_pack.rb +185 -0
  460. data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/piecewise_pack.rb +166 -0
  461. data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/scale_pack.rb +147 -0
  462. data/packages/igniter-extensions/lib/igniter/extensions/contracts/lookup_pack.rb +50 -0
  463. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/creator_session.rb +105 -0
  464. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_argument.rb +35 -0
  465. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_definition.rb +33 -0
  466. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_result.rb +28 -0
  467. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp_pack.rb +335 -0
  468. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/builder.rb +80 -0
  469. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/lineage.rb +59 -0
  470. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/node_trace.rb +53 -0
  471. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/text_formatter.rb +62 -0
  472. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance_pack.rb +52 -0
  473. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/builder.rb +43 -0
  474. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/dispatch_result.rb +59 -0
  475. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/engine.rb +79 -0
  476. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/event.rb +36 -0
  477. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/matcher.rb +20 -0
  478. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/plan.rb +58 -0
  479. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/subscription.rb +29 -0
  480. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive_pack.rb +169 -0
  481. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation.rb +25 -0
  482. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation_record.rb +28 -0
  483. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation_set.rb +47 -0
  484. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/formatter.rb +39 -0
  485. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/result.rb +56 -0
  486. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/runner.rb +124 -0
  487. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga_pack.rb +56 -0
  488. data/packages/igniter-extensions/lib/igniter/extensions/contracts.rb +445 -0
  489. data/packages/igniter-extensions/lib/igniter/extensions.rb +0 -2
  490. data/packages/igniter-hub/README.md +25 -0
  491. data/packages/igniter-hub/lib/igniter/hub/catalog_entry.rb +35 -0
  492. data/packages/igniter-hub/lib/igniter/hub/local_catalog.rb +51 -0
  493. data/packages/igniter-hub/lib/igniter/hub.rb +16 -0
  494. data/packages/igniter-hub/lib/igniter-hub.rb +3 -0
  495. data/packages/igniter-mcp-adapter/README.md +65 -0
  496. data/packages/igniter-mcp-adapter/exe/igniter-mcp-adapter +6 -0
  497. data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter/host.rb +226 -0
  498. data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter/server.rb +148 -0
  499. data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter.rb +40 -0
  500. data/packages/igniter-mcp-adapter/lib/igniter-mcp-adapter.rb +5 -0
  501. data/packages/igniter-web/README.md +539 -0
  502. data/packages/igniter-web/lib/igniter/web/api.rb +49 -0
  503. data/packages/igniter-web/lib/igniter/web/application.rb +99 -0
  504. data/packages/igniter-web/lib/igniter/web/application_web_mount.rb +162 -0
  505. data/packages/igniter-web/lib/igniter/web/arbre.rb +41 -0
  506. data/packages/igniter-web/lib/igniter/web/component.rb +103 -0
  507. data/packages/igniter-web/lib/igniter/web/components/view_action_node.rb +38 -0
  508. data/packages/igniter-web/lib/igniter/web/components/view_ask_node.rb +52 -0
  509. data/packages/igniter-web/lib/igniter/web/components/view_chat_node.rb +34 -0
  510. data/packages/igniter-web/lib/igniter/web/components/view_compare_node.rb +41 -0
  511. data/packages/igniter-web/lib/igniter/web/components/view_node.rb +30 -0
  512. data/packages/igniter-web/lib/igniter/web/components/view_screen.rb +34 -0
  513. data/packages/igniter-web/lib/igniter/web/components/view_stream_node.rb +32 -0
  514. data/packages/igniter-web/lib/igniter/web/components/view_zone.rb +26 -0
  515. data/packages/igniter-web/lib/igniter/web/components.rb +10 -0
  516. data/packages/igniter-web/lib/igniter/web/composer.rb +84 -0
  517. data/packages/igniter-web/lib/igniter/web/composition_finding.rb +16 -0
  518. data/packages/igniter-web/lib/igniter/web/composition_policy.rb +88 -0
  519. data/packages/igniter-web/lib/igniter/web/composition_preset.rb +131 -0
  520. data/packages/igniter-web/lib/igniter/web/composition_result.rb +27 -0
  521. data/packages/igniter-web/lib/igniter/web/flow_interaction_adapter.rb +104 -0
  522. data/packages/igniter-web/lib/igniter/web/flow_surface_projection.rb +121 -0
  523. data/packages/igniter-web/lib/igniter/web/interaction_target.rb +50 -0
  524. data/packages/igniter-web/lib/igniter/web/mount_context.rb +80 -0
  525. data/packages/igniter-web/lib/igniter/web/page.rb +110 -0
  526. data/packages/igniter-web/lib/igniter/web/record.rb +54 -0
  527. data/packages/igniter-web/lib/igniter/web/screen_spec.rb +109 -0
  528. data/packages/igniter-web/lib/igniter/web/surface_manifest.rb +370 -0
  529. data/packages/igniter-web/lib/igniter/web/surface_structure.rb +57 -0
  530. data/packages/igniter-web/lib/igniter/web/view_graph.rb +25 -0
  531. data/packages/igniter-web/lib/igniter/web/view_graph_renderer.rb +63 -0
  532. data/packages/igniter-web/lib/igniter/web/view_node.rb +37 -0
  533. data/packages/igniter-web/lib/igniter/web.rb +107 -0
  534. data/packages/igniter-web/lib/igniter-web.rb +3 -0
  535. metadata +531 -641
  536. data/bin/igniter-stack +0 -94
  537. data/examples/agent_orchestration.rb +0 -76
  538. data/examples/agents.rb +0 -151
  539. data/examples/async_store.rb +0 -47
  540. data/examples/basic_pricing.rb +0 -27
  541. data/examples/collection.rb +0 -43
  542. data/examples/collection_partial_failure.rb +0 -50
  543. data/examples/composition.rb +0 -39
  544. data/examples/consensus.rb +0 -241
  545. data/examples/dataflow.rb +0 -309
  546. data/examples/diagnostics.rb +0 -28
  547. data/examples/differential.rb +0 -161
  548. data/examples/distributed_server.rb +0 -94
  549. data/examples/distributed_workflow.rb +0 -52
  550. data/examples/effects.rb +0 -185
  551. data/examples/elocal_webhook.rb +0 -1
  552. data/examples/incremental.rb +0 -143
  553. data/examples/introspection.rb +0 -49
  554. data/examples/invariants.rb +0 -180
  555. data/examples/llm_tools.rb +0 -237
  556. data/examples/marketing_ergonomics.rb +0 -57
  557. data/examples/mesh.rb +0 -241
  558. data/examples/mesh_discovery.rb +0 -287
  559. data/examples/mesh_gossip.rb +0 -164
  560. data/examples/order_pipeline.rb +0 -163
  561. data/examples/provenance.rb +0 -122
  562. data/examples/reactive_auditing.rb +0 -50
  563. data/examples/ringcentral_routing.rb +0 -269
  564. data/examples/saga.rb +0 -110
  565. data/lib/igniter/stack.rb +0 -5
  566. data/packages/igniter-agents/lib/igniter/agent/mailbox.rb +0 -96
  567. data/packages/igniter-agents/lib/igniter/agent/message.rb +0 -21
  568. data/packages/igniter-agents/lib/igniter/agent/ref.rb +0 -87
  569. data/packages/igniter-agents/lib/igniter/agent/runner.rb +0 -141
  570. data/packages/igniter-agents/lib/igniter/agent/state_holder.rb +0 -23
  571. data/packages/igniter-agents/lib/igniter/agent.rb +0 -161
  572. data/packages/igniter-agents/lib/igniter/agents/observability/metrics_agent.rb +0 -130
  573. data/packages/igniter-agents/lib/igniter/agents/pipeline/batch_processor_agent.rb +0 -131
  574. data/packages/igniter-agents/lib/igniter/agents/proactive/alert_agent.rb +0 -111
  575. data/packages/igniter-agents/lib/igniter/agents/proactive/health_check_agent.rb +0 -122
  576. data/packages/igniter-agents/lib/igniter/agents/proactive_agent.rb +0 -208
  577. data/packages/igniter-agents/lib/igniter/agents/reliability/retry_agent.rb +0 -99
  578. data/packages/igniter-agents/lib/igniter/agents/scheduling/cron_agent.rb +0 -110
  579. data/packages/igniter-agents/lib/igniter/ai/agents/chain_agent.rb +0 -129
  580. data/packages/igniter-agents/lib/igniter/ai/agents/critic_agent.rb +0 -165
  581. data/packages/igniter-agents/lib/igniter/ai/agents/evaluator_agent.rb +0 -195
  582. data/packages/igniter-agents/lib/igniter/ai/agents/evolution_agent.rb +0 -288
  583. data/packages/igniter-agents/lib/igniter/ai/agents/observer_agent.rb +0 -186
  584. data/packages/igniter-agents/lib/igniter/ai/agents/planner_agent.rb +0 -212
  585. data/packages/igniter-agents/lib/igniter/ai/agents/router_agent.rb +0 -133
  586. data/packages/igniter-agents/lib/igniter/ai/agents/self_reflection_agent.rb +0 -177
  587. data/packages/igniter-agents/lib/igniter/ai/agents.rb +0 -25
  588. data/packages/igniter-agents/lib/igniter/registry.rb +0 -69
  589. data/packages/igniter-agents/lib/igniter/runtime/registry_agent_adapter.rb +0 -102
  590. data/packages/igniter-agents/lib/igniter/supervisor.rb +0 -170
  591. data/packages/igniter-ai/lib/igniter/ai/config.rb +0 -113
  592. data/packages/igniter-ai/lib/igniter/ai/context.rb +0 -74
  593. data/packages/igniter-ai/lib/igniter/ai/executor.rb +0 -352
  594. data/packages/igniter-ai/lib/igniter/ai/providers/anthropic.rb +0 -181
  595. data/packages/igniter-ai/lib/igniter/ai/providers/base.rb +0 -33
  596. data/packages/igniter-ai/lib/igniter/ai/providers/ollama.rb +0 -137
  597. data/packages/igniter-ai/lib/igniter/ai/providers/openai.rb +0 -182
  598. data/packages/igniter-ai/lib/igniter/ai/skill/feedback.rb +0 -116
  599. data/packages/igniter-ai/lib/igniter/ai/skill/output_schema.rb +0 -110
  600. data/packages/igniter-ai/lib/igniter/ai/skill/runtime_contract.rb +0 -87
  601. data/packages/igniter-ai/lib/igniter/ai/skill.rb +0 -107
  602. data/packages/igniter-ai/lib/igniter/ai/tool_registry.rb +0 -79
  603. data/packages/igniter-ai/lib/igniter/ai/transcription/providers/assemblyai.rb +0 -200
  604. data/packages/igniter-ai/lib/igniter/ai/transcription/providers/base.rb +0 -122
  605. data/packages/igniter-ai/lib/igniter/ai/transcription/providers/deepgram.rb +0 -162
  606. data/packages/igniter-ai/lib/igniter/ai/transcription/providers/openai.rb +0 -102
  607. data/packages/igniter-ai/lib/igniter/ai/transcription/transcriber.rb +0 -145
  608. data/packages/igniter-ai/lib/igniter/ai/transcription/transcript_result.rb +0 -29
  609. data/packages/igniter-app/README.md +0 -19
  610. data/packages/igniter-app/lib/igniter/app/app_config.rb +0 -43
  611. data/packages/igniter-app/lib/igniter/app/app_host.rb +0 -56
  612. data/packages/igniter-app/lib/igniter/app/app_host_config.rb +0 -27
  613. data/packages/igniter-app/lib/igniter/app/app_host_pack.rb +0 -13
  614. data/packages/igniter-app/lib/igniter/app/autoloader.rb +0 -18
  615. data/packages/igniter-app/lib/igniter/app/cluster_app_host.rb +0 -95
  616. data/packages/igniter-app/lib/igniter/app/cluster_app_host_config.rb +0 -78
  617. data/packages/igniter-app/lib/igniter/app/credentials/config_loader.rb +0 -152
  618. data/packages/igniter-app/lib/igniter/app/credentials/credential.rb +0 -48
  619. data/packages/igniter-app/lib/igniter/app/credentials/credential_policy.rb +0 -38
  620. data/packages/igniter-app/lib/igniter/app/credentials/events/credential_event.rb +0 -179
  621. data/packages/igniter-app/lib/igniter/app/credentials/events.rb +0 -12
  622. data/packages/igniter-app/lib/igniter/app/credentials/lease_request.rb +0 -153
  623. data/packages/igniter-app/lib/igniter/app/credentials/policies/ephemeral_lease_policy.rb +0 -35
  624. data/packages/igniter-app/lib/igniter/app/credentials/policies/local_only_policy.rb +0 -33
  625. data/packages/igniter-app/lib/igniter/app/credentials/policies.rb +0 -13
  626. data/packages/igniter-app/lib/igniter/app/credentials/store.rb +0 -21
  627. data/packages/igniter-app/lib/igniter/app/credentials/stores/file_store.rb +0 -114
  628. data/packages/igniter-app/lib/igniter/app/credentials/trail.rb +0 -254
  629. data/packages/igniter-app/lib/igniter/app/credentials.rb +0 -20
  630. data/packages/igniter-app/lib/igniter/app/dev_output_sync.rb +0 -4
  631. data/packages/igniter-app/lib/igniter/app/diagnostics/app_host_contributor.rb +0 -71
  632. data/packages/igniter-app/lib/igniter/app/diagnostics/cluster_app_host_contributor.rb +0 -97
  633. data/packages/igniter-app/lib/igniter/app/diagnostics/credential_contributor.rb +0 -66
  634. data/packages/igniter-app/lib/igniter/app/diagnostics/evolution_contributor.rb +0 -74
  635. data/packages/igniter-app/lib/igniter/app/diagnostics/ignite_contributor.rb +0 -121
  636. data/packages/igniter-app/lib/igniter/app/diagnostics/loader_contributor.rb +0 -68
  637. data/packages/igniter-app/lib/igniter/app/diagnostics/orchestration_contributor.rb +0 -200
  638. data/packages/igniter-app/lib/igniter/app/diagnostics/runtime_contributor.rb +0 -68
  639. data/packages/igniter-app/lib/igniter/app/diagnostics/scheduler_contributor.rb +0 -72
  640. data/packages/igniter-app/lib/igniter/app/diagnostics/sdk_contributor.rb +0 -284
  641. data/packages/igniter-app/lib/igniter/app/diagnostics.rb +0 -62
  642. data/packages/igniter-app/lib/igniter/app/evolution/approval_decision.rb +0 -115
  643. data/packages/igniter-app/lib/igniter/app/evolution/approval_request.rb +0 -36
  644. data/packages/igniter-app/lib/igniter/app/evolution/plan.rb +0 -72
  645. data/packages/igniter-app/lib/igniter/app/evolution/planner.rb +0 -85
  646. data/packages/igniter-app/lib/igniter/app/evolution/result.rb +0 -45
  647. data/packages/igniter-app/lib/igniter/app/evolution/runner.rb +0 -102
  648. data/packages/igniter-app/lib/igniter/app/evolution/store.rb +0 -21
  649. data/packages/igniter-app/lib/igniter/app/evolution/stores/file_store.rb +0 -241
  650. data/packages/igniter-app/lib/igniter/app/evolution/trail.rb +0 -108
  651. data/packages/igniter-app/lib/igniter/app/evolution.rb +0 -11
  652. data/packages/igniter-app/lib/igniter/app/filesystem_loader_adapter.rb +0 -21
  653. data/packages/igniter-app/lib/igniter/app/generator.rb +0 -636
  654. data/packages/igniter-app/lib/igniter/app/generators/cluster.rb +0 -1367
  655. data/packages/igniter-app/lib/igniter/app/generators/dashboard.rb +0 -152
  656. data/packages/igniter-app/lib/igniter/app/generators/playground.rb +0 -1227
  657. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/README.md.erb +0 -37
  658. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/app.rb.erb +0 -19
  659. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/contexts/home_context.rb.erb +0 -54
  660. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/frontend/application.js.erb +0 -3
  661. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/spec/dashboard_app_spec.rb.erb +0 -79
  662. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/support/stack_overview.rb.erb +0 -23
  663. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/handlers/home_handler.rb.erb +0 -27
  664. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.arb.erb +0 -44
  665. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.rb.erb +0 -56
  666. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/layout.arb.erb +0 -17
  667. data/packages/igniter-app/lib/igniter/app/host_adapter.rb +0 -26
  668. data/packages/igniter-app/lib/igniter/app/host_config.rb +0 -40
  669. data/packages/igniter-app/lib/igniter/app/host_registry.rb +0 -43
  670. data/packages/igniter-app/lib/igniter/app/loader_adapter.rb +0 -15
  671. data/packages/igniter-app/lib/igniter/app/loader_pack.rb +0 -8
  672. data/packages/igniter-app/lib/igniter/app/loader_registry.rb +0 -39
  673. data/packages/igniter-app/lib/igniter/app/observability/operator_action_handler.rb +0 -147
  674. data/packages/igniter-app/lib/igniter/app/observability/operator_console_handler.rb +0 -747
  675. data/packages/igniter-app/lib/igniter/app/observability/operator_overview_handler.rb +0 -350
  676. data/packages/igniter-app/lib/igniter/app/observability.rb +0 -5
  677. data/packages/igniter-app/lib/igniter/app/observability_pack.rb +0 -71
  678. data/packages/igniter-app/lib/igniter/app/operator/dispatcher.rb +0 -40
  679. data/packages/igniter-app/lib/igniter/app/operator/handler_registry.rb +0 -40
  680. data/packages/igniter-app/lib/igniter/app/operator/handler_result.rb +0 -67
  681. data/packages/igniter-app/lib/igniter/app/operator/handlers/base.rb +0 -79
  682. data/packages/igniter-app/lib/igniter/app/operator/handlers/ignite_handler.rb +0 -108
  683. data/packages/igniter-app/lib/igniter/app/operator/handlers/orchestration_handler.rb +0 -33
  684. data/packages/igniter-app/lib/igniter/app/operator/handlers.rb +0 -5
  685. data/packages/igniter-app/lib/igniter/app/operator/lifecycle_contract.rb +0 -55
  686. data/packages/igniter-app/lib/igniter/app/operator/policy.rb +0 -157
  687. data/packages/igniter-app/lib/igniter/app/operator.rb +0 -17
  688. data/packages/igniter-app/lib/igniter/app/orchestration/action_result_builder.rb +0 -65
  689. data/packages/igniter-app/lib/igniter/app/orchestration/followup_request.rb +0 -36
  690. data/packages/igniter-app/lib/igniter/app/orchestration/handler_registry.rb +0 -58
  691. data/packages/igniter-app/lib/igniter/app/orchestration/handlers.rb +0 -106
  692. data/packages/igniter-app/lib/igniter/app/orchestration/inbox.rb +0 -283
  693. data/packages/igniter-app/lib/igniter/app/orchestration/inbox_query.rb +0 -293
  694. data/packages/igniter-app/lib/igniter/app/orchestration/lane_registry.rb +0 -100
  695. data/packages/igniter-app/lib/igniter/app/orchestration/operator_query.rb +0 -449
  696. data/packages/igniter-app/lib/igniter/app/orchestration/plan.rb +0 -68
  697. data/packages/igniter-app/lib/igniter/app/orchestration/planner.rb +0 -89
  698. data/packages/igniter-app/lib/igniter/app/orchestration/policies.rb +0 -125
  699. data/packages/igniter-app/lib/igniter/app/orchestration/policy_registry.rb +0 -63
  700. data/packages/igniter-app/lib/igniter/app/orchestration/result.rb +0 -43
  701. data/packages/igniter-app/lib/igniter/app/orchestration/routing_registry.rb +0 -43
  702. data/packages/igniter-app/lib/igniter/app/orchestration/runner.rb +0 -50
  703. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_event_query.rb +0 -205
  704. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_overview_builder.rb +0 -286
  705. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_query_overview_builder.rb +0 -20
  706. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_result_builder.rb +0 -23
  707. data/packages/igniter-app/lib/igniter/app/orchestration.rb +0 -113
  708. data/packages/igniter-app/lib/igniter/app/runtime.rb +0 -4
  709. data/packages/igniter-app/lib/igniter/app/runtime_context.rb +0 -101
  710. data/packages/igniter-app/lib/igniter/app/runtime_pack.rb +0 -16
  711. data/packages/igniter-app/lib/igniter/app/scaffold_pack.rb +0 -6
  712. data/packages/igniter-app/lib/igniter/app/scheduler.rb +0 -109
  713. data/packages/igniter-app/lib/igniter/app/scheduler_adapter.rb +0 -17
  714. data/packages/igniter-app/lib/igniter/app/scheduler_pack.rb +0 -8
  715. data/packages/igniter-app/lib/igniter/app/scheduler_registry.rb +0 -39
  716. data/packages/igniter-app/lib/igniter/app/stack.rb +0 -1726
  717. data/packages/igniter-app/lib/igniter/app/stack_pack.rb +0 -3
  718. data/packages/igniter-app/lib/igniter/app/threaded_scheduler_adapter.rb +0 -35
  719. data/packages/igniter-app/lib/igniter/app/yml_loader.rb +0 -43
  720. data/packages/igniter-app/lib/igniter/app.rb +0 -2367
  721. data/packages/igniter-app/lib/igniter/ignite/bootstrap_agent.rb +0 -334
  722. data/packages/igniter-app/lib/igniter/ignite/bootstrap_target.rb +0 -79
  723. data/packages/igniter-app/lib/igniter/ignite/deployment_intent.rb +0 -82
  724. data/packages/igniter-app/lib/igniter/ignite/ignition_agent.rb +0 -1011
  725. data/packages/igniter-app/lib/igniter/ignite/ignition_plan.rb +0 -83
  726. data/packages/igniter-app/lib/igniter/ignite/ignition_report.rb +0 -144
  727. data/packages/igniter-app/lib/igniter/ignite/store.rb +0 -19
  728. data/packages/igniter-app/lib/igniter/ignite/stores/file_store.rb +0 -112
  729. data/packages/igniter-app/lib/igniter/ignite/trail.rb +0 -215
  730. data/packages/igniter-app/lib/igniter/ignite.rb +0 -11
  731. data/packages/igniter-app/lib/igniter-app.rb +0 -5
  732. data/packages/igniter-cluster/lib/igniter/cluster/agent_route_resolver.rb +0 -58
  733. data/packages/igniter-cluster/lib/igniter/cluster/consensus/cluster.rb +0 -187
  734. data/packages/igniter-cluster/lib/igniter/cluster/consensus/errors.rb +0 -16
  735. data/packages/igniter-cluster/lib/igniter/cluster/consensus/executors.rb +0 -45
  736. data/packages/igniter-cluster/lib/igniter/cluster/consensus/node.rb +0 -322
  737. data/packages/igniter-cluster/lib/igniter/cluster/consensus/read_query.rb +0 -32
  738. data/packages/igniter-cluster/lib/igniter/cluster/consensus/state_machine.rb +0 -60
  739. data/packages/igniter-cluster/lib/igniter/cluster/consensus.rb +0 -18
  740. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/governance_contributor.rb +0 -90
  741. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/identity_contributor.rb +0 -98
  742. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/routing_contributor.rb +0 -674
  743. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics.rb +0 -24
  744. data/packages/igniter-cluster/lib/igniter/cluster/events/envelope.rb +0 -136
  745. data/packages/igniter-cluster/lib/igniter/cluster/events/hook_support.rb +0 -33
  746. data/packages/igniter-cluster/lib/igniter/cluster/events/log.rb +0 -102
  747. data/packages/igniter-cluster/lib/igniter/cluster/events/projection_feed.rb +0 -98
  748. data/packages/igniter-cluster/lib/igniter/cluster/events/read_model_projector.rb +0 -32
  749. data/packages/igniter-cluster/lib/igniter/cluster/events.rb +0 -131
  750. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_decision.rb +0 -41
  751. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_policy.rb +0 -66
  752. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_queue.rb +0 -88
  753. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_request.rb +0 -62
  754. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_workflow.rb +0 -214
  755. data/packages/igniter-cluster/lib/igniter/cluster/governance/checkpoint.rb +0 -141
  756. data/packages/igniter-cluster/lib/igniter/cluster/governance/compaction_record.rb +0 -33
  757. data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/checkpoint_store.rb +0 -89
  758. data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/file_store.rb +0 -249
  759. data/packages/igniter-cluster/lib/igniter/cluster/governance/trail.rb +0 -164
  760. data/packages/igniter-cluster/lib/igniter/cluster/governance.rb +0 -12
  761. data/packages/igniter-cluster/lib/igniter/cluster/identity/capability_attestation.rb +0 -114
  762. data/packages/igniter-cluster/lib/igniter/cluster/identity/manifest.rb +0 -139
  763. data/packages/igniter-cluster/lib/igniter/cluster/identity/node_identity.rb +0 -106
  764. data/packages/igniter-cluster/lib/igniter/cluster/identity.rb +0 -5
  765. data/packages/igniter-cluster/lib/igniter/cluster/mesh/announcer.rb +0 -88
  766. data/packages/igniter-cluster/lib/igniter/cluster/mesh/checkpoint_gossip.rb +0 -60
  767. data/packages/igniter-cluster/lib/igniter/cluster/mesh/config.rb +0 -146
  768. data/packages/igniter-cluster/lib/igniter/cluster/mesh/discovery.rb +0 -44
  769. data/packages/igniter-cluster/lib/igniter/cluster/mesh/errors.rb +0 -36
  770. data/packages/igniter-cluster/lib/igniter/cluster/mesh/gossip.rb +0 -62
  771. data/packages/igniter-cluster/lib/igniter/cluster/mesh/mesh_ql.rb +0 -470
  772. data/packages/igniter-cluster/lib/igniter/cluster/mesh/node_observation.rb +0 -281
  773. data/packages/igniter-cluster/lib/igniter/cluster/mesh/observation_query.rb +0 -284
  774. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer.rb +0 -51
  775. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_capacity_report.rb +0 -42
  776. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_identity_envelope.rb +0 -158
  777. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_metadata.rb +0 -122
  778. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_registry.rb +0 -81
  779. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_decision.rb +0 -64
  780. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_planner.rb +0 -154
  781. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_policy.rb +0 -103
  782. data/packages/igniter-cluster/lib/igniter/cluster/mesh/poller.rb +0 -92
  783. data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_plan.rb +0 -66
  784. data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_planner.rb +0 -153
  785. data/packages/igniter-cluster/lib/igniter/cluster/mesh/repair_loop.rb +0 -169
  786. data/packages/igniter-cluster/lib/igniter/cluster/mesh/router.rb +0 -306
  787. data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_signal.rb +0 -46
  788. data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_tracker.rb +0 -215
  789. data/packages/igniter-cluster/lib/igniter/cluster/mesh.rb +0 -452
  790. data/packages/igniter-cluster/lib/igniter/cluster/ownership/claim.rb +0 -69
  791. data/packages/igniter-cluster/lib/igniter/cluster/ownership/errors.rb +0 -19
  792. data/packages/igniter-cluster/lib/igniter/cluster/ownership/owner_client.rb +0 -76
  793. data/packages/igniter-cluster/lib/igniter/cluster/ownership/registry.rb +0 -98
  794. data/packages/igniter-cluster/lib/igniter/cluster/ownership/resolver.rb +0 -62
  795. data/packages/igniter-cluster/lib/igniter/cluster/ownership.rb +0 -81
  796. data/packages/igniter-cluster/lib/igniter/cluster/projection_store.rb +0 -62
  797. data/packages/igniter-cluster/lib/igniter/cluster/rag/chunk.rb +0 -49
  798. data/packages/igniter-cluster/lib/igniter/cluster/rag/fanout_retriever.rb +0 -93
  799. data/packages/igniter-cluster/lib/igniter/cluster/rag/knowledge_shard.rb +0 -140
  800. data/packages/igniter-cluster/lib/igniter/cluster/rag/net_http_adapter.rb +0 -85
  801. data/packages/igniter-cluster/lib/igniter/cluster/rag/ranker.rb +0 -46
  802. data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_query.rb +0 -30
  803. data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_result.rb +0 -77
  804. data/packages/igniter-cluster/lib/igniter/cluster/rag.rb +0 -38
  805. data/packages/igniter-cluster/lib/igniter/cluster/remote_adapter.rb +0 -101
  806. data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrapper.rb +0 -63
  807. data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/gem.rb +0 -39
  808. data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/git.rb +0 -46
  809. data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/tarball.rb +0 -62
  810. data/packages/igniter-cluster/lib/igniter/cluster/replication/capability_query.rb +0 -675
  811. data/packages/igniter-cluster/lib/igniter/cluster/replication/expansion_plan.rb +0 -40
  812. data/packages/igniter-cluster/lib/igniter/cluster/replication/expansion_planner.rb +0 -154
  813. data/packages/igniter-cluster/lib/igniter/cluster/replication/manifest.rb +0 -47
  814. data/packages/igniter-cluster/lib/igniter/cluster/replication/network_topology.rb +0 -150
  815. data/packages/igniter-cluster/lib/igniter/cluster/replication/node_profile.rb +0 -134
  816. data/packages/igniter-cluster/lib/igniter/cluster/replication/reflective_replication_agent.rb +0 -259
  817. data/packages/igniter-cluster/lib/igniter/cluster/replication/replication_agent.rb +0 -89
  818. data/packages/igniter-cluster/lib/igniter/cluster/replication/ssh_session.rb +0 -79
  819. data/packages/igniter-cluster/lib/igniter/cluster/replication.rb +0 -38
  820. data/packages/igniter-cluster/lib/igniter/cluster/routed_agent_adapter.rb +0 -79
  821. data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_executor.rb +0 -427
  822. data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_result.rb +0 -38
  823. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_plan.rb +0 -34
  824. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_planner.rb +0 -76
  825. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_result.rb +0 -34
  826. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_runner.rb +0 -125
  827. data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_assessment.rb +0 -37
  828. data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_store.rb +0 -58
  829. data/packages/igniter-cluster/lib/igniter/cluster/trust/verifier.rb +0 -80
  830. data/packages/igniter-cluster/lib/igniter/cluster/trust.rb +0 -9
  831. data/packages/igniter-core/README.md +0 -21
  832. data/packages/igniter-core/lib/igniter/core/capabilities.rb +0 -70
  833. data/packages/igniter-core/lib/igniter/core/compiler/compiled_graph.rb +0 -218
  834. data/packages/igniter-core/lib/igniter/core/compiler/graph_compiler.rb +0 -70
  835. data/packages/igniter-core/lib/igniter/core/compiler/type_resolver.rb +0 -54
  836. data/packages/igniter-core/lib/igniter/core/compiler/validation_context.rb +0 -61
  837. data/packages/igniter-core/lib/igniter/core/compiler/validation_pipeline.rb +0 -33
  838. data/packages/igniter-core/lib/igniter/core/compiler/validator.rb +0 -19
  839. data/packages/igniter-core/lib/igniter/core/compiler/validators/agent_validator.rb +0 -142
  840. data/packages/igniter-core/lib/igniter/core/compiler/validators/await_validator.rb +0 -53
  841. data/packages/igniter-core/lib/igniter/core/compiler/validators/callable_validator.rb +0 -125
  842. data/packages/igniter-core/lib/igniter/core/compiler/validators/dependencies_validator.rb +0 -280
  843. data/packages/igniter-core/lib/igniter/core/compiler/validators/outputs_validator.rb +0 -66
  844. data/packages/igniter-core/lib/igniter/core/compiler/validators/remote_validator.rb +0 -60
  845. data/packages/igniter-core/lib/igniter/core/compiler/validators/type_compatibility_validator.rb +0 -84
  846. data/packages/igniter-core/lib/igniter/core/compiler/validators/uniqueness_validator.rb +0 -60
  847. data/packages/igniter-core/lib/igniter/core/compiler.rb +0 -21
  848. data/packages/igniter-core/lib/igniter/core/content_addressing.rb +0 -133
  849. data/packages/igniter-core/lib/igniter/core/contract.rb +0 -398
  850. data/packages/igniter-core/lib/igniter/core/dataflow/aggregate_operators.rb +0 -147
  851. data/packages/igniter-core/lib/igniter/core/dataflow/aggregate_state.rb +0 -77
  852. data/packages/igniter-core/lib/igniter/core/dataflow/diff.rb +0 -37
  853. data/packages/igniter-core/lib/igniter/core/dataflow/diff_state.rb +0 -81
  854. data/packages/igniter-core/lib/igniter/core/dataflow/incremental_collection_result.rb +0 -39
  855. data/packages/igniter-core/lib/igniter/core/dataflow/window_filter.rb +0 -48
  856. data/packages/igniter-core/lib/igniter/core/dataflow.rb +0 -65
  857. data/packages/igniter-core/lib/igniter/core/diagnostics/agent_contributor.rb +0 -241
  858. data/packages/igniter-core/lib/igniter/core/diagnostics/auditing/report/console_formatter.rb +0 -80
  859. data/packages/igniter-core/lib/igniter/core/diagnostics/auditing/report/markdown_formatter.rb +0 -22
  860. data/packages/igniter-core/lib/igniter/core/diagnostics/capability_contributor.rb +0 -162
  861. data/packages/igniter-core/lib/igniter/core/diagnostics/introspection/formatters/mermaid_formatter.rb +0 -58
  862. data/packages/igniter-core/lib/igniter/core/diagnostics/introspection/formatters/text_tree_formatter.rb +0 -44
  863. data/packages/igniter-core/lib/igniter/core/diagnostics/orchestration_contributor.rb +0 -75
  864. data/packages/igniter-core/lib/igniter/core/diagnostics/report.rb +0 -424
  865. data/packages/igniter-core/lib/igniter/core/diagnostics.rb +0 -58
  866. data/packages/igniter-core/lib/igniter/core/differential/divergence.rb +0 -29
  867. data/packages/igniter-core/lib/igniter/core/differential/formatter.rb +0 -96
  868. data/packages/igniter-core/lib/igniter/core/differential/report.rb +0 -86
  869. data/packages/igniter-core/lib/igniter/core/differential/runner.rb +0 -130
  870. data/packages/igniter-core/lib/igniter/core/differential.rb +0 -51
  871. data/packages/igniter-core/lib/igniter/core/dsl/contract_builder.rb +0 -652
  872. data/packages/igniter-core/lib/igniter/core/dsl/schema_builder.rb +0 -73
  873. data/packages/igniter-core/lib/igniter/core/dsl.rb +0 -9
  874. data/packages/igniter-core/lib/igniter/core/dto/record.rb +0 -189
  875. data/packages/igniter-core/lib/igniter/core/dto.rb +0 -8
  876. data/packages/igniter-core/lib/igniter/core/effect.rb +0 -95
  877. data/packages/igniter-core/lib/igniter/core/effect_registry.rb +0 -78
  878. data/packages/igniter-core/lib/igniter/core/errors.rb +0 -102
  879. data/packages/igniter-core/lib/igniter/core/events/bus.rb +0 -44
  880. data/packages/igniter-core/lib/igniter/core/events/event.rb +0 -82
  881. data/packages/igniter-core/lib/igniter/core/events.rb +0 -9
  882. data/packages/igniter-core/lib/igniter/core/execution_report/builder.rb +0 -54
  883. data/packages/igniter-core/lib/igniter/core/execution_report/formatter.rb +0 -50
  884. data/packages/igniter-core/lib/igniter/core/execution_report/node_entry.rb +0 -24
  885. data/packages/igniter-core/lib/igniter/core/execution_report/report.rb +0 -65
  886. data/packages/igniter-core/lib/igniter/core/execution_report.rb +0 -32
  887. data/packages/igniter-core/lib/igniter/core/executor.rb +0 -134
  888. data/packages/igniter-core/lib/igniter/core/executor_registry.rb +0 -44
  889. data/packages/igniter-core/lib/igniter/core/extensions/auditing/timeline.rb +0 -103
  890. data/packages/igniter-core/lib/igniter/core/extensions/auditing.rb +0 -10
  891. data/packages/igniter-core/lib/igniter/core/extensions/introspection/graph_formatter.rb +0 -134
  892. data/packages/igniter-core/lib/igniter/core/extensions/introspection/plan_formatter.rb +0 -85
  893. data/packages/igniter-core/lib/igniter/core/extensions/introspection/runtime_formatter.rb +0 -143
  894. data/packages/igniter-core/lib/igniter/core/extensions/introspection.rb +0 -12
  895. data/packages/igniter-core/lib/igniter/core/extensions/invariants.rb +0 -70
  896. data/packages/igniter-core/lib/igniter/core/extensions/reactive/engine.rb +0 -83
  897. data/packages/igniter-core/lib/igniter/core/extensions/reactive/matcher.rb +0 -21
  898. data/packages/igniter-core/lib/igniter/core/extensions/reactive/reaction.rb +0 -18
  899. data/packages/igniter-core/lib/igniter/core/extensions/reactive.rb +0 -12
  900. data/packages/igniter-core/lib/igniter/core/extensions.rb +0 -10
  901. data/packages/igniter-core/lib/igniter/core/fingerprint.rb +0 -43
  902. data/packages/igniter-core/lib/igniter/core/incremental/formatter.rb +0 -81
  903. data/packages/igniter-core/lib/igniter/core/incremental/result.rb +0 -69
  904. data/packages/igniter-core/lib/igniter/core/incremental/tracker.rb +0 -108
  905. data/packages/igniter-core/lib/igniter/core/incremental.rb +0 -50
  906. data/packages/igniter-core/lib/igniter/core/invariant.rb +0 -50
  907. data/packages/igniter-core/lib/igniter/core/memory/agent_memory.rb +0 -104
  908. data/packages/igniter-core/lib/igniter/core/memory/episode.rb +0 -29
  909. data/packages/igniter-core/lib/igniter/core/memory/fact.rb +0 -27
  910. data/packages/igniter-core/lib/igniter/core/memory/memorable.rb +0 -90
  911. data/packages/igniter-core/lib/igniter/core/memory/reflection_cycle.rb +0 -96
  912. data/packages/igniter-core/lib/igniter/core/memory/reflection_record.rb +0 -28
  913. data/packages/igniter-core/lib/igniter/core/memory/store.rb +0 -115
  914. data/packages/igniter-core/lib/igniter/core/memory/stores/in_memory.rb +0 -136
  915. data/packages/igniter-core/lib/igniter/core/memory/stores/sqlite.rb +0 -286
  916. data/packages/igniter-core/lib/igniter/core/memory.rb +0 -80
  917. data/packages/igniter-core/lib/igniter/core/metrics/collector.rb +0 -131
  918. data/packages/igniter-core/lib/igniter/core/metrics/prometheus_exporter.rb +0 -104
  919. data/packages/igniter-core/lib/igniter/core/metrics/snapshot.rb +0 -8
  920. data/packages/igniter-core/lib/igniter/core/metrics.rb +0 -37
  921. data/packages/igniter-core/lib/igniter/core/model/agent_interaction_contract.rb +0 -172
  922. data/packages/igniter-core/lib/igniter/core/model/agent_node.rb +0 -86
  923. data/packages/igniter-core/lib/igniter/core/model/aggregate_node.rb +0 -34
  924. data/packages/igniter-core/lib/igniter/core/model/await_node.rb +0 -21
  925. data/packages/igniter-core/lib/igniter/core/model/branch_node.rb +0 -82
  926. data/packages/igniter-core/lib/igniter/core/model/collection_node.rb +0 -32
  927. data/packages/igniter-core/lib/igniter/core/model/composition_node.rb +0 -22
  928. data/packages/igniter-core/lib/igniter/core/model/compute_node.rb +0 -90
  929. data/packages/igniter-core/lib/igniter/core/model/effect_node.rb +0 -37
  930. data/packages/igniter-core/lib/igniter/core/model/graph.rb +0 -15
  931. data/packages/igniter-core/lib/igniter/core/model/input_node.rb +0 -27
  932. data/packages/igniter-core/lib/igniter/core/model/node.rb +0 -22
  933. data/packages/igniter-core/lib/igniter/core/model/output_node.rb +0 -41
  934. data/packages/igniter-core/lib/igniter/core/model/remote_node.rb +0 -91
  935. data/packages/igniter-core/lib/igniter/core/model.rb +0 -20
  936. data/packages/igniter-core/lib/igniter/core/node_cache.rb +0 -231
  937. data/packages/igniter-core/lib/igniter/core/property_testing/formatter.rb +0 -66
  938. data/packages/igniter-core/lib/igniter/core/property_testing/generators.rb +0 -115
  939. data/packages/igniter-core/lib/igniter/core/property_testing/result.rb +0 -45
  940. data/packages/igniter-core/lib/igniter/core/property_testing/run.rb +0 -43
  941. data/packages/igniter-core/lib/igniter/core/property_testing/runner.rb +0 -47
  942. data/packages/igniter-core/lib/igniter/core/property_testing.rb +0 -64
  943. data/packages/igniter-core/lib/igniter/core/provenance/builder.rb +0 -126
  944. data/packages/igniter-core/lib/igniter/core/provenance/lineage.rb +0 -82
  945. data/packages/igniter-core/lib/igniter/core/provenance/node_trace.rb +0 -65
  946. data/packages/igniter-core/lib/igniter/core/provenance/text_formatter.rb +0 -70
  947. data/packages/igniter-core/lib/igniter/core/provenance.rb +0 -29
  948. data/packages/igniter-core/lib/igniter/core/runtime/agent_adapter.rb +0 -41
  949. data/packages/igniter-core/lib/igniter/core/runtime/agent_result_contract.rb +0 -91
  950. data/packages/igniter-core/lib/igniter/core/runtime/agent_route.rb +0 -60
  951. data/packages/igniter-core/lib/igniter/core/runtime/agent_route_resolver.rb +0 -26
  952. data/packages/igniter-core/lib/igniter/core/runtime/agent_session.rb +0 -922
  953. data/packages/igniter-core/lib/igniter/core/runtime/agent_session_query.rb +0 -379
  954. data/packages/igniter-core/lib/igniter/core/runtime/agent_transport.rb +0 -30
  955. data/packages/igniter-core/lib/igniter/core/runtime/cache.rb +0 -129
  956. data/packages/igniter-core/lib/igniter/core/runtime/collection_result.rb +0 -111
  957. data/packages/igniter-core/lib/igniter/core/runtime/deferred_result.rb +0 -66
  958. data/packages/igniter-core/lib/igniter/core/runtime/execution.rb +0 -913
  959. data/packages/igniter-core/lib/igniter/core/runtime/input_validator.rb +0 -129
  960. data/packages/igniter-core/lib/igniter/core/runtime/invalidator.rb +0 -52
  961. data/packages/igniter-core/lib/igniter/core/runtime/job_worker.rb +0 -39
  962. data/packages/igniter-core/lib/igniter/core/runtime/node_state.rb +0 -58
  963. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_overview.rb +0 -213
  964. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_runtime_state.rb +0 -176
  965. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_transition_query.rb +0 -208
  966. data/packages/igniter-core/lib/igniter/core/runtime/planner.rb +0 -301
  967. data/packages/igniter-core/lib/igniter/core/runtime/proxy_agent_adapter.rb +0 -124
  968. data/packages/igniter-core/lib/igniter/core/runtime/remote_adapter.rb +0 -26
  969. data/packages/igniter-core/lib/igniter/core/runtime/resolver.rb +0 -951
  970. data/packages/igniter-core/lib/igniter/core/runtime/result.rb +0 -119
  971. data/packages/igniter-core/lib/igniter/core/runtime/runner_factory.rb +0 -20
  972. data/packages/igniter-core/lib/igniter/core/runtime/runners/inline_runner.rb +0 -21
  973. data/packages/igniter-core/lib/igniter/core/runtime/runners/store_runner.rb +0 -29
  974. data/packages/igniter-core/lib/igniter/core/runtime/runners/thread_pool_runner.rb +0 -37
  975. data/packages/igniter-core/lib/igniter/core/runtime/stores/active_record_store.rb +0 -53
  976. data/packages/igniter-core/lib/igniter/core/runtime/stores/file_store.rb +0 -91
  977. data/packages/igniter-core/lib/igniter/core/runtime/stores/memory_store.rb +0 -93
  978. data/packages/igniter-core/lib/igniter/core/runtime/stores/redis_store.rb +0 -93
  979. data/packages/igniter-core/lib/igniter/core/runtime/stores/sqlite_store.rb +0 -155
  980. data/packages/igniter-core/lib/igniter/core/runtime/stream_result.rb +0 -171
  981. data/packages/igniter-core/lib/igniter/core/runtime.rb +0 -41
  982. data/packages/igniter-core/lib/igniter/core/saga/compensation.rb +0 -31
  983. data/packages/igniter-core/lib/igniter/core/saga/compensation_record.rb +0 -20
  984. data/packages/igniter-core/lib/igniter/core/saga/executor.rb +0 -85
  985. data/packages/igniter-core/lib/igniter/core/saga/formatter.rb +0 -49
  986. data/packages/igniter-core/lib/igniter/core/saga/result.rb +0 -47
  987. data/packages/igniter-core/lib/igniter/core/saga.rb +0 -56
  988. data/packages/igniter-core/lib/igniter/core/stream_loop.rb +0 -80
  989. data/packages/igniter-core/lib/igniter/core/temporal.rb +0 -84
  990. data/packages/igniter-core/lib/igniter/core/tool/discoverable.rb +0 -151
  991. data/packages/igniter-core/lib/igniter/core/tool.rb +0 -56
  992. data/packages/igniter-core/lib/igniter/core/type_system.rb +0 -44
  993. data/packages/igniter-core/lib/igniter/core/version.rb +0 -5
  994. data/packages/igniter-core/lib/igniter/core.rb +0 -23
  995. data/packages/igniter-core/lib/igniter-core.rb +0 -3
  996. data/packages/igniter-extensions/lib/igniter/extensions/auditing.rb +0 -3
  997. data/packages/igniter-extensions/lib/igniter/extensions/capabilities.rb +0 -39
  998. data/packages/igniter-extensions/lib/igniter/extensions/content_addressing.rb +0 -5
  999. data/packages/igniter-extensions/lib/igniter/extensions/dataflow.rb +0 -117
  1000. data/packages/igniter-extensions/lib/igniter/extensions/differential.rb +0 -114
  1001. data/packages/igniter-extensions/lib/igniter/extensions/execution_report.rb +0 -27
  1002. data/packages/igniter-extensions/lib/igniter/extensions/incremental.rb +0 -50
  1003. data/packages/igniter-extensions/lib/igniter/extensions/introspection.rb +0 -3
  1004. data/packages/igniter-extensions/lib/igniter/extensions/invariants.rb +0 -3
  1005. data/packages/igniter-extensions/lib/igniter/extensions/provenance.rb +0 -45
  1006. data/packages/igniter-extensions/lib/igniter/extensions/reactive.rb +0 -3
  1007. data/packages/igniter-extensions/lib/igniter/extensions/saga.rb +0 -74
  1008. data/packages/igniter-frontend/README.md +0 -224
  1009. data/packages/igniter-frontend/lib/igniter/frontend/app.rb +0 -90
  1010. data/packages/igniter-frontend/lib/igniter/frontend/app_access.rb +0 -36
  1011. data/packages/igniter-frontend/lib/igniter/frontend/arbre/component.rb +0 -120
  1012. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/action_group.rb +0 -53
  1013. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/badge.rb +0 -91
  1014. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/boolean.rb +0 -53
  1015. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/breadcrumbs.rb +0 -71
  1016. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/card.rb +0 -114
  1017. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/conversation_panel.rb +0 -61
  1018. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/datetime.rb +0 -42
  1019. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/display_value_support.rb +0 -38
  1020. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/empty_state.rb +0 -39
  1021. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/event_list.rb +0 -44
  1022. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/filters.rb +0 -183
  1023. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/indicator.rb +0 -59
  1024. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/json_panel.rb +0 -36
  1025. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/key_value_list.rb +0 -40
  1026. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/loading_state.rb +0 -43
  1027. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/metric_grid.rb +0 -37
  1028. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/number.rb +0 -53
  1029. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/page_header.rb +0 -53
  1030. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/pagination.rb +0 -143
  1031. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/panel.rb +0 -67
  1032. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/percentage.rb +0 -79
  1033. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/resource_list.rb +0 -38
  1034. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/scenario_card.rb +0 -48
  1035. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/shell_columns.rb +0 -67
  1036. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/sidebar_shell.rb +0 -106
  1037. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/table_with.rb +0 -203
  1038. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/tabs.rb +0 -147
  1039. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/viz.rb +0 -185
  1040. data/packages/igniter-frontend/lib/igniter/frontend/arbre/page.rb +0 -74
  1041. data/packages/igniter-frontend/lib/igniter/frontend/arbre/raw_text_node.rb +0 -40
  1042. data/packages/igniter-frontend/lib/igniter/frontend/arbre/template_page.rb +0 -243
  1043. data/packages/igniter-frontend/lib/igniter/frontend/arbre.rb +0 -48
  1044. data/packages/igniter-frontend/lib/igniter/frontend/arbre_page.rb +0 -7
  1045. data/packages/igniter-frontend/lib/igniter/frontend/assets.rb +0 -101
  1046. data/packages/igniter-frontend/lib/igniter/frontend/builder.rb +0 -124
  1047. data/packages/igniter-frontend/lib/igniter/frontend/component.rb +0 -24
  1048. data/packages/igniter-frontend/lib/igniter/frontend/components.rb +0 -7
  1049. data/packages/igniter-frontend/lib/igniter/frontend/context.rb +0 -53
  1050. data/packages/igniter-frontend/lib/igniter/frontend/form_builder.rb +0 -63
  1051. data/packages/igniter-frontend/lib/igniter/frontend/handler.rb +0 -92
  1052. data/packages/igniter-frontend/lib/igniter/frontend/javascript.rb +0 -353
  1053. data/packages/igniter-frontend/lib/igniter/frontend/page.rb +0 -24
  1054. data/packages/igniter-frontend/lib/igniter/frontend/request.rb +0 -61
  1055. data/packages/igniter-frontend/lib/igniter/frontend/response.rb +0 -67
  1056. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/adapters.rb +0 -226
  1057. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/presets.rb +0 -147
  1058. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime.rb +0 -259
  1059. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/surfaces.rb +0 -1074
  1060. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/ui.rb +0 -1438
  1061. data/packages/igniter-frontend/lib/igniter/frontend/tailwind.rb +0 -180
  1062. data/packages/igniter-frontend/lib/igniter/frontend/version.rb +0 -9
  1063. data/packages/igniter-frontend/lib/igniter/frontend.rb +0 -35
  1064. data/packages/igniter-frontend/lib/igniter-frontend.rb +0 -3
  1065. data/packages/igniter-rails/README.md +0 -96
  1066. data/packages/igniter-rails/lib/igniter/plugins/rails/cable_adapter.rb +0 -49
  1067. data/packages/igniter-rails/lib/igniter/plugins/rails/contract_job.rb +0 -76
  1068. data/packages/igniter-rails/lib/igniter/plugins/rails/generators/contract/contract_generator.rb +0 -22
  1069. data/packages/igniter-rails/lib/igniter/plugins/rails/generators/contract/templates/contract.rb.tt +0 -22
  1070. data/packages/igniter-rails/lib/igniter/plugins/rails/generators/install/install_generator.rb +0 -33
  1071. data/packages/igniter-rails/lib/igniter/plugins/rails/generators/install/templates/igniter.rb.tt +0 -16
  1072. data/packages/igniter-rails/lib/igniter/plugins/rails/railtie.rb +0 -25
  1073. data/packages/igniter-rails/lib/igniter/plugins/rails/webhook_concern.rb +0 -49
  1074. data/packages/igniter-rails/lib/igniter/plugins/rails.rb +0 -12
  1075. data/packages/igniter-rails/lib/igniter-rails.rb +0 -3
  1076. data/packages/igniter-schema-rendering/README.md +0 -27
  1077. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/page.rb +0 -35
  1078. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/patcher.rb +0 -47
  1079. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/renderer.rb +0 -268
  1080. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/schema.rb +0 -172
  1081. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/store.rb +0 -53
  1082. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_normalizer.rb +0 -117
  1083. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_processor.rb +0 -91
  1084. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_validator.rb +0 -62
  1085. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/version.rb +0 -9
  1086. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering.rb +0 -20
  1087. data/packages/igniter-schema-rendering/lib/igniter-schema-rendering.rb +0 -3
  1088. data/packages/igniter-sdk/README.md +0 -25
  1089. data/packages/igniter-sdk/lib/igniter/sdk/channels/base.rb +0 -84
  1090. data/packages/igniter-sdk/lib/igniter/sdk/channels/delivery_result.rb +0 -61
  1091. data/packages/igniter-sdk/lib/igniter/sdk/channels/message.rb +0 -101
  1092. data/packages/igniter-sdk/lib/igniter/sdk/channels/telegram.rb +0 -161
  1093. data/packages/igniter-sdk/lib/igniter/sdk/channels/webhook.rb +0 -213
  1094. data/packages/igniter-sdk/lib/igniter/sdk/channels.rb +0 -17
  1095. data/packages/igniter-sdk/lib/igniter/sdk/data/store.rb +0 -31
  1096. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/file.rb +0 -113
  1097. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/in_memory.rb +0 -63
  1098. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/sqlite.rb +0 -144
  1099. data/packages/igniter-sdk/lib/igniter/sdk/data.rb +0 -34
  1100. data/packages/igniter-sdk/lib/igniter/sdk/tools/agent_bootstrap_tool.rb +0 -151
  1101. data/packages/igniter-sdk/lib/igniter/sdk/tools/local_workflow_selector_tool.rb +0 -269
  1102. data/packages/igniter-sdk/lib/igniter/sdk/tools/system_discovery_tool.rb +0 -198
  1103. data/packages/igniter-sdk/lib/igniter/sdk/tools.rb +0 -9
  1104. data/packages/igniter-sdk/lib/igniter/sdk.rb +0 -86
  1105. data/packages/igniter-sdk/lib/igniter-sdk.rb +0 -3
  1106. data/packages/igniter-server/README.md +0 -9
  1107. data/packages/igniter-server/lib/igniter/server/agent_session_store.rb +0 -98
  1108. data/packages/igniter-server/lib/igniter/server/agent_transport.rb +0 -95
  1109. data/packages/igniter-server/lib/igniter/server/app_host.rb +0 -3
  1110. data/packages/igniter-server/lib/igniter/server/client.rb +0 -256
  1111. data/packages/igniter-server/lib/igniter/server/config.rb +0 -70
  1112. data/packages/igniter-server/lib/igniter/server/handlers/agent_message_handler.rb +0 -107
  1113. data/packages/igniter-server/lib/igniter/server/handlers/agent_session_handler.rb +0 -125
  1114. data/packages/igniter-server/lib/igniter/server/handlers/base.rb +0 -105
  1115. data/packages/igniter-server/lib/igniter/server/handlers/contracts_handler.rb +0 -15
  1116. data/packages/igniter-server/lib/igniter/server/handlers/event_handler.rb +0 -32
  1117. data/packages/igniter-server/lib/igniter/server/handlers/execute_handler.rb +0 -43
  1118. data/packages/igniter-server/lib/igniter/server/handlers/health_handler.rb +0 -32
  1119. data/packages/igniter-server/lib/igniter/server/handlers/liveness_handler.rb +0 -20
  1120. data/packages/igniter-server/lib/igniter/server/handlers/manifest_handler.rb +0 -77
  1121. data/packages/igniter-server/lib/igniter/server/handlers/metrics_handler.rb +0 -51
  1122. data/packages/igniter-server/lib/igniter/server/handlers/peers_handler.rb +0 -136
  1123. data/packages/igniter-server/lib/igniter/server/handlers/readiness_handler.rb +0 -47
  1124. data/packages/igniter-server/lib/igniter/server/handlers/status_handler.rb +0 -27
  1125. data/packages/igniter-server/lib/igniter/server/http_server.rb +0 -222
  1126. data/packages/igniter-server/lib/igniter/server/rack_app.rb +0 -60
  1127. data/packages/igniter-server/lib/igniter/server/registry.rb +0 -56
  1128. data/packages/igniter-server/lib/igniter/server/remote_adapter.rb +0 -27
  1129. data/packages/igniter-server/lib/igniter/server/router.rb +0 -291
  1130. data/packages/igniter-server/lib/igniter/server/server_logger.rb +0 -54
  1131. data/packages/igniter-server/lib/igniter/server.rb +0 -130
  1132. data/packages/igniter-server/lib/igniter-server.rb +0 -3
@@ -1,2367 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "app/runtime"
4
- require_relative "app/diagnostics"
5
- require_relative "app/credentials"
6
- require_relative "app/evolution"
7
- require_relative "app/operator"
8
- require_relative "app/observability"
9
- require_relative "app/observability_pack"
10
- require_relative "app/orchestration"
11
- require "igniter/stack"
12
-
13
- module Igniter
14
- # Base class for Igniter apps.
15
- #
16
- # Provides a unified DSL for configuration, contract registration,
17
- # scheduled jobs, and server startup — replacing the raw
18
- # Igniter::Server.configure boilerplate.
19
- #
20
- # == Minimal example
21
- #
22
- # require "igniter/app"
23
- #
24
- # class MyApp < Igniter::App
25
- # config_file "app.yml" # optional YAML base config
26
- #
27
- # configure do |c|
28
- # c.app_host.port = 4567
29
- # c.store = Igniter::Runtime::Stores::MemoryStore.new
30
- # end
31
- #
32
- # register "OrderContract", OrderContract
33
- #
34
- # schedule :cleanup, every: "1h" do
35
- # puts "running cleanup..."
36
- # end
37
- # end
38
- #
39
- # MyApp.start # blocking built-in HTTP server
40
- # MyApp.rack_app # Rack-compatible app (Puma / Unicorn)
41
- #
42
- # == YAML config (app.yml)
43
- #
44
- # # app_host is optional. In stack-first projects, host/port often live
45
- # # in stack.yml node/server config rather than in app-local YAML.
46
- # app_host:
47
- # port: 4567
48
- # host: "0.0.0.0"
49
- # log_format: json # text (default) or json
50
- # drain_timeout: 30
51
- #
52
- # Values from the YAML file are applied first; the Ruby `configure` block
53
- # runs afterwards and always wins.
54
- #
55
- # In Stack/App vNext, an app is primarily a code/runtime package boundary.
56
- # Deployment ports and process grouping belong to stack nodes.
57
- class App
58
- class << self
59
- UNDEFINED_EVOLUTION_STORE = Object.new
60
- UNDEFINED_ORCHESTRATION_INBOX = Object.new
61
-
62
- # ─── DSL ─────────────────────────────────────────────────────────────────
63
-
64
- def host(name = nil)
65
- return (@host_name ||= :app) unless name
66
-
67
- @host_name = normalize_host_name(name)
68
- @host_adapter = nil
69
- self
70
- end
71
-
72
- def register_host(name, builder = nil, &block)
73
- HostRegistry.register(name, builder, &block)
74
- end
75
-
76
- def loader(name = nil)
77
- return (@loader_name ||= :filesystem) unless name
78
-
79
- @loader_name = normalize_loader_name(name)
80
- @loader_adapter = nil
81
- self
82
- end
83
-
84
- def register_loader(name, builder = nil, &block)
85
- LoaderRegistry.register(name, builder, &block)
86
- end
87
-
88
- def scheduler(name = nil)
89
- return (@scheduler_name ||= :threaded) unless name
90
-
91
- @scheduler_name = normalize_scheduler_name(name)
92
- @scheduler_adapter = nil
93
- self
94
- end
95
-
96
- def register_scheduler(name, builder = nil, &block)
97
- SchedulerRegistry.register(name, builder, &block)
98
- end
99
-
100
- def use(*names)
101
- resolved_names = names.flatten.map(&:to_sym)
102
- Igniter::SDK.activate!(*resolved_names, layer: :app)
103
- @sdk_capabilities |= resolved_names
104
- self
105
- end
106
-
107
- def expose(name, callable)
108
- @exposed_interfaces ||= {}
109
- @exposed_interfaces[name.to_sym] = callable
110
- end
111
-
112
- def provide(name, callable = nil, &block)
113
- resolved = callable || block
114
- raise ArgumentError, "provide requires a callable or block" unless resolved
115
- raise ArgumentError, "provide cannot use both a callable and a block" if callable && block
116
-
117
- expose(name, resolved)
118
- end
119
-
120
- def exposed_interfaces
121
- @exposed_interfaces || {}
122
- end
123
-
124
- def provided_interfaces
125
- exposed_interfaces
126
- end
127
-
128
- def bind_stack_context(stack_class:, app_name:, access_to: [])
129
- @stack_bindings ||= {}
130
- @stack_bindings[stack_class] = {
131
- app_name: app_name.to_sym,
132
- access_to: Array(access_to).map(&:to_sym).freeze
133
- }.freeze
134
- @preferred_stack_class = stack_class
135
- self
136
- end
137
-
138
- def stack_bindings
139
- (@stack_bindings || {}).dup
140
- end
141
-
142
- def stack_class(stack = nil)
143
- return stack if stack
144
- return @preferred_stack_class if defined?(@preferred_stack_class) && @preferred_stack_class
145
-
146
- bindings = @stack_bindings || {}
147
- return bindings.keys.first if bindings.size == 1
148
-
149
- nil
150
- end
151
-
152
- def app_name_in_stack(stack = nil)
153
- stack_binding_for!(stack).fetch(:app_name)
154
- end
155
-
156
- def declared_access_to(stack = nil)
157
- stack_binding_for!(stack).fetch(:access_to)
158
- end
159
-
160
- def can_access_interface?(name, stack: nil)
161
- declared_access_to(stack).include?(name.to_sym)
162
- rescue ArgumentError
163
- false
164
- end
165
-
166
- def interfaces(stack: nil)
167
- resolved_stack = stack_context_for!(stack)
168
- allowed = declared_access_to(resolved_stack)
169
- resolved_stack.interfaces.each_with_object({}) do |(name, callable), hash|
170
- hash[name] = callable if allowed.include?(name)
171
- end
172
- end
173
-
174
- def interface(name, stack: nil)
175
- iface_name = name.to_sym
176
- return exposed_interfaces.fetch(iface_name) if exposed_interfaces.key?(iface_name)
177
-
178
- resolved_stack = stack_context_for!(stack)
179
- allowed = declared_access_to(resolved_stack)
180
- unless allowed.include?(iface_name)
181
- raise KeyError,
182
- "App #{self} does not declare access_to #{iface_name.inspect} on #{resolved_stack}. " \
183
- "Declared interfaces: #{allowed.inspect}"
184
- end
185
-
186
- resolved_stack.interface(iface_name)
187
- end
188
-
189
- def evolution_store(store = UNDEFINED_EVOLUTION_STORE)
190
- return @evolution_store if store.equal?(UNDEFINED_EVOLUTION_STORE)
191
-
192
- @evolution_store = store
193
- reload_evolution_trail!
194
- end
195
-
196
- def evolution_log(path, retain_events: nil, archive: nil, retention_policy: nil)
197
- evolution_store(
198
- Evolution::Stores::FileStore.new(
199
- path: resolve_path(path),
200
- max_events: retain_events,
201
- archive_path: archive ? resolve_path(archive) : nil,
202
- retention_policy: retention_policy
203
- )
204
- )
205
- end
206
-
207
- def orchestration_inbox(inbox = UNDEFINED_ORCHESTRATION_INBOX)
208
- return (@orchestration_inbox ||= Orchestration::Inbox.new) if inbox.equal?(UNDEFINED_ORCHESTRATION_INBOX)
209
-
210
- @orchestration_inbox = inbox
211
- end
212
-
213
- def register_orchestration_handler(action, handler = nil, queue: nil, &block)
214
- Orchestration::HandlerRegistry.register(action, handler, queue: queue, &block)
215
- end
216
-
217
- def register_orchestration_lane(action, lane:, policy: nil, handler: nil, routing: nil, queue: nil, channel: nil, description: nil, default: false, &block)
218
- resolved_handler = handler || block
219
- lane_routing = (routing || {}).dup
220
- lane_routing[:queue] = queue if queue
221
- lane_routing[:channel] = channel if channel
222
-
223
- Orchestration::LaneRegistry.register(
224
- action,
225
- lane: lane,
226
- queue: lane_routing[:queue],
227
- channel: lane_routing[:channel],
228
- routing: lane_routing,
229
- policy: policy,
230
- handler: resolved_handler,
231
- description: description
232
- )
233
-
234
- register_orchestration_policy(action, policy, queue: lane_routing[:queue]) if policy
235
- register_orchestration_handler(action, resolved_handler, queue: lane_routing[:queue]) if resolved_handler
236
- register_orchestration_routing(action, lane_routing) if default && !lane_routing.empty?
237
- end
238
-
239
- def orchestration_handler(action_or_item)
240
- if action_or_item.is_a?(Hash)
241
- action = action_or_item.fetch(:action)
242
- queue = action_or_item[:queue] || action_or_item.dig(:routing, :queue)
243
- return Orchestration::HandlerRegistry.fetch(action, queue: queue)
244
- end
245
-
246
- Orchestration::HandlerRegistry.fetch(action_or_item)
247
- end
248
-
249
- def register_orchestration_policy(action, policy = nil, queue: nil, &block)
250
- Orchestration::PolicyRegistry.register(action, policy, queue: queue, &block)
251
- end
252
-
253
- def orchestration_policy(action_or_item, queue: nil)
254
- if action_or_item.is_a?(Hash)
255
- action = action_or_item.fetch(:action)
256
- resolved_queue = queue || action_or_item[:queue] || action_or_item.dig(:routing, :queue)
257
- return Orchestration::PolicyRegistry.fetch(action, queue: resolved_queue)
258
- end
259
-
260
- Orchestration::PolicyRegistry.fetch(action_or_item, queue: queue)
261
- end
262
-
263
- def orchestration_lane(action_or_item, lane: nil, queue: nil)
264
- if action_or_item.is_a?(Hash)
265
- action = action_or_item.fetch(:action)
266
- resolved_lane = lane || action_or_item.dig(:lane, :name)
267
- resolved_queue = queue || action_or_item[:queue] || action_or_item.dig(:routing, :queue)
268
- return Orchestration::LaneRegistry.find(action, lane: resolved_lane, queue: resolved_queue)
269
- end
270
-
271
- Orchestration::LaneRegistry.find(action_or_item, lane: lane, queue: queue)
272
- end
273
-
274
- def register_orchestration_routing(action, routing = nil, &block)
275
- Orchestration::RoutingRegistry.register(action, routing, &block)
276
- end
277
-
278
- def orchestration_routing(action_or_item, policy: nil)
279
- action =
280
- if action_or_item.is_a?(Hash)
281
- action_or_item.fetch(:action)
282
- else
283
- action_or_item
284
- end
285
-
286
- resolved_policy = policy || orchestration_policy(action)
287
- default_routing = resolved_policy.default_routing
288
- override_routing = Orchestration::RoutingRegistry.registered?(action) ? Orchestration::RoutingRegistry.fetch(action) : {}
289
-
290
- default_routing.merge(override_routing).freeze
291
- end
292
-
293
- def sdk_capabilities
294
- @sdk_capabilities ||= []
295
- end
296
-
297
- def host_adapter(adapter = nil)
298
- return (@host_adapter ||= build_host_adapter(host)) unless adapter
299
-
300
- @host_adapter = adapter
301
- end
302
-
303
- def loader_adapter(adapter = nil)
304
- return (@loader_adapter ||= build_loader_adapter(loader)) unless adapter
305
-
306
- @loader_adapter = adapter
307
- end
308
-
309
- def scheduler_adapter(adapter = nil)
310
- return (@scheduler_adapter ||= build_scheduler_adapter(scheduler)) unless adapter
311
-
312
- @scheduler_adapter = adapter
313
- end
314
-
315
- # Root directory for this application.
316
- # Relative config and autoload paths are resolved from here.
317
- def root_dir(path = nil)
318
- return @root_dir unless path
319
-
320
- @root_dir = File.expand_path(path)
321
- end
322
-
323
- # Path to an optional YAML configuration file.
324
- # Loaded before the configure block — configure values override YAML.
325
- def config_file(path)
326
- @yml_path = path
327
- end
328
-
329
- def credentials_file(path = nil, override: false)
330
- return @credentials_path if path.nil?
331
-
332
- @credentials_path = path
333
- @credentials_override = override
334
- end
335
-
336
- def credentials_status
337
- Credentials::ConfigLoader.status(
338
- resolved_credentials_path,
339
- applied_keys: @last_credentials_apply_result&.fetch(:applied, {})&.keys || [],
340
- override: !!@credentials_override
341
- )
342
- end
343
-
344
- # Configure the application. Block receives an AppConfig instance.
345
- # May be called multiple times; blocks are applied in order.
346
- def configure(&block)
347
- @configure_blocks << block
348
- end
349
-
350
- # Declare a directory whose .rb files are eagerly required at startup
351
- # (before contracts are registered).
352
- def executors_path(path)
353
- @executors_paths << path
354
- end
355
-
356
- # Declare a directory whose .rb files are eagerly required at startup.
357
- def contracts_path(path)
358
- @contracts_paths << path
359
- end
360
-
361
- # Declare a directory whose .rb files are eagerly required at startup
362
- # (agents, supervisors, and other actor-system components).
363
- def agents_path(path)
364
- @agents_paths << path
365
- end
366
-
367
- # Declare a directory whose .rb files are eagerly required at startup
368
- # (Tool subclasses — LLM-callable function wrappers).
369
- def tools_path(path)
370
- @tools_paths << path
371
- end
372
-
373
- # Declare a directory whose .rb files are eagerly required at startup
374
- # (Skill subclasses — LLM reasoning loops with their own tool sets).
375
- def skills_path(path)
376
- @skills_paths << path
377
- end
378
-
379
- # Register a custom HTTP route handled by this application.
380
- #
381
- # route "POST", "/telegram/webhook", with: TelegramWebhook
382
- # route "GET", %r{\A/internal/ping\z} do |params:, body:, headers:, env:, raw_body:, config:|
383
- # { ok: true }
384
- # end
385
- def route(method, path, with: nil, &block)
386
- raise ArgumentError, "route requires a callable `with:` or a block" unless with || block
387
- raise ArgumentError, "route cannot use both `with:` and a block" if with && block
388
-
389
- handler = with || block
390
- @custom_routes << {
391
- method: method.to_s.upcase,
392
- path: path,
393
- handler: handler
394
- }
395
- end
396
-
397
- # Register a hook to run before every custom application route.
398
- # Hook receives a mutable request hash:
399
- #
400
- # before_request do |request:|
401
- # request[:headers]["X-Trace"] ||= "demo"
402
- # end
403
- def before_request(with: nil, &block)
404
- @before_request_hooks << normalize_request_hook!(with, block, :before_request)
405
- end
406
-
407
- # Register a hook to run after every custom application route.
408
- # Hook receives the request hash and the normalized response hash.
409
- def after_request(with: nil, &block)
410
- @after_request_hooks << normalize_request_hook!(with, block, :after_request)
411
- end
412
-
413
- # Register a hook to wrap custom application route handling.
414
- # Hook receives the request hash and a block that continues the pipeline.
415
- def around_request(with: nil, &block)
416
- @around_request_hooks << normalize_request_hook!(with, block, :around_request)
417
- end
418
-
419
- # Register a contract class under a name for HTTP dispatch.
420
- def register(name, contract_class)
421
- @registered[name.to_s] = contract_class
422
- end
423
-
424
- def registered_contracts
425
- @registered.dup
426
- end
427
-
428
- # Register a block to run after all paths are autoloaded but before the
429
- # server starts. Use this for registrations that reference autoloaded
430
- # constants, e.g.:
431
- #
432
- # on_boot { register "MyContract", MyContract }
433
- #
434
- def on_boot(&block)
435
- @boot_blocks << block
436
- end
437
-
438
- # Define a recurring background job.
439
- #
440
- # schedule :report, every: "1d", at: "09:00" do
441
- # DailyReportContract.new.resolve_all(...)
442
- # end
443
- #
444
- # Interval formats: Integer (seconds), "30s", "5m", "2h", "1d",
445
- # or Hash { hours: 1, minutes: 30 }.
446
- def schedule(name, every:, at: nil, &block)
447
- @scheduled_jobs << { name: name, every: every, at: at, block: block }
448
- end
449
-
450
- # ─── Lifecycle ───────────────────────────────────────────────────────────
451
-
452
- # Start the built-in HTTP server (blocking).
453
- # Schedules background jobs and delegates runtime hosting to the
454
- # configured host adapter.
455
- def start
456
- host = host_adapter
457
- host.activate_transport!
458
- config = build!
459
- scheduler = start_scheduler(config)
460
- at_exit { stop_scheduler(scheduler) }
461
- host.start(config: config)
462
- end
463
-
464
- # Return a Rack-compatible application (for Puma / Unicorn / etc.)
465
- # through the configured host adapter.
466
- def rack_app
467
- host = host_adapter
468
- host.activate_transport!
469
- config = build!
470
- start_scheduler(config)
471
- host.rack_app(config: config)
472
- end
473
-
474
- def evolution_plan(target)
475
- plan = Evolution::Planner.new(app_class: self).plan(target)
476
- evolution_trail.record(
477
- :evolution_plan_built,
478
- source: plan.source,
479
- payload: {
480
- total_actions: plan.actions.size,
481
- approval_required: plan.approval_required?,
482
- action_ids: plan.actions.map { |action| action[:id] },
483
- uncovered_capabilities: plan.summary[:uncovered_capabilities]
484
- }
485
- )
486
- plan
487
- end
488
-
489
- def orchestration_plan(target)
490
- Orchestration::Planner.new(app_class: self).plan(target)
491
- end
492
-
493
- def orchestration_followup(target)
494
- plan = target.is_a?(Orchestration::Plan) ? target : orchestration_plan(target)
495
- plan.followup_request
496
- end
497
-
498
- def open_orchestration_followups(target)
499
- plan = target.is_a?(Orchestration::Plan) ? target : orchestration_plan(target)
500
- execution = orchestration_execution_for(target)
501
- if execution && !target.is_a?(Orchestration::Plan)
502
- materialize_orchestration_sessions(plan, execution)
503
- plan = orchestration_plan(target)
504
- end
505
- graph, execution_id = orchestration_runtime_identity_for(target)
506
- Orchestration::Runner.new(app_class: self).run(
507
- plan,
508
- graph: graph,
509
- execution_id: execution_id,
510
- execution: execution
511
- )
512
- end
513
-
514
- def acknowledge_orchestration_item(id, note: nil, audit: nil)
515
- applied_audit = canonical_orchestration_audit(
516
- audit,
517
- requested_operation: :acknowledge,
518
- lifecycle_operation: :acknowledge,
519
- execution_operation: :acknowledge
520
- )
521
- item = orchestration_inbox.acknowledge(
522
- id,
523
- note: note,
524
- audit: applied_audit
525
- )
526
- augment_orchestration_action_result(
527
- item,
528
- requested_operation: :acknowledge,
529
- handled_operation: :acknowledge,
530
- handled_lifecycle_operation: :acknowledge,
531
- handled_execution_operation: :acknowledge,
532
- handled_policy: nil,
533
- note: note,
534
- audit: applied_audit
535
- )
536
- end
537
-
538
- def resolve_orchestration_item(id, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, note: nil, audit: nil)
539
- item = orchestration_inbox.find(id)
540
- return nil unless item
541
-
542
- resume_result = resume_orchestration_item_runtime(item, target: target, value: value)
543
- applied_audit = canonical_orchestration_audit(
544
- audit,
545
- requested_operation: :resolve,
546
- lifecycle_operation: :resolve,
547
- execution_operation: :resolve
548
- )
549
- resolved_item = orchestration_inbox.resolve(
550
- id,
551
- note: note,
552
- metadata: resume_result[:metadata],
553
- audit: applied_audit
554
- )
555
- result = augment_orchestration_runtime_result(
556
- resolved_item,
557
- execution: resume_result[:execution]
558
- )
559
- augment_orchestration_action_result(
560
- result,
561
- requested_operation: :resolve,
562
- handled_operation: :resolve,
563
- handled_lifecycle_operation: :resolve,
564
- handled_execution_operation: :resolve,
565
- handled_policy: nil,
566
- note: note,
567
- audit: applied_audit
568
- )
569
- end
570
-
571
- def dismiss_orchestration_item(id, note: nil, audit: nil)
572
- applied_audit = canonical_orchestration_audit(
573
- audit,
574
- requested_operation: :dismiss,
575
- lifecycle_operation: :dismiss,
576
- execution_operation: :dismiss
577
- )
578
- item = orchestration_inbox.dismiss(
579
- id,
580
- note: note,
581
- audit: applied_audit
582
- )
583
- augment_orchestration_action_result(
584
- item,
585
- requested_operation: :dismiss,
586
- handled_operation: :dismiss,
587
- handled_lifecycle_operation: :dismiss,
588
- handled_execution_operation: :dismiss,
589
- handled_policy: nil,
590
- note: note,
591
- audit: applied_audit
592
- )
593
- end
594
-
595
- def wake_orchestration_item(id, note: nil, audit: nil)
596
- handle_orchestration_item(id, operation: :wake, note: note, audit: audit)
597
- end
598
-
599
- def handoff_orchestration_item(id, assignee: nil, queue: nil, channel: nil, note: nil, audit: nil)
600
- applied_audit = canonical_orchestration_audit(
601
- audit,
602
- requested_operation: :handoff,
603
- lifecycle_operation: :acknowledge,
604
- execution_operation: :handoff
605
- )
606
- item = orchestration_inbox.handoff(
607
- id,
608
- assignee: assignee,
609
- queue: queue,
610
- channel: channel,
611
- note: note,
612
- audit: applied_audit
613
- )
614
- augment_orchestration_action_result(
615
- item,
616
- requested_operation: :handoff,
617
- handled_operation: :handoff,
618
- handled_lifecycle_operation: :acknowledge,
619
- handled_execution_operation: :handoff,
620
- handled_policy: nil,
621
- note: note,
622
- audit: applied_audit,
623
- handled_queue: item[:queue],
624
- handled_channel: item[:channel],
625
- handled_assignee: item[:assignee]
626
- )
627
- end
628
-
629
- def complete_orchestration_item(id, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, note: nil, audit: nil)
630
- handle_orchestration_item(id, operation: :complete, target: target, value: value, note: note, audit: audit)
631
- end
632
-
633
- def approve_orchestration_item(id, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, note: nil, audit: nil)
634
- handle_orchestration_item(id, operation: :approve, target: target, value: value, note: note, audit: audit)
635
- end
636
-
637
- def reply_to_orchestration_item(id, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, note: nil, audit: nil)
638
- handle_orchestration_item(id, operation: :reply, target: target, value: value, note: note, audit: audit)
639
- end
640
-
641
- def wake_operator_item(id, target: nil, note: nil, audit: nil)
642
- handle_operator_item(id, operation: :wake, target: target, note: note, audit: audit)
643
- end
644
-
645
- def handoff_operator_item(id, assignee: nil, queue: nil, channel: nil, note: nil, audit: nil)
646
- handle_operator_item(
647
- id,
648
- operation: :handoff,
649
- assignee: assignee,
650
- queue: queue,
651
- channel: channel,
652
- note: note,
653
- audit: audit
654
- )
655
- end
656
-
657
- def complete_operator_item(id, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, note: nil, audit: nil)
658
- handle_operator_item(id, operation: :complete, target: target, value: value, note: note, audit: audit)
659
- end
660
-
661
- def approve_operator_item(id, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, note: nil, audit: nil)
662
- handle_operator_item(id, operation: :approve, target: target, value: value, note: note, audit: audit)
663
- end
664
-
665
- def reply_to_operator_item(id, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, note: nil, audit: nil)
666
- handle_operator_item(id, operation: :reply, target: target, value: value, note: note, audit: audit)
667
- end
668
-
669
- def dismiss_operator_item(id, note: nil, audit: nil)
670
- handle_operator_item(id, operation: :dismiss, note: note, audit: audit)
671
- end
672
-
673
- def retry_operator_item(id, note: nil, audit: nil)
674
- handle_operator_item(id, operation: :retry_bootstrap, note: note, audit: audit)
675
- end
676
-
677
- def detach_operator_item(id, note: nil, audit: nil)
678
- handle_operator_item(id, operation: :detach, note: note, audit: audit)
679
- end
680
-
681
- def reignite_operator_item(id, note: nil, audit: nil)
682
- handle_operator_item(id, operation: :reignite, note: note, audit: audit)
683
- end
684
-
685
- def teardown_operator_item(id, note: nil, audit: nil)
686
- handle_operator_item(id, operation: :teardown, note: note, audit: audit)
687
- end
688
-
689
- def reconcile_operator_item(id, note: nil, audit: nil)
690
- handle_operator_item(id, operation: :reconcile_join, note: note, audit: audit)
691
- end
692
-
693
- def handle_operator_item(id, operation: nil, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, assignee: nil, queue: nil, channel: nil, note: nil, audit: nil)
694
- record = operator_query(target, filters: { id: id }).first
695
- return nil unless record
696
-
697
- operator_dispatcher.call(
698
- app_class: self,
699
- record: record,
700
- operation: operation,
701
- target: target,
702
- value: value,
703
- assignee: assignee,
704
- queue: queue,
705
- channel: channel,
706
- note: note,
707
- audit: audit
708
- )
709
- end
710
-
711
- def handle_orchestration_item(id, operation: nil, target: nil, value: Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE, assignee: nil, queue: nil, channel: nil, note: nil, audit: nil)
712
- item = orchestration_inbox.find(id)
713
- return nil unless item
714
-
715
- handler = orchestration_handler(item)
716
- kwargs = {
717
- app_class: self,
718
- item: item,
719
- operation: operation,
720
- target: target,
721
- value: value,
722
- assignee: assignee,
723
- queue: queue,
724
- channel: channel,
725
- note: note,
726
- audit: audit
727
- }
728
- kwargs.delete(:audit) unless callable_accepts_keyword?(handler, :audit)
729
-
730
- handler.call(**kwargs)
731
- end
732
-
733
- def evolution_approval(target)
734
- plan = target.is_a?(Evolution::Plan) ? target : evolution_plan(target)
735
- request = plan.approval_request
736
- evolution_trail.record(
737
- :evolution_approval_requested,
738
- source: plan.source,
739
- payload: {
740
- total_actions: request.summary[:total],
741
- action_ids: request.action_ids,
742
- constrained: request.summary[:constrained]
743
- }
744
- )
745
- request
746
- end
747
-
748
- def apply_evolution!(target, approval: nil, approve: false, selections: {})
749
- plan = target.is_a?(Evolution::Plan) ? target : evolution_plan(target)
750
- decision = Evolution::ApprovalDecision.normalize(approval.nil? ? approve : approval, selections: selections)
751
- if plan.approval_required? && decision
752
- evolution_trail.record(
753
- :evolution_approval_recorded,
754
- source: plan.source,
755
- payload: decision.to_h.merge(action_ids: plan.actions.map { |action| action[:id] })
756
- )
757
- end
758
- result = Evolution::Runner.new(app_class: self).run(
759
- plan,
760
- approval: decision,
761
- approve: approve,
762
- selections: selections
763
- )
764
- evolution_trail.record(
765
- :"evolution_#{result.status}",
766
- source: plan.source,
767
- payload: {
768
- applied_action_ids: result.applied.map { |entry| entry[:id] },
769
- blocked_action_ids: result.blocked.map { |entry| entry[:id] },
770
- blocked_reasons: result.blocked.map { |entry| entry[:reason] }.uniq
771
- }
772
- )
773
- result
774
- end
775
-
776
- def evolution_trail
777
- @evolution_trail ||= Evolution::Trail.new(app_class: self, store: evolution_store)
778
- end
779
-
780
- def reset_evolution_trail!
781
- evolution_trail.clear!
782
- end
783
-
784
- def reload_evolution_trail!
785
- @evolution_trail = Evolution::Trail.new(app_class: self, store: evolution_store)
786
- end
787
-
788
- def reset_orchestration_inbox!
789
- orchestration_inbox.clear!
790
- end
791
-
792
- def orchestration_query
793
- orchestration_inbox.query
794
- end
795
-
796
- def orchestration_inbox_query
797
- orchestration_query
798
- end
799
-
800
- def orchestration_summary
801
- orchestration_query.summary
802
- end
803
-
804
- def orchestration_runtime_overview(target = nil)
805
- execution = orchestration_execution_for(target)
806
- return nil unless execution
807
-
808
- merged_orchestration_runtime_overview(execution)
809
- end
810
-
811
- def orchestration_runtime_event_query(target = nil, filters: nil, order_by: nil, direction: :asc)
812
- overview = orchestration_runtime_overview(target)
813
- return nil unless overview
814
-
815
- query = Orchestration::RuntimeEventQuery.new(overview[:combined_timeline])
816
- apply_orchestration_runtime_event_query_options(
817
- query,
818
- filters: filters,
819
- order_by: order_by,
820
- direction: direction
821
- )
822
- end
823
-
824
- def orchestration_runtime_transition_query(target = nil, filters: nil, order_by: nil, direction: :asc)
825
- execution = orchestration_execution_for(target)
826
- return nil unless execution
827
-
828
- query = execution.orchestration_transition_query
829
- apply_orchestration_runtime_transition_query_options(
830
- query,
831
- filters: filters,
832
- order_by: order_by,
833
- direction: direction
834
- )
835
- end
836
-
837
- def orchestration_runtime_summary(target = nil)
838
- orchestration_runtime_overview(target)&.fetch(:summary, nil)
839
- end
840
-
841
- def orchestration_runtime_event_summary(target = nil, filters: nil, order_by: nil, direction: :asc)
842
- orchestration_runtime_event_query(
843
- target,
844
- filters: filters,
845
- order_by: order_by,
846
- direction: direction
847
- )&.summary
848
- end
849
-
850
- def orchestration_runtime_transition_summary(target = nil, filters: nil, order_by: nil, direction: :asc)
851
- orchestration_runtime_transition_query(
852
- target,
853
- filters: filters,
854
- order_by: order_by,
855
- direction: direction
856
- )&.summary
857
- end
858
-
859
- def orchestration_runtime_event_overview(target = nil, filters: nil, order_by: nil, direction: :asc, limit: 20)
860
- query = orchestration_runtime_event_query(
861
- target,
862
- filters: filters,
863
- order_by: order_by,
864
- direction: direction
865
- )
866
- return nil unless query
867
-
868
- Orchestration::RuntimeQueryOverviewBuilder.build(
869
- query: query,
870
- filters: compact_operator_filters(filters),
871
- order_by: order_by,
872
- direction: direction,
873
- limit: limit
874
- )
875
- end
876
-
877
- def orchestration_runtime_transition_overview(target = nil, filters: nil, order_by: nil, direction: :asc, limit: 20)
878
- query = orchestration_runtime_transition_query(
879
- target,
880
- filters: filters,
881
- order_by: order_by,
882
- direction: direction
883
- )
884
- return nil unless query
885
-
886
- Orchestration::RuntimeQueryOverviewBuilder.build(
887
- query: query,
888
- filters: compact_operator_filters(filters),
889
- order_by: order_by,
890
- direction: direction,
891
- limit: limit
892
- )
893
- end
894
-
895
- def orchestration_runtime_record_event_overview(target = nil, id: nil, node: nil, filters: nil, order_by: nil, direction: :asc, limit: 20)
896
- record = orchestration_runtime_record_for(target, id: id, node: node)
897
- return nil unless record
898
-
899
- query = Orchestration::RuntimeEventQuery.new(record[:combined_timeline])
900
- query = apply_orchestration_runtime_event_query_options(
901
- query,
902
- filters: filters,
903
- order_by: order_by,
904
- direction: direction
905
- )
906
- Orchestration::RuntimeQueryOverviewBuilder.build(
907
- query: query,
908
- filters: compact_operator_filters(filters),
909
- order_by: order_by,
910
- direction: direction,
911
- limit: limit
912
- ).merge(
913
- id: record[:id],
914
- node: record[:node]
915
- ).freeze
916
- end
917
-
918
- def orchestration_runtime_overview_for_execution(graph:, execution_id:, store: nil)
919
- target = operator_target_for_execution(graph: graph, execution_id: execution_id, store: store)
920
- merged_orchestration_runtime_overview(target.execution)
921
- end
922
-
923
- def orchestration_runtime_event_query_for_execution(graph:, execution_id:, store: nil, filters: nil, order_by: nil, direction: :asc)
924
- query = Orchestration::RuntimeEventQuery.new(
925
- orchestration_runtime_overview_for_execution(
926
- graph: graph,
927
- execution_id: execution_id,
928
- store: store
929
- )[:combined_timeline]
930
- )
931
- apply_orchestration_runtime_event_query_options(
932
- query,
933
- filters: filters,
934
- order_by: order_by,
935
- direction: direction
936
- )
937
- end
938
-
939
- def orchestration_runtime_transition_query_for_execution(graph:, execution_id:, store: nil, filters: nil, order_by: nil, direction: :asc)
940
- query = operator_target_for_execution(graph: graph, execution_id: execution_id, store: store).execution.orchestration_transition_query
941
- apply_orchestration_runtime_transition_query_options(
942
- query,
943
- filters: filters,
944
- order_by: order_by,
945
- direction: direction
946
- )
947
- end
948
-
949
- def orchestration_runtime_summary_for_execution(graph:, execution_id:, store: nil)
950
- orchestration_runtime_overview_for_execution(
951
- graph: graph,
952
- execution_id: execution_id,
953
- store: store
954
- ).fetch(:summary)
955
- end
956
-
957
- def orchestration_runtime_event_summary_for_execution(graph:, execution_id:, store: nil, filters: nil, order_by: nil, direction: :asc)
958
- orchestration_runtime_event_query_for_execution(
959
- graph: graph,
960
- execution_id: execution_id,
961
- store: store,
962
- filters: filters,
963
- order_by: order_by,
964
- direction: direction
965
- ).summary
966
- end
967
-
968
- def orchestration_runtime_transition_summary_for_execution(graph:, execution_id:, store: nil, filters: nil, order_by: nil, direction: :asc)
969
- orchestration_runtime_transition_query_for_execution(
970
- graph: graph,
971
- execution_id: execution_id,
972
- store: store,
973
- filters: filters,
974
- order_by: order_by,
975
- direction: direction
976
- ).summary
977
- end
978
-
979
- def orchestration_runtime_event_overview_for_execution(graph:, execution_id:, store: nil, filters: nil, order_by: nil, direction: :asc, limit: 20)
980
- query = orchestration_runtime_event_query_for_execution(
981
- graph: graph,
982
- execution_id: execution_id,
983
- store: store,
984
- filters: filters,
985
- order_by: order_by,
986
- direction: direction
987
- )
988
- Orchestration::RuntimeQueryOverviewBuilder.build(
989
- query: query,
990
- filters: compact_operator_filters(filters),
991
- order_by: order_by,
992
- direction: direction,
993
- limit: limit
994
- )
995
- end
996
-
997
- def orchestration_runtime_transition_overview_for_execution(graph:, execution_id:, store: nil, filters: nil, order_by: nil, direction: :asc, limit: 20)
998
- query = orchestration_runtime_transition_query_for_execution(
999
- graph: graph,
1000
- execution_id: execution_id,
1001
- store: store,
1002
- filters: filters,
1003
- order_by: order_by,
1004
- direction: direction
1005
- )
1006
- Orchestration::RuntimeQueryOverviewBuilder.build(
1007
- query: query,
1008
- filters: compact_operator_filters(filters),
1009
- order_by: order_by,
1010
- direction: direction,
1011
- limit: limit
1012
- )
1013
- end
1014
-
1015
- def orchestration_runtime_record_event_overview_for_execution(graph:, execution_id:, store: nil, id: nil, node: nil, filters: nil, order_by: nil, direction: :asc, limit: 20)
1016
- target = operator_target_for_execution(graph: graph, execution_id: execution_id, store: store)
1017
- orchestration_runtime_record_event_overview(
1018
- target.execution,
1019
- id: id,
1020
- node: node,
1021
- filters: filters,
1022
- order_by: order_by,
1023
- direction: direction,
1024
- limit: limit
1025
- )
1026
- end
1027
-
1028
- def operator_query(target = nil, filters: nil, order_by: nil, direction: :asc)
1029
- execution = orchestration_execution_for(target)
1030
- query = Orchestration::OperatorQuery.new(operator_records_for(execution))
1031
- apply_operator_query_options(query, filters: filters, order_by: order_by, direction: direction)
1032
- end
1033
-
1034
- def orchestration_operator_query(target = nil, filters: nil, order_by: nil, direction: :asc)
1035
- operator_query(target, filters: filters, order_by: order_by, direction: direction)
1036
- end
1037
-
1038
- def operator_summary(target = nil, filters: nil, order_by: nil, direction: :asc)
1039
- operator_query(target, filters: filters, order_by: order_by, direction: direction).summary
1040
- end
1041
-
1042
- def request_credential_lease(...)
1043
- resolved_stack = stack_class
1044
- raise ArgumentError, "App #{self} is not bound to a stack" unless resolved_stack
1045
-
1046
- resolved_stack.request_credential_lease(...)
1047
- end
1048
-
1049
- def issue_credential_lease(...)
1050
- resolved_stack = stack_class
1051
- raise ArgumentError, "App #{self} is not bound to a stack" unless resolved_stack
1052
-
1053
- resolved_stack.issue_credential_lease(...)
1054
- end
1055
-
1056
- def deny_credential_lease(...)
1057
- resolved_stack = stack_class
1058
- raise ArgumentError, "App #{self} is not bound to a stack" unless resolved_stack
1059
-
1060
- resolved_stack.deny_credential_lease(...)
1061
- end
1062
-
1063
- def revoke_credential_lease(...)
1064
- resolved_stack = stack_class
1065
- raise ArgumentError, "App #{self} is not bound to a stack" unless resolved_stack
1066
-
1067
- resolved_stack.revoke_credential_lease(...)
1068
- end
1069
-
1070
- def credential_request_overview(limit: 20, filters: nil, order_by: nil, direction: :asc)
1071
- resolved_stack = stack_class
1072
- return nil unless resolved_stack
1073
-
1074
- resolved_stack.credential_request_history(
1075
- limit: limit,
1076
- filters: filters,
1077
- order_by: order_by,
1078
- direction: direction
1079
- ).merge(
1080
- app: name,
1081
- stack: resolved_stack.name || "anonymous"
1082
- ).freeze
1083
- end
1084
-
1085
- def operator_overview(target = nil, limit: 20, filters: nil, order_by: nil, direction: :asc, event_filters: nil, event_order_by: nil, event_direction: :asc, event_limit: nil, credential_filters: nil, credential_order_by: nil, credential_direction: :asc, credential_limit: nil, credential_request_filters: nil, credential_request_order_by: nil, credential_request_direction: :asc, credential_request_limit: nil)
1086
- query = operator_query(target, filters: filters, order_by: order_by, direction: direction)
1087
- execution = orchestration_execution_for(target)
1088
- orchestration_runtime = execution ? orchestration_runtime_overview(execution) : nil
1089
- credential_audit = credential_audit_overview(
1090
- limit: credential_limit || event_limit || limit,
1091
- filters: credential_filters,
1092
- order_by: credential_order_by,
1093
- direction: credential_direction
1094
- )
1095
- credential_requests = credential_request_overview(
1096
- limit: credential_request_limit || credential_limit || event_limit || limit,
1097
- filters: credential_request_filters,
1098
- order_by: credential_request_order_by,
1099
- direction: credential_request_direction
1100
- )
1101
- orchestration_transitions =
1102
- execution ? orchestration_runtime_transition_overview(
1103
- execution,
1104
- order_by: :timestamp,
1105
- direction: :asc,
1106
- limit: event_limit || limit
1107
- ) : nil
1108
- orchestration_events =
1109
- execution ? orchestration_runtime_event_overview(
1110
- execution,
1111
- filters: event_filters,
1112
- order_by: event_order_by,
1113
- direction: event_direction,
1114
- limit: event_limit || limit
1115
- ) : nil
1116
- record_events = operator_record_event_overview(
1117
- execution,
1118
- query: query,
1119
- filters: filters,
1120
- event_filters: event_filters,
1121
- event_order_by: event_order_by,
1122
- event_direction: event_direction,
1123
- event_limit: event_limit || limit
1124
- )
1125
-
1126
- {
1127
- app: name,
1128
- query: operator_query_metadata(filters: filters, order_by: order_by, direction: direction, limit: limit),
1129
- summary: query.summary,
1130
- runtime: operator_runtime_overview(query),
1131
- credential_audit: credential_audit,
1132
- credential_requests: credential_requests,
1133
- orchestration_runtime: orchestration_runtime,
1134
- orchestration_transitions: orchestration_transitions,
1135
- orchestration_events: orchestration_events,
1136
- record_events: record_events,
1137
- records: query.limit(limit).to_a
1138
- }.freeze
1139
- end
1140
-
1141
- def operator_query_for_execution(graph:, execution_id:, store: nil, filters: nil, order_by: nil, direction: :asc)
1142
- operator_query(
1143
- operator_target_for_execution(graph: graph, execution_id: execution_id, store: store),
1144
- filters: filters,
1145
- order_by: order_by,
1146
- direction: direction
1147
- )
1148
- end
1149
-
1150
- def operator_summary_for_execution(graph:, execution_id:, store: nil, filters: nil, order_by: nil, direction: :asc)
1151
- operator_query_for_execution(
1152
- graph: graph,
1153
- execution_id: execution_id,
1154
- store: store,
1155
- filters: filters,
1156
- order_by: order_by,
1157
- direction: direction
1158
- ).summary
1159
- end
1160
-
1161
- def operator_overview_for_execution(graph:, execution_id:, limit: 20, store: nil, filters: nil, order_by: nil, direction: :asc, event_filters: nil, event_order_by: nil, event_direction: :asc, event_limit: nil, credential_filters: nil, credential_order_by: nil, credential_direction: :asc, credential_limit: nil, credential_request_filters: nil, credential_request_order_by: nil, credential_request_direction: :asc, credential_request_limit: nil)
1162
- query = operator_query_for_execution(
1163
- graph: graph,
1164
- execution_id: execution_id,
1165
- store: store,
1166
- filters: filters,
1167
- order_by: order_by,
1168
- direction: direction
1169
- )
1170
- target = operator_target_for_execution(graph: graph, execution_id: execution_id, store: store)
1171
- orchestration_runtime = orchestration_runtime_overview(target.execution)
1172
- credential_audit = credential_audit_overview(
1173
- limit: credential_limit || event_limit || limit,
1174
- filters: credential_filters,
1175
- order_by: credential_order_by,
1176
- direction: credential_direction
1177
- )
1178
- credential_requests = credential_request_overview(
1179
- limit: credential_request_limit || credential_limit || event_limit || limit,
1180
- filters: credential_request_filters,
1181
- order_by: credential_request_order_by,
1182
- direction: credential_request_direction
1183
- )
1184
- orchestration_transitions = orchestration_runtime_transition_overview_for_execution(
1185
- graph: graph,
1186
- execution_id: execution_id,
1187
- store: store,
1188
- order_by: :timestamp,
1189
- direction: :asc,
1190
- limit: event_limit || limit
1191
- )
1192
- orchestration_events = orchestration_runtime_event_overview_for_execution(
1193
- graph: graph,
1194
- execution_id: execution_id,
1195
- store: store,
1196
- filters: event_filters,
1197
- order_by: event_order_by,
1198
- direction: event_direction,
1199
- limit: event_limit || limit
1200
- )
1201
- record_events = operator_record_event_overview(
1202
- target.execution,
1203
- query: query,
1204
- filters: filters,
1205
- event_filters: event_filters,
1206
- event_order_by: event_order_by,
1207
- event_direction: event_direction,
1208
- event_limit: event_limit || limit
1209
- )
1210
-
1211
- {
1212
- app: name,
1213
- scope: {
1214
- mode: :execution,
1215
- graph: graph,
1216
- execution_id: execution_id
1217
- }.freeze,
1218
- query: operator_query_metadata(filters: filters, order_by: order_by, direction: direction, limit: limit),
1219
- summary: query.summary,
1220
- runtime: operator_runtime_overview(query),
1221
- credential_audit: credential_audit,
1222
- credential_requests: credential_requests,
1223
- orchestration_runtime: orchestration_runtime,
1224
- orchestration_transitions: orchestration_transitions,
1225
- orchestration_events: orchestration_events,
1226
- record_events: record_events,
1227
- records: query.limit(limit).to_a
1228
- }.freeze
1229
- end
1230
-
1231
- def mount_operator_overview(path: "/api/operator", limit: 20, store: nil)
1232
- ObservabilityPack.install(
1233
- self,
1234
- path: path,
1235
- limit: limit,
1236
- store: store
1237
- )
1238
- end
1239
-
1240
- def mount_operator_observability(path: "/api/operator", limit: 20, store: nil)
1241
- mount_operator_overview(path: path, limit: limit, store: store)
1242
- end
1243
-
1244
- def mount_operator_actions(path: "/api/operator/actions", store: nil)
1245
- ObservabilityPack.install_actions(
1246
- self,
1247
- path: path,
1248
- store: store
1249
- )
1250
- end
1251
-
1252
- def mount_operator_surface(path: "/operator", api_path: "/api/operator", action_path: "/api/operator/actions", limit: 20, store: nil, title: nil)
1253
- ObservabilityPack.install_surface(
1254
- self,
1255
- path: path,
1256
- api_path: api_path,
1257
- action_path: action_path,
1258
- limit: limit,
1259
- store: store,
1260
- title: title
1261
- )
1262
- end
1263
-
1264
- def mount_operator_console(path: "/operator", api_path: "/api/operator", action_path: "/api/operator/actions", limit: 20, store: nil, title: nil)
1265
- mount_operator_surface(path: path, api_path: api_path, action_path: action_path, limit: limit, store: store, title: title)
1266
- end
1267
-
1268
- # Expose the AppConfig (populated after the first build!).
1269
- def config = @app_config
1270
-
1271
- # ─── Inheritance isolation ────────────────────────────────────────────────
1272
-
1273
- def inherited(subclass)
1274
- super
1275
- subclass.instance_variable_set(:@root_dir, Dir.pwd)
1276
- subclass.instance_variable_set(:@yml_path, nil)
1277
- subclass.instance_variable_set(:@configure_blocks, [])
1278
- subclass.instance_variable_set(:@executors_paths, [])
1279
- subclass.instance_variable_set(:@contracts_paths, [])
1280
- subclass.instance_variable_set(:@agents_paths, [])
1281
- subclass.instance_variable_set(:@tools_paths, [])
1282
- subclass.instance_variable_set(:@skills_paths, [])
1283
- subclass.instance_variable_set(:@custom_routes, [])
1284
- subclass.instance_variable_set(:@before_request_hooks, [])
1285
- subclass.instance_variable_set(:@after_request_hooks, [])
1286
- subclass.instance_variable_set(:@around_request_hooks, [])
1287
- subclass.instance_variable_set(:@boot_blocks, [])
1288
- subclass.instance_variable_set(:@registered, {})
1289
- subclass.instance_variable_set(:@scheduled_jobs, [])
1290
- subclass.instance_variable_set(:@app_config, AppConfig.new)
1291
- subclass.instance_variable_set(:@sdk_capabilities, [])
1292
- subclass.instance_variable_set(:@host_name, nil)
1293
- subclass.instance_variable_set(:@host_adapter, nil)
1294
- subclass.instance_variable_set(:@loader_name, nil)
1295
- subclass.instance_variable_set(:@loader_adapter, nil)
1296
- subclass.instance_variable_set(:@scheduler_name, nil)
1297
- subclass.instance_variable_set(:@scheduler_adapter, nil)
1298
- subclass.instance_variable_set(:@evolution_store, nil)
1299
- subclass.instance_variable_set(:@evolution_trail, Evolution::Trail.new(app_class: subclass))
1300
- subclass.instance_variable_set(:@orchestration_inbox, nil)
1301
- subclass.instance_variable_set(:@stack_bindings, {})
1302
- subclass.instance_variable_set(:@preferred_stack_class, nil)
1303
- end
1304
-
1305
- private
1306
-
1307
- def stack_context_for!(stack = nil)
1308
- resolved_stack = stack_class(stack)
1309
- return resolved_stack if resolved_stack
1310
-
1311
- raise ArgumentError,
1312
- "App #{self} is not bound to a stack context. Pass stack: explicitly or register it through Igniter::Stack.app."
1313
- end
1314
-
1315
- def stack_binding_for!(stack = nil)
1316
- resolved_stack = stack_context_for!(stack)
1317
- binding = (@stack_bindings || {})[resolved_stack]
1318
- return binding if binding
1319
-
1320
- raise ArgumentError, "App #{self} is not registered in stack #{resolved_stack}."
1321
- end
1322
-
1323
- def normalize_host_name(name)
1324
- name.to_sym
1325
- end
1326
-
1327
- def normalize_scheduler_name(name)
1328
- name.to_sym
1329
- end
1330
-
1331
- def normalize_loader_name(name)
1332
- name.to_sym
1333
- end
1334
-
1335
- def build_host_adapter(name)
1336
- builder = host_registry.fetch(normalize_host_name(name))
1337
-
1338
- build_registered_host(builder)
1339
- rescue KeyError
1340
- raise ArgumentError, "unknown app host #{name.inspect}; expected one of: #{host_registry.names.join(', ')}"
1341
- end
1342
-
1343
- def build_registered_host(builder)
1344
- builder.arity == 0 ? builder.call : builder.call(self)
1345
- end
1346
-
1347
- def build_loader_adapter(name)
1348
- builder = loader_registry.fetch(normalize_loader_name(name))
1349
-
1350
- build_registered_loader(builder)
1351
- rescue KeyError
1352
- raise ArgumentError, "unknown app loader #{name.inspect}; expected one of: #{loader_registry.names.join(', ')}"
1353
- end
1354
-
1355
- def build_registered_loader(builder)
1356
- builder.arity == 0 ? builder.call : builder.call(self)
1357
- end
1358
-
1359
- def build_scheduler_adapter(name)
1360
- builder = scheduler_registry.fetch(normalize_scheduler_name(name))
1361
-
1362
- build_registered_scheduler(builder)
1363
- rescue KeyError
1364
- raise ArgumentError, "unknown app scheduler #{name.inspect}; expected one of: #{scheduler_registry.names.join(', ')}"
1365
- end
1366
-
1367
- def build_registered_scheduler(builder)
1368
- builder.arity == 0 ? builder.call : builder.call(self)
1369
- end
1370
-
1371
- def host_registry
1372
- HostRegistry
1373
- end
1374
-
1375
- def loader_registry
1376
- LoaderRegistry
1377
- end
1378
-
1379
- def scheduler_registry
1380
- SchedulerRegistry
1381
- end
1382
-
1383
- # Build and return a ready host-specific config object.
1384
- def build!
1385
- cfg = @app_config
1386
- apply_yml!(cfg)
1387
- apply_credentials!
1388
- resolved_loader_adapter = load_application_code!
1389
- @boot_blocks.each(&:call)
1390
- @configure_blocks.each { |b| b.call(cfg) }
1391
- cfg.custom_routes = @custom_routes.dup
1392
- cfg.before_request_hooks = @before_request_hooks.dup
1393
- cfg.after_request_hooks = @after_request_hooks.dup
1394
- cfg.around_request_hooks = @around_request_hooks.dup
1395
-
1396
- host_config = cfg.to_host_config
1397
- @registered.each { |name, klass| host_config.register(name, klass) }
1398
- RuntimeContext.capture(
1399
- app_class: self,
1400
- host_config: host_config,
1401
- host_name: host,
1402
- loader_name: loader,
1403
- scheduler_name: scheduler,
1404
- sdk_capabilities: sdk_capabilities,
1405
- loader_adapter: resolved_loader_adapter,
1406
- scheduled_jobs: @scheduled_jobs,
1407
- code_paths: code_paths_snapshot
1408
- )
1409
- host_adapter.build_config(host_config)
1410
- end
1411
-
1412
- def apply_yml!(cfg)
1413
- return unless @yml_path
1414
-
1415
- yml = YmlLoader.load(resolve_path(@yml_path))
1416
- YmlLoader.apply(cfg, yml)
1417
- end
1418
-
1419
- def apply_credentials!
1420
- path = resolved_credentials_path
1421
- @last_credentials_apply_result =
1422
- if path && File.exist?(path)
1423
- Credentials::ConfigLoader.apply(path, override: !!@credentials_override)
1424
- else
1425
- { path: path, applied: {}, loaded: false }.freeze
1426
- end
1427
- end
1428
-
1429
- def load_application_code!
1430
- adapter = loader_adapter
1431
- adapter.load!(
1432
- base_dir: @root_dir || Dir.pwd,
1433
- paths: code_paths_snapshot
1434
- )
1435
- adapter
1436
- end
1437
-
1438
- def code_paths_snapshot
1439
- {
1440
- executors: @executors_paths.dup,
1441
- contracts: @contracts_paths.dup,
1442
- tools: @tools_paths.dup,
1443
- agents: @agents_paths.dup,
1444
- skills: @skills_paths.dup
1445
- }
1446
- end
1447
-
1448
- def resolve_path(path)
1449
- return path if path.nil? || File.absolute_path(path) == path
1450
-
1451
- File.expand_path(path, @root_dir || Dir.pwd)
1452
- end
1453
-
1454
- def resolved_credentials_path
1455
- configured = @credentials_path || File.join("config", "credentials.local.yml")
1456
- resolve_path(configured)
1457
- end
1458
-
1459
- def start_scheduler(config)
1460
- return nil if @scheduled_jobs.empty?
1461
-
1462
- adapter = scheduler_adapter
1463
- adapter.start(config: config, jobs: @scheduled_jobs)
1464
- adapter
1465
- end
1466
-
1467
- def stop_scheduler(adapter)
1468
- adapter&.stop
1469
- end
1470
-
1471
- def orchestration_runtime_identity_for(target)
1472
- execution = orchestration_execution_for(target)
1473
-
1474
- return [nil, nil] unless execution
1475
-
1476
- [execution.compiled_graph.name, execution.events.execution_id]
1477
- end
1478
-
1479
- def orchestration_execution_for(target)
1480
- return nil if target.nil?
1481
- return target if target.is_a?(Igniter::Runtime::Execution)
1482
- return target.execution if target.respond_to?(:execution)
1483
- return target.instance_variable_get(:@execution) if target.class.name == "Igniter::Diagnostics::Report"
1484
-
1485
- nil
1486
- end
1487
-
1488
- def resume_orchestration_item_runtime(item, target:, value:)
1489
- if target.nil? && value.equal?(Igniter::Runtime::Execution::UNDEFINED_RESUME_VALUE)
1490
- return { metadata: {}, execution: nil }.freeze
1491
- end
1492
- return resume_orchestration_item_from_store(item, value: value) if target.nil?
1493
- raise ArgumentError, "orchestration item #{item[:id].inspect} does not carry a runtime token" unless item[:token]
1494
-
1495
- execution = orchestration_execution_for(target)
1496
- raise ArgumentError, "target must provide an execution to resume orchestration item #{item[:id].inspect}" unless execution
1497
- if item[:execution_id] && execution.events.execution_id != item[:execution_id]
1498
- raise ArgumentError,
1499
- "orchestration item #{item[:id].inspect} belongs to execution #{item[:execution_id].inspect}, got #{execution.events.execution_id.inspect}"
1500
- end
1501
- if item[:graph] && execution.compiled_graph.name != item[:graph]
1502
- raise ArgumentError,
1503
- "orchestration item #{item[:id].inspect} belongs to graph #{item[:graph].inspect}, got #{execution.compiled_graph.name.inspect}"
1504
- end
1505
-
1506
- execution.resume_agent_session(item[:token], node_name: item[:node], value: value)
1507
- {
1508
- metadata: {
1509
- runtime_resumed: true,
1510
- runtime_resume_mode: :live,
1511
- resolved_execution_id: execution.events.execution_id,
1512
- resolved_graph: execution.compiled_graph.name,
1513
- resumed_token: item[:token]
1514
- }.freeze,
1515
- execution: execution
1516
- }.freeze
1517
- end
1518
-
1519
- def materialize_orchestration_sessions(plan, execution)
1520
- plan.followup_request.actions.map { |action| action[:node] }.uniq.each do |node_name|
1521
- execution.resolve(node_name)
1522
- end
1523
- end
1524
-
1525
- def operator_records_for(execution)
1526
- graph, execution_id =
1527
- if execution
1528
- [execution.compiled_graph.name, execution.events.execution_id]
1529
- else
1530
- [nil, nil]
1531
- end
1532
-
1533
- records = []
1534
- records.concat(ignite_operator_records) unless execution
1535
-
1536
- items = orchestration_inbox.items
1537
- items = items.select { |item| operator_item_matches_execution?(item, graph: graph, execution_id: execution_id) } if execution
1538
- actions_by_node = operator_actions_by_node(execution)
1539
- pending_sessions = execution ? execution.agent_sessions.dup : []
1540
-
1541
- items.reverse_each do |item|
1542
- session = consume_matching_operator_session!(pending_sessions, item)
1543
- records << build_operator_record(item: item, session: session, action: actions_by_node[item[:node]&.to_sym])
1544
- end
1545
-
1546
- pending_sessions.each do |session|
1547
- records << build_operator_record(item: nil, session: session, action: actions_by_node[session.node_name.to_sym])
1548
- end
1549
-
1550
- records.reverse.freeze
1551
- end
1552
-
1553
- def ignite_operator_records
1554
- resolved_stack = stack_class
1555
- return [] unless resolved_stack
1556
-
1557
- all_events = Array(resolved_stack.ignition_trail.events)
1558
- target_events = all_events.select { |event| event[:type] == :ignition_target_snapshot }
1559
- return [] if target_events.empty?
1560
-
1561
- latest_by_target = {}
1562
- timelines = Hash.new { |hash, key| hash[key] = [] }
1563
-
1564
- all_events.each do |event|
1565
- target_id = event.dig(:payload, :target_id).to_s
1566
- next if target_id.empty?
1567
-
1568
- timelines[target_id] << event.dup
1569
- latest_by_target[target_id] = event if event[:type] == :ignition_target_snapshot
1570
- end
1571
-
1572
- latest_by_target.each_with_object([]) do |(target_id, event), records|
1573
- records << build_ignite_operator_record(
1574
- target_id: target_id,
1575
- event: event,
1576
- timeline: Array(timelines[target_id]).freeze
1577
- )
1578
- end
1579
- end
1580
-
1581
- def operator_actions_by_node(execution)
1582
- return {} unless execution
1583
-
1584
- Array(merged_orchestration_runtime_overview(execution)[:records]).each_with_object({}) do |action, memo|
1585
- memo[action[:node].to_sym] = action.freeze
1586
- end
1587
- end
1588
-
1589
- def operator_item_matches_execution?(item, graph:, execution_id:)
1590
- return true if graph.nil? || execution_id.nil?
1591
-
1592
- item[:graph].to_s == graph.to_s && item[:execution_id].to_s == execution_id.to_s
1593
- end
1594
-
1595
- def consume_matching_operator_session!(pending_sessions, item)
1596
- index =
1597
- pending_sessions.index do |session|
1598
- session.node_name == item[:node]&.to_sym &&
1599
- session.graph.to_s == item[:graph].to_s &&
1600
- session.execution_id.to_s == item[:execution_id].to_s &&
1601
- (!item[:token] || session.token.to_s == item[:token].to_s)
1602
- end
1603
-
1604
- index ||= pending_sessions.index do |session|
1605
- session.node_name == item[:node]&.to_sym &&
1606
- session.graph.to_s == item[:graph].to_s &&
1607
- session.execution_id.to_s == item[:execution_id].to_s
1608
- end
1609
-
1610
- index ? pending_sessions.delete_at(index) : nil
1611
- end
1612
-
1613
- def build_operator_record(item:, session:, action:)
1614
- combined_state =
1615
- if item && session
1616
- :joined
1617
- elsif session
1618
- :session_only
1619
- else
1620
- :inbox_only
1621
- end
1622
-
1623
- status = item&.dig(:status) || (session ? :live_session : nil)
1624
- policy = (item&.dig(:policy) || action&.dig(:policy))&.dup
1625
- action_history = Array(item&.dig(:action_history)).map(&:dup).freeze
1626
- lifecycle = build_operator_lifecycle_contract(
1627
- record_kind: :orchestration,
1628
- status: status,
1629
- combined_state: combined_state,
1630
- policy: policy,
1631
- attention_required: item&.key?(:attention_required) ? !!item[:attention_required] : !!action&.dig(:attention_required),
1632
- resumable: item&.key?(:resumable) ? !!item[:resumable] : !!action&.dig(:resumable),
1633
- has_inbox_item: !item.nil?,
1634
- history_count: action_history.size
1635
- )
1636
-
1637
- {
1638
- record_kind: :orchestration,
1639
- id: item&.fetch(:id, nil) || "agent_session:#{session.node_name}:#{session.token}",
1640
- item_id: item&.dig(:item_id),
1641
- action: item&.dig(:action) || action&.dig(:action),
1642
- node: item&.dig(:node) || session&.node_name || action&.dig(:node),
1643
- interaction: item&.dig(:interaction) || action&.dig(:interaction),
1644
- reason: item&.dig(:reason) || action&.dig(:reason),
1645
- guidance: item&.dig(:guidance) || action&.dig(:guidance),
1646
- attention_required: lifecycle[:attention_required],
1647
- resumable: lifecycle[:resumable],
1648
- status: status,
1649
- policy: policy,
1650
- lane: (item&.dig(:lane) || action&.dig(:lane))&.dup,
1651
- routing: (item&.dig(:routing) || action&.dig(:routing))&.dup,
1652
- assignee: item&.dig(:assignee),
1653
- queue: item&.dig(:queue) || item&.dig(:routing, :queue) || action&.dig(:routing, :queue),
1654
- channel: item&.dig(:channel) || item&.dig(:routing, :channel) || action&.dig(:routing, :channel),
1655
- handoff_count: item&.fetch(:handoff_count, 0) || 0,
1656
- handoff_history: Array(item&.dig(:handoff_history)).map(&:dup).freeze,
1657
- action_history_count: action_history.size,
1658
- latest_action_source: item&.dig(:action_history)&.last&.dig(:source),
1659
- latest_action_actor: item&.dig(:action_history)&.last&.dig(:actor),
1660
- latest_action_origin: item&.dig(:action_history)&.last&.dig(:origin),
1661
- latest_action_event: item&.dig(:action_history)&.last&.dup,
1662
- action_history: action_history,
1663
- token: session&.token || item&.dig(:token),
1664
- orchestration_runtime_status: action&.dig(:runtime_status),
1665
- orchestration_timeline: Array(action&.dig(:timeline)).map(&:dup).freeze,
1666
- orchestration_combined_timeline: Array(action&.dig(:combined_timeline)).map(&:dup).freeze,
1667
- orchestration_event_summary: action&.dig(:event_summary),
1668
- orchestration_latest_event: action&.dig(:latest_event),
1669
- orchestration_inbox_status: action&.dig(:inbox_status),
1670
- phase: session&.phase || item&.dig(:phase),
1671
- session_lifecycle_state: session&.lifecycle_state,
1672
- reply_mode: session&.reply_mode || item&.dig(:reply_mode),
1673
- mode: session&.mode,
1674
- finalizer: session&.finalizer || item&.dig(:finalizer),
1675
- session_policy: session&.session_policy || item&.dig(:session_policy),
1676
- tool_loop_policy: session&.tool_loop_policy || item&.dig(:tool_loop_policy),
1677
- routing_mode: session&.routing_mode || item&.dig(:routing_mode),
1678
- agent_result_contract: session&.agent_result_contract&.to_h,
1679
- interaction_contract: session&.interaction_contract&.to_h || item&.dig(:interaction_contract),
1680
- tool_runtime: session&.tool_runtime,
1681
- ownership: session&.ownership,
1682
- owner_url: session&.owner_url,
1683
- delivery_route: session&.delivery_route,
1684
- interactive: session ? session.interactive? : false,
1685
- terminal: session ? session.terminal? : false,
1686
- continuable: session ? session.continuable? : false,
1687
- routed: session ? session.routed? : false,
1688
- waiting_on: session&.waiting_on || item&.dig(:waiting_on),
1689
- source_node: session&.source_node || item&.dig(:source_node),
1690
- turn: session&.turn || item&.dig(:turn),
1691
- tool_loop_status: session&.tool_loop_status,
1692
- graph: session&.graph || item&.dig(:graph),
1693
- execution_id: session&.execution_id || item&.dig(:execution_id),
1694
- source: item&.dig(:source),
1695
- note: item&.dig(:note),
1696
- combined_state: combined_state,
1697
- lifecycle: lifecycle,
1698
- has_session: !session.nil?,
1699
- has_inbox_item: !item.nil?,
1700
- session_lifecycle: session&.lifecycle,
1701
- session: session&.to_h,
1702
- inbox_item: item&.dup
1703
- }.freeze
1704
- end
1705
-
1706
- def build_ignite_operator_record(target_id:, event:, timeline:)
1707
- payload = event.fetch(:payload)
1708
- latest_timeline_event = timeline.last
1709
- latest_action_event = timeline.reverse_each.find { |timeline_event| ignite_operator_event?(timeline_event) } || latest_timeline_event
1710
- latest_action_payload = latest_action_event&.dig(:payload) || {}
1711
- ignite_policy = ignite_policy_for(payload)
1712
- ignite_routing = ignite_policy.default_routing
1713
- lifecycle = build_operator_lifecycle_contract(
1714
- record_kind: :ignition,
1715
- status: payload[:status]&.to_sym,
1716
- combined_state: :ignition,
1717
- policy: ignite_policy.to_h,
1718
- attention_required: ignite_attention_required?(payload),
1719
- resumable: ignite_resumable?(payload),
1720
- has_inbox_item: false,
1721
- history_count: timeline.size
1722
- )
1723
-
1724
- {
1725
- record_kind: :ignition,
1726
- id: "ignite:#{target_id}",
1727
- item_id: nil,
1728
- action: payload[:action]&.to_sym,
1729
- node: target_id.to_sym,
1730
- interaction: :ignite,
1731
- reason: payload[:kind]&.to_sym || :ignite,
1732
- guidance: ignite_guidance_for(payload),
1733
- attention_required: lifecycle[:attention_required],
1734
- resumable: lifecycle[:resumable],
1735
- status: payload[:status]&.to_sym,
1736
- policy: ignite_policy.to_h,
1737
- lane: { name: :ignite, queue: ignite_routing[:queue], channel: ignite_routing[:channel] }.compact.freeze,
1738
- routing: ignite_routing,
1739
- assignee: nil,
1740
- queue: ignite_routing[:queue],
1741
- channel: ignite_routing[:channel],
1742
- handoff_count: 0,
1743
- handoff_history: [].freeze,
1744
- action_history_count: timeline.size,
1745
- latest_action_source: latest_action_event&.dig(:source),
1746
- latest_action_actor: latest_action_payload[:actor],
1747
- latest_action_origin: latest_action_payload[:origin],
1748
- latest_action_event: latest_action_event&.dup,
1749
- action_history: timeline.map(&:dup).freeze,
1750
- token: nil,
1751
- phase: payload.dig(:join, :status) || payload.dig(:admission, :status),
1752
- reply_mode: nil,
1753
- mode: payload[:kind]&.to_sym,
1754
- waiting_on: ignite_waiting_on_for(payload),
1755
- source_node: payload.dig(:join, :node_id),
1756
- turn: nil,
1757
- tool_loop_status: nil,
1758
- graph: nil,
1759
- execution_id: nil,
1760
- source: :ignite,
1761
- note: nil,
1762
- combined_state: :ignition,
1763
- lifecycle: lifecycle,
1764
- has_session: false,
1765
- has_inbox_item: false,
1766
- session: nil,
1767
- inbox_item: nil,
1768
- ignition_target: payload.dup,
1769
- ignition_timeline: timeline.map(&:dup).freeze
1770
- }.freeze
1771
- end
1772
-
1773
- def build_operator_lifecycle_contract(record_kind:, status:, combined_state:, policy:, attention_required:, resumable:, has_inbox_item:, history_count:)
1774
- resolved_policy =
1775
- if policy.is_a?(Igniter::App::Operator::Policy)
1776
- policy
1777
- elsif policy
1778
- Igniter::App::Operator::Policy.from_h(policy)
1779
- end
1780
-
1781
- actionable =
1782
- if record_kind.to_sym == :orchestration
1783
- has_inbox_item && !Igniter::App::Orchestration::Inbox::RESOLVED_STATUSES.include?(status&.to_sym)
1784
- else
1785
- resolved_policy && !Igniter::App::Operator::LifecycleContract::TERMINAL_STATUSES.include?(status&.to_sym)
1786
- end
1787
-
1788
- Igniter::App::Operator::LifecycleContract.new(
1789
- record_kind: record_kind,
1790
- status: status,
1791
- combined_state: combined_state,
1792
- default_operation: resolved_policy&.default_operation,
1793
- allowed_operations: resolved_policy&.allowed_operations || [],
1794
- runtime_completion: resolved_policy&.runtime_completion,
1795
- attention_required: attention_required,
1796
- resumable: resumable,
1797
- actionable: actionable,
1798
- history_count: history_count
1799
- ).to_h
1800
- end
1801
-
1802
- def operator_runtime_overview(query)
1803
- runtime_query = query.with_session
1804
- records = runtime_query.to_a
1805
- waiting_on = Hash.new(0)
1806
- active_nodes = []
1807
-
1808
- records.each do |record|
1809
- waiting_value = record[:waiting_on]
1810
- waiting_on[waiting_value] += 1 if waiting_value
1811
- active_nodes << {
1812
- id: record[:id],
1813
- node: record[:node],
1814
- session_lifecycle_state: record[:session_lifecycle_state],
1815
- ownership: record[:ownership],
1816
- routing_mode: record[:routing_mode],
1817
- session_policy: record[:session_policy],
1818
- tool_loop_policy: record[:tool_loop_policy],
1819
- finalizer: record[:finalizer],
1820
- agent_result_contract: record[:agent_result_contract],
1821
- interaction_contract: record[:interaction_contract],
1822
- tool_loop_status: record[:tool_loop_status],
1823
- tool_runtime: record[:tool_runtime],
1824
- waiting_on: waiting_value,
1825
- continuable: record[:continuable],
1826
- routed: record[:routed]
1827
- }.freeze
1828
- end
1829
-
1830
- {
1831
- total_sessions: records.size,
1832
- interactive_sessions: runtime_query.interactive.count,
1833
- terminal_sessions: runtime_query.terminal.count,
1834
- continuable_sessions: runtime_query.continuable.count,
1835
- routed_sessions: runtime_query.routed.count,
1836
- by_ownership: runtime_query.facet(:ownership),
1837
- by_routing_mode: runtime_query.facet(:routing_mode),
1838
- by_session_lifecycle_state: runtime_query.facet(:session_lifecycle_state),
1839
- by_session_policy: runtime_query.facet(:session_policy),
1840
- by_tool_loop_policy: runtime_query.facet(:tool_loop_policy),
1841
- by_finalizer: runtime_query.facet(:finalizer),
1842
- by_tool_loop_status: runtime_query.facet(:tool_loop_status),
1843
- tool_runtime_status: runtime_query.facet(:tool_loop_status),
1844
- by_phase: runtime_query.facet(:phase),
1845
- by_reply_mode: runtime_query.facet(:reply_mode),
1846
- by_waiting_on: waiting_on.freeze,
1847
- active_nodes: active_nodes.first(10).freeze
1848
- }.freeze
1849
- end
1850
-
1851
- def credential_audit_overview(limit: 20, filters: nil, order_by: nil, direction: :asc)
1852
- resolved_stack = stack_class
1853
- return nil unless resolved_stack
1854
-
1855
- resolved_stack.credential_history(
1856
- limit: limit,
1857
- filters: filters,
1858
- order_by: order_by,
1859
- direction: direction
1860
- ).merge(
1861
- app: name,
1862
- stack: resolved_stack.name || "anonymous"
1863
- ).freeze
1864
- end
1865
-
1866
- def ignite_policy_for(payload)
1867
- status = payload[:status]&.to_sym
1868
- allowed_operations =
1869
- case status
1870
- when :awaiting_approval, :awaiting_admission_approval
1871
- %i[approve dismiss]
1872
- when :detached
1873
- %i[retry teardown dismiss]
1874
- when :torn_down
1875
- %i[dismiss]
1876
- when :bootstrapped, :awaiting_join, :joined
1877
- %i[complete detach teardown dismiss]
1878
- else
1879
- %i[retry detach teardown dismiss]
1880
- end
1881
-
1882
- operation_aliases =
1883
- case status
1884
- when :awaiting_approval, :awaiting_admission_approval
1885
- {}.freeze
1886
- when :detached
1887
- { retry_bootstrap: :retry, reignite: :retry }.freeze
1888
- when :bootstrapped, :awaiting_join, :joined
1889
- { reconcile_join: :complete }.freeze
1890
- else
1891
- { retry_bootstrap: :retry }.freeze
1892
- end
1893
-
1894
- operation_lifecycle =
1895
- case status
1896
- when :awaiting_approval, :awaiting_admission_approval
1897
- { approve: :resolve, dismiss: :dismiss }.freeze
1898
- when :detached
1899
- { retry: :retry, teardown: :dismiss, dismiss: :dismiss }.freeze
1900
- when :torn_down
1901
- { dismiss: :dismiss }.freeze
1902
- when :bootstrapped, :awaiting_join, :joined
1903
- { complete: :resolve, detach: :dismiss, teardown: :dismiss, dismiss: :dismiss }.freeze
1904
- else
1905
- { retry: :retry, detach: :dismiss, teardown: :dismiss, dismiss: :dismiss }.freeze
1906
- end
1907
-
1908
- execution_operations =
1909
- case status
1910
- when :awaiting_approval, :awaiting_admission_approval
1911
- { approve: :approve, dismiss: :dismiss }.freeze
1912
- when :detached
1913
- { retry: :reignite, teardown: :teardown, dismiss: :dismiss }.freeze
1914
- when :torn_down
1915
- { dismiss: :dismiss }.freeze
1916
- when :bootstrapped, :awaiting_join, :joined
1917
- { complete: :reconcile_join, detach: :detach, teardown: :teardown, dismiss: :dismiss }.freeze
1918
- else
1919
- { retry: :retry_bootstrap, detach: :detach, teardown: :teardown, dismiss: :dismiss }.freeze
1920
- end
1921
-
1922
- Igniter::App::Operator::Policy.new(
1923
- name: ignite_policy_name_for(status),
1924
- default_operation: allowed_operations.first,
1925
- allowed_operations: allowed_operations.freeze,
1926
- lifecycle_operations: operation_lifecycle.values.uniq.freeze,
1927
- operation_aliases: operation_aliases,
1928
- operation_lifecycle: operation_lifecycle,
1929
- execution_operations: execution_operations,
1930
- default_routing: { queue: "ignite" }.freeze,
1931
- runtime_completion: ignite_runtime_completion_for(status),
1932
- description: ignite_policy_description_for(status)
1933
- )
1934
- end
1935
-
1936
- def ignite_policy_name_for(status)
1937
- case status
1938
- when :awaiting_approval, :awaiting_admission_approval
1939
- :ignite_approval
1940
- when :detached
1941
- :ignite_detached
1942
- when :torn_down
1943
- :ignite_torn_down
1944
- when :bootstrapped, :awaiting_join, :joined
1945
- :ignite_join
1946
- else
1947
- :ignite_bootstrap
1948
- end
1949
- end
1950
-
1951
- def ignite_runtime_completion_for(status)
1952
- case status
1953
- when :awaiting_approval, :awaiting_admission_approval
1954
- :approval_required
1955
- when :joined
1956
- :complete
1957
- when :torn_down
1958
- :complete
1959
- else
1960
- :external
1961
- end
1962
- end
1963
-
1964
- def ignite_policy_description_for(status)
1965
- case status
1966
- when :awaiting_approval, :awaiting_admission_approval
1967
- "ignite target is waiting for explicit approval before bootstrap can continue"
1968
- when :detached
1969
- "ignite target is detached from the active cluster and can be ignited again"
1970
- when :torn_down
1971
- "ignite target was intentionally torn down and remains as terminal lifecycle history"
1972
- when :joined
1973
- "ignite target completed bootstrap, joined the cluster, and may now be detached"
1974
- when :bootstrapped, :awaiting_join
1975
- "ignite target finished bootstrap, is waiting for runtime join confirmation, and may be detached"
1976
- when :prepared, :admitted
1977
- "ignite target is prepared for runtime start and join confirmation, and may be detached"
1978
- when :deferred, :blocked, :failed
1979
- "ignite target is in bootstrap lifecycle and may need retry or dismissal"
1980
- else
1981
- "ignite target lifecycle managed through the unified operator surface"
1982
- end
1983
- end
1984
-
1985
- def ignite_operator_event?(timeline_event)
1986
- return false unless timeline_event
1987
-
1988
- type = timeline_event[:type]&.to_s
1989
- return true if type&.start_with?("ignition_operator_")
1990
-
1991
- payload = timeline_event[:payload] || {}
1992
- payload.key?(:actor) || payload.key?(:origin) || payload.key?(:operation)
1993
- end
1994
-
1995
- def ignite_attention_required?(payload)
1996
- %i[awaiting_approval awaiting_admission_approval blocked failed deferred awaiting_join bootstrapped].include?(payload[:status]&.to_sym)
1997
- end
1998
-
1999
- def ignite_resumable?(payload)
2000
- %i[awaiting_approval awaiting_admission_approval deferred awaiting_join bootstrapped prepared admitted detached].include?(payload[:status]&.to_sym)
2001
- end
2002
-
2003
- def ignite_waiting_on_for(payload)
2004
- join_status = payload.dig(:join, :status)&.to_sym
2005
- admission_status = payload.dig(:admission, :status)&.to_sym
2006
-
2007
- return :join if %i[pending_bootstrap pending_runtime_boot awaiting_join].include?(join_status)
2008
- return :admission if %i[awaiting_approval blocked_by_admission].include?(admission_status)
2009
-
2010
- nil
2011
- end
2012
-
2013
- def ignite_guidance_for(payload)
2014
- case payload[:status]&.to_sym
2015
- when :awaiting_approval, :awaiting_admission_approval
2016
- "Awaiting ignition approval"
2017
- when :deferred
2018
- "Remote bootstrap is pending"
2019
- when :detached
2020
- "Ignition target is detached and can be ignited again"
2021
- when :torn_down
2022
- "Ignition target was torn down"
2023
- when :bootstrapped, :awaiting_join
2024
- "Waiting for runtime join confirmation"
2025
- when :joined
2026
- "Ignited node joined the cluster"
2027
- when :prepared, :admitted
2028
- "Ignition target is prepared for runtime start"
2029
- when :blocked
2030
- "Ignition target is blocked"
2031
- else
2032
- "Ignition target lifecycle"
2033
- end
2034
- end
2035
-
2036
- def ignite_operator_options(payload, operation:)
2037
- options = { approved: true }
2038
- mesh = default_ignite_mesh
2039
- admission_status = payload.dig(:admission, :status)&.to_sym
2040
- admitted_statuses = %i[admitted implicit_local implicit_remote]
2041
-
2042
- if mesh && payload.dig(:admission, :required) && !admitted_statuses.include?(admission_status)
2043
- options[:mesh] = mesh
2044
- options[:request_admission] = true
2045
- options[:approve_pending_admission] = true if operation == :approve
2046
- end
2047
-
2048
- options[:bootstrap_remote] = true if payload[:kind]&.to_sym == :ssh_server
2049
- options
2050
- end
2051
-
2052
- def normalize_ignite_operator_audit(audit)
2053
- payload = (audit || {}).dup
2054
- payload[:source] = (payload[:source] || :operator_action_api).to_sym
2055
- payload[:origin] = payload[:origin]&.to_sym if payload[:origin]
2056
- payload
2057
- end
2058
-
2059
- def operator_dispatcher
2060
- @operator_dispatcher ||= Igniter::App::Operator::Dispatcher.new
2061
- end
2062
-
2063
- def default_ignite_mesh
2064
- return Igniter::Cluster::Mesh if defined?(Igniter::Cluster::Mesh)
2065
-
2066
- nil
2067
- end
2068
-
2069
- def merged_orchestration_runtime_overview(execution)
2070
- overview = orchestration_runtime_overview_builder(execution).overview
2071
-
2072
- {
2073
- summary: overview[:summary],
2074
- results: overview[:results],
2075
- transitions: Orchestration::RuntimeQueryOverviewBuilder.build(
2076
- query: overview[:transition_query],
2077
- filters: {},
2078
- order_by: :timestamp,
2079
- direction: :asc,
2080
- limit: 20
2081
- ),
2082
- events: Orchestration::RuntimeQueryOverviewBuilder.build(
2083
- query: overview[:event_query],
2084
- filters: {},
2085
- order_by: nil,
2086
- direction: :asc,
2087
- limit: 20
2088
- ),
2089
- records: overview[:records],
2090
- timeline: overview[:timeline],
2091
- combined_timeline: overview[:combined_timeline]
2092
- }.freeze
2093
- end
2094
-
2095
- def resume_orchestration_item_from_store(item, value:)
2096
- raise ArgumentError, "orchestration item #{item[:id].inspect} does not carry a runtime token" unless item[:token]
2097
- raise ArgumentError, "orchestration item #{item[:id].inspect} does not carry an execution id" unless item[:execution_id]
2098
- raise ArgumentError, "orchestration item #{item[:id].inspect} does not carry a graph name" unless item[:graph]
2099
-
2100
- contract_class = registered_contract_class_for_graph(item[:graph])
2101
- raise ArgumentError, "no registered contract class found for graph #{item[:graph].inspect}" unless contract_class
2102
-
2103
- resumed = contract_class.resume_agent_session_from_store(
2104
- item[:execution_id],
2105
- session: item[:token],
2106
- node_name: item[:node],
2107
- value: value,
2108
- store: Igniter.execution_store
2109
- )
2110
-
2111
- {
2112
- metadata: {
2113
- runtime_resumed: true,
2114
- runtime_resume_mode: :store,
2115
- resolved_execution_id: item[:execution_id],
2116
- resolved_graph: item[:graph],
2117
- resumed_token: item[:token],
2118
- resumed_node: item[:node]
2119
- }.freeze,
2120
- execution: resumed.execution
2121
- }.freeze
2122
- end
2123
-
2124
- def augment_orchestration_runtime_result(item, execution:)
2125
- return item unless execution
2126
-
2127
- runtime_result = orchestration_runtime_result_for(item, execution)
2128
- item.merge(runtime_result).freeze
2129
- end
2130
-
2131
- def augment_orchestration_action_result(item, requested_operation:, handled_operation:,
2132
- handled_lifecycle_operation:, handled_execution_operation:,
2133
- handled_policy:, note:, audit:, handled_lane: nil,
2134
- handled_queue: nil, handled_channel: nil,
2135
- handled_handler_queue: nil, handled_assignee: nil)
2136
- return item unless item
2137
-
2138
- action_result = Orchestration::ActionResultBuilder.build(
2139
- item: item,
2140
- requested_operation: requested_operation,
2141
- handled_operation: handled_operation,
2142
- handled_lifecycle_operation: handled_lifecycle_operation,
2143
- handled_execution_operation: handled_execution_operation,
2144
- handled_policy: handled_policy,
2145
- handled_lane: handled_lane,
2146
- handled_queue: handled_queue,
2147
- handled_channel: handled_channel,
2148
- handled_handler_queue: handled_handler_queue,
2149
- handled_assignee: handled_assignee,
2150
- note: note,
2151
- audit: audit
2152
- )
2153
-
2154
- item.merge(orchestration_action_result: action_result).freeze
2155
- end
2156
-
2157
- def orchestration_runtime_result_for(item, execution)
2158
- overview = merged_orchestration_runtime_overview(execution)
2159
- record = Array(overview[:records]).find do |entry|
2160
- entry[:id].to_s == item[:id].to_s || entry[:node].to_sym == item[:node].to_sym
2161
- end
2162
- record ||= orchestration_runtime_overview_builder(execution).fallback_record_for(item)
2163
-
2164
- Orchestration::RuntimeResultBuilder.build(
2165
- summary: overview[:summary],
2166
- record: record
2167
- )
2168
- end
2169
-
2170
- def orchestration_runtime_overview_builder(execution)
2171
- graph = execution.compiled_graph.name
2172
- execution_id = execution.events.execution_id
2173
- inbox_items = orchestration_inbox.items.select do |item|
2174
- operator_item_matches_execution?(item, graph: graph, execution_id: execution_id)
2175
- end
2176
-
2177
- Orchestration::RuntimeOverviewBuilder.new(
2178
- execution: execution,
2179
- inbox_items: inbox_items
2180
- )
2181
- end
2182
-
2183
- def canonical_orchestration_audit(audit, requested_operation:, lifecycle_operation:, execution_operation:)
2184
- payload = (audit || {}).dup
2185
- payload[:requested_operation] ||= requested_operation
2186
- payload[:lifecycle_operation] ||= lifecycle_operation
2187
- payload[:execution_operation] ||= execution_operation
2188
- payload
2189
- end
2190
-
2191
- def operator_target_for_execution(graph:, execution_id:, store: nil)
2192
- contract_class = registered_contract_class_for_graph(graph)
2193
- raise ArgumentError, "no registered contract class found for graph #{graph.inspect}" unless contract_class
2194
-
2195
- contract_class.restore_from_store(execution_id, store: store || Igniter.execution_store)
2196
- end
2197
-
2198
- def apply_operator_query_options(query, filters:, order_by:, direction:)
2199
- applied = query
2200
-
2201
- filters.to_h.each do |key, value|
2202
- next if blank_operator_filter_value?(value)
2203
-
2204
- applied =
2205
- case key.to_sym
2206
- when :actionable
2207
- value ? applied.actionable : applied
2208
- when :attention_required, :resumable, :with_session, :with_inbox_item,
2209
- :interactive, :terminal, :continuable, :routed
2210
- applied.public_send(key.to_sym, value)
2211
- when :with_token
2212
- value ? applied.with_token : applied
2213
- when :handed_off
2214
- value ? applied.handed_off : applied
2215
- when :id, :record_kind, :status, :action, :node, :combined_state, :interaction, :reason, :policy,
2216
- :lane, :queue, :channel, :assignee, :graph, :execution_id, :phase,
2217
- :reply_mode, :mode, :tool_loop_status, :ownership, :session_lifecycle_state, :latest_action_actor,
2218
- :latest_action_origin, :latest_action_source
2219
- applied.public_send(key.to_sym, *Array(value))
2220
- else
2221
- raise ArgumentError, "unsupported operator filter #{key.inspect}"
2222
- end
2223
- end
2224
-
2225
- return applied if order_by.nil? || order_by.to_s.empty?
2226
-
2227
- applied.order_by(order_by.to_sym, direction: direction.to_sym)
2228
- end
2229
-
2230
- def operator_query_metadata(filters:, order_by:, direction:, limit:)
2231
- {
2232
- filters: compact_operator_filters(filters),
2233
- order_by: order_by&.to_sym,
2234
- direction: direction&.to_sym,
2235
- limit: limit
2236
- }.freeze
2237
- end
2238
-
2239
- def apply_orchestration_runtime_event_query_options(query, filters:, order_by:, direction:)
2240
- applied = query
2241
-
2242
- filters.to_h.each do |key, value|
2243
- next if blank_operator_filter_value?(value)
2244
-
2245
- applied =
2246
- case key.to_sym
2247
- when :terminal
2248
- applied.terminal(value)
2249
- when :node, :event, :event_class, :source, :status,
2250
- :actor, :origin, :requested_operation,
2251
- :lifecycle_operation, :execution_operation
2252
- applied.public_send(key.to_sym, *Array(value))
2253
- else
2254
- raise ArgumentError, "unsupported orchestration runtime event filter #{key.inspect}"
2255
- end
2256
- end
2257
-
2258
- return applied if order_by.nil? || order_by.to_s.empty?
2259
-
2260
- applied.order_by(order_by.to_sym, direction: direction.to_sym)
2261
- end
2262
-
2263
- def apply_orchestration_runtime_transition_query_options(query, filters:, order_by:, direction:)
2264
- applied = query
2265
-
2266
- filters.to_h.each do |key, value|
2267
- next if blank_operator_filter_value?(value)
2268
-
2269
- applied =
2270
- case key.to_sym
2271
- when :terminal
2272
- applied.terminal(value)
2273
- when :id, :node, :action, :interaction, :state, :state_class, :event, :status,
2274
- :phase, :waiting_on, :source_status
2275
- applied.public_send(key.to_sym, *Array(value))
2276
- else
2277
- raise ArgumentError, "unsupported orchestration runtime transition filter #{key.inspect}"
2278
- end
2279
- end
2280
-
2281
- return applied if order_by.nil? || order_by.to_s.empty?
2282
-
2283
- applied.order_by(order_by.to_sym, direction: direction.to_sym)
2284
- end
2285
-
2286
- def orchestration_runtime_record_for(target, id:, node:)
2287
- overview = orchestration_runtime_overview(target)
2288
- return nil unless overview
2289
-
2290
- records = Array(overview[:records])
2291
- if id
2292
- records.find { |record| record[:id].to_s == id.to_s }
2293
- elsif node
2294
- records.find { |record| record[:node].to_s == node.to_s }
2295
- end
2296
- end
2297
-
2298
- def operator_record_event_overview(execution, query:, filters:, event_filters:, event_order_by:, event_direction:, event_limit:)
2299
- return nil unless execution
2300
-
2301
- selected_id = filters.to_h[:id]
2302
- selected_node = filters.to_h[:node] if selected_id.nil?
2303
- records = query.limit(2).to_a
2304
- return nil unless records.size == 1
2305
-
2306
- record = records.first
2307
- return nil unless record[:record_kind] == :orchestration
2308
-
2309
- orchestration_runtime_record_event_overview(
2310
- execution,
2311
- id: selected_id || record[:id],
2312
- node: selected_node || record[:node],
2313
- filters: event_filters,
2314
- order_by: event_order_by,
2315
- direction: event_direction,
2316
- limit: event_limit
2317
- )
2318
- end
2319
-
2320
- def compact_operator_filters(filters)
2321
- filters.to_h.each_with_object({}) do |(key, value), memo|
2322
- next if blank_operator_filter_value?(value)
2323
-
2324
- memo[key.to_sym] = value
2325
- end.freeze
2326
- end
2327
-
2328
- def blank_operator_filter_value?(value)
2329
- return true if value.nil?
2330
- return value.empty? if value.respond_to?(:empty?)
2331
-
2332
- false
2333
- end
2334
-
2335
- def callable_accepts_keyword?(callable, keyword)
2336
- parameters =
2337
- if callable.respond_to?(:parameters)
2338
- callable.parameters
2339
- elsif callable.respond_to?(:method)
2340
- callable.method(:call).parameters
2341
- else
2342
- []
2343
- end
2344
-
2345
- parameters.any? do |kind, name|
2346
- kind == :keyrest || (kind == :key && name == keyword)
2347
- end
2348
- end
2349
-
2350
- def registered_contract_class_for_graph(graph)
2351
- registered_contracts.values.find do |contract_class|
2352
- next true if contract_class.respond_to?(:compiled_graph) && contract_class.compiled_graph&.name == graph
2353
- next true if contract_class.respond_to?(:graph) && contract_class.graph&.name == graph
2354
-
2355
- contract_class.respond_to?(:contract_name) && contract_class.contract_name == graph
2356
- end
2357
- end
2358
-
2359
- def normalize_request_hook!(callable, block, name)
2360
- raise ArgumentError, "#{name} requires a callable `with:` or a block" unless callable || block
2361
- raise ArgumentError, "#{name} cannot use both `with:` and a block" if callable && block
2362
-
2363
- callable || block
2364
- end
2365
- end
2366
- end
2367
- end